restyle env module to match project style

Reduces lint errors from 90 to 72 (-20%). Line count from 1719 to 1298 (-24%).

Another step in resolving issue #2902.
This commit is contained in:
Kurtis Rader 2016-04-28 18:26:46 -07:00
parent cea65599e6
commit ea02da35d4
2 changed files with 495 additions and 914 deletions

File diff suppressed because it is too large Load diff

303
src/env.h
View file

@ -1,250 +1,196 @@
/** \file env.h // Prototypes for functions for setting and getting environment variables.
Prototypes for functions for setting and getting environment variables.
*/
#ifndef FISH_ENV_H #ifndef FISH_ENV_H
#define FISH_ENV_H #define FISH_ENV_H
#include <stdint.h>
#include <string>
#include <map>
#include <stddef.h>
#include <memory>
#include <stdbool.h> #include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <map>
#include <memory>
#include <string>
#include "common.h" #include "common.h"
/* Flags that may be passed as the 'mode' in env_set / env_get_string */ // Flags that may be passed as the 'mode' in env_set / env_get_string.
enum enum {
{ /// Default mode.
/* Default mode */
ENV_DEFAULT = 0, ENV_DEFAULT = 0,
/** Flag for local (to the current block) variable */ /// Flag for local (to the current block) variable.
ENV_LOCAL = 1, ENV_LOCAL = 1,
/** Flag for exported (to commands) variable */ /// Flag for exported (to commands) variable.
ENV_EXPORT = 2, ENV_EXPORT = 2,
/** Flag for unexported variable */ /// Flag for unexported variable.
ENV_UNEXPORT = 16, ENV_UNEXPORT = 16,
/** Flag for global variable */ /// Flag for global variable.
ENV_GLOBAL = 4, ENV_GLOBAL = 4,
/** Flag for variable update request from the user. All variable /// Flag for variable update request from the user. All variable changes that are made directly
changes that are made directly by the user, such as those from the /// by the user, such as those from the 'set' builtin must have this flag set.
'set' builtin must have this flag set. */
ENV_USER = 8, ENV_USER = 8,
/** Flag for universal variable */ /// Flag for universal variable.
ENV_UNIVERSAL = 32 ENV_UNIVERSAL = 32
}; };
typedef uint32_t env_mode_flags_t; typedef uint32_t env_mode_flags_t;
/** /// Error code for trying to alter read-only variable.
Error code for trying to alter read-only variable enum { ENV_PERM = 1, ENV_SCOPE, ENV_INVALID };
*/
enum
{
ENV_PERM = 1,
ENV_SCOPE,
ENV_INVALID
}
;
/* A struct of configuration directories, determined in main() that fish will optionally pass to env_init. /// A struct of configuration directories, determined in main() that fish will optionally pass to
*/ /// env_init.
struct config_paths_t struct config_paths_t {
{ wcstring data; // e.g. /usr/local/share
wcstring data; // e.g. /usr/local/share wcstring sysconf; // e.g. /usr/local/etc
wcstring sysconf; // e.g. /usr/local/etc wcstring doc; // e.g. /usr/local/share/doc/fish
wcstring doc; // e.g. /usr/local/share/doc/fish wcstring bin; // e.g. /usr/local/bin
wcstring bin; // e.g. /usr/local/bin
}; };
/** /// Initialize environment variable data.
Initialize environment variable data
*/
void env_init(const struct config_paths_t *paths = NULL); void env_init(const struct config_paths_t *paths = NULL);
/** /// Set the value of the environment variable whose name matches key to val.
Set the value of the environment variable whose name matches key to val. ///
/// Memory policy: All keys and values are copied, the parameters can and should be freed by the
Memory policy: All keys and values are copied, the parameters can and should be freed by the caller afterwards /// caller afterwards
///
\param key The key /// \param key The key
\param val The value /// \param val The value
\param mode The type of the variable. Can be any combination of ENV_GLOBAL, ENV_LOCAL, ENV_EXPORT and ENV_USER. If mode is zero, the current variable space is searched and the current mode is used. If no current variable with the same name is found, ENV_LOCAL is assumed. /// \param mode The type of the variable. Can be any combination of ENV_GLOBAL, ENV_LOCAL,
/// ENV_EXPORT and ENV_USER. If mode is zero, the current variable space is searched and the current
\returns 0 on suicess or an error code on failiure. /// mode is used. If no current variable with the same name is found, ENV_LOCAL is assumed.
///
The current error codes are: /// \returns 0 on success or an error code on failiure.
///
* ENV_PERM, can only be returned when setting as a user, e.g. ENV_USER is set. This means that the user tried to change a read-only variable. /// The current error codes are:
* ENV_SCOPE, the variable cannot be set in the given scope. This applies to readonly/electric variables set from the local or universal scopes, or set as exported. ///
* ENV_INVALID, the variable value was invalid. This applies only to special variables. /// * ENV_PERM, can only be returned when setting as a user, e.g. ENV_USER is set. This means that
*/ /// the user tried to change a read-only variable.
/// * ENV_SCOPE, the variable cannot be set in the given scope. This applies to readonly/electric
/// variables set from the local or universal scopes, or set as exported.
/// * ENV_INVALID, the variable value was invalid. This applies only to special variables.
int env_set(const wcstring &key, const wchar_t *val, env_mode_flags_t mode); int env_set(const wcstring &key, const wchar_t *val, env_mode_flags_t mode);
class env_var_t : public wcstring {
/** private:
Return the value of the variable with the specified name. Returns 0
if the key does not exist. The returned string should not be
modified or freed. The returned string is only guaranteed to be
valid until the next call to env_get(), env_set(), env_push() or
env_pop() takes place.
*/
//const wchar_t *env_get( const wchar_t *key );
class env_var_t : public wcstring
{
private:
bool is_missing; bool is_missing;
public:
static env_var_t missing_var() public:
{ static env_var_t missing_var() {
env_var_t result((wcstring())); env_var_t result((wcstring()));
result.is_missing = true; result.is_missing = true;
return result; return result;
} }
env_var_t(const env_var_t &x) : wcstring(x), is_missing(x.is_missing) { } 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 wcstring &x) : wcstring(x), is_missing(false) {}
env_var_t(const wchar_t *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) { } env_var_t() : wcstring(L""), is_missing(false) {}
bool missing(void) const bool missing(void) const { return is_missing; }
{
return is_missing;
}
bool missing_or_empty(void) const bool missing_or_empty(void) const { return missing() || empty(); }
{
return missing() || empty();
}
const wchar_t *c_str(void) const; const wchar_t *c_str(void) const;
env_var_t &operator=(const env_var_t &s) env_var_t &operator=(const env_var_t &s) {
{
is_missing = s.is_missing; is_missing = s.is_missing;
wcstring::operator=(s); wcstring::operator=(s);
return *this; return *this;
} }
bool operator==(const env_var_t &s) const bool operator==(const env_var_t &s) const {
{ return is_missing == s.is_missing &&
return is_missing == s.is_missing && static_cast<const wcstring &>(*this) == static_cast<const wcstring &>(s); static_cast<const wcstring &>(*this) == static_cast<const wcstring &>(s);
} }
bool operator==(const wcstring &s) const bool operator==(const wcstring &s) const {
{ return !is_missing && static_cast<const wcstring &>(*this) == s;
return ! is_missing && static_cast<const wcstring &>(*this) == s;
} }
bool operator!=(const env_var_t &s) const bool operator!=(const env_var_t &s) const { return !(*this == s); }
{
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 wcstring &s) const bool operator!=(const wchar_t *s) const { return !(*this == s); }
{
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 env_var_t::missing_var if it does not exist or is
Gets the variable with the specified name, or env_var_t::missing_var if it does not exist or is an empty array. /// an empty array.
///
\param key The name of the variable to get /// \param key The name of the variable to get
\param mode An optional scope to search in. All scopes are searched if unset /// \param mode An optional scope to search in. All scopes are searched if unset
*/
env_var_t env_get_string(const wcstring &key, env_mode_flags_t mode = ENV_DEFAULT); env_var_t env_get_string(const wcstring &key, env_mode_flags_t mode = ENV_DEFAULT);
/** /// Returns true if the specified key exists. This can't be reliably done using env_get, since
Returns true if the specified key exists. This can't be reliably done /// env_get returns null for 0-element arrays.
using env_get, since env_get returns null for 0-element arrays ///
/// \param key The name of the variable to remove
\param key The name of the variable to remove /// \param mode the scope to search in. All scopes are searched if set to default
\param mode the scope to search in. All scopes are searched if set to default
*/
bool env_exist(const wchar_t *key, env_mode_flags_t mode); bool env_exist(const wchar_t *key, env_mode_flags_t mode);
/** /// Remove environment variable.
Remove environemnt variable ///
/// \param key The name of the variable to remove
\param key The name of the variable to remove /// \param mode should be ENV_USER if this is a remove request from the user, 0 otherwise. If this
\param mode should be ENV_USER if this is a remove request from the user, 0 otherwise. If this is a user request, read-only variables can not be removed. The mode may also specify the scope of the variable that should be erased. /// is a user request, read-only variables can not be removed. The mode may also specify the scope
/// of the variable that should be erased.
\return zero if the variable existed, and non-zero if the variable did not exist ///
*/ /// \return zero if the variable existed, and non-zero if the variable did not exist
int env_remove(const wcstring &key, int mode); int env_remove(const wcstring &key, int mode);
/** /// Push the variable stack. Used for implementing local variables for functions and for-loops.
Push the variable stack. Used for implementing local variables for functions and for-loops.
*/
void env_push(bool new_scope); void env_push(bool new_scope);
/** /// Pop the variable stack. Used for implementing local variables for functions and for-loops.
Pop the variable stack. Used for implementing local variables for functions and for-loops.
*/
void env_pop(); void env_pop();
/** Synchronizes all universal variable changes: writes everything out, reads stuff in */ /// Synchronizes all universal variable changes: writes everything out, reads stuff in.
void env_universal_barrier(); void env_universal_barrier();
/** Returns an array containing all exported variables in a format suitable for execv. */ /// Returns an array containing all exported variables in a format suitable for execv.
const char * const * env_export_arr(bool recalc); const char *const *env_export_arr(bool recalc);
/** Sets up argv as the given null terminated array of strings */ /// Sets up argv as the given null terminated array of strings.
void env_set_argv(const wchar_t * const * argv); void env_set_argv(const wchar_t *const *argv);
/** /// Returns all variable names.
Returns all variable names.
*/
wcstring_list_t env_get_names(int flags); wcstring_list_t env_get_names(int flags);
/** Update the PWD variable directory */ /// Update the PWD variable directory.
int env_set_pwd(); int env_set_pwd();
/* Returns the PWD with a terminating slash */ /// Returns the PWD with a terminating slash.
wcstring env_get_pwd_slash(); wcstring env_get_pwd_slash();
class env_vars_snapshot_t class env_vars_snapshot_t {
{
std::map<wcstring, wcstring> vars; std::map<wcstring, wcstring> vars;
bool is_current() const; bool is_current() const;
env_vars_snapshot_t(const env_vars_snapshot_t&); env_vars_snapshot_t(const env_vars_snapshot_t &);
void operator=(const env_vars_snapshot_t &); void operator=(const env_vars_snapshot_t &);
public: public:
env_vars_snapshot_t(const wchar_t * const * keys); env_vars_snapshot_t(const wchar_t *const *keys);
env_vars_snapshot_t(); env_vars_snapshot_t();
env_var_t get(const wcstring &key) const; env_var_t get(const wcstring &key) const;
// Returns the fake snapshot representing the live variables array // Returns the fake snapshot representing the live variables array.
static const env_vars_snapshot_t &current(); static const env_vars_snapshot_t &current();
// vars necessary for highlighting // Vars necessary for highlighting.
static const wchar_t * const highlighting_keys[]; static const wchar_t *const highlighting_keys[];
// vars necessary for completion // Vars necessary for completion.
static const wchar_t * const completing_keys[]; static const wchar_t *const completing_keys[];
}; };
extern bool g_log_forks; extern bool g_log_forks;
@ -252,18 +198,13 @@ extern int g_fork_count;
extern bool g_use_posix_spawn; extern bool g_use_posix_spawn;
/** /// A variable entry. Stores the value of a variable and whether it should be exported.
A variable entry. Stores the value of a variable and whether it struct var_entry_t {
should be exported. wcstring val; // the value of the variable
*/ bool exportv; // whether the variable should be exported
struct var_entry_t
{ var_entry_t() : exportv(false) {}
wcstring val; /**< The value of the variable */
bool exportv; /**< Whether the variable should be exported */
var_entry_t() : exportv(false) { }
}; };
typedef std::map<wcstring, var_entry_t> var_table_t; typedef std::map<wcstring, var_entry_t> var_table_t;
#endif #endif