Diff for /parser3/src/classes/string.C between versions 1.31 and 1.35

version 1.31, 2001/04/03 16:34:26 version 1.35, 2001/04/04 10:50:33
Line 60  static void _left(Request& r, const Stri Line 60  static void _left(Request& r, const Stri
         size_t n=(size_t)r.process(*static_cast<Value *>(params->get(0))).as_double();          size_t n=(size_t)r.process(*static_cast<Value *>(params->get(0))).as_double();
                   
         const String& string=*static_cast<VString *>(r.self)->get_string();          const String& string=*static_cast<VString *>(r.self)->get_string();
         r.write_assign_lang(*new(pool) VString(string.piece(0, n)));          r.write_assign_lang(*new(pool) VString(string.mid(0, n)));
 }  }
   
 static void _right(Request& r, const String&, Array *params) {  static void _right(Request& r, const String&, Array *params) {
Line 69  static void _right(Request& r, const Str Line 69  static void _right(Request& r, const Str
         size_t n=(size_t)r.process(*static_cast<Value *>(params->get(0))).as_double();          size_t n=(size_t)r.process(*static_cast<Value *>(params->get(0))).as_double();
                   
         const String& string=*static_cast<VString *>(r.self)->get_string();          const String& string=*static_cast<VString *>(r.self)->get_string();
         r.write_assign_lang(*new(pool) VString(string.piece(string.size()-n, string.size())));          r.write_assign_lang(*new(pool) VString(string.mid(string.size()-n, string.size())));
 }  }
   
 static void _mid(Request& r, const String&, Array *params) {  static void _mid(Request& r, const String&, Array *params) {
Line 79  static void _mid(Request& r, const Strin Line 79  static void _mid(Request& r, const Strin
         size_t n=(size_t)r.process(*static_cast<Value *>(params->get(1))).as_double();          size_t n=(size_t)r.process(*static_cast<Value *>(params->get(1))).as_double();
                   
         const String& string=*static_cast<VString *>(r.self)->get_string();          const String& string=*static_cast<VString *>(r.self)->get_string();
         r.write_assign_lang(*new(pool) VString(string.piece(p, p+n)));          r.write_assign_lang(*new(pool) VString(string.mid(p, p+n)));
 }  }
   
 static void _pos(Request& r, const String& method_name, Array *params) {  static void _pos(Request& r, const String& method_name, Array *params) {
Line 137  static void _rsplit(Request& r, const St Line 137  static void _rsplit(Request& r, const St
         r.write_no_lang(*new(pool) VTable(pool, &table));          r.write_no_lang(*new(pool) VTable(pool, &table));
 }  }
   
 static void search_row_action(Table& table, Array *row, int, int, void *) {  static void search_action(Table& table, Array *row, int, int, void *) {
         if(row)          if(row)
                 table+=row;                  table+=row;
 }  }
Line 146  struct Replace_action_info { Line 146  struct Replace_action_info {
         Request *request;  const String *origin;          Request *request;  const String *origin;
         const String *src;  String *dest;          const String *src;  String *dest;
         Value *replacement_code;          Value *replacement_code;
         bool first_time;  
         const String *post_match;          const String *post_match;
 };  };
 static void replace_row_action(Table& table, Array *row, int start, int finish,   static void replace_action(Table& table, Array *row, int start, int finish, 
                                                            void *info) {                                                             void *info) {
         Replace_action_info& ai=*static_cast<Replace_action_info *>(info);          Replace_action_info& ai=*static_cast<Replace_action_info *>(info);
         if(row) { // begin&middle          if(row) { // begin&middle
                 // piece from last match['start'] to beginning of this match['finish']                  // piece from last match['start'] to beginning of this match['finish']
                 if(start!=finish)                  if(start!=finish)
                         ai.dest->APPEND_CONST("-");//ai.dest->append(ai.src->piece(start, finish), String::UL_PASS_APPENDED);                          ai.dest->append(ai.src->mid(start, finish), String::UL_PASS_APPENDED);//ai.dest->APPEND_CONST("-");
                 // store found parts in one-record Vtable                  // store found parts in one-record Vtable
                 if(ai.first_time) { // begin                  if(table.size()) // middle
                         ai.first_time=false;  
                         table+=row;  
                 } else  
                         table.put(0, row);                          table.put(0, row);
                   else // begin
                           table+=row;
                 { // execute 'replacement_code' in 'table' context                  { // execute 'replacement_code' in 'table' context
                         VTable& vtable=*new(table.pool()) VTable(table.pool(), &table);                          VTable& vtable=*new(table.pool()) VTable(table.pool(), &table);
                         vtable.set_name(*ai.origin);                          vtable.set_name(*ai.origin);
   
                         Junction *junction=ai.replacement_code->get_junction();                          Junction *junction=ai.replacement_code->get_junction();
                         junction->rcontext/*=junction->self*/=&vtable;                          junction->rcontext=junction->root=&vtable;
                         Value& replaced=ai.request->process(*ai.replacement_code, ai.origin, false);                          Value& replaced=ai.request->process(*ai.replacement_code, ai.origin, false);
   
                           /*
                         ai.dest->APPEND_CONST("(");                          ai.dest->APPEND_CONST("(");
                                 ai.dest->append(*(String *)row->get(1/*match*/), String::UL_PASS_APPENDED);                                  ai.dest->append(*(String *)row->get(1/*match* /), String::UL_PASS_APPENDED);
                         ai.dest->APPEND_CONST(")");                          ai.dest->APPEND_CONST(")");
                         //ai.dest->append(replaced.as_string(), String::UL_PASS_APPENDED);                          */
                           ai.dest->append(replaced.as_string(), String::UL_PASS_APPENDED);
                 }                  }
                 ai.post_match=(String *)row->get(2/*post_match*/);                  ai.post_match=(String *)row->get(2/*post_match*/);
         } else // end          } else // end
Line 181  static void replace_row_action(Table& ta Line 181  static void replace_row_action(Table& ta
 }  }
   
 /** search/replace  /** search/replace
         ^string.match{regexp}[options]          ^string.match[regexp][options]
         ^string.match{regexp}[options]{replacement-code}          ^string.match[regexp][options]{replacement-code}
 */  */
 static void _match(Request& r, const String& method_name, Array *params) {  static void _match(Request& r, const String& method_name, Array *params) {
         Pool& pool=r.pool();          Pool& pool=r.pool();
         const String& src=*static_cast<VString *>(r.self)->get_string();          const String& src=*static_cast<VString *>(r.self)->get_string();
   
         Value& regexp=*static_cast<Value *>(params->get(0));          Value& regexp=*static_cast<Value *>(params->get(0));
         // forcing {this param type}          // forcing [this param type]
         r.fail_if_junction_(false, regexp, method_name, "regexp must be junction");          r.fail_if_junction_(true, regexp, method_name, "regexp must not be junction");
   
         const String *options=0;          const String *options=0;
         if(params->size()>1) {          if(params->size()>1) {
Line 205  static void _match(Request& r, const Str Line 205  static void _match(Request& r, const Str
         Table *table;          Table *table;
         if(params->size()<3) { // search          if(params->size()<3) { // search
                 if(src.match(&method_name,                   if(src.match(&method_name, 
                         r.process(regexp).as_string(), options,                          regexp.as_string(), options,
                         &table,                          &table,
                         search_row_action, 0)) {                          search_action, 0)) {
                         // matched                          // matched
                         if(table->columns()->size()==3 && // just matched[3=pre/match/post], no substrings                          if(table->columns()->size()==3 && // just matched[3=pre/match/post], no substrings
                                 table->size()==1)  // just one row, not /g_lobal search                                  table->size()==1)  // just one row, not /g_lobal search
Line 227  static void _match(Request& r, const Str Line 227  static void _match(Request& r, const Str
                         &r, &method_name,                          &r, &method_name,
                         &src, &dest,                          &src, &dest,
                         &replacement_code,                          &replacement_code,
                         true,  
                         &src                          &src
                 };                  };
                 src.match(&method_name,                   src.match(&method_name, 
                         r.process(regexp).as_string(), options,                          r.process(regexp).as_string(), options,
                         &table,                          &table,
                         replace_row_action, &replace_action_info);                          replace_action, &replace_action_info);
                 result=new(pool) VString(dest);                  result=new(pool) VString(dest);
         }          }
         result->set_name(method_name);          result->set_name(method_name);
         r.write_no_lang(*result);          r.write_assign_lang(*result);
 }  }
   
 // initialize  // initialize
Line 270  void initialize_string_class(Pool& pool, Line 269  void initialize_string_class(Pool& pool,
         // ^string.rsplit[delim]          // ^string.rsplit[delim]
         vclass.add_native_method("rsplit", Method::CT_DYNAMIC, _rsplit, 1, 1);          vclass.add_native_method("rsplit", Method::CT_DYNAMIC, _rsplit, 1, 1);
   
         // ^string.match{regexp}[options]          // ^string.match[regexp][options]
         // ^string.match{regexp}[options]{replacement-code}          // ^string.match[regexp][options]{replacement-code}
         vclass.add_native_method("match", Method::CT_DYNAMIC, _match, 1, 3);          vclass.add_native_method("match", Method::CT_DYNAMIC, _match, 1, 3);
 }         }       
   

Removed from v.1.31  
changed lines
  Added in v.1.35


E-mail: