--- parser3/src/main/pa_string.C 2020/10/10 06:08:37 1.263 +++ parser3/src/main/pa_string.C 2023/09/26 20:49:10 1.269 @@ -1,8 +1,8 @@ /** @file Parser: string class. @see untalength_t.C. - Copyright (c) 2001-2017 Art. Lebedev Studio (http://www.artlebedev.com) - Author: Alexandr Petrosian (http://paf.design.ru) + Copyright (c) 2001-2023 Art. Lebedev Studio (http://www.artlebedev.com) + Authors: Konstantin Morshnev , Alexandr Petrosian */ #include "pa_string.h" @@ -12,7 +12,7 @@ #include "pa_charset.h" #include "pa_vregex.h" -volatile const char * IDENT_PA_STRING_C="$Id: pa_string.C,v 1.263 2020/10/10 06:08:37 moko Exp $" IDENT_PA_STRING_H; +volatile const char * IDENT_PA_STRING_C="$Id: pa_string.C,v 1.269 2023/09/26 20:49:10 moko Exp $" IDENT_PA_STRING_H; const String String::Empty; @@ -92,14 +92,14 @@ unsigned int pa_atoui(const char *str, i return pa_ato_any(str, base, problem_source, UINT_MAX); } -unsigned long long pa_atoul(const char *str, int base, const String* problem_source){ +uint64_t pa_atoul(const char *str, int base, const String* problem_source){ if(!str) return 0; - return pa_ato_any(str, base, problem_source, ULLONG_MAX); + return pa_ato_any(str, base, problem_source, ULLONG_MAX); } -int pa_atoi(const char* str, const String* problem_source) { +int pa_atoi(const char* str, int base, const String* problem_source) { if(!str) return 0; @@ -117,7 +117,7 @@ int pa_atoi(const char* str, const Strin str++; } - unsigned int result=pa_atoui(str, 0, problem_source); + unsigned int result=pa_atoui(str, base, problem_source); if(negative && result <= ((unsigned int)(-(1+INT_MIN)))+1) return -(int)result; @@ -661,6 +661,7 @@ Table* String::match(VRegex* vregex, Row int prestart=0; int poststart=0; int postfinish=length(); + int action_was_executed=-1; while(true) { int exec_result=vregex->exec(subject, subject_length, ovector, ovector_size, prestart); @@ -670,8 +671,9 @@ Table* String::match(VRegex* vregex, Row int prefinish=ovector[0]; poststart=ovector[1]; - if (prestart==poststart && subject[poststart]=='\n'){ + if (prestart==poststart && action_was_executed==1){ prestart++; + action_was_executed=0; continue; } @@ -692,12 +694,13 @@ Table* String::match(VRegex* vregex, Row } matches_count++; - row_action(table, row, prestart, prefinish, poststart, postfinish, info); + row_action(table, row, prestart - !action_was_executed, prefinish, poststart, postfinish, info); - if(!global || prestart==poststart) // last step + if(!global || poststart>=subject_length) // last step, avoid prestart++ after last char break; prestart=poststart; + action_was_executed=1; } row_action(table, 0/*last time, no raw*/, 0, 0, poststart, postfinish, info);