--- parser3/src/classes/table.C 2016/09/21 15:14:39 1.331 +++ parser3/src/classes/table.C 2016/11/01 23:10:41 1.338 @@ -22,7 +22,7 @@ #define USE_STRINGSTREAM #endif -volatile const char * IDENT_TABLE_C="$Id: table.C,v 1.331 2016/09/21 15:14:39 moko Exp $"; +volatile const char * IDENT_TABLE_C="$Id: table.C,v 1.338 2016/11/01 23:10:41 moko Exp $"; // class @@ -74,15 +74,15 @@ static Table::Action_options get_action_ else throw Exception(PARSER_RUNTIME, &soffset, "must be 'cur' string or expression"); } else - result.offset=r.process_to_value(*voffset).as_int(); + result.offset=r.process(*voffset).as_int(); } if(Value* vlimit=options->get(sql_limit_name)) { valid_options++; - result.limit=r.process_to_value(*vlimit).as_int(); + result.limit=r.process(*vlimit).as_int(); } if(Value *vreverse=(Value *)options->get(table_reverse_name)) { valid_options++; - result.reverse=r.process_to_value(*vreverse).as_bool(); + result.reverse=r.process(*vreverse).as_bool(); if(result.reverse && !defined_offset) result.offset=source.count()-1; } @@ -203,12 +203,13 @@ static lsplit_sresult lsplit(char** stri *(pos++)=0; result.append(helper.extract(*string_ref)); if(*pos==encloser && helper.check_lang(pos)){ // double-encloser stands for encloser - *string_ref=pos++; + *string_ref=pos; } else { *string_ref=pos; break; } } + pos++; } else { result.append(helper.extract(*string_ref)); *string_ref=0; @@ -277,7 +278,6 @@ static void _create(Request& r, MethodPa } // data - Temp_lang temp_lang(r, String::L_PASS_APPENDED); StringSplitHelper sdata(r.process_to_string(params.as_junction(data_param_index, "body must be table or code"))); char *data=sdata.base; @@ -711,13 +711,13 @@ static void _csv_string(Request& r, Meth table_to_csv(ost, table, control_chars, output_column_names); - r.write_no_lang(*new VString(*new String(pa_strdup(ost.str().c_str()), String::L_CLEAN))); + r.write(*new VString(*new String(pa_strdup(ost.str().c_str()), String::L_CLEAN))); #else String sdata; table_to_csv(sdata, table, control_chars, output_column_names); - r.write_no_lang(*new VString(*new String(sdata.cstr(), String::L_CLEAN))); + r.write(*new VString(*new String(sdata.cstr(), String::L_CLEAN))); #endif } @@ -737,12 +737,12 @@ static void _count(Request& r, MethodPar } else result = table.count(); - r.write_no_lang(*new VInt(result)); + r.write(*new VInt(result)); } static void _line(Request& r, MethodParams&) { int result=1+GET_SELF(r, VTable).table().current(); - r.write_no_lang(*new VInt(result)); + r.write(*new VInt(result)); } static void _offset(Request& r, MethodParams& params) { @@ -762,7 +762,7 @@ static void _offset(Request& r, MethodPa int offset=params.as_int(params.count()-1, "offset must be expression", r); table.offset(absolute, offset); } else - r.write_no_lang(*new VInt(table.current())); + r.write(*new VInt(table.current())); } static void _menu(Request& r, MethodParams& params) { @@ -780,18 +780,18 @@ static void _menu(Request& r, MethodPara for(size_t row=0; rowis_empty()) { // we have body if(need_delim) // need delim & iteration produced string? - r.write_pass_lang(r.process(*delim_maybe_code)); + r.write(r.process(*delim_maybe_code)); else need_delim=true; } - r.write_pass_lang(sv_processed); + r.write(sv_processed); if(lskip==Request::SKIP_BREAK) break; @@ -828,7 +828,7 @@ static void table_row_to_hash(Table::ele const String* key; if(info->key_code) { info->table->set_current(info->row++); // change context row - StringOrValue sv_processed=info->r->process(*info->key_code); + Value& sv_processed=info->r->process(*info->key_code); key=&sv_processed.as_string(); } else { key=info->key_fieldcount()?row->get(info->key_field):0; @@ -883,7 +883,7 @@ static void table_row_to_hash(Table::ele case C_CODE: { if(!info->key_code) info->table->set_current(info->row++); // change context row - exist=info->hash->put_dont_replace(*key, &info->r->process(*info->value_code).as_value()); + exist=info->hash->put_dont_replace(*key, &info->r->process(*info->value_code)); break; } } @@ -937,7 +937,7 @@ static void _hash(Request& r, MethodPara int valid_options=0; if(Value* vdistinct_code=options->get(sql_distinct_name)) { // $.distinct ? valid_options++; - distinct=get_distinct(r.process_to_value(*vdistinct_code), value_type); + distinct=get_distinct(r.process(*vdistinct_code), value_type); } if(Value* vvalue_type_code=options->get(sql_value_type_name)) { // $.type ? if(value_type==C_TABLE) // $.distinct[tables] already was specified @@ -945,7 +945,7 @@ static void _hash(Request& r, MethodPara if(value_type==C_CODE) throw Exception(PARSER_RUNTIME, 0, "you can't specify $.type[] if value is code"); valid_options++; - value_type=get_value_type(r.process_to_value(*vvalue_type_code)); + value_type=get_value_type(r.process(*vvalue_type_code)); } if(valid_options!=options->count()) @@ -1013,7 +1013,7 @@ static void _hash(Request& r, MethodPara } } } - r.write_no_lang(result); + r.write(result); } #ifndef DOXYGEN @@ -1061,7 +1061,7 @@ static void _sort(Request& r, MethodPara old_table.set_current(i); // calculate key value seq[i].row=old_table[i]; - Value& value=r.process_to_value(key_maker); + Value& value=r.process(key_maker); if(i==0) // determining key values type by first one key_values_are_strings=value.is_string(); @@ -1075,7 +1075,7 @@ static void _sort(Request& r, MethodPara if(r.charsets.source().NAME()=="KOI8-R" && key_values_are_strings) { for(i=0; ir->process_to_value(*info->expression_code).as_bool(); + return info->r->process(*info->expression_code).as_bool(); } static bool _locate_expression(Table& table, Request& r, MethodParams& params) { @@ -1124,7 +1124,7 @@ static void _locate(Request& r, MethodPa bool result=params[0].get_junction() || (params.count() == 1) ? _locate_expression(table, r, params) : _locate_name_value(table, r, params); - r.write_no_lang(VBool::get(result)); + r.write(VBool::get(result)); } @@ -1142,7 +1142,7 @@ static void _flip(Request& r, MethodPara new_table+=new_row; } - r.write_no_lang(*new VTable(&new_table)); + r.write(*new VTable(&new_table)); } static void _foreach(Request& r, MethodParams& params) { @@ -1173,18 +1173,18 @@ static void _foreach(Request& r, MethodP if(value_var_name) r.put_element(*var_context, *value_var_name, new VTable(&table)); - StringOrValue sv_processed=r.process(body_code); + Value& sv_processed=r.process(body_code); Request::Skip lskip=r.get_skip(); r.set_skip(Request::SKIP_NOTHING); const String* s_processed=sv_processed.get_string(); if(s_processed && !s_processed->is_empty()) { // we have body if(need_delim) // need delim & iteration produced string? - r.write_pass_lang(r.process(*delim_maybe_code)); + r.write(r.process(*delim_maybe_code)); else need_delim=true; } - r.write_pass_lang(sv_processed); + r.write(sv_processed); if(lskip==Request::SKIP_BREAK) break; @@ -1216,7 +1216,6 @@ inline Table::element_type row_from_stri if(!param.is_string() && !param.get_junction()) throw Exception(PARSER_RUNTIME, 0, "row must be string, code or hash"); - Temp_lang temp_lang(r, String::L_PASS_APPENDED); const String& string=r.process_to_string(param); // parse cells @@ -1391,11 +1390,11 @@ static void _sql(Request& r, MethodParam } if(Value* vlimit=options->get(sql_limit_name)) { valid_options++; - limit=(ulong)r.process_to_value(*vlimit).as_double(); + limit=(ulong)r.process(*vlimit).as_double(); } if(Value* voffset=options->get(sql_offset_name)) { valid_options++; - offset=(ulong)r.process_to_value(*voffset).as_double(); + offset=(ulong)r.process(*voffset).as_double(); } if(valid_options!=options->count()) throw Exception(PARSER_RUNTIME, 0, CALLED_WITH_INVALID_OPTION); @@ -1406,9 +1405,8 @@ static void _sql(Request& r, MethodParam if(bind) placeholders_count=marshal_binds(*bind, placeholders); - Temp_lang temp_lang(r, String::L_SQL); const String& statement_string=r.process_to_string(statement); - const char* statement_cstr=statement_string.untaint_cstr(r.flang, r.connection()); + const char* statement_cstr=statement_string.untaint_cstr(String::L_SQL, r.connection()); Table_sql_event_handlers handlers; @@ -1450,7 +1448,7 @@ static void _columns(Request& r, MethodP } } - r.write_no_lang(*new VTable(&result_table)); + r.write(*new VTable(&result_table)); } static void _select(Request& r, MethodParams& params) { @@ -1467,15 +1465,15 @@ static void _select(Request& r, MethodPa int valid_options=0; if(Value* vlimit=options->get(sql_limit_name)) { valid_options++; - limit=r.process_to_value(*vlimit).as_int(); + limit=r.process(*vlimit).as_int(); } if(Value* voffset=options->get(sql_offset_name)) { valid_options++; - offset=r.process_to_value(*voffset).as_int(); + offset=r.process(*voffset).as_int(); } if(Value* vreverse=options->get(table_reverse_name)) { valid_options++; - reverse=r.process_to_value(*vreverse).as_bool(); + reverse=r.process(*vreverse).as_bool(); } if(valid_options!=options->count()) throw Exception(PARSER_RUNTIME, 0, CALLED_WITH_INVALID_OPTION); @@ -1494,7 +1492,7 @@ static void _select(Request& r, MethodPa for(size_t row=size-1; result_table.count() < (size_t)limit; row--) { source_table.set_current(row); - bool condition=r.process_to_value(vcondition, false/*don't intercept string*/).as_bool(); + bool condition=r.process(vcondition).as_bool(); if(condition && ++appended > (size_t)offset) // ...condition is true, adding to the result result_table+=source_table[row]; @@ -1504,7 +1502,7 @@ static void _select(Request& r, MethodPa for(size_t row=0; row < size && result_table.count() < (size_t)limit; row++) { source_table.set_current(row); - bool condition=r.process_to_value(vcondition, false/*don't intercept string*/).as_bool(); + bool condition=r.process(vcondition).as_bool(); if(condition && ++appended > (size_t)offset) // ...condition is true, adding to the result result_table+=source_table[row]; @@ -1513,7 +1511,7 @@ static void _select(Request& r, MethodPa source_table.set_current(saved_current); } - r.write_no_lang(*new VTable(&result_table)); + r.write(*new VTable(&result_table)); } // constructor