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