/** Attempt to remove/free the specified key/value pair from the specified map. \return zero if the variable was not found, non-zero otherwise */ static bool try_remove(env_node_t *n, const wchar_t *key, int var_mode) { if (n == NULL) { return false; } var_table_t::iterator result = n->env.find(key); if (result != n->env.end()) { if (result->second.exportv) { mark_changed_exported(); } n->env.erase(result); return true; } if (var_mode & ENV_LOCAL) { return false; } if (n->new_scope) { return try_remove(global_env, key, var_mode); } else { return try_remove(n->next, key, var_mode); } }
int env_remove(const wcstring &key, int var_mode) { ASSERT_IS_MAIN_THREAD(); env_node_t *first_node; int erased = 0; if ((var_mode & ENV_USER) && is_read_only(key)) { return 2; } first_node = top; if (!(var_mode & ENV_UNIVERSAL)) { if (var_mode & ENV_GLOBAL) { first_node = global_env; } if (try_remove(first_node, key.c_str(), var_mode)) { event_t ev = event_t::variable_event(key); ev.arguments.push_back(L"VARIABLE"); ev.arguments.push_back(L"ERASE"); ev.arguments.push_back(key); event_fire(&ev); erased = 1; } } if (!erased && !(var_mode & ENV_GLOBAL) && !(var_mode & ENV_LOCAL)) { bool is_exported = uvars()->get_export(key); erased = uvars() && uvars()->remove(key); if (erased) { env_universal_barrier(); event_t ev = event_t::variable_event(key); ev.arguments.push_back(L"VARIABLE"); ev.arguments.push_back(L"ERASE"); ev.arguments.push_back(key); event_fire(&ev); } if (is_exported) mark_changed_exported(); } react_to_variable_change(key); return !erased; }
/** Attempt to remove/free the specified key/value pair from the specified map. \return zero if the variable was not found, non-zero otherwise */ static int try_remove( env_node_t *n, const wchar_t *key, int var_mode ) { if( n == 0 ) { return 0; } var_table_t::iterator result = n->env.find( key ); if ( result != n->env.end() ) { var_entry_t *v = result->second; if( v->exportv ) { mark_changed_exported(); } n->env.erase(result); delete v; return 1; } if( var_mode & ENV_LOCAL ) { return 0; } if( n->new_scope ) { return try_remove( global_env, key, var_mode ); } else { return try_remove( n->next, key, var_mode ); } }
int env_remove( const wcstring &key, int var_mode ) { ASSERT_IS_MAIN_THREAD(); env_node_t *first_node; int erased = 0; if( (var_mode & ENV_USER ) && is_read_only(key) ) { return 2; } first_node = top; if( ! (var_mode & ENV_UNIVERSAL ) ) { if( var_mode & ENV_GLOBAL ) { first_node = global_env; } if( try_remove( first_node, key.c_str(), var_mode ) ) { event_t ev = event_t::variable_event(key); ev.arguments.reset(new wcstring_list_t); ev.arguments->push_back(L"VARIABLE"); ev.arguments->push_back(L"ERASE"); ev.arguments->push_back(key); event_fire( &ev ); ev.arguments.reset(NULL); erased = 1; } } if( !erased && !(var_mode & ENV_GLOBAL) && !(var_mode & ENV_LOCAL) ) { erased = ! env_universal_remove( key.c_str() ); } react_to_variable_change(key); return !erased; }