diff options
author | ridiculousfish <corydoras@ridiculousfish.com> | 2014-06-15 17:30:50 -0700 |
---|---|---|
committer | ridiculousfish <corydoras@ridiculousfish.com> | 2014-06-15 17:30:50 -0700 |
commit | 6277a2e4a4a9557290018d885c0b34d244a84dbc (patch) | |
tree | 11f288aa3c38be3b7c9ba828e3346172f88436fa /env.cpp | |
parent | 84faa60c4efa47aad89c7733881b5765f42c8403 (diff) |
Migrate global functions out of env_universal. Have env operate directly
on an env_universal_t.
Diffstat (limited to 'env.cpp')
-rw-r--r-- | env.cpp | 141 |
1 files changed, 74 insertions, 67 deletions
@@ -50,6 +50,7 @@ #include "reader.h" #include "parser.h" #include "env_universal.h" +#include "env_universal_common.h" #include "input.h" #include "event.h" #include "path.h" @@ -129,6 +130,13 @@ static env_node_t *top = NULL; /** Bottom node on the function stack */ static env_node_t *global_env = NULL; +/** Universal variables global instance. Initialized in env_init. */ +static env_universal_t *s_universal_variables = NULL; + +/* Getter for universal variables */ +static env_universal_t *uvars() { + return s_universal_variables; +} /** Table for global variables @@ -331,9 +339,7 @@ static void react_to_variable_change(const wcstring &key) Universal variable callback function. This function makes sure the proper events are triggered when an event occurs. */ -static void universal_callback(fish_message_type_t type, - const wchar_t *name, - const wchar_t *val) +static void universal_callback(fish_message_type_t type, const wchar_t *name, const wchar_t *val) { const wchar_t *str = NULL; @@ -554,7 +560,9 @@ void env_init(const struct config_paths_t *paths /* or NULL */) env_set(L"version", version.c_str(), ENV_GLOBAL); env_set(L"FISH_VERSION", version.c_str(), ENV_GLOBAL); - env_universal_init(universal_callback); + /* Set up universal variables. The empty string means to use the deafult path. */ + assert(s_universal_variables == NULL); + s_universal_variables = new env_universal_t(L""); /* Set up SHLVL variable @@ -586,32 +594,6 @@ void env_init(const struct config_paths_t *paths /* or NULL */) env_set(FISH_BIND_MODE_VAR, DEFAULT_BIND_MODE, ENV_GLOBAL); } -void env_destroy() -{ - env_universal_destroy(); - - while (&top->env != global) - { - env_pop(); - } - - env_read_only.clear(); - env_electric.clear(); - - var_table_t::iterator iter; - for (iter = global->begin(); iter != global->end(); ++iter) - { - const var_entry_t &entry = iter->second; - if (entry.exportv) - { - mark_changed_exported(); - break; - } - } - - delete top; -} - /** Search all visible scopes in order for the specified key. Return the first scope in which it was found. @@ -688,23 +670,32 @@ int env_set(const wcstring &key, const wchar_t *val, int var_mode) if (var_mode & ENV_UNIVERSAL) { - bool exportv; + const bool old_export = uvars() && uvars()->get_export(key); + bool new_export; if (var_mode & ENV_EXPORT) { // export - exportv = true; + new_export = true; } else if (var_mode & ENV_UNEXPORT) { // unexport - exportv = false; + new_export = false; } else { // not changing the export - exportv = env_universal_get_export(key); + new_export = old_export; + } + if (uvars()) + { + uvars()->set(key, val, new_export); + env_universal_barrier(); + if (old_export || new_export) + { + mark_changed_exported(); + } } - env_universal_set(key, val, exportv); is_universal = 1; } @@ -753,7 +744,7 @@ int env_set(const wcstring &key, const wchar_t *val, int var_mode) env_universal_barrier(); } - if (! env_universal_get(key).missing()) + if (uvars() && ! uvars()->get(key).missing()) { bool exportv; if (var_mode & ENV_EXPORT) @@ -766,10 +757,11 @@ int env_set(const wcstring &key, const wchar_t *val, int var_mode) } else { - exportv = env_universal_get_export(key); + exportv = uvars()->get_export(key); } - env_universal_set(key, val, exportv); + uvars()->set(key, val, exportv); + env_universal_barrier(); is_universal = 1; done = 1; @@ -817,7 +809,6 @@ int env_set(const wcstring &key, const wchar_t *val, int var_mode) if (has_changed_old || has_changed_new) mark_changed_exported(); } - } if (!is_universal) @@ -917,7 +908,7 @@ int env_remove(const wcstring &key, int var_mode) !(var_mode & ENV_GLOBAL) && !(var_mode & ENV_LOCAL)) { - erased = env_universal_remove(key); + erased = uvars() && uvars()->remove(key); } react_to_variable_change(key); @@ -1000,16 +991,12 @@ env_var_t env_get_string(const wcstring &key) env_universal_barrier(); } - env_var_t item = env_universal_get(key); - - if (item.missing() || (wcscmp(item.c_str(), ENV_NULL)==0)) - { - return env_var_t::missing_var(); - } - else + env_var_t env_var = uvars() ? uvars()->get(key) : env_var_t::missing_var(); + if (env_var == ENV_NULL) { - return item; + env_var = env_var_t::missing_var(); } + return env_var; } } @@ -1079,15 +1066,15 @@ bool env_exist(const wchar_t *key, int mode) env_universal_barrier(); } - if (! env_universal_get(key).missing()) + if (uvars() && ! uvars()->get(key).missing()) { if (mode & ENV_EXPORT) { - return env_universal_get_export(key) == 1; + return uvars()->get_export(key); } else if (mode & ENV_UNEXPORT) { - return env_universal_get_export(key) == 0; + return ! uvars()->get_export(key); } return 1; @@ -1254,13 +1241,9 @@ wcstring_list_t env_get_names(int flags) } - if (show_universal) + if (show_universal && uvars()) { - - wcstring_list_t uni_list; - env_universal_get_names(uni_list, - show_exported, - show_unexported); + const wcstring_list_t uni_list = uvars()->get_names(show_exported, show_unexported); names.insert(uni_list.begin(), uni_list.end()); } @@ -1340,18 +1323,20 @@ static void update_export_array_if_necessary(bool recalc) get_exported(top, vals); - wcstring_list_t uni; - env_universal_get_names(uni, 1, 0); - for (i=0; i<uni.size(); i++) + if (uvars()) { - const wcstring &key = uni.at(i); - const env_var_t val = env_universal_get(key); - - if (! val.missing() && wcscmp(val.c_str(), ENV_NULL)) + const wcstring_list_t uni = uvars()->get_names(true, false); + for (i=0; i<uni.size(); i++) { - // Note that std::map::insert does NOT overwrite a value already in the map, - // which we depend on here - vals.insert(std::pair<wcstring, wcstring>(key, val)); + const wcstring &key = uni.at(i); + const env_var_t val = uvars()->get(key); + + if (! val.missing() && val != ENV_NULL) + { + // Note that std::map::insert does NOT overwrite a value already in the map, + // which we depend on here + vals.insert(std::pair<wcstring, wcstring>(key, val)); + } } } @@ -1385,6 +1370,28 @@ env_vars_snapshot_t::env_vars_snapshot_t(const wchar_t * const *keys) } } + +void env_universal_barrier() +{ + ASSERT_IS_MAIN_THREAD(); + if (uvars()) + { + callback_data_list_t changes; + bool changed = uvars()->sync(&changes); + if (changed) + { + universal_notifier_t::default_notifier().post_notification(); + } + + /* Post callbacks */ + for (size_t i=0; i < changes.size(); i++) + { + const callback_data_t &data = changes.at(i); + universal_callback(data.type, data.key.c_str(), data.val.c_str()); + } + } +} + env_vars_snapshot_t::env_vars_snapshot_t() { } /* The "current" variables are not a snapshot at all, but instead trampoline to env_get_string, etc. We identify the current snapshot based on pointer values. */ |