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