/* ******************************************************************************* * * Copyright (C) 2000-2001, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* * file name: genuca.cpp * encoding: US-ASCII * tab size: 8 (not used) * indentation:4 * * This program reads the Franctional UCA table and generates * internal format for UCA table as well as inverse UCA table. * It then writes binary files containing the data: ucadata.dat * & invuca.dat * * Change history: * * 02/08/2001 Vladimir Weinstein Created this program * 02/23/2001 grhoten Made it into a tool */ #include "tblprint.h" char *formatElementString(uint32_t CE, char *buffer) { char temp[1024]; UBool firstPrim = FALSE; sprintf(buffer, "["); if(UCOL_PRIMARYORDER(CE)>>8 != 0x02) { sprintf(temp, "%02X ", UCOL_PRIMARYORDER(CE)>>8); strcat(buffer, temp); firstPrim = TRUE; } if((UCOL_PRIMARYORDER(CE)&0xFF) != 0x02 || firstPrim == TRUE) { sprintf(temp, "%02X", UCOL_PRIMARYORDER(CE)&0xFF); strcat(buffer, temp); } firstPrim = FALSE; strcat(buffer, ","); if(UCOL_SECONDARYORDER(CE) != 0x02) { sprintf(temp, " %02X", UCOL_SECONDARYORDER(CE)); strcat(buffer, temp); } strcat(buffer, ","); if((UCOL_TERTIARYORDER(CE)&0x7F) != 0x02) { sprintf(temp, " %02X", UCOL_TERTIARYORDER(CE)&0x7F); strcat(buffer, temp); } strcat(buffer, "]"); return buffer; } void printExp(uint32_t CE, uint32_t oldCE, char* primb, char* secb, char *terb, UBool *printedCont) { char temp[1024]; if(CE 0xFF) { sprintf(temp, "%02X ", UCOL_PRIMARYORDER(oldCE)>>8); strcat(primb, temp); } if(UCOL_PRIMARYORDER(oldCE) != 0) { sprintf(temp, "%02X ", UCOL_PRIMARYORDER(oldCE)&0xFF); strcat(primb, temp); } if(UCOL_SECONDARYORDER(oldCE) != 0) { sprintf(temp, "%02X ", UCOL_SECONDARYORDER(oldCE)); strcat(secb, temp); } if(UCOL_TERTIARYORDER(oldCE) != 0) { sprintf(temp, "%02X ", UCOL_TERTIARYORDER(oldCE)); strcat(terb, temp); } fprintf(stdout, "[%s, %s, %s] ", primb, secb, terb); *primb = *secb = *terb = *temp = 0; } *printedCont = FALSE; } else { /* this is a contiunation, process accordingly */ if(*printedCont == TRUE) { oldCE &= 0x0FFFFFFF; } if(UCOL_PRIMARYORDER(oldCE) > 0xFF) { sprintf(temp, "%02X ", UCOL_PRIMARYORDER(oldCE)>>8); strcat(primb, temp); } if(UCOL_PRIMARYORDER(oldCE) != 0) { sprintf(temp, "%02X ", UCOL_PRIMARYORDER(oldCE)&0xFF); strcat(primb, temp); } if(UCOL_SECONDARYORDER(oldCE) != 0) { sprintf(temp, "%02X ", UCOL_SECONDARYORDER(oldCE)); strcat(secb, temp); } if(UCOL_TERTIARYORDER(oldCE)&0x7F != 0) { sprintf(temp, "%02X ", UCOL_TERTIARYORDER(oldCE)&0x7F); strcat(terb, temp); } *printedCont = TRUE; } } void printOutTable(UCATableHeader *myData, UErrorCode *status) { if(U_FAILURE(*status)) { return; } int32_t i = 0, j = 0; int32_t CE = 0; uint32_t *address = NULL; uint8_t size = 0; char buffer[1024]; for(i = 0; i<=0xFFFF; i++) { //CE = ucmp32_get(myData->mapping, i); if(CE != UCOL_NOT_FOUND) { fprintf(stdout, "%04X; ", i); if(CE < UCOL_NOT_FOUND) { fprintf(stdout, "%c; %s ", (UCOL_TERTIARYORDER(CE)&0x80)>>7?'L':'S', formatElementString(CE, buffer)); } else { int32_t tag = (CE&UCOL_TAG_MASK)>>UCOL_TAG_SHIFT; if(tag == SURROGATE_TAG) { // do surrogates } if(tag == THAI_TAG) { address = ((uint32_t*)myData+((CE&0x00FFFFF0)>>4)); CE = *(address); fprintf(stdout, "%c; %s ", (UCOL_TERTIARYORDER(CE)&0x80)>>7?'L':'S', formatElementString(CE, buffer)); fprintf(stdout, "THAI - from %08X to %08X (offset %05X) ", CE, address, ((CE&0x00FFFFF0)>>4)); } if(tag == CONTRACTION_TAG) { int16_t hasBackward = 0; char conChars[1024]; char temp[1024]; sprintf(conChars, "%04X", i); UChar *contractionCP = (UChar *)myData+getContractOffset(CE); hasBackward = *(contractionCP); /* skip backward */ UBool printSeq = FALSE; address = (uint32_t *)((uint8_t*)myData+myData->contractionCEs)+(contractionCP - (UChar *)((uint8_t*)myData+myData->contractionIndex)); while(*contractionCP != 0xFFFF) { if(printSeq == TRUE) { fprintf(stdout, "\n%s;",conChars); } CE = *(address); fprintf(stdout, "%c; %s ", (UCOL_TERTIARYORDER(CE)&0x80)>>7?'L':'S', formatElementString(CE, buffer)); fprintf(stdout, "Contraction "); if(hasBackward != 0) { fprintf(stdout, "Back = %i ", hasBackward); } contractionCP++; address++; sprintf(temp, " %04X", *contractionCP); strcat(conChars, temp); printSeq = TRUE; } } if(tag == EXPANSION_TAG) { char primb[1024], secb[1024], terb[1024], temp[1024]; UBool printedCont = FALSE; uint32_t oldCE; *primb = *secb = *terb = *temp = 0; size = (uint8_t)(CE&0xF); address = ((uint32_t*)myData+((CE&0x00FFFFF0)>>4)); CE = *(address++); fprintf(stdout, "%c; ", (UCOL_TERTIARYORDER(CE)&0x80)>>7?'L':'S'); if(size != 0) { for(j = 1; jcomment); */ } } }