mirror of
https://github.com/fish-shell/fish-shell.git
synced 2025-02-22 04:51:54 +08:00
Optimize lookup of electric variables
This commit is contained in:
parent
9bddd78239
commit
a5be15da69
30
src/env.cpp
30
src/env.cpp
@ -81,27 +81,33 @@ struct electric_var_t {
|
|||||||
static const electric_var_t *for_name(const wcstring &name);
|
static const electric_var_t *for_name(const wcstring &name);
|
||||||
};
|
};
|
||||||
|
|
||||||
static const electric_var_t electric_variables[] = {
|
// Keep sorted alphabetically
|
||||||
|
static const std::vector<electric_var_t> electric_variables {
|
||||||
|
{L"FISH_VERSION", electric_var_t::freadonly},
|
||||||
{L"PWD", electric_var_t::freadonly | electric_var_t::fcomputed | electric_var_t::fexports},
|
{L"PWD", electric_var_t::freadonly | electric_var_t::fcomputed | electric_var_t::fexports},
|
||||||
{L"SHLVL", electric_var_t::freadonly | electric_var_t::fexports},
|
{L"SHLVL", electric_var_t::freadonly | electric_var_t::fexports},
|
||||||
|
{L"_", electric_var_t::freadonly},
|
||||||
|
{L"fish_kill_signal", electric_var_t::freadonly | electric_var_t::fcomputed},
|
||||||
|
{L"fish_pid", electric_var_t::freadonly},
|
||||||
|
{L"fish_private_mode", electric_var_t::freadonly},
|
||||||
{L"history", electric_var_t::freadonly | electric_var_t::fcomputed},
|
{L"history", electric_var_t::freadonly | electric_var_t::fcomputed},
|
||||||
|
{L"hostname", electric_var_t::freadonly},
|
||||||
{L"pipestatus", electric_var_t::freadonly | electric_var_t::fcomputed},
|
{L"pipestatus", electric_var_t::freadonly | electric_var_t::fcomputed},
|
||||||
{L"status", electric_var_t::freadonly | electric_var_t::fcomputed},
|
{L"status", electric_var_t::freadonly | electric_var_t::fcomputed},
|
||||||
{L"version", electric_var_t::freadonly},
|
|
||||||
{L"FISH_VERSION", electric_var_t::freadonly},
|
|
||||||
{L"fish_pid", electric_var_t::freadonly},
|
|
||||||
{L"hostname", electric_var_t::freadonly},
|
|
||||||
{L"_", electric_var_t::freadonly},
|
|
||||||
{L"fish_private_mode", electric_var_t::freadonly},
|
|
||||||
{L"umask", electric_var_t::fcomputed},
|
{L"umask", electric_var_t::fcomputed},
|
||||||
{L"fish_kill_signal", electric_var_t::freadonly | electric_var_t::fcomputed},
|
{L"version", electric_var_t::freadonly},
|
||||||
};
|
};
|
||||||
|
|
||||||
const electric_var_t *electric_var_t::for_name(const wcstring &name) {
|
const electric_var_t *electric_var_t::for_name(const wcstring &name) {
|
||||||
for (const auto &var : electric_variables) {
|
static auto first = electric_variables.begin();
|
||||||
if (name == var.name) {
|
static auto last = electric_variables.end();
|
||||||
return &var;
|
electric_var_t search { name.c_str(), 0 };
|
||||||
}
|
auto binsearch = std::lower_bound(first, last, search,
|
||||||
|
[&](const electric_var_t &v1, const electric_var_t &v2) {
|
||||||
|
return wcscmp(v1.name, v2.name) < 0;
|
||||||
|
});
|
||||||
|
if (binsearch != last && wcscmp(name.c_str(), binsearch->name) == 0) {
|
||||||
|
return &*binsearch;
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user