diff options
Diffstat (limited to 'expand.h')
-rw-r--r-- | expand.h | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/expand.h b/expand.h new file mode 100644 index 00000000..51938948 --- /dev/null +++ b/expand.h @@ -0,0 +1,170 @@ +/**\file expand.h + + Prototypes for string expantion functions. These functions perform + several kinds of parameter expantion. 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. + +*/ + +/** + Flag specifying that subshell expantion should be skipped +*/ +#define EXPAND_SKIP_SUBSHELL 1 + +/** + Flag specifying that variable expantion should be skipped +*/ +#define EXPAND_SKIP_VARIABLES 2 + +/** + Flag specifying that wildcard expantion should be skipped +*/ +#define EXPAND_SKIP_WILDCARDS 4 + +/** + Incomplete matches in the last segment are ok (for tab + completion). An incomplete match is a wildcard that matches a + prefix of the filename. If accept_incomplete is true, only the + remainder of the string is returned. +*/ +#define ACCEPT_INCOMPLETE 8 + +/** + Only match files that are executable by the current user. Only applicable together with ACCEPT_INCOMPLETE. +*/ + +#define EXECUTABLES_ONLY 16 + +/** + Only match directories. Only applicable together with ACCEPT_INCOMPLETE. +*/ + +#define DIRECTORIES_ONLY 32 + +/** Character represeting a home directory */ +#define HOME_DIRECTORY 0xfffffffc + +/** Character represeting process expantion */ +#define PROCESS_EXPAND 0xfffffffb + +/** Character representing variable expantion */ +#define VARIABLE_EXPAND 0xfffffffa + +/** Character representing the start of a bracket expantion */ +#define BRACKET_BEGIN 0xfffffff9 + +/** Character representing the end of a bracket expantion */ +#define BRACKET_END 0xfffffff8 + +/** Character representing separation between two bracket elements */ +#define BRACKET_SEP 0xfffffff7 + +/** Character for separating two array elements. We use 30, i.e. the ascii record separator since that seems logical. */ +#define ARRAY_SEP 0x1e + +/** String containing the character for separating two array elements */ +#define ARRAY_SEP_STR L"\x1e" + +/** + Separate subtokens in a token with this character. +*/ +#define INTERNAL_SEPARATOR 0xfffffff0 + + + +/** + 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), + subshell expantion 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. If expansion is performed, the original parameter is freed and + newly allocated strings are inserted into the list out. + + \param in The parameter to expand + \param flag Specifies if any expantion pass should be skipped. Legal values are any combination of EXPAND_SKIP_SUBSHELL EXPAND_SKIP_VARIABLES and EXPAND_SKIP_WILDCARDS + \param out The list to which the result will be appended. +*/ +int expand_string( wchar_t *in, array_list_t *out, int flag ); + +/** + 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 in The parameter to expand + \param flag Specifies if any expantion pass should be skipped. Legal values are any combination of EXPAND_SKIP_SUBSHELL EXPAND_SKIP_VARIABLES and EXPAND_SKIP_WILDCARDS + \return The expanded parameter, or 0 on failiure +*/ +wchar_t *expand_one( wchar_t *in, int flag ); + +/** + Replace special characters with escape sequences. Newline is + replaced with \n, etc. + + \param in The string to be escaped + \param escape_all Whether all characters wich hold special meaning in fish (Pipe, semicolon, etc,) should be escaped, or only unprintable characters + \return The escaped string, or 0 if there is not enough memory +*/ +wchar_t *expand_escape( wchar_t *in, int escape_all ); + +/** + Convert the variable value to a human readable form, i.e. escape things, handle arrays, etc. Suitable for pretty-printing. +*/ +wchar_t *expand_escape_variable( const wchar_t *in ); + + +/** + Perform tilde expantion and nothing else on the specified string. + + If tilde expantion is needed, the original string is freed and a + new string, allocated using malloc, is returned. +*/ +wchar_t *expand_tilde(wchar_t *in); + +/** + Locate the last subshell in the specified string. + + \param in the string to search for subshells + \param begin the starting paranthesis of the subshell + \param end the ending paranthesis of the subshell + \param flags set this variable to ACCEPT_INCOMPLETE if in tab_completion mode + \return -1 on syntax error, 0 if no subshells exist and 1 on sucess +*/ +int expand_locate_subshell( wchar_t *in, + wchar_t **begin, + wchar_t **end, + int flags ); + + +/** + Expand backslashed escapes and substitute them with their unescaped + counterparts. Also optionally change the wildcards, the tilde + character and a few more into constants which are defined to be + outside of the valid character space, but still inside the valid + space for a wchar_t. This assumes that a wchar_t is at least 32 + bits long AND that the characterset is UCS4 or some other 31-bit + character set. + + Since removing the escape sequences can never lengthen the string, + the specified string is modified instead of allocating a new one. + +*/ +wchar_t *expand_backslash( wchar_t * in, int escape_special ); + + +/** + Tokenize the specified string into the specified array_list_t. + Each new element is allocated using malloc and must be freed by the + caller. + + \param val the input string. The contents of this string is not changed. + \param out the list in which to place the elements. +*/ +void expand_variable_array( const wchar_t *val, array_list_t *out ); + |