Diff for /parser3/src/classes/string.C between versions 1.166 and 1.170

version 1.166, 2008/07/18 09:12:17 version 1.170, 2009/04/10 11:31:06
Line 1 Line 1
 /** @file  /** @file
         Parser: @b string parser class.          Parser: @b string parser class.
   
         Copyright (c) 2001-2005 ArtLebedev Group (http://www.artlebedev.com)          Copyright (c) 2001-2009 ArtLebedev Group (http://www.artlebedev.com)
         Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)          Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
 */  */
   
Line 360  static void replace_action(Table& table, Line 360  static void replace_action(Table& table,
                 *ai.dest << ai.src->mid(poststart, postfinish);                  *ai.dest << ai.src->mid(poststart, postfinish);
 }  }
   
 /// @todo use pcre:study somehow  /// @todo use pcre_study somehow
 static void _match(Request& r, MethodParams& params) {  static void _match(Request& r, MethodParams& params) {
         Value& regexp=params.as_no_junction(0, "regexp must not be code");          Value& regexp=params.as_no_junction(0, "regexp must not be code");
   
Line 639  static void _append(Request& r, MethodPa Line 639  static void _append(Request& r, MethodPa
   
 static void _base64(Request& r, MethodParams& params) {  static void _base64(Request& r, MethodParams& params) {
         if(params.count()) {          if(params.count()) {
                 // decode                  // decode: ^string:base64[encoded]
                 const char* cstr=params.as_string(0, PARAMETER_MUST_BE_STRING).cstr();                  const char* cstr=params.as_string(0, PARAMETER_MUST_BE_STRING).cstr();
                 char* decoded_cstr=0;                  char* decoded=0;
                 size_t decoded_size=0;                  size_t length=0;
                 pa_base64_decode(cstr, strlen(cstr), decoded_cstr, decoded_size);                  pa_base64_decode(cstr, strlen(cstr), decoded, length);
                 if(decoded_cstr && decoded_size)                  if(decoded && length){
                         r.write_assign_lang(*new String(decoded_cstr, decoded_size, true));                          if(memchr((const char*)decoded, 0, length))
                                   throw Exception(PARSER_RUNTIME,
                                           0,
                                           "Invalid \\x00 character found while decode to string. Decode it to file instead.");
   
                           fix_line_breaks(decoded, length);
                           if(length){
                                   r.write_assign_lang(*new String(decoded, length, true/*tainted*/));
                           }
                   }
         } else {          } else {
                 // encode                   // encode: ^str.base64[]
                 VString& self=GET_SELF(r, VString);                  VString& self=GET_SELF(r, VString);
                 const char* cstr=self.string().cstr();                  const char* cstr=self.string().cstr();
                 const char* encoded=pa_base64_encode(cstr, strlen(cstr));                  const char* encoded=pa_base64_encode(cstr, strlen(cstr));
                 r.write_assign_lang(*new String(encoded, 0, true/*once ?param=base64(something) was needed*/));                  r.write_assign_lang(*new String(encoded, 0, true/*tainted. once ?param=base64(something) was needed*/));
         }          }
 }  }
   
   static void _escape(Request& r, MethodParams&){
           const String& src=GET_SELF(r, VString).string();
           r.write_assign_lang(src.escape(r.charsets.source()));
   }
   
   static void _unescape(Request& r, MethodParams& params){
           const String& src=params.as_string(0, PARAMETER_MUST_BE_STRING);
           if(const char* result=unescape_chars(src.cstr(), src.length(), &r.charsets.source(), true/* don't unescape '+' char */))
                   r.write_assign_lang(*new String(result));
   }
   
 // constructor  // constructor
   
 MString::MString(): Methoded("string") {  MString::MString(): Methoded("string") {
Line 727  MString::MString(): Methoded("string") { Line 747  MString::MString(): Methoded("string") {
         // ^string.base64[] << encode          // ^string.base64[] << encode
         // ^string:base64[encoded string] << decode               // ^string:base64[encoded string] << decode     
         add_native_method("base64", Method::CT_ANY, _base64, 0, 1);          add_native_method("base64", Method::CT_ANY, _base64, 0, 1);
   
           // ^string.js-escape[]
           // ^string:js-unescape[escaped%uXXXXstring]
           add_native_method("js-escape", Method::CT_ANY, _escape, 0, 0);
           add_native_method("js-unescape", Method::CT_STATIC, _unescape, 1, 1);
 }         }       

Removed from v.1.166  
changed lines
  Added in v.1.170


E-mail: