--- parser3/src/include/pa_string.h 2004/02/11 15:33:14 1.156 +++ parser3/src/include/pa_string.h 2004/05/24 10:45:08 1.161 @@ -8,7 +8,7 @@ #ifndef PA_STRING_H #define PA_STRING_H -static const char * const IDENT_STRING_H="$Date: 2004/02/11 15:33:14 $"; +static const char * const IDENT_STRING_H="$Date: 2004/05/24 10:45:08 $"; // includes @@ -99,11 +99,24 @@ public: L_OPTIMIZE_BIT = 0x80 ///< flag, requiring cstr whitespace optimization }; + enum Trim_kind { + TRIM_BOTH, + TRIM_START, + TRIM_END + }; + union Languages { struct { +#ifdef PA_LITTLE_ENDIAN Language lang:8; int is_not_just_lang:sizeof(CORD)*8-8; +#elif defined(PA_BIG_ENDIAN) + int is_not_just_lang:sizeof(CORD)*8-8; + Language lang:8; +#else +# error word endianness not determined for some obscure reason +#endif } opt; CORD langs; @@ -111,16 +124,16 @@ public: CORD make_langs(C current) const { return opt.is_not_just_lang? langs - :CORD_chars((char)opt.lang, get_length(current)); + :CORD_chars_block((char)opt.lang, get_length(current)); } CORD make_langs(size_t aoffset, size_t alength) const { return opt.is_not_just_lang? CORD_substr(langs, aoffset, alength) - :CORD_chars((char)opt.lang, alength); + :CORD_chars_block((char)opt.lang, alength); } - /// appending when 'langs' already contain something [simple cases hanled elsewhere] + /// appending when 'langs' already contain something [simple cases handled elsewhere] template void append(C current, const CORD to_nonempty_target_langs) { @@ -132,7 +145,7 @@ public: size_t current_size=get_length(current); assert(current_size); langs=CORD_cat( - CORD_chars((char)opt.lang, current_size), // first piece [making from just 'lang'] + CORD_chars_block((char)opt.lang, current_size), // first piece [making from just 'lang'] to_nonempty_target_langs); // new piece } } @@ -162,7 +175,7 @@ public: return; } - append(current, CORD_chars((char)alang, asize)); + append(current, CORD_chars_block((char)alang, asize)); } /// MUST be called exactly prior to modification of current [uses it's length] @@ -315,11 +328,17 @@ public: return CORD_chr(body, offset, c); } - template void for_each( + template int for_each( + int (*f)(char c, I), + I info) const { + return CORD_iter(body, (CORD_iter_fn)f, (void*)info); + } + + template int for_each( int (*f1)(char c, I), int (*f2)(const char* s, I), I info) const { - CORD_iter5(body, 0, (CORD_iter_fn)f1, (CORD_batched_iter_fn)f2, info); + return CORD_iter5(body, 0, (CORD_iter_fn)f1, (CORD_batched_iter_fn)f2, info); } void set_pos(CORD_pos& pos, size_t index) const { CORD_set_pos(pos, body, index); } @@ -327,12 +346,17 @@ public: /*Body normalize() const { return Body(CORD_balance(body)); }*/ + + /// @returns this or 0 or mid. if returns this or 0 out_* are not filled + Body trim(Trim_kind kind=TRIM_BOTH, const char* chars=0, + size_t* out_start=0, size_t* out_length=0) const; }; struct C { const char *str; size_t length; operator const char *() { return str; } + C(): str(0), length(0) {} C(const char *astr, size_t asize): str(astr), length(asize) {} }; @@ -340,6 +364,7 @@ public: char *str; size_t length; //operator char *() { return str; } + Cm(): str(0), length(0) {} Cm(char *astr, size_t asize): str(astr), length(asize) {} }; @@ -481,6 +506,7 @@ public: String& change_case(Charset& source_charset, Change_case_kind kind) const; const String& replace(const Dictionary& dict) const; + const String& trim(Trim_kind kind=TRIM_BOTH, const char* chars=0) const; double as_double() const { return pa_atod(cstr(), this); } int as_int() const { return pa_atoi(cstr(), this); }