aboutsummaryrefslogtreecommitdiffhomepage
path: root/expand.h
diff options
context:
space:
mode:
Diffstat (limited to 'expand.h')
-rw-r--r--expand.h170
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 );
+