aboutsummaryrefslogtreecommitdiff
path: root/src/api/helpers.c
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 /src/api/helpers.c
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
Diffstat (limited to 'src/api/helpers.c')
-rw-r--r--src/api/helpers.c63
1 files changed, 37 insertions, 26 deletions
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;
}