5c43f59fbf
X-SVN-Rev: 3805
210 lines
7.5 KiB
C++
210 lines
7.5 KiB
C++
/*
|
|
*******************************************************************************
|
|
*
|
|
* 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<UCOL_NOT_FOUND) {
|
|
if(*printedCont == FALSE) {
|
|
fprintf(stdout, "%s ", formatElementString(oldCE, temp));
|
|
} else {
|
|
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) != 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; j<size; j++) {
|
|
oldCE = CE;
|
|
CE = *(address++);
|
|
printExp(CE, oldCE, primb, secb, terb, &printedCont);
|
|
}
|
|
} else {
|
|
while(*address != 0) {
|
|
oldCE = CE;
|
|
CE = *(address++);
|
|
printExp(CE, oldCE, primb, secb, terb, &printedCont);
|
|
}
|
|
}
|
|
printExp(CE, CE, primb, secb, terb, &printedCont);
|
|
if(*primb != '\0' || *secb != '\0' || *terb != '\0') {
|
|
fprintf(stdout, "[%s, %s, %s] ", primb, secb, terb);
|
|
}
|
|
}
|
|
|
|
if(tag == CHARSET_TAG) {
|
|
;
|
|
}
|
|
}
|
|
/*
|
|
UCAElements *e = (UCAElements *)uhash_get(elements, (void *)i);
|
|
fprintf(stdout, "%s", e->comment);
|
|
*/
|
|
}
|
|
}
|
|
}
|
|
|