aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThiago de Arruda <tpadilha84@gmail.com>2014-05-12 18:13:34 -0300
committerThiago de Arruda <tpadilha84@gmail.com>2014-05-13 14:11:32 -0300
commit5d0cb370f6b2d064f682118584adc456f10bcdf4 (patch)
treece08dee350c9c3f099edc9f3664e460fa51e5561
parent40c82ed7cda330466eeec4b91f26972c59110f23 (diff)
downloadrneovim-5d0cb370f6b2d064f682118584adc456f10bcdf4.tar.gz
rneovim-5d0cb370f6b2d064f682118584adc456f10bcdf4.tar.bz2
rneovim-5d0cb370f6b2d064f682118584adc456f10bcdf4.zip
API: Refactor vim_{get,set}_var
- Change in dict_set_value: Passing 'nil' as value will delete the variable. - Change in dict_get_value: Removed 'pop' parameter, now values can be popped by passing 'nil' to dict_set_value - Update {buffer,window,tabpage}_get_var to reflect the changes
-rw-r--r--src/api/buffer.c2
-rw-r--r--src/api/buffer.h2
-rw-r--r--src/api/helpers.c63
-rw-r--r--src/api/helpers.h5
-rw-r--r--src/api/tabpage.c2
-rw-r--r--src/api/tabpage.h2
-rw-r--r--src/api/vim.c6
-rw-r--r--src/api/vim.h7
-rw-r--r--src/api/window.c2
-rw-r--r--src/api/window.h2
10 files changed, 50 insertions, 43 deletions
diff --git a/src/api/buffer.c b/src/api/buffer.c
index fed4a63372..328b26061d 100644
--- a/src/api/buffer.c
+++ b/src/api/buffer.c
@@ -231,7 +231,7 @@ Object buffer_get_var(Buffer buffer, String name, Error *err)
return rv;
}
- return dict_get_value(buf->b_vars, name, false, err);
+ return dict_get_value(buf->b_vars, name, err);
}
Object buffer_set_var(Buffer buffer, String name, Object value, Error *err)
diff --git a/src/api/buffer.h b/src/api/buffer.h
index 5fb1cef5f7..04f9422c19 100644
--- a/src/api/buffer.h
+++ b/src/api/buffer.h
@@ -78,7 +78,7 @@ void buffer_set_slice(Buffer buffer,
/// @return The variable value
Object buffer_get_var(Buffer buffer, String name, Error *err);
-/// Sets a buffer variable
+/// Sets a buffer variable. Passing 'nil' as value deletes the variable.
///
/// @param buffer The buffer handle
/// @param name The variable name
diff --git a/src/api/helpers.c b/src/api/helpers.c
index dc1c3e1cda..585ad493d5 100644
--- a/src/api/helpers.c
+++ b/src/api/helpers.c
@@ -82,7 +82,7 @@ bool try_end(Error *err)
return err->set;
}
-Object dict_get_value(dict_T *dict, String key, bool pop, Error *err)
+Object dict_get_value(dict_T *dict, String key, Error *err)
{
Object rv;
hashitem_T *hi;
@@ -99,16 +99,6 @@ Object dict_get_value(dict_T *dict, String key, bool pop, Error *err)
di = dict_lookup(hi);
rv = vim_to_object(&di->di_tv);
- if (pop) {
- if (dict->dv_lock) {
- set_api_error("Dictionary is locked", err);
- return rv;
- }
-
- hash_remove(&dict->dv_hashtab, hi);
- dictitem_free(di);
- }
-
return rv;
}
@@ -127,24 +117,45 @@ Object dict_set_value(dict_T *dict, String key, Object value, Error *err)
}
dictitem_T *di = dict_find(dict, (uint8_t *)key.data, key.size);
- typval_T tv;
- if (!object_to_vim(value, &tv, err)) {
- return rv;
- }
-
- if (di == NULL) {
- char *k = xstrndup(key.data, key.size);
- di = dictitem_alloc((uint8_t *)k);
- free(k);
- dict_add(dict, di);
+ if (value.type == kObjectTypeNil) {
+ // Delete the key
+ if (di == NULL) {
+ // Doesn't exist, fail
+ set_api_error("Key doesn't exist", err);
+ } else {
+ // Return the old value
+ rv = vim_to_object(&di->di_tv);
+ // Delete the entry
+ hashitem_T *hi = hash_find(&dict->dv_hashtab, di->di_key);
+ hash_remove(&dict->dv_hashtab, hi);
+ dictitem_free(di);
+ }
} else {
- rv = vim_to_object(&di->di_tv);
- clear_tv(&di->di_tv);
- }
+ // Update the key
+ typval_T tv;
+
+ // Convert the object to a vimscript type in the temporary variable
+ if (!object_to_vim(value, &tv, err)) {
+ return rv;
+ }
- copy_tv(&tv, &di->di_tv);
- clear_tv(&tv);
+ if (di == NULL) {
+ // Need to create an entry
+ char *k = xstrndup(key.data, key.size);
+ di = dictitem_alloc((uint8_t *)k);
+ free(k);
+ dict_add(dict, di);
+ } else {
+ // Return the old value
+ clear_tv(&di->di_tv);
+ }
+
+ // Update the value
+ copy_tv(&tv, &di->di_tv);
+ // Clear the temporary variable
+ clear_tv(&tv);
+ }
return rv;
}
diff --git a/src/api/helpers.h b/src/api/helpers.h
index 9f24455b27..afa16e54f4 100644
--- a/src/api/helpers.h
+++ b/src/api/helpers.h
@@ -26,12 +26,11 @@ bool try_end(Error *err);
///
/// @param dict The vimscript dict
/// @param key The key
-/// @param bool If true it will pop the value from the dict
/// @param[out] err Details of an error that may have occurred
-Object dict_get_value(dict_T *dict, String key, bool pop, Error *err);
+Object dict_get_value(dict_T *dict, String key, Error *err);
/// Set a value in a dict. Objects are recursively expanded into their
-/// vimscript equivalents.
+/// vimscript equivalents. Passing 'nil' as value deletes the key.
///
/// @param dict The vimscript dict
/// @param key The key
diff --git a/src/api/tabpage.c b/src/api/tabpage.c
index c750d5c519..27f0aba99c 100644
--- a/src/api/tabpage.c
+++ b/src/api/tabpage.c
@@ -38,7 +38,7 @@ Object tabpage_get_var(Tabpage tabpage, String name, Error *err)
return rv;
}
- return dict_get_value(tab->tp_vars, name, false, err);
+ return dict_get_value(tab->tp_vars, name, err);
}
Object tabpage_set_var(Tabpage tabpage, String name, Object value, Error *err)
diff --git a/src/api/tabpage.h b/src/api/tabpage.h
index 7ff7927f54..ccd6c7ab9e 100644
--- a/src/api/tabpage.h
+++ b/src/api/tabpage.h
@@ -21,7 +21,7 @@ int64_t tabpage_get_window_count(Tabpage tabpage, Error *err);
/// @return The variable value
Object tabpage_get_var(Tabpage tabpage, String name, Error *err);
-/// Sets a tabpage variable
+/// Sets a tabpage variable. Passing 'nil' as value deletes the variable.
///
/// @param tabpage handle
/// @param name The variable name
diff --git a/src/api/vim.c b/src/api/vim.c
index d6f63cd62b..85e3a50517 100644
--- a/src/api/vim.c
+++ b/src/api/vim.c
@@ -142,11 +142,9 @@ void vim_del_current_line(Error *err)
buffer_del_line(curbuf->b_fnum, curwin->w_cursor.lnum - 1, err);
}
-Object vim_get_var(bool special, String name, bool pop, Error *err)
+Object vim_get_var(String name, Error *err)
{
- return dict_get_value(special ? &vimvardict : &globvardict, name,
- special ? false : pop,
- err);
+ return dict_get_value(&globvardict, name, err);
}
Object vim_set_var(String name, Object value, Error *err)
diff --git a/src/api/vim.h b/src/api/vim.h
index f86c4f329c..0850a05b99 100644
--- a/src/api/vim.h
+++ b/src/api/vim.h
@@ -61,15 +61,14 @@ void vim_del_current_line(Error *err);
/// @param[out] err Details of an error that may have occurred
void vim_set_current_line(String line, Error *err);
-/// Gets a global or special variable
+/// Gets a global variable
///
-/// @param special If it's a special(:v) variable
/// @param name The variable name
/// @param[out] err Details of an error that may have occurred
/// @return The variable value
-Object vim_get_var(bool special, String name, bool pop, Error *err);
+Object vim_get_var(String name, Error *err);
-/// Sets a global variable
+/// Sets a global variable. Passing 'nil' as value deletes the variable.
///
/// @param name The variable name
/// @param value The variable value
diff --git a/src/api/window.c b/src/api/window.c
index 8fca1b1797..2c67fc2a74 100644
--- a/src/api/window.c
+++ b/src/api/window.c
@@ -119,7 +119,7 @@ Object window_get_var(Window window, String name, Error *err)
return rv;
}
- return dict_get_value(win->w_vars, name, false, err);
+ return dict_get_value(win->w_vars, name, err);
}
Object window_set_var(Window window, String name, Object value, Error *err)
diff --git a/src/api/window.h b/src/api/window.h
index 52f4d9719f..e9baa3f170 100644
--- a/src/api/window.h
+++ b/src/api/window.h
@@ -65,7 +65,7 @@ void window_set_width(Window window, int64_t width, Error *err);
/// @return The variable value
Object window_get_var(Window window, String name, Error *err);
-/// Sets a window variable
+/// Sets a window variable. Passing 'nil' as value deletes the variable.
///
/// @param window The window handle
/// @param name The variable name