diff options
author | Thiago de Arruda <tpadilha84@gmail.com> | 2014-05-12 18:13:34 -0300 |
---|---|---|
committer | Thiago de Arruda <tpadilha84@gmail.com> | 2014-05-13 14:11:32 -0300 |
commit | 5d0cb370f6b2d064f682118584adc456f10bcdf4 (patch) | |
tree | ce08dee350c9c3f099edc9f3664e460fa51e5561 /src/api/helpers.c | |
parent | 40c82ed7cda330466eeec4b91f26972c59110f23 (diff) | |
download | rneovim-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.c | 63 |
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; } |