--- parser3/src/main/pa_string.C 2016/09/05 22:06:13 1.255 +++ parser3/src/main/pa_string.C 2019/12/05 22:54:09 1.261 @@ -1,7 +1,7 @@ /** @file Parser: string class. @see untalength_t.C. - Copyright (c) 2001-2015 Art. Lebedev Studio (http://www.artlebedev.com) + Copyright (c) 2001-2017 Art. Lebedev Studio (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) */ @@ -12,14 +12,13 @@ #include "pa_charset.h" #include "pa_vregex.h" -#ifndef ULLONG_MAX -#define ULLONG_MAX 18446744073709551615ULL -#endif - -volatile const char * IDENT_PA_STRING_C="$Id: pa_string.C,v 1.255 2016/09/05 22:06:13 moko Exp $" IDENT_PA_STRING_H; +volatile const char * IDENT_PA_STRING_C="$Id: pa_string.C,v 1.261 2019/12/05 22:54:09 moko Exp $" IDENT_PA_STRING_H; const String String::Empty; +#define COMPILE_ASSERT(x) extern int assert_checker[(int)(x) ? 1 : -1] +COMPILE_ASSERT(sizeof(String::Languages) == sizeof(CORD)); + // pa_atoui is based on Manuel Novoa III _strto_l for uClibc template inline T pa_ato_any(const char *str, int base, const String* problem_source,const T max){ @@ -601,46 +600,40 @@ size_t String::pos(Charset& charset, con } } -void String::split(ArrayString& result, size_t& pos_after, const char* delim, Language lang, int limit) const { +void String::split(ArrayString& result, size_t pos_after, const char* delim, Language lang) const { if(is_empty()) return; size_t self_length=length(); if(size_t delim_length=strlen(delim)) { size_t pos_before; // while we have 'delim'... - for(; (pos_before=pos(delim, pos_after, lang))!=STRING_NOT_FOUND && limit; limit--) { + while((pos_before=pos(delim, pos_after, lang))!=STRING_NOT_FOUND) { result+=&mid(pos_after, pos_before); pos_after=pos_before+delim_length; } // last piece - if(pos_afterLIMIT_VIEW?"...":"", - strlen(body_view), body_view - ); - - return buf; -} - void String::dump() const { body.dump(); langs.dump(); } +static char *n_chars(char c, size_t length){ + char *result=(char *)pa_malloc_atomic(length+1); + memset(result, c, length); + result[length] = '\0'; + return result; +} + +char* String::visualize_langs() const { + return is_not_just_lang() ? pa_strdup(langs.visualize()) : n_chars((char)just_lang(), length()); +} + const String& String::trim(String::Trim_kind kind, const char* chars, Charset* source_charset) const { if(is_empty()) return *this;