2005-09-20 23:26:39 +10:00
/**\file expand.h
2005-12-08 01:57:17 +10:00
Prototypes for string expansion functions . These functions perform
several kinds of parameter expansion . There are a lot of issues
2005-09-20 23:26:39 +10:00
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 .
2012-11-18 11:23:22 +01:00
2005-09-20 23:26:39 +10:00
*/
2005-10-05 01:11:39 +10:00
# ifndef FISH_EXPAND_H
2005-10-25 01:26:25 +10:00
/**
Header guard
*/
2005-10-05 01:11:39 +10:00
# define FISH_EXPAND_H
# include <wchar.h>
# include "util.h"
2011-12-26 19:18:46 -08:00
# include "common.h"
# include <list>
2005-10-05 01:11:39 +10:00
2012-11-18 16:30:30 -08:00
enum
{
2012-02-24 12:13:35 -08:00
/** Flag specifying that cmdsubst expansion should be skipped */
EXPAND_SKIP_CMDSUBST = 1 < < 0 ,
2012-11-18 11:23:22 +01:00
2012-02-24 12:13:35 -08:00
/** Flag specifying that variable expansion should be skipped */
EXPAND_SKIP_VARIABLES = 1 < < 1 ,
2012-11-18 11:23:22 +01:00
2012-02-24 12:13:35 -08:00
/** Flag specifying that wildcard expansion should be skipped */
EXPAND_SKIP_WILDCARDS = 1 < < 2 ,
/**
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 .
2012-11-18 11:23:22 +01:00
*/
2012-02-24 12:13:35 -08:00
ACCEPT_INCOMPLETE = 1 < < 3 ,
/** Only match files that are executable by the current user. Only applicable together with ACCEPT_INCOMPLETE. */
EXECUTABLES_ONLY = 1 < < 4 ,
2012-11-18 11:23:22 +01:00
2012-02-24 12:13:35 -08:00
/** Only match directories. Only applicable together with ACCEPT_INCOMPLETE. */
DIRECTORIES_ONLY = 1 < < 5 ,
2012-11-18 11:23:22 +01:00
2012-02-24 12:13:35 -08:00
/** Don't generate descriptions */
2012-06-29 16:40:54 -07:00
EXPAND_NO_DESCRIPTIONS = 1 < < 6 ,
2012-11-18 11:23:22 +01:00
2012-06-29 16:40:54 -07:00
/** Don't do process expansion */
2012-08-07 00:01:48 -07:00
EXPAND_SKIP_PROCESS = 1 < < 7 ,
2012-11-18 11:23:22 +01:00
2012-08-07 00:01:48 -07:00
/** Don't expand jobs (but you can still expand processes). This is because job expansion is not thread safe. */
2013-01-12 12:53:40 -08:00
EXPAND_SKIP_JOBS = 1 < < 8 ,
2013-01-12 12:55:23 -08:00
2013-01-12 12:53:40 -08:00
/** Don't expand home directories */
2013-05-25 15:41:18 -07:00
EXPAND_SKIP_HOME_DIRECTORIES = 1 < < 9 ,
2013-06-02 01:14:26 -07:00
2013-05-25 15:41:18 -07:00
/** Allow fuzzy matching */
EXPAND_FUZZY_MATCH = 1 < < 10
2012-02-24 12:13:35 -08:00
} ;
typedef int expand_flags_t ;
2005-09-20 23:26:39 +10:00
2005-10-25 01:26:25 +10:00
/**
2005-10-20 21:27:54 +10:00
Use unencoded private - use keycodes for internal characters
*/
# define EXPAND_RESERVED 0xf000
2008-02-05 09:09:05 +10:00
/**
End of range reserved for expand
*/
# define EXPAND_RESERVED_END 0xf000f
2005-09-20 23:26:39 +10:00
2012-02-01 16:27:14 -08:00
class completion_t ;
2012-01-16 22:26:47 +05:30
2005-10-20 21:27:54 +10:00
enum
{
2012-11-18 16:30:30 -08:00
/** Character represeting a home directory */
HOME_DIRECTORY = EXPAND_RESERVED ,
2012-11-18 11:23:22 +01:00
2012-11-18 16:30:30 -08:00
/** Character represeting process expansion */
PROCESS_EXPAND ,
2005-09-20 23:26:39 +10:00
2012-11-18 16:30:30 -08:00
/** Character representing variable expansion */
VARIABLE_EXPAND ,
2005-09-20 23:26:39 +10:00
2012-11-18 16:30:30 -08:00
/** Character rpresenting variable expansion into a single element*/
VARIABLE_EXPAND_SINGLE ,
2005-11-03 02:49:13 +10:00
2012-11-18 16:30:30 -08:00
/** Character representing the start of a bracket expansion */
BRACKET_BEGIN ,
2005-09-20 23:26:39 +10:00
2012-11-18 16:30:30 -08:00
/** Character representing the end of a bracket expansion */
BRACKET_END ,
2005-09-20 23:26:39 +10:00
2012-11-18 16:30:30 -08:00
/** Character representing separation between two bracket elements */
BRACKET_SEP ,
/**
Separate subtokens in a token with this character .
*/
INTERNAL_SEPARATOR ,
2005-12-08 00:43:07 +10:00
2005-10-20 21:27:54 +10:00
}
2012-11-18 16:30:30 -08:00
;
2005-09-20 23:26:39 +10:00
2005-12-04 02:43:56 +10:00
/**
These are the possible return values for expand_string
*/
enum
{
2012-11-18 16:30:30 -08:00
/** Error */
EXPAND_ERROR ,
/** Ok */
EXPAND_OK ,
/** Ok, a wildcard in the string matched no files */
EXPAND_WILDCARD_NO_MATCH ,
/* Ok, a wildcard in the string matched a file */
EXPAND_WILDCARD_MATCH
2012-05-09 02:33:42 -07:00
} ;
2005-12-04 02:43:56 +10:00
2005-09-20 23:26:39 +10:00
/** Character for separating two array elements. We use 30, i.e. the ascii record separator since that seems logical. */
2012-12-19 13:31:06 -08:00
# define ARRAY_SEP ((wchar_t)(0x1e))
2005-09-20 23:26:39 +10:00
/** String containing the character for separating two array elements */
# define ARRAY_SEP_STR L"\x1e"
2006-06-20 10:50:10 +10:00
/**
Error issued on array out of bounds
*/
2006-06-05 06:14:51 +10:00
# define ARRAY_BOUNDS_ERR _(L"Array index out of bounds")
2005-09-20 23:26:39 +10:00
2012-01-22 20:47:13 -08:00
class parser_t ;
2005-09-20 23:26:39 +10:00
/**
Perform various forms of expansion on in , such as tilde expansion
2006-06-15 20:37:06 +10:00
( \ ~ USER becomes the users home directory ) , variable expansion
( \ $ VAR_NAME becomes the value of the environment variable VAR_NAME ) ,
2006-08-23 00:38:31 +10:00
cmdsubst expansion and wildcard expansion . The results are inserted
2005-09-20 23:26:39 +10:00
into the list out .
2012-11-18 11:23:22 +01:00
2005-09-20 23:26:39 +10:00
If the parameter does not need expansion , it is copied into the list
2012-05-09 02:33:42 -07:00
out .
2006-06-15 20:37:06 +10:00
2012-02-05 16:42:24 -08:00
\ param input The parameter to expand
\ param output The list to which the result will be appended .
2006-08-23 00:38:31 +10:00
\ 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
2006-06-15 20:37:06 +10:00
\ 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 .
2005-09-20 23:26:39 +10:00
*/
2012-11-18 16:30:30 -08:00
__warn_unused int expand_string ( const wcstring & input , std : : vector < completion_t > & output , expand_flags_t flags ) ;
2005-09-20 23:26:39 +10:00
2011-12-26 22:51:34 -08:00
2005-09-20 23:26:39 +10: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 .
2012-11-18 11:23:22 +01:00
2012-01-31 21:30:09 -08:00
\ param inout_str The parameter to expand in - place
2006-08-23 00:38:31 +10:00
\ 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
2012-01-31 21:30:09 -08:00
\ return Whether expansion succeded
2005-09-20 23:26:39 +10:00
*/
2012-11-18 16:30:30 -08:00
bool expand_one ( wcstring & inout_str , expand_flags_t flags ) ;
2005-09-20 23:26:39 +10:00
/**
2012-01-14 02:42:17 -08:00
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 !
2006-06-15 20:37:06 +10:00
\ param in the value to escape
2005-09-20 23:26:39 +10:00
*/
2012-11-18 16:30:30 -08:00
wcstring expand_escape_variable ( const wcstring & in ) ;
2005-09-20 23:26:39 +10:00
/**
2011-12-26 19:18:46 -08:00
Perform tilde expansion and nothing else on the specified string , which is modified in place .
2006-06-15 20:37:06 +10:00
2011-12-26 19:18:46 -08:00
\ param input the string to tilde expand
2005-09-20 23:26:39 +10:00
*/
2011-12-26 19:18:46 -08:00
void expand_tilde ( wcstring & input ) ;
2005-09-20 23:26:39 +10:00
2006-05-22 08:16:04 +10:00
/**
Test if the specified argument is clean , i . e . it does not contain
any tokens which need to be expanded or otherwise altered . Clean
strings can be passed through expand_string and expand_one without
changing them . About two thirds of all strings are clean , so
skipping expansion on them actually does save a small amount of
time , since it avoids multiple memory allocations during the
expansion process .
2006-06-15 20:37:06 +10:00
\ param in the string to test
2006-05-22 08:16:04 +10:00
*/
2012-11-18 16:30:30 -08:00
int expand_is_clean ( const wchar_t * in ) ;
2006-05-22 08:16:04 +10:00
2006-07-20 23:02:46 +10:00
/**
Perform error reporting for a syntax error related to the variable
expansion beginning at the specified character of the specified
token . This function will call the error function with an
explanatory string about what is wrong with the specified token .
\ param token The token containing the error
\ param token_pos The position where the expansion begins
\ param error_pos The position on the line to report to the error function .
*/
2012-11-18 16:30:30 -08:00
void expand_variable_error ( parser_t & parser , const wchar_t * token , size_t token_pos , int error_pos ) ;
2006-07-20 23:02:46 +10:00
2012-07-16 12:05:36 -07:00
/**
Testing function for getting all process names .
*/
std : : vector < wcstring > expand_get_all_process_names ( void ) ;
2006-07-20 23:02:46 +10:00
2013-07-17 00:38:04 -07:00
/** 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 ) ;
2013-01-04 13:09:01 -08:00
/* Terrible hacks */
bool fish_xdm_login_hack_hack_hack_hack ( std : : vector < std : : string > * cmds , int argc , const char * const * argv ) ;
bool fish_openSUSE_dbus_hack_hack_hack_hack ( std : : vector < completion_t > * args ) ;
2005-10-05 01:11:39 +10:00
# endif
2013-01-04 13:09:01 -08:00