1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*******************************************************************************
3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
4b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru*   Copyright (C) 2002-2009, International Business Machines
5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   Corporation and others.  All Rights Reserved.
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*******************************************************************************
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
9b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru* File wrtxml.cpp
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Modification History:
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   Date        Name        Description
14c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru*   10/01/02    Ram         Creation.
15c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru*   02/07/08    Spieth      Correct XLIFF generation on EBCDIC platform
16c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru*
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*******************************************************************************
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "reslist.h"
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unewdata.h"
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ures.h"
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "errmsg.h"
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "filestrm.h"
24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "cstring.h"
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ucnv.h"
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "genrb.h"
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "rle.h"
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ucol_tok.h"
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "uhash.h"
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "uresimp.h"
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ustring.h"
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/uchar.h"
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ustr.h"
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "prscmnts.h"
35c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#include "unicode/unistr.h"
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <time.h>
37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
38c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruU_NAMESPACE_USE
39c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic int tabCount = 0;
41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic FileStream* out=NULL;
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic struct SRBRoot* srBundle ;
44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char* outDir = NULL;
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char* enc ="";
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic UConverter* conv = NULL;
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst char* const* ISOLanguages;
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst char* const* ISOCountries;
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst char* textExt = ".txt";
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst char* xliffExt = ".xlf";
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
53b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic int32_t write_utf8_file(FileStream* fileStream, UnicodeString outString)
54b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{
55b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
56c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    int32_t len = 0;
57c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
58b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // preflight to get the destination buffer size
59b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u_strToUTF8(NULL,
60b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                0,
61b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                &len,
62b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                outString.getBuffer(),
63b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                outString.length(),
64b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                &status);
65b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
66b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // allocate the buffer
67b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    char* dest = (char*)uprv_malloc(len);
68b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    status = U_ZERO_ERROR;
69b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
70b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // convert the data
71b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u_strToUTF8(dest,
72b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                len,
73b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                &len,
74b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                outString.getBuffer(),
75b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                outString.length(),
76b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                &status);
77b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
78b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // write data to out file
79b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t ret = T_FileStream_write(fileStream, dest, len);
80c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    uprv_free(dest);
81b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    return (ret);
82c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
83c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*write indentation for formatting*/
85b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void write_tabs(FileStream* os){
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int i=0;
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for(;i<=tabCount;i++){
88b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_utf8_file(os,UnicodeString("    "));
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*get ID for each element. ID is globally unique.*/
9350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic char* getID(const char* id, const char* curKey, char* result) {
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(curKey == NULL) {
95c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        result = (char *)uprv_malloc(sizeof(char)*uprv_strlen(id) + 1);
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uprv_memset(result, 0, sizeof(char)*uprv_strlen(id) + 1);
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uprv_strcpy(result, id);
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
99c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        result = (char *)uprv_malloc(sizeof(char)*(uprv_strlen(id) + 1 + uprv_strlen(curKey)) + 1);
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uprv_memset(result, 0, sizeof(char)*(uprv_strlen(id) + 1 + uprv_strlen(curKey)) + 1);
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(id[0]!='\0'){
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            uprv_strcpy(result, id);
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            uprv_strcat(result, "_");
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uprv_strcat(result, curKey);
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return result;
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*compute CRC for binary code*/
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* The code is from  http://www.theorem.com/java/CRC32.java
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Calculates the CRC32 - 32 bit Cyclical Redundancy Check
113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * <P> This check is used in numerous systems to verify the integrity
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * of information.  It's also used as a hashing function.  Unlike a regular
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * checksum, it's sensitive to the order of the characters.
116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * It produces a 32 bit
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @author Michael Lecuyer (mjl@theorem.com)
119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @version 1.1 August 11, 1998
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* ICU is not endian portable, because ICU data generated on big endian machines can be
123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * ported to big endian machines but not to little endian machines and vice versa. The
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * conversion is not portable across platforms with different endianess.
125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
12750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouint32_t computeCRC(char *ptr, uint32_t len, uint32_t lastcrc){
128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t crc;
129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint32_t temp1;
130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint32_t temp2;
131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t crc_ta[256];
133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int i = 0;
134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int j = 0;
135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint32_t crc2 = 0;
136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define CRC32_POLYNOMIAL 0xEDB88320
138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*build crc table*/
140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for (i = 0; i <= 255; i++) {
141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        crc2 = i;
142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        for (j = 8; j > 0; j--) {
143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if ((crc2 & 1) == 1) {
144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                crc2 = (crc2 >> 1) ^ CRC32_POLYNOMIAL;
145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            } else {
146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                crc2 >>= 1;
147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        crc_ta[i] = crc2;
150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    crc = lastcrc;
153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while(len--!=0) {
154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        temp1 = (uint32_t)crc>>8;
155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        temp2 = crc_ta[(crc^*ptr) & 0xFF];
156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        crc = temp1^temp2;
157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ptr++;
158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return(crc);
160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void strnrepchr(char* src, int32_t srcLen, char s, char r){
163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t i = 0;
164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for(i=0;i<srcLen;i++){
165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(src[i]==s){
166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            src[i]=r;
167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* Parse the filename, and get its language information.
171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * If it fails to get the language information from the filename,
172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * use "en" as the default value for language
173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
174b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic char* parseFilename(const char* id, char* /*lang*/) {
175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int idLen = (int) uprv_strlen(id);
176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char* localeID = (char*) uprv_malloc(idLen);
177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int pos = 0;
178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int canonCapacity = 0;
179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char* canon = NULL;
180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int canonLen = 0;
181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*int i;*/
182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
183c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    const char *ext = uprv_strchr(id, '.');
184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(ext != NULL){
186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        pos = (int) (ext - id);
187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        pos = idLen;
189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uprv_memcpy(localeID, id, pos);
191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    localeID[pos]=0; /* NUL terminate the string */
192b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    canonCapacity =pos*3;
194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    canon = (char*) uprv_malloc(canonCapacity);
195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    canonLen = uloc_canonicalize(localeID, canon, canonCapacity, &status);
196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)){
198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fprintf(stderr, "Could not canonicalize the locale ID: %s. Error: %s\n", localeID, u_errorName(status));
199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        exit(status);
200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    strnrepchr(canon, canonLen, '_', '-');
202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return canon;
203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char* xmlHeader = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if 0
207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char* bundleStart = "<xliff version = \"1.2\" "
208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                        "xmlns='urn:oasis:names:tc:xliff:document:1.2' "
209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                        "xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' "
210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                        "xsi:schemaLocation='urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd'>\n";
211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#else
212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char* bundleStart = "<xliff version = \"1.1\" "
213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                        "xmlns='urn:oasis:names:tc:xliff:document:1.1' "
214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                        "xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' "
215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                        "xsi:schemaLocation='urn:oasis:names:tc:xliff:document:1.1 http://www.oasis-open.org/committees/xliff/documents/xliff-core-1.1.xsd'>\n";
216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char* bundleEnd   = "</xliff>\n";
218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
219b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid res_write_xml(struct SResource *res, const char* id, const char* language, UBool isTopLevel, UErrorCode *status);
220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic char* convertAndEscape(char** pDest, int32_t destCap, int32_t* destLength,
222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                              const UChar* src, int32_t srcLen, UErrorCode* status){
223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t srcIndex=0;
224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char* dest=NULL;
225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char* temp=NULL;
226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t destLen=0;
227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar32 c = 0;
228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(status==NULL || U_FAILURE(*status) || pDest==NULL  || srcLen==0 || src == NULL){
230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return NULL;
231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    dest =*pDest;
233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(dest==NULL || destCap <=0){
234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        destCap = srcLen * 8;
235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        dest = (char*) uprv_malloc(sizeof(char) * destCap);
236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(dest==NULL){
237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            *status=U_MEMORY_ALLOCATION_ERROR;
238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return NULL;
239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    dest[0]=0;
243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while(srcIndex<srcLen){
245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        U16_NEXT(src, srcIndex, srcLen, c);
246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (U16_IS_LEAD(c) || U16_IS_TRAIL(c)) {
248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            *status = U_ILLEGAL_CHAR_FOUND;
249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            fprintf(stderr, "Illegal Surrogate! \n");
250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            uprv_free(dest);
251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return NULL;
252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if((destLen+UTF8_CHAR_LENGTH(c)) < destCap){
255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            /* ASCII Range */
257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(c <=0x007F){
258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                switch(c) {
259c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                case '\x26':
260c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    uprv_strcpy(dest+( destLen),"\x26\x61\x6d\x70\x3b"); /* &amp;*/
261c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    destLen+=(int32_t)uprv_strlen("\x26\x61\x6d\x70\x3b");
262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    break;
263c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                case '\x3c':
264c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    uprv_strcpy(dest+(destLen),"\x26\x6c\x74\x3b"); /* &lt;*/
265c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    destLen+=(int32_t)uprv_strlen("\x26\x6c\x74\x3b");
266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    break;
267c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                case '\x3e':
268c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    uprv_strcpy(dest+(destLen),"\x26\x67\x74\x3b"); /* &gt;*/
269c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    destLen+=(int32_t)uprv_strlen("\x26\x67\x74\x3b");
270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    break;
271c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                case '\x22':
272c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    uprv_strcpy(dest+(destLen),"\x26\x71\x75\x6f\x74\x3b"); /* &quot;*/
273c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    destLen+=(int32_t)uprv_strlen("\x26\x71\x75\x6f\x74\x3b");
274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    break;
275c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                case '\x27':
276c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    uprv_strcpy(dest+(destLen),"\x26\x61\x70\x6f\x73\x3b"); /* &apos; */
277c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    destLen+=(int32_t)uprv_strlen("\x26\x61\x70\x6f\x73\x3b");
278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    break;
279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                 /* Disallow C0 controls except TAB, CR, LF*/
281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case 0x00:
282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case 0x01:
283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case 0x02:
284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case 0x03:
285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case 0x04:
286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case 0x05:
287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case 0x06:
288ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case 0x07:
289ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case 0x08:
290ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                /*case 0x09:*/
291ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                /*case 0x0A: */
292ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case 0x0B:
293ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case 0x0C:
294ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                /*case 0x0D:*/
295ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case 0x0E:
296ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case 0x0F:
297ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case 0x10:
298ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case 0x11:
299ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case 0x12:
300ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case 0x13:
301ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case 0x14:
302ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case 0x15:
303ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case 0x16:
304ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case 0x17:
305ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case 0x18:
306ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case 0x19:
307ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case 0x1A:
308ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case 0x1B:
309ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case 0x1C:
310ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case 0x1D:
311ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case 0x1E:
312ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                case 0x1F:
313ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    *status = U_ILLEGAL_CHAR_FOUND;
314ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    fprintf(stderr, "Illegal Character \\u%04X!\n",(int)c);
315ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    uprv_free(dest);
316ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    return NULL;
317ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                default:
318ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    dest[destLen++]=(char)c;
319ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                }
320ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }else{
321ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                UBool isError = FALSE;
322ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                U8_APPEND((unsigned char*)dest,destLen,destCap,c,isError);
323ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                if(isError){
324ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    *status = U_ILLEGAL_CHAR_FOUND;
325ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    fprintf(stderr, "Illegal Character \\U%08X!\n",(int)c);
326ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    uprv_free(dest);
327ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    return NULL;
328ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                }
329ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
330ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }else{
331ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            destCap += destLen;
332ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
333ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            temp = (char*) uprv_malloc(sizeof(char)*destCap);
334ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(temp==NULL){
335ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                *status=U_MEMORY_ALLOCATION_ERROR;
336ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                uprv_free(dest);
337ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                return NULL;
338ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
339ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            uprv_memmove(temp,dest,destLen);
340ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            destLen=0;
341ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            uprv_free(dest);
342ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            dest=temp;
343ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            temp=NULL;
344ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
345ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
346ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
347ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    *destLength = destLen;
348ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return dest;
349ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
350ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
351ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define ASTERISK 0x002A
352ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define SPACE    0x0020
353ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define CR       0x000A
354ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define LF       0x000D
355ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define AT_SIGN  0x0040
356ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
357ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
358ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutrim(char **src, int32_t *len){
359ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
360ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *s = NULL;
361ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t i = 0;
362ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(src == NULL || *src == NULL){
363ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
364ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
365ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    s = *src;
366ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* trim from the end */
367ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for( i=(*len-1); i>= 0; i--){
368ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        switch(s[i]){
369ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        case ASTERISK:
370ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        case SPACE:
371ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        case CR:
372ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        case LF:
373ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            s[i] = 0;
374ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            continue;
375ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        default:
376ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            break;
377ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
378ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        break;
379ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
380ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
381ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    *len = i+1;
382ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
383ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
384ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
385b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruprint(UChar* src, int32_t srcLen,const char *tagStart,const char *tagEnd,  UErrorCode *status){
386ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t bufCapacity   = srcLen*4;
387ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *buf       = NULL;
388ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t bufLen = 0;
389ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
390ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(*status)){
391ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
392ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
393ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
394ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    buf = (char*) (uprv_malloc(bufCapacity));
395ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(buf==0){
396ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fprintf(stderr, "Could not allocate memory!!");
397ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        exit(U_MEMORY_ALLOCATION_ERROR);
398ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
399ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    buf = convertAndEscape(&buf, bufCapacity, &bufLen, src, srcLen,status);
400ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_SUCCESS(*status)){
401ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        trim(&buf,&bufLen);
402b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_utf8_file(out,UnicodeString(tagStart));
403b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_utf8_file(out,UnicodeString(buf, bufLen, "UTF-8"));
404b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_utf8_file(out,UnicodeString(tagEnd));
405b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_utf8_file(out,UnicodeString("\n"));
406ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
407ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
408ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
409ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
410b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruprintNoteElements(struct UString *src, UErrorCode *status){
411ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
412ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if UCONFIG_NO_REGULAR_EXPRESSIONS==0 /* donot compile when no RegularExpressions are available */
413ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
414ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t capacity = 0;
415ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar* note = NULL;
416ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t noteLen = 0;
417ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t count = 0,i;
418ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
419ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(src == NULL){
420ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
421ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
422ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
423ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    capacity = src->fLength;
424ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    note  = (UChar*) uprv_malloc(U_SIZEOF_UCHAR * capacity);
425ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
426ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    count = getCount(src->fChars,src->fLength, UPC_NOTE, status);
427ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(*status)){
428c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        uprv_free(note);
429ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
430ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
431ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for(i=0; i < count; i++){
432ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        noteLen =  getAt(src->fChars,src->fLength, &note, capacity, i, UPC_NOTE, status);
433ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(U_FAILURE(*status)){
434c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            uprv_free(note);
435ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return;
436ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
437ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(noteLen > 0){
438b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            write_tabs(out);
439b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            print(note, noteLen,"<note>", "</note>", status);
440ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
441ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
442ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uprv_free(note);
443ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#else
444b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
445ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fprintf(stderr, "Warning: Could not output comments to XLIFF file. ICU has been built without RegularExpression support.\n");
446ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
447ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* UCONFIG_NO_REGULAR_EXPRESSIONS */
448ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
449ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
450ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
451b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void printAttribute(const char *name, const char *value, int32_t /*len*/)
452c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{
453b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(" "));
454b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(name));
455b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(" = \""));
456b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(value));
457b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString("\""));
458c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
459c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
460b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void printAttribute(const char *name, const UnicodeString value, int32_t /*len*/)
461ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
462b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(" "));
463b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(name));
464b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(" = \""));
465b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, value);
466b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString("\""));
467ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
468ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
469ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
470b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruprintComments(struct UString *src, const char *resName, UBool printTranslate, UErrorCode *status){
471ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
472ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if UCONFIG_NO_REGULAR_EXPRESSIONS==0 /* donot compile when no RegularExpressions are available */
473ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
474c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if(status==NULL || U_FAILURE(*status)){
475c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return;
476c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
477c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
478c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    int32_t capacity = src->fLength + 1;
479ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char* buf = NULL;
480ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t bufLen = 0;
481ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar* desc  = (UChar*) uprv_malloc(U_SIZEOF_UCHAR * capacity);
482ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar* trans = (UChar*) uprv_malloc(U_SIZEOF_UCHAR * capacity);
483ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
484ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t descLen = 0, transLen=0;
485ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(desc==NULL || trans==NULL){
486ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        *status = U_MEMORY_ALLOCATION_ERROR;
487ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uprv_free(desc);
488ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uprv_free(trans);
489ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
490ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
491ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    src->fLength = removeCmtText(src->fChars, src->fLength, status);
492ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    descLen  = getDescription(src->fChars,src->fLength, &desc, capacity, status);
493ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    transLen = getTranslate(src->fChars,src->fLength, &trans, capacity, status);
494ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
495ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* first print translate attribute */
496ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(transLen > 0){
497ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(printTranslate){
498ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            /* print translate attribute */
499ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            buf = convertAndEscape(&buf, 0, &bufLen, trans, transLen, status);
500ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(U_SUCCESS(*status)){
501b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                printAttribute("translate", UnicodeString(buf, bufLen, "UTF-8"), bufLen);
502b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                write_utf8_file(out,UnicodeString(">\n"));
503ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
504ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }else if(getShowWarning()){
505ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            fprintf(stderr, "Warning: Tranlate attribute for resource %s cannot be set. XLIFF prohibits it.\n", resName);
506ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            /* no translate attribute .. just close the tag */
507b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            write_utf8_file(out,UnicodeString(">\n"));
508ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
509ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }else{
510ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* no translate attribute .. just close the tag */
511b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_utf8_file(out,UnicodeString(">\n"));
512ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
513ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
514ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(descLen > 0){
515b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_tabs(out);
516b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        print(desc, descLen, "<!--", "-->", status);
517ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
518c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
519c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    uprv_free(desc);
520c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    uprv_free(trans);
521ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#else
522ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
523ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fprintf(stderr, "Warning: Could not output comments to XLIFF file. ICU has been built without RegularExpression support.\n");
524ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
525ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* UCONFIG_NO_REGULAR_EXPRESSIONS */
526ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
527ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
528ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
529ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
530ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Print out a containing element, like:
531ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * <trans-unit id = "blah" resname = "blah" restype = "x-id-alias" translate = "no">
532ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * <group id "calendar_gregorian" resname = "gregorian" restype = "x-icu-array">
533ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
534b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic char *printContainer(struct SResource *res, const char *container, const char *restype, const char *mimetype, const char *id, UErrorCode *status)
535ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
53650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    char resKeyBuffer[8];
53750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const char *resname = NULL;
538ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *sid = NULL;
539ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
540b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_tabs(out);
541ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
54250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    resname = res_getKeyString(srBundle, res, resKeyBuffer);
54350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (resname != NULL && *resname != 0) {
544ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        sid = getID(id, resname, sid);
545ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
546ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        sid = getID(id, NULL, sid);
547ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
548ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
549b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString("<"));
550b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(container));
551b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    printAttribute("id", sid, (int32_t) uprv_strlen(sid));
552ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
553ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (resname != NULL) {
554b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        printAttribute("resname", resname, (int32_t) uprv_strlen(resname));
555ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
556ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
557ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (mimetype != NULL) {
558b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        printAttribute("mime-type", mimetype, (int32_t) uprv_strlen(mimetype));
559ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
560ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
561ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (restype != NULL) {
562b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        printAttribute("restype", restype, (int32_t) uprv_strlen(restype));
563ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
564ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
565ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    tabCount += 1;
566c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (res->fComment.fLength > 0) {
567ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* printComments will print the closing ">\n" */
568b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        printComments(&res->fComment, resname, TRUE, status);
569ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
570b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_utf8_file(out, UnicodeString(">\n"));
571ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
572ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
573ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return sid;
574ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
575ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
576ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* Writing Functions */
577ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
578ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char *trans_unit = "trans-unit";
579ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char *close_trans_unit = "</trans-unit>\n";
580ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char *source = "<source>";
581ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char *close_source = "</source>\n";
582ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char *group = "group";
583ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char *close_group = "</group>\n";
584ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
585ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char *bin_unit = "bin-unit";
586ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char *close_bin_unit = "</bin-unit>\n";
587ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char *bin_source = "<bin-source>\n";
588ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char *close_bin_source = "</bin-source>\n";
589ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char *external_file = "<external-file";
590ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*static const char *close_external_file = "</external-file>\n";*/
591ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char *internal_file = "<internal-file";
592ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char *close_internal_file = "</internal-file>\n";
593ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
594ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char *application_mimetype = "application"; /* add "/octet-stream"? */
595ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
596ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char *alias_restype     = "x-icu-alias";
597ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char *array_restype     = "x-icu-array";
598ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char *binary_restype    = "x-icu-binary";
599ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char *integer_restype   = "x-icu-integer";
600ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char *intvector_restype = "x-icu-intvector";
601ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char *table_restype     = "x-icu-table";
602ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
603ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
604b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustring_write_xml(struct SResource *res, const char* id, const char* /*language*/, UErrorCode *status) {
605ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
606ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *sid = NULL;
607ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char* buf = NULL;
608ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t bufLen = 0;
609ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
610ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(status==NULL || U_FAILURE(*status)){
611ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
612ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
613ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
614b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    sid = printContainer(res, trans_unit, NULL, NULL, id, status);
615ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
616b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_tabs(out);
617ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
618b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(source));
619ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
620ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    buf = convertAndEscape(&buf, 0, &bufLen, res->u.fString.fChars, res->u.fString.fLength, status);
621ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
622ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(*status)) {
623ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
624ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
625ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
626b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(buf, bufLen, "UTF-8"));
627b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(close_source));
628ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
629b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    printNoteElements(&res->fComment, status);
630ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
631ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    tabCount -= 1;
632b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_tabs(out);
633ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
634b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(close_trans_unit));
635ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
636ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uprv_free(buf);
637ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uprv_free(sid);
638ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
639ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
640ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
641b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querualias_write_xml(struct SResource *res, const char* id, const char* /*language*/, UErrorCode *status) {
642ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *sid = NULL;
643ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char* buf = NULL;
644ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t bufLen=0;
645ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
646b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    sid = printContainer(res, trans_unit, alias_restype, NULL, id, status);
647ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
648b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_tabs(out);
649ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
650b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(source));
651ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
652ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    buf = convertAndEscape(&buf, 0, &bufLen, res->u.fString.fChars, res->u.fString.fLength, status);
653b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
654ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(*status)){
655ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
656ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
657b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(buf, bufLen, "UTF-8"));
658b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(close_source));
659ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
660b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    printNoteElements(&res->fComment, status);
661ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
662ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    tabCount -= 1;
663b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_tabs(out);
664ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
665b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(close_trans_unit));
666ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
667ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uprv_free(buf);
668ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uprv_free(sid);
669ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
670ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
671ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
672b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruarray_write_xml(struct SResource *res, const char* id, const char* language, UErrorCode *status) {
673ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char* sid = NULL;
674ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int index = 0;
675ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
676ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    struct SResource *current = NULL;
677ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    struct SResource *first =NULL;
678ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
679b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    sid = printContainer(res, group, array_restype, NULL, id, status);
680ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
681ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    current = res->u.fArray.fFirst;
682ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    first=current;
683ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
684ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while (current != NULL) {
685ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        char c[256] = {0};
686ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        char* subId = NULL;
687ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
688ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        itostr(c, index, 10, 0);
689ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        index += 1;
690ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        subId = getID(sid, c, subId);
691ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
692b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        res_write_xml(current, subId, language, FALSE, status);
693ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uprv_free(subId);
694ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        subId = NULL;
695ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
696ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(U_FAILURE(*status)){
697ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return;
698ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
699ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
700ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        current = current->fNext;
701ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
702ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
703ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    tabCount -= 1;
704b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_tabs(out);
705b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(close_group));
706ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
707ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uprv_free(sid);
708ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
709ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
710ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
711b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruintvector_write_xml(struct SResource *res, const char* id, const char* /*language*/, UErrorCode *status) {
712ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char* sid = NULL;
713ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char* ivd = NULL;
714ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint32_t i=0;
715ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint32_t len=0;
716ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char buf[256] = {'0'};
717ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
718b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    sid = printContainer(res, group, intvector_restype, NULL, id, status);
719ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
720ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for(i = 0; i < res->u.fIntVector.fCount; i += 1) {
721ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        char c[256] = {0};
722ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
723ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        itostr(c, i, 10, 0);
724ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ivd = getID(sid, c, ivd);
725ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        len = itostr(buf, res->u.fIntVector.fArray[i], 10, 0);
726ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
727b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_tabs(out);
728b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_utf8_file(out, UnicodeString("<"));
729b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_utf8_file(out, UnicodeString(trans_unit));
730ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
731b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        printAttribute("id", ivd, (int32_t)uprv_strlen(ivd));
732b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        printAttribute("restype", integer_restype, (int32_t) strlen(integer_restype));
733ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
734b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_utf8_file(out, UnicodeString(">\n"));
735ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
736ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        tabCount += 1;
737b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_tabs(out);
738b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_utf8_file(out, UnicodeString(source));
739ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
740b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_utf8_file(out, UnicodeString(buf, len));
741ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
742b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_utf8_file(out, UnicodeString(close_source));
743ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        tabCount -= 1;
744b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_tabs(out);
745b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_utf8_file(out, UnicodeString(close_trans_unit));
746ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
747ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uprv_free(ivd);
748ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ivd = NULL;
749ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
750ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
751ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    tabCount -= 1;
752b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_tabs(out);
753ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
754b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(close_group));
755ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uprv_free(sid);
756ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    sid = NULL;
757ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
758ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
759ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
760b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruint_write_xml(struct SResource *res, const char* id, const char* /*language*/, UErrorCode *status) {
761ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char* sid = NULL;
762ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char buf[256] = {0};
763ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint32_t len = 0;
764ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
765b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    sid = printContainer(res, trans_unit, integer_restype, NULL, id, status);
766ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
767b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_tabs(out);
768ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
769b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(source));
770ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
771ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    len = itostr(buf, res->u.fIntValue.fValue, 10, 0);
772b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(buf, len));
773ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
774b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(close_source));
775ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
776b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    printNoteElements(&res->fComment, status);
777ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
778ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    tabCount -= 1;
779b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_tabs(out);
780ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
781b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(close_trans_unit));
782ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
783ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uprv_free(sid);
784ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    sid = NULL;
785ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
786ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
787ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
788b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querubin_write_xml(struct SResource *res, const char* id, const char* /*language*/, UErrorCode *status) {
789ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* m_type = application_mimetype;
790ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char* sid = NULL;
791ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint32_t crc = 0xFFFFFFFF;
792ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
793ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char fileName[1024] ={0};
794ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t tLen = ( outDir == NULL) ? 0 :(int32_t)uprv_strlen(outDir);
795ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char* fn =  (char*) uprv_malloc(sizeof(char) * (tLen+1024 +
796ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                                    (res->u.fBinaryValue.fFileName !=NULL ?
797ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                                    uprv_strlen(res->u.fBinaryValue.fFileName) :0)));
798ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* ext = NULL;
799ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
800ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char* f = NULL;
801ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
802ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fn[0]=0;
803ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
804ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(res->u.fBinaryValue.fFileName != NULL){
805ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uprv_strcpy(fileName, res->u.fBinaryValue.fFileName);
806ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        f = uprv_strrchr(fileName, '\\');
807ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
808ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (f != NULL) {
809ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            f++;
810ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        } else {
811ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            f = fileName;
812ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
813ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
814ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ext = uprv_strrchr(fileName, '.');
815ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
816ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (ext == NULL) {
817ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            fprintf(stderr, "Error: %s is an unknown binary filename type.\n", fileName);
818ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            exit(U_ILLEGAL_ARGUMENT_ERROR);
819ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
820ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
821ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(uprv_strcmp(ext, ".jpg")==0 || uprv_strcmp(ext, ".jpeg")==0 || uprv_strcmp(ext, ".gif")==0 ){
822ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            m_type = "image";
823ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        } else if(uprv_strcmp(ext, ".wav")==0 || uprv_strcmp(ext, ".au")==0 ){
824ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            m_type = "audio";
825ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        } else if(uprv_strcmp(ext, ".avi")==0 || uprv_strcmp(ext, ".mpg")==0 || uprv_strcmp(ext, ".mpeg")==0){
826ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            m_type = "video";
827ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        } else if(uprv_strcmp(ext, ".txt")==0 || uprv_strcmp(ext, ".text")==0){
828ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            m_type = "text";
829ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
830ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
831b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        sid = printContainer(res, bin_unit, binary_restype, m_type, id, status);
832ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
833b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_tabs(out);
834ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
835b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_utf8_file(out, UnicodeString(bin_source));
836ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
837ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        tabCount+= 1;
838b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_tabs(out);
839ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
840b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_utf8_file(out, UnicodeString(external_file));
841b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        printAttribute("href", f, (int32_t)uprv_strlen(f));
842b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_utf8_file(out, UnicodeString("/>\n"));
843ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        tabCount -= 1;
844b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_tabs(out);
845ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
846b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_utf8_file(out, UnicodeString(close_bin_source));
847ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
848b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        printNoteElements(&res->fComment, status);
849ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        tabCount -= 1;
850b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_tabs(out);
851b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_utf8_file(out, UnicodeString(close_bin_unit));
852ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
853ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        char temp[256] = {0};
854ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uint32_t i = 0;
855ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        int32_t len=0;
856ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
857b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        sid = printContainer(res, bin_unit, binary_restype, m_type, id, status);
858ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
859b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_tabs(out);
860b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_utf8_file(out, UnicodeString(bin_source));
861ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
862ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        tabCount += 1;
863b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_tabs(out);
864ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
865b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_utf8_file(out, UnicodeString(internal_file));
866b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        printAttribute("form", application_mimetype, (int32_t) uprv_strlen(application_mimetype));
867ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
868ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        while(i <res->u.fBinaryValue.fLength){
869ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            len = itostr(temp, res->u.fBinaryValue.fData[i], 16, 2);
870ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            crc = computeCRC(temp, len, crc);
871ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            i++;
872ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
873ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
874ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        len = itostr(temp, crc, 10, 0);
875b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        printAttribute("crc", temp, len);
876ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
877b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_utf8_file(out, UnicodeString(">"));
878ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
879ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        i = 0;
880ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        while(i <res->u.fBinaryValue.fLength){
881ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            len = itostr(temp, res->u.fBinaryValue.fData[i], 16, 2);
882b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            write_utf8_file(out, UnicodeString(temp));
883ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            i += 1;
884ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
885ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
886b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_utf8_file(out, UnicodeString(close_internal_file));
887ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
888ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        tabCount -= 2;
889b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_tabs(out);
890ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
891b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_utf8_file(out, UnicodeString(close_bin_source));
892b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        printNoteElements(&res->fComment, status);
893ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
894ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        tabCount -= 1;
895b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_tabs(out);
896b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        write_utf8_file(out, UnicodeString(close_bin_unit));
897ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
898ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uprv_free(sid);
899ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        sid = NULL;
900ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
901ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
902ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uprv_free(fn);
903ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
904ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
905ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
906ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
907ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
908b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querutable_write_xml(struct SResource *res, const char* id, const char* language, UBool isTopLevel, UErrorCode *status) {
909ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
910ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint32_t  i         = 0;
911ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
912ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    struct SResource *current = NULL;
913ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    struct SResource *save = NULL;
914ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char* sid = NULL;
915ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
916ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(*status)) {
917ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return ;
918ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
919ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
920b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    sid = printContainer(res, group, table_restype, NULL, id, status);
921ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
922ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(isTopLevel) {
923ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        sid[0] = '\0';
924ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
925ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
926ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    save = current = res->u.fTable.fFirst;
927ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    i = 0;
928ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
929ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while (current != NULL) {
930b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        res_write_xml(current, sid, language, FALSE, status);
931ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
932ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(U_FAILURE(*status)){
933ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return;
934ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
935ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
936ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        i += 1;
937ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        current = current->fNext;
938ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
939ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
940ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    tabCount -= 1;
941b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_tabs(out);
942ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
943b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(close_group));
944ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
945ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uprv_free(sid);
946ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    sid = NULL;
947ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
948ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
949ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid
950b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querures_write_xml(struct SResource *res, const char* id,  const char* language, UBool isTopLevel, UErrorCode *status) {
951ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
952ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(*status)) {
953ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return ;
954ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
955ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
956ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (res != NULL) {
957ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        switch (res->fType) {
958ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        case URES_STRING:
959b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru             string_write_xml    (res, id, language, status);
960ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             return;
961ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
962ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        case URES_ALIAS:
963b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru             alias_write_xml     (res, id, language, status);
964ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             return;
965ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
966ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        case URES_INT_VECTOR:
967b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru             intvector_write_xml (res, id, language, status);
968ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             return;
969ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
970ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        case URES_BINARY:
971b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru             bin_write_xml       (res, id, language, status);
972ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             return;
973ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
974ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        case URES_INT:
975b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru             int_write_xml       (res, id, language, status);
976ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             return;
977ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
978ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        case URES_ARRAY:
979b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru             array_write_xml     (res, id, language, status);
980ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             return;
981ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
982ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        case URES_TABLE:
983b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru             table_write_xml     (res, id, language, isTopLevel, status);
984ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             return;
985ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
986ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        default:
987ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            break;
988ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
989ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
990ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
991ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    *status = U_INTERNAL_PROGRAM_ERROR;
992ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
993ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
994ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid
995ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querubundle_write_xml(struct SRBRoot *bundle, const char *outputDir,const char* outputEnc, const char* filename,
996ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                  char *writtenFilename, int writtenFilenameLen,
997ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                  const char* language, const char* outFileName, UErrorCode *status) {
998ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
999ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char* xmlfileName = NULL;
1000ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char* outputFileName = NULL;
1001ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char* originalFileName = NULL;
1002ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* fileStart = "<file xml:space = \"preserve\" source-language = \"";
1003ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* file1 = "\" datatype = \"x-icu-resource-bundle\" ";
1004ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* file2 = "original = \"";
1005ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* file4 = "\" date = \"";
1006ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* fileEnd = "</file>\n";
1007ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* headerStart = "<header>\n";
1008ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* headerEnd = "</header>\n";
1009ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* bodyStart = "<body>\n";
1010ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* bodyEnd = "</body>\n";
1011ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1012ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *tool_start = "<tool";
1013ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *tool_id = "genrb-" GENRB_VERSION "-icu-" U_ICU_VERSION;
1014ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *tool_name = "genrb";
1015ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1016ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char* temp = NULL;
1017ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char* lang = NULL;
1018c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    const char* pos = NULL;
1019ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t first, index;
1020ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    time_t currTime;
1021ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char timeBuf[128];
1022ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1023ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    outDir = outputDir;
1024ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1025ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    srBundle = bundle;
1026ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1027ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    pos = uprv_strrchr(filename, '\\');
1028ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(pos != NULL) {
1029ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        first = (int32_t)(pos - filename + 1);
1030ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
1031ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        first = 0;
1032ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1033ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    index = (int32_t)(uprv_strlen(filename) - uprv_strlen(textExt) - first);
1034c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    originalFileName = (char *)uprv_malloc(sizeof(char)*index+1);
1035ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uprv_memset(originalFileName, 0, sizeof(char)*index+1);
1036ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uprv_strncpy(originalFileName, filename + first, index);
1037ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1038ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(uprv_strcmp(originalFileName, srBundle->fLocale) != 0) {
1039ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fprintf(stdout, "Warning: The file name is not same as the resource name!\n");
1040ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1041ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1042ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    temp = originalFileName;
1043c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    originalFileName = (char *)uprv_malloc(sizeof(char)* (uprv_strlen(temp)+uprv_strlen(textExt)) + 1);
1044ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uprv_memset(originalFileName, 0, sizeof(char)* (uprv_strlen(temp)+uprv_strlen(textExt)) + 1);
1045ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uprv_strcat(originalFileName, temp);
1046ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uprv_strcat(originalFileName, textExt);
1047ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uprv_free(temp);
1048ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    temp = NULL;
1049ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1050ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1051ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (language == NULL) {
1052ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*        lang = parseFilename(filename, lang);
1053ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (lang == NULL) {*/
1054ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            /* now check if locale name is valid or not
1055ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             * this is to cater for situation where
1056ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             * pegasusServer.txt contains
1057ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             *
1058ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             * en{
1059ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             *      ..
1060ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             * }
1061ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             */
1062ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             lang = parseFilename(srBundle->fLocale, lang);
1063ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             /*
1064ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru              * Neither  the file name nor the table name inside the
1065ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru              * txt file contain a valid country and language codes
1066ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru              * throw an error.
1067ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru              * pegasusServer.txt contains
1068ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru              *
1069ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru              * testelements{
1070ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru              *     ....
1071ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru              * }
1072ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru              */
1073ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             if(lang==NULL){
1074ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                 fprintf(stderr, "Error: The file name and table name do not contain a valid language code. Please use -l option to specify it.\n");
1075ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                 exit(U_ILLEGAL_ARGUMENT_ERROR);
1076ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             }
1077ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       /* }*/
1078ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
1079c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        lang = (char *)uprv_malloc(sizeof(char)*uprv_strlen(language) +1);
1080ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uprv_memset(lang, 0, sizeof(char)*uprv_strlen(language) +1);
1081ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uprv_strcpy(lang, language);
1082ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1083ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1084ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(outFileName) {
1085c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        outputFileName = (char *)uprv_malloc(sizeof(char)*uprv_strlen(outFileName) + 1);
1086ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uprv_memset(outputFileName, 0, sizeof(char)*uprv_strlen(outFileName) + 1);
1087ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uprv_strcpy(outputFileName,outFileName);
1088ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
1089c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        outputFileName = (char *)uprv_malloc(sizeof(char)*uprv_strlen(srBundle->fLocale) + 1);
1090ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uprv_memset(outputFileName, 0, sizeof(char)*uprv_strlen(srBundle->fLocale) + 1);
1091ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uprv_strcpy(outputFileName,srBundle->fLocale);
1092ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1093ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1094ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(outputDir) {
1095c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        xmlfileName = (char *)uprv_malloc(sizeof(char)*(uprv_strlen(outputDir) + uprv_strlen(outputFileName) + uprv_strlen(xliffExt) + 1) +1);
1096ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uprv_memset(xmlfileName, 0, sizeof(char)*(uprv_strlen(outputDir)+ uprv_strlen(outputFileName) + uprv_strlen(xliffExt) + 1) +1);
1097ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
1098c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        xmlfileName = (char *)uprv_malloc(sizeof(char)*(uprv_strlen(outputFileName) + uprv_strlen(xliffExt)) +1);
1099ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uprv_memset(xmlfileName, 0, sizeof(char)*(uprv_strlen(outputFileName) + uprv_strlen(xliffExt)) +1);
1100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(outputDir){
1103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uprv_strcpy(xmlfileName, outputDir);
1104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(outputDir[uprv_strlen(outputDir)-1] !=U_FILE_SEP_CHAR){
1105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            uprv_strcat(xmlfileName,U_FILE_SEP_STRING);
1106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
1107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uprv_strcat(xmlfileName,outputFileName);
1109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uprv_strcat(xmlfileName,xliffExt);
1110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (writtenFilename) {
1112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uprv_strncpy(writtenFilename, xmlfileName, writtenFilenameLen);
1113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(*status)) {
1116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        goto cleanup_bundle_write_xml;
1117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    out= T_FileStream_open(xmlfileName,"w");
1120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(out==NULL){
1122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        *status = U_FILE_ACCESS_ERROR;
1123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        goto cleanup_bundle_write_xml;
1124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1125b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, xmlHeader);
1126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(outputEnc && *outputEnc!='\0'){
1128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* store the output encoding */
1129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        enc = outputEnc;
1130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        conv=ucnv_open(enc,status);
1131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(U_FAILURE(*status)){
1132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            goto cleanup_bundle_write_xml;
1133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
1134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1135b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, bundleStart);
1136b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_tabs(out);
1137b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, fileStart);
1138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* check if lang and language are the same */
1139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(language != NULL && uprv_strcmp(lang, srBundle->fLocale)!=0){
1140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fprintf(stderr,"Warning: The top level tag in the resource and language specified are not the same. Please check the input.\n");
1141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1142b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(lang));
1143b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(file1));
1144b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(file2));
1145b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(originalFileName));
1146b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(file4));
1147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    time(&currTime);
1149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    strftime(timeBuf, sizeof(timeBuf), "%Y-%m-%dT%H:%M:%SZ", gmtime(&currTime));
1150b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(timeBuf));
1151b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString("\">\n"));
1152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    tabCount += 1;
1154b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_tabs(out);
1155b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, headerStart);
1156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    tabCount += 1;
1158b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_tabs(out);
1159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1160b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, tool_start);
1161b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    printAttribute("tool-id", tool_id, (int32_t) uprv_strlen(tool_id));
1162b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    printAttribute("tool-name", tool_name, (int32_t) uprv_strlen(tool_name));
1163b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString("/>\n"));
1164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    tabCount -= 1;
1166b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_tabs(out);
1167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1168b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(headerEnd));
1169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1170b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_tabs(out);
1171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    tabCount += 1;
1172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1173b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(bodyStart));
1174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1176b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    res_write_xml(bundle->fRoot, bundle->fLocale, lang, TRUE, status);
1177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    tabCount -= 1;
1179b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_tabs(out);
1180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1181b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(bodyEnd));
1182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    tabCount--;
1183b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_tabs(out);
1184b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(fileEnd));
1185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    tabCount--;
1186b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_tabs(out);
1187b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    write_utf8_file(out, UnicodeString(bundleEnd));
1188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    T_FileStream_close(out);
1189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(conv);
1191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querucleanup_bundle_write_xml:
1193c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    uprv_free(originalFileName);
1194c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    uprv_free(lang);
1195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(xmlfileName != NULL) {
1196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uprv_free(xmlfileName);
1197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(outputFileName != NULL){
1199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uprv_free(outputFileName);
1200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
1202