From 8c856582970193917a1707f7419f1576708eb5ad Mon Sep 17 00:00:00 2001 From: zawz Date: Wed, 21 Oct 2020 15:31:54 +0200 Subject: [PATCH] Fix 0 being condsidered as comment --- include/parse.hpp | 12 +++++++++++- src/parse.cpp | 26 ++++++++++---------------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/include/parse.hpp b/include/parse.hpp index edfc9e2..f58aad9 100644 --- a/include/parse.hpp +++ b/include/parse.hpp @@ -1,4 +1,4 @@ -#ifndef PARSE_HPP + #ifndef PARSE_HPP #define PARSE_HPP #include "struc.hpp" @@ -7,6 +7,16 @@ #include +#define SPACES " \t" +#define SEPARATORS " \t\n" +#define ARG_END " \t\n;#()&|" +#define COMMAND_SEPARATOR "\n;" +#define CONTROL_END "#)" +#define PIPELINE_END "\n;#()&" +#define ARGLIST_END "\n;#()&|" +#define SPECIAL_TOKENS "\n;#()&|" +#define ALL_TOKENS "\n;#()&|{}" + extern std::string g_origin; std::string import_file(std::string const& path); diff --git a/src/parse.cpp b/src/parse.cpp index 6e106bc..99b9459 100644 --- a/src/parse.cpp +++ b/src/parse.cpp @@ -8,12 +8,6 @@ std::string g_origin; -const char* SPACES=" \t"; -const char* SEPARATORS=" \t\n"; -const char* ARG_END=" \t&|;\n#()"; -const char* SPECIAL_TOKENS="&|;\n#()"; -const char* ALL_TOKENS="&|;\n#(){}"; - const std::vector reserved_words = { "if", "then", "else", "fi", "case", "esac", "for", "while", "until", "do", "done", "{", "}" }; std::string g_expecting; @@ -263,6 +257,8 @@ std::pair parse_arg(const char* in, uint32_t size, uint32_t star ret->sa.push_back(new subarg_subshell(r.first)); j = i = r.second; } + else if( word_eq("$#", in, size, i) ) + i+=2; else i++; } @@ -343,9 +339,9 @@ std::pair parse_pipeline(const char* in, uint32_t size, uin auto pp=parse_block(in, size, i); ret->add(pp.first); i = skip_chars(in, size, pp.second, SPACES); - if( i>=size || is_in(in[i], "&;\n#)") || word_eq("||", in, size, i) ) + if( i>=size || is_in(in[i], PIPELINE_END) || word_eq("||", in, size, i) ) return std::make_pair(ret, i); - else if( in[i] != '|') + else if( in[i] != '|' ) throw ztd::format_error( strf("Unexpected token: '%c'", in[i] ), g_origin, in, i); i++; } @@ -374,11 +370,11 @@ std::pair parse_condlist(const char* in, uint32_t size, uin auto pp=parse_pipeline(in, size, i); ret->add(pp.first, optype); i = pp.second; - if(i>=size || is_in(in[i], ")#")) // end here exactly: used for control later + if(i>=size || is_in(in[i], CONTROL_END)) // end here exactly: used for control later { return std::make_pair(ret, i); } - else if(is_in(in[i], ";\n")) // end one char after: skip them for next parse + else if(is_in(in[i], COMMAND_SEPARATOR)) // end one char after: skip them for next parse { return std::make_pair(ret, i+1); } @@ -398,10 +394,8 @@ std::pair parse_condlist(const char* in, uint32_t size, uin i += 2; optype=OR_OP; } - else if(i=size) throw ztd::format_error( "Unexpected end of file", g_origin, in, i ); @@ -660,7 +654,7 @@ std::pair parse_case(const char* in, uint32_t size, uint3 i=skip_unread(in, size, i+2); // parse all cases - while(icases.push_back( std::pair() ); @@ -919,7 +913,7 @@ std::pair parse_fct_or_cmd(const char* in, uint32_t size, uint // detect if brace, subshell, case or other std::pair parse_block(const char* in, uint32_t size, uint32_t start) { - uint32_t i = skip_chars(in, size, start, " \n\t"); + uint32_t i = skip_chars(in, size, start, SEPARATORS); block* ret = nullptr; try