Clean up env_var_table_t. Switch from storing var_uni_entry_t* to var_uni_entry_t. Various other cleanups.

This commit is contained in:
ridiculousfish 2013-02-11 23:16:50 -08:00
parent be23c0755e
commit 2a7fc9c3a5
9 changed files with 106 additions and 127 deletions

15
env.cpp
View file

@ -1029,13 +1029,6 @@ int env_remove(const wcstring &key, int var_mode)
return !erased;
}
env_var_t env_var_t::missing_var(void)
{
env_var_t result(L"");
result.is_missing = true;
return result;
}
const wchar_t *env_var_t::c_str(void) const
{
assert(! is_missing);
@ -1119,7 +1112,7 @@ env_var_t env_get_string(const wcstring &key)
env_universal_barrier();
}
wchar_t *item = env_universal_get(key);
const wchar_t *item = env_universal_get(key);
if (!item || (wcscmp(item, ENV_NULL)==0))
{
@ -1135,7 +1128,7 @@ env_var_t env_get_string(const wcstring &key)
bool env_exist(const wchar_t *key, int mode)
{
env_node_t *env;
wchar_t *item=0;
const wchar_t *item = NULL;
CHECK(key, false);
@ -1387,7 +1380,7 @@ wcstring_list_t env_get_names(int flags)
{
wcstring_list_t uni_list;
env_universal_get_names2(uni_list,
env_universal_get_names(uni_list,
show_exported,
show_unexported);
names.insert(uni_list.begin(), uni_list.end());
@ -1472,7 +1465,7 @@ static void update_export_array_if_necessary(bool recalc)
get_exported(top, vals);
wcstring_list_t uni;
env_universal_get_names2(uni, 1, 0);
env_universal_get_names(uni, 1, 0);
for (i=0; i<uni.size(); i++)
{
const wcstring &key = uni.at(i);

46
env.h
View file

@ -108,20 +108,31 @@ class env_var_t : public wcstring
private:
bool is_missing;
public:
static env_var_t missing_var(void);
static env_var_t missing_var(void)
{
env_var_t result(L"");
result.is_missing = true;
return result;
}
env_var_t(const env_var_t &x) : wcstring(x), is_missing(x.is_missing) { }
env_var_t(const wcstring & x) : wcstring(x), is_missing(false) { }
env_var_t(const wchar_t *x) : wcstring(x), is_missing(false) { }
env_var_t() : wcstring(L""), is_missing(false) { }
bool missing(void) const
{
return is_missing;
}
bool missing_or_empty(void) const
{
return missing() || empty();
}
const wchar_t *c_str(void) const;
env_var_t &operator=(const env_var_t &s)
{
is_missing = s.is_missing;
@ -131,14 +142,35 @@ public:
bool operator==(const env_var_t &s) const
{
if (is_missing && s.is_missing)
return true;
else if (s.is_missing || s.is_missing)
return false;
else
return *static_cast<const wcstring *>(this) == *static_cast<const wcstring *>(&s);
return is_missing == s.is_missing && static_cast<const wcstring &>(*this) == static_cast<const wcstring &>(s);
}
bool operator==(const wcstring &s) const
{
return ! is_missing && static_cast<const wcstring &>(*this) == s;
}
bool operator!=(const env_var_t &s) const
{
return !(*this == s);
}
bool operator!=(const wcstring &s) const
{
return !(*this == s);
}
bool operator==(const wchar_t *s) const
{
return ! is_missing && static_cast<const wcstring &>(*this) == s;
}
bool operator!=(const wchar_t *s) const
{
return !(*this == s);
}
};
/**
Gets the variable with the specified name, or an empty string if it does not exist.

View file

@ -49,9 +49,9 @@
connection_t env_universal_server;
/**
Set to 1 after initialization has been performed
Set to true after initialization has been performed
*/
static int init = 0;
static bool s_env_univeral_inited = false;
/**
The number of attempts to start fishd
@ -207,7 +207,7 @@ static void callback(fish_message_type_t type, const wchar_t *name, const wchar_
*/
static void check_connection()
{
if (!init)
if (! s_env_univeral_inited)
return;
if (env_universal_server.killme)
@ -258,10 +258,10 @@ static void reconnect()
debug(3, L"Get new fishd connection");
init = 0;
s_env_univeral_inited = false;
env_universal_server.buffer_consumed = env_universal_server.buffer_used = 0;
env_universal_server.fd = get_socket();
init = 1;
s_env_univeral_inited = true;
if (env_universal_server.fd >= 0)
{
env_universal_remove_all();
@ -285,7 +285,7 @@ void env_universal_init(wchar_t * p,
env_universal_server.fd = get_socket();
env_universal_common_init(&callback);
env_universal_read_all();
init = 1;
s_env_univeral_inited = true;
if (env_universal_server.fd >= 0)
{
env_universal_barrier();
@ -308,8 +308,7 @@ void env_universal_destroy()
connection_destroy(&env_universal_server);
env_universal_server.fd =-1;
env_universal_common_destroy();
init = 0;
s_env_univeral_inited = false;
}
@ -318,7 +317,7 @@ void env_universal_destroy()
*/
int env_universal_read_all()
{
if (!init)
if (! s_env_univeral_inited)
return 0;
if (env_universal_server.fd == -1)
@ -341,17 +340,17 @@ int env_universal_read_all()
}
}
wchar_t *env_universal_get(const wcstring &name)
const wchar_t *env_universal_get(const wcstring &name)
{
if (!init)
return 0;
if (!s_env_univeral_inited)
return NULL;
return env_universal_common_get(name);
}
bool env_universal_get_export(const wcstring &name)
{
if (!init)
if (!s_env_univeral_inited)
return false;
return env_universal_common_get_export(name);
@ -363,7 +362,7 @@ void env_universal_barrier()
message_t *msg;
fd_set fds;
if (!init || is_dead())
if (!s_env_univeral_inited || is_dead())
return;
barrier_reply = 0;
@ -424,7 +423,7 @@ void env_universal_set(const wcstring &name, const wcstring &value, bool exportv
{
message_t *msg;
if (!init)
if (!s_env_univeral_inited)
return;
debug(3, L"env_universal_set( \"%ls\", \"%ls\" )", name.c_str(), value.c_str());
@ -456,7 +455,7 @@ int env_universal_remove(const wchar_t *name)
int res;
message_t *msg;
if (!init)
if (!s_env_univeral_inited)
return 1;
CHECK(name, 1);
@ -481,11 +480,11 @@ int env_universal_remove(const wchar_t *name)
return res;
}
void env_universal_get_names2(wcstring_list_t &lst,
void env_universal_get_names(wcstring_list_t &lst,
bool show_exported,
bool show_unexported)
{
if (!init)
if (!s_env_univeral_inited)
return;
env_universal_common_get_names(lst,

View file

@ -29,7 +29,7 @@ void env_universal_destroy();
/**
Get the value of a universal variable
*/
wchar_t *env_universal_get(const wcstring &name);
const wchar_t *env_universal_get(const wcstring &name);
/**
Get the export flag of the variable with the specified
@ -60,7 +60,7 @@ int env_universal_read_all();
\param show_exported whether exported variables should be shown
\param show_unexported whether unexported variables should be shown
*/
void env_universal_get_names2(wcstring_list_t &list,
void env_universal_get_names(wcstring_list_t &list,
bool show_exported,
bool show_unexported);

View file

@ -106,7 +106,7 @@ static void parse_message(wchar_t *msg,
/**
The table of all universal variables
*/
typedef std::map<wcstring, var_uni_entry_t*> env_var_table_t;
typedef std::map<wcstring, var_uni_entry_t> env_var_table_t;
env_var_table_t env_universal_var;
/**
@ -416,18 +416,6 @@ void env_universal_common_init(void (*cb)(fish_message_type_t type, const wchar_
callback = cb;
}
void env_universal_common_destroy()
{
env_var_table_t::iterator iter;
for (iter = env_universal_var.begin(); iter != env_universal_var.end(); ++iter)
{
var_uni_entry_t* value = iter->second;
delete value;
}
}
/**
Read one byte of date form the specified connection
*/
@ -550,13 +538,7 @@ void read_message(connection_t *src)
*/
void env_universal_common_remove(const wcstring &name)
{
env_var_table_t::iterator result = env_universal_var.find(name);
if (result != env_universal_var.end())
{
var_uni_entry_t* v = result->second;
env_universal_var.erase(result);
delete v;
}
env_universal_var.erase(name);
}
/**
@ -576,18 +558,13 @@ static bool match(const wchar_t *msg, const wchar_t *cmd)
void env_universal_common_set(const wchar_t *key, const wchar_t *val, bool exportv)
{
var_uni_entry_t *entry;
CHECK(key,);
CHECK(val,);
entry = new var_uni_entry_t;
var_uni_entry_t &entry = env_universal_var[key];
entry.exportv=exportv;
entry.val = val;
entry->exportv=exportv;
entry->val = val;
env_universal_common_remove(key);
env_universal_var[key] = entry;
if (callback)
{
callback(exportv?SET_EXPORT:SET, key, val);
@ -910,30 +887,26 @@ void env_universal_common_get_names(wcstring_list_t &lst,
for (iter = env_universal_var.begin(); iter != env_universal_var.end(); ++iter)
{
const wcstring &key = iter->first;
const var_uni_entry_t *e = iter->second;
if ((e->exportv && show_exported) ||
(!e->exportv && show_unexported))
const var_uni_entry_t &e = iter->second;
if ((e.exportv && show_exported) || (! e.exportv && show_unexported))
{
lst.push_back(key);
}
}
}
wchar_t *env_universal_common_get(const wcstring &name)
const wchar_t *env_universal_common_get(const wcstring &name)
{
env_var_table_t::const_iterator result = env_universal_var.find(name);
if (result != env_universal_var.end())
{
const var_uni_entry_t *e = result->second;
if (e)
return const_cast<wchar_t*>(e->val.c_str());
const var_uni_entry_t &e = result->second;
return const_cast<wchar_t*>(e.val.c_str());
}
return 0;
return NULL;
}
bool env_universal_common_get_export(const wcstring &name)
@ -941,9 +914,8 @@ bool env_universal_common_get_export(const wcstring &name)
env_var_table_t::const_iterator result = env_universal_var.find(name);
if (result != env_universal_var.end())
{
const var_uni_entry_t *e = result->second;
if (e != NULL)
return e->exportv;
const var_uni_entry_t &e = result->second;
return e.exportv;
}
return false;
}
@ -951,13 +923,12 @@ bool env_universal_common_get_export(const wcstring &name)
void enqueue_all(connection_t *c)
{
env_var_table_t::const_iterator iter;
for (iter = env_universal_var.begin(); iter != env_universal_var.end(); ++iter)
{
const wcstring &key = iter->first;
const var_uni_entry_t *val = iter->second;
const var_uni_entry_t &entry = iter->second;
message_t *msg = create_message(val->exportv?SET_EXPORT:SET, key.c_str(), val->val.c_str());
message_t *msg = create_message(entry.exportv ? SET_EXPORT : SET, key.c_str(), entry.val.c_str());
msg->count=1;
c->unsent->push(msg);
}

View file

@ -139,11 +139,6 @@ message_t *create_message(fish_message_type_t type, const wchar_t *key, const wc
*/
void env_universal_common_init(void (*cb)(fish_message_type_t type, const wchar_t *key, const wchar_t *val));
/**
Destroy library data
*/
void env_universal_common_destroy();
/**
Add all variable names to the specified list
@ -182,7 +177,7 @@ void env_universal_common_remove(const wcstring &key);
This function operate agains the local copy of all universal
variables, it does not communicate with any other process.
*/
wchar_t *env_universal_common_get(const wcstring &name);
const wchar_t *env_universal_common_get(const wcstring &name);
/**
Get the export flag of the variable with the specified

View file

@ -708,27 +708,20 @@ static void daemonize()
}
/**
Get environment variable value. The resulting string needs to be free'd.
Get environment variable value.
*/
static wchar_t *fishd_env_get(const wchar_t *key)
static env_var_t fishd_env_get(const char *key)
{
char *nres, *nkey;
wchar_t *res;
nkey = wcs2str(key);
nres = getenv(nkey);
free(nkey);
if (nres)
const char *env = getenv(key);
if (env != NULL)
{
wcstring tmp = str2wcstring(nres);
return wcsdup(tmp.c_str());
return env_var_t(str2wcstring(env));
}
else
{
res = env_universal_common_get(key);
if (res)
res = wcsdup(res);
return res;
const wcstring wkey = str2wcstring(key);
const wchar_t *tmp = env_universal_common_get(wkey);
return tmp ? env_var_t(tmp) : env_var_t::missing_var();
}
}
@ -740,12 +733,11 @@ static wchar_t *fishd_env_get(const wchar_t *key)
*/
static wcstring fishd_get_config()
{
wchar_t *xdg_dir, *home;
bool done = false;
wcstring result;
xdg_dir = fishd_env_get(L"XDG_CONFIG_HOME");
if (xdg_dir)
env_var_t xdg_dir = fishd_env_get("XDG_CONFIG_HOME");
if (! xdg_dir.missing_or_empty())
{
result = xdg_dir;
append_path_component(result, L"/fish");
@ -753,12 +745,11 @@ static wcstring fishd_get_config()
{
done = true;
}
free(xdg_dir);
}
else
{
home = fishd_env_get(L"HOME");
if (home)
env_var_t home = fishd_env_get("HOME");
if (! home.missing_or_empty())
{
result = home;
append_path_component(result, L"/.config/fish");
@ -766,7 +757,6 @@ static wcstring fishd_get_config()
{
done = 1;
}
free(home);
}
}
@ -1100,7 +1090,6 @@ int main(int argc, char ** argv)
{
debug(0, L"No more clients. Quitting");
save();
env_universal_common_destroy();
break;
}