Diff for /parser3/src/main/pa_charset.C between versions 1.9 and 1.10

version 1.9, 2001/12/28 14:06:51 version 1.10, 2001/12/28 18:12:30
Line 71  static void element2case(unsigned char f Line 71  static void element2case(unsigned char f
         fcc_table[from]=to; fcc_table[to]=from;          fcc_table[from]=to; fcc_table[to]=from;
 }  }
   
 /// @test custom encodings  
 #ifdef XML  
 /*  
 template <class TType> class ENameMapFor2 : public ENameMap {  
 public:  
     // -----------------------------------------------------------------------  
     //  Constructors and Destructor  
     // -----------------------------------------------------------------------  
     ENameMapFor2(  
                 const XMLCh* const encodingName  
         , const XMLCh* const                        fromTable  
         , const XMLTransService::TransRec* const    toTable  
         , const unsigned int                        toTableSize  
                 ): ENameMap(encodingName),  
                 ffromTable(fromTable),  
                 ftoTable(toTable),  
                 ftoTableSize(toTableSize) {}  
   
     // -----------------------------------------------------------------------  
     //  Implementation of virtual factory method  
     // -----------------------------------------------------------------------  
     virtual XMLTranscoder* makeNew(const unsigned int blockSize) const {  
                 return new TType(  
                         getKey(),   
                         blockSize,  
                         ffromTable,  
                         ftoTable, ftoTableSize);  
         }  
 private:  
         const XMLCh* const                        ffromTable;  
         const XMLTransService::TransRec* const    ftoTable;  
         const unsigned int                        ftoTableSize;  
   
 private:  
     // -----------------------------------------------------------------------  
     //  Unimplemented constructors and operators  
     // -----------------------------------------------------------------------  
     ENameMapFor2();  
     ENameMapFor2(const ENameMapFor2<TType>&);  
     void operator=(const ENameMapFor2<TType>&);  
 };  
   
 class XML256TableTranscoder2 : public XML256TableTranscoder {  
 public :  
     XML256TableTranscoder2(  
         const   XMLCh* const                        encodingName  
         , const unsigned int                        blockSize  
         , const XMLCh* const                        fromTable  
         , const XMLTransService::TransRec* const    toTable  
         , const unsigned int                        toTableSize  
                 ) : XML256TableTranscoder(encodingName, blockSize, fromTable, toTable, toTableSize) {}  
   
 private:  
     XML256TableTranscoder2();  
     XML256TableTranscoder2(const XML256TableTranscoder2&);  
     void operator=(const XML256TableTranscoder2&);  
 };  
 */  
 #endif  
   
 // methods  // methods
   
 extern "C" unsigned char pcre_default_tables[]; // pcre/chartables.c  extern "C" unsigned char pcre_default_tables[]; // pcre/chartables.c
 Charset::Charset(Pool& apool, const String& aname, const String *request_file_spec): Pooled(apool),  Charset::Charset(Pool& apool, const String& aname, const String *request_file_spec): Pooled(apool),
         fname(aname) {          fname(aname) {
   
         const char *name_cstr=fname.cstr();          char *name_cstr=fname.cstr();
       for(char *c=name_cstr; *c; c++)
           *c = toupper(*c);
   
         if(request_file_spec) {          if(request_file_spec) {
                 fisUTF8=false;                  fisUTF8=false;
Line 173  void Charset::loadDefinition(const Strin Line 115  void Charset::loadDefinition(const Strin
         cstr2ctypes(pcre_tables,(const unsigned char *)"*+?{^.$|()[", ctype_meta);          cstr2ctypes(pcre_tables,(const unsigned char *)"*+?{^.$|()[", ctype_meta);
   
         // charset          // charset
         memset(fromTable, 0, sizeof(fromTable));          memset(tables.fromTable, 0, sizeof(tables.fromTable));
         toTable=(Charset_TransRec *)calloc(sizeof(Charset_TransRec)*MAX_CHARSET_UNI_CODES);          tables.toTable=(Charset_TransRec *)calloc(sizeof(Charset_TransRec)*MAX_CHARSET_UNI_CODES);
         toTableSize=0;          tables.toTableSize=0;
         // strangly vital          // strangly vital
         toTable[toTableSize].intCh=0;          tables.toTable[tables.toTableSize].intCh=0;
         toTable[toTableSize].extCh=(XMLByte)0;          tables.toTable[tables.toTableSize].extCh=(XMLByte)0;
         toTableSize++;          tables.toTableSize++;
   
         // loading text          // loading text
         char *data=file_read_text(pool(), request_file_spec);          char *data=file_read_text(pool(), request_file_spec);
Line 210  void Charset::loadDefinition(const Strin Line 152  void Charset::loadDefinition(const Strin
                         case 7:                          case 7:
                         case 8:                          case 8:
                                 // charset                                  // charset
                                 if(toTableSize>MAX_CHARSET_UNI_CODES)                                  if(tables.toTableSize>MAX_CHARSET_UNI_CODES)
                                         throw Exception(0, 0,                                          throw Exception(0, 0,
                                                 &request_file_spec,                                                  &request_file_spec,
                                                 "charset must contain not more then %d unicode values", MAX_CHARSET_UNI_CODES);                                                  "charset must contain not more then %d unicode values", MAX_CHARSET_UNI_CODES);
Line 219  void Charset::loadDefinition(const Strin Line 161  void Charset::loadDefinition(const Strin
                                 if(!unicode && column==7/*unicode1 column*/)                                  if(!unicode && column==7/*unicode1 column*/)
                                         unicode=(XMLCh)c;                                          unicode=(XMLCh)c;
                                 if(unicode) {                                  if(unicode) {
                                         if(!fromTable[c])                                          if(!tables.fromTable[c])
                                                 fromTable[c]=unicode;                                                  tables.fromTable[c]=unicode;
                                         toTable[toTableSize].intCh=unicode;                                          tables.toTable[tables.toTableSize].intCh=unicode;
                                         toTable[toTableSize].extCh=(XMLByte)c;                                          tables.toTable[tables.toTableSize].extCh=(XMLByte)c;
                                         toTableSize++;                                          tables.toTableSize++;
                                 }                                  }
                                 break;                                  break;
                         }                          }
Line 234  void Charset::loadDefinition(const Strin Line 176  void Charset::loadDefinition(const Strin
         sort_ToTable();          sort_ToTable();
 }  }
   
 #ifdef XML  
 void Charset::addEncoding(const char *name_cstr) {  
 /*  
         // addEncoding  
         XalanDOMString sencoding(name_cstr);  
         const XMLCh* const auto_encoding_cstr=sencoding.c_str();  
         int size=sizeof(XMLCh)*(sencoding.size()+1);  
         XMLCh* pool_encoding_cstr=(XMLCh*)malloc(size);  
         memcpy(pool_encoding_cstr, auto_encoding_cstr, size);  
     XMLString::upperCase(pool_encoding_cstr);  
   
     XMLPlatformUtils::fgTransService->addEncoding(  
                 pool_encoding_cstr,   
                 new ENameMapFor2<XML256TableTranscoder2>(  
                         pool_encoding_cstr  
                         , fromTable  
                         , toTable  
                         , toTableSize  
                 ));  
 */  
 }  
   
 void Charset::initTranscoder(const String *source, const char *name_cstr) {  
         transcoder=xmlFindCharEncodingHandler(name_cstr);  
         if(!transcoder)  
                 throw Exception(0, 0,  
                         source,  
                         "unsupported encoding");  
 }  
 #endif  
   
 static int sort_cmp_Trans_rec_intCh(const void *a, const void *b) {  static int sort_cmp_Trans_rec_intCh(const void *a, const void *b) {
         return           return 
                 static_cast<const Charset_TransRec *>(a)->intCh-                  static_cast<const Charset_TransRec *>(a)->intCh-
Line 272  static int sort_cmp_Trans_rec_intCh(cons Line 183  static int sort_cmp_Trans_rec_intCh(cons
 }  }
   
 void Charset::sort_ToTable() {  void Charset::sort_ToTable() {
         _qsort(toTable, toTableSize, sizeof(*toTable),           _qsort(tables.toTable, tables.toTableSize, sizeof(*tables.toTable), 
                 sort_cmp_Trans_rec_intCh);                  sort_cmp_Trans_rec_intCh);
         //FILE *f=fopen("c:\\temp\\a", "wb");          //FILE *f=fopen("c:\\temp\\a", "wb");
         //fwrite(toTable, toTableSize, sizeof(*toTable), f);          //fwrite(tables.toTable, tables.toTableSize, sizeof(*tables.toTable), f);
         //fclose(f);          //fclose(f);
 }  }
   
 XMLByte Charset::xlatOneTo(const XMLCh toXlat) const {  static XMLByte xlatOneTo(const XMLCh toXlat,
                                                    const Charset::Tables& tables) {
     unsigned int    lowOfs = 0;      unsigned int    lowOfs = 0;
     unsigned int    hiOfs = toTableSize - 1;      unsigned int    hiOfs = tables.toTableSize - 1;
     XMLByte         curByte = 0;      XMLByte         curByte = 0;
     do {      do {
         // Calc the mid point of the low and high offset.          // Calc the mid point of the low and high offset.
Line 290  XMLByte Charset::xlatOneTo(const XMLCh t Line 202  XMLByte Charset::xlatOneTo(const XMLCh t
         //  If our test char is greater than the mid point char, then          //  If our test char is greater than the mid point char, then
         //  we move up to the upper half. Else we move to the lower          //  we move up to the upper half. Else we move to the lower
         //  half. If its equal, then its our guy.          //  half. If its equal, then its our guy.
         if(toXlat>toTable[midOfs].intCh)          if(toXlat>tables.toTable[midOfs].intCh)
             lowOfs = midOfs;              lowOfs = midOfs;
                 else if(toXlat<toTable[midOfs].intCh)                  else if(toXlat<tables.toTable[midOfs].intCh)
                         hiOfs = midOfs;                          hiOfs = midOfs;
                 else                  else
                         return toTable[midOfs].extCh;                          return tables.toTable[midOfs].extCh;
         } while(lowOfs+1<hiOfs);          } while(lowOfs+1<hiOfs);
   
     return '?';      return '?';
Line 375  static const XMLByte gFirstByteMark[7] = Line 287  static const XMLByte gFirstByteMark[7] =
     0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC      0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC
 };  };
   
 /// @todo not so memory-hungry with prescan  static size_t transcodeToUTF8(
 void Charset::transcodeToUTF8(Pool& pool,                                                          const void *source_body, size_t source_content_length,
                                                                  const void *source_body, size_t source_content_length,                                                          XMLByte *dest_body, size_t dest_buf_length,
                                                                  const void *& adest_body, size_t& adest_content_length) const {                                                          const Charset::Tables& tables) {
           
         size_t dest_content_length=0;  
         XMLByte *dest_body=(XMLByte*)pool.malloc(source_content_length*6/*so that surly enough*/);  
   
         const XMLByte* srcPtr=(const XMLByte*)source_body;          const XMLByte* srcPtr=(const XMLByte*)source_body;
         const XMLByte* srcEnd=(const XMLByte*)source_body+source_content_length;          const XMLByte* srcEnd=(const XMLByte*)source_body+source_content_length;
         XMLByte* outPtr=dest_body;          XMLByte* outPtr=dest_body;
           XMLByte* outEnd=dest_body+dest_buf_length;
   
     while(srcPtr<srcEnd) {      while(srcPtr<srcEnd) {
         uint curVal = fromTable[*srcPtr];          uint curVal = tables.fromTable[*srcPtr];
                 if(!curVal) {                  if(!curVal) {
             // use the replacement character              // use the replacement character
             *outPtr++= '?';              *outPtr++= '?';
Line 417  void Charset::transcodeToUTF8(Pool& pool Line 326  void Charset::transcodeToUTF8(Pool& pool
             continue;              continue;
         }          }
   
         //  If we cannot fully get this char into the output buffer,          //  If we cannot fully get this char into the output buffer
                 // never          if (outPtr + encodedBytes > outEnd)
               break;
   
         // We can do it, so update the source index          // We can do it, so update the source index
         srcPtr++;          srcPtr++;
Line 444  void Charset::transcodeToUTF8(Pool& pool Line 354  void Charset::transcodeToUTF8(Pool& pool
         outPtr+= encodedBytes;          outPtr+= encodedBytes;
     }      }
   
         // return          // eaten
         adest_body=dest_body;          return outPtr-dest_body;
         adest_content_length=outPtr-dest_body;  
 }  }
 void Charset::transcodeFromUTF8(Pool& pool,  static size_t transcodeFromUTF8(
                                                                    const void *source_body, size_t source_content_length,                                                                     const void *source_body, size_t source_content_length,
                                                                    const void *& adest_body, size_t& adest_content_length) const {                                                                     XMLByte* dest_body, size_t dest_buf_length,
         size_t dest_content_length=0;                                                                          const Charset::Tables& tables) {
         XMLByte *dest_body=(XMLByte*)pool.malloc(source_content_length/*surly enough*/);  
   
         const XMLByte* srcPtr=(const XMLByte*)source_body;          const XMLByte* srcPtr=(const XMLByte*)source_body;
         const XMLByte* srcEnd=(const XMLByte*)source_body+source_content_length;          const XMLByte* srcEnd=(const XMLByte*)source_body+source_content_length;
         XMLByte* outPtr=dest_body;          XMLByte* outPtr=dest_body;
           XMLByte* outEnd=dest_body+dest_buf_length;
   
     //  We now loop until we either run out of input data      //  We now loop until we either run out of input data, or room to store
     while(srcPtr<srcEnd) {      while ((srcPtr < srcEnd) && (outPtr < outEnd)) {
         // Get the next leading byte out          // Get the next leading byte out
         const XMLByte firstByte = *srcPtr;          const XMLByte firstByte = *srcPtr;
   
Line 501  void Charset::transcodeFromUTF8(Pool& po Line 409  void Charset::transcodeFromUTF8(Pool& po
         //  fail [*encode it as a surrogate pair. If its not valid, use the          //  fail [*encode it as a surrogate pair. If its not valid, use the
         //  replacement char.*]          //  replacement char.*]
         if(!(tmpVal & 0xFFFF0000))          if(!(tmpVal & 0xFFFF0000))
             *outPtr++= xlatOneTo(tmpVal);              *outPtr++= xlatOneTo(tmpVal, tables);
                 else                  else
                         throw Exception(0, 0,                          throw Exception(0, 0,
                                 0,                                  0,
                                 "transcodeFromUTF8 error: too big tmpVal(0x%08X)", tmpVal);                                  "transcodeFromUTF8 error: too big tmpVal(0x%08X)", tmpVal);
         }          }
   
           // eaten
           return outPtr-dest_body;
   }
   
   /// @todo not so memory-hungry with prescan
   /// @test buf overflow
   void Charset::transcodeToUTF8(Pool& pool,
                                                                    const void *source_body, size_t source_content_length,
                                                                    const void *& adest_body, size_t& adest_content_length) const {
           size_t dest_buf_length=source_content_length*6/*so that surly enough*/;
           XMLByte *dest_body=(XMLByte*)pool.malloc(dest_buf_length);
   
           size_t dest_content_length=::transcodeToUTF8(
                   source_body, source_content_length,
                   dest_body, dest_buf_length,
                   tables);
           /*if(dest_content_length<dest_buf_length)
                   throw(0, 0,
                           0,
                           "Charset::transcodeToUTF8 error");*/
   
           // return
           adest_body=dest_body;
           adest_content_length=dest_content_length;
   }
   /// @test buf overflow
   void Charset::transcodeFromUTF8(Pool& pool,
                                                                      const void *source_body, size_t source_content_length,
                                                                      const void *& adest_body, size_t& adest_content_length) const {
           size_t dest_buf_length=source_content_length/*surly enough*/;
           XMLByte *dest_body=(XMLByte*)pool.malloc(dest_buf_length);
   
           size_t dest_content_length=::transcodeFromUTF8(
                   source_body, source_content_length,
                   dest_body, dest_buf_length,
                   tables);
   /*      if(dest_content_length!=dest_buf_length)
                   throw(0, 0,
                           0,
                           "Charset::transcodeToUTF8 error");*/
   
   
         // return          // return
         adest_body=dest_body;          adest_body=dest_body;
         adest_content_length=outPtr-dest_body;          adest_content_length=dest_content_length;
 }  }
   
 /// transcode using both charsets  /// transcode using both charsets
Line 529  void Charset::transcodeToCharset(Pool& p Line 479  void Charset::transcodeToCharset(Pool& p
                 const XMLByte* srcEnd=(const XMLByte*)source_body+source_content_length;                  const XMLByte* srcEnd=(const XMLByte*)source_body+source_content_length;
   
                 for(XMLByte* outPtr=dest_body; srcPtr<srcEnd; srcPtr++) {                  for(XMLByte* outPtr=dest_body; srcPtr<srcEnd; srcPtr++) {
                         XMLCh curVal = fromTable[*srcPtr];                          XMLCh curVal = tables.fromTable[*srcPtr];
                         if(curVal)                           if(curVal) 
                                 *outPtr++=dest_charset.xlatOneTo(curVal);                                  *outPtr++=xlatOneTo(curVal, dest_charset.tables);
                         else {                          else {
                                 // use the replacement character                                  // use the replacement character
                                 *outPtr++= '?';                                  *outPtr++= '?';
Line 544  void Charset::transcodeToCharset(Pool& p Line 494  void Charset::transcodeToCharset(Pool& p
 }                         }                       
   
 #ifdef XML  #ifdef XML
   static int         xml256CharEncodingInputFunc     (
                                                                                                           unsigned char *out,
                                                                                                           int *outlen,
                                                                                                           const unsigned char *in,
                                                                                                           int *inlen, 
                                                                                                           void *info) {
           return transcodeToUTF8(
                                                           in, *inlen,
                                                           out, *(unsigned int*)outlen,
                                                           *(const Charset::Tables *)info);
   }
   
   static int         xml256CharEncodingOutputFunc    (
                                                                                                           unsigned char *out,
                                                                                                           int *outlen,
                                                                                                           const unsigned char *in,
                                                                                                           int *inlen, 
                                                                                                           void *info) {
           return transcodeFromUTF8(
                                                           in, *inlen,
                                                           out, *outlen,
                                                           *(const Charset::Tables *)info);
   }
   
   
   void Charset::addEncoding(char *name_cstr) {
           xmlCharEncodingHandler *handler=
                   (xmlCharEncodingHandler *)malloc(sizeof(xmlCharEncodingHandler));
           handler->name=name_cstr;
           handler->input=xml256CharEncodingInputFunc; handler->inputInfo=&tables;
           handler->output=xml256CharEncodingOutputFunc; handler->outputInfo=&tables;
           
           xmlRegisterCharEncodingHandler(handler);
   }
   
   void Charset::initTranscoder(const String *source, const char *name_cstr) {
           transcoder=xmlFindCharEncodingHandler(name_cstr);
           if(!transcoder)
                   throw Exception(0, 0,
                           source,
                           "unsupported encoding");
   }
   
 const char *Charset::transcode_cstr(GdomeDOMString *s) {   const char *Charset::transcode_cstr(GdomeDOMString *s) { 
         if(!transcoder)          if(!transcoder)
                 throw Exception(0, 0,                  throw Exception(0, 0,
Line 556  const char *Charset::transcode_cstr(Gdom Line 549  const char *Charset::transcode_cstr(Gdom
                   
         int size=transcoder->output(          int size=transcoder->output(
                 (unsigned char*)out, &outlen,                  (unsigned char*)out, &outlen,
                 (const unsigned char*)s->str, &inlen);                  (const unsigned char*)s->str, &inlen,
                   transcoder->outputInfo);
         if(size<0)          if(size<0)
                 throw Exception(0, 0,                  throw Exception(0, 0,
                         0,                          0,
Line 580  GdomeDOMString *Charset::transcode_buf(c Line 574  GdomeDOMString *Charset::transcode_buf(c
         unsigned char *out=(unsigned char*)malloc(outlen*sizeof(unsigned char));          unsigned char *out=(unsigned char*)malloc(outlen*sizeof(unsigned char));
         int size=transcoder->input(          int size=transcoder->input(
                 out, &outlen,                  out, &outlen,
                 (const unsigned char *)buf,  (int *)&buf_size);                  (const unsigned char *)buf,  (int *)&buf_size,
                   transcoder->inputInfo);
         if(size<0)          if(size<0)
                 throw Exception(0, 0,                  throw Exception(0, 0,
                         0,                          0,

Removed from v.1.9  
changed lines
  Added in v.1.10


E-mail: