Diff for /parser3/src/classes/string.C between versions 1.85 and 1.97

version 1.85, 2001/10/23 14:43:44 version 1.97, 2002/02/08 08:30:10
Line 1 Line 1
 /** @file  /** @file
         Parser: @b string parser class.          Parser: @b string parser class.
   
         Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com)          Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com)
         Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf)          Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
   
         $Id$          $Id$
 */  */
Line 80  static void _double(Request& r, const St Line 80  static void _double(Request& r, const St
 /*not static*/void _string_format(Request& r, const String& method_name, MethodParams *params) {  /*not static*/void _string_format(Request& r, const String& method_name, MethodParams *params) {
         Pool& pool=r.pool();          Pool& pool=r.pool();
   
         Value& fmt=params->as_junction(0, "fmt must be code");          Value& fmt_maybe_code=params->get(0);
           // for some time due to stupid {} in original design
           const String& fmt=
                   (fmt_maybe_code.get_junction()?r.process(fmt_maybe_code):fmt_maybe_code).as_string();
   
         Temp_lang temp_lang(r, String::UL_PASS_APPENDED);          char *buf=format(pool, r.self->as_double(), fmt.cstr());
         char *buf=format(pool, r.self->as_double(), r.process(fmt).as_string().cstr());  
   
         String result(pool);          String result(pool);
         result.APPEND_CLEAN(buf, 0,           result.APPEND_CLEAN(buf, 0, 
Line 244  static void _match(Request& r, const Str Line 246  static void _match(Request& r, const Str
         Table *table;          Table *table;
         if(params->size()<3) { // search          if(params->size()<3) { // search
                 bool was_global;                  bool was_global;
                 bool matched=src.match(r.pcre_tables(),                  bool matched=src.match(
                         &method_name,                           &method_name, 
                         regexp.as_string(), options,                          regexp.as_string(), options,
                         &table,                          &table,
Line 257  static void _match(Request& r, const Str Line 259  static void _match(Request& r, const Str
                 else                   else 
                         result=new(pool) VBool(pool, matched);                                            result=new(pool) VBool(pool, matched);                  
         } else { // replace          } else { // replace
                 Value& replacement_code=params->as_junction(2, "replacement code must be code");                  Value& replacement_code=params->as_junction(2, "replacement param must be code");
   
                 String& dest=*new(pool) String(pool);                  String& dest=*new(pool) String(pool);
                 Replace_action_info replace_action_info={                  Replace_action_info replace_action_info={
Line 266  static void _match(Request& r, const Str Line 268  static void _match(Request& r, const Str
                         &replacement_code,                          &replacement_code,
                         &src                          &src
                 };                  };
                 src.match(r.pcre_tables(),                  src.match(
                         &method_name,                           &method_name, 
                         r.process(regexp).as_string(), options,                          r.process(regexp).as_string(), options,
                         &table,                          &table,
Line 282  static void change_case(Request& r, cons Line 284  static void change_case(Request& r, cons
         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();
   
         r.write_assign_lang(*new(pool) VString(src.change_case(pool, r.pcre_tables(),          r.write_assign_lang(*new(pool) VString(src.change_case(pool, 
                 kind)));                  kind)));
 }  }
 static void _upper(Request& r, const String& method_name, MethodParams *params) {  static void _upper(Request& r, const String& method_name, MethodParams *params) {
Line 336  const String* sql_result_string(Request& Line 338  const String* sql_result_string(Request&
                                                                 Hash *& options, Value *& default_code) {                                                                  Hash *& options, Value *& default_code) {
         Pool& pool=r.pool();          Pool& pool=r.pool();
   
         if(!r.connection)  
                 throw Exception(0, 0,  
                         &method_name,  
                         "without connect");  
   
         Value& statement=params->as_junction(0, "statement must be code");          Value& statement=params->as_junction(0, "statement must be code");
   
         ulong limit=0;          ulong limit=0;
Line 370  const String* sql_result_string(Request& Line 367  const String* sql_result_string(Request&
         Temp_lang temp_lang(r, String::UL_SQL);          Temp_lang temp_lang(r, String::UL_SQL);
         const String& statement_string=r.process(statement).as_string();          const String& statement_string=r.process(statement).as_string();
         const char *statement_cstr=          const char *statement_cstr=
                 statement_string.cstr(String::UL_UNSPECIFIED, r.connection);                  statement_string.cstr(String::UL_UNSPECIFIED, r.connection(&method_name));
         String_sql_event_handlers handlers(pool, statement_string, statement_cstr);          String_sql_event_handlers handlers(pool, statement_string, statement_cstr);
         try {          try {
                 r.connection->query(                  r.connection(&method_name)->query(
                         statement_cstr, offset, limit,                           statement_cstr, offset, limit, 
                         handlers);                          handlers);
         } catch(const Exception& e) { // query problem          } catch(const Exception& e) { // query problem
Line 425  static void _replace(Request& r, const S Line 422  static void _replace(Request& r, const S
 }  }
   
 static void _save(Request& r, const String& method_name, MethodParams *params) {  static void _save(Request& r, const String& method_name, MethodParams *params) {
         Pool& pool=r.pool();          const String& file_name=params->as_string(params->size()-1, 
         Value& vfile_name=params->as_no_junction(0,                   "file name must be string");
                 "file name must not be code");  
   
         const String& src=*static_cast<VString *>(r.self)->get_string();          const String& src=*static_cast<VString *>(r.self)->get_string();
   
           bool do_append=false;
           if(params->size()>1) {
                   const String& mode=params->as_string(0, "mode must be string");
                   if(mode=="append")
                           do_append=true;
                   else
                           throw Exception(0, 0,
                                   &mode,
                                   "unknown mode, must be 'append'");
           }               
   
         // write          // write
         file_write(pool, r.absolute(vfile_name.as_string()),           const char *buf=src.cstr(String::UL_UNSPECIFIED);
                 src.cstr(String::UL_AS_IS), src.size(), true);          file_write(r.absolute(file_name), 
                   buf, strlen(buf), true, do_append);
 }  }
   
 // constructor  // constructor
Line 487  MString::MString(Pool& apool) : Methoded Line 495  MString::MString(Pool& apool) : Methoded
         add_native_method("replace", Method::CT_DYNAMIC, _replace, 1, 1);          add_native_method("replace", Method::CT_DYNAMIC, _replace, 1, 1);
   
         // ^string.save[file]            // ^string.save[file]  
         add_native_method("save", Method::CT_DYNAMIC, _save, 1, 1);          add_native_method("save", Method::CT_DYNAMIC, _save, 1, 2);
 }         }       
   
 // global variable  // global variable

Removed from v.1.85  
changed lines
  Added in v.1.97


E-mail: