--- parser3/src/include/pa_string.h 2024/03/11 21:15:32 1.231 +++ parser3/src/include/pa_string.h 2026/09/30 01:10:30 1.242 @@ -1,17 +1,18 @@ /** @file Parser: string class decl. - Copyright (c) 2001-2023 Art. Lebedev Studio (http://www.artlebedev.com) + Copyright (c) 2001-2026 Art. Lebedev Studio (https://www.artlebedev.com) Authors: Konstantin Morshnev , Alexandr Petrosian */ #ifndef PA_STRING_H #define PA_STRING_H -#define IDENT_PA_STRING_H "$Id: pa_string.h,v 1.231 2024/03/11 21:15:32 moko Exp $" +#define IDENT_PA_STRING_H "$Id: pa_string.h,v 1.242 2026/09/30 01:10:30 moko Exp $" // includes #include "pa_types.h" +#include "pa_int.h" #include "pa_array.h" extern "C" { // cord's author forgot to do that @@ -56,20 +57,21 @@ class ArrayString : public Array=length()) // CORD_rchr does not check that [and ABORT's in that case] + return STRING_NOT_FOUND; + + return CORD_rchr(body, right, c); + } size_t strrpbrk(const char* chars, size_t left, size_t right) const; @@ -646,17 +653,14 @@ public: String& mid(size_t substr_begin, size_t substr_end) const; String& mid(Charset& charset, size_t from, size_t to, size_t helper_length=0) const; - /** - ignore lang if it's L_UNSPECIFIED - but when specified: look for substring that lies in ONE fragment in THAT lang - @return position of substr in string, -1 means "not found" [const char* version] - */ - size_t pos(const Body substr, size_t this_offset=0, Language lang=L_UNSPECIFIED) const; - /// String version of @see pos(const char*, int, Language) - size_t pos(const String& substr, size_t this_offset=0, Language lang=L_UNSPECIFIED) const; - size_t pos(char c, size_t this_offset=0) const { - return body.pos(c, this_offset); - } + /// return position of substr in string, -1 means "not found" [const char* version] + size_t pos(const char* substr, size_t this_offset=0) const { return body.pos(substr, this_offset); } + size_t pos(const Body substr, size_t this_offset=0) const { return body.pos(substr, this_offset); } + size_t pos(const String& substr, size_t this_offset=0) const { return body.pos(substr.body, this_offset); } + size_t pos(char c, size_t this_offset=0) const { return body.pos(c, this_offset); } + /// ignore lang if it's L_UNSPECIFIED, otherwise look for substring that lies in ONE fragment in THAT lang + size_t pos(const Body substr, size_t this_offset, Language lang) const; + size_t pos(const String& substr, size_t this_offset, Language lang) const; size_t pos(Charset& charset, const String& substr, size_t this_offset=0, Language lang=L_UNSPECIFIED) const; size_t strrpbrk(const char* chars, size_t left=0) const { @@ -665,6 +669,12 @@ public: size_t strrpbrk(const char* chars, size_t left, size_t right) const { return body.strrpbrk(chars, left, right); } + size_t strrchr(char c) const { + return (length()) ? body.strrchr(c, length()-1) : STRING_NOT_FOUND; + } + size_t strrchr(char c, size_t right) const { + return body.strrchr(c, right); + } size_t rskipchars(const char* chars, size_t left=0) const { return (length()) ? body.rskipchars(chars, left, length()-1) : STRING_NOT_FOUND; @@ -697,7 +707,8 @@ public: const String& trim(Trim_kind kind=TRIM_BOTH, const char* chars=0, Charset* source_charset=0) const; double as_double() const { return pa_atod(cstr(), this); } int as_int() const { return pa_atoi(cstr(), 0, this); } - bool as_bool() const { return as_int()!=0; } + pa_wint as_wint() const { return pa_atowi(cstr(), 0, this); } + bool as_bool() const { return as_wint()!=0; } const String& escape(Charset& source_charset) const; private: //disabled