diff options
Diffstat (limited to 'src/expand.h')
-rw-r--r-- | src/expand.h | 206 |
1 files changed, 93 insertions, 113 deletions
diff --git a/src/expand.h b/src/expand.h index fafbcd2a..a0efd1fd 100644 --- a/src/expand.h +++ b/src/expand.h @@ -1,179 +1,159 @@ -/**\file expand.h - - Prototypes for string expansion functions. These functions perform - several kinds of parameter expansion. There are a lot of issues - with regards to memory allocation. Overall, these functions would - benefit from using a more clever memory allocation scheme, perhaps - an evil combination of talloc, string buffers and reference - counting. - -*/ - +// Prototypes for string expansion functions. These functions perform several kinds of parameter +// expansion. There are a lot of issues with regards to memory allocation. Overall, these functions +// would benefit from using a more clever memory allocation scheme, perhaps an evil combination of +// talloc, string buffers and reference counting. #ifndef FISH_EXPAND_H -/** - Header guard -*/ #define FISH_EXPAND_H -#include "config.h" // for __warn_unused +#include "config.h" -#include <wchar.h> -#include <string> // for string -#include <vector> // for vector +#include <stdbool.h> +#include <stddef.h> +#include <string> +#include <vector> #include "common.h" #include "parse_constants.h" -enum -{ - // Flag specifying that cmdsubst expansion should be skipped. +enum { + /// Flag specifying that cmdsubst expansion should be skipped. EXPAND_SKIP_CMDSUBST = 1 << 0, - // Flag specifying that variable expansion should be skipped. + /// Flag specifying that variable expansion should be skipped. EXPAND_SKIP_VARIABLES = 1 << 1, - // Flag specifying that wildcard expansion should be skipped. + /// Flag specifying that wildcard expansion should be skipped. EXPAND_SKIP_WILDCARDS = 1 << 2, - // The expansion is being done for tab or auto completions. Returned - // completions may have the wildcard as a prefix instead of a match. + /// The expansion is being done for tab or auto completions. Returned completions may have the + /// wildcard as a prefix instead of a match. EXPAND_FOR_COMPLETIONS = 1 << 3, - // Only match files that are executable by the current user. Only - // applicable together with ACCEPT_INCOMPLETE. + /// Only match files that are executable by the current user. Only applicable together with + /// ACCEPT_INCOMPLETE. EXECUTABLES_ONLY = 1 << 4, - // Only match directories. Only applicable together with ACCEPT_INCOMPLETE. + /// Only match directories. Only applicable together with ACCEPT_INCOMPLETE. DIRECTORIES_ONLY = 1 << 5, - // Don't generate descriptions. + /// Don't generate descriptions. EXPAND_NO_DESCRIPTIONS = 1 << 6, - // Don't expand jobs (but you can still expand processes). This is because + /// Don't expand jobs (but you can still expand processes). This is because // job expansion is not thread safe. EXPAND_SKIP_JOBS = 1 << 7, - // Don't expand home directories. + /// Don't expand home directories. EXPAND_SKIP_HOME_DIRECTORIES = 1 << 8, - // Allow fuzzy matching. + /// Allow fuzzy matching. EXPAND_FUZZY_MATCH = 1 << 9, - // Disallow directory abbreviations like /u/l/b for /usr/local/bin. Only - // applicable if EXPAND_FUZZY_MATCH is set. + /// Disallow directory abbreviations like /u/l/b for /usr/local/bin. Only applicable if + /// EXPAND_FUZZY_MATCH is set. EXPAND_NO_FUZZY_DIRECTORIES = 1 << 10, - // Do expansions specifically to support cd - // This means using CDPATH as a list of potential working directories + /// Do expansions specifically to support cd. This means using CDPATH as a list of potential + /// working directories. EXPAND_SPECIAL_FOR_CD = 1 << 11, - // Do expansions specifically to support external command completions. - // This means using PATH as a list of potential working directories + /// Do expansions specifically to support external command completions. This means using PATH as + // a list of potential working directories. EXPAND_SPECIAL_FOR_COMMAND = 1 << 12 }; typedef int expand_flags_t; class completion_t; -enum -{ - // Character representing a home directory. +enum { + /// Character representing a home directory. HOME_DIRECTORY = EXPAND_RESERVED_BASE, - // Character representing process expansion. + /// Character representing process expansion. PROCESS_EXPAND, - // Character representing variable expansion. + /// Character representing variable expansion. VARIABLE_EXPAND, - // Character representing variable expansion into a single element. + /// Character representing variable expansion into a single element. VARIABLE_EXPAND_SINGLE, - // Character representing the start of a bracket expansion. + /// Character representing the start of a bracket expansion. BRACKET_BEGIN, - // Character representing the end of a bracket expansion. + /// Character representing the end of a bracket expansion. BRACKET_END, - // Character representing separation between two bracket elements. + /// Character representing separation between two bracket elements. BRACKET_SEP, - // Separate subtokens in a token with this character. + /// Separate subtokens in a token with this character. INTERNAL_SEPARATOR, - // Character representing an empty variable expansion. Only used - // transitively while expanding variables. + /// Character representing an empty variable expansion. Only used transitively while expanding + /// variables. VARIABLE_EXPAND_EMPTY, - // This is a special psuedo-char that is not used other than to mark the - // end of the the special characters so we can sanity check the enum range. + /// This is a special psuedo-char that is not used other than to mark the end of the the special + /// characters so we can sanity check the enum range. EXPAND_SENTINAL }; -/** These are the possible return values for expand_string. Note how zero value is the only error. */ -enum expand_error_t -{ - /** Error */ +/// These are the possible return values for expand_string. Note how zero value is the only error. +enum expand_error_t { + /// Error EXPAND_ERROR, - /** Ok */ + /// Ok EXPAND_OK, - /** Ok, a wildcard in the string matched no files */ + /// Ok, a wildcard in the string matched no files. EXPAND_WILDCARD_NO_MATCH, - /* Ok, a wildcard in the string matched a file */ + /// Ok, a wildcard in the string matched a file. EXPAND_WILDCARD_MATCH }; -/** Character for separating two array elements. We use 30, i.e. the ascii record separator since that seems logical. */ +/// Character for separating two array elements. We use 30, i.e. the ascii record separator since +/// that seems logical. #define ARRAY_SEP ((wchar_t)(0x1e)) -/** String containing the character for separating two array elements */ +/// String containing the character for separating two array elements. #define ARRAY_SEP_STR L"\x1e" -/** - Error issued on array out of bounds -*/ +/// Error issued on array out of bounds. #define ARRAY_BOUNDS_ERR _(L"Array index out of bounds") -/** - Perform various forms of expansion on in, such as tilde expansion - (\~USER becomes the users home directory), variable expansion - (\$VAR_NAME becomes the value of the environment variable VAR_NAME), - cmdsubst expansion and wildcard expansion. The results are inserted - into the list out. - - If the parameter does not need expansion, it is copied into the list - out. - - \param input The parameter to expand - \param output The list to which the result will be appended. - \param flag Specifies if any expansion pass should be skipped. Legal values are any combination of EXPAND_SKIP_CMDSUBST EXPAND_SKIP_VARIABLES and EXPAND_SKIP_WILDCARDS - \param errors Resulting errors, or NULL to ignore - \return One of EXPAND_OK, EXPAND_ERROR, EXPAND_WILDCARD_MATCH and EXPAND_WILDCARD_NO_MATCH. EXPAND_WILDCARD_NO_MATCH and EXPAND_WILDCARD_MATCH are normal exit conditions used only on strings containing wildcards to tell if the wildcard produced any matches. -*/ -__warn_unused expand_error_t expand_string(const wcstring &input, std::vector<completion_t> *output, expand_flags_t flags, parse_error_list_t *errors); - - -/** - expand_one is identical to expand_string, except it will fail if in - expands to more than one string. This is used for expanding command - names. - - \param inout_str The parameter to expand in-place - \param flag Specifies if any expansion pass should be skipped. Legal values are any combination of EXPAND_SKIP_CMDSUBST EXPAND_SKIP_VARIABLES and EXPAND_SKIP_WILDCARDS - \param errors Resulting errors, or NULL to ignore - \return Whether expansion succeded -*/ +/// Perform various forms of expansion on in, such as tilde expansion (\~USER becomes the users home +/// directory), variable expansion (\$VAR_NAME becomes the value of the environment variable +/// VAR_NAME), cmdsubst expansion and wildcard expansion. The results are inserted into the list +/// out. +/// +/// If the parameter does not need expansion, it is copied into the list out. +/// +/// \param input The parameter to expand +/// \param output The list to which the result will be appended. +/// \param flag Specifies if any expansion pass should be skipped. Legal values are any combination +/// of EXPAND_SKIP_CMDSUBST EXPAND_SKIP_VARIABLES and EXPAND_SKIP_WILDCARDS +/// \param errors Resulting errors, or NULL to ignore +/// +/// \return One of EXPAND_OK, EXPAND_ERROR, EXPAND_WILDCARD_MATCH and EXPAND_WILDCARD_NO_MATCH. +/// EXPAND_WILDCARD_NO_MATCH and EXPAND_WILDCARD_MATCH are normal exit conditions used only on +/// strings containing wildcards to tell if the wildcard produced any matches. +__warn_unused expand_error_t expand_string(const wcstring &input, std::vector<completion_t> *output, + expand_flags_t flags, parse_error_list_t *errors); + +/// expand_one is identical to expand_string, except it will fail if in expands to more than one +/// string. This is used for expanding command names. +/// +/// \param inout_str The parameter to expand in-place +/// \param flag Specifies if any expansion pass should be skipped. Legal values are any combination +/// of EXPAND_SKIP_CMDSUBST EXPAND_SKIP_VARIABLES and EXPAND_SKIP_WILDCARDS +/// \param errors Resulting errors, or NULL to ignore +/// +/// \return Whether expansion succeded bool expand_one(wcstring &inout_str, expand_flags_t flags, parse_error_list_t *errors = NULL); -/** - Convert the variable value to a human readable form, i.e. escape things, handle arrays, etc. Suitable for pretty-printing. The result must be free'd! - - \param in the value to escape -*/ +/// Convert the variable value to a human readable form, i.e. escape things, handle arrays, etc. +/// Suitable for pretty-printing. The result must be free'd! +/// +/// \param in the value to escape wcstring expand_escape_variable(const wcstring &in); -/** - Perform tilde expansion and nothing else on the specified string, which is modified in place. - - \param input the string to tilde expand -*/ +/// Perform tilde expansion and nothing else on the specified string, which is modified in place. +/// +/// \param input the string to tilde expand void expand_tilde(wcstring &input); -/** Perform the opposite of tilde expansion on the string, which is modified in place */ +/// Perform the opposite of tilde expansion on the string, which is modified in place. wcstring replace_home_directory_with_tilde(const wcstring &str); -/** - Testing function for getting all process names. -*/ +/// Testing function for getting all process names. std::vector<wcstring> expand_get_all_process_names(void); -/** Abbreviation support. Expand src as an abbreviation, returning true if one was found, false if not. If result is not-null, returns the abbreviation by reference. */ +/// Abbreviation support. Expand src as an abbreviation, returning true if one was found, false if +/// not. If result is not-null, returns the abbreviation by reference. #define USER_ABBREVIATIONS_VARIABLE_NAME L"fish_user_abbreviations" bool expand_abbreviation(const wcstring &src, wcstring *output); -/* Terrible hacks */ -bool fish_xdm_login_hack_hack_hack_hack(std::vector<std::string> *cmds, int argc, const char * const *argv); - +// Terrible hacks +bool fish_xdm_login_hack_hack_hack_hack(std::vector<std::string> *cmds, int argc, + const char *const *argv); #endif - - |