Diff for /parser3/src/classes/string.C between versions 1.22 and 1.26

version 1.22, 2001/03/30 05:51:12 version 1.26, 2001/04/03 14:38:58
Line 1 Line 1
 /*  /** @file
         Parser          Parser: @b string parser class.
   
         Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com)          Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com)
   
         Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf)          Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf)
   
         $Id$          $Id$
Line 11 Line 13
 #include "pa_vdouble.h"  #include "pa_vdouble.h"
 #include "pa_vint.h"  #include "pa_vint.h"
 #include "pa_vtable.h"  #include "pa_vtable.h"
   #include "pa_vbool.h"
   
 // global var  // global var
   
Line 36  static void _double(Request& r, const St Line 39  static void _double(Request& r, const St
         r.write_no_lang(value);          r.write_no_lang(value);
 }  }
   
   /// ^string.format{format}
 /*not static*/void _string_format(Request& r, const String& method_name, Array *params) {  /*not static*/void _string_format(Request& r, const String& method_name, Array *params) {
         Pool& pool=r.pool();          Pool& pool=r.pool();
   
         Value& fmt=*static_cast<Value *>(params->get(0));          Value& fmt=*static_cast<Value *>(params->get(0));
         // forcing [this param type]          // forcing {this param type}
         r.fail_if_junction_(true, fmt, method_name, "fmt must not be junction");          r.fail_if_junction_(false, fmt, method_name, "fmt must be junction");
   
         char *buf=format(pool, r.self->as_double(), fmt.as_string().cstr());          Temp_lang temp_lang(r, String::UL_PASS_APPENDED);
           char *buf=format(pool, r.self->as_double(), r.process(fmt).as_string().cstr());
                   
         r.write_no_lang(String(pool, buf));          r.write_no_lang(String(pool, buf));
 }  }
Line 88  static void _pos(Request& r, const Strin Line 93  static void _pos(Request& r, const Strin
 }  }
   
 static void split_list(Request& r, const String& method_name, Array *params,  static void split_list(Request& r, const String& method_name, Array *params,
                                            const String& string, Array& list) {                                             const String& string, 
                                              Array& result) {
         Pool& pool=r.pool();          Pool& pool=r.pool();
   
         Value& delim_value=*static_cast<Value *>(params->get(0));          Value& delim_value=*static_cast<Value *>(params->get(0));
         // forcing [this param type]          // forcing [this param type]
         r.fail_if_junction_(true, delim_value, method_name, "delimiter must not be junction");          r.fail_if_junction_(true, delim_value, method_name, "delimiter must not be junction");
         const String& delim=delim_value.as_string();  
                   string.split(result, 0, delim_value.as_string(), String::UL_CLEAN, -1);
         if(delim.size()) {  
                 size_t pos_after=0;  
                 int pos_before;  
                 // while we have 'delim' in 'string'...  
                 while((pos_before=string.pos(delim, pos_after))>=0) {  
                         list+=&string.piece(pos_after, pos_before);  
                         pos_after=pos_before+delim.size();  
                 }  
                 // last piece  
                 if(pos_after<string.size())   
                         list+=&string.piece(pos_after, string.size());  
         } else { // empty delim  
                 list+=&string;  
         }  
 }  }
   
 static void _lsplit(Request& r, const String& method_name, Array *params) {  static void _lsplit(Request& r, const String& method_name, Array *params) {
Line 144  static void _rsplit(Request& r, const St Line 136  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));
 }  }
   
   /// ^string.match{regexp}[options]
   static void _match(Request& r, const String& method_name, Array *params) {
           Pool& pool=r.pool();
           const String& string=*static_cast<VString *>(r.self)->get_string();
   
           Value& regexp=*static_cast<Value *>(params->get(0));
           // forcing {this param type}
           r.fail_if_junction_(false, regexp, method_name, "regexp must be junction");
   
           const String *options=0;
           if(params->size()>1) {
                   Value& value=*static_cast<Value *>(params->get(1));
                   // forcing {this param type}
                   r.fail_if_junction_(true, value, method_name, "options must not be junction");
                   options=&value.as_string();
           }
   
           Temp_lang temp_lang(r, String::UL_PASS_APPENDED);
           Table *table;
           Value *result;
           if(string.match(&method_name, 
                   r.process(regexp).as_string(), options,
                   &table)) {
                   // matched
                   if(table->columns()->size()==3 && // just matched[3=pre/match/post], no substrings
                           table->size()==1)  // just one row, not Global search
                           result=new(pool) VBool(pool, true);
                   else // table of match column+substring columns
                           result=new(pool) VTable(pool, table);
           } else // not global & not matched
                   result=new(pool) VBool(pool, false);
   
           result->set_name(method_name);
           r.write_no_lang(*result);
   }
   
 // initialize  // initialize
   
 void initialize_string_class(Pool& pool, VStateless_class& vclass) {  void initialize_string_class(Pool& pool, VStateless_class& vclass) {
Line 156  void initialize_string_class(Pool& pool, Line 184  void initialize_string_class(Pool& pool,
         // ^string.double[]          // ^string.double[]
         vclass.add_native_method("double", Method::CT_DYNAMIC, _double, 0, 0);          vclass.add_native_method("double", Method::CT_DYNAMIC, _double, 0, 0);
   
         // ^string.format[]          // ^string.format{format}
         vclass.add_native_method("format", Method::CT_DYNAMIC, _string_format, 1, 1);          vclass.add_native_method("format", Method::CT_DYNAMIC, _string_format, 1, 1);
   
         // ^string.left(n)          // ^string.left(n)
Line 173  void initialize_string_class(Pool& pool, Line 201  void initialize_string_class(Pool& pool,
         vclass.add_native_method("lsplit", Method::CT_DYNAMIC, _lsplit, 1, 1);          vclass.add_native_method("lsplit", Method::CT_DYNAMIC, _lsplit, 1, 1);
         // ^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]
           vclass.add_native_method("match", Method::CT_DYNAMIC, _match, 1, 2);
 }         }       
   

Removed from v.1.22  
changed lines
  Added in v.1.26


E-mail: