mirror of
https://github.com/fish-shell/fish-shell
synced 2025-01-13 21:44:16 +00:00
restyle expand module to match project style
Reduces lint errors from 183 to 126 (-31%). Line count from 2231 to 1787 (-20%). Another step in resolving issue #2902.
This commit is contained in:
parent
d93bbfd486
commit
ffad7b0b29
2 changed files with 770 additions and 1214 deletions
1790
src/expand.cpp
1790
src/expand.cpp
File diff suppressed because it is too large
Load diff
194
src/expand.h
194
src/expand.h
|
@ -1,175 +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
|
||||
#define FISH_EXPAND_H
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <stddef.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#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.
|
||||
/// 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);
|
||||
|
||||
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
|
||||
*/
|
||||
/// 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
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue