Fix 0 being condsidered as comment

This commit is contained in:
zawz 2020-10-21 15:31:54 +02:00
parent 6350e1cfef
commit 8c85658297
2 changed files with 21 additions and 17 deletions

View file

@ -1,4 +1,4 @@
#ifndef PARSE_HPP
#ifndef PARSE_HPP
#define PARSE_HPP
#include "struc.hpp"
@ -7,6 +7,16 @@
#include <ztd/filedat.hpp>
#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);

View file

@ -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<std::string> reserved_words = { "if", "then", "else", "fi", "case", "esac", "for", "while", "until", "do", "done", "{", "}" };
std::string g_expecting;
@ -263,6 +257,8 @@ std::pair<arg*, uint32_t> 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<pipeline*, uint32_t> 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<condlist*, uint32_t> 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<condlist*, uint32_t> parse_condlist(const char* in, uint32_t size, uin
i += 2;
optype=OR_OP;
}
else if(i<size-1) // bad combination
throw ztd::format_error( strf("Unexpected token: '%c%c'", in[i], in[i+1]), g_origin, in, i);
else // unknown
throw ztd::format_error("Unknown error", g_origin, in, i);
else
throw ztd::format_error( strf("Unexpected token: '%c'", in[i]), g_origin, in, i);
i = skip_unread(in, size, i);
if(i>=size)
throw ztd::format_error( "Unexpected end of file", g_origin, in, i );
@ -660,7 +654,7 @@ std::pair<case_block*, uint32_t> parse_case(const char* in, uint32_t size, uint3
i=skip_unread(in, size, i+2);
// parse all cases
while(i<size && !word_eq("esac", in, size, i, " \t\n;()&") )
while(i<size && !word_eq("esac", in, size, i, ARG_END) )
{
// add one element
ret->cases.push_back( std::pair<arglist_t, list_t>() );
@ -919,7 +913,7 @@ std::pair<block*, uint32_t> parse_fct_or_cmd(const char* in, uint32_t size, uint
// detect if brace, subshell, case or other
std::pair<block*, uint32_t> 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