+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
/*
*******************************************************************************
*
-* Copyright (C) 2002-2008, International Business Machines
+* Copyright (C) 2002-2015, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
*
-* File wrtxml.c
+* File wrtxml.cpp
*
* Modification History:
*
*
*******************************************************************************
*/
+
+// Safer use of UnicodeString.
+#ifndef UNISTR_FROM_CHAR_EXPLICIT
+# define UNISTR_FROM_CHAR_EXPLICIT explicit
+#endif
+
+// Less important, but still a good idea.
+#ifndef UNISTR_FROM_STRING_EXPLICIT
+# define UNISTR_FROM_STRING_EXPLICIT explicit
+#endif
+
#include "reslist.h"
#include "unewdata.h"
#include "unicode/ures.h"
#include "unicode/ucnv.h"
#include "genrb.h"
#include "rle.h"
-#include "ucol_tok.h"
#include "uhash.h"
#include "uresimp.h"
#include "unicode/ustring.h"
#include "ustr.h"
#include "prscmnts.h"
#include "unicode/unistr.h"
+#include "unicode/utf8.h"
+#include "unicode/utf16.h"
#include <time.h>
U_NAMESPACE_USE
const char* textExt = ".txt";
const char* xliffExt = ".xlf";
-static void write_utf8_file(UnicodeString outString, FileStream * outFile, UErrorCode *status){
- char* dest = (char*)uprv_malloc((outString.length() * 3 /2));
+static int32_t write_utf8_file(FileStream* fileStream, UnicodeString outString)
+{
+ UErrorCode status = U_ZERO_ERROR;
int32_t len = 0;
- u_strToUTF8(dest,outString.length() * 3 /2,&len,outString.getBuffer(),outString.length(),status);
- T_FileStream_write(outFile, dest, len);
+ // preflight to get the destination buffer size
+ u_strToUTF8(NULL,
+ 0,
+ &len,
+ toUCharPtr(outString.getBuffer()),
+ outString.length(),
+ &status);
+
+ // allocate the buffer
+ char* dest = (char*)uprv_malloc(len);
+ status = U_ZERO_ERROR;
+
+ // convert the data
+ u_strToUTF8(dest,
+ len,
+ &len,
+ toUCharPtr(outString.getBuffer()),
+ outString.length(),
+ &status);
+
+ // write data to out file
+ int32_t ret = T_FileStream_write(fileStream, dest, len);
uprv_free(dest);
+ return (ret);
}
-
/*write indentation for formatting*/
-static void write_tabs(UnicodeString *Accumulator){
+static void write_tabs(FileStream* os){
int i=0;
for(;i<=tabCount;i++){
- Accumulator->append(UnicodeString(" "));
- //FileStream_write(os," ",4);
+ write_utf8_file(os,UnicodeString(" "));
}
}
/*get ID for each element. ID is globally unique.*/
-static char* getID(const char* id, char* curKey, char* result) {
+static char* getID(const char* id, const char* curKey, char* result) {
if(curKey == NULL) {
result = (char *)uprv_malloc(sizeof(char)*uprv_strlen(id) + 1);
uprv_memset(result, 0, sizeof(char)*uprv_strlen(id) + 1);
* conversion is not portable across platforms with different endianess.
*/
-static uint32_t computeCRC(char *ptr, uint32_t len, uint32_t lastcrc){
+uint32_t computeCRC(const char *ptr, uint32_t len, uint32_t lastcrc){
int32_t crc;
uint32_t temp1;
uint32_t temp2;
* If it fails to get the language information from the filename,
* use "en" as the default value for language
*/
-static char* parseFilename(const char* id, char* lang) {
+static char* parseFilename(const char* id, char* /*lang*/) {
int idLen = (int) uprv_strlen(id);
char* localeID = (char*) uprv_malloc(idLen);
int pos = 0;
}
uprv_memcpy(localeID, id, pos);
localeID[pos]=0; /* NUL terminate the string */
-
+
canonCapacity =pos*3;
canon = (char*) uprv_malloc(canonCapacity);
canonLen = uloc_canonicalize(localeID, canon, canonCapacity, &status);
#endif
static const char* bundleEnd = "</xliff>\n";
-void res_write_xml(UnicodeString *Accumulator, struct SResource *res, const char* id, const char* language, UBool isTopLevel, UErrorCode *status);
+void res_write_xml(struct SResource *res, const char* id, const char* language, UBool isTopLevel, UErrorCode *status);
static char* convertAndEscape(char** pDest, int32_t destCap, int32_t* destLength,
const UChar* src, int32_t srcLen, UErrorCode* status){
return NULL;
}
- if((destLen+UTF8_CHAR_LENGTH(c)) < destCap){
+ if((destLen+U8_LENGTH(c)) < destCap){
/* ASCII Range */
if(c <=0x007F){
#define LF 0x000D
#define AT_SIGN 0x0040
+#if UCONFIG_NO_REGULAR_EXPRESSIONS==0
static void
trim(char **src, int32_t *len){
}
static void
-print(UnicodeString *Accumulator, UChar* src, int32_t srcLen,const char *tagStart,const char *tagEnd, UErrorCode *status){
+print(UChar* src, int32_t srcLen,const char *tagStart,const char *tagEnd, UErrorCode *status){
int32_t bufCapacity = srcLen*4;
char *buf = NULL;
int32_t bufLen = 0;
buf = convertAndEscape(&buf, bufCapacity, &bufLen, src, srcLen,status);
if(U_SUCCESS(*status)){
trim(&buf,&bufLen);
- Accumulator->append(UnicodeString(tagStart));
- Accumulator->append(UnicodeString(buf, bufLen, "UTF-8"));
- Accumulator->append(UnicodeString(tagEnd));
- Accumulator->append(UnicodeString("\n"));
- //T_FileStream_write(out,tagStart, (int32_t)uprv_strlen(tagStart));
- //T_FileStream_write(out, buf, bufLen);
- //T_FileStream_write(out,tagEnd, (int32_t)uprv_strlen(tagEnd));
- //T_FileStream_write(out,"\n",1);
+ write_utf8_file(out,UnicodeString(tagStart));
+ write_utf8_file(out,UnicodeString(buf, bufLen, "UTF-8"));
+ write_utf8_file(out,UnicodeString(tagEnd));
+ write_utf8_file(out,UnicodeString("\n"));
}
}
+#endif
+
static void
-printNoteElements(UnicodeString *Accumulator, struct UString *src, UErrorCode *status){
+printNoteElements(const UString *src, UErrorCode *status){
#if UCONFIG_NO_REGULAR_EXPRESSIONS==0 /* donot compile when no RegularExpressions are available */
return;
}
if(noteLen > 0){
- write_tabs(Accumulator);
- print(Accumulator, note, noteLen,"<note>", "</note>", status);
+ write_tabs(out);
+ print(note, noteLen,"<note>", "</note>", status);
}
}
uprv_free(note);
#else
-
+
fprintf(stderr, "Warning: Could not output comments to XLIFF file. ICU has been built without RegularExpression support.\n");
#endif /* UCONFIG_NO_REGULAR_EXPRESSIONS */
}
-static void printAttribute(UnicodeString *Accumulator, const char *name, const char *value, int32_t len)
+static void printAttribute(const char *name, const char *value, int32_t /*len*/)
{
- Accumulator->append(UnicodeString(" "));
- Accumulator->append(UnicodeString(name));
- Accumulator->append(UnicodeString(" = \""));
- Accumulator->append(UnicodeString(value));
- Accumulator->append(UnicodeString("\""));
- //T_FileStream_write(out, " ", 1);
- //T_FileStream_write(out, name, (int32_t) uprv_strlen(name));
- //T_FileStream_write(out, " = \"", 4);
- //T_FileStream_write(out, value, (int32_t) len);
- //T_FileStream_write(out, "\"", 1);
+ write_utf8_file(out, UnicodeString(" "));
+ write_utf8_file(out, UnicodeString(name));
+ write_utf8_file(out, UnicodeString(" = \""));
+ write_utf8_file(out, UnicodeString(value));
+ write_utf8_file(out, UnicodeString("\""));
}
-static void printAttribute(UnicodeString *Accumulator, const char *name, const UnicodeString value, int32_t len)
+#if UCONFIG_NO_REGULAR_EXPRESSIONS==0 /* donot compile when no RegularExpressions are available */
+static void printAttribute(const char *name, const UnicodeString value, int32_t /*len*/)
{
- Accumulator->append(UnicodeString(" "));
- Accumulator->append(UnicodeString(name));
- Accumulator->append(UnicodeString(" = \""));
- Accumulator->append(value);
- Accumulator->append(UnicodeString("\""));
- //T_FileStream_write(out, " ", 1);
- //T_FileStream_write(out, name, (int32_t) uprv_strlen(name));
- //T_FileStream_write(out, " = \"", 4);
- //T_FileStream_write(out, value, (int32_t) len);
- //T_FileStream_write(out, "\"", 1);
+ write_utf8_file(out, UnicodeString(" "));
+ write_utf8_file(out, UnicodeString(name));
+ write_utf8_file(out, UnicodeString(" = \""));
+ write_utf8_file(out, value);
+ write_utf8_file(out, UnicodeString("\""));
}
+#endif
static void
-printComments(UnicodeString *Accumulator, struct UString *src, const char *resName, UBool printTranslate, UErrorCode *status){
+printComments(struct UString *src, const char *resName, UBool printTranslate, UErrorCode *status){
#if UCONFIG_NO_REGULAR_EXPRESSIONS==0 /* donot compile when no RegularExpressions are available */
uprv_free(trans);
return;
}
+ // TODO: make src const, stop modifying it in-place, make printContainer() take const resource, etc.
src->fLength = removeCmtText(src->fChars, src->fLength, status);
descLen = getDescription(src->fChars,src->fLength, &desc, capacity, status);
transLen = getTranslate(src->fChars,src->fLength, &trans, capacity, status);
/* print translate attribute */
buf = convertAndEscape(&buf, 0, &bufLen, trans, transLen, status);
if(U_SUCCESS(*status)){
- printAttribute(Accumulator, "translate", UnicodeString(buf, bufLen, "UTF-8"), bufLen);
- Accumulator->append(UnicodeString(">\n"));
- //T_FileStream_write(out,">\n", 2);
+ printAttribute("translate", UnicodeString(buf, bufLen, "UTF-8"), bufLen);
+ write_utf8_file(out,UnicodeString(">\n"));
}
}else if(getShowWarning()){
fprintf(stderr, "Warning: Tranlate attribute for resource %s cannot be set. XLIFF prohibits it.\n", resName);
/* no translate attribute .. just close the tag */
- Accumulator->append(UnicodeString(">\n"));
- //T_FileStream_write(out,">\n", 2);
+ write_utf8_file(out,UnicodeString(">\n"));
}
}else{
/* no translate attribute .. just close the tag */
- Accumulator->append(UnicodeString(">\n"));
- //T_FileStream_write(out,">\n", 2);
+ write_utf8_file(out,UnicodeString(">\n"));
}
if(descLen > 0){
- write_tabs(Accumulator);
- print(Accumulator, desc, descLen, "<!--", "-->", status);
+ write_tabs(out);
+ print(desc, descLen, "<!--", "-->", status);
}
uprv_free(desc);
* <trans-unit id = "blah" resname = "blah" restype = "x-id-alias" translate = "no">
* <group id "calendar_gregorian" resname = "gregorian" restype = "x-icu-array">
*/
-static char *printContainer(UnicodeString *Accumulator, struct SResource *res, const char *container, const char *restype, const char *mimetype, const char *id, UErrorCode *status)
+static char *printContainer(SResource *res, const char *container, const char *restype, const char *mimetype, const char *id, UErrorCode *status)
{
- char *resname = NULL;
+ const char *resname = NULL;
char *sid = NULL;
- write_tabs(Accumulator);
+ write_tabs(out);
- if (res->fKey >= 0 && uprv_strcmp(srBundle->fKeys + res->fKey, "") != 0) {
- resname = srBundle->fKeys + res->fKey;
+ resname = res->getKeyString(srBundle);
+ if (resname != NULL && *resname != 0) {
sid = getID(id, resname, sid);
} else {
sid = getID(id, NULL, sid);
}
- Accumulator->append(UnicodeString("<"));
- Accumulator->append(UnicodeString(container));
- //T_FileStream_write(out, "<", 1);
- //T_FileStream_write(out, container, (int32_t) uprv_strlen(container));
- printAttribute(Accumulator, "id", sid, (int32_t) uprv_strlen(sid));
+ write_utf8_file(out, UnicodeString("<"));
+ write_utf8_file(out, UnicodeString(container));
+ printAttribute("id", sid, (int32_t) uprv_strlen(sid));
if (resname != NULL) {
- printAttribute(Accumulator,"resname", resname, (int32_t) uprv_strlen(resname));
+ printAttribute("resname", resname, (int32_t) uprv_strlen(resname));
}
if (mimetype != NULL) {
- printAttribute(Accumulator,"mime-type", mimetype, (int32_t) uprv_strlen(mimetype));
+ printAttribute("mime-type", mimetype, (int32_t) uprv_strlen(mimetype));
}
if (restype != NULL) {
- printAttribute(Accumulator,"restype", restype, (int32_t) uprv_strlen(restype));
+ printAttribute("restype", restype, (int32_t) uprv_strlen(restype));
}
tabCount += 1;
if (res->fComment.fLength > 0) {
/* printComments will print the closing ">\n" */
- printComments(Accumulator, &res->fComment, resname, TRUE, status);
+ printComments(&res->fComment, resname, TRUE, status);
} else {
- Accumulator->append(UnicodeString(">\n"));
- //T_FileStream_write(out, ">\n", 2);
+ write_utf8_file(out, UnicodeString(">\n"));
}
return sid;
static const char *table_restype = "x-icu-table";
static void
-string_write_xml(UnicodeString *Accumulator, struct SResource *res, const char* id, const char* language, UErrorCode *status) {
+string_write_xml(StringResource *res, const char* id, const char* /*language*/, UErrorCode *status) {
char *sid = NULL;
char* buf = NULL;
return;
}
- sid = printContainer(Accumulator, res, trans_unit, NULL, NULL, id, status);
+ sid = printContainer(res, trans_unit, NULL, NULL, id, status);
- write_tabs(Accumulator);
+ write_tabs(out);
- Accumulator->append(UnicodeString(source));
- //T_FileStream_write(out, source, (int32_t) uprv_strlen(source));
+ write_utf8_file(out, UnicodeString(source));
- buf = convertAndEscape(&buf, 0, &bufLen, res->u.fString.fChars, res->u.fString.fLength, status);
+ buf = convertAndEscape(&buf, 0, &bufLen, res->getBuffer(), res->length(), status);
if (U_FAILURE(*status)) {
return;
}
- Accumulator->append(UnicodeString(buf, bufLen, "UTF-8"));
- Accumulator->append(UnicodeString(close_source));
- //T_FileStream_write(out, buf, bufLen);
- //T_FileStream_write(out, close_source, (int32_t) uprv_strlen(close_source));
+ write_utf8_file(out, UnicodeString(buf, bufLen, "UTF-8"));
+ write_utf8_file(out, UnicodeString(close_source));
- printNoteElements(Accumulator, &res->fComment, status);
+ printNoteElements(&res->fComment, status);
tabCount -= 1;
- write_tabs(Accumulator);
+ write_tabs(out);
- Accumulator->append(UnicodeString(close_trans_unit));
- //T_FileStream_write(out, close_trans_unit, (int32_t) uprv_strlen(close_trans_unit));
+ write_utf8_file(out, UnicodeString(close_trans_unit));
uprv_free(buf);
uprv_free(sid);
}
static void
-alias_write_xml(UnicodeString *Accumulator, struct SResource *res, const char* id, const char* language, UErrorCode *status) {
+alias_write_xml(AliasResource *res, const char* id, const char* /*language*/, UErrorCode *status) {
char *sid = NULL;
char* buf = NULL;
int32_t bufLen=0;
- sid = printContainer(Accumulator, res, trans_unit, alias_restype, NULL, id, status);
+ sid = printContainer(res, trans_unit, alias_restype, NULL, id, status);
- write_tabs(Accumulator);
+ write_tabs(out);
- Accumulator->append(UnicodeString(source));
- //T_FileStream_write(out, source, (int32_t) uprv_strlen(source));
+ write_utf8_file(out, UnicodeString(source));
+
+ buf = convertAndEscape(&buf, 0, &bufLen, res->getBuffer(), res->length(), status);
- buf = convertAndEscape(&buf, 0, &bufLen, res->u.fString.fChars, res->u.fString.fLength, status);
-
if(U_FAILURE(*status)){
return;
}
- Accumulator->append(UnicodeString(buf, bufLen, "UTF-8"));
- //T_FileStream_write(out, buf, bufLen);
- Accumulator->append(UnicodeString(close_source));
- //T_FileStream_write(out, close_source, (int32_t)uprv_strlen(close_source));
+ write_utf8_file(out, UnicodeString(buf, bufLen, "UTF-8"));
+ write_utf8_file(out, UnicodeString(close_source));
- printNoteElements(Accumulator, &res->fComment, status);
+ printNoteElements(&res->fComment, status);
tabCount -= 1;
- write_tabs(Accumulator);
+ write_tabs(out);
- Accumulator->append(UnicodeString(close_trans_unit));
- //T_FileStream_write(out, close_trans_unit, (int32_t)uprv_strlen(close_trans_unit));
+ write_utf8_file(out, UnicodeString(close_trans_unit));
uprv_free(buf);
uprv_free(sid);
}
static void
-array_write_xml(UnicodeString *Accumulator, struct SResource *res, const char* id, const char* language, UErrorCode *status) {
+array_write_xml(ArrayResource *res, const char* id, const char* language, UErrorCode *status) {
char* sid = NULL;
int index = 0;
struct SResource *current = NULL;
- struct SResource *first =NULL;
- sid = printContainer(Accumulator, res, group, array_restype, NULL, id, status);
+ sid = printContainer(res, group, array_restype, NULL, id, status);
- current = res->u.fArray.fFirst;
- first=current;
+ current = res->fFirst;
while (current != NULL) {
char c[256] = {0};
index += 1;
subId = getID(sid, c, subId);
- res_write_xml(Accumulator, current, subId, language, FALSE, status);
+ res_write_xml(current, subId, language, FALSE, status);
uprv_free(subId);
subId = NULL;
}
tabCount -= 1;
- write_tabs(Accumulator);
- Accumulator->append(UnicodeString(close_group));
- //T_FileStream_write(out, close_group, (int32_t) uprv_strlen(close_group));
+ write_tabs(out);
+ write_utf8_file(out, UnicodeString(close_group));
uprv_free(sid);
}
static void
-intvector_write_xml(UnicodeString *Accumulator, struct SResource *res, const char* id, const char* language, UErrorCode *status) {
+intvector_write_xml(IntVectorResource *res, const char* id, const char* /*language*/, UErrorCode *status) {
char* sid = NULL;
char* ivd = NULL;
uint32_t i=0;
uint32_t len=0;
char buf[256] = {'0'};
- sid = printContainer(Accumulator, res, group, intvector_restype, NULL, id, status);
+ sid = printContainer(res, group, intvector_restype, NULL, id, status);
- for(i = 0; i < res->u.fIntVector.fCount; i += 1) {
+ for(i = 0; i < res->fCount; i += 1) {
char c[256] = {0};
itostr(c, i, 10, 0);
ivd = getID(sid, c, ivd);
- len = itostr(buf, res->u.fIntVector.fArray[i], 10, 0);
+ len = itostr(buf, res->fArray[i], 10, 0);
- write_tabs(Accumulator);
- Accumulator->append(UnicodeString("<"));
- //T_FileStream_write(out, "<", 1);
- Accumulator->append(UnicodeString(trans_unit));
- //T_FileStream_write(out, trans_unit, (int32_t)uprv_strlen(trans_unit));
+ write_tabs(out);
+ write_utf8_file(out, UnicodeString("<"));
+ write_utf8_file(out, UnicodeString(trans_unit));
- printAttribute(Accumulator, "id", ivd, (int32_t)uprv_strlen(ivd));
- printAttribute(Accumulator, "restype", integer_restype, (int32_t) strlen(integer_restype));
+ printAttribute("id", ivd, (int32_t)uprv_strlen(ivd));
+ printAttribute("restype", integer_restype, (int32_t) strlen(integer_restype));
- Accumulator->append(UnicodeString(">\n"));
- //T_FileStream_write(out,">\n", 2);
+ write_utf8_file(out, UnicodeString(">\n"));
tabCount += 1;
- write_tabs(Accumulator);
- Accumulator->append(UnicodeString(source));
- //T_FileStream_write(out, source, (int32_t)uprv_strlen(source));
+ write_tabs(out);
+ write_utf8_file(out, UnicodeString(source));
- Accumulator->append(UnicodeString(buf, len));
- //T_FileStream_write(out, buf, len);
+ write_utf8_file(out, UnicodeString(buf, len));
- Accumulator->append(UnicodeString(close_source));
- //T_FileStream_write(out, close_source, (int32_t)uprv_strlen(close_source));
+ write_utf8_file(out, UnicodeString(close_source));
tabCount -= 1;
- write_tabs(Accumulator);
- Accumulator->append(UnicodeString(close_trans_unit));
- //T_FileStream_write(out, close_trans_unit, (int32_t)uprv_strlen(close_trans_unit));
+ write_tabs(out);
+ write_utf8_file(out, UnicodeString(close_trans_unit));
uprv_free(ivd);
ivd = NULL;
}
tabCount -= 1;
- write_tabs(Accumulator);
+ write_tabs(out);
- Accumulator->append(UnicodeString(close_group));
- //T_FileStream_write(out, close_group, (int32_t)uprv_strlen(close_group));
+ write_utf8_file(out, UnicodeString(close_group));
uprv_free(sid);
sid = NULL;
}
static void
-int_write_xml(UnicodeString *Accumulator, struct SResource *res, const char* id, const char* language, UErrorCode *status) {
+int_write_xml(IntResource *res, const char* id, const char* /*language*/, UErrorCode *status) {
char* sid = NULL;
char buf[256] = {0};
uint32_t len = 0;
- sid = printContainer(Accumulator, res, trans_unit, integer_restype, NULL, id, status);
+ sid = printContainer(res, trans_unit, integer_restype, NULL, id, status);
- write_tabs(Accumulator);
+ write_tabs(out);
- Accumulator->append(UnicodeString(source));
- //T_FileStream_write(out, source, (int32_t) uprv_strlen(source));
+ write_utf8_file(out, UnicodeString(source));
- len = itostr(buf, res->u.fIntValue.fValue, 10, 0);
- Accumulator->append(UnicodeString(buf, len));
- //T_FileStream_write(out, buf, len);
+ len = itostr(buf, res->fValue, 10, 0);
+ write_utf8_file(out, UnicodeString(buf, len));
- Accumulator->append(UnicodeString(close_source));
- //T_FileStream_write(out, close_source, (int32_t)uprv_strlen(close_source));
+ write_utf8_file(out, UnicodeString(close_source));
- printNoteElements(Accumulator, &res->fComment, status);
+ printNoteElements(&res->fComment, status);
tabCount -= 1;
- write_tabs(Accumulator);
+ write_tabs(out);
- Accumulator->append(UnicodeString(close_trans_unit));
- //T_FileStream_write(out, close_trans_unit, (int32_t)uprv_strlen(close_trans_unit));
+ write_utf8_file(out, UnicodeString(close_trans_unit));
uprv_free(sid);
sid = NULL;
}
static void
-bin_write_xml(UnicodeString *Accumulator, struct SResource *res, const char* id, const char* language, UErrorCode *status) {
+bin_write_xml(BinaryResource *res, const char* id, const char* /*language*/, UErrorCode *status) {
const char* m_type = application_mimetype;
char* sid = NULL;
uint32_t crc = 0xFFFFFFFF;
char fileName[1024] ={0};
int32_t tLen = ( outDir == NULL) ? 0 :(int32_t)uprv_strlen(outDir);
char* fn = (char*) uprv_malloc(sizeof(char) * (tLen+1024 +
- (res->u.fBinaryValue.fFileName !=NULL ?
- uprv_strlen(res->u.fBinaryValue.fFileName) :0)));
+ (res->fFileName !=NULL ?
+ uprv_strlen(res->fFileName) :0)));
const char* ext = NULL;
char* f = NULL;
fn[0]=0;
- if(res->u.fBinaryValue.fFileName != NULL){
- uprv_strcpy(fileName, res->u.fBinaryValue.fFileName);
+ if(res->fFileName != NULL){
+ uprv_strcpy(fileName, res->fFileName);
f = uprv_strrchr(fileName, '\\');
if (f != NULL) {
m_type = "text";
}
- sid = printContainer(Accumulator, res, bin_unit, binary_restype, m_type, id, status);
+ sid = printContainer(res, bin_unit, binary_restype, m_type, id, status);
- write_tabs(Accumulator);
+ write_tabs(out);
- Accumulator->append(UnicodeString(bin_source));
- //T_FileStream_write(out, bin_source, (int32_t)uprv_strlen(bin_source));
+ write_utf8_file(out, UnicodeString(bin_source));
tabCount+= 1;
- write_tabs(Accumulator);
+ write_tabs(out);
- Accumulator->append(UnicodeString(external_file));
- //T_FileStream_write(out, external_file, (int32_t)uprv_strlen(external_file));
- printAttribute(Accumulator, "href", f, (int32_t)uprv_strlen(f));
- Accumulator->append(UnicodeString("/>\n"));
- //T_FileStream_write(out, "/>\n", 3);
+ write_utf8_file(out, UnicodeString(external_file));
+ printAttribute("href", f, (int32_t)uprv_strlen(f));
+ write_utf8_file(out, UnicodeString("/>\n"));
tabCount -= 1;
- write_tabs(Accumulator);
+ write_tabs(out);
- Accumulator->append(UnicodeString(close_bin_source));
- //T_FileStream_write(out, close_bin_source, (int32_t)uprv_strlen(close_bin_source));
+ write_utf8_file(out, UnicodeString(close_bin_source));
- printNoteElements(Accumulator, &res->fComment, status);
+ printNoteElements(&res->fComment, status);
tabCount -= 1;
- write_tabs(Accumulator);
- Accumulator->append(UnicodeString(close_bin_unit));
- //T_FileStream_write(out, close_bin_unit, (int32_t)uprv_strlen(close_bin_unit));
+ write_tabs(out);
+ write_utf8_file(out, UnicodeString(close_bin_unit));
} else {
char temp[256] = {0};
uint32_t i = 0;
int32_t len=0;
- sid = printContainer(Accumulator, res, bin_unit, binary_restype, m_type, id, status);
+ sid = printContainer(res, bin_unit, binary_restype, m_type, id, status);
- write_tabs(Accumulator);
- Accumulator->append(UnicodeString(bin_source));
- //T_FileStream_write(out, bin_source, (int32_t)uprv_strlen(bin_source));
+ write_tabs(out);
+ write_utf8_file(out, UnicodeString(bin_source));
tabCount += 1;
- write_tabs(Accumulator);
+ write_tabs(out);
- Accumulator->append(UnicodeString(internal_file));
- //T_FileStream_write(out, internal_file, (int32_t)uprv_strlen(internal_file));
- printAttribute(Accumulator, "form", application_mimetype, (int32_t) uprv_strlen(application_mimetype));
+ write_utf8_file(out, UnicodeString(internal_file));
+ printAttribute("form", application_mimetype, (int32_t) uprv_strlen(application_mimetype));
- while(i <res->u.fBinaryValue.fLength){
- len = itostr(temp, res->u.fBinaryValue.fData[i], 16, 2);
+ while(i <res->fLength){
+ len = itostr(temp, res->fData[i], 16, 2);
crc = computeCRC(temp, len, crc);
i++;
}
len = itostr(temp, crc, 10, 0);
- printAttribute(Accumulator, "crc", temp, len);
+ printAttribute("crc", temp, len);
- Accumulator->append(UnicodeString(">"));
- //T_FileStream_write(out, ">", 1);
+ write_utf8_file(out, UnicodeString(">"));
i = 0;
- while(i <res->u.fBinaryValue.fLength){
- len = itostr(temp, res->u.fBinaryValue.fData[i], 16, 2);
- Accumulator->append(UnicodeString(temp));
- //T_FileStream_write(out ,temp ,len);
+ while(i <res->fLength){
+ len = itostr(temp, res->fData[i], 16, 2);
+ write_utf8_file(out, UnicodeString(temp));
i += 1;
}
- Accumulator->append(UnicodeString(close_internal_file));
- //T_FileStream_write(out, close_internal_file, (int32_t)uprv_strlen(close_internal_file));
+ write_utf8_file(out, UnicodeString(close_internal_file));
tabCount -= 2;
- write_tabs(Accumulator);
+ write_tabs(out);
- Accumulator->append(UnicodeString(close_bin_source));
- //T_FileStream_write(out, close_bin_source, (int32_t)uprv_strlen(close_bin_source));
- printNoteElements(Accumulator, &res->fComment, status);
+ write_utf8_file(out, UnicodeString(close_bin_source));
+ printNoteElements(&res->fComment, status);
tabCount -= 1;
- write_tabs(Accumulator);
- Accumulator->append(UnicodeString(close_bin_unit));
- //T_FileStream_write(out, close_bin_unit, (int32_t)uprv_strlen(close_bin_unit));
+ write_tabs(out);
+ write_utf8_file(out, UnicodeString(close_bin_unit));
uprv_free(sid);
sid = NULL;
static void
-table_write_xml(UnicodeString *Accumulator, struct SResource *res, const char* id, const char* language, UBool isTopLevel, UErrorCode *status) {
+table_write_xml(TableResource *res, const char* id, const char* language, UBool isTopLevel, UErrorCode *status) {
uint32_t i = 0;
struct SResource *current = NULL;
- struct SResource *save = NULL;
char* sid = NULL;
if (U_FAILURE(*status)) {
return ;
}
- sid = printContainer(Accumulator, res, group, table_restype, NULL, id, status);
+ sid = printContainer(res, group, table_restype, NULL, id, status);
if(isTopLevel) {
sid[0] = '\0';
}
- save = current = res->u.fTable.fFirst;
+ current = res->fFirst;
i = 0;
while (current != NULL) {
- res_write_xml(Accumulator, current, sid, language, FALSE, status);
+ res_write_xml(current, sid, language, FALSE, status);
if(U_FAILURE(*status)){
return;
}
tabCount -= 1;
- write_tabs(Accumulator);
+ write_tabs(out);
- Accumulator->append(UnicodeString(close_group));
- //T_FileStream_write(out, close_group,(int32_t)uprv_strlen(close_group));
+ write_utf8_file(out, UnicodeString(close_group));
uprv_free(sid);
sid = NULL;
}
void
-res_write_xml(UnicodeString *Accumulator, struct SResource *res, const char* id, const char* language, UBool isTopLevel, UErrorCode *status) {
+res_write_xml(struct SResource *res, const char* id, const char* language, UBool isTopLevel, UErrorCode *status) {
if (U_FAILURE(*status)) {
return ;
if (res != NULL) {
switch (res->fType) {
case URES_STRING:
- string_write_xml (Accumulator, res, id, language, status);
+ string_write_xml (static_cast<StringResource *>(res), id, language, status);
return;
case URES_ALIAS:
- alias_write_xml (Accumulator, res, id, language, status);
+ alias_write_xml (static_cast<AliasResource *>(res), id, language, status);
return;
case URES_INT_VECTOR:
- intvector_write_xml (Accumulator, res, id, language, status);
+ intvector_write_xml (static_cast<IntVectorResource *>(res), id, language, status);
return;
case URES_BINARY:
- bin_write_xml (Accumulator, res, id, language, status);
+ bin_write_xml (static_cast<BinaryResource *>(res), id, language, status);
return;
case URES_INT:
- int_write_xml (Accumulator, res, id, language, status);
+ int_write_xml (static_cast<IntResource *>(res), id, language, status);
return;
case URES_ARRAY:
- array_write_xml (Accumulator, res, id, language, status);
+ array_write_xml (static_cast<ArrayResource *>(res), id, language, status);
return;
case URES_TABLE:
- case URES_TABLE32:
- table_write_xml (Accumulator, res, id, language, isTopLevel, status);
+ table_write_xml (static_cast<TableResource *>(res), id, language, isTopLevel, status);
return;
default:
char *writtenFilename, int writtenFilenameLen,
const char* language, const char* outFileName, UErrorCode *status) {
- UnicodeString Accumulator;
char* xmlfileName = NULL;
char* outputFileName = NULL;
char* originalFileName = NULL;
*status = U_FILE_ACCESS_ERROR;
goto cleanup_bundle_write_xml;
}
- Accumulator.append(xmlHeader);
- //T_FileStream_write(out,xmlHeader, (int32_t)uprv_strlen(xmlHeader));
+ write_utf8_file(out, UnicodeString(xmlHeader));
if(outputEnc && *outputEnc!='\0'){
/* store the output encoding */
goto cleanup_bundle_write_xml;
}
}
- Accumulator.append(bundleStart);
- //T_FileStream_write(out,bundleStart, (int32_t)uprv_strlen(bundleStart));
- write_tabs(&Accumulator);
- Accumulator.append(fileStart);
- //T_FileStream_write(out, fileStart, (int32_t)uprv_strlen(fileStart));
+ write_utf8_file(out, UnicodeString(bundleStart));
+ write_tabs(out);
+ write_utf8_file(out, UnicodeString(fileStart));
/* check if lang and language are the same */
if(language != NULL && uprv_strcmp(lang, srBundle->fLocale)!=0){
fprintf(stderr,"Warning: The top level tag in the resource and language specified are not the same. Please check the input.\n");
}
- Accumulator.append(UnicodeString(lang));
- //T_FileStream_write(out,lang, (int32_t)uprv_strlen(lang));
- Accumulator.append(UnicodeString(file1));
- //T_FileStream_write(out,file1, (int32_t)uprv_strlen(file1));
- Accumulator.append(UnicodeString(file2));
- //T_FileStream_write(out,file2, (int32_t)uprv_strlen(file2));
- Accumulator.append(UnicodeString(originalFileName));
- //T_FileStream_write(out,originalFileName, (int32_t)uprv_strlen(originalFileName));
- Accumulator.append(UnicodeString(file4));
- //T_FileStream_write(out,file4, (int32_t)uprv_strlen(file4));
+ write_utf8_file(out, UnicodeString(lang));
+ write_utf8_file(out, UnicodeString(file1));
+ write_utf8_file(out, UnicodeString(file2));
+ write_utf8_file(out, UnicodeString(originalFileName));
+ write_utf8_file(out, UnicodeString(file4));
time(&currTime);
strftime(timeBuf, sizeof(timeBuf), "%Y-%m-%dT%H:%M:%SZ", gmtime(&currTime));
-
- Accumulator.append(UnicodeString(timeBuf));
- Accumulator.append(UnicodeString("\">\n"));
- //T_FileStream_write(out,timeBuf, (int32_t)uprv_strlen(timeBuf));
-
- //T_FileStream_write(out,"\">\n", 3);
+ write_utf8_file(out, UnicodeString(timeBuf));
+ write_utf8_file(out, UnicodeString("\">\n"));
tabCount += 1;
- write_tabs(&Accumulator);
- Accumulator.append(headerStart);
- //T_FileStream_write(out,headerStart, (int32_t)uprv_strlen(headerStart));
+ write_tabs(out);
+ write_utf8_file(out, UnicodeString(headerStart));
tabCount += 1;
- write_tabs(&Accumulator);
-
- Accumulator.append(tool_start);
- //T_FileStream_write(out, tool_start, (int32_t) uprv_strlen(tool_start));
- printAttribute(&Accumulator, "tool-id", tool_id, (int32_t) uprv_strlen(tool_id));
- printAttribute(&Accumulator, "tool-name", tool_name, (int32_t) uprv_strlen(tool_name));
+ write_tabs(out);
- Accumulator.append(UnicodeString("/>\n"));
- //T_FileStream_write(out, "/>\n", 3);
+ write_utf8_file(out, UnicodeString(tool_start));
+ printAttribute("tool-id", tool_id, (int32_t) uprv_strlen(tool_id));
+ printAttribute("tool-name", tool_name, (int32_t) uprv_strlen(tool_name));
+ write_utf8_file(out, UnicodeString("/>\n"));
tabCount -= 1;
- write_tabs(&Accumulator);
+ write_tabs(out);
- Accumulator.append(UnicodeString(headerEnd));
- //T_FileStream_write(out,headerEnd, (int32_t)uprv_strlen(headerEnd));
+ write_utf8_file(out, UnicodeString(headerEnd));
- write_tabs(&Accumulator);
+ write_tabs(out);
tabCount += 1;
- Accumulator.append(UnicodeString(bodyStart));
- //T_FileStream_write(out,bodyStart, (int32_t)uprv_strlen(bodyStart));
+ write_utf8_file(out, UnicodeString(bodyStart));
- res_write_xml(&Accumulator, bundle->fRoot, bundle->fLocale, lang, TRUE, status);
+ res_write_xml(bundle->fRoot, bundle->fLocale, lang, TRUE, status);
tabCount -= 1;
- write_tabs(&Accumulator);
+ write_tabs(out);
- Accumulator.append(UnicodeString(bodyEnd));
- //T_FileStream_write(out,bodyEnd, (int32_t)uprv_strlen(bodyEnd));
+ write_utf8_file(out, UnicodeString(bodyEnd));
tabCount--;
- write_tabs(&Accumulator);
-
- Accumulator.append(UnicodeString(fileEnd));
- //T_FileStream_write(out,fileEnd, (int32_t)uprv_strlen(fileEnd));
+ write_tabs(out);
+ write_utf8_file(out, UnicodeString(fileEnd));
tabCount--;
- write_tabs(&Accumulator);
- Accumulator.append(UnicodeString(bundleEnd));
- //T_FileStream_write(out,bundleEnd,(int32_t)uprv_strlen(bundleEnd));
-
- write_utf8_file(Accumulator, out, status);
+ write_tabs(out);
+ write_utf8_file(out, UnicodeString(bundleEnd));
T_FileStream_close(out);
ucnv_close(conv);
uprv_free(outputFileName);
}
}
-