2006-01-31 00:51:50 +08:00
/** \file parse_util.h
2006-02-19 09:54:38 +08:00
Various mostly unrelated utility functions related to parsing ,
loading and evaluating fish code .
2006-01-31 00:51:50 +08:00
*/
# ifndef FISH_PARSE_UTIL_H
# define FISH_PARSE_UTIL_H
2015-07-25 23:14:25 +08:00
# include <stddef.h>
# include <vector>
2016-04-21 14:00:54 +08:00
# include <stdbool.h>
2015-07-25 23:14:25 +08:00
# include "common.h"
# include "parse_constants.h"
2016-04-21 14:00:54 +08:00
# include "tokenizer.h"
2012-01-24 03:42:41 +08:00
2006-01-31 00:51:50 +08:00
/**
2006-02-19 09:54:38 +08:00
Find the beginning and end of the first subshell in the specified string .
2012-11-18 18:23:22 +08:00
2006-01-31 00:51:50 +08:00
\ param in the string to search for subshells
\ param begin the starting paranthesis of the subshell
\ param end the ending paranthesis of the subshell
2013-07-17 16:35:30 +08:00
\ param accept_incomplete whether to permit missing closing parenthesis
2015-04-30 07:53:02 +08:00
\ return - 1 on syntax error , 0 if no subshells exist and 1 on success
2006-01-31 00:51:50 +08:00
*/
2012-11-19 08:30:30 +08:00
int parse_util_locate_cmdsubst ( const wchar_t * in ,
wchar_t * * begin ,
wchar_t * * end ,
2013-07-17 16:35:30 +08:00
bool accept_incomplete ) ;
2006-01-31 00:51:50 +08:00
2014-02-04 06:13:42 +08:00
/** Same as parse_util_locate_cmdsubst, but handles square brackets [ ] */
int parse_util_locate_slice ( const wchar_t * in ,
wchar_t * * begin ,
wchar_t * * end ,
bool accept_incomplete ) ;
2013-10-09 09:41:35 +08:00
/**
Alternative API . Iterate over command substitutions .
\ param str the string to search for subshells
\ param inout_cursor_offset On input , the location to begin the search . On output , either the end of the string , or just after the closed - paren .
\ param out_contents On output , the contents of the command substitution
\ param out_start On output , the offset of the start of the command substitution ( open paren )
\ param out_end On output , the offset of the end of the command substitution ( close paren ) , or the end of the string if it was incomplete
\ param accept_incomplete whether to permit missing closing parenthesis
2015-04-30 07:53:02 +08:00
\ return - 1 on syntax error , 0 if no subshells exist and 1 on success
2013-10-09 09:41:35 +08:00
*/
int parse_util_locate_cmdsubst_range ( const wcstring & str ,
2014-01-15 17:40:40 +08:00
size_t * inout_cursor_offset ,
wcstring * out_contents ,
size_t * out_start ,
size_t * out_end ,
bool accept_incomplete ) ;
2013-10-09 09:41:35 +08:00
2006-02-09 02:47:37 +08:00
/**
2006-07-03 18:46:47 +08:00
Find the beginning and end of the command substitution under the
cursor . If no subshell is found , the entire string is returned . If
the current command substitution is not ended , i . e . the closing
parenthesis is missing , then the string from the beginning of the
substitution to the end of the string is returned .
2006-02-19 09:54:38 +08:00
\ param buff the string to search for subshells
\ param cursor_pos the position of the cursor
\ param a the start of the searched string
\ param b the end of the searched string
2006-02-09 02:47:37 +08:00
*/
2012-11-19 08:30:30 +08:00
void parse_util_cmdsubst_extent ( const wchar_t * buff ,
size_t cursor_pos ,
const wchar_t * * a ,
const wchar_t * * b ) ;
2006-01-31 00:51:50 +08:00
2006-02-09 02:47:37 +08:00
/**
Find the beginning and end of the process definition under the cursor
2006-02-19 09:54:38 +08:00
\ param buff the string to search for subshells
\ param cursor_pos the position of the cursor
\ param a the start of the searched string
\ param b the end of the searched string
2006-02-09 02:47:37 +08:00
*/
2012-11-19 08:30:30 +08:00
void parse_util_process_extent ( const wchar_t * buff ,
size_t cursor_pos ,
const wchar_t * * a ,
const wchar_t * * b ) ;
2006-01-31 00:51:50 +08:00
2006-02-09 02:47:37 +08:00
/**
Find the beginning and end of the job definition under the cursor
2006-02-19 09:54:38 +08:00
\ param buff the string to search for subshells
\ param cursor_pos the position of the cursor
\ param a the start of the searched string
\ param b the end of the searched string
2006-02-09 02:47:37 +08:00
*/
2012-11-19 08:30:30 +08:00
void parse_util_job_extent ( const wchar_t * buff ,
size_t cursor_pos ,
const wchar_t * * a ,
const wchar_t * * b ) ;
2006-01-31 00:51:50 +08:00
2006-02-09 02:47:37 +08:00
/**
2006-06-20 08:50:10 +08:00
Find the beginning and end of the token under the cursor and the
2012-02-06 16:57:43 +08:00
token before the current token . Any combination of tok_begin ,
2006-06-20 08:50:10 +08:00
tok_end , prev_begin and prev_end may be null .
2006-02-19 09:54:38 +08:00
\ param buff the string to search for subshells
\ param cursor_pos the position of the cursor
2006-06-20 08:50:10 +08:00
\ param tok_begin the start of the current token
\ param tok_end the end of the current token
\ param prev_begin the start o the token before the current token
\ param prev_end the end of the token before the current token
2006-02-09 02:47:37 +08:00
*/
2012-11-19 08:30:30 +08:00
void parse_util_token_extent ( const wchar_t * buff ,
size_t cursor_pos ,
const wchar_t * * tok_begin ,
const wchar_t * * tok_end ,
const wchar_t * * prev_begin ,
const wchar_t * * prev_end ) ;
2006-01-31 00:51:50 +08:00
2006-02-09 02:47:37 +08:00
/**
Get the linenumber at the specified character offset
*/
2012-11-19 08:30:30 +08:00
int parse_util_lineno ( const wchar_t * str , size_t len ) ;
2006-02-05 21:10:35 +08:00
2007-09-21 22:05:49 +08:00
/**
Calculate the line number of the specified cursor position
*/
2012-11-19 08:30:30 +08:00
int parse_util_get_line_from_offset ( const wcstring & str , size_t pos ) ;
2007-09-21 22:05:49 +08:00
/**
Get the offset of the first character on the specified line
*/
2012-11-19 08:30:30 +08:00
size_t parse_util_get_offset_from_line ( const wcstring & str , int line ) ;
2007-09-21 22:05:49 +08:00
/**
Return the total offset of the buffer for the cursor position nearest to the specified poition
*/
2012-11-19 08:30:30 +08:00
size_t parse_util_get_offset ( const wcstring & str , int line , long line_offset ) ;
2007-09-21 22:05:49 +08:00
2006-02-19 09:14:32 +08:00
/**
2015-08-20 02:35:24 +08:00
Return the given string , unescaping wildcard characters but not performing
any other character transformation .
2006-02-19 09:14:32 +08:00
*/
2015-08-20 02:35:24 +08:00
wcstring parse_util_unescape_wildcards ( const wcstring & in ) ;
2006-02-19 09:14:32 +08:00
2014-03-19 05:42:38 +08:00
/**
Checks if the specified string is a help option .
\ param s the string to test
\ param min_match is the minimum number of characters that must match in a long style option , i . e . the longest common prefix between - - help and any other option . If less than 3 , 3 will be assumed .
*/
bool parse_util_argument_is_help ( const wchar_t * s , int min_match ) ;
2012-07-07 05:34:53 +08:00
/**
Calculates information on the parameter at the specified index .
\ param cmd The command to be analyzed
\ param pos An index in the string which is inside the parameter
\ param quote If not NULL , store the type of quote this parameter has , can be either ' , " or \\ 0, meaning the string is not quoted.
\ param offset If not NULL , get_param will store the offset to the beginning of the parameter .
2015-07-26 15:12:36 +08:00
\ param type If not NULL , get_param will store the token type .
2012-07-07 05:34:53 +08:00
*/
2015-07-26 15:12:36 +08:00
void parse_util_get_parameter_info ( const wcstring & cmd , const size_t pos , wchar_t * quote , size_t * offset , enum token_type * out_type ) ;
2012-07-07 05:34:53 +08:00
/**
Attempts to escape the string ' cmd ' using the given quote type , as determined by the quote character . The quote can be a single quote or double quote , or L ' \0 ' to indicate no quoting ( and thus escaping should be with backslashes ) .
*/
2012-11-19 08:30:30 +08:00
wcstring parse_util_escape_string_with_quote ( const wcstring & cmd , wchar_t quote ) ;
2007-04-22 17:50:26 +08:00
2013-12-09 05:41:12 +08:00
/** Given a string, parse it as fish code and then return the indents. The return value has the same size as the string */
std : : vector < int > parse_util_compute_indents ( const wcstring & src ) ;
2007-04-22 17:50:26 +08:00
2016-02-28 16:44:20 +08:00
/** Given a string, detect parse errors in it. If allow_incomplete is set, then if the string is incomplete (e.g. an unclosed quote), an error is not returned and the PARSER_TEST_INCOMPLETE bit is set in the return value. If allow_incomplete is not set, then incomplete strings result in an error. If out_tree is not NULL, the resulting tree is returned by reference. */
class parse_node_tree_t ;
parser_test_error_bits_t parse_util_detect_errors ( const wcstring & buff_src , parse_error_list_t * out_errors = NULL , bool allow_incomplete = true , parse_node_tree_t * out_tree = NULL ) ;
2013-12-16 08:05:37 +08:00
2014-03-18 23:51:23 +08:00
/**
Test if this argument contains any errors . Detected errors include syntax errors in command substitutions , improperly escaped characters and improper use of the variable expansion operator .
This does NOT currently detect unterminated quotes .
*/
2015-07-25 23:14:25 +08:00
class parse_node_t ;
2014-03-04 18:53:34 +08:00
parser_test_error_bits_t parse_util_detect_errors_in_argument ( const parse_node_t & node , const wcstring & arg_src , parse_error_list_t * out_errors = NULL ) ;
2015-04-30 07:53:02 +08:00
/* Given a string containing a variable expansion error, append an appropriate error to the errors list. The global_token_pos is the offset of the token in the larger source, and the dollar_pos is the offset of the offending dollar sign within the token. */
void parse_util_expand_variable_error ( const wcstring & token , size_t global_token_pos , size_t dollar_pos , parse_error_list_t * out_errors ) ;
2006-01-31 00:51:50 +08:00
# endif