Changeset 160 for trunk/src/byteplex.c


Ignore:
Timestamp:
Jun 20, 2008, 3:30:40 PM (11 years ago)
Author:
lindanl
Message:

Restructured character set architecture; StringPool? in symbol table.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/byteplex.c

    r151 r160  
    325325        return b;
    326326}
     327
     328template <>
     329int X8_Buffer<EBCDIC>::UTF8_Length(int name_pos, int lgth){
     330        int u8_lgth = 0;
     331        for (int i = name_pos; i < name_pos+lgth; i++) {
     332                u8_lgth += /*TEMPORARY - NEED TO USE A TABLE FOR LOOKUP*/ 2;
     333        }
     334        return u8_lgth;
     335}
     336
     337template <>
     338int X8_Buffer<ASCII>::UTF8_Length(int name_pos, int lgth){
     339        int u8_lgth = 0;
     340        for (int i = name_pos; i < name_pos+lgth; i++) {
     341                if (((unsigned char *)x8data)[i] < 0x80) u8_lgth += 1;
     342                else u8_lgth += /*TEMPORARY - NEED TO USE A TABLE FOR LOOKUP*/ 1;
     343        }
     344        return u8_lgth;
     345}
     346
     347int UTF8_Buffer::UTF8_Length(int name_pos, int lgth){
     348        return lgth;
     349}
     350
     351int U16_Buffer::UTF8_Length(int name_pos, int lgth){
     352        int u8_lgth = 0;
     353        for (int i = name_pos; i < name_pos+lgth; i++) {
     354                if (((unsigned char *)x8data)[i] < 0x80) u8_lgth += 1;
     355                else if(((unsigned char *)x16hi)[i]<=0x7 || (((unsigned char *)x16hi)[i] >= 0xD8 &&((unsigned char *)x16hi)[i]<= 0xDF))
     356                        u8_lgth += 2;
     357                else
     358                        u8_lgth += 3;
     359        }
     360        return u8_lgth;
     361}
     362
     363int U32_Buffer::UTF8_Length(int name_pos, int lgth){
     364        int u8_lgth = 0;
     365        unsigned char * u32hl = (unsigned char *) x32hl;
     366        unsigned char * u32lh = (unsigned char *) x32lh;
     367        for (int i = name_pos; i < name_pos+lgth; i++) {
     368                if (((unsigned char *)x8data)[i] < 0x80)  {
     369                        u8_lgth += 1;
     370                }
     371                else if(u32hl[i] > 0)
     372                        u8_lgth += 4;
     373                else if(u32lh[i]<=0x7)
     374                        u8_lgth += 2;
     375                else
     376                        u8_lgth += 3;
     377        }
     378        return u8_lgth;
     379}
     380
     381template <>
     382void X8_Buffer<ASCII>::to_UTF8(int name_pos, int lgth, char * u8_ptr){
     383        memcpy(u8_ptr, &((char *)x8data)[name_pos], lgth);
     384        u8_ptr[lgth] = '\0';
     385//      u8_ptr = copy_name(&((char *)x8data)[name_pos], lgth);
     386}
     387
     388template <>
     389void X8_Buffer<EBCDIC>::to_UTF8(int name_pos, int lgth, char * u8_ptr){
     390       
     391}
     392void U16_Buffer::to_UTF8(int name_pos, int lgth, char * u8_ptr){
     393        int u8_lgth = 0;
     394        unsigned char * u16h = (unsigned char *) x16hi;
     395        unsigned char * u16l = (unsigned char *) x16lo;
     396        for (int i = name_pos; i < name_pos+lgth; i++) {
     397                if (((unsigned char *)x8data)[i] < 0x80) {
     398                        u8_ptr[u8_lgth] = ((unsigned char *)x8data)[i];
     399                        u8_lgth += 1;
     400                }
     401                else if (u16h[i]<=0x7) {
     402                        u8_ptr[u8_lgth] = 0xC0 + (u16h[i] << 2) + (u16l[i] >> 6);
     403                        u8_ptr[u8_lgth+1] = 0x80 + (u16l[i] & 0x3F);
     404                        u8_lgth += 2;
     405                }
     406                else if ((u16h[i] >= 0xD8) && (u16h[i]<= 0xDB)){
     407                        char temp =  ((u16h[i] & 0x03) << 2) + (u16l[i] >> 6) + 1;
     408                        u8_ptr[u8_lgth] = 0xF0 + (temp >> 2);
     409                        u8_ptr[u8_lgth+1] = 0x80 + ((temp & 0x03) << 4) + ((u16l[i] & 0x3F) >> 2);
     410                        u8_ptr[u8_lgth+2] = 0x80 + ((u16l[i] & 0x03) << 4) + ((u16h[i+1] & 0x03) << 2) + (u16l[i+1] >> 6);
     411                        u8_ptr[u8_lgth+3] = 0x80 + (u16l[i+1] & 0x3F);
     412                        i++;
     413                        u8_lgth += 4;
     414                }
     415                else{
     416                        u8_ptr[u8_lgth] = 0xE0 + (u16h[i] >> 4);
     417                        u8_ptr[u8_lgth+1] = 0x80 + ((u16h[i] & 0x0F) << 2) + (u16l[i] >> 6);
     418                        u8_ptr[u8_lgth+2] = 0x80 + (u16l[i] & 0x3F);
     419                        u8_lgth += 3;
     420                }
     421        }
     422        u8_ptr[u8_lgth] = '\0';
     423}
     424
     425
     426
     427void U32_Buffer::to_UTF8(int name_pos, int lgth, char * u8_ptr){
     428        int u8_lgth = 0;
     429        unsigned char * u32hl = (unsigned char *) x32hl;
     430        unsigned char * u32lh = (unsigned char *) x32lh;
     431        unsigned char * u32ll = (unsigned char *) x32ll;
     432        for (int i = name_pos; i < name_pos+lgth; i++) {
     433                if (((unsigned char *)x8data)[i] < 0x80)  {
     434                        u8_ptr[u8_lgth] = ((unsigned char *)x8data)[i];
     435                        u8_lgth += 1;
     436                }
     437                else if(u32hl[i] > 0) {
     438                        u8_ptr[u8_lgth] = 0xF0 + (u32hl[i] >> 2);
     439                        u8_ptr[u8_lgth+1] = 0x80 + ((u32hl[i] & 0x03) << 4) + (u32lh[i] >> 4);
     440                        u8_ptr[u8_lgth+2] = 0x80 + ((u32lh[i] & 0x0F) << 2) + (u32ll[i] >> 6);
     441                        u8_ptr[u8_lgth+3] = 0x80 + (u32ll[i] & 0x3F);           
     442                        u8_lgth += 4;
     443                }
     444                else if(u32lh[i]<=0x7) {
     445                        u8_ptr[u8_lgth] = 0xC0 + (u32lh[i] << 2) + (u32ll[i] >> 6);
     446                        u8_ptr[u8_lgth+1] = 0x80 + (u32ll[i] & 0x3F);
     447                        u8_lgth += 2;
     448                }
     449                else {
     450                        u8_ptr[u8_lgth] = 0xE0 + (u32lh[i] >> 4);
     451                        u8_ptr[u8_lgth+1] = 0x80 + ((u32lh[i] & 0x0F) << 2) + (u32ll[i] >> 6);
     452                        u8_ptr[u8_lgth+2] = 0x80 + (u32ll[i] & 0x3F);
     453                        u8_lgth += 3;
     454                }
     455        }
     456        u8_ptr[u8_lgth] = '\0';
     457}
     458
     459
Note: See TracChangeset for help on using the changeset viewer.