--- parser3/src/main/pa_string.C 2004/07/28 13:43:58 1.199 +++ parser3/src/main/pa_string.C 2004/10/07 09:22:01 1.201 @@ -5,7 +5,7 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char * const IDENT_STRING_C="$Date: 2004/07/28 13:43:58 $"; +static const char * const IDENT_STRING_C="$Date: 2004/10/07 09:22:01 $"; #include "pcre.h" @@ -28,6 +28,13 @@ int pa_atoi(const char* str, const Strin int result; char *error_pos; + bool negative=false; + if(str[0]=='-') { + negative=true; + str++; + } else if(str[0]=='+') { + str++; + } // 0xABC if(str[0]=='0') if(str[1]=='x' || str[1]=='X') @@ -39,6 +46,8 @@ int pa_atoi(const char* str, const Strin } else result=(int)strtol(str, &error_pos, 0); + if(negative) + result=-result; while(char c=*error_pos++) if(!isspace((unsigned char)c)) @@ -60,14 +69,26 @@ double pa_atod(const char* str, const St double result; char *error_pos; + bool negative=false; + if(str[0]=='-') { + negative=true; + str++; + } else if(str[0]=='+') { + str++; + } // 0xABC if(str[0]=='0') if(str[1]=='x' || str[1]=='X') result=(double)(unsigned long)strtol(str, &error_pos, 0); - else - result=(double)strtod(str+1/*skip leading 0*/, &error_pos); + else { + // skip leading 0000, to disable octal interpretation + do str++; while(*str=='0'); + result=(double)strtod(str, &error_pos); + } else result=(double)strtod(str, &error_pos); + if(negative) + result=-result; while(char c=*error_pos++) if(!isspace((unsigned char)c)) @@ -274,8 +295,6 @@ String& String::mid(size_t substr_begin, // next: letters themselves result.body=body.mid(substr_begin, substr_length); -// SAPI::log("piece of '%s' from %d to %d is '%s'", - //cstr(), substr_begin, substr_end, result.cstr()); ASSERT_STRING_INVARIANT(result); return result; } @@ -665,12 +684,22 @@ bool String::deserialize(size_t prolog_l const char* String::Body::v() const { return CORD_to_const_char_star(body); } +void String::Body::dump() const { + CORD_dump(body); +} + const char* String::Languages::v() const { if(opt.is_not_just_lang) return CORD_to_const_char_star(langs); else return (const char*)&langs; } +void String::Languages::dump() const { + if(opt.is_not_just_lang) + CORD_dump(langs); + else + puts((const char*)&langs); +} const char* String::v() const { const uint LIMIT_VIEW=20; char* buf=(char*)malloc(MAX_STRING); @@ -685,7 +714,10 @@ const char* String::v() const { return buf; } - +void String::dump() const { + body.dump(); + langs.dump(); +} const String& String::trim(String::Trim_kind kind, const char* chars) const { if(!length()) return *this;