diff options
-rw-r--r-- | src/api/buffer.c | 2 | ||||
-rw-r--r-- | src/api/buffer.h | 2 | ||||
-rw-r--r-- | src/api/helpers.c | 63 | ||||
-rw-r--r-- | src/api/helpers.h | 5 | ||||
-rw-r--r-- | src/api/tabpage.c | 2 | ||||
-rw-r--r-- | src/api/tabpage.h | 2 | ||||
-rw-r--r-- | src/api/vim.c | 6 | ||||
-rw-r--r-- | src/api/vim.h | 7 | ||||
-rw-r--r-- | src/api/window.c | 2 | ||||
-rw-r--r-- | src/api/window.h | 2 |
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 |