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
This commit is contained in:
Thiago de Arruda 2014-05-12 18:13:34 -03:00
parent 40c82ed7cd
commit 5d0cb370f6
10 changed files with 50 additions and 43 deletions

View File

@ -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)

View File

@ -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

View File

@ -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;
copy_tv(&tv, &di->di_tv);
clear_tv(&tv);
// Convert the object to a vimscript type in the temporary variable
if (!object_to_vim(value, &tv, err)) {
return rv;
}
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;
}

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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