Diff for /parser3/src/classes/string.C between versions 1.249 and 1.255

version 1.249, 2020/12/17 20:01:03 version 1.255, 2024/09/28 14:37:53
Line 1 Line 1
 /** @file  /** @file
         Parser: @b string parser class.          Parser: @b string parser class.
   
         Copyright (c) 2001-2020 Art. Lebedev Studio (http://www.artlebedev.com)          Copyright (c) 2001-2023 Art. Lebedev Studio (http://www.artlebedev.com)
         Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)          Authors: Konstantin Morshnev <moko@design.ru>, Alexandr Petrosian <paf@design.ru>
 */  */
   
 #include "classes.h"  #include "classes.h"
Line 205  static void _pos(Request& r, MethodParam Line 205  static void _pos(Request& r, MethodParam
         r.write(*new VInt((int)string.pos(r.charsets.source(), substr.as_string(), offset)));          r.write(*new VInt((int)string.pos(r.charsets.source(), substr.as_string(), offset)));
 }  }
   
   struct Split_action_info {
           const String& src;
           ArrayString &result;
   };
   
   static void split_action(Table& , ArrayString* row, int prestart, int prefinish, int poststart, int postfinish, void *info) {
           Split_action_info& ai=*static_cast<Split_action_info *>(info);
           if(row) { // begin&middle
                   // piece from last match['prestart'] to beginning of this match['prefinish']
                   ai.result += &ai.src.mid(prestart, prefinish);
           } else // end
                   if(poststart != postfinish)
                           ai.result += &ai.src.mid(poststart, postfinish);
   }
   
 static void split_list(Value& delim_value, const String& string, ArrayString& result) {  static void split_list(Value& delim_value, const String& string, ArrayString& result) {
         string.split(result, 0, delim_value.as_string());          if(VRegex *vregex=dynamic_cast<VRegex*>(&delim_value)){
                   vregex->study();
   
                   int matches_count=0;
                   Split_action_info ai = { string, result };
   
                   string.match(vregex, split_action, &ai, matches_count);
           } else
                   string.split(result, 0, delim_value.as_string());
 }  }
   
 #define SPLIT_LEFT 0x0001  #define SPLIT_LEFT 0x0001
Line 254  static Table& split_vertical(ArrayString Line 277  static Table& split_vertical(ArrayString
                         table+=row;                          table+=row;
                 }                  }
         } else { // left          } else { // left
                 Array_iterator<const String*> i(pieces);                  for(ArrayString::Iterator i(pieces); i; ) {
                 while(i.has_next()) {  
                         Table::element_type row(new ArrayString);                          Table::element_type row(new ArrayString);
                         *row+=i.next();                          *row+=i.next();
                         table+=row;                          table+=row;
Line 272  static Table& split_horizontal(ArrayStri Line 294  static Table& split_horizontal(ArrayStri
                 for(int i=pieces.count(); --i>=0; )                  for(int i=pieces.count(); --i>=0; )
                         *row+=pieces[i];                          *row+=pieces[i];
         } else { // left          } else { // left
                 for(Array_iterator<const String*> i(pieces); i.has_next(); )                  for(ArrayString::Iterator i(pieces); i; )
                         *row+=i.next();                          *row+=i.next();
         }          }
         table+=row;          table+=row;
Line 363  static void _match(Request& r, MethodPar Line 385  static void _match(Request& r, MethodPar
         Value& regexp=params.as_no_junction(0, "regexp must not be code");          Value& regexp=params.as_no_junction(0, "regexp must not be code");
         Value* options=(params_count>1)?&params.as_no_junction(1, OPTIONS_MUST_NOT_BE_CODE):0;          Value* options=(params_count>1)?&params.as_no_junction(1, OPTIONS_MUST_NOT_BE_CODE):0;
   
         VRegex* vregex;          VRegex* vregex=dynamic_cast<VRegex*>(&regexp);
         VRegexCleaner vrcleaner;          VRegexCleaner vrcleaner;
   
         if(Value* value=regexp.as(VREGEX_TYPE)){          if(vregex){
                 if(options && options->is_defined())                  if(options && options->is_defined())
                         throw Exception(PARSER_RUNTIME, 0, "you can not specify regex-object and options together");                          throw Exception(PARSER_RUNTIME, 0, "you cannot specify regex-object and options together");
                 vregex=static_cast<VRegex*>(value);  
         } else {          } else {
                 vregex=new VRegex(r.charsets.source(), &regexp.as_string(), (options) ? (&options->as_string()) : 0);                  vregex=new VRegex(r.charsets.source(), &regexp.as_string(), (options) ? (&options->as_string()) : 0);
                 vregex->study();                  vregex->study();
Line 465  public: Line 486  public:
         bool add_row(SQL_Error& /*error*/) { /* ignore */ return false; }          bool add_row(SQL_Error& /*error*/) { /* ignore */ return false; }
         bool add_row_cell(SQL_Error& error, const char* str, size_t) {          bool add_row_cell(SQL_Error& error, const char* str, size_t) {
                 if(got_cell) {                  if(got_cell) {
                         error=SQL_Error("result must not contain more then one row");                          error=SQL_Error("result must contain no more than one row");
                         return true;                          return true;
                 }                  }
                 try {                  try {

Removed from v.1.249  
changed lines
  Added in v.1.255


E-mail: