--- parser3/src/include/pa_string.h 2010/09/16 23:34:26 1.199 +++ parser3/src/include/pa_string.h 2013/04/21 21:59:07 1.205 @@ -1,14 +1,14 @@ /** @file Parser: string class decl. - Copyright (c) 2001-2009 ArtLebedev Group (http://www.artlebedev.com) + Copyright (c) 2001-2012 Art. Lebedev Studio (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) */ #ifndef PA_STRING_H #define PA_STRING_H -static const char * const IDENT_STRING_H="$Date: 2010/09/16 23:34:26 $"; +#define IDENT_PA_STRING_H "$Id: pa_string.h,v 1.205 2013/04/21 21:59:07 moko Exp $" // includes #include "pa_types.h" @@ -54,6 +54,7 @@ class VRegex; int pa_atoi(const char* str, const String* problem_source=0); double pa_atod(const char* str, const String* problem_source=0); +unsigned int pa_atoui(const char *str, int base, const String* problem_source=0); /// this is result of pos functions which mean that substr were not found #define STRING_NOT_FOUND ((size_t)-1) @@ -108,7 +109,6 @@ public: L_REGEX='R', ///< RegExp L_JSON='S', ///< JSON code L_HTTP_COOKIE='C', ///< cookies encoded as %uXXXX for compartibility with js functions encode/decode - L_FILE_POST='f', ///< temporary escaping zero-char L_PARSER_CODE='p', ///< ^process body // READ WARNING ABOVE BEFORE ADDING ANYTHING L_OPTIMIZE_BIT = 0x80 ///< flag, requiring cstr whitespace optimization @@ -436,6 +436,10 @@ public: return CORD_chr(body, offset, c); } + size_t strrpbrk(const char* chars, size_t left, size_t right) const; + + size_t rskipchars(const char* chars, size_t left, size_t right) const; + template int for_each(int (*f)(char c, I), I info) const { return CORD_iter(body, (CORD_iter_fn)f, (void*)info); @@ -555,6 +559,14 @@ public: const char* untaint_and_transcode_cstr(Language lang, const Request_charsets *charsets) const; + bool is_not_just_lang() const { + return langs.opt.is_not_just_lang !=0; + } + + Language just_lang() const { + return langs.opt.lang; + } + /// puts pieces to buf Cm serialize(size_t prolog_size) const; /// appends pieces from buf to self @@ -597,11 +609,14 @@ public: return *this; } - /// extracts first char of a string, if any char first_char() const { return is_empty()?0:body.fetch(0); } + char last_char() const { + return is_empty()?0:body.fetch(body.length()-1); + } + bool operator < (const String& src) const { return body (const String& src) const { return body>src.body; } bool operator <= (const String& src) const { return body<=src.body; } @@ -631,6 +646,20 @@ public: const String& substr, size_t this_offset=0, Language lang=L_UNSPECIFIED) const; + size_t strrpbrk(const char* chars, size_t left=0) const { + return (length()) ? body.strrpbrk(chars, left, length()-1) : STRING_NOT_FOUND; + } + size_t strrpbrk(const char* chars, size_t left, size_t right) const { + return body.strrpbrk(chars, left, right); + } + + size_t rskipchars(const char* chars, size_t left=0) const { + return (length()) ? body.rskipchars(chars, left, length()-1) : STRING_NOT_FOUND; + } + size_t rskipchars(const char* chars, size_t left, size_t right) const { + return body.rskipchars(chars, left, right); + } + void split(ArrayString& result, size_t& pos_after, const char* delim,