/*
*******************************************************************************
*
*   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);
            */
        }
    }
}

