--- parser3/src/classes/table.C 2016/09/08 16:31:35 1.322 +++ parser3/src/classes/table.C 2016/09/21 15:14:39 1.331 @@ -22,7 +22,7 @@ #define USE_STRINGSTREAM #endif -volatile const char * IDENT_TABLE_C="$Id: table.C,v 1.322 2016/09/08 16:31:35 moko Exp $"; +volatile const char * IDENT_TABLE_C="$Id: table.C,v 1.331 2016/09/21 15:14:39 moko Exp $"; // class @@ -111,7 +111,7 @@ struct TableControlChars { if(Value* vseparator=options.get(PA_COLUMN_SEPARATOR_NAME)) { sseparator=&vseparator->as_string(); if(sseparator->length()!=1) - throw Exception(PARSER_RUNTIME, sseparator, "separator must be one character long"); + throw Exception(PARSER_RUNTIME, sseparator, "separator must be one byte character"); separator=sseparator->first_char(); separators[0]=separator; result++; @@ -121,9 +121,9 @@ struct TableControlChars { if(sencloser->is_empty()){ encloser=0; } else { - if(sencloser->length()!=1) - throw Exception(PARSER_RUNTIME, sencloser, "encloser must be one character long"); - encloser=sencloser->first_char(); + if(sencloser->length()!=1) + throw Exception(PARSER_RUNTIME, sencloser, "encloser must be empty or one byte character"); + encloser=sencloser->first_char(); } result++; } @@ -160,10 +160,12 @@ public: String *extract(char *pos){ String *result=new String; - // first: their langs - result->langs.append(result->body, langs, pos-base, strlen(pos)); - // next: letters themselves - result->body=Body(pos); + if(size_t len=strlen(pos)){ + // first: their langs + result->langs.append(result->body, langs, pos-base, len); + // next: letters themselves + result->body=Body(pos); + } return result; } }; @@ -171,15 +173,15 @@ public: inline lsplit_sresult lsplit(char* *string_ref, const char* delims, StringSplitHelper& helper) { lsplit_sresult result; if(char *pos=*string_ref) { - while(char* v=strpbrk(pos, delims)) { - if(helper.check_lang(v)){ - result.delim=*v; - *v=0; + while(pos=strpbrk(pos, delims)) { + if(helper.check_lang(pos)){ + result.delim=*pos; + *pos=0; result.piece=helper.extract(*string_ref); - *string_ref=v+1; + *string_ref=pos+1; return result; } - pos=v+1; + pos++; } result.piece=helper.extract(*string_ref); *string_ref=0; @@ -196,19 +198,18 @@ static lsplit_sresult lsplit(char** stri // we are enclosed, searching for second encloser while(1) { - if(char* v=strchr(pos, encloser)){ - if(helper.check_lang(v)){ - *(v++)=0; + if(pos=strchr(pos, encloser)){ + if(helper.check_lang(pos)){ + *(pos++)=0; result.append(helper.extract(*string_ref)); - if(*v==encloser && helper.check_lang(v)){ // double-encloser stands for encloser - *string_ref=v+1; + if(*pos==encloser && helper.check_lang(pos)){ // double-encloser stands for encloser + *string_ref=pos++; } else { - *string_ref=pos=v; + *string_ref=pos; break; } } - pos=v+1; - }{ + } else { result.append(helper.extract(*string_ref)); *string_ref=0; return result; @@ -216,17 +217,17 @@ static lsplit_sresult lsplit(char** stri } // we are no longer enclosed, searching for delimiter - while(char* v=strpbrk(pos, delims)) { - if(helper.check_lang(v)){ - result.delim=*v; - if(v>*string_ref){ - *v=0; + while(pos=strpbrk(pos, delims)) { + if(helper.check_lang(pos)){ + result.delim=*pos; + if(pos>*string_ref){ + *pos=0; result.append(helper.extract(*string_ref)); } - *string_ref=v+1; + *string_ref=pos+1; return result; } - pos=v+1; + pos++; } result.append(helper.extract(*string_ref)); *string_ref=0; @@ -271,9 +272,8 @@ static void _create(Request& r, MethodPa size_t options_param_index=data_param_index+1; if( options_param_indexcount()) + throw Exception(PARSER_RUNTIME, 0, CALLED_WITH_INVALID_OPTION); } // data @@ -363,12 +363,12 @@ static lsplit_result lsplit(char** strin *write++=c; } - // we are no longer enclosed, searching for delimiter, skipping extra enclosers + // we are no longer enclosed, searching for delimiter while(c=*read++) { if(c==delims[0] || c==delims[1]) { result.delim=c; break; - } else if(c!=encloser) + } else *write++=c; } @@ -1148,8 +1148,8 @@ static void _flip(Request& r, MethodPara static void _foreach(Request& r, MethodParams& params) { InCycle temp(r); - const String& rownum_name=params.as_string(0, "rownum-var name must be string"); - const String& value_name=params.as_string(1, "value-var name must be string"); + const String* rownum_var_name=¶ms.as_string(0, "rownum-var name must be string"); + const String* value_var_name=¶ms.as_string(1, "value-var name must be string"); Value& body_code=params.as_junction(2, "body must be code"); @@ -1158,8 +1158,8 @@ static void _foreach(Request& r, MethodP Table& table=GET_SELF(r, VTable).table(); size_t saved_current=table.current(); - const String* rownum_var_name=rownum_name.is_empty()? 0 : &rownum_name; - const String* value_var_name=value_name.is_empty()? 0 : &value_name; + rownum_var_name=rownum_var_name->is_empty()? 0 : rownum_var_name; + value_var_name=value_var_name->is_empty()? 0 : value_var_name; Value* var_context=r.get_method_frame()->caller(); @@ -1221,8 +1221,7 @@ inline Table::element_type row_from_stri // parse cells Table::element_type row=new ArrayString; - size_t pos_after=0; - string.split(*row, pos_after, "\t", String::L_AS_IS); + string.split(*row, 0, "\t", String::L_AS_IS); return row; }