2016-04-29 11:10:27 +08:00
|
|
|
// 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.
|
2005-10-04 23:11:39 +08:00
|
|
|
#ifndef FISH_EXPAND_H
|
|
|
|
#define FISH_EXPAND_H
|
|
|
|
|
2016-04-21 14:00:54 +08:00
|
|
|
#include "config.h"
|
2015-07-25 23:14:25 +08:00
|
|
|
|
2016-04-29 11:10:27 +08:00
|
|
|
#include <stddef.h>
|
2017-02-14 12:37:27 +08:00
|
|
|
|
2018-10-16 14:36:40 +08:00
|
|
|
#include <map>
|
2016-04-21 14:00:54 +08:00
|
|
|
#include <string>
|
|
|
|
#include <vector>
|
2005-10-04 23:11:39 +08:00
|
|
|
|
2011-12-27 11:18:46 +08:00
|
|
|
#include "common.h"
|
2018-09-24 13:47:38 +08:00
|
|
|
#include "maybe.h"
|
2014-03-22 08:13:33 +08:00
|
|
|
#include "parse_constants.h"
|
2005-10-04 23:11:39 +08:00
|
|
|
|
2018-09-22 12:52:47 +08:00
|
|
|
class environment_t;
|
2017-08-06 06:08:39 +08:00
|
|
|
class env_var_t;
|
2018-09-11 13:29:52 +08:00
|
|
|
class environment_t;
|
2017-08-06 06:08:39 +08:00
|
|
|
|
2016-04-29 11:10:27 +08:00
|
|
|
enum {
|
|
|
|
/// Flag specifying that cmdsubst expansion should be skipped.
|
2012-02-25 04:13:35 +08:00
|
|
|
EXPAND_SKIP_CMDSUBST = 1 << 0,
|
2016-04-29 11:10:27 +08:00
|
|
|
/// Flag specifying that variable expansion should be skipped.
|
2012-02-25 04:13:35 +08:00
|
|
|
EXPAND_SKIP_VARIABLES = 1 << 1,
|
2016-04-29 11:10:27 +08:00
|
|
|
/// Flag specifying that wildcard expansion should be skipped.
|
2012-02-25 04:13:35 +08:00
|
|
|
EXPAND_SKIP_WILDCARDS = 1 << 2,
|
2016-04-29 11:10:27 +08:00
|
|
|
/// The expansion is being done for tab or auto completions. Returned completions may have the
|
|
|
|
/// wildcard as a prefix instead of a match.
|
2015-08-04 07:36:10 +08:00
|
|
|
EXPAND_FOR_COMPLETIONS = 1 << 3,
|
2017-04-09 12:05:18 +08:00
|
|
|
/// Only match files that are executable by the current user.
|
2012-02-25 04:13:35 +08:00
|
|
|
EXECUTABLES_ONLY = 1 << 4,
|
2017-04-09 12:05:18 +08:00
|
|
|
/// Only match directories.
|
2012-02-25 04:13:35 +08:00
|
|
|
DIRECTORIES_ONLY = 1 << 5,
|
2016-04-29 11:10:27 +08:00
|
|
|
/// Don't generate descriptions.
|
2012-06-30 07:40:54 +08:00
|
|
|
EXPAND_NO_DESCRIPTIONS = 1 << 6,
|
2016-04-29 11:10:27 +08:00
|
|
|
/// Don't expand jobs (but you can still expand processes). This is because
|
2016-06-06 09:46:04 +08:00
|
|
|
/// job expansion is not thread safe.
|
2014-10-16 03:42:55 +08:00
|
|
|
EXPAND_SKIP_JOBS = 1 << 7,
|
2016-04-29 11:10:27 +08:00
|
|
|
/// Don't expand home directories.
|
2014-10-16 03:42:55 +08:00
|
|
|
EXPAND_SKIP_HOME_DIRECTORIES = 1 << 8,
|
2016-04-29 11:10:27 +08:00
|
|
|
/// Allow fuzzy matching.
|
2015-10-04 06:44:57 +08:00
|
|
|
EXPAND_FUZZY_MATCH = 1 << 9,
|
2016-04-29 11:10:27 +08:00
|
|
|
/// Disallow directory abbreviations like /u/l/b for /usr/local/bin. Only applicable if
|
|
|
|
/// EXPAND_FUZZY_MATCH is set.
|
2016-02-07 06:39:47 +08:00
|
|
|
EXPAND_NO_FUZZY_DIRECTORIES = 1 << 10,
|
2016-04-29 11:10:27 +08:00
|
|
|
/// Do expansions specifically to support cd. This means using CDPATH as a list of potential
|
2018-11-04 04:30:55 +08:00
|
|
|
/// working directories, and to use logical instead of physical paths.
|
2016-04-08 06:24:52 +08:00
|
|
|
EXPAND_SPECIAL_FOR_CD = 1 << 11,
|
2018-01-09 05:36:20 +08:00
|
|
|
/// Do expansions specifically for cd autosuggestion. This is to differentiate between cd
|
|
|
|
/// completions and cd autosuggestions.
|
|
|
|
EXPAND_SPECIAL_FOR_CD_AUTOSUGGEST = 1 << 12,
|
2016-04-29 11:10:27 +08:00
|
|
|
/// Do expansions specifically to support external command completions. This means using PATH as
|
2016-06-06 09:46:04 +08:00
|
|
|
/// a list of potential working directories.
|
2018-01-09 05:36:20 +08:00
|
|
|
EXPAND_SPECIAL_FOR_COMMAND = 1 << 13
|
2012-02-25 04:13:35 +08:00
|
|
|
};
|
|
|
|
typedef int expand_flags_t;
|
2005-09-20 21:26:39 +08:00
|
|
|
|
2012-02-02 08:27:14 +08:00
|
|
|
class completion_t;
|
2012-01-17 00:56:47 +08:00
|
|
|
|
2016-04-29 11:10:27 +08:00
|
|
|
enum {
|
|
|
|
/// Character representing a home directory.
|
2016-01-22 11:56:39 +08:00
|
|
|
HOME_DIRECTORY = EXPAND_RESERVED_BASE,
|
2018-10-11 05:26:29 +08:00
|
|
|
/// Character representing process expansion for %self.
|
|
|
|
PROCESS_EXPAND_SELF,
|
2016-04-29 11:10:27 +08:00
|
|
|
/// Character representing variable expansion.
|
2012-11-19 08:30:30 +08:00
|
|
|
VARIABLE_EXPAND,
|
2016-04-29 11:10:27 +08:00
|
|
|
/// Character representing variable expansion into a single element.
|
2012-11-19 08:30:30 +08:00
|
|
|
VARIABLE_EXPAND_SINGLE,
|
2016-04-29 11:10:27 +08:00
|
|
|
/// Character representing the start of a bracket expansion.
|
2018-03-11 03:16:07 +08:00
|
|
|
BRACE_BEGIN,
|
2016-04-29 11:10:27 +08:00
|
|
|
/// Character representing the end of a bracket expansion.
|
2018-03-11 03:16:07 +08:00
|
|
|
BRACE_END,
|
2016-04-29 11:10:27 +08:00
|
|
|
/// Character representing separation between two bracket elements.
|
2018-03-11 03:16:07 +08:00
|
|
|
BRACE_SEP,
|
2018-03-12 11:02:43 +08:00
|
|
|
/// Character that takes the place of any whitespace within non-quoted text in braces
|
|
|
|
BRACE_SPACE,
|
2016-04-29 11:10:27 +08:00
|
|
|
/// Separate subtokens in a token with this character.
|
2012-11-19 08:30:30 +08:00
|
|
|
INTERNAL_SEPARATOR,
|
2016-04-29 11:10:27 +08:00
|
|
|
/// Character representing an empty variable expansion. Only used transitively while expanding
|
|
|
|
/// variables.
|
2014-08-21 12:19:08 +08:00
|
|
|
VARIABLE_EXPAND_EMPTY,
|
2016-04-29 11:10:27 +08:00
|
|
|
/// 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.
|
2016-01-22 11:56:39 +08:00
|
|
|
EXPAND_SENTINAL
|
|
|
|
};
|
2005-12-04 00:43:56 +08:00
|
|
|
|
2016-04-29 11:10:27 +08:00
|
|
|
/// These are the possible return values for expand_string. Note how zero value is the only error.
|
|
|
|
enum expand_error_t {
|
|
|
|
/// Error
|
2012-11-19 08:30:30 +08:00
|
|
|
EXPAND_ERROR,
|
2016-04-29 11:10:27 +08:00
|
|
|
/// Ok
|
2012-11-19 08:30:30 +08:00
|
|
|
EXPAND_OK,
|
2016-04-29 11:10:27 +08:00
|
|
|
/// Ok, a wildcard in the string matched no files.
|
2012-11-19 08:30:30 +08:00
|
|
|
EXPAND_WILDCARD_NO_MATCH,
|
2016-04-29 11:10:27 +08:00
|
|
|
/// Ok, a wildcard in the string matched a file.
|
2012-11-19 08:30:30 +08:00
|
|
|
EXPAND_WILDCARD_MATCH
|
2012-05-09 17:33:42 +08:00
|
|
|
};
|
2005-12-04 00:43:56 +08:00
|
|
|
|
2018-10-11 05:26:29 +08:00
|
|
|
/// The string represented by PROCESS_EXPAND_SELF
|
|
|
|
#define PROCESS_EXPAND_SELF_STR L"%self"
|
2019-03-15 06:12:14 +08:00
|
|
|
#define PROCESS_EXPAND_SELF_STR_LEN 5
|
2018-10-11 05:26:29 +08:00
|
|
|
|
2016-04-29 11:10:27 +08:00
|
|
|
/// 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.
|
2016-06-06 09:46:04 +08:00
|
|
|
/// \param flags Specifies if any expansion pass should be skipped. Legal values are any combination
|
2016-04-29 11:10:27 +08:00
|
|
|
/// of EXPAND_SKIP_CMDSUBST EXPAND_SKIP_VARIABLES and EXPAND_SKIP_WILDCARDS
|
2018-09-11 13:29:52 +08:00
|
|
|
/// \param vars variables used during expansion.
|
2016-04-29 11:10:27 +08:00
|
|
|
/// \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.
|
2018-10-11 08:38:38 +08:00
|
|
|
__warn_unused expand_error_t expand_string(wcstring input, std::vector<completion_t> *output,
|
2018-09-11 13:29:52 +08:00
|
|
|
expand_flags_t flags, const environment_t &vars,
|
|
|
|
parse_error_list_t *errors);
|
2016-04-29 11:10:27 +08:00
|
|
|
|
|
|
|
/// 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
|
2016-06-06 09:46:04 +08:00
|
|
|
/// \param flags Specifies if any expansion pass should be skipped. Legal values are any combination
|
2016-04-29 11:10:27 +08:00
|
|
|
/// of EXPAND_SKIP_CMDSUBST EXPAND_SKIP_VARIABLES and EXPAND_SKIP_WILDCARDS
|
|
|
|
/// \param errors Resulting errors, or NULL to ignore
|
|
|
|
///
|
|
|
|
/// \return Whether expansion succeded
|
2018-09-11 13:29:52 +08:00
|
|
|
bool expand_one(wcstring &inout_str, expand_flags_t flags, const environment_t &vars,
|
|
|
|
parse_error_list_t *errors = NULL);
|
2018-08-26 16:41:45 +08:00
|
|
|
|
|
|
|
/// Expand a command string like $HOME/bin/cmd into a command and list of arguments.
|
|
|
|
/// Return the command and arguments by reference.
|
|
|
|
/// If the expansion resulted in no or an empty command, the command will be an empty string. Note
|
|
|
|
/// that API does not distinguish between expansion resulting in an empty command (''), and
|
|
|
|
/// expansion resulting in no command (e.g. unset variable).
|
|
|
|
// \return an expand error.
|
2018-09-11 13:29:52 +08:00
|
|
|
expand_error_t expand_to_command_and_args(const wcstring &instr, const environment_t &vars,
|
|
|
|
wcstring *out_cmd, wcstring_list_t *out_args,
|
2018-08-26 16:41:45 +08:00
|
|
|
parse_error_list_t *errors = NULL);
|
2005-09-20 21:26:39 +08:00
|
|
|
|
2016-04-29 11:10:27 +08:00
|
|
|
/// Convert the variable value to a human readable form, i.e. escape things, handle arrays, etc.
|
2017-08-06 12:40:27 +08:00
|
|
|
/// Suitable for pretty-printing.
|
|
|
|
wcstring expand_escape_variable(const env_var_t &var);
|
2005-09-20 21:26:39 +08:00
|
|
|
|
2016-04-29 11:10:27 +08:00
|
|
|
/// Perform tilde expansion and nothing else on the specified string, which is modified in place.
|
|
|
|
///
|
|
|
|
/// \param input the string to tilde expand
|
2018-09-22 12:52:47 +08:00
|
|
|
void expand_tilde(wcstring &input, const environment_t &vars);
|
2005-09-20 21:26:39 +08:00
|
|
|
|
2016-04-29 11:10:27 +08:00
|
|
|
/// Perform the opposite of tilde expansion on the string, which is modified in place.
|
2018-09-22 12:52:47 +08:00
|
|
|
wcstring replace_home_directory_with_tilde(const wcstring &str, const environment_t &vars);
|
2013-12-17 07:33:20 +08:00
|
|
|
|
2018-09-24 13:47:38 +08:00
|
|
|
/// Abbreviation support. Expand src as an abbreviation, returning the expanded form if found,
|
|
|
|
/// none() if not.
|
2018-09-25 12:17:05 +08:00
|
|
|
maybe_t<wcstring> expand_abbreviation(const wcstring &src, const environment_t &vars);
|
2013-07-17 15:38:04 +08:00
|
|
|
|
2018-10-16 14:36:40 +08:00
|
|
|
/// \return a snapshot of all abbreviations as a map abbreviation->expansion.
|
2019-04-17 13:27:01 +08:00
|
|
|
std::map<wcstring, wcstring> get_abbreviations(const environment_t &vars);
|
2018-10-16 14:36:40 +08:00
|
|
|
|
2016-04-29 11:10:27 +08:00
|
|
|
// Terrible hacks
|
|
|
|
bool fish_xdm_login_hack_hack_hack_hack(std::vector<std::string> *cmds, int argc,
|
|
|
|
const char *const *argv);
|
2005-10-04 23:11:39 +08:00
|
|
|
#endif
|