|
|
| version 1.28, 2001/04/03 15:25:07 | version 1.30, 2001/04/03 15:54:46 |
|---|---|
| Line 143 static void search_row_action(Table& tab | Line 143 static void search_row_action(Table& tab |
| } | } |
| struct Replace_action_info { | struct Replace_action_info { |
| Request *request; const String *origin; | |
| String *dest; | String *dest; |
| Value *replacement_code; | Value *replacement_code; |
| bool first_time; | bool first_time; |
| const String *post_match; | |
| }; | }; |
| static void replace_row_action(Table& table, Array *row, void *info) { | static void replace_row_action(Table& table, Array *row, void *info) { |
| Replace_action_info& ai=*static_cast<Replace_action_info *>(info); | Replace_action_info& ai=*static_cast<Replace_action_info *>(info); |
| //table+=&row; | if(row) { // begin/middle |
| if(ai.first_time) { // begin | // store found parts in one-record Vtable |
| ai.first_time=false; | if(ai.first_time) { // begin |
| ai.dest->APPEND_CONST("B"); | ai.first_time=false; |
| } | ai.dest->append(*(String *)row->get(0/*pre_match*/), |
| if(row) // middle | String::UL_PASS_APPENDED); |
| ai.dest->APPEND_CONST("M"); | table+=row; |
| else // end | } else |
| ai.dest->APPEND_CONST("E"); | table.put(0, row); |
| { // execute 'replacement_code' in 'table' context | |
| VTable& vtable=*new(table.pool()) VTable(table.pool(), &table); | |
| vtable.set_name(*ai.origin); | |
| Junction *junction=ai.replacement_code->get_junction(); | |
| junction->rcontext/*=junction->self*/=&vtable; | |
| Value& replaced=ai.request->process(*ai.replacement_code, ai.origin, false); | |
| ai.dest->append(replaced.as_string(), String::UL_PASS_APPENDED); | |
| } | |
| ai.post_match=(String *)row->get(2/*post_match*/); | |
| } else // end | |
| ai.dest->append(*ai.post_match, String::UL_PASS_APPENDED); | |
| } | } |
| /** search/replace | /** search/replace |
| Line 204 static void _match(Request& r, const Str | Line 219 static void _match(Request& r, const Str |
| String& dest=*new(pool) String(pool); | String& dest=*new(pool) String(pool); |
| Replace_action_info replace_action_info={ | Replace_action_info replace_action_info={ |
| &r, &method_name, | |
| &dest, | &dest, |
| &replacement_code, | &replacement_code, |
| true | true, |
| &src | |
| }; | }; |
| src.match(&method_name, | src.match(&method_name, |
| r.process(regexp).as_string(), options, | r.process(regexp).as_string(), options, |