2005-09-20 21:26:39 +08:00
/**\file expand.h
2005-12-07 23:57:17 +08:00
Prototypes for string expansion functions . These functions perform
several kinds of parameter expansion . There are a lot of issues
2005-09-20 21:26:39 +08: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 .
2005-12-04 00:43:56 +08:00
2005-09-20 21:26:39 +08:00
*/
2005-10-04 23:11:39 +08:00
# ifndef FISH_EXPAND_H
2005-10-24 23:26:25 +08:00
/**
Header guard
*/
2005-10-04 23:11:39 +08:00
# define FISH_EXPAND_H
# include <wchar.h>
# include "util.h"
2005-09-20 21:26:39 +08:00
/**
2005-12-07 23:57:17 +08:00
Flag specifying that subshell expansion should be skipped
2005-09-20 21:26:39 +08:00
*/
# define EXPAND_SKIP_SUBSHELL 1
/**
2005-12-07 23:57:17 +08:00
Flag specifying that variable expansion should be skipped
2005-09-20 21:26:39 +08:00
*/
# define EXPAND_SKIP_VARIABLES 2
/**
2005-12-07 23:57:17 +08:00
Flag specifying that wildcard expansion should be skipped
2005-09-20 21:26:39 +08:00
*/
# 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
2005-10-24 23:26:25 +08:00
/**
2005-10-20 19:27:54 +08:00
Use unencoded private - use keycodes for internal characters
*/
# define EXPAND_RESERVED 0xf000
2005-09-20 21:26:39 +08:00
2005-10-20 19:27:54 +08:00
enum
{
/** Character represeting a home directory */
HOME_DIRECTORY = EXPAND_RESERVED ,
2005-09-20 21:26:39 +08:00
2005-12-07 23:57:17 +08:00
/** Character represeting process expansion */
2005-10-20 19:27:54 +08:00
PROCESS_EXPAND ,
2005-12-07 23:57:17 +08:00
/** Character representing variable expansion */
2005-10-20 19:27:54 +08:00
VARIABLE_EXPAND ,
2005-09-20 21:26:39 +08:00
2005-12-07 23:57:17 +08:00
/** Character rpresenting variable expansion into a single element*/
2005-11-03 00:49:13 +08:00
VARIABLE_EXPAND_SINGLE ,
2005-12-07 23:57:17 +08:00
/** Character representing the start of a bracket expansion */
2005-10-20 19:27:54 +08:00
BRACKET_BEGIN ,
2005-09-20 21:26:39 +08:00
2005-12-07 23:57:17 +08:00
/** Character representing the end of a bracket expansion */
2005-10-20 19:27:54 +08:00
BRACKET_END ,
2005-09-20 21:26:39 +08:00
2005-10-20 19:27:54 +08:00
/** Character representing separation between two bracket elements */
BRACKET_SEP ,
2005-12-07 22:43:07 +08:00
/**
Separate subtokens in a token with this character .
*/
INTERNAL_SEPARATOR ,
2005-10-20 19:27:54 +08:00
}
;
2005-09-20 21:26:39 +08:00
2005-12-04 00:43:56 +08:00
/**
These are the possible return values for expand_string
*/
enum
{
/** 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
}
;
2005-09-20 21:26:39 +08:00
/** 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"
2006-05-22 03:25:24 +08:00
/**
Error issued on invalid variable name
*/
# define COMPLETE_VAR_DESC _( L"The '$' character begins a variable name. The character '%lc', which directly followed a '$', is not allowed as a part of a variable name, and variable names may not be zero characters long. To learn more about variable expansion in fish, type 'help expand-variable'.")
/**
Error issued on invalid variable name
*/
# define COMPLETE_VAR_NULL_DESC _( L"The '$' begins a variable name. It was given at the end of an argument. Variable names may not be zero characters long. To learn more about variable expansion in fish, type 'help expand-variable'.")
/**
Error issued on invalid variable name
*/
# define COMPLETE_VAR_BRACKET_DESC _( L"Did you mean {$VARIABLE}? The '$' character begins a variable name. A bracket, which directly followed a '$', is not allowed as a part of a variable name, and variable names may not be zero characters long. To learn more about variable expansion in fish, type 'help expand-variable'." )
/**
Error issued on invalid variable name
*/
# define COMPLETE_VAR_PARAN_DESC _( L"Did you mean (COMMAND)? In fish, the '$' character is only used for accessing variables. To learn more about command substitution in fish, type 'help expand-command-substitution'.")
2006-06-05 04:14:51 +08:00
# define ARRAY_BOUNDS_ERR _(L"Array index out of bounds")
2005-09-20 21:26:39 +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 ) ,
2005-12-07 23:57:17 +08:00
subshell expansion and wildcard expansion . The results are inserted
2005-09-20 21:26:39 +08:00
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
2005-12-07 23:57:17 +08:00
\ param flag Specifies if any expansion pass should be skipped . Legal values are any combination of EXPAND_SKIP_SUBSHELL EXPAND_SKIP_VARIABLES and EXPAND_SKIP_WILDCARDS
2005-09-20 21:26:39 +08:00
\ param out The list to which the result will be appended .
2005-12-04 00:43:56 +08:00
\ return One of EXPAND_OK , EXPAND_ERROR , EXPAND_WILDCARD_MATCH and EXPAND_WILDCARD_NO_MATCH
2005-09-20 21:26:39 +08:00
*/
2006-02-09 23:50:20 +08:00
int expand_string ( void * context , wchar_t * in , array_list_t * out , int flag ) ;
2005-09-20 21:26:39 +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 in The parameter to expand
2005-12-07 23:57:17 +08:00
\ param flag Specifies if any expansion pass should be skipped . Legal values are any combination of EXPAND_SKIP_SUBSHELL EXPAND_SKIP_VARIABLES and EXPAND_SKIP_WILDCARDS
2005-09-20 21:26:39 +08:00
\ return The expanded parameter , or 0 on failiure
*/
2006-02-09 23:50:20 +08:00
wchar_t * expand_one ( void * context , wchar_t * in , int flag ) ;
2005-09-20 21:26:39 +08:00
/**
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 ) ;
/**
2005-12-07 23:57:17 +08:00
Perform tilde expansion and nothing else on the specified string .
2005-09-20 21:26:39 +08:00
2005-12-07 23:57:17 +08:00
If tilde expansion is needed , the original string is freed and a
2005-09-20 21:26:39 +08:00
new string , allocated using malloc , is returned .
*/
wchar_t * expand_tilde ( wchar_t * in ) ;
2006-05-22 06:16:04 +08: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 .
*/
int expand_is_clean ( const wchar_t * in ) ;
2005-10-04 23:11:39 +08:00
# endif