/** \file parser.h The fish parser. */ #ifndef FISH_PARSER_H #define FISH_PARSER_H #include #include "proc.h" #include "util.h" #include "parser.h" #include "event.h" #define PARSER_TEST_ERROR 1 #define PARSER_TEST_INCOMPLETE 2 /** event_block_t represents a block on events of the specified type */ typedef struct event_block { /** The types of events to block. This is interpreted as a bitset whete the value is 1 for every bit corresponding to a blocked event type. For example, if EVENT_VARIABLE type events should be blocked, (type & 1< &output ); /** Sets the current evaluation error. This function should only be used by libraries that are called by \param ec The new error code \param p The character offset at which the error occured \param str The printf-style error message filter */ void error( int ec, int p, const wchar_t *str, ... ); /** Returns a string describing the current parser pisition in the format 'FILENAME (line LINE_NUMBER): LINE'. Example: init.fish (line 127): ls|grep pancake */ const wchar_t *parser_current_line(); /** Returns the current line number */ int parser_get_lineno(); /** Returns the current position in the latest string of the tokenizer. */ int parser_get_pos(); /** Returns the position where the current job started in the latest string of the tokenizer. */ int parser_get_job_pos(); /** Set the current position in the latest string of the tokenizer. */ void parser_set_pos( int p); /** Get the string currently parsed */ const wchar_t *parser_get_buffer(); /** Create block of specified type */ void parser_push_block( int type); /** Remove the outermost block namespace */ void parser_pop_block(); /** Return a description of the given blocktype */ const wchar_t *parser_get_block_desc( int block ); /** Test if the specified string can be parsed, or if more bytes need to be read first. The result will have the PARSER_TEST_ERROR bit set if there is a syntax error in the code, and the PARSER_TEST_INCOMPLETE bit set if the code contains unclosed blocks. \param buff the text buffer to test \param block_level if non-null, the block nesting level will be filled out into this array \param out if non-null, any errors in the command will be filled out into this buffer \param prefix the prefix string to prepend to each error message written to the \c out buffer */ int parser_test( const wchar_t * buff, int *block_level, string_buffer_t *out, const wchar_t *prefix ); /** Test if the specified string can be parsed as an argument list, e.g. sent to eval_args. The result has the first bit set if the string contains errors, and the second bit is set if the string contains an unclosed block. */ int parser_test_args( const wchar_t * buff, string_buffer_t *out, const wchar_t *prefix ); /** Tell the parser that the specified function may not be run if not inside of a conditional block. This is to remove some possibilities of infinite recursion. */ void parser_forbid_function( wchar_t *function ); /** Undo last call to parser_forbid_function(). */ void parser_allow_function(); /** Initialize static parser data */ void parser_init(); /** Destroy static parser data */ void parser_destroy(); /** This function 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. */ int parser_is_help( wchar_t *s, int min_match ); /** Returns the file currently evaluated by the parser. This can be different than reader_current_filename, e.g. if we are evaulating a function defined in a different file than the one curently read. */ const wchar_t *parser_current_filename(); /** Write a stack trace starting at the specified block to the specified string_buffer_t */ void parser_stack_trace( block_t *b, string_buffer_t *buff); int parser_get_block_type( const wchar_t *cmd ); const wchar_t *parser_get_block_command( int type ); #endif