/*
*******************************************************************************
*
*   Copyright (C) 2002-2008, International Business Machines
*   Corporation and others.  All Rights Reserved.
*
*******************************************************************************
*
* File wrtxml.c
*
* Modification History:
*
*   Date        Name        Description
*   10/01/02    Ram         Creation.
*   02/07/08    Spieth      Correct XLIFF generation on EBCDIC platform
*
*******************************************************************************
*/
#include "reslist.h"
#include "unewdata.h"
#include "unicode/ures.h"
#include "errmsg.h"
#include "filestrm.h"
#include "cstring.h"
#include "unicode/ucnv.h"
#include "genrb.h"
#include "rle.h"
#include "ucol_tok.h"
#include "uhash.h"
#include "uresimp.h"
#include "unicode/ustring.h"
#include "unicode/uchar.h"
#include "ustr.h"
#include "prscmnts.h"
#include "unicode/unistr.h"
#include <time.h>

U_NAMESPACE_USE

static int tabCount = 0;

static FileStream* out=NULL;
static struct SRBRoot* srBundle ;
static const char* outDir = NULL;
static const char* enc ="";
static UConverter* conv = NULL;

const char* const* ISOLanguages;
const char* const* ISOCountries;
const char* textExt = ".txt";
const char* xliffExt = ".xlf";

static void write_utf8_file(UnicodeString outString, FileStream * outFile, UErrorCode *status){
    char* dest = (char*)uprv_malloc((outString.length() * 3 /2));
    int32_t len = 0;
    u_strToUTF8(dest,outString.length() * 3 /2,&len,outString.getBuffer(),outString.length(),status);    

    T_FileStream_write(outFile, dest, len);
    uprv_free(dest);
}


/*write indentation for formatting*/
static void write_tabs(UnicodeString *Accumulator){
    int i=0;
    for(;i<=tabCount;i++){
        Accumulator->append(UnicodeString("    "));
        //FileStream_write(os,"    ",4);
    }
}

/*get ID for each element. ID is globally unique.*/
static char* getID(const char* id, char* curKey, char* result) {
    if(curKey == NULL) {
        result = (char *)uprv_malloc(sizeof(char)*uprv_strlen(id) + 1);
        uprv_memset(result, 0, sizeof(char)*uprv_strlen(id) + 1);
        uprv_strcpy(result, id);
    } else {
        result = (char *)uprv_malloc(sizeof(char)*(uprv_strlen(id) + 1 + uprv_strlen(curKey)) + 1);
        uprv_memset(result, 0, sizeof(char)*(uprv_strlen(id) + 1 + uprv_strlen(curKey)) + 1);
        if(id[0]!='\0'){
            uprv_strcpy(result, id);
            uprv_strcat(result, "_");
        }
        uprv_strcat(result, curKey);
    }
    return result;
}

/*compute CRC for binary code*/
/* The code is from  http://www.theorem.com/java/CRC32.java
 * Calculates the CRC32 - 32 bit Cyclical Redundancy Check
 * <P> This check is used in numerous systems to verify the integrity
 * of information.  It's also used as a hashing function.  Unlike a regular
 * checksum, it's sensitive to the order of the characters.
 * It produces a 32 bit
 *
 * @author Michael Lecuyer (mjl@theorem.com)
 * @version 1.1 August 11, 1998
 */

/* ICU is not endian portable, because ICU data generated on big endian machines can be
 * ported to big endian machines but not to little endian machines and vice versa. The
 * conversion is not portable across platforms with different endianess.
 */

static uint32_t computeCRC(char *ptr, uint32_t len, uint32_t lastcrc){
    int32_t crc;
    uint32_t temp1;
    uint32_t temp2;

    int32_t crc_ta[256];
    int i = 0;
    int j = 0;
    uint32_t crc2 = 0;

#define CRC32_POLYNOMIAL 0xEDB88320

    /*build crc table*/
    for (i = 0; i <= 255; i++) {
        crc2 = i;
        for (j = 8; j > 0; j--) {
            if ((crc2 & 1) == 1) {
                crc2 = (crc2 >> 1) ^ CRC32_POLYNOMIAL;
            } else {
                crc2 >>= 1;
            }
        }
        crc_ta[i] = crc2;
    }

    crc = lastcrc;
    while(len--!=0) {
        temp1 = (uint32_t)crc>>8;
        temp2 = crc_ta[(crc^*ptr) & 0xFF];
        crc = temp1^temp2;
        ptr++;
    }
    return(crc);
}

static void strnrepchr(char* src, int32_t srcLen, char s, char r){
    int32_t i = 0;
    for(i=0;i<srcLen;i++){
        if(src[i]==s){
            src[i]=r;
        }
    }
}
/* Parse the filename, and get its language information.
 * If it fails to get the language information from the filename,
 * use "en" as the default value for language
 */
static char* parseFilename(const char* id, char* lang) {
    int idLen = (int) uprv_strlen(id);
    char* localeID = (char*) uprv_malloc(idLen);
    int pos = 0;
    int canonCapacity = 0;
    char* canon = NULL;
    int canonLen = 0;
    /*int i;*/
    UErrorCode status = U_ZERO_ERROR;
    const char *ext = uprv_strchr(id, '.');

    if(ext != NULL){
        pos = (int) (ext - id);
    } else {
        pos = idLen;
    }
    uprv_memcpy(localeID, id, pos);
    localeID[pos]=0; /* NUL terminate the string */
    
    canonCapacity =pos*3;
    canon = (char*) uprv_malloc(canonCapacity);
    canonLen = uloc_canonicalize(localeID, canon, canonCapacity, &status);

    if(U_FAILURE(status)){
        fprintf(stderr, "Could not canonicalize the locale ID: %s. Error: %s\n", localeID, u_errorName(status));
        exit(status);
    }
    strnrepchr(canon, canonLen, '_', '-');
    return canon;
}

static const char* xmlHeader = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
#if 0
static const char* bundleStart = "<xliff version = \"1.2\" "
                                        "xmlns='urn:oasis:names:tc:xliff:document:1.2' "
                                        "xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' "
                                        "xsi:schemaLocation='urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd'>\n";
#else
static const char* bundleStart = "<xliff version = \"1.1\" "
                                        "xmlns='urn:oasis:names:tc:xliff:document:1.1' "
                                        "xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' "
                                        "xsi:schemaLocation='urn:oasis:names:tc:xliff:document:1.1 http://www.oasis-open.org/committees/xliff/documents/xliff-core-1.1.xsd'>\n";
#endif
static const char* bundleEnd   = "</xliff>\n";

void res_write_xml(UnicodeString *Accumulator, struct SResource *res, const char* id, const char* language, UBool isTopLevel, UErrorCode *status);

static char* convertAndEscape(char** pDest, int32_t destCap, int32_t* destLength,
                              const UChar* src, int32_t srcLen, UErrorCode* status){
    int32_t srcIndex=0;
    char* dest=NULL;
    char* temp=NULL;
    int32_t destLen=0;
    UChar32 c = 0;

    if(status==NULL || U_FAILURE(*status) || pDest==NULL  || srcLen==0 || src == NULL){
        return NULL;
    }
    dest =*pDest;
    if(dest==NULL || destCap <=0){
        destCap = srcLen * 8;
        dest = (char*) uprv_malloc(sizeof(char) * destCap);
        if(dest==NULL){
            *status=U_MEMORY_ALLOCATION_ERROR;
            return NULL;
        }
    }

    dest[0]=0;

    while(srcIndex<srcLen){
        U16_NEXT(src, srcIndex, srcLen, c);

        if (U16_IS_LEAD(c) || U16_IS_TRAIL(c)) {
            *status = U_ILLEGAL_CHAR_FOUND;
            fprintf(stderr, "Illegal Surrogate! \n");
            uprv_free(dest);
            return NULL;
        }

        if((destLen+UTF8_CHAR_LENGTH(c)) < destCap){

            /* ASCII Range */
            if(c <=0x007F){
                switch(c) {
                case '\x26':
                    uprv_strcpy(dest+( destLen),"\x26\x61\x6d\x70\x3b"); /* &amp;*/
                    destLen+=(int32_t)uprv_strlen("\x26\x61\x6d\x70\x3b");
                    break;
                case '\x3c':
                    uprv_strcpy(dest+(destLen),"\x26\x6c\x74\x3b"); /* &lt;*/
                    destLen+=(int32_t)uprv_strlen("\x26\x6c\x74\x3b");
                    break;
                case '\x3e':
                    uprv_strcpy(dest+(destLen),"\x26\x67\x74\x3b"); /* &gt;*/
                    destLen+=(int32_t)uprv_strlen("\x26\x67\x74\x3b");
                    break;
                case '\x22':
                    uprv_strcpy(dest+(destLen),"\x26\x71\x75\x6f\x74\x3b"); /* &quot;*/
                    destLen+=(int32_t)uprv_strlen("\x26\x71\x75\x6f\x74\x3b");
                    break;
                case '\x27':
                    uprv_strcpy(dest+(destLen),"\x26\x61\x70\x6f\x73\x3b"); /* &apos; */
                    destLen+=(int32_t)uprv_strlen("\x26\x61\x70\x6f\x73\x3b");
                    break;

                 /* Disallow C0 controls except TAB, CR, LF*/
                case 0x00:
                case 0x01:
                case 0x02:
                case 0x03:
                case 0x04:
                case 0x05:
                case 0x06:
                case 0x07:
                case 0x08:
                /*case 0x09:*/
                /*case 0x0A: */
                case 0x0B:
                case 0x0C:
                /*case 0x0D:*/
                case 0x0E:
                case 0x0F:
                case 0x10:
                case 0x11:
                case 0x12:
                case 0x13:
                case 0x14:
                case 0x15:
                case 0x16:
                case 0x17:
                case 0x18:
                case 0x19:
                case 0x1A:
                case 0x1B:
                case 0x1C:
                case 0x1D:
                case 0x1E:
                case 0x1F:
                    *status = U_ILLEGAL_CHAR_FOUND;
                    fprintf(stderr, "Illegal Character \\u%04X!\n",(int)c);
                    uprv_free(dest);
                    return NULL;
                default:
                    dest[destLen++]=(char)c;
                }
            }else{
                UBool isError = FALSE;
                U8_APPEND((unsigned char*)dest,destLen,destCap,c,isError);
                if(isError){
                    *status = U_ILLEGAL_CHAR_FOUND;
                    fprintf(stderr, "Illegal Character \\U%08X!\n",(int)c);
                    uprv_free(dest);
                    return NULL;
                }
            }
        }else{
            destCap += destLen;

            temp = (char*) uprv_malloc(sizeof(char)*destCap);
            if(temp==NULL){
                *status=U_MEMORY_ALLOCATION_ERROR;
                uprv_free(dest);
                return NULL;
            }
            uprv_memmove(temp,dest,destLen);
            destLen=0;
            uprv_free(dest);
            dest=temp;
            temp=NULL;
        }

    }
    *destLength = destLen;
    return dest;
}

#define ASTERISK 0x002A
#define SPACE    0x0020
#define CR       0x000A
#define LF       0x000D
#define AT_SIGN  0x0040

static void
trim(char **src, int32_t *len){

    char *s = NULL;
    int32_t i = 0;
    if(src == NULL || *src == NULL){
        return;
    }
    s = *src;
    /* trim from the end */
    for( i=(*len-1); i>= 0; i--){
        switch(s[i]){
        case ASTERISK:
        case SPACE:
        case CR:
        case LF:
            s[i] = 0;
            continue;
        default:
            break;
        }
        break;

    }
    *len = i+1;
}

static void
print(UnicodeString *Accumulator, UChar* src, int32_t srcLen,const char *tagStart,const char *tagEnd,  UErrorCode *status){
    int32_t bufCapacity   = srcLen*4;
    char *buf       = NULL;
    int32_t bufLen = 0;

    if(U_FAILURE(*status)){
        return;
    }

    buf = (char*) (uprv_malloc(bufCapacity));
    if(buf==0){
        fprintf(stderr, "Could not allocate memory!!");
        exit(U_MEMORY_ALLOCATION_ERROR);
    }
    buf = convertAndEscape(&buf, bufCapacity, &bufLen, src, srcLen,status);
    if(U_SUCCESS(*status)){
        trim(&buf,&bufLen);
        Accumulator->append(UnicodeString(tagStart));
        Accumulator->append(UnicodeString(buf, bufLen, "UTF-8")); 
        Accumulator->append(UnicodeString(tagEnd));
        Accumulator->append(UnicodeString("\n")); 
        //T_FileStream_write(out,tagStart, (int32_t)uprv_strlen(tagStart));
        //T_FileStream_write(out, buf, bufLen);
        //T_FileStream_write(out,tagEnd, (int32_t)uprv_strlen(tagEnd));
        //T_FileStream_write(out,"\n",1);

    }
}
static void
printNoteElements(UnicodeString *Accumulator, struct UString *src, UErrorCode *status){

#if UCONFIG_NO_REGULAR_EXPRESSIONS==0 /* donot compile when no RegularExpressions are available */

    int32_t capacity = 0;
    UChar* note = NULL;
    int32_t noteLen = 0;
    int32_t count = 0,i;

    if(src == NULL){
        return;
    }

    capacity = src->fLength;
    note  = (UChar*) uprv_malloc(U_SIZEOF_UCHAR * capacity);

    count = getCount(src->fChars,src->fLength, UPC_NOTE, status);
    if(U_FAILURE(*status)){
        uprv_free(note);
        return;
    }
    for(i=0; i < count; i++){
        noteLen =  getAt(src->fChars,src->fLength, &note, capacity, i, UPC_NOTE, status);
        if(U_FAILURE(*status)){
            uprv_free(note);
            return;
        }
        if(noteLen > 0){
            write_tabs(Accumulator);
            print(Accumulator, note, noteLen,"<note>", "</note>", status);
        }
    }
    uprv_free(note);
#else
    
    fprintf(stderr, "Warning: Could not output comments to XLIFF file. ICU has been built without RegularExpression support.\n");

#endif /* UCONFIG_NO_REGULAR_EXPRESSIONS */

}

static void printAttribute(UnicodeString *Accumulator, const char *name, const char *value, int32_t len)
{
    Accumulator->append(UnicodeString(" "));
    Accumulator->append(UnicodeString(name));
    Accumulator->append(UnicodeString(" = \""));
    Accumulator->append(UnicodeString(value));
    Accumulator->append(UnicodeString("\"")); 
    //T_FileStream_write(out, " ", 1);
    //T_FileStream_write(out, name, (int32_t) uprv_strlen(name));
    //T_FileStream_write(out, " = \"", 4);
    //T_FileStream_write(out, value, (int32_t) len);
    //T_FileStream_write(out, "\"", 1);
}

static void printAttribute(UnicodeString *Accumulator, const char *name, const UnicodeString value, int32_t len)
{
    Accumulator->append(UnicodeString(" "));
    Accumulator->append(UnicodeString(name));
    Accumulator->append(UnicodeString(" = \""));
    Accumulator->append(value);
    Accumulator->append(UnicodeString("\"")); 
    //T_FileStream_write(out, " ", 1);
    //T_FileStream_write(out, name, (int32_t) uprv_strlen(name));
    //T_FileStream_write(out, " = \"", 4);
    //T_FileStream_write(out, value, (int32_t) len);
    //T_FileStream_write(out, "\"", 1);
}

static void
printComments(UnicodeString *Accumulator, struct UString *src, const char *resName, UBool printTranslate, UErrorCode *status){

#if UCONFIG_NO_REGULAR_EXPRESSIONS==0 /* donot compile when no RegularExpressions are available */

    if(status==NULL || U_FAILURE(*status)){
        return;
    }

    int32_t capacity = src->fLength + 1;
    char* buf = NULL;
    int32_t bufLen = 0;
    UChar* desc  = (UChar*) uprv_malloc(U_SIZEOF_UCHAR * capacity);
    UChar* trans = (UChar*) uprv_malloc(U_SIZEOF_UCHAR * capacity);

    int32_t descLen = 0, transLen=0;
    if(desc==NULL || trans==NULL){
        *status = U_MEMORY_ALLOCATION_ERROR;
        uprv_free(desc);
        uprv_free(trans);
        return;
    }
    src->fLength = removeCmtText(src->fChars, src->fLength, status);
    descLen  = getDescription(src->fChars,src->fLength, &desc, capacity, status);
    transLen = getTranslate(src->fChars,src->fLength, &trans, capacity, status);

    /* first print translate attribute */
    if(transLen > 0){
        if(printTranslate){
            /* print translate attribute */
            buf = convertAndEscape(&buf, 0, &bufLen, trans, transLen, status);
            if(U_SUCCESS(*status)){
                printAttribute(Accumulator, "translate", UnicodeString(buf, bufLen, "UTF-8"), bufLen);
                Accumulator->append(UnicodeString(">\n")); 
                //T_FileStream_write(out,">\n", 2);
            }
        }else if(getShowWarning()){
            fprintf(stderr, "Warning: Tranlate attribute for resource %s cannot be set. XLIFF prohibits it.\n", resName);
            /* no translate attribute .. just close the tag */
            Accumulator->append(UnicodeString(">\n")); 
            //T_FileStream_write(out,">\n", 2);
        }
    }else{
        /* no translate attribute .. just close the tag */
        Accumulator->append(UnicodeString(">\n")); 
        //T_FileStream_write(out,">\n", 2);
    }

    if(descLen > 0){
        write_tabs(Accumulator);
        print(Accumulator, desc, descLen, "<!--", "-->", status);
    }

    uprv_free(desc);
    uprv_free(trans);
#else

    fprintf(stderr, "Warning: Could not output comments to XLIFF file. ICU has been built without RegularExpression support.\n");

#endif /* UCONFIG_NO_REGULAR_EXPRESSIONS */

}

/*
 * Print out a containing element, like:
 * <trans-unit id = "blah" resname = "blah" restype = "x-id-alias" translate = "no">
 * <group id "calendar_gregorian" resname = "gregorian" restype = "x-icu-array">
 */
static char *printContainer(UnicodeString *Accumulator, struct SResource *res, const char *container, const char *restype, const char *mimetype, const char *id, UErrorCode *status)
{
    char *resname = NULL;
    char *sid = NULL;

    write_tabs(Accumulator);

    if (res->fKey >= 0 && uprv_strcmp(srBundle->fKeys + res->fKey, "") != 0) {
        resname = srBundle->fKeys + res->fKey;
        sid = getID(id, resname, sid);
    } else {
        sid = getID(id, NULL, sid);
    }

    Accumulator->append(UnicodeString("<"));
    Accumulator->append(UnicodeString(container)); 
    //T_FileStream_write(out, "<", 1);
    //T_FileStream_write(out, container, (int32_t) uprv_strlen(container));
    printAttribute(Accumulator, "id", sid, (int32_t) uprv_strlen(sid));

    if (resname != NULL) {
        printAttribute(Accumulator,"resname", resname, (int32_t) uprv_strlen(resname));
    }

    if (mimetype != NULL) {
        printAttribute(Accumulator,"mime-type", mimetype, (int32_t) uprv_strlen(mimetype));
    }

    if (restype != NULL) {
        printAttribute(Accumulator,"restype", restype, (int32_t) uprv_strlen(restype));
    }

    tabCount += 1;
    if (res->fComment.fLength > 0) {
        /* printComments will print the closing ">\n" */
        printComments(Accumulator, &res->fComment, resname, TRUE, status);
    } else {
        Accumulator->append(UnicodeString(">\n"));
        //T_FileStream_write(out, ">\n", 2);
    }

    return sid;
}

/* Writing Functions */

static const char *trans_unit = "trans-unit";
static const char *close_trans_unit = "</trans-unit>\n";
static const char *source = "<source>";
static const char *close_source = "</source>\n";
static const char *group = "group";
static const char *close_group = "</group>\n";

static const char *bin_unit = "bin-unit";
static const char *close_bin_unit = "</bin-unit>\n";
static const char *bin_source = "<bin-source>\n";
static const char *close_bin_source = "</bin-source>\n";
static const char *external_file = "<external-file";
/*static const char *close_external_file = "</external-file>\n";*/
static const char *internal_file = "<internal-file";
static const char *close_internal_file = "</internal-file>\n";

static const char *application_mimetype = "application"; /* add "/octet-stream"? */

static const char *alias_restype     = "x-icu-alias";
static const char *array_restype     = "x-icu-array";
static const char *binary_restype    = "x-icu-binary";
static const char *integer_restype   = "x-icu-integer";
static const char *intvector_restype = "x-icu-intvector";
static const char *table_restype     = "x-icu-table";

static void
string_write_xml(UnicodeString *Accumulator, struct SResource *res, const char* id, const char* language, UErrorCode *status) {

    char *sid = NULL;
    char* buf = NULL;
    int32_t bufLen = 0;

    if(status==NULL || U_FAILURE(*status)){
        return;
    }

    sid = printContainer(Accumulator, res, trans_unit, NULL, NULL, id, status);

    write_tabs(Accumulator);

    Accumulator->append(UnicodeString(source)); 
    //T_FileStream_write(out, source, (int32_t) uprv_strlen(source));

    buf = convertAndEscape(&buf, 0, &bufLen, res->u.fString.fChars, res->u.fString.fLength, status);

    if (U_FAILURE(*status)) {
        return;
    }

    Accumulator->append(UnicodeString(buf, bufLen, "UTF-8"));
    Accumulator->append(UnicodeString(close_source)); 
    //T_FileStream_write(out, buf, bufLen);
    //T_FileStream_write(out, close_source, (int32_t) uprv_strlen(close_source));

    printNoteElements(Accumulator, &res->fComment, status);

    tabCount -= 1;
    write_tabs(Accumulator);

    Accumulator->append(UnicodeString(close_trans_unit)); 
    //T_FileStream_write(out, close_trans_unit, (int32_t) uprv_strlen(close_trans_unit));

    uprv_free(buf);
    uprv_free(sid);
}

static void
alias_write_xml(UnicodeString *Accumulator, struct SResource *res, const char* id, const char* language, UErrorCode *status) {
    char *sid = NULL;
    char* buf = NULL;
    int32_t bufLen=0;

    sid = printContainer(Accumulator, res, trans_unit, alias_restype, NULL, id, status);

    write_tabs(Accumulator);

    Accumulator->append(UnicodeString(source)); 
    //T_FileStream_write(out, source, (int32_t) uprv_strlen(source));

    buf = convertAndEscape(&buf, 0, &bufLen, res->u.fString.fChars, res->u.fString.fLength, status);
 
    if(U_FAILURE(*status)){
        return;
    }
    Accumulator->append(UnicodeString(buf, bufLen, "UTF-8")); 
    //T_FileStream_write(out, buf, bufLen);
    Accumulator->append(UnicodeString(close_source));
    //T_FileStream_write(out, close_source, (int32_t)uprv_strlen(close_source));

    printNoteElements(Accumulator, &res->fComment, status);

    tabCount -= 1;
    write_tabs(Accumulator);

    Accumulator->append(UnicodeString(close_trans_unit));
    //T_FileStream_write(out, close_trans_unit, (int32_t)uprv_strlen(close_trans_unit));

    uprv_free(buf);
    uprv_free(sid);
}

static void
array_write_xml(UnicodeString *Accumulator, struct SResource *res, const char* id, const char* language, UErrorCode *status) {
    char* sid = NULL;
    int index = 0;

    struct SResource *current = NULL;
    struct SResource *first =NULL;

    sid = printContainer(Accumulator, res, group, array_restype, NULL, id, status);

    current = res->u.fArray.fFirst;
    first=current;

    while (current != NULL) {
        char c[256] = {0};
        char* subId = NULL;

        itostr(c, index, 10, 0);
        index += 1;
        subId = getID(sid, c, subId);

        res_write_xml(Accumulator, current, subId, language, FALSE, status);
        uprv_free(subId);
        subId = NULL;

        if(U_FAILURE(*status)){
            return;
        }

        current = current->fNext;
    }

    tabCount -= 1;
    write_tabs(Accumulator);
    Accumulator->append(UnicodeString(close_group)); 
    //T_FileStream_write(out, close_group, (int32_t) uprv_strlen(close_group));

    uprv_free(sid);
}

static void
intvector_write_xml(UnicodeString *Accumulator, struct SResource *res, const char* id, const char* language, UErrorCode *status) {
    char* sid = NULL;
    char* ivd = NULL;
    uint32_t i=0;
    uint32_t len=0;
    char buf[256] = {'0'};

    sid = printContainer(Accumulator, res, group, intvector_restype, NULL, id, status);

    for(i = 0; i < res->u.fIntVector.fCount; i += 1) {
        char c[256] = {0};

        itostr(c, i, 10, 0);
        ivd = getID(sid, c, ivd);
        len = itostr(buf, res->u.fIntVector.fArray[i], 10, 0);

        write_tabs(Accumulator);
        Accumulator->append(UnicodeString("<")); 
        //T_FileStream_write(out, "<", 1);
        Accumulator->append(UnicodeString(trans_unit)); 
        //T_FileStream_write(out, trans_unit, (int32_t)uprv_strlen(trans_unit));

        printAttribute(Accumulator, "id", ivd, (int32_t)uprv_strlen(ivd));
        printAttribute(Accumulator, "restype", integer_restype, (int32_t) strlen(integer_restype));

        Accumulator->append(UnicodeString(">\n")); 
        //T_FileStream_write(out,">\n", 2);

        tabCount += 1;
        write_tabs(Accumulator);
        Accumulator->append(UnicodeString(source)); 
        //T_FileStream_write(out, source, (int32_t)uprv_strlen(source));

        Accumulator->append(UnicodeString(buf, len));
        //T_FileStream_write(out, buf, len);

        Accumulator->append(UnicodeString(close_source)); 
        //T_FileStream_write(out, close_source, (int32_t)uprv_strlen(close_source));
        tabCount -= 1;
        write_tabs(Accumulator);
        Accumulator->append(UnicodeString(close_trans_unit)); 
        //T_FileStream_write(out, close_trans_unit, (int32_t)uprv_strlen(close_trans_unit));

        uprv_free(ivd);
        ivd = NULL;
    }

    tabCount -= 1;
    write_tabs(Accumulator);

    Accumulator->append(UnicodeString(close_group)); 
    //T_FileStream_write(out, close_group, (int32_t)uprv_strlen(close_group));
    uprv_free(sid);
    sid = NULL;
}

static void
int_write_xml(UnicodeString *Accumulator, struct SResource *res, const char* id, const char* language, UErrorCode *status) {
    char* sid = NULL;
    char buf[256] = {0};
    uint32_t len = 0;

    sid = printContainer(Accumulator, res, trans_unit, integer_restype, NULL, id, status);

    write_tabs(Accumulator);

    Accumulator->append(UnicodeString(source)); 
    //T_FileStream_write(out, source, (int32_t) uprv_strlen(source));

    len = itostr(buf, res->u.fIntValue.fValue, 10, 0);
    Accumulator->append(UnicodeString(buf, len));
    //T_FileStream_write(out, buf, len);

    Accumulator->append(UnicodeString(close_source));
    //T_FileStream_write(out, close_source, (int32_t)uprv_strlen(close_source));

    printNoteElements(Accumulator, &res->fComment, status);

    tabCount -= 1;
    write_tabs(Accumulator);

    Accumulator->append(UnicodeString(close_trans_unit));
    //T_FileStream_write(out, close_trans_unit, (int32_t)uprv_strlen(close_trans_unit));

    uprv_free(sid);
    sid = NULL;
}

static void
bin_write_xml(UnicodeString *Accumulator, struct SResource *res, const char* id, const char* language, UErrorCode *status) {
    const char* m_type = application_mimetype;
    char* sid = NULL;
    uint32_t crc = 0xFFFFFFFF;

    char fileName[1024] ={0};
    int32_t tLen = ( outDir == NULL) ? 0 :(int32_t)uprv_strlen(outDir);
    char* fn =  (char*) uprv_malloc(sizeof(char) * (tLen+1024 +
                                                    (res->u.fBinaryValue.fFileName !=NULL ?
                                                    uprv_strlen(res->u.fBinaryValue.fFileName) :0)));
    const char* ext = NULL;

    char* f = NULL;

    fn[0]=0;

    if(res->u.fBinaryValue.fFileName != NULL){
        uprv_strcpy(fileName, res->u.fBinaryValue.fFileName);
        f = uprv_strrchr(fileName, '\\');

        if (f != NULL) {
            f++;
        } else {
            f = fileName;
        }

        ext = uprv_strrchr(fileName, '.');

        if (ext == NULL) {
            fprintf(stderr, "Error: %s is an unknown binary filename type.\n", fileName);
            exit(U_ILLEGAL_ARGUMENT_ERROR);
        }

        if(uprv_strcmp(ext, ".jpg")==0 || uprv_strcmp(ext, ".jpeg")==0 || uprv_strcmp(ext, ".gif")==0 ){
            m_type = "image";
        } else if(uprv_strcmp(ext, ".wav")==0 || uprv_strcmp(ext, ".au")==0 ){
            m_type = "audio";
        } else if(uprv_strcmp(ext, ".avi")==0 || uprv_strcmp(ext, ".mpg")==0 || uprv_strcmp(ext, ".mpeg")==0){
            m_type = "video";
        } else if(uprv_strcmp(ext, ".txt")==0 || uprv_strcmp(ext, ".text")==0){
            m_type = "text";
        }

        sid = printContainer(Accumulator, res, bin_unit, binary_restype, m_type, id, status);

        write_tabs(Accumulator);

        Accumulator->append(UnicodeString(bin_source));
        //T_FileStream_write(out, bin_source, (int32_t)uprv_strlen(bin_source));

        tabCount+= 1;
        write_tabs(Accumulator);

        Accumulator->append(UnicodeString(external_file)); 
        //T_FileStream_write(out, external_file, (int32_t)uprv_strlen(external_file));
        printAttribute(Accumulator, "href", f, (int32_t)uprv_strlen(f));
        Accumulator->append(UnicodeString("/>\n")); 
        //T_FileStream_write(out, "/>\n", 3);
        tabCount -= 1;
        write_tabs(Accumulator);

        Accumulator->append(UnicodeString(close_bin_source));
        //T_FileStream_write(out, close_bin_source, (int32_t)uprv_strlen(close_bin_source));

        printNoteElements(Accumulator, &res->fComment, status);
        tabCount -= 1;
        write_tabs(Accumulator);
        Accumulator->append(UnicodeString(close_bin_unit));
        //T_FileStream_write(out, close_bin_unit, (int32_t)uprv_strlen(close_bin_unit));
    } else {
        char temp[256] = {0};
        uint32_t i = 0;
        int32_t len=0;

        sid = printContainer(Accumulator, res, bin_unit, binary_restype, m_type, id, status);

        write_tabs(Accumulator);
        Accumulator->append(UnicodeString(bin_source));
        //T_FileStream_write(out, bin_source, (int32_t)uprv_strlen(bin_source));

        tabCount += 1;
        write_tabs(Accumulator);

        Accumulator->append(UnicodeString(internal_file));
        //T_FileStream_write(out, internal_file, (int32_t)uprv_strlen(internal_file));
        printAttribute(Accumulator, "form", application_mimetype, (int32_t) uprv_strlen(application_mimetype)); 

        while(i <res->u.fBinaryValue.fLength){
            len = itostr(temp, res->u.fBinaryValue.fData[i], 16, 2);
            crc = computeCRC(temp, len, crc);
            i++;
        }

        len = itostr(temp, crc, 10, 0);
        printAttribute(Accumulator, "crc", temp, len);

        Accumulator->append(UnicodeString(">"));
        //T_FileStream_write(out, ">", 1);

        i = 0;
        while(i <res->u.fBinaryValue.fLength){
            len = itostr(temp, res->u.fBinaryValue.fData[i], 16, 2);
            Accumulator->append(UnicodeString(temp));
            //T_FileStream_write(out ,temp ,len);
            i += 1;
        }

        Accumulator->append(UnicodeString(close_internal_file));
        //T_FileStream_write(out, close_internal_file, (int32_t)uprv_strlen(close_internal_file));

        tabCount -= 2;
        write_tabs(Accumulator);

        Accumulator->append(UnicodeString(close_bin_source));
        //T_FileStream_write(out, close_bin_source, (int32_t)uprv_strlen(close_bin_source));
        printNoteElements(Accumulator, &res->fComment, status);

        tabCount -= 1;
        write_tabs(Accumulator);
        Accumulator->append(UnicodeString(close_bin_unit)); 
        //T_FileStream_write(out, close_bin_unit, (int32_t)uprv_strlen(close_bin_unit));

        uprv_free(sid);
        sid = NULL;
    }

    uprv_free(fn);
}



static void
table_write_xml(UnicodeString *Accumulator, struct SResource *res, const char* id, const char* language, UBool isTopLevel, UErrorCode *status) {

    uint32_t  i         = 0;

    struct SResource *current = NULL;
    struct SResource *save = NULL;
    char* sid = NULL;

    if (U_FAILURE(*status)) {
        return ;
    }

    sid = printContainer(Accumulator, res, group, table_restype, NULL, id, status);

    if(isTopLevel) {
        sid[0] = '\0';
    }

    save = current = res->u.fTable.fFirst;
    i = 0;

    while (current != NULL) {
        res_write_xml(Accumulator, current, sid, language, FALSE, status);

        if(U_FAILURE(*status)){
            return;
        }

        i += 1;
        current = current->fNext;
    }

    tabCount -= 1;
    write_tabs(Accumulator);

    Accumulator->append(UnicodeString(close_group));
    //T_FileStream_write(out, close_group,(int32_t)uprv_strlen(close_group));

    uprv_free(sid);
    sid = NULL;
}

void
res_write_xml(UnicodeString *Accumulator, struct SResource *res, const char* id,  const char* language, UBool isTopLevel, UErrorCode *status) {

    if (U_FAILURE(*status)) {
        return ;
    }

    if (res != NULL) {
        switch (res->fType) {
        case URES_STRING:
             string_write_xml    (Accumulator, res, id, language, status);
             return;

        case URES_ALIAS:
             alias_write_xml     (Accumulator, res, id, language, status);
             return;

        case URES_INT_VECTOR:
             intvector_write_xml (Accumulator, res, id, language, status);
             return;

        case URES_BINARY:
             bin_write_xml       (Accumulator, res, id, language, status);
             return;

        case URES_INT:
             int_write_xml       (Accumulator, res, id, language, status);
             return;

        case URES_ARRAY:
             array_write_xml     (Accumulator, res, id, language, status);
             return;

        case URES_TABLE:
        case URES_TABLE32:
             table_write_xml     (Accumulator, res, id, language, isTopLevel, status);
             return;

        default:
            break;
        }
    }

    *status = U_INTERNAL_PROGRAM_ERROR;
}

void
bundle_write_xml(struct SRBRoot *bundle, const char *outputDir,const char* outputEnc, const char* filename,
                  char *writtenFilename, int writtenFilenameLen,
                  const char* language, const char* outFileName, UErrorCode *status) {

    UnicodeString Accumulator; 
    char* xmlfileName = NULL;
    char* outputFileName = NULL;
    char* originalFileName = NULL;
    const char* fileStart = "<file xml:space = \"preserve\" source-language = \"";
    const char* file1 = "\" datatype = \"x-icu-resource-bundle\" ";
    const char* file2 = "original = \"";
    const char* file4 = "\" date = \"";
    const char* fileEnd = "</file>\n";
    const char* headerStart = "<header>\n";
    const char* headerEnd = "</header>\n";
    const char* bodyStart = "<body>\n";
    const char* bodyEnd = "</body>\n";

    const char *tool_start = "<tool";
    const char *tool_id = "genrb-" GENRB_VERSION "-icu-" U_ICU_VERSION;
    const char *tool_name = "genrb";

    char* temp = NULL;
    char* lang = NULL;
    const char* pos = NULL;
    int32_t first, index;
    time_t currTime;
    char timeBuf[128];

    outDir = outputDir;

    srBundle = bundle;

    pos = uprv_strrchr(filename, '\\');
    if(pos != NULL) {
        first = (int32_t)(pos - filename + 1);
    } else {
        first = 0;
    }
    index = (int32_t)(uprv_strlen(filename) - uprv_strlen(textExt) - first);
    originalFileName = (char *)uprv_malloc(sizeof(char)*index+1);
    uprv_memset(originalFileName, 0, sizeof(char)*index+1);
    uprv_strncpy(originalFileName, filename + first, index);

    if(uprv_strcmp(originalFileName, srBundle->fLocale) != 0) {
        fprintf(stdout, "Warning: The file name is not same as the resource name!\n");
    }

    temp = originalFileName;
    originalFileName = (char *)uprv_malloc(sizeof(char)* (uprv_strlen(temp)+uprv_strlen(textExt)) + 1);
    uprv_memset(originalFileName, 0, sizeof(char)* (uprv_strlen(temp)+uprv_strlen(textExt)) + 1);
    uprv_strcat(originalFileName, temp);
    uprv_strcat(originalFileName, textExt);
    uprv_free(temp);
    temp = NULL;


    if (language == NULL) {
/*        lang = parseFilename(filename, lang);
        if (lang == NULL) {*/
            /* now check if locale name is valid or not
             * this is to cater for situation where
             * pegasusServer.txt contains
             *
             * en{
             *      ..
             * }
             */
             lang = parseFilename(srBundle->fLocale, lang);
             /*
              * Neither  the file name nor the table name inside the
              * txt file contain a valid country and language codes
              * throw an error.
              * pegasusServer.txt contains
              *
              * testelements{
              *     ....
              * }
              */
             if(lang==NULL){
                 fprintf(stderr, "Error: The file name and table name do not contain a valid language code. Please use -l option to specify it.\n");
                 exit(U_ILLEGAL_ARGUMENT_ERROR);
             }
       /* }*/
    } else {
        lang = (char *)uprv_malloc(sizeof(char)*uprv_strlen(language) +1);
        uprv_memset(lang, 0, sizeof(char)*uprv_strlen(language) +1);
        uprv_strcpy(lang, language);
    }

    if(outFileName) {
        outputFileName = (char *)uprv_malloc(sizeof(char)*uprv_strlen(outFileName) + 1);
        uprv_memset(outputFileName, 0, sizeof(char)*uprv_strlen(outFileName) + 1);
        uprv_strcpy(outputFileName,outFileName);
    } else {
        outputFileName = (char *)uprv_malloc(sizeof(char)*uprv_strlen(srBundle->fLocale) + 1);
        uprv_memset(outputFileName, 0, sizeof(char)*uprv_strlen(srBundle->fLocale) + 1);
        uprv_strcpy(outputFileName,srBundle->fLocale);
    }

    if(outputDir) {
        xmlfileName = (char *)uprv_malloc(sizeof(char)*(uprv_strlen(outputDir) + uprv_strlen(outputFileName) + uprv_strlen(xliffExt) + 1) +1);
        uprv_memset(xmlfileName, 0, sizeof(char)*(uprv_strlen(outputDir)+ uprv_strlen(outputFileName) + uprv_strlen(xliffExt) + 1) +1);
    } else {
        xmlfileName = (char *)uprv_malloc(sizeof(char)*(uprv_strlen(outputFileName) + uprv_strlen(xliffExt)) +1);
        uprv_memset(xmlfileName, 0, sizeof(char)*(uprv_strlen(outputFileName) + uprv_strlen(xliffExt)) +1);
    }

    if(outputDir){
        uprv_strcpy(xmlfileName, outputDir);
        if(outputDir[uprv_strlen(outputDir)-1] !=U_FILE_SEP_CHAR){
            uprv_strcat(xmlfileName,U_FILE_SEP_STRING);
        }
    }
    uprv_strcat(xmlfileName,outputFileName);
    uprv_strcat(xmlfileName,xliffExt);

    if (writtenFilename) {
        uprv_strncpy(writtenFilename, xmlfileName, writtenFilenameLen);
    }

    if (U_FAILURE(*status)) {
        goto cleanup_bundle_write_xml;
    }

    out= T_FileStream_open(xmlfileName,"w");

    if(out==NULL){
        *status = U_FILE_ACCESS_ERROR;
        goto cleanup_bundle_write_xml;
    }
    Accumulator.append(xmlHeader); 
    //T_FileStream_write(out,xmlHeader, (int32_t)uprv_strlen(xmlHeader));

    if(outputEnc && *outputEnc!='\0'){
        /* store the output encoding */
        enc = outputEnc;
        conv=ucnv_open(enc,status);
        if(U_FAILURE(*status)){
            goto cleanup_bundle_write_xml;
        }
    }
    Accumulator.append(bundleStart); 
    //T_FileStream_write(out,bundleStart, (int32_t)uprv_strlen(bundleStart));
    write_tabs(&Accumulator);
    Accumulator.append(fileStart); 
    //T_FileStream_write(out, fileStart, (int32_t)uprv_strlen(fileStart));
    /* check if lang and language are the same */
    if(language != NULL && uprv_strcmp(lang, srBundle->fLocale)!=0){
        fprintf(stderr,"Warning: The top level tag in the resource and language specified are not the same. Please check the input.\n");
    }
    Accumulator.append(UnicodeString(lang)); 
    //T_FileStream_write(out,lang, (int32_t)uprv_strlen(lang));
    Accumulator.append(UnicodeString(file1)); 
    //T_FileStream_write(out,file1, (int32_t)uprv_strlen(file1));
    Accumulator.append(UnicodeString(file2)); 
    //T_FileStream_write(out,file2, (int32_t)uprv_strlen(file2));
    Accumulator.append(UnicodeString(originalFileName)); 
    //T_FileStream_write(out,originalFileName, (int32_t)uprv_strlen(originalFileName));  
    Accumulator.append(UnicodeString(file4)); 
    //T_FileStream_write(out,file4, (int32_t)uprv_strlen(file4));

    time(&currTime);
    strftime(timeBuf, sizeof(timeBuf), "%Y-%m-%dT%H:%M:%SZ", gmtime(&currTime));

    Accumulator.append(UnicodeString(timeBuf)); 
    Accumulator.append(UnicodeString("\">\n"));
    //T_FileStream_write(out,timeBuf, (int32_t)uprv_strlen(timeBuf));

    //T_FileStream_write(out,"\">\n", 3);

    tabCount += 1;
    write_tabs(&Accumulator);
    Accumulator.append(headerStart); 
    //T_FileStream_write(out,headerStart, (int32_t)uprv_strlen(headerStart));

    tabCount += 1;
    write_tabs(&Accumulator);

    Accumulator.append(tool_start); 
    //T_FileStream_write(out, tool_start, (int32_t) uprv_strlen(tool_start));
    printAttribute(&Accumulator, "tool-id", tool_id, (int32_t) uprv_strlen(tool_id));
    printAttribute(&Accumulator, "tool-name", tool_name, (int32_t) uprv_strlen(tool_name));

    Accumulator.append(UnicodeString("/>\n")); 
    //T_FileStream_write(out, "/>\n", 3);

    tabCount -= 1;
    write_tabs(&Accumulator);

    Accumulator.append(UnicodeString(headerEnd)); 
    //T_FileStream_write(out,headerEnd, (int32_t)uprv_strlen(headerEnd));

    write_tabs(&Accumulator);
    tabCount += 1;

    Accumulator.append(UnicodeString(bodyStart));
    //T_FileStream_write(out,bodyStart, (int32_t)uprv_strlen(bodyStart));


    res_write_xml(&Accumulator, bundle->fRoot, bundle->fLocale, lang, TRUE, status);

    tabCount -= 1;
    write_tabs(&Accumulator);

    Accumulator.append(UnicodeString(bodyEnd)); 
    //T_FileStream_write(out,bodyEnd, (int32_t)uprv_strlen(bodyEnd));
    tabCount--;
    write_tabs(&Accumulator);

    Accumulator.append(UnicodeString(fileEnd));
    //T_FileStream_write(out,fileEnd, (int32_t)uprv_strlen(fileEnd));
    tabCount--;
    write_tabs(&Accumulator);
    Accumulator.append(UnicodeString(bundleEnd));
    //T_FileStream_write(out,bundleEnd,(int32_t)uprv_strlen(bundleEnd));

    write_utf8_file(Accumulator, out, status); 
    T_FileStream_close(out);

    ucnv_close(conv);

cleanup_bundle_write_xml:
    uprv_free(originalFileName);
    uprv_free(lang);
    if(xmlfileName != NULL) {
        uprv_free(xmlfileName);
    }
    if(outputFileName != NULL){
        uprv_free(outputFileName);
    }
}

