--- parser3/src/main/pa_string.C 2003/11/20 17:40:06 1.189 +++ parser3/src/main/pa_string.C 2003/12/02 11:20:28 1.191 @@ -5,7 +5,7 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char * const IDENT_STRING_C="$Date: 2003/11/20 17:40:06 $"; +static const char * const IDENT_STRING_C="$Date: 2003/12/02 11:20:28 $"; #include "pcre.h" @@ -410,7 +410,7 @@ String& String::change_case(Charset& sou } unsigned char index; - for(const char* current=new_cstr; index=(unsigned char)*current; current++) { + for(const char* current=new_cstr; (index=(unsigned char)*current); current++) { unsigned char c=a[index]; if(b) c=b[c]; @@ -524,8 +524,8 @@ static int serialize_body_piece(const ch }; static int serialize_lang_piece(char alang, size_t asize, char** cur) { // lang - memcpy(*cur, &alang, sizeof(alang)); *cur+=sizeof(alang); - // length + **cur=alang; (*cur)++; + // length [WARNING: not cast, addresses must be %4=0 on sparc] memcpy(*cur, &asize, sizeof(asize)); *cur+=sizeof(asize); return 0; // 0=continue @@ -542,7 +542,7 @@ String::Cm String::serialize(size_t prol // 1: prolog char *cur=result.str+prolog_length; - // 2: langs.count + // 2: langs.count [WARNING: not cast, addresses must be %4=0 on sparc] memcpy(cur, &fragments_count, sizeof(fragments_count)); cur+=sizeof(fragments_count); // 3: lang info langs.for_each(body, serialize_lang_piece, &cur); @@ -563,22 +563,30 @@ bool String::deserialize(size_t prolog_l const char* cur=(const char* )buf+prolog_length; // 2: langs.count - if(buf_length(cur); cur+=sizeof(size_t); - buf_length-=sizeof(size_t); + // [WARNING: not cast, addresses must be %4=0 on sparc] + memcpy(&fragments_count, cur, sizeof(fragments_count)); cur+=sizeof(fragments_count); + buf_length-=sizeof(fragments_count); if(fragments_count) { // 3: lang info size_t total_length=0; for(size_t f=0; f(cur); cur+=sizeof(char); - size_t fragment_length=*reinterpret_cast(cur); cur+=sizeof(size_t); - langs.append(total_length, lang, fragment_length); + // lang + lang=*cur++; + // length [WARNING: not cast, addresses must be %4=0 on sparc] + memcpy(&fragment_length, cur, sizeof(fragment_length)); cur+=sizeof(fragment_length); + + // uchar needed to prevent propagating 0x80 bit to upper bytes + langs.append(total_length, (String::Language)(uchar)lang, fragment_length); total_length+=fragment_length; buf_length-=piece_length;