3776 lines
		
	
	
		
			120 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			3776 lines
		
	
	
		
			120 KiB
		
	
	
	
		
			C++
		
	
	
	
| /*
 | ||
| *******************************************************************************
 | ||
| *
 | ||
| *   Copyright (C) 2003, International Business Machines
 | ||
| *   Corporation and others.  All Rights Reserved.
 | ||
| *
 | ||
| *******************************************************************************
 | ||
| *   file name:  genldml.cpp
 | ||
| */
 | ||
| 
 | ||
| #include <time.h>
 | ||
| #include <stdio.h>
 | ||
| #include <string.h>
 | ||
| #include "genldml.h"
 | ||
| #include <stdlib.h>
 | ||
| #include "unicode/ustring.h"
 | ||
| 
 | ||
| #define MAX_DIGITS 10
 | ||
| #ifndef GENLDML_NOSETAPPDATA
 | ||
| /*
 | ||
|  *  Resource Data Reference.  The data is packaged as a dll (or .so or
 | ||
|  *           whatever, depending on the platform) that exports a data
 | ||
|  *           symbol.  The application (that's us) references that symbol,
 | ||
|  *           here, and will pass the data address to ICU, which will then
 | ||
|  *           be able to fetch resources from the data.
 | ||
|  */
 | ||
| 
 | ||
| extern "C" {
 | ||
| 	extern const void U_IMPORT *genldml_resources_dat;
 | ||
| }
 | ||
| 
 | ||
| #endif
 | ||
| 
 | ||
| #define XML_END_SLASH "/"
 | ||
| enum
 | ||
| {
 | ||
|     HELP1,
 | ||
|     HELP2,
 | ||
|     SOURCEDIR,
 | ||
| 	DESTDIR,
 | ||
| 	PACKAGE_NAME,
 | ||
|     IGNORE_COLLATION,
 | ||
|     BASE,
 | ||
|     BASE_TYPE,
 | ||
|     IGNORE_SPECIALS,
 | ||
|     IGNORE_LAYOUT,
 | ||
|     DRAFT,
 | ||
|     ONLY_SPECIALS
 | ||
| };
 | ||
| 
 | ||
| 
 | ||
| UOption options[]={
 | ||
|                       UOPTION_HELP_H,
 | ||
|                       UOPTION_HELP_QUESTION_MARK,
 | ||
|                       UOPTION_SOURCEDIR,
 | ||
| 					  UOPTION_DESTDIR,
 | ||
| 					  UOPTION_DEF("package", 'p', UOPT_REQUIRES_ARG),
 | ||
|                       UOPTION_DEF("ignore-collation", 'i', UOPT_NO_ARG),
 | ||
|                       UOPTION_DEF("base", 'b', UOPT_REQUIRES_ARG),
 | ||
|                       UOPTION_DEF("base-type", 't', UOPT_REQUIRES_ARG),
 | ||
|                       UOPTION_DEF("ignore-specials", 'c', UOPT_NO_ARG),
 | ||
|                       UOPTION_DEF("ignore-layout", 'l', UOPT_NO_ARG),
 | ||
|                       UOPTION_DEF("draft", 'r', UOPT_NO_ARG),
 | ||
|                       UOPTION_DEF("only-specials", 'g', UOPT_NO_ARG)
 | ||
|                    };
 | ||
| 
 | ||
| const char* usageString =
 | ||
|                 "Usage: genldml [OPTIONS] [FILES]\n"
 | ||
|                 "\tConvert the input res file to XML\n"
 | ||
|                 "Options:\n"
 | ||
|                 "\t-h or -? or --help       this usage text\n"
 | ||
|                 "\t-s or --sourcedir        source directory for files followed by path\n"
 | ||
|                 "\t                         followed by path\n"
 | ||
|                 "\t-d or --destdir          dest directory for files followed by path\n"
 | ||
|                 "\t                         followed by path\n"
 | ||
| 				"\t-p or --package			name of the package that is prepended to the resource bundles\n"
 | ||
| 				"\t                         defaults to ICU's data\n"
 | ||
|                 "\t-i or --ignore-collation Ignores collation generation\n"
 | ||
|                 "\t-b or --base             the base tailoring for collation if any\n"
 | ||
|                 "\t-t or --base-type        the type of base tailoring for collation in the base. Defaults to standard\n"
 | ||
|                 "\t-c or --ignore-specials  Ignores specials in collations\n"
 | ||
|                 "\t-l or --ignore-layout    Ignores layout element\n"
 | ||
|                 "\t-r or --draft            The LDML file being generated will marked as draft\n"
 | ||
|                 "\t-g or --only-specials    Produces on special elements\n"
 | ||
|                ;
 | ||
| 
 | ||
| UBool ignoreCollation = FALSE;
 | ||
| const char* baseCollation = NULL;
 | ||
| const char* baseType = NULL;
 | ||
| UBool ignoreSpecials = FALSE;
 | ||
| UBool ignoreLayout = FALSE;
 | ||
| UBool isDraft = FALSE;
 | ||
| UBool onlySpecials = FALSE;
 | ||
| 
 | ||
| int main (int32_t argc, const char* argv[]) {
 | ||
| 	const char* srcDir =NULL;
 | ||
| 	const char* destDir = NULL;
 | ||
| 	const char* packageName=NULL;
 | ||
| 	UErrorCode err= U_ZERO_ERROR;
 | ||
| 	char* path= NULL;
 | ||
| 	//initialize the argument list
 | ||
|     U_MAIN_INIT_ARGS(argc, argv);
 | ||
|     //parse the arguments
 | ||
|     int32_t _remainingArgc = u_parseArgs(argc, (char**)argv, (int32_t)(sizeof(options)/sizeof(options[0])), options);
 | ||
| 
 | ||
|     // Now setup the arguments
 | ||
|     if(argc==1 || options[HELP1].doesOccur || options[HELP2].doesOccur) {
 | ||
|         fprintf(stderr,usageString);
 | ||
|         return -1;
 | ||
|     }
 | ||
| 
 | ||
|     if(options[SOURCEDIR].doesOccur) {
 | ||
|         srcDir = options[SOURCEDIR].value;
 | ||
|     }
 | ||
|     if(options[DESTDIR].doesOccur) {
 | ||
|         destDir = options[DESTDIR].value;
 | ||
|     }
 | ||
| 	if(options[PACKAGE_NAME].doesOccur) {
 | ||
|         packageName = options[PACKAGE_NAME].value;
 | ||
|     }
 | ||
|     if(options[IGNORE_COLLATION].doesOccur){
 | ||
|         ignoreCollation = TRUE;
 | ||
|     }
 | ||
|     if(options[BASE].doesOccur){
 | ||
|         baseCollation = options[BASE].value;
 | ||
|     }
 | ||
|     if(options[BASE_TYPE].doesOccur){
 | ||
|         baseCollation = options[BASE_TYPE].value;
 | ||
|     }
 | ||
|     if(options[IGNORE_SPECIALS].doesOccur){
 | ||
|         ignoreSpecials = TRUE;
 | ||
|     }
 | ||
|     if(options[IGNORE_LAYOUT].doesOccur){
 | ||
|         ignoreLayout = TRUE;
 | ||
|     }
 | ||
|     if(options[DRAFT].doesOccur){
 | ||
|         isDraft = TRUE;
 | ||
|     }
 | ||
|     if(options[ONLY_SPECIALS].doesOccur){
 | ||
|         onlySpecials = TRUE;
 | ||
|     }
 | ||
| #ifndef GENLDML_NOSETAPPDATA
 | ||
|     /* Tell ICU where our resource data is located in memory.
 | ||
|      *   The data lives in the genldml_resources dll, and we just
 | ||
|      *   pass the address of an exported symbol from that library
 | ||
|      *   to ICU.
 | ||
|      */
 | ||
|     udata_setAppData("genldml_resources", &genldml_resources_dat, &err);
 | ||
|     if (U_FAILURE(err)) {
 | ||
|         fprintf(stderr, "%s: ures_open failed with error \"%s\"\n", argv[0], u_errorName(err));
 | ||
|         exit(-1);
 | ||
|     }
 | ||
| #endif
 | ||
| 
 | ||
| 	if(srcDir!=NULL){
 | ||
| 		path = (char*) malloc(strlen(srcDir)+((packageName!=NULL) ? strlen(packageName) : 0 )+2);
 | ||
| 		strcpy(path,srcDir);
 | ||
| 		if(path[(strlen(srcDir)-1)]!=U_FILE_SEP_CHAR){
 | ||
| 			strcat(path,U_FILE_SEP_STRING);
 | ||
| 		}
 | ||
| 		if(packageName!=NULL){
 | ||
| 			strcat(path,packageName);
 | ||
| 		}
 | ||
| 	}
 | ||
|     if(_remainingArgc<0) {
 | ||
|         fprintf(stderr,usageString);
 | ||
|         return -1;
 | ||
|     }
 | ||
| 	for(int i=1; i<_remainingArgc; i++){
 | ||
| 
 | ||
| 		GenerateXML gen(path,argv[i],destDir,err);
 | ||
| 		if(U_FAILURE(err)){
 | ||
| 			fprintf(stderr,"Reading of resource file failed. Error: %s\n",u_errorName(err));
 | ||
| 			return -1;
 | ||
| 		}
 | ||
| 		gen.DoIt();
 | ||
| 		
 | ||
| 	}
 | ||
| 	free(path);
 | ||
| 	return 0;
 | ||
| }
 | ||
| 
 | ||
| static int32_t
 | ||
| itou (UChar * buffer, uint32_t i, uint32_t radix, int32_t pad)
 | ||
| {
 | ||
|     int32_t length = 0;
 | ||
|     int32_t num = 0;
 | ||
|     int digit;
 | ||
|     int32_t j;
 | ||
|     UChar temp;
 | ||
| 
 | ||
|     do{
 | ||
|         digit = (int)(i % radix);
 | ||
|         buffer[length++]=(UChar)(digit<=9?(0x0030+digit):(0x0030+digit+7));
 | ||
|         i=i/radix;
 | ||
|     } while(i);
 | ||
| 
 | ||
|     while (length < pad){
 | ||
|         buffer[length++] = (UChar) 0x0030;/*zero padding */
 | ||
|     }
 | ||
|     /* null terminate the buffer */
 | ||
|     if(length<MAX_DIGITS){
 | ||
|         buffer[length] = (UChar) 0x0000;
 | ||
|     }
 | ||
|     num= (pad>=length) ? pad :length;
 | ||
| 
 | ||
|     /* Reverses the string */
 | ||
|     for (j = 0; j < (num / 2); j++){
 | ||
|         temp = buffer[(length-1) - j];
 | ||
|         buffer[(length-1) - j] = buffer[j];
 | ||
|         buffer[j] = temp;
 | ||
|     }
 | ||
|     return length;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| GenerateXML::GenerateXML(const char* path, const char* locName,const char* destDir, UErrorCode& err)
 | ||
| 						 :  mSourceBundle(path, locName,err), mStringsBundle("genldml_resources","root", err),mError(err){
 | ||
|     mFile=NULL;
 | ||
|     if(U_SUCCESS(err)){
 | ||
|        
 | ||
| 	    mLocale=Locale(locName);
 | ||
| 	    mFile=getFileHandle(destDir,locName);
 | ||
|         GenerateXML::locName = locName;
 | ||
|         GenerateXML::path = path;
 | ||
|         GenerateXML::destDir = destDir;
 | ||
| //		GenerateXML::packageName = packageName;
 | ||
| 	    if(mFile==NULL){
 | ||
|             closeFileHandle();
 | ||
| 		    exit(U_FILE_ACCESS_ERROR);
 | ||
|         }
 | ||
| 
 | ||
| 	    indentOffset="";
 | ||
|     }
 | ||
| 
 | ||
| }
 | ||
| GenerateXML::~GenerateXML()
 | ||
| {
 | ||
| 
 | ||
|     closeFileHandle();
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::closeFileHandle(){
 | ||
|     if(mFile){
 | ||
| 	    fclose(mFile);
 | ||
|     }
 | ||
| }
 | ||
| void GenerateXML::DoIt(){
 | ||
|     writeXMLVersionAndComments();
 | ||
|     writeIdentity();
 | ||
|     if(onlySpecials==FALSE){
 | ||
| 	    writeDisplayNames();
 | ||
| 	    writeLayout();
 | ||
|     }
 | ||
| 	// WARNING: do not change the order
 | ||
|     // the generated XML will not validate!!!
 | ||
|     writeEncodings();
 | ||
|     
 | ||
|     if(onlySpecials==FALSE){
 | ||
| 	    writeDelimiters();
 | ||
| 	    writeMeasurement();
 | ||
| 	    writeDates();
 | ||
| 	    writeNumberFormat();
 | ||
|     }
 | ||
|     if(ignoreCollation == FALSE){
 | ||
| 	    writeCollations();
 | ||
|     }
 | ||
|     writeSpecial();
 | ||
|     //if(strcmp(locName, "root")==0){
 | ||
|         writeSupplementalData();
 | ||
|     //}
 | ||
| /*	
 | ||
| 	writeTransliteration();
 | ||
| 	writeBoundary();
 | ||
| //	writeMisc();
 | ||
|     writePosixAdditions();
 | ||
|     writePosixCompData();
 | ||
| */
 | ||
|  	closeXMLDocument();	
 | ||
| }
 | ||
| void GenerateXML::chopIndent(){
 | ||
| 
 | ||
| 	indentOffset.remove((indentOffset.length()-1),1);
 | ||
| }
 | ||
| int32_t GenerateXML::copyUnicodeStringToChars(const UnicodeString& str,
 | ||
|                                  char* buf,
 | ||
|                                  int32_t bufCapacity) {
 | ||
|     int32_t len = str.length();
 | ||
|     if (buf != 0) {
 | ||
|         // copy whatever will fit into buf
 | ||
|         int32_t len2 =  (len<(bufCapacity - 1))? len : (bufCapacity-1);
 | ||
|         str.extract(0, len2, buf, "");
 | ||
|         buf[len2] = 0; // zero-terminate
 | ||
|     }
 | ||
|     return len; // return actual length    
 | ||
| }
 | ||
| void GenerateXML::closeXMLDocument(){
 | ||
| 	chopIndent();
 | ||
| 	Formattable args[] = {UnicodeString(XML_END_SLASH), ""};
 | ||
| 	UnicodeString xmlString;
 | ||
| 	formatString(mStringsBundle.getStringEx("localeData",mError),args,2,xmlString);
 | ||
| 	printString(&xmlString);
 | ||
| }
 | ||
| UnicodeString GenerateXML::formatString(UnicodeString& str,UnicodeString& argument,UnicodeString& result){
 | ||
| 	Formattable args[] ={ argument};
 | ||
| 	MessageFormat format(str,mError);
 | ||
| 	FieldPosition fpos=0;
 | ||
| 	result.remove();
 | ||
| 	format.format(args,1, result,fpos,mError);
 | ||
| //	if(U_FAILURE(mError)) {
 | ||
| //		return UnicodeString("Illegal argument");
 | ||
| //	}
 | ||
| 
 | ||
| 	return result;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| UnicodeString GenerateXML::formatString(UnicodeString& str,const Formattable* args,int32_t num,UnicodeString& result){
 | ||
| 	FieldPosition fpos=0;
 | ||
| 	MessageFormat format(str,mError);
 | ||
| 	result.remove();
 | ||
| 	format.format(args,num, result,fpos,mError);
 | ||
| //	if(U_FAILURE(mError)) {
 | ||
| //		return UnicodeString("Illegal argument");
 | ||
| //	}
 | ||
| 	return result;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| FILE* GenerateXML::getFileHandle(const char* path, const char* name)
 | ||
| {
 | ||
| 	
 | ||
| 	FILE* file;
 | ||
| 	char fileName[256];
 | ||
|     if(!path){
 | ||
|         path=".";
 | ||
|     }
 | ||
|     if(U_FAILURE(mError) ) {
 | ||
|         return NULL;
 | ||
|     } 
 | ||
| 	strcpy(fileName,path);
 | ||
|     if(path[ strlen(path)-1] !='\\'){
 | ||
|          strcat(fileName,"\\");
 | ||
|     }
 | ||
| 	 strcat(fileName, name );
 | ||
|      strcat(fileName, ".xml");
 | ||
| 
 | ||
|     /* open the output file */
 | ||
|     file=fopen(fileName,"w");
 | ||
| 
 | ||
|     
 | ||
|     if(file==NULL) {
 | ||
| 		
 | ||
|         mError=U_FILE_ACCESS_ERROR;
 | ||
| 		printf("Could not open file %s for writing.\n",fileName);
 | ||
| 		exit(U_FILE_ACCESS_ERROR);
 | ||
|         return NULL;
 | ||
|     }else{
 | ||
|         printf("opened file %s in directory %s\n", fileName, path);
 | ||
|     }
 | ||
| 
 | ||
| 	return file;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| int32_t 
 | ||
| GenerateXML::fillOutputString(const UnicodeString &temp,
 | ||
|                       UChar *dest, 
 | ||
|                       int32_t destCapacity) {
 | ||
|   int32_t length = temp.length();
 | ||
| 
 | ||
|   if (destCapacity > 0) {
 | ||
|     // copy the contents; extract() will check if it needs to copy anything at all
 | ||
|     temp.extract(0, destCapacity, dest, 0);
 | ||
| 
 | ||
|     // zero-terminate the dest buffer if possible
 | ||
|     if (length < destCapacity) {
 | ||
|       dest[length] = 0;
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   // set the error code according to the necessary buffer length
 | ||
|   if (length > destCapacity && U_SUCCESS(mError)) {
 | ||
|     mError = U_BUFFER_OVERFLOW_ERROR;
 | ||
|   }
 | ||
| 
 | ||
|   // return the full string length
 | ||
|   return length;
 | ||
| }
 | ||
| void GenerateXML::printString(UnicodeString* uString){
 | ||
|     printString(uString,mFile);
 | ||
| }
 | ||
| void GenerateXML::printString(UnicodeString* uString, FILE* file){
 | ||
| 
 | ||
| 	//UChar result[256];
 | ||
| 	char *dest = NULL;
 | ||
| 	int32_t destLen = 0;
 | ||
| 	int32_t destCap =0;
 | ||
| 	const UChar* src = uString->getBuffer();
 | ||
|     int32_t srcLen=uString->length();
 | ||
|     if(U_FAILURE(mError)){
 | ||
|        fprintf(stderr,"Error on entering the printString fucntion. Error: %s. Returning.", u_errorName(mError));
 | ||
|     }
 | ||
| 	u_strToUTF8(dest,destCap, &destLen,src,srcLen,&mError);
 | ||
| 	if(mError == U_BUFFER_OVERFLOW_ERROR){
 | ||
| 			destCap = destLen+2;
 | ||
| 			dest = (char*) malloc(destCap);
 | ||
| 			mError = U_ZERO_ERROR;
 | ||
| 			dest = u_strToUTF8(dest,destCap, &destLen,src,srcLen,&mError);
 | ||
| 			fwrite(dest,destLen,sizeof(char),file);
 | ||
| 	}
 | ||
| 
 | ||
| 	uString->releaseBuffer();
 | ||
| 	free(dest);
 | ||
| 	if(U_FAILURE(mError)){
 | ||
| 		fprintf(stderr,"Conversion of string to UTF-8 failed with error: %s\n",u_errorName(mError));
 | ||
| 		exit(mError);
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeXMLVersionAndComments(){
 | ||
| 	
 | ||
| 	UnicodeString xmlString;
 | ||
| 	if(U_FAILURE(mError)) {
 | ||
|         return;
 | ||
| 	}
 | ||
| 	UnicodeString temp;
 | ||
|     if(ignoreSpecials==FALSE){
 | ||
|         temp = mStringsBundle.getStringEx("declaration",mError);
 | ||
|     }else{
 | ||
|         temp = mStringsBundle.getStringEx("declarationNoSpecials",mError);
 | ||
|     }
 | ||
|     xmlString.append(temp);
 | ||
|     Formattable arguments[] = {"", (isDraft==TRUE)? " draft=\"true\"" : ""};
 | ||
| 	UnicodeString tempStr;
 | ||
| 	xmlString.append(formatString(mStringsBundle.getStringEx("localeData",mError),arguments,2,tempStr));
 | ||
| 	printString(&xmlString);
 | ||
|     mError=U_ZERO_ERROR;
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeVersion(UnicodeString& xmlString){
 | ||
| 	UnicodeString tempStr;
 | ||
| 	UnicodeString version;
 | ||
| 	if(U_FAILURE(mError)) {
 | ||
|         return;
 | ||
| 	}
 | ||
| 	version=mSourceBundle.getStringEx("Version",mError);
 | ||
| 	// if version is not available provide a default version.
 | ||
|     if( mError == U_USING_DEFAULT_WARNING ||
 | ||
| 		mError == U_USING_FALLBACK_WARNING || 
 | ||
| 		mError == U_MISSING_RESOURCE_ERROR){
 | ||
|         version="1.0";
 | ||
|         mError = U_ZERO_ERROR;
 | ||
|     }
 | ||
| 	Formattable args[] = {indentOffset,""};
 | ||
| 	UnicodeString result;
 | ||
| 	if(!version.isEmpty()){
 | ||
| 		args[0]=indentOffset;
 | ||
| 		args[1]=version;
 | ||
|         //TODO: remove this
 | ||
|         //args[1] = "1.0-alpha";
 | ||
|        	xmlString.append(formatString(mStringsBundle.getStringEx("version",mError),args,2,result));
 | ||
| 
 | ||
| 	}
 | ||
| 	args[0]=indentOffset;
 | ||
| 	args[1]= UnicodeString(XML_END_SLASH);
 | ||
| 	args[2]="";
 | ||
| 	xmlString.append(formatString(mStringsBundle.getStringEx("versioning",mError), args,3,result));
 | ||
| 	//printString(&xmlString);
 | ||
|     mError=U_ZERO_ERROR;
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeIdentity(){
 | ||
| 	UnicodeString xmlString, tempStr,tempStr1,tempStr2;
 | ||
| 	indentOffset.append("\t");
 | ||
| 	Formattable args[]={indentOffset,"",""};
 | ||
| 	
 | ||
| 	formatString(mStringsBundle.getStringEx("identity",mError),args,2,xmlString);
 | ||
|     
 | ||
| 	indentOffset.append("\t");
 | ||
| 	//version
 | ||
| 	writeVersion(xmlString);
 | ||
| 	//genrationDate
 | ||
| 	SimpleDateFormat format(UnicodeString("yyyy-MM-dd"), mError);
 | ||
| 	format.format(Calendar::getNow(),tempStr);
 | ||
| 	args[0]=indentOffset;
 | ||
|     args[1]=tempStr;
 | ||
| 	tempStr.remove();
 | ||
| 	
 | ||
|     
 | ||
|     xmlString.append(formatString(mStringsBundle.getStringEx("generationDate",mError),args,2,tempStr));
 | ||
| 
 | ||
| 	tempStr1=mLocale.getISO3Language() ;
 | ||
| 	tempStr2=mLocale.getLanguage();
 | ||
|     
 | ||
| 	if(! tempStr2.isEmpty()){
 | ||
|         //if(tempStr2 == "root"){
 | ||
|         //    tempStr2 ="";
 | ||
|         //}
 | ||
| 		Formattable args1[] = {indentOffset, tempStr2,""};
 | ||
| 		UnicodeString t;
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("languageElem",mError),args1,3,t));
 | ||
| 	}
 | ||
| 	tempStr1.remove();
 | ||
| 	tempStr2.remove();
 | ||
| 
 | ||
|     mError = U_ZERO_ERROR;
 | ||
| 
 | ||
|     tempStr.remove();
 | ||
|     tempStr = mLocale.getScript();
 | ||
| 	if(!tempStr.isEmpty() && tempStr!="t"){
 | ||
| 		Formattable args1[] = {indentOffset, tempStr};
 | ||
| 		UnicodeString t;
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("scriptElem",mError),args1,2,t));
 | ||
| 	}
 | ||
| 
 | ||
|     mError = U_ZERO_ERROR;
 | ||
| 
 | ||
| 	tempStr1=mLocale.getCountry();
 | ||
| 	tempStr2=mLocale.getISO3Country();
 | ||
| 
 | ||
| 	if(!(tempStr1.isEmpty() && tempStr2.isEmpty())){
 | ||
| 		Formattable args1[] = {indentOffset,tempStr1,tempStr2};
 | ||
| 		UnicodeString t;
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("territoryElem",mError),args1,2,t));
 | ||
| 	}
 | ||
| 	if(mError==U_MISSING_RESOURCE_ERROR){
 | ||
| 		mError=U_ZERO_ERROR;
 | ||
| 	}
 | ||
| 	
 | ||
|     tempStr.remove();
 | ||
| 	tempStr=mLocale.getVariant();
 | ||
| 	if(!tempStr.isEmpty() && tempStr!="t"){
 | ||
| 		Formattable args1[] = {indentOffset, tempStr};
 | ||
| 		UnicodeString t;
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("variantElem",mError),args1,2,t));
 | ||
| 	}
 | ||
|     
 | ||
| 	ResourceBundle tb  = mSourceBundle.get("LocaleID",mError);
 | ||
|     UResType type = tb.getType();
 | ||
| 	chopIndent();
 | ||
| 	args[0]=indentOffset;
 | ||
| 	args[1]=	(UnicodeString(XML_END_SLASH));
 | ||
| 	args[2]= "";
 | ||
|     mError =U_ZERO_ERROR;
 | ||
| 	UnicodeString t;
 | ||
| 	xmlString.append(formatString(mStringsBundle.getStringEx("identity",mError),args,2,t));
 | ||
| 	printString(&xmlString);
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeDisplayNames(){
 | ||
| 	UnicodeString xmlString;
 | ||
| 	UBool print = FALSE;
 | ||
| 	if(U_FAILURE(mError)) {
 | ||
| 		return;
 | ||
| 	}
 | ||
| 	Formattable args[]={indentOffset,"",""};
 | ||
| 	UnicodeString t;
 | ||
| 	xmlString= formatString(mStringsBundle.getStringEx("localeDisplayNames",mError),args,3,t);
 | ||
| 	UnicodeString tempStr;
 | ||
| 	indentOffset.append("\t");
 | ||
| 
 | ||
| 
 | ||
| 	writeLanguage(tempStr);
 | ||
| 	if(!tempStr.isEmpty()){
 | ||
| 		xmlString.append(tempStr);
 | ||
| 		print = TRUE;
 | ||
| 	}
 | ||
| 
 | ||
| 	writeScript(tempStr);
 | ||
| 	if(!tempStr.isEmpty()){
 | ||
| 		xmlString.append(tempStr);
 | ||
| 		print = TRUE;
 | ||
| 	}
 | ||
| 
 | ||
| 	writeCountryNames(tempStr);
 | ||
| 	if(!tempStr.isEmpty()){
 | ||
| 		xmlString.append(tempStr);
 | ||
| 		print = TRUE;
 | ||
| 	}
 | ||
| 
 | ||
| 	writeVariantNames(tempStr);
 | ||
| 	if(!tempStr.isEmpty()){
 | ||
| 		xmlString.append(tempStr);
 | ||
| 		print = TRUE;
 | ||
| 	}
 | ||
| 	writeKeywordNames(tempStr);
 | ||
| 	if(!tempStr.isEmpty()){
 | ||
| 		xmlString.append(tempStr);
 | ||
| 		print = TRUE;
 | ||
| 	}
 | ||
| 	writeTypeNames(tempStr);
 | ||
| 	if(!tempStr.isEmpty()){
 | ||
| 		xmlString.append(tempStr);
 | ||
| 		print = TRUE;
 | ||
| 	}
 | ||
| 	chopIndent();
 | ||
| 
 | ||
| 	Formattable args1[]={indentOffset,(UnicodeString(XML_END_SLASH)),""};
 | ||
| 	xmlString.append(formatString(mStringsBundle.getStringEx("localeDisplayNames",mError) ,args1,3,t));
 | ||
| 	if(print)  printString(&xmlString);
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeTable(const char* key, const char* resMain, const char* resElement, UnicodeString& xmlString){
 | ||
| 
 | ||
| 	if(U_FAILURE(mError)) {
 | ||
| 		return;
 | ||
| 	}
 | ||
| 	Formattable args[]={indentOffset,"",""};
 | ||
| 	UnicodeString t;
 | ||
| 	xmlString= formatString(UnicodeString(mStringsBundle.getStringEx(resMain,mError)),args,3,t);
 | ||
| 
 | ||
|     ResourceBundle dBundle=mSourceBundle.get(key,mError);
 | ||
| 
 | ||
|     if( U_SUCCESS(mError)  && 
 | ||
|         mError != U_USING_FALLBACK_WARNING && 
 | ||
|         mError != U_USING_DEFAULT_WARNING){  
 | ||
| 		UnicodeString fallbackName = dBundle.getStringEx("Fallback",mError);
 | ||
| 		if(U_SUCCESS(mError) && fallbackName.length()>0){
 | ||
| 			// we know that we are processing ICU bundles
 | ||
| 			char fbName[100]={0};
 | ||
| 			int32_t len = fallbackName.extract(0,fallbackName.length(),fbName, 100);
 | ||
| 			fbName[len]=0;//null terminate the array
 | ||
| 			ResourceBundle rootBundle(NULL, "root",mError);
 | ||
| 			ResourceBundle fallbackBundle(NULL, fbName, mError);
 | ||
| 			ResourceBundle rootDelta = rootBundle.get(key, mError);
 | ||
|             ResourceBundle fallbackDelta = fallbackBundle.get(key, mError);
 | ||
| 			indentOffset.append("\t");
 | ||
| 			while(rootDelta.hasNext()){
 | ||
| 				ResourceBundle delta1 = rootDelta.getNext(mError);
 | ||
| 				const char* mykey = delta1.getKey();
 | ||
| 				UnicodeString string = dBundle.getStringEx(mykey, mError);
 | ||
|                 if(strcmp(mykey, "Fallback") == 0){
 | ||
|                     continue;
 | ||
|                 }
 | ||
| 				if(fallbackName.length() > 0 && 
 | ||
|                     (mError == U_MISSING_RESOURCE_ERROR)){
 | ||
| 					// explicit fallback is set 
 | ||
|                     mError=U_ZERO_ERROR;
 | ||
| 					string = fallbackDelta.getStringEx(mykey, mError);
 | ||
| 				}else if(string.length()==0){
 | ||
| 					string = rootDelta.getStringEx(mykey, mError);
 | ||
| 				}
 | ||
| 				Formattable args1[]={indentOffset,mykey,string};
 | ||
| 				xmlString.append(formatString(mStringsBundle.getStringEx(resElement,mError),args1,3,t));
 | ||
| 				mError=U_ZERO_ERROR;
 | ||
| 			}
 | ||
| 			chopIndent();
 | ||
| 			Formattable args1[]={indentOffset,(UnicodeString(XML_END_SLASH)),""};
 | ||
| 			xmlString.append(formatString(mStringsBundle.getStringEx(resMain,mError) ,args1,3,t));
 | ||
| 			return;
 | ||
| 
 | ||
| 		}else{
 | ||
| 			mError = U_ZERO_ERROR;
 | ||
| 			indentOffset.append("\t");
 | ||
| 			while(dBundle.hasNext()){
 | ||
| 				ResourceBundle dBundle1 = dBundle.getNext(mError);
 | ||
| 				const char* mykey=dBundle1.getKey();
 | ||
|                 if(strcmp(mykey, "Fallback")==0){
 | ||
|                     continue;
 | ||
|                 }
 | ||
| 				UnicodeString string = dBundle.getStringEx(mykey,mError);
 | ||
|                 
 | ||
| 				Formattable args1[]={indentOffset,mykey,string};
 | ||
| 				xmlString.append(formatString(mStringsBundle.getStringEx(resElement,mError),args1,3,t));
 | ||
| 				mError=U_ZERO_ERROR;
 | ||
| 			}
 | ||
| 			chopIndent();
 | ||
| 			Formattable args1[]={indentOffset,(UnicodeString(XML_END_SLASH)),""};
 | ||
| 			xmlString.append(formatString(mStringsBundle.getStringEx(resMain,mError) ,args1,3,t));
 | ||
| 			return;
 | ||
| 		}
 | ||
|     }
 | ||
| 				
 | ||
| 	mError=U_ZERO_ERROR;
 | ||
| 	xmlString.remove();
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeLocaleScript(UnicodeString& xmlString){
 | ||
|     if(ignoreSpecials == FALSE){
 | ||
|         ResourceBundle scripts= mSourceBundle.get("LocaleScript",mError);
 | ||
| 	    UnicodeString t;
 | ||
| 
 | ||
| 	    if( mError!=U_USING_DEFAULT_WARNING && 
 | ||
| 		    mError!=U_USING_FALLBACK_WARNING && 
 | ||
| 		    U_SUCCESS(mError)){
 | ||
| 
 | ||
| 	        Formattable args[]={indentOffset,mStringsBundle.getStringEx("xmlns_icu",mError),"",""};
 | ||
| 	        UnicodeString t;
 | ||
| 	        xmlString.append(formatString(mStringsBundle.getStringEx( "special",mError),args,4,t));
 | ||
| 	        indentOffset.append("\t");		
 | ||
|         
 | ||
|             args[0]=indentOffset;
 | ||
|             args[1]="";
 | ||
| 		    xmlString.append(formatString(mStringsBundle.getStringEx("icu_scripts",mError),args,2,t));
 | ||
| 		    indentOffset.append("\t");
 | ||
|             for(int i=0;scripts.hasNext();i++){
 | ||
|                 char c[10]={0};
 | ||
| 			    itoa(i+1,c,10);
 | ||
| 			    args[0] = indentOffset;
 | ||
| 			    args[1] = UnicodeString(c);
 | ||
| 			    args[2] = scripts.getNextString(mError);
 | ||
| 			    xmlString.append(formatString(mStringsBundle.getStringEx("icu_script",mError),args,3,t));
 | ||
| 		    }
 | ||
| 		    chopIndent();
 | ||
| 		    args[0] = indentOffset;
 | ||
| 		    args[1] = UnicodeString(XML_END_SLASH);
 | ||
| 		    xmlString.append(formatString(mStringsBundle.getStringEx("icu_scripts",mError),args,2,t));
 | ||
|         
 | ||
|             chopIndent();
 | ||
| 		    args[0] = indentOffset;
 | ||
| 		    args[1] = UnicodeString(XML_END_SLASH);
 | ||
| 		    xmlString.append(formatString(mStringsBundle.getStringEx("specialEnd",mError),args,2,t));
 | ||
| 
 | ||
| 		    mError=U_ZERO_ERROR;
 | ||
| 		    return;
 | ||
| 	    }
 | ||
| 	    xmlString.remove();
 | ||
| 	    mError= U_ZERO_ERROR;
 | ||
|     }
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeScript(UnicodeString& xmlString){
 | ||
| 
 | ||
| 	writeTable("Scripts","scripts","script",xmlString);		
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeLanguage(UnicodeString& xmlString){
 | ||
| 
 | ||
| 	writeTable("Languages","languages","language",xmlString);
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| void GenerateXML::writeCountryNames(UnicodeString& xmlString){
 | ||
| 
 | ||
| 	writeTable("Countries","territories","territory",xmlString);
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| void GenerateXML::writeVariantNames(UnicodeString& xmlString){
 | ||
| 
 | ||
|     writeTable("Variants","variants","variant",xmlString);
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeKeywordNames(UnicodeString& xmlString){
 | ||
|     writeTable("Keys","keys","key",xmlString);
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeTypeNames(UnicodeString& xmlString){
 | ||
| 
 | ||
| 	UnicodeString tempStr;
 | ||
| 	Formattable args[] = { indentOffset, "","",""};
 | ||
|     formatString(mStringsBundle.getStringEx("types",mError),args,2,xmlString);
 | ||
|     ResourceBundle dBundle=mSourceBundle.get("Types",mError);
 | ||
| 	UnicodeString t;
 | ||
| 
 | ||
|     if( U_SUCCESS(mError)  && 
 | ||
|         mError != U_USING_FALLBACK_WARNING && 
 | ||
|         mError != U_USING_DEFAULT_WARNING){  
 | ||
| 		
 | ||
| 		mError = U_ZERO_ERROR;
 | ||
| 		indentOffset.append("\t");
 | ||
| 		while(dBundle.hasNext()){
 | ||
| 			ResourceBundle dBundle1 = dBundle.getNext(mError);
 | ||
| 			const char* key=dBundle1.getKey();
 | ||
|             if(strcmp(key, "Fallback")==0){
 | ||
|                 continue;
 | ||
|             }
 | ||
| 			ResourceBundle dBundle2 = dBundle.get(key,mError);
 | ||
|             while(dBundle2.hasNext()){
 | ||
|                 ResourceBundle dBundle3 = dBundle2.getNext(mError);
 | ||
|                 const char* type = dBundle3.getKey();
 | ||
|                 if(strcmp(type, "Fallback")==0){
 | ||
|                     continue;
 | ||
|                 }
 | ||
|                 UnicodeString value = dBundle3.getString(mError);
 | ||
| 			    Formattable args1[]={indentOffset,type, key, value};
 | ||
| 
 | ||
| 			    xmlString.append(formatString(mStringsBundle.getStringEx("type",mError),args1,4,t));
 | ||
|             }
 | ||
| 			mError=U_ZERO_ERROR;
 | ||
| 		}
 | ||
| 		chopIndent();
 | ||
| 		Formattable args1[]={indentOffset,(UnicodeString(XML_END_SLASH)),""};
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("types",mError) ,args1,3,t));
 | ||
| 		return;
 | ||
| 		
 | ||
| 	}
 | ||
| 	xmlString.append(tempStr);
 | ||
| 	args[0] = indentOffset;
 | ||
| 	args[1] = "/";
 | ||
| 	xmlString.append(formatString(mStringsBundle.getStringEx("types",mError),args,2,t));
 | ||
| 	if(tempStr.isEmpty()){
 | ||
| 		xmlString.remove();
 | ||
| 	}
 | ||
|     mError =U_ZERO_ERROR;
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeLayout(){
 | ||
|     if(ignoreLayout == FALSE){
 | ||
| 	    UnicodeString xmlString;
 | ||
| 	    Formattable args[] = {indentOffset,"",""};
 | ||
| 	    UnicodeString t;
 | ||
| 	    xmlString.append(formatString(mStringsBundle.getStringEx("layout", mError), args,2,t));
 | ||
| 	    UnicodeString lang = mLocale.getLanguage();
 | ||
| 	    UnicodeString country = mLocale.getCountry();
 | ||
| 	    indentOffset.append("\t");
 | ||
|         UBool rightToLeft = FALSE;
 | ||
| 	    if(lang=="ar" || lang=="he" || lang=="il" || lang=="ps" || lang=="fa" ){
 | ||
| 		    args[0] = indentOffset;
 | ||
| 		    args[1] = "top-to-bottom";
 | ||
| 		    args[2] = "right-to-left";
 | ||
| 		    xmlString.append(formatString(mStringsBundle.getStringEx("orientation",mError), args,3,t));
 | ||
| 	        rightToLeft = TRUE;
 | ||
|         }else if(lang== "root"){
 | ||
| 		    args[0] = indentOffset;
 | ||
| 		    args[1] = "top-to-bottom";
 | ||
| 		    args[2] = "left-to-right";
 | ||
| 		    xmlString.append(formatString(mStringsBundle.getStringEx("orientation",mError), args,3,t));
 | ||
| 	    }
 | ||
| 	    chopIndent();
 | ||
| 	    args[0] = indentOffset;
 | ||
| 	    args[1] = "/";
 | ||
| 	    xmlString.append(formatString(mStringsBundle.getStringEx("layout",mError),args,2,t));
 | ||
| 	    mError = U_ZERO_ERROR;
 | ||
| 	    //print this only in the root language locale
 | ||
| 	    if(lang=="root" || rightToLeft == TRUE){
 | ||
| 		    printString(&xmlString);
 | ||
| 	    }
 | ||
|     }
 | ||
| }
 | ||
| void GenerateXML::writeEncodings(){
 | ||
| 	UnicodeString xmlString;
 | ||
| 	Formattable args[] = {indentOffset,"",""};
 | ||
| 	UnicodeString t;
 | ||
| 	xmlString.append(formatString(mStringsBundle.getStringEx("characters",mError),args,2,t));
 | ||
| 	indentOffset.append("\t");
 | ||
|     UnicodeString temp;
 | ||
|     UBool writeData = FALSE;
 | ||
| 
 | ||
|     if(onlySpecials==FALSE){
 | ||
|         writeExemplarCharacters(temp);
 | ||
|     }
 | ||
|     if(temp.length()>0){
 | ||
|         xmlString.append(temp);
 | ||
|         writeData = TRUE;
 | ||
|     }
 | ||
|     temp.remove();
 | ||
|     //if(ignoreSpecials==TRUE){
 | ||
|         writeLocaleScript(temp);
 | ||
|     //}
 | ||
|     if(temp.length()>0){
 | ||
|         xmlString.append(temp);
 | ||
|         writeData = TRUE;
 | ||
|     }
 | ||
|     // currently no mappings are defined in ICU 
 | ||
|     // so we donot add them
 | ||
|     if(writeData == TRUE){
 | ||
|         chopIndent();
 | ||
|         args[0] = indentOffset;
 | ||
| 	    args[1] = "/";
 | ||
| 	    xmlString.append(formatString(mStringsBundle.getStringEx("characters",mError),args,2,t));
 | ||
| 	    printString(&xmlString);
 | ||
|     }else{
 | ||
|         xmlString.remove();
 | ||
|     }
 | ||
| 
 | ||
|     mError = U_ZERO_ERROR;
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeExemplarCharacters(UnicodeString& xmlString){
 | ||
|     Formattable args[] = {"","",""};
 | ||
|     args[0] = indentOffset;
 | ||
| 	args[1] = mSourceBundle.getStringEx("ExemplarCharacters",mError);
 | ||
| 	UnicodeString t;
 | ||
| 	if(	mError != U_USING_FALLBACK_WARNING && 
 | ||
| 		mError != U_USING_DEFAULT_WARNING && 
 | ||
| 		U_SUCCESS(mError)){
 | ||
| 	
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("exemplarCharacters",mError),args,2,t));
 | ||
| 	}
 | ||
|     mError = U_ZERO_ERROR;
 | ||
| }
 | ||
| void GenerateXML::writeDelimiters(){
 | ||
| // Data not available in ICU
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeMeasurement(){
 | ||
|     UnicodeString xmlString;
 | ||
|     writeMeasurement(xmlString);
 | ||
|     if(xmlString.length()>0)  printString(&xmlString);
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| void GenerateXML::writeDates(){
 | ||
| 	UnicodeString xmlString;
 | ||
| 	UBool print = FALSE;
 | ||
| 	if(U_FAILURE(mError)) {
 | ||
| 		return;
 | ||
| 	}
 | ||
| 	Formattable args[]={indentOffset,"",""};
 | ||
| 	formatString(mStringsBundle.getStringEx("dates",mError),args,3,xmlString);
 | ||
| 	UnicodeString tempStr;
 | ||
| 	indentOffset.append("\t");
 | ||
| 	
 | ||
| 	writeLocalePatternChars(tempStr);
 | ||
| 	if(!tempStr.isEmpty()){
 | ||
| 		xmlString.append(tempStr);
 | ||
| 		print = TRUE;
 | ||
| 	}
 | ||
| 	
 | ||
| 	tempStr.remove();
 | ||
| 	writeCalendars(tempStr);
 | ||
| 	if(!tempStr.isEmpty()){
 | ||
| 		xmlString.append(tempStr);
 | ||
| 		print = TRUE;
 | ||
| 	}
 | ||
| 
 | ||
| 	tempStr.remove();
 | ||
| 	writeTimeZoneNames(tempStr);
 | ||
| 	if(!tempStr.isEmpty()){
 | ||
| 		xmlString.append(tempStr);
 | ||
| 		print = TRUE;
 | ||
| 	}
 | ||
| 
 | ||
| 	chopIndent();
 | ||
| 
 | ||
| 	Formattable args1[]={indentOffset,(UnicodeString(XML_END_SLASH)),""};
 | ||
| 	UnicodeString t;
 | ||
| 	xmlString.append(formatString(mStringsBundle.getStringEx("dates",mError) ,args1,3,t));
 | ||
| 	if(print)  printString(&xmlString);
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeTimeZoneNames(UnicodeString& xmlString){
 | ||
| 
 | ||
| 	if(U_FAILURE(mError)) {
 | ||
| 		return;
 | ||
| 	}
 | ||
| 	UBool isDefault =TRUE;
 | ||
| 	Formattable args[4] ={indentOffset,"","",""};
 | ||
| 
 | ||
| 	UnicodeString t;
 | ||
| 
 | ||
|     ResourceBundle dBundle = mSourceBundle.get("zoneStrings", mError);
 | ||
|     UBool remove = TRUE;
 | ||
| 
 | ||
| 	if(mError!=U_USING_DEFAULT_WARNING && U_SUCCESS(mError) && mError!=U_USING_FALLBACK_WARNING){
 | ||
|         
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("timeZone",mError),args,2,t));
 | ||
| 		
 | ||
| 		indentOffset.append("\t");
 | ||
|         while(dBundle.hasNext()){
 | ||
|             ResourceBundle dBundle1 = dBundle.getNext(mError);
 | ||
| 
 | ||
|             if(U_SUCCESS(mError)){
 | ||
|             
 | ||
|                 int i = 0;
 | ||
| 
 | ||
|                 UnicodeString data =dBundle1.getStringEx((int32_t)0,mError);
 | ||
|                 if(U_SUCCESS(mError)){
 | ||
|                      remove = FALSE;
 | ||
|              	     args[0] =indentOffset;
 | ||
| 					 args[1] = data;
 | ||
| 					 args[2] = "";
 | ||
| 			        xmlString.append(formatString(mStringsBundle.getStringEx("zoneStart",mError),args,3,t));
 | ||
| 
 | ||
| 			        isDefault=FALSE;
 | ||
| 			        indentOffset.append("\t");
 | ||
|                     
 | ||
| 					args[0] =indentOffset;
 | ||
| 					args[1] = "";
 | ||
|                     //long format 
 | ||
| 			        xmlString.append(formatString(mStringsBundle.getStringEx("long",mError),args,2,t));
 | ||
| 
 | ||
| 			        indentOffset.append("\t");
 | ||
|          	       /*
 | ||
|                     // Currently ICU does not have support for generic
 | ||
|                     args[0]=indentOffset;
 | ||
| 			        args[1]=dBundle1.getStringEx((int32_t)1,mError);
 | ||
|                     if(U_SUCCESS(mError)){
 | ||
| 			            xmlString.append(formatString(mStringsBundle.getStringEx("generic",mError),args,2,t));
 | ||
|                     }
 | ||
|                     */
 | ||
|                     mError=U_ZERO_ERROR;
 | ||
|                     args[1]=dBundle1.getStringEx((int32_t)1,mError);
 | ||
|                     if(U_SUCCESS(mError)){
 | ||
| 			            xmlString.append(formatString(mStringsBundle.getStringEx("standard",mError),args,2,t));
 | ||
|                     }
 | ||
|                     mError =U_ZERO_ERROR;
 | ||
|                     args[1]=dBundle1.getStringEx((int32_t)3,mError);
 | ||
|                     if(U_SUCCESS(mError)){
 | ||
| 			            xmlString.append(formatString(mStringsBundle.getStringEx("daylight",mError),args,2,t));
 | ||
|                     }
 | ||
|                     mError=U_ZERO_ERROR;
 | ||
|                     chopIndent();
 | ||
| 			        args[0]=indentOffset;
 | ||
| 					args[1]=UnicodeString(XML_END_SLASH);
 | ||
| 			        xmlString.append(formatString(mStringsBundle.getStringEx("long",mError),args,2,t));
 | ||
|                     
 | ||
| 					args[1]="";
 | ||
|                     // short format 
 | ||
| 			        xmlString.append(formatString(mStringsBundle.getStringEx("short",mError),args,2,t));
 | ||
| 
 | ||
| 			        indentOffset.append("\t");
 | ||
| 			        args[0]=indentOffset;
 | ||
|                     /*
 | ||
|                     // Currently ICU does not have support for generic
 | ||
|                    
 | ||
|                     data=dBundle1.getStringEx((int32_t)0,mError);
 | ||
|                     if(U_SUCCESS(mError)){
 | ||
| 			            args[1]=data;
 | ||
| 			            xmlString.append(formatString(mStringsBundle.getStringEx("generic",mError),args,2,t));
 | ||
|                     }
 | ||
|                     */
 | ||
|                     data=dBundle1.getStringEx((int32_t)2,mError);
 | ||
|                     if(U_SUCCESS(mError)){
 | ||
| 			            args[1]=data;
 | ||
| 			            xmlString.append(formatString(mStringsBundle.getStringEx("standard",mError),args,2,t));
 | ||
|                     }
 | ||
|                     data = dBundle1.getStringEx((int32_t)4,mError);
 | ||
|                     if(U_SUCCESS(mError)){
 | ||
|     			        args[1]=data;
 | ||
|     			        xmlString.append(formatString(mStringsBundle.getStringEx("daylight",mError),args,2,t));
 | ||
|                     }
 | ||
|                     mError = U_ZERO_ERROR;
 | ||
| 			        chopIndent();
 | ||
| 			        args[0]=indentOffset;
 | ||
| 					args[1]=UnicodeString(XML_END_SLASH);
 | ||
| 			        xmlString.append(formatString(mStringsBundle.getStringEx("short",mError),args,2,t));
 | ||
| 			        
 | ||
| 			        args[1].setString(dBundle1.getStringEx((int32_t)5,mError));
 | ||
|                     if(U_SUCCESS(mError)){
 | ||
| 			            xmlString.append(formatString(mStringsBundle.getStringEx("exemplarCity",mError),args,2,t));
 | ||
|                     }
 | ||
|                     mError=U_ZERO_ERROR;
 | ||
| 			        chopIndent();
 | ||
| 			        xmlString.append(formatString(mStringsBundle.getStringEx("zoneEnd",mError),indentOffset,t));
 | ||
| 					
 | ||
| 
 | ||
|                 }
 | ||
| 		    }
 | ||
|             mError=U_ZERO_ERROR;
 | ||
| 
 | ||
|         }
 | ||
| 		chopIndent();
 | ||
| 		args[0]=indentOffset;
 | ||
| 		args[1]=UnicodeString(XML_END_SLASH);
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("timeZone",mError),args,2,t));
 | ||
| 		//printString(&xmlString);
 | ||
|         if(remove==TRUE){
 | ||
|             xmlString.remove();
 | ||
|         }
 | ||
|         mError=U_ZERO_ERROR;
 | ||
| 		return;
 | ||
|     }
 | ||
| 	mError=U_ZERO_ERROR;
 | ||
| }
 | ||
| 
 | ||
| 		
 | ||
| void GenerateXML::writeCalendars(UnicodeString& xmlString){
 | ||
| 	UnicodeString tempStr;
 | ||
| 	UBool print =FALSE;
 | ||
| 	Formattable args[2]={indentOffset,""};
 | ||
| 	xmlString.append(formatString(mStringsBundle.getStringEx("calendars",mError),args,2,tempStr));
 | ||
|     
 | ||
|     ResourceBundle calendars = mSourceBundle.get("calendar", mError);
 | ||
|     indentOffset.append("\t");
 | ||
|     if( mError!=U_USING_DEFAULT_WARNING && 
 | ||
| 		mError!=U_USING_FALLBACK_WARNING && 
 | ||
|             U_SUCCESS(mError)){
 | ||
| 
 | ||
| 
 | ||
|         ResourceBundle defaultCalendar = calendars.getWithFallback("default", mError);
 | ||
|         UnicodeString defaultC = defaultCalendar.getString(mError);
 | ||
|         args[0] = indentOffset;
 | ||
|         args[1] = defaultC;
 | ||
|         if(U_FAILURE(mError)){
 | ||
|             fprintf(stderr, "Could not find the default calendar. Dying.\n");
 | ||
|             exit(U_INTERNAL_PROGRAM_ERROR);
 | ||
|         }
 | ||
|         xmlString.append(formatString(mStringsBundle.getStringEx( "default",mError),args,2,tempStr));
 | ||
| 
 | ||
|         while(calendars.hasNext()){
 | ||
|             ResourceBundle calendar = calendars.getNext(mError);
 | ||
|             if(U_SUCCESS(mError)){
 | ||
|                 UnicodeString key = UnicodeString(calendar.getKey());
 | ||
|                 mError=U_ZERO_ERROR;
 | ||
| 	            tempStr.remove();
 | ||
|                 writeCalendar(calendar, key, (defaultC==key),tempStr); 
 | ||
| 	            if(!tempStr.isEmpty()){
 | ||
| 		            xmlString.append(tempStr);
 | ||
| 		            print = TRUE;
 | ||
| 	            }
 | ||
|             }
 | ||
|         }
 | ||
|     }
 | ||
| 	chopIndent();
 | ||
|     args[0] = indentOffset;
 | ||
| 	args[1]=UnicodeString(XML_END_SLASH);
 | ||
|     if(print ==TRUE){
 | ||
| 	    xmlString.append(formatString(mStringsBundle.getStringEx("calendars",mError),args,2,tempStr));
 | ||
|     }else{
 | ||
|         xmlString.remove();
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeCalendar(ResourceBundle& calendar, UnicodeString& cal,UBool isDefault,UnicodeString& xmlString){
 | ||
| 	
 | ||
| 	UnicodeString tempStr;
 | ||
| 	UBool print =FALSE;
 | ||
| 	Formattable args[]={indentOffset,cal};
 | ||
| 	// TODO : Figure out a way to find default
 | ||
| 	// xmlString.append(formatString(mStringsBundle.getStringEx( "default",mError),args,2,tempStr));
 | ||
| 	xmlString.append(formatString(mStringsBundle.getStringEx("calendarStart",mError),args,2,tempStr));
 | ||
| 
 | ||
| 	indentOffset.append("\t");
 | ||
| 	tempStr.remove();
 | ||
| 	writeMonthNames(calendar, tempStr);
 | ||
| 	if(!tempStr.isEmpty()){
 | ||
| 		xmlString.append(tempStr);
 | ||
| 		print = TRUE;
 | ||
| 	}
 | ||
| 
 | ||
| 	tempStr.remove();
 | ||
| 	writeDayNames(calendar, tempStr);
 | ||
| 	if(!tempStr.isEmpty()){
 | ||
| 		xmlString.append(tempStr);
 | ||
| 		print = TRUE;
 | ||
| 	}
 | ||
| 
 | ||
|     tempStr.remove();
 | ||
| 	writeWeek(calendar, tempStr);
 | ||
| 	if(!tempStr.isEmpty()){
 | ||
| 		xmlString.append(tempStr);
 | ||
| 		print = TRUE;
 | ||
| 	}
 | ||
| 	tempStr.remove();
 | ||
| 	writeAMPMmarkers(calendar, tempStr);
 | ||
| 	if(!tempStr.isEmpty()){
 | ||
| 		xmlString.append(tempStr);
 | ||
| 		print = TRUE;
 | ||
| 	}
 | ||
|     tempStr.remove();
 | ||
| 	writeEra(calendar, tempStr);
 | ||
| 	if(!tempStr.isEmpty()){
 | ||
| 		xmlString.append(tempStr);
 | ||
| 		print = TRUE;
 | ||
| 	}
 | ||
| 	tempStr.remove();
 | ||
| 	writeDateFormat(calendar,tempStr);
 | ||
| 	if(!tempStr.isEmpty()){
 | ||
| 		xmlString.append(tempStr);
 | ||
| 		print = TRUE;
 | ||
| 	}
 | ||
|     tempStr.remove();
 | ||
| 	writeTimeFormat(calendar, tempStr);
 | ||
| 	if(!tempStr.isEmpty()){
 | ||
| 		xmlString.append(tempStr);
 | ||
| 		print = TRUE;
 | ||
| 	}
 | ||
|     tempStr.remove();
 | ||
| 	writeDateTimeFormat(calendar, tempStr);
 | ||
| 	if(!tempStr.isEmpty()){
 | ||
| 		xmlString.append(tempStr);
 | ||
| 		print = TRUE;
 | ||
| 	}
 | ||
| 	chopIndent();
 | ||
|     mError =U_ZERO_ERROR;
 | ||
|     if(print == TRUE){
 | ||
| 	    xmlString.append(formatString(mStringsBundle.getStringEx("calendarEnd",mError),indentOffset,tempStr));
 | ||
|     }else{
 | ||
|         xmlString.remove();
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| const char* getDayName(int index){
 | ||
| 	switch(index){
 | ||
| 	case 0:
 | ||
| 		return "sun";
 | ||
| 	case 1:
 | ||
| 		return "mon";
 | ||
| 	case 2:
 | ||
| 		return "tue";
 | ||
| 	case 3:
 | ||
| 		return "wed";
 | ||
| 	case 4:
 | ||
| 		return "thu";
 | ||
| 	case 5:
 | ||
| 		return "fri";
 | ||
| 	case 6:
 | ||
| 		return "sat";
 | ||
| 	default:
 | ||
| 		return "";
 | ||
| 	}
 | ||
| }
 | ||
| const char* getDayNameDTE(int index){
 | ||
| 	switch(index){
 | ||
| 	case 1:
 | ||
| 		return "sun";
 | ||
| 	case 2:
 | ||
| 		return "mon";
 | ||
| 	case 3:
 | ||
| 		return "tue";
 | ||
| 	case 4:
 | ||
| 		return "wed";
 | ||
| 	case 5:
 | ||
| 		return "thu";
 | ||
| 	case 6:
 | ||
| 		return "fri";
 | ||
| 	case 7:
 | ||
| 		return "sat";
 | ||
| 	default:
 | ||
| 		return "";
 | ||
| 	}
 | ||
| }
 | ||
| void GenerateXML::writeMonthNames(ResourceBundle& calendar, UnicodeString& xmlString){
 | ||
| 
 | ||
|     ResourceBundle monthNames = calendar.get("monthNames",mError);
 | ||
| 	UnicodeString t;
 | ||
|     if( mError!=U_USING_DEFAULT_WARNING && 
 | ||
| 		mError!=U_USING_FALLBACK_WARNING && 
 | ||
| 		U_SUCCESS(mError)){
 | ||
|         
 | ||
|         Formattable args[4] ={ indentOffset, "", "", "" };
 | ||
|         xmlString.append(formatString(mStringsBundle.getStringEx("months", mError), args, 2, t));
 | ||
|         indentOffset.append("\t");
 | ||
| 
 | ||
|         while(monthNames.hasNext()){
 | ||
|             ResourceBundle context = monthNames.getNext(mError);
 | ||
|             UnicodeString ctxKey = UnicodeString(context.getKey());
 | ||
|             if(U_FAILURE(mError)){
 | ||
|                 exit(U_INTERNAL_PROGRAM_ERROR);
 | ||
|             }
 | ||
|             if(ctxKey=="default"){
 | ||
|                 args[0] = indentOffset;
 | ||
|                 args[1] = context.getString(mError);
 | ||
|                 xmlString.append(formatString(mStringsBundle.getStringEx("default",mError),args,2,t));
 | ||
|                 continue;
 | ||
|             }
 | ||
|             args[0] = indentOffset;
 | ||
|             args[1] = ctxKey;
 | ||
|             xmlString.append(formatString(mStringsBundle.getStringEx("monthContext",mError),args,2,t));
 | ||
| 		    indentOffset.append("\t");
 | ||
|             
 | ||
|             UnicodeString defaultWidth = context.getStringEx("default", mError);
 | ||
|             if(U_SUCCESS(mError)){
 | ||
|                 args[0] = indentOffset;
 | ||
|                 args[1] = defaultWidth;
 | ||
|                 xmlString.append(formatString(mStringsBundle.getStringEx("default",mError),args,2,t));
 | ||
|             }
 | ||
|             mError = U_ZERO_ERROR;
 | ||
| 
 | ||
|             while(context.hasNext()){
 | ||
|                 ResourceBundle width = context.getNext(mError);
 | ||
|                 if(U_FAILURE(mError)){
 | ||
|                     fprintf(stderr, "Unexpected Error: %s \n", u_errorName(mError));
 | ||
|                     exit(U_INTERNAL_PROGRAM_ERROR);
 | ||
|                 }
 | ||
|                 UnicodeString widthKey = UnicodeString(width.getKey());
 | ||
|                 if(widthKey=="default"){
 | ||
|                     continue;
 | ||
|                 }
 | ||
|                 args[0] = indentOffset;
 | ||
|                 args[1] = widthKey;
 | ||
|                 xmlString.append(formatString(mStringsBundle.getStringEx("monthWidth",mError),args,2,t));
 | ||
| 		        indentOffset.append("\t");
 | ||
| 
 | ||
|                 for(int i=0;width.hasNext();i++){
 | ||
|                     char c[10]={0};
 | ||
| 			        itoa(i+1,c,10);
 | ||
| 			        args[0] = indentOffset;
 | ||
| 			        args[1] = UnicodeString(c);
 | ||
| 			        args[2] = width.getNextString(mError);
 | ||
| 			        xmlString.append(formatString(mStringsBundle.getStringEx("month",mError),args,3,t));
 | ||
| 		        }
 | ||
| 		        chopIndent();
 | ||
| 		        args[0] = indentOffset;
 | ||
| 		        xmlString.append(formatString(mStringsBundle.getStringEx("monthWidthEnd",mError),args,1,t));
 | ||
|             }
 | ||
|             chopIndent();
 | ||
|             args[0] = indentOffset;
 | ||
|             xmlString.append(formatString(mStringsBundle.getStringEx("monthContextEnd",mError),args,1,t));
 | ||
|         }
 | ||
|         
 | ||
|         chopIndent();
 | ||
|         args[0] = indentOffset;
 | ||
|         args[1] = UnicodeString(XML_END_SLASH);
 | ||
|         xmlString.append(formatString(mStringsBundle.getStringEx("months",mError),args,2,t));
 | ||
| 
 | ||
|         mError=U_ZERO_ERROR;
 | ||
| 		return;
 | ||
|     }
 | ||
| 	xmlString.remove();
 | ||
| 	mError= U_ZERO_ERROR;
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeDayNames(ResourceBundle& calendar, UnicodeString& xmlString){
 | ||
|    ResourceBundle dayNames = calendar.get("dayNames",mError);
 | ||
| 	UnicodeString t;
 | ||
|     if( mError!=U_USING_DEFAULT_WARNING && 
 | ||
| 		mError!=U_USING_FALLBACK_WARNING && 
 | ||
| 		U_SUCCESS(mError)){
 | ||
|         
 | ||
|         Formattable args[4] ={ indentOffset, "", "", "" };
 | ||
|         xmlString.append(formatString(mStringsBundle.getStringEx("days", mError), args, 2, t));
 | ||
|         indentOffset.append("\t");
 | ||
| 
 | ||
|         while(dayNames.hasNext()){
 | ||
|             ResourceBundle context = dayNames.getNext(mError);
 | ||
|             UnicodeString ctxKey = UnicodeString(context.getKey());
 | ||
|             if(ctxKey=="default"){
 | ||
|                 args[0] = indentOffset;
 | ||
|                 args[1] = context.getString(mError);
 | ||
|                 xmlString.append(formatString(mStringsBundle.getStringEx("default",mError),args,2,t));
 | ||
|                 continue;
 | ||
|             }
 | ||
|             if(U_FAILURE(mError)){
 | ||
|                 exit(U_INTERNAL_PROGRAM_ERROR);
 | ||
|             }
 | ||
|             args[0] = indentOffset;
 | ||
|             args[1] = ctxKey;
 | ||
|             xmlString.append(formatString(mStringsBundle.getStringEx("dayContext",mError),args,2,t));
 | ||
| 		    indentOffset.append("\t");
 | ||
|             UnicodeString defaultWidth = context.getStringEx("default", mError);
 | ||
|             if(U_SUCCESS(mError)){
 | ||
|                 args[0] = indentOffset;
 | ||
|                 args[1] = defaultWidth;
 | ||
|                 xmlString.append(formatString(mStringsBundle.getStringEx("default",mError),args,2,t));
 | ||
|             }
 | ||
|             mError = U_ZERO_ERROR;
 | ||
|             while(context.hasNext()){
 | ||
|                 ResourceBundle width = context.getNext(mError);
 | ||
|                 if(U_FAILURE(mError)){
 | ||
|                     fprintf(stderr, "Unexpected Error: %s \n", u_errorName(mError));
 | ||
|                     exit(U_INTERNAL_PROGRAM_ERROR);
 | ||
|                 }
 | ||
|                 UnicodeString widthKey = UnicodeString(width.getKey());
 | ||
|                 if(widthKey == "default"){
 | ||
|                      continue;
 | ||
|                 }
 | ||
|                 args[0] = indentOffset;
 | ||
|                 args[1] = widthKey;
 | ||
|                 xmlString.append(formatString(mStringsBundle.getStringEx("dayWidth",mError),args,2,t));
 | ||
| 		        indentOffset.append("\t");
 | ||
| 
 | ||
|                 for(int i=0;width.hasNext();i++){
 | ||
|                     
 | ||
| 			        args[0] = indentOffset;
 | ||
| 			        args[1] = getDayName(i);
 | ||
| 			        args[2] = width.getNextString(mError);
 | ||
| 			        xmlString.append(formatString(mStringsBundle.getStringEx("day",mError),args,3,t));
 | ||
| 		        }
 | ||
| 		        chopIndent();
 | ||
| 		        args[0] = indentOffset;
 | ||
| 		        xmlString.append(formatString(mStringsBundle.getStringEx("dayWidthEnd",mError),args,1,t));
 | ||
|             }
 | ||
|             chopIndent();
 | ||
|             args[0] = indentOffset;
 | ||
|             xmlString.append(formatString(mStringsBundle.getStringEx("dayContextEnd",mError),args,1,t));
 | ||
|         }
 | ||
|         
 | ||
|         chopIndent();
 | ||
|         args[0] = indentOffset;
 | ||
|         args[1] = UnicodeString(XML_END_SLASH);
 | ||
|         xmlString.append(formatString(mStringsBundle.getStringEx("days",mError),args,2,t));
 | ||
| 
 | ||
|         mError=U_ZERO_ERROR;
 | ||
| 		return;
 | ||
|     }
 | ||
| 	xmlString.remove();
 | ||
| 	mError= U_ZERO_ERROR;
 | ||
| }
 | ||
| UnicodeString getTimeString(UnicodeString& val, int32_t milliSecs){
 | ||
|     int32_t minutes = milliSecs / (60000); /* number of milli seconds in 1 hr*/
 | ||
|     int32_t deltaMin = minutes % 60;
 | ||
|     int32_t hours = (minutes-deltaMin)/60;
 | ||
|     char c[10]={0};
 | ||
|     itoa(hours, c, 10);
 | ||
|     if(strcmp(c,"0")==0){
 | ||
|         val.append("00");
 | ||
|     }else{
 | ||
|         if(strlen(c)==1){
 | ||
|             val.append("0");
 | ||
|         }
 | ||
|         val.append(c);
 | ||
|     }
 | ||
|     val.append(":");
 | ||
|     c[0] = 0;
 | ||
|     itoa(minutes, c, 10);
 | ||
|     if(strcmp(c,"0")==0){
 | ||
|         val.append("00");
 | ||
|     }else{
 | ||
|         if(strlen(c)==1){
 | ||
|             val.append("0");
 | ||
|         }
 | ||
|         val.append(c);
 | ||
|     }
 | ||
|     return val;
 | ||
| }
 | ||
| void GenerateXML::writeWeek(ResourceBundle& calendar, UnicodeString& xmlString){
 | ||
| 	UnicodeString t;
 | ||
|     Formattable args[3] = {indentOffset,"",""};
 | ||
| 	xmlString.append(formatString(mStringsBundle.getStringEx("week",mError),args,2,t));
 | ||
| 	indentOffset.append("\t");
 | ||
| 
 | ||
|     ResourceBundle dtElements = calendar.get("DateTimeElements", mError);
 | ||
| 	UnicodeString temp;
 | ||
| 
 | ||
|     if( mError!=U_USING_DEFAULT_WARNING && 
 | ||
| 		mError!=U_USING_FALLBACK_WARNING && 
 | ||
| 		U_SUCCESS(mError)){
 | ||
| 	    int32_t len =0;
 | ||
| 	    const int32_t* vector = dtElements.getIntVector(len,mError);
 | ||
| 
 | ||
| 		args[0] = indentOffset;
 | ||
|         // write min days in a week
 | ||
|         if(len > 1){
 | ||
| 		    args[1] = vector[1];	
 | ||
|         }else{
 | ||
|             args[1] = "";
 | ||
|         }
 | ||
|         temp.append(formatString(mStringsBundle.getStringEx("minDays",mError),args,2,t));
 | ||
| 
 | ||
|         // write first day of the week
 | ||
|         args[1] = getDayNameDTE(vector[0]);
 | ||
| 		temp.append(formatString(mStringsBundle.getStringEx("firstDay",mError),args,2,t));
 | ||
|         
 | ||
|     }
 | ||
| 
 | ||
|     mError = U_ZERO_ERROR;
 | ||
|     // now write weekend information
 | ||
|     ResourceBundle weekend = calendar.get("weekend", mError);
 | ||
|     if(U_SUCCESS(mError)){
 | ||
|         int32_t len = 0;
 | ||
|         const int32_t* vector = weekend.getIntVector(len, mError);
 | ||
|         UnicodeString time;
 | ||
|         args[0] = indentOffset;
 | ||
| 
 | ||
|         args[1] = getDayNameDTE(vector[0]);
 | ||
|         args[2] = getTimeString(time, vector[1]);
 | ||
|         temp.append(formatString(mStringsBundle.getStringEx("weekendStart", mError), args, 3, t));
 | ||
|         
 | ||
|         time.remove();
 | ||
|         args[1] = getDayNameDTE(vector[2]);
 | ||
|         args[2] = getTimeString(time, vector[3]);
 | ||
|         temp.append(formatString(mStringsBundle.getStringEx("weekendEnd", mError), args, 3, t));
 | ||
| 
 | ||
|     }
 | ||
|     
 | ||
|     mError = U_ZERO_ERROR;
 | ||
|     if(temp.length()>0){
 | ||
|         xmlString.append(temp);
 | ||
|     	chopIndent();
 | ||
| 		args[0] = indentOffset;
 | ||
| 		args[1] = UnicodeString(XML_END_SLASH);
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("week",mError),args,2,t));
 | ||
| 		mError=U_ZERO_ERROR;
 | ||
| 		return;
 | ||
|     }
 | ||
|     chopIndent();
 | ||
| 	xmlString.remove();
 | ||
| 	mError= U_ZERO_ERROR;
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeEra(ResourceBundle& calendar,UnicodeString& xmlString){
 | ||
| 
 | ||
|     ResourceBundle eras= calendar.get("eras",mError);
 | ||
| 	UnicodeString t;
 | ||
| 	if( mError!=U_USING_DEFAULT_WARNING && 
 | ||
| 		mError!=U_USING_FALLBACK_WARNING && 
 | ||
| 		U_SUCCESS(mError)){
 | ||
| 		
 | ||
| 		Formattable args[3] = {indentOffset,"",""};
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("eras",mError),args,2,t));
 | ||
| 		indentOffset.append("\t");
 | ||
| 		
 | ||
|         args[0] = indentOffset;
 | ||
|         xmlString.append(formatString(mStringsBundle.getStringEx("eraAbbr",mError),args,2,t));
 | ||
| 
 | ||
|         indentOffset.append("\t");
 | ||
| 		args[0] = indentOffset;
 | ||
|         for(int i=0;eras.hasNext();i++){
 | ||
|             char c[10]={0};
 | ||
| 			itoa(i+1,c,10);
 | ||
| 			args[1] = UnicodeString(c);
 | ||
| 			args[2] = eras.getNextString(mError);
 | ||
| 			xmlString.append(formatString(mStringsBundle.getStringEx("era",mError),args,3,t));
 | ||
| 		}
 | ||
| 		chopIndent();
 | ||
| 		args[0] = indentOffset;
 | ||
| 		args[1] = UnicodeString(XML_END_SLASH);
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("eraAbbr",mError),args,2,t));
 | ||
| 
 | ||
|         chopIndent();
 | ||
| 		args[0] = indentOffset;
 | ||
| 		args[1] = UnicodeString(XML_END_SLASH);
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("eras",mError),args,2,t));
 | ||
| 		mError=U_ZERO_ERROR;
 | ||
| 		return;
 | ||
| 	}
 | ||
| 	xmlString.remove();
 | ||
| 	mError =U_ZERO_ERROR;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| void GenerateXML::writeAMPMmarkers( ResourceBundle& calendar, UnicodeString& xmlString){
 | ||
| 	ResourceBundle markers = calendar.get("AmPmMarkers",mError);
 | ||
| 	UnicodeString t;
 | ||
| 	if( mError!=U_USING_DEFAULT_WARNING && 
 | ||
| 		mError!=U_USING_FALLBACK_WARNING && 
 | ||
|         U_SUCCESS(mError)){
 | ||
| 		Formattable args[] = {indentOffset,markers.getStringEx((int32_t)0,mError)};
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("am",mError),args ,3,t));
 | ||
| 		args[1] = markers.getStringEx((int32_t)1,mError);
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("pm",mError),args ,3,t));
 | ||
| 		mError= U_ZERO_ERROR;
 | ||
| 		return;
 | ||
| 	}
 | ||
| 	xmlString.remove();
 | ||
| 	mError= U_ZERO_ERROR;
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeFormat(const char* elemName, const char* style, const char* start, const char* end, const char* typeName,UnicodeString& pattern,
 | ||
| 						      UnicodeString& xmlString, UBool split){
 | ||
| 
 | ||
|     if( mError!=U_USING_DEFAULT_WARNING && 
 | ||
| 		mError!=U_USING_FALLBACK_WARNING && 
 | ||
|         U_SUCCESS(mError)){
 | ||
|         UnicodeString t;
 | ||
|         Formattable args[] = {indentOffset,"",""};
 | ||
|         xmlString.append(formatString(mStringsBundle.getStringEx(elemName,mError),args ,3,t));
 | ||
|         indentOffset.append("\t");
 | ||
|         writeFormat(style, start, end, NULL, pattern, xmlString, split);
 | ||
|         chopIndent();
 | ||
| 
 | ||
|         args[1]=UnicodeString(XML_END_SLASH);
 | ||
|         xmlString.append(formatString(mStringsBundle.getStringEx( elemName,mError),args,3,t));
 | ||
| 		mError= U_ZERO_ERROR;
 | ||
| 		return;
 | ||
|      }
 | ||
| 	 xmlString.remove();
 | ||
| 	 mError= U_ZERO_ERROR;
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| }
 | ||
| void GenerateXML::writeFormat(const char* style, const char* start, const char* end, const char* typeName,UnicodeString& pattern,
 | ||
| 						      UnicodeString& xmlString, UBool split){
 | ||
| 	UnicodeString t;
 | ||
|     UnicodeString type;
 | ||
| 
 | ||
|     if(typeName!=NULL){
 | ||
|         type.append("type=\"");
 | ||
|         type.append(typeName);
 | ||
|         type.append("\"");
 | ||
|     }
 | ||
| 	if(!split){
 | ||
| 
 | ||
| 		Formattable args[4]={indentOffset,"",type,""};
 | ||
|         if(*style!=0){
 | ||
|             xmlString.append(formatString(mStringsBundle.getStringEx(style,mError),args,3,t));
 | ||
| 
 | ||
| 
 | ||
| 	        indentOffset.append("\t");
 | ||
| 		    args[0]= indentOffset;
 | ||
|         }else{
 | ||
|             args[1] = type;
 | ||
|         }
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx(start,mError),args,2,t));
 | ||
| 		
 | ||
| 		indentOffset.append("\t");
 | ||
| 		args[0]=indentOffset;
 | ||
| 		args[1]=pattern;
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("pattern",mError),args,2,t));
 | ||
| 		
 | ||
| 
 | ||
| 		chopIndent();
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx(end, mError), indentOffset,t));
 | ||
|         
 | ||
|         if(*style!=0){
 | ||
|             chopIndent();
 | ||
|             args[0]=indentOffset;
 | ||
|             args[1]=UnicodeString(XML_END_SLASH);
 | ||
|             args[2]="";
 | ||
|             xmlString.append(formatString(mStringsBundle.getStringEx(style,mError),args,3,t));
 | ||
|         }
 | ||
| 
 | ||
| 	}else{
 | ||
| 		Formattable args[4]={indentOffset,"",type,""};
 | ||
|         if(*style!=0){
 | ||
|             xmlString.append(formatString(mStringsBundle.getStringEx(style,mError),args,3,t));
 | ||
| 
 | ||
| 	        indentOffset.append("\t");
 | ||
| 		    args[0]= indentOffset;
 | ||
|         }else{
 | ||
|             args[1]=type;
 | ||
|         }
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx(start,mError),args,2,t));
 | ||
| 		UnicodeString positive;
 | ||
| 		UnicodeString negative;
 | ||
| 		pattern.extractBetween(0,pattern.indexOf(";"),positive);
 | ||
| 		pattern.extractBetween(pattern.indexOf(";")+1,pattern.length(),negative);
 | ||
| 		indentOffset.append("\t");
 | ||
| 		args[0]=indentOffset;
 | ||
| 		if(!positive.isEmpty()){
 | ||
| 			args[1]=positive;
 | ||
| 			xmlString.append(formatString(mStringsBundle.getStringEx("pattern",mError),args,2,t));
 | ||
| 		}
 | ||
| 		if(!negative.isEmpty()){
 | ||
| 			args[1]=negative;
 | ||
| 			xmlString.append(formatString(mStringsBundle.getStringEx("pattern",mError),args,2,t));		
 | ||
| 		}
 | ||
| 		chopIndent();
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx(end, mError), indentOffset,t));
 | ||
|         
 | ||
|         if(*style!=0){
 | ||
|             chopIndent();
 | ||
|             args[0]=indentOffset;
 | ||
|             args[1]=UnicodeString(XML_END_SLASH);
 | ||
|             args[2]="";
 | ||
|             xmlString.append(formatString(mStringsBundle.getStringEx(style,mError),args,3,t));
 | ||
|         }
 | ||
| 
 | ||
|     }
 | ||
| 	
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeDateFormat(ResourceBundle& calendar, UnicodeString& xmlString){
 | ||
| 
 | ||
| 	ResourceBundle dtPatterns = calendar.get("DateTimePatterns", mError);
 | ||
| 	UnicodeString t;
 | ||
| 	if( mError!=U_USING_DEFAULT_WARNING && 
 | ||
| 		mError!=U_USING_FALLBACK_WARNING && 
 | ||
|         U_SUCCESS(mError)){
 | ||
| 		
 | ||
| 		// hard code default to medium pattern for ICU
 | ||
| 		Formattable args[4]= {indentOffset,"","",""};
 | ||
| 
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("dateFormats",mError),args,2,t));
 | ||
| 
 | ||
| 		indentOffset.append("\t");
 | ||
| 		args[0]= indentOffset;
 | ||
| 		args[1] = "medium";
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx( "default",mError),args,2,t));
 | ||
| 		
 | ||
| 		UnicodeString tempStr;
 | ||
| 		
 | ||
| 		writeFormat("dateFormatLength","dateFormatStart","dateFormatEnd","full",dtPatterns.getStringEx((int32_t)4,mError),xmlString);
 | ||
| 		writeFormat("dateFormatLength","dateFormatStart","dateFormatEnd","long",dtPatterns.getStringEx((int32_t)5,mError),xmlString);
 | ||
| 		writeFormat("dateFormatLength","dateFormatStart","dateFormatEnd","medium",dtPatterns.getStringEx((int32_t)6,mError),xmlString);
 | ||
| 		writeFormat("dateFormatLength","dateFormatStart","dateFormatEnd","short",dtPatterns.getStringEx((int32_t)7,mError),xmlString);
 | ||
| 
 | ||
| 		chopIndent();
 | ||
| 
 | ||
| 		args[0]=indentOffset;
 | ||
| 		args[1]=UnicodeString(XML_END_SLASH);
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("dateFormats",mError),args,2,t));
 | ||
| 
 | ||
|   	}
 | ||
| 
 | ||
| 	mError= U_ZERO_ERROR;
 | ||
| //	if(!print) xmlString.remove();	
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| void GenerateXML::writeTimeFormat(ResourceBundle& calendar, UnicodeString& xmlString){
 | ||
| 	ResourceBundle dtPatterns = calendar.get("DateTimePatterns", mError);
 | ||
| 	UnicodeString t;
 | ||
| 	if( mError!=U_USING_DEFAULT_WARNING && 
 | ||
| 		mError!=U_USING_FALLBACK_WARNING && 
 | ||
|         U_SUCCESS(mError)){
 | ||
| 		// hard code default to medium pattern for ICU
 | ||
| 		Formattable args[4]= {indentOffset,"","",""};
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("timeFormats",mError),args,2,t));
 | ||
| 		
 | ||
| 		indentOffset.append("\t");
 | ||
| 		args[0]= indentOffset;
 | ||
| 		args[1]="medium";
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx( "default",mError),args,2,t));
 | ||
| 		
 | ||
| 		UnicodeString tempStr;
 | ||
| 		
 | ||
| 		writeFormat("timeFormatLength","timeFormatStart","timeFormatEnd","full",dtPatterns.getStringEx((int32_t)0,mError),xmlString);
 | ||
| 		writeFormat("timeFormatLength","timeFormatStart","timeFormatEnd","long",dtPatterns.getStringEx((int32_t)1,mError),xmlString);
 | ||
| 		writeFormat("timeFormatLength","timeFormatStart","timeFormatEnd","medium",dtPatterns.getStringEx((int32_t)2,mError),xmlString);
 | ||
| 		writeFormat("timeFormatLength","timeFormatStart","timeFormatEnd","short",dtPatterns.getStringEx((int32_t)3,mError),xmlString);
 | ||
| 
 | ||
| 		chopIndent();
 | ||
| 
 | ||
| 		args[0]=indentOffset;
 | ||
| 		args[1]=UnicodeString(XML_END_SLASH);
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("timeFormats",mError),args,2,t));
 | ||
| 
 | ||
| 	}
 | ||
| 
 | ||
| 	mError= U_ZERO_ERROR;
 | ||
| 
 | ||
| //	if(!print) xmlString.remove();	
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeDateTimeFormat(ResourceBundle& calendar, UnicodeString& xmlString){
 | ||
| 	ResourceBundle dtPatterns = calendar.get("DateTimePatterns", mError);
 | ||
|     UnicodeString t;
 | ||
| 	if( mError!=U_USING_DEFAULT_WARNING && 
 | ||
| 		mError!=U_USING_FALLBACK_WARNING && 
 | ||
|         U_SUCCESS(mError)){
 | ||
| 		
 | ||
| 		Formattable args[4]= {indentOffset,"","",""};
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("dateTimeFormats",mError),args,2,t));
 | ||
| 		
 | ||
| 		indentOffset.append("\t");
 | ||
| 		args[0]= indentOffset;
 | ||
| 		
 | ||
| 		UnicodeString tempStr;
 | ||
| 		
 | ||
| 		writeFormat("dateTimeFormatLength","dateTimeFormatStart","dateTimeFormatEnd",NULL,dtPatterns.getStringEx((int32_t)8,mError),xmlString);
 | ||
| 
 | ||
|         chopIndent();
 | ||
| 
 | ||
| 		args[0]=indentOffset;
 | ||
| 		args[1]=UnicodeString(XML_END_SLASH);
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("dateTimeFormats",mError),args,2,t));
 | ||
| 
 | ||
| 	}
 | ||
| 
 | ||
| 	mError= U_ZERO_ERROR;
 | ||
| 
 | ||
| //	if(!print) xmlString.remove();	
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeLocalePatternChars(UnicodeString& xmlString){
 | ||
| 
 | ||
| 	UnicodeString temp=mSourceBundle.getStringEx("localPatternChars",mError);
 | ||
| 	Formattable args[]={indentOffset,""};
 | ||
| 	UnicodeString t;
 | ||
| 	if(U_SUCCESS(mError) && mError!=U_USING_DEFAULT_WARNING && mError!=U_USING_FALLBACK_WARNING){
 | ||
| 		args[1] = temp;
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx( "localizedChars",mError),args,2,t));
 | ||
| 		mError = U_ZERO_ERROR;
 | ||
| 		return;
 | ||
| 	}
 | ||
| 	xmlString.remove();
 | ||
| 	mError = U_ZERO_ERROR;
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeNumberFormat(){
 | ||
| 
 | ||
| 	UnicodeString xmlString, tempStr;
 | ||
| 	Formattable args[2]={indentOffset,""};
 | ||
| 	UnicodeString t;
 | ||
| 	xmlString.append(formatString(mStringsBundle.getStringEx( "numbers",mError),args,2,t));
 | ||
| 	indentOffset.append("\t");
 | ||
| 	UBool print = FALSE;
 | ||
| 	
 | ||
| 	writeNumberElements(tempStr);
 | ||
| 	if(!tempStr.isEmpty()){
 | ||
| 		xmlString.append(tempStr);
 | ||
| 		print = TRUE;
 | ||
| 	}
 | ||
| 
 | ||
| 	tempStr.remove();
 | ||
| 	writeNumberPatterns(tempStr);
 | ||
| 	if(!tempStr.isEmpty()){
 | ||
| 		xmlString.append(tempStr);
 | ||
| 		print = TRUE;
 | ||
| 	}
 | ||
| 
 | ||
| 	tempStr.remove();
 | ||
| 	writeCurrencies(tempStr);
 | ||
| 	if(!tempStr.isEmpty()){
 | ||
| 		xmlString.append(tempStr);
 | ||
| 		print = TRUE;
 | ||
| 	}
 | ||
| 	
 | ||
| 	chopIndent();
 | ||
| 	args[1]=UnicodeString(XML_END_SLASH);
 | ||
| 	xmlString.append(formatString(mStringsBundle.getStringEx( "numbers",mError),args,2,t));
 | ||
| 	if(print) printString(&xmlString);
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeNumberElements(UnicodeString& xmlString){
 | ||
| 
 | ||
| 	DecimalFormatSymbols mySymbols(mLocale,mError);
 | ||
| 	UnicodeString symbol;
 | ||
| 	mError = U_ZERO_ERROR;
 | ||
| 	ResourceBundle numFormats = mSourceBundle.get("NumberElements", mError);
 | ||
| 	UnicodeString t;
 | ||
| 	if( mError!=U_USING_DEFAULT_WARNING && 
 | ||
| 		mError != U_USING_FALLBACK_WARNING && 
 | ||
| 		U_SUCCESS(mError)){
 | ||
| 		
 | ||
| 		Formattable args[]={indentOffset,""};
 | ||
| 
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx( "symbols",mError),args,2,t));
 | ||
| 		
 | ||
| 		indentOffset.append("\t");
 | ||
|         
 | ||
| 		UnicodeString pattern= numFormats.getStringEx((int32_t)0,mError);
 | ||
| 		
 | ||
| 		args[0] = indentOffset;
 | ||
| 		args[1] = pattern;
 | ||
| 		
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx( "decimal",mError),args,2,t));
 | ||
| 		
 | ||
| 		args[1]=numFormats.getStringEx((int32_t)1,mError);
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx( "group",mError),args,2,t));
 | ||
| 		
 | ||
| 		args[1]=numFormats.getStringEx((int32_t)2,mError);
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx( "list",mError),args,2,t));
 | ||
| 		
 | ||
| 		args[1]=numFormats.getStringEx((int32_t)3,mError);
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx( "percentSign",mError),args,2,t));
 | ||
| 		
 | ||
| 		args[1]=numFormats.getStringEx((int32_t)4,mError);
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx( "negativeZero",mError),args,2,t));
 | ||
| 		
 | ||
| 		args[1]=numFormats.getStringEx((int32_t)5,mError);
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx( "patternDigit",mError),args,2,t));
 | ||
| 		
 | ||
| 		args[1]=numFormats.getStringEx((int32_t)11,mError);
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx( "plusSign",mError),args,2,t));
 | ||
|         if(mError == U_MISSING_RESOURCE_ERROR){
 | ||
|             mError = U_ZERO_ERROR;
 | ||
|         }
 | ||
| 		args[1]=numFormats.getStringEx((int32_t)6,mError);
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx( "minusSign",mError),args,2,t));
 | ||
| 		
 | ||
| 		args[1]=numFormats.getStringEx((int32_t)7,mError);
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx( "exponential",mError),args,2,t));
 | ||
| 		
 | ||
|         args[1]=numFormats.getStringEx((int32_t)8,mError);
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx( "perMille",mError),args,2,t));
 | ||
| 		
 | ||
| 		args[1]=numFormats.getStringEx((int32_t)9,mError);
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx( "infinity",mError),args,2,t));
 | ||
| 
 | ||
| 		args[1]=numFormats.getStringEx((int32_t)10,mError);
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx( "nan",mError),args,2,t));
 | ||
| 		chopIndent();
 | ||
| 		args[0] = indentOffset;
 | ||
| 		args[1] = UnicodeString(XML_END_SLASH);
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx( "symbols",mError),args,2,t));
 | ||
| 		return;
 | ||
| 
 | ||
| 	}
 | ||
| 	mError= U_ZERO_ERROR;
 | ||
| 	xmlString.remove();
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| void GenerateXML::writeNumberPatterns(UnicodeString& xmlString){
 | ||
| 
 | ||
| 	mError =U_ZERO_ERROR;
 | ||
| 	ResourceBundle dtPatterns = mSourceBundle.get("NumberPatterns", mError);
 | ||
| 	UnicodeString t;
 | ||
| 	if( mError!=U_USING_DEFAULT_WARNING && 
 | ||
| 		mError!=U_USING_FALLBACK_WARNING && 
 | ||
|         U_SUCCESS(mError)){
 | ||
| 
 | ||
| 		UnicodeString tempStr;
 | ||
| 		
 | ||
| 		writeFormat("decimalFormats","decimalFormatLength","decimalFormatStart","decimalFormatEnd",NULL,dtPatterns.getStringEx((int32_t)0,mError),xmlString,FALSE);
 | ||
| 		writeFormat("scientificFormats","scientificFormatLength","scientificFormatStart","scientificFormatEnd",NULL,dtPatterns.getStringEx((int32_t)3,mError),xmlString,FALSE);
 | ||
| 		writeFormat("percentFormats","percentFormatLength","percentFormatStart","percentFormatEnd",NULL,dtPatterns.getStringEx((int32_t)2,mError),xmlString,FALSE);
 | ||
| 		writeFormat("currencyFormats","currencyFormatLength","currencyFormatStart","currencyFormatEnd",NULL,dtPatterns.getStringEx((int32_t)1,mError),xmlString,FALSE);
 | ||
| 
 | ||
|         if(mError == U_MISSING_RESOURCE_ERROR){
 | ||
| 			mError = U_ZERO_ERROR;
 | ||
| 		}
 | ||
| 		
 | ||
| 	}
 | ||
| 
 | ||
| 	mError= U_ZERO_ERROR;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| void GenerateXML::writeCurrencies(UnicodeString& xmlString){
 | ||
| 
 | ||
| 	UnicodeString tempStr;
 | ||
| 	Formattable args[2] = { indentOffset,"" };
 | ||
| 	UnicodeString t;
 | ||
| 	xmlString.append(formatString(mStringsBundle.getStringEx("currencies",mError),args,2,t));
 | ||
| 	indentOffset.append("\t");
 | ||
| 	writeCurrency(tempStr);
 | ||
| 	if(!tempStr.isEmpty()){
 | ||
| 
 | ||
| 		xmlString.append(tempStr);
 | ||
| 		chopIndent();
 | ||
| 		args[0] = indentOffset;
 | ||
| 		args[1] = UnicodeString(XML_END_SLASH);
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("currencies",mError),args,2,t));
 | ||
| 		//printString(&xmlString);
 | ||
|         mError = U_ZERO_ERROR;
 | ||
|         return;
 | ||
| 	}
 | ||
| 
 | ||
| 	xmlString.remove();
 | ||
| 
 | ||
| 	chopIndent();
 | ||
| 	mError= U_ZERO_ERROR;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| void GenerateXML::writeCurrency(UnicodeString& xmlString){
 | ||
| 	
 | ||
| 	UBool isDefault =TRUE;
 | ||
| 	ResourceBundle currency =mSourceBundle.get("Currencies", mError);
 | ||
|     UnicodeString t;
 | ||
| 
 | ||
|     if( U_SUCCESS(mError)  && 
 | ||
|         mError != U_USING_FALLBACK_WARNING && 
 | ||
|         mError != U_USING_DEFAULT_WARNING){  
 | ||
|         
 | ||
|         while(currency.hasNext()){
 | ||
| 			ResourceBundle dBundle1 = currency.getNext(mError);
 | ||
|             const char* mykey=dBundle1.getKey();
 | ||
|             
 | ||
|             UnicodeString symbol = dBundle1.getStringEx((int32_t)0, mError);
 | ||
|             UnicodeString displayName = dBundle1.getStringEx((int32_t)1, mError);
 | ||
| 		    Formattable args[] = {indentOffset,UnicodeString(mykey),""};
 | ||
|             
 | ||
| 		    //xmlString.append(formatString(mStringsBundle.getStringEx( "default",mError),args,2,t));
 | ||
| 		    xmlString.append(formatString(mStringsBundle.getStringEx("currencyStart",mError),args,3,t));
 | ||
| 
 | ||
| 		    indentOffset.append("\t");
 | ||
| 		    
 | ||
| 		    args[0] = indentOffset;
 | ||
| 		    args[1] = displayName;
 | ||
| 		    xmlString.append(formatString(mStringsBundle.getStringEx("displayName",mError),args,2,t));
 | ||
|             
 | ||
|             escape(symbol);
 | ||
|             args[1] = symbol;
 | ||
| 		    xmlString.append(formatString(mStringsBundle.getStringEx("symbol",mError),args,2,t));
 | ||
|             
 | ||
|             int32_t size = dBundle1.getSize();
 | ||
|             if(size>2){
 | ||
|                 ResourceBundle elements = dBundle1.get((int32_t)2, mError);
 | ||
|                 UnicodeString key = elements.getKey();
 | ||
|                 if(elements.getType()!= URES_ARRAY){
 | ||
|                     fprintf(stderr,"Did not get the expected type for Elements\n");
 | ||
|                     exit(-1);
 | ||
|                 }
 | ||
|                 if(U_SUCCESS(mError)){
 | ||
|                     UnicodeString pattern = elements.getStringEx((int32_t)0, mError);
 | ||
|                     UnicodeString decimalSep = elements.getStringEx((int32_t)1, mError);
 | ||
|                     UnicodeString groupSep = elements.getStringEx((int32_t)2, mError);
 | ||
|                     
 | ||
|                     args[1] = pattern;
 | ||
|                     xmlString.append(formatString(mStringsBundle.getStringEx("pattern",mError),args,2,t));
 | ||
| 
 | ||
|                     args[1] = decimalSep;
 | ||
|                     xmlString.append(formatString(mStringsBundle.getStringEx("decimal",mError),args,2,t));
 | ||
| 
 | ||
|                     args[1] = groupSep;
 | ||
|                     xmlString.append(formatString(mStringsBundle.getStringEx("group",mError),args,2,t));
 | ||
| 
 | ||
|                 }
 | ||
|             }
 | ||
|             chopIndent();
 | ||
|             args[0] = indentOffset;
 | ||
|             args[1] = "";
 | ||
|             xmlString.append(formatString(mStringsBundle.getStringEx("currencyEnd",mError),args,2,t));
 | ||
|            
 | ||
| 
 | ||
| 	    }
 | ||
| 		return;
 | ||
|     }
 | ||
| 
 | ||
| 	xmlString.remove();
 | ||
| 	mError=U_ZERO_ERROR;
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeSpecial(){
 | ||
|     if(ignoreSpecials == FALSE){
 | ||
| 	    UnicodeString xmlString, tempStr;
 | ||
| 	    Formattable args[]={indentOffset,mStringsBundle.getStringEx("xmlns_icu",mError),"",""};
 | ||
| 	    UnicodeString t;
 | ||
| 	    xmlString.append(formatString(mStringsBundle.getStringEx( "special",mError),args,4,t));
 | ||
| 	    indentOffset.append("\t");
 | ||
| 	    UBool print = FALSE;
 | ||
| 	    
 | ||
| 	    writeBoundary(tempStr);
 | ||
| 	    if(!tempStr.isEmpty()){
 | ||
| 		    xmlString.append(tempStr);
 | ||
| 		    print = TRUE;
 | ||
| 	    }
 | ||
| 	    tempStr.remove();
 | ||
| 	    writeRuleBasedNumberFormat(tempStr);
 | ||
| 	    if(!tempStr.isEmpty()){
 | ||
| 		    xmlString.append(tempStr);
 | ||
| 		    print = TRUE;
 | ||
| 	    }
 | ||
| 	    chopIndent();
 | ||
| 	    args[1]=UnicodeString(XML_END_SLASH);
 | ||
| 	    xmlString.append(formatString(mStringsBundle.getStringEx( "specialEnd",mError),args,2,t));
 | ||
| 	    if(print) printString(&xmlString);
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeRuleBasedNumberFormat(UnicodeString& xmlString){
 | ||
|     if(ignoreSpecials == FALSE){
 | ||
| 	    UnicodeString tempStr;
 | ||
| 	    Formattable args[] = {indentOffset,"","",""};
 | ||
| 	    UBool print = FALSE;
 | ||
| 	    UnicodeString t;
 | ||
| 
 | ||
|         xmlString.append(formatString(mStringsBundle.getStringEx("ruleBasedNFS",mError),args,2,t));
 | ||
| 	    indentOffset.append("\t");
 | ||
| 
 | ||
| 	    UnicodeString spellout = mSourceBundle.getStringEx("SpelloutRules",mError);
 | ||
| 	    if( mError != U_USING_DEFAULT_WARNING && 
 | ||
| 		    U_SUCCESS(mError) &&
 | ||
| 		    mError != U_USING_FALLBACK_WARNING){
 | ||
| 		    escape(spellout);
 | ||
| 		    args[0] = indentOffset;
 | ||
| 		    args[1] = "spellout";
 | ||
| 		    args[2] = spellout;
 | ||
|             args[3] = indentOffset;
 | ||
| 		    tempStr.append(formatString(mStringsBundle.getStringEx("ruleBasedNF",mError),args,4,t));
 | ||
| 
 | ||
| 	    }
 | ||
| 
 | ||
| 	    mError=U_ZERO_ERROR;
 | ||
| 	    UnicodeString ordinal = mSourceBundle.getStringEx("OrdinalRules", mError);
 | ||
| 	    if( mError != U_USING_DEFAULT_WARNING && 
 | ||
| 		    U_SUCCESS(mError) &&
 | ||
| 		    mError != U_USING_FALLBACK_WARNING){
 | ||
| 		    escape(ordinal);
 | ||
| 		    args[0] = indentOffset;
 | ||
| 		    args[1] = "ordinal";
 | ||
| 		    args[2] = ordinal;
 | ||
|             args[3] = indentOffset;
 | ||
| 		    tempStr.append(formatString(mStringsBundle.getStringEx("ruleBasedNF",mError),args,4,t));
 | ||
| 	    }
 | ||
| 
 | ||
| 	    mError=U_ZERO_ERROR;
 | ||
| 	    UnicodeString duration = mSourceBundle.getStringEx("DurationRules", mError);
 | ||
| 	    if( mError != U_USING_DEFAULT_WARNING && 
 | ||
| 		    U_SUCCESS(mError) &&
 | ||
| 		    mError != U_USING_FALLBACK_WARNING){
 | ||
| 		    escape(duration);
 | ||
| 		    args[0] = indentOffset;
 | ||
| 		    args[1] = "duration";
 | ||
| 		    args[2] = duration;
 | ||
|             args[3] = indentOffset;
 | ||
| 		    tempStr.append(formatString(mStringsBundle.getStringEx("ruleBasedNF",mError),args,4,t));
 | ||
| 	    }
 | ||
| 	    if(tempStr.isEmpty()){
 | ||
| 		    xmlString.remove();
 | ||
| 	    }else{
 | ||
| 		    chopIndent();
 | ||
| 		    xmlString.append(tempStr);
 | ||
| 		    args[0] = indentOffset;
 | ||
| 		    args[1] = UnicodeString(XML_END_SLASH);
 | ||
| 	        xmlString.append(formatString(mStringsBundle.getStringEx("ruleBasedNFS",mError),args,2,t));
 | ||
| 	    }
 | ||
| 	    mError= U_ZERO_ERROR;
 | ||
|     }
 | ||
| }
 | ||
| /*
 | ||
| void GenerateXML::writeTransliteration(){
 | ||
| 	UnicodeString xmlString;
 | ||
| 	const UnicodeString translit= mSourceBundle.getStringEx("TransliteratorNamePattern",mError);
 | ||
| 	if(mError != U_USING_DEFAULT_WARNING && mError!=U_USING_FALLBACK_WARNING && U_SUCCESS(mError)){
 | ||
| 		Formattable args[] = {indentOffset,translit};
 | ||
| 		xmlString.append(formatString(UnicodeString(TL_NAME),args,2));
 | ||
| 		printString(&xmlString);
 | ||
| 	}
 | ||
| 	mError=U_ZERO_ERROR;
 | ||
| }
 | ||
| */
 | ||
| void GenerateXML::writeCharBrkRules(UnicodeString& xmlString){
 | ||
| 
 | ||
|     ResourceBundle brkRules = mSourceBundle.get("CharacterBreakRules",mError);
 | ||
| 	UnicodeString t;
 | ||
| 	if( mError != U_USING_DEFAULT_WARNING && 
 | ||
| 		mError != U_USING_FALLBACK_WARNING && 
 | ||
| 		U_SUCCESS(mError)){
 | ||
| 		
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("graphemeStart",mError),indentOffset,t));
 | ||
| 		indentOffset.append("\t");
 | ||
|         while(brkRules.hasNext()){
 | ||
| 			UnicodeString rule =brkRules.getNextString(mError);
 | ||
| 			escape(rule);
 | ||
| 			xmlString.append("\n");
 | ||
| 			xmlString.append(indentOffset);
 | ||
| 			xmlString.append(rule);
 | ||
| 		}
 | ||
| 		xmlString.append("\n\n");
 | ||
| 		chopIndent();
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("graphemeEnd",mError),indentOffset,t));
 | ||
| 		return;
 | ||
| 	}
 | ||
| 	xmlString.remove();
 | ||
| 	mError= U_ZERO_ERROR;
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeSentBrkRules(UnicodeString& xmlString){
 | ||
| 
 | ||
| 	ResourceBundle brkRules = mSourceBundle.get("SentenceBreakRules",mError);
 | ||
| 	UnicodeString t;
 | ||
| 	xmlString.append(formatString(mStringsBundle.getStringEx("sentenceStart",mError),indentOffset,t));
 | ||
| 	if( mError != U_USING_DEFAULT_WARNING && 
 | ||
| 		mError != U_USING_FALLBACK_WARNING && 
 | ||
| 		U_SUCCESS(mError)){
 | ||
| 		indentOffset.append("\t");
 | ||
|         while(brkRules.hasNext()){
 | ||
| 			UnicodeString rule =brkRules.getNextString(mError);
 | ||
| 			escape(rule);
 | ||
| 			xmlString.append("\n");
 | ||
| 			xmlString.append(indentOffset);
 | ||
| 			xmlString.append(rule);
 | ||
| 		}
 | ||
| 		xmlString.append("\n\n");
 | ||
| 		chopIndent();
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("graphemeEnd",mError),indentOffset,t));
 | ||
| 		return;
 | ||
| 	}
 | ||
| 	xmlString.remove();
 | ||
| 	mError= U_ZERO_ERROR;
 | ||
| 
 | ||
| }
 | ||
| void GenerateXML::writeLineBrkRules(UnicodeString& xmlString){
 | ||
| 
 | ||
| 	ResourceBundle brkRules = mSourceBundle.get("LineBreakRules",mError);
 | ||
| 	UnicodeString t;
 | ||
| 	xmlString.append(formatString(mStringsBundle.getStringEx("lineStart",mError),indentOffset,t));
 | ||
| 
 | ||
| 	if( mError != U_USING_DEFAULT_WARNING && 
 | ||
| 		mError != U_USING_FALLBACK_WARNING && 
 | ||
| 		U_SUCCESS(mError)){
 | ||
| 	   indentOffset.append("\t");
 | ||
|        while(brkRules.hasNext()){
 | ||
| 			UnicodeString rule =brkRules.getNextString(mError);
 | ||
| 			escape(rule);
 | ||
| 			xmlString.append("\n");
 | ||
| 			xmlString.append(indentOffset);
 | ||
| 			xmlString.append(rule);
 | ||
| 		}
 | ||
| 		xmlString.append("\n\n");
 | ||
| 		chopIndent();
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("lineEnd",mError),indentOffset,t));
 | ||
| 		return;
 | ||
| 	}
 | ||
| 	xmlString.remove();
 | ||
| 	mError= U_ZERO_ERROR;
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeBoundary(UnicodeString& xmlString){
 | ||
| 	UnicodeString tempStr;
 | ||
| 	UBool print=FALSE;
 | ||
| 	Formattable args[3] = { indentOffset,"",""};
 | ||
| 	UnicodeString t;
 | ||
| 	xmlString.append(formatString(mStringsBundle.getStringEx("boundaries",mError),args,2,t));
 | ||
| 	indentOffset.append("\t");
 | ||
| 	
 | ||
| 	writeCharBrkRules(tempStr);
 | ||
| 	if(!tempStr.isEmpty()){
 | ||
| 		xmlString.append(tempStr);
 | ||
| 		print = TRUE;
 | ||
| 	}
 | ||
| 	tempStr.remove();
 | ||
| 	writeSentBrkRules(tempStr);
 | ||
| 	if(!tempStr.isEmpty()){
 | ||
| 		xmlString.append(tempStr);
 | ||
| 		print = TRUE;
 | ||
| 	}
 | ||
| 	tempStr.remove();
 | ||
| 	writeLineBrkRules(tempStr);
 | ||
| 	if(!tempStr.isEmpty()){
 | ||
| 		xmlString.append(tempStr);
 | ||
| 		print = TRUE;
 | ||
| 	}
 | ||
| 	tempStr.remove();
 | ||
| 	chopIndent();
 | ||
| 	xmlString.append(formatString(mStringsBundle.getStringEx("boundaries",mError),args,2,t));
 | ||
| 
 | ||
| 	if(!print) xmlString.remove();
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| void GenerateXML::writeCollations(){
 | ||
| 	UnicodeString tempStr,xmlString;
 | ||
| 	UBool print=FALSE;
 | ||
| 	Formattable args[3] = { indentOffset,""};
 | ||
| 	UnicodeString t;
 | ||
| 	xmlString.append(formatString(mStringsBundle.getStringEx("collations",mError),args,2,t));
 | ||
| 	indentOffset.append("\t");
 | ||
| 	  
 | ||
|     ResourceBundle dBundle = mSourceBundle.get("collations", mError);
 | ||
| 
 | ||
|     if(U_SUCCESS(mError)){
 | ||
| 
 | ||
|         while(dBundle.hasNext()){
 | ||
|             writeCollation(dBundle.getNext(mError), tempStr);
 | ||
|             if(tempStr.length()!=0){
 | ||
|                 xmlString.append(tempStr);
 | ||
|                 print =TRUE;
 | ||
|             }
 | ||
|             tempStr.remove();
 | ||
|         }
 | ||
| 
 | ||
|     }
 | ||
|     
 | ||
| 	/*writeSentBrkRules(tempStr);
 | ||
| 	if(!tempStr.isEmpty()){
 | ||
| 		xmlString.append(tempStr);
 | ||
| 		print = TRUE;
 | ||
| 	}
 | ||
| 	tempStr.remove();
 | ||
| 	writeLineBrkRules(tempStr);
 | ||
| 	if(!tempStr.isEmpty()){
 | ||
| 		xmlString.append(tempStr);
 | ||
| 		print = TRUE;
 | ||
| 	}*/
 | ||
| 	chopIndent();
 | ||
| 
 | ||
|     args[1]=UnicodeString(XML_END_SLASH);
 | ||
| 	args[2]="";
 | ||
|     xmlString.append(formatString(mStringsBundle.getStringEx("collations",mError),args,3,t));
 | ||
| 	
 | ||
| 	if(print)  printString(&xmlString);
 | ||
|     mError =U_ZERO_ERROR;
 | ||
| 	
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeBase(UnicodeString& xmlString){
 | ||
|     if(baseCollation != NULL){
 | ||
|         Formattable args[] = {indentOffset, "", ""};
 | ||
|         UnicodeString temp;
 | ||
|         xmlString.append(formatString(mStringsBundle.getStringEx("baseStart", mError), args, 1, temp));
 | ||
|         indentOffset.append("\t");
 | ||
|         
 | ||
|         args[0] = indentOffset;
 | ||
|         args[1] = baseCollation;
 | ||
|         args[2] = (baseType==NULL) ? "standard" : baseType;
 | ||
|         xmlString.append(formatString(mStringsBundle.getStringEx("alias", mError), args, 3, temp));
 | ||
| 
 | ||
|         chopIndent();
 | ||
| 
 | ||
|         args[0] = indentOffset;
 | ||
|         xmlString.append(formatString(mStringsBundle.getStringEx("baseEnd", mError), args, 1, temp));
 | ||
|     }
 | ||
| 
 | ||
|     if(U_FAILURE(mError)){
 | ||
|         mError = U_ZERO_ERROR;
 | ||
|         xmlString.remove();
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeUCARules(UnicodeString& sequence,UnicodeString& xmlString){
 | ||
| 
 | ||
|     UnicodeString rules;
 | ||
|     const char* key = "UCA";
 | ||
| 
 | ||
|     UnicodeString t;
 | ||
|     if( mError!=U_USING_DEFAULT_WARNING && 
 | ||
| 		U_SUCCESS(mError) && 
 | ||
| 		mError!=U_USING_FALLBACK_WARNING){
 | ||
|         Formattable args[]={indentOffset,"","","",""};
 | ||
| 
 | ||
| 		UnicodeString str = "type=\"";
 | ||
| 		str.append(key);
 | ||
| 		str.append("\"");
 | ||
| 		args[2] = str;
 | ||
| 
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("collation",mError),args,3,t));
 | ||
| 
 | ||
| 		indentOffset.append("\t");
 | ||
|         
 | ||
|         // wirte the base element
 | ||
|         writeBase(t.remove());
 | ||
|         if(t.length() != 0){
 | ||
|             xmlString.append(t);
 | ||
|         }
 | ||
|         
 | ||
| 		rules = parseRules((UChar*)sequence.getBuffer(),sequence.length(),rules);
 | ||
| 		xmlString.append(rules);
 | ||
|         sequence.releaseBuffer();
 | ||
| 		
 | ||
|         chopIndent();
 | ||
| 		args[0] = indentOffset;
 | ||
| 		args[1] = "/";
 | ||
| 		args[2] ="";
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("collation",mError),args,3,t));
 | ||
|         //printString(&xmlString);
 | ||
|     }
 | ||
|     mError = U_ZERO_ERROR;
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeCollation(ResourceBundle& bundle,UnicodeString& xmlString, UnicodeString* collKey){
 | ||
| 
 | ||
|     UnicodeString version;
 | ||
|     UnicodeString overide="FALSE";
 | ||
|     UnicodeString sequence;
 | ||
|     UnicodeString rules;
 | ||
|     const char* key = bundle.getKey();
 | ||
|     UnicodeString t;
 | ||
|     if(stricmp(key, "default") == 0) {
 | ||
|         Formattable args[]={indentOffset,"","","",""};
 | ||
|                sequence = bundle.getString(mError);
 | ||
|                args[0] = indentOffset;
 | ||
|                args[1] = sequence;
 | ||
|                xmlString.append(formatString(mStringsBundle.getStringEx("default",mError),args,2,t));
 | ||
|     }else {
 | ||
|         if( mError!=U_USING_DEFAULT_WARNING && 
 | ||
| 		    U_SUCCESS(mError) && 
 | ||
| 		    mError!=U_USING_FALLBACK_WARNING){
 | ||
|             Formattable args[]={indentOffset,"","","",""};
 | ||
| 
 | ||
| 		    UnicodeString str = "type=\"";
 | ||
| 		    str.append(key);
 | ||
| 		    str.append("\"");
 | ||
| 		    args[2] = str;
 | ||
| 
 | ||
| 		    xmlString.append(formatString(mStringsBundle.getStringEx("collation",mError),args,3,t));
 | ||
| 
 | ||
| 		    indentOffset.append("\t");
 | ||
|             
 | ||
|             // wirte the base element
 | ||
|             writeBase(t.remove());
 | ||
|             if(t.length() != 0){
 | ||
|                 xmlString.append(t);
 | ||
|             }
 | ||
| 
 | ||
| 		    while(bundle.hasNext()){
 | ||
|                 ResourceBundle dBundle1 = bundle.getNext(mError);
 | ||
|                 const char* mykey=dBundle1.getKey();
 | ||
|                 if(stricmp(mykey,"Version")==0 && ignoreSpecials==FALSE){
 | ||
|                     version = bundle.getStringEx(mykey,mError);
 | ||
| 			        UnicodeString temp = UnicodeString("icu:version=\"").append(version);
 | ||
| 			        temp.append("\"");
 | ||
| 			        args[0] = indentOffset;
 | ||
|                     args[1] = mStringsBundle.getStringEx("xmlns_icu",mError);
 | ||
| 			        args[2] = temp;
 | ||
| 			        args[3] = UnicodeString(XML_END_SLASH);
 | ||
| 			        xmlString.append(formatString(mStringsBundle.getStringEx("special",mError),args,4,t));
 | ||
|                 }else if(stricmp(mykey,"Sequence")==0 && onlySpecials==FALSE){
 | ||
|                     sequence = bundle.getStringEx(mykey,mError);
 | ||
| 				    rules = parseRules((UChar*)sequence.getBuffer(),sequence.length(),rules);
 | ||
| 				    xmlString.append(rules);
 | ||
|                     sequence.releaseBuffer();
 | ||
| 
 | ||
|                 }else if(stricmp(mykey,"Override")==0 && onlySpecials==FALSE){
 | ||
|                         overide =  bundle.getStringEx(mykey,mError);
 | ||
|                 }
 | ||
|             }
 | ||
|             
 | ||
|             chopIndent();
 | ||
| 		    args[0] = indentOffset;
 | ||
| 		    args[1] = "/";
 | ||
| 		    args[2] ="";
 | ||
| 		    xmlString.append(formatString(mStringsBundle.getStringEx("collation",mError),args,3,t));
 | ||
|             //printString(&xmlString);
 | ||
|         }
 | ||
|     }
 | ||
|     mError = U_ZERO_ERROR;
 | ||
| }
 | ||
| UnicodeString& appendHex(uint32_t number,
 | ||
|             int32_t digits,
 | ||
|             UnicodeString& target)
 | ||
| {
 | ||
|     static const UChar digitString[] = {
 | ||
|         0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
 | ||
|         0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0
 | ||
|     }; /* "0123456789ABCDEF" */
 | ||
| 
 | ||
|     switch (digits)
 | ||
|     {
 | ||
|     case 8:
 | ||
|         target += digitString[(number >> 28) & 0xF];
 | ||
|     case 7:
 | ||
|         target += digitString[(number >> 24) & 0xF];
 | ||
|     case 6:
 | ||
|         target += digitString[(number >> 20) & 0xF];
 | ||
|     case 5:
 | ||
|         target += digitString[(number >> 16) & 0xF];
 | ||
|     case 4:
 | ||
|         target += digitString[(number >> 12) & 0xF];
 | ||
|     case 3:
 | ||
|         target += digitString[(number >>  8) & 0xF];
 | ||
|     case 2:
 | ||
|         target += digitString[(number >>  4) & 0xF];
 | ||
|     case 1:
 | ||
|         target += digitString[(number >>  0) & 0xF];
 | ||
|         break;
 | ||
|     default:
 | ||
|         target += "**";
 | ||
|     }
 | ||
|     return target;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| // Replace nonprintable characters with unicode escapes
 | ||
| UnicodeString& prettify(const UnicodeString &source,UnicodeString &target)
 | ||
| {
 | ||
|     int32_t i;
 | ||
| 
 | ||
|     target.remove();
 | ||
|     target += "\"";
 | ||
| 
 | ||
|     for (i = 0; i < source.length(); )
 | ||
|     {
 | ||
|         UChar32 ch = source.char32At(i);
 | ||
|         i += UTF_CHAR_LENGTH(ch);
 | ||
| 
 | ||
|         if (ch < 0x09 || (ch > 0x0A && ch < 0x20)|| ch > 0x7E)
 | ||
|         {
 | ||
|             if (ch <= 0xFFFF) {
 | ||
|                 target += "\\u";
 | ||
|                 appendHex(ch, 4, target);
 | ||
|             } else {
 | ||
|                 target += "\\U";
 | ||
|                 appendHex(ch, 8, target);
 | ||
|             }
 | ||
|         }
 | ||
|         else
 | ||
|         {
 | ||
|             target += ch;
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     target += "\"";
 | ||
| 
 | ||
|     return target;
 | ||
| }
 | ||
| 
 | ||
| #define UCOL_TOK_UNSET    0xFFFFFFFF
 | ||
| #define UCOL_TOK_RESET    0xDEADBEEF
 | ||
| #define UCOL_TOK_SETTING  0xFFFFFFFE
 | ||
| #define UCOL_TOK_OVERRIDE 0xFFFFFFFD 
 | ||
| #define UCOL_TOK_DONE     0xFFFFFFFC
 | ||
| #define UCOL_TOK_EXPANSION_MARKER 0xFFFF
 | ||
| 
 | ||
| UBool 
 | ||
| uprv_isRuleWhiteSpace(UChar32 c) {
 | ||
|     /* "white space" in the sense of ICU rule parsers: Cf+White_Space */
 | ||
|     return
 | ||
|         u_charType(c)==U_FORMAT_CHAR ||
 | ||
|         u_hasBinaryProperty(c, UCHAR_WHITE_SPACE);
 | ||
| }
 | ||
| /*
 | ||
| strength  	    primary (1)         [strength 1] 	                strength = "primary" 
 | ||
|                 secondary (2)
 | ||
|                 tertiary (3)
 | ||
|                 quarternary (4)
 | ||
|                 identical (5) 	
 | ||
| 
 | ||
| alternate 	    non-ignorable       [alternate non-ignorable] 	    alternate = "non-ignorable"
 | ||
|                 shifted 
 | ||
|             
 | ||
| backwards 	    on                  [backwards on]   	            backwards = "on" 	
 | ||
|                 off 	
 | ||
| 
 | ||
| normalization 	on
 | ||
|                 off 	            [normalization on]  	        normalization = "off" 	
 | ||
| 
 | ||
| caseLevel 	    on                  [caseLevel on] 	                caseLevel = "off" 	
 | ||
|                 off 
 | ||
|                 
 | ||
| caseFirst 	    upper               [caseFirst off] 	            caseFirst = "off" 
 | ||
|                 lower
 | ||
|                 off 
 | ||
|                 
 | ||
| hiraganaQ 	    on                  [hiraganaQ on] 	                hiragana<6E>Quarternary = "on" 
 | ||
|                 off 	        	
 | ||
| 
 | ||
| numeric 	    on                  [numeric on] 	                numeric = "on"
 | ||
|                 off 	
 | ||
| */
 | ||
| 
 | ||
| void GenerateXML::writeSettings(UnicodeString& src , UnicodeString& xmlString){
 | ||
| 	const UChar* saveStart = src.getBuffer();
 | ||
|     const UChar* start = saveStart;
 | ||
| 	const UChar* limit = start + src.length(); 
 | ||
| 	int32_t valueLen=0,settingLen =0;
 | ||
| 	UBool isValue = FALSE;
 | ||
| 	UnicodeString t;
 | ||
|     int32_t index = 0;
 | ||
|     UnicodeString setting, value;
 | ||
|     Formattable args[] = {indentOffset, "", "" };
 | ||
|     while(index < src.length()){
 | ||
|         index = getSettingAndValue(src, index, setting, value);
 | ||
|         if(setting == "suppressContractions"){
 | ||
| 		    args[1] = value;
 | ||
| 			xmlString.append(formatString(mStringsBundle.getStringEx("suppressContractions",mError),args,2,t));			    
 | ||
|         }else if(setting =="optimize"){
 | ||
|             args[1] = value;
 | ||
|             xmlString.append(formatString(mStringsBundle.getStringEx("optimize",mError),args,2,t));
 | ||
|         }else{
 | ||
|             if(setting == "strength"){
 | ||
|                 UChar val = value.charAt(0);
 | ||
|                 value.remove();
 | ||
|                 switch (val){
 | ||
|                     case '1':
 | ||
|                         value.append("primary");
 | ||
|                         break;
 | ||
|                     case '2':
 | ||
|                         value.append("secondary");
 | ||
|                         break;
 | ||
|                     case '3':
 | ||
|                         value.append("tertiary");
 | ||
|                         break;
 | ||
|                     case '4':
 | ||
|                         value.append("quaternary");
 | ||
|                         break;
 | ||
|                     case '5':
 | ||
|                         value.append("identical");
 | ||
|                         break;
 | ||
|                     default:
 | ||
|                         mError = U_ILLEGAL_ARGUMENT_ERROR;
 | ||
|                         exit (mError);
 | ||
|                     }
 | ||
|             }else if(setting == "alternate"){
 | ||
|             }else if(setting == "backwards"){ 	
 | ||
|                 if(value == "2"){
 | ||
|                     value.remove();
 | ||
|                     value.append ("on");
 | ||
|                 }else{
 | ||
|                     fprintf(stderr, "Unrecognized value for setting backwards!.");
 | ||
|                     exit(-1);
 | ||
|                 }
 | ||
|             }else if(setting == "normalization"){ 
 | ||
|             }else if(setting == "caseLevel"){  	                          
 | ||
|             }else if(setting == "casefirst"){ 
 | ||
|                 setting = "caseFirst";
 | ||
|             }else if(setting == "hiraganaQ"){
 | ||
|                 setting = "hiraganaQuarternary";
 | ||
|             }else if(setting == "numeric"){  	  
 | ||
|             }else{
 | ||
|                 fprintf(stderr,"Could not recogize setting!!");
 | ||
|                 exit(-1);
 | ||
|             }
 | ||
|             mSettings.append(setting);
 | ||
|             mSettings.append("=\"");
 | ||
|             mSettings.append(value);
 | ||
|             mSettings.append("\" ");
 | ||
|         }
 | ||
|         setting.remove();
 | ||
|         value.remove();
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| int32_t GenerateXML::getSettingAndValue(UnicodeString& source, int32_t index, UnicodeString& setting, UnicodeString& value){
 | ||
|     const UChar* src = source.getBuffer();
 | ||
|     int32_t start = index;
 | ||
|     int32_t end = source.length();
 | ||
|     int32_t open=0;
 | ||
|     UBool startVal=FALSE, initialSpace = TRUE;
 | ||
|     /* [ setting value ]*/
 | ||
|     while(start < end){
 | ||
|         UChar ch = src[start++];
 | ||
|         switch(ch){
 | ||
|             case '[':
 | ||
|                 open++;
 | ||
|                 if(open > 1 && startVal==TRUE){
 | ||
|                     value.append(ch);
 | ||
|                 }
 | ||
|                 break;
 | ||
|             case ']':
 | ||
|                 if(open > 1 && startVal==TRUE){
 | ||
|                     value.append(ch);
 | ||
|                 }else if(open == 1){
 | ||
|                     goto OUTER;
 | ||
|                 }
 | ||
|                 open--;
 | ||
|                 
 | ||
|             case ' ':
 | ||
|                 if(initialSpace){
 | ||
|                     break;
 | ||
|                 }
 | ||
|                 startVal = TRUE;
 | ||
|                 break;
 | ||
|             default:
 | ||
|                 initialSpace = FALSE;
 | ||
|                 if(startVal == TRUE){
 | ||
|                     value.append(ch);
 | ||
|                 }else{
 | ||
|                     setting.append(ch);
 | ||
|                 }
 | ||
|         }
 | ||
|     }
 | ||
| OUTER:
 | ||
|     source.releaseBuffer();
 | ||
|     return start;
 | ||
| }
 | ||
| void GenerateXML::writeReset(UnicodeString& src, UnicodeString& xmlString){
 | ||
| 	const UChar* start = src.getBuffer();
 | ||
| 	const UChar* limit = start + src.length(); 
 | ||
| 	UChar setting[256];
 | ||
| 	UChar value[20];
 | ||
| 	UChar chars[20];
 | ||
| 	UnicodeString t;
 | ||
| 	char* target;
 | ||
| 	int32_t valueLen=0,settingLen =0, charsLen=0;
 | ||
| 	UBool isValue = FALSE, isChars=FALSE;
 | ||
| 	if(src.indexOf("top")>=0 || src.indexOf("last regular")>=0){
 | ||
| 		Formattable args[] = {indentOffset, mStringsBundle.getStringEx("lastNonIgnorable",mError)};
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("reset",mError),args,2,t));
 | ||
| 
 | ||
|     }else if(src.indexOf("first primary ignorable")>=0){
 | ||
| 		Formattable args[] = {indentOffset, mStringsBundle.getStringEx("firstPIgnorable",mError)};
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("reset",mError),args,2,t));
 | ||
|         
 | ||
|     }else if(src.indexOf("first secondary ignorable")>=0){
 | ||
| 		Formattable args[] = {indentOffset, mStringsBundle.getStringEx("firstSIgnorable",mError)};
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("reset",mError),args,2,t));
 | ||
|     
 | ||
|     }else if(src.indexOf("first tertiary ignorable")>=0){
 | ||
| 		Formattable args[] = {indentOffset, mStringsBundle.getStringEx("fristTIgnorable",mError)};
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("reset",mError),args,2,t));
 | ||
|         
 | ||
|     }else if(src.indexOf("last primary ignorable")>=0){
 | ||
| 		Formattable args[] = {indentOffset, mStringsBundle.getStringEx("lastPIgnorable",mError)};
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("reset",mError),args,2,t));
 | ||
|         
 | ||
|     }else if(src.indexOf("last secondary ignorable")>=0){
 | ||
| 		Formattable args[] = {indentOffset, mStringsBundle.getStringEx("lastSIgnorable",mError)};
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("reset",mError),args,2,t));
 | ||
|     
 | ||
|     }else if(src.indexOf("last tertiary ignorable")>=0){
 | ||
| 		Formattable args[] = {indentOffset, mStringsBundle.getStringEx("lastTIgnorable",mError)};
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("reset",mError),args,2,t));  
 | ||
|     }else if(src.indexOf("[")>=0 && src.length() > 1){
 | ||
| 		while(start < limit ){
 | ||
| 			UChar ch = *start++;
 | ||
| 			if(uprv_isRuleWhiteSpace(ch)){
 | ||
| 				if(settingLen>0){
 | ||
| 					isValue = TRUE;
 | ||
| 				}else if(valueLen>0){
 | ||
| 					isChars = TRUE;
 | ||
| 				}
 | ||
| 				continue; //skip white spaces
 | ||
| 			}else if(ch == 0x5b){ // skip '[' && ']'
 | ||
| 				continue;
 | ||
|             }else if( ch == 0x5d ){
 | ||
|                 isValue = FALSE;
 | ||
|                 isChars = TRUE;
 | ||
|                 continue;
 | ||
|             }
 | ||
| 			if(isValue){
 | ||
| 				value[valueLen++] = ch;
 | ||
| 			}else if(isChars){
 | ||
| 				chars[charsLen++] =ch;
 | ||
| 			}else{
 | ||
| 				setting[settingLen++] = ch;
 | ||
| 			}
 | ||
| 		}
 | ||
| 		switch(value[0]){
 | ||
| 		case 0x31:
 | ||
| 			target = "primary";
 | ||
| 			break;
 | ||
| 		case 0x32:
 | ||
| 			target = "secondary";
 | ||
| 			break;
 | ||
| 		case 0x33:
 | ||
| 			target = "tertiary";
 | ||
| 			break;
 | ||
| 		case 0x34:
 | ||
| 			target = "quaternary";
 | ||
| 			break;
 | ||
| 		default:
 | ||
| 			target = "unknown";
 | ||
| 			break;
 | ||
| 		}
 | ||
| 		Formattable args[] = {indentOffset, UnicodeString(setting,settingLen), UnicodeString(target), UnicodeString(chars,charsLen)};
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("resetWithValue",mError),args,4,t));
 | ||
| 	}else{
 | ||
| 		Formattable args[] = {indentOffset, src};
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("reset",mError),args,2,t));
 | ||
| 	}
 | ||
| }
 | ||
| UnicodeString GenerateXML::parseRules(UChar* rules, int32_t ruleLen, UnicodeString& xmlString){
 | ||
| 	Token src;
 | ||
| 	src.start = rules;
 | ||
| 	src.current = rules;
 | ||
| 	src.prevCurrent = rules;
 | ||
| 	src.end = rules+ruleLen;
 | ||
| 	src.chars=(UChar*) malloc((ruleLen + 10)* U_SIZEOF_UCHAR);
 | ||
| 	src.charsCapacity = ruleLen+10;
 | ||
| 	UnicodeString collStr ;
 | ||
| 	uint32_t prevStrength=UCOL_DEFAULT;
 | ||
| 	int32_t count = 0;
 | ||
| 	UBool appendedRules = FALSE;
 | ||
|     UnicodeString t;
 | ||
| 	UBool startOfRules = TRUE;
 | ||
|     UBool writtenSettings = FALSE;
 | ||
|     UBool isTempStrContraction =FALSE, isCollStrContraction = FALSE;
 | ||
| 
 | ||
| 	if(src.start != src.end){
 | ||
| 		for(;;){
 | ||
| 			  
 | ||
| 			  uint32_t strength = parseRules(&src,startOfRules);
 | ||
| 			  UnicodeString tempStr;
 | ||
| 			  startOfRules = FALSE;
 | ||
| 			  tempStr.append(src.chars,src.charsLen);
 | ||
|               if(U_FAILURE(mError)){
 | ||
|                   fprintf(stderr,"parseRules returned NULL for strength!. Error: %s", u_errorName(mError));
 | ||
|                   exit(1);
 | ||
|               }
 | ||
|             //  int32_t indexOfPipe = tempStr.indexOf((UChar)0x7c);
 | ||
| 
 | ||
|               if((prevStrength == strength) && (prevStrength == UCOL_TOK_DONE)){
 | ||
|                   if(mSettings.length()!=0 && writtenSettings == FALSE){
 | ||
|                       Formattable args[]={ indentOffset, mSettings} ;
 | ||
|                         xmlString.append(formatString(mStringsBundle.getStringEx("settings",mError),args,2,t));
 | ||
|                         writtenSettings = TRUE;
 | ||
|                         mSettings.truncate(0);
 | ||
|                   }
 | ||
|                   break;
 | ||
|               }
 | ||
| 
 | ||
| 
 | ||
|               /* verify that tempStr is a contraction */
 | ||
|               isTempStrContraction = tempStr.countChar32()>1;
 | ||
|               
 | ||
| 			  if((prevStrength != strength) || 
 | ||
|                   isTempStrContraction==TRUE/* contraction */ || 
 | ||
|                   isCollStrContraction==TRUE/* contraction */ ||
 | ||
|                   tempStr.indexOf((UChar)UCOL_TOK_EXPANSION_MARKER) >=0 || /* expansion */
 | ||
|                   collStr.indexOf((UChar)UCOL_TOK_EXPANSION_MARKER) >=0 ||/* expansion */
 | ||
|                   tempStr.indexOf((UChar)0x7c) >=0 || /*context */
 | ||
|                   collStr.indexOf((UChar)0x7c) >=0 /*context*/){
 | ||
| 
 | ||
| 					char* singleKey = NULL;
 | ||
| 					char* seqKey = NULL;
 | ||
| 					// assume that settings always preceed rule strings
 | ||
| 
 | ||
| 					Formattable args[] = {indentOffset,collStr,""};
 | ||
| 					if(prevStrength != UCOL_DEFAULT){
 | ||
| 						if(prevStrength == UCOL_TOK_SETTING){
 | ||
| 							writeSettings(collStr,xmlString);
 | ||
| 						}else if(prevStrength==UCOL_TOK_RESET){
 | ||
|                             if(writtenSettings == FALSE && mSettings.length() > 0){
 | ||
|                                 args[0] = indentOffset;
 | ||
|                                 args[1] = mSettings;
 | ||
|                                 xmlString.append(formatString(mStringsBundle.getStringEx("settings",mError),args,2,t));
 | ||
|                                 writtenSettings = TRUE;
 | ||
|                                 mSettings.truncate(0);
 | ||
|                             }
 | ||
| 							if(appendedRules == FALSE){
 | ||
| 								args[0] = indentOffset;
 | ||
| 								args[1] = "";
 | ||
| 								xmlString.append(formatString(mStringsBundle.getStringEx("rules",mError),args,2,t));
 | ||
| 								indentOffset.append("\t");
 | ||
| 								appendedRules = TRUE;
 | ||
| 							}
 | ||
|                             escape(collStr);
 | ||
| 							writeReset(collStr,xmlString);
 | ||
| 						}else if(prevStrength==UCOL_TOK_OVERRIDE){
 | ||
|                             UnicodeString temp("[backwards on]");
 | ||
|                             writeSettings(temp,xmlString);
 | ||
| 						}else{
 | ||
|                             if(writtenSettings == FALSE && mSettings.length() > 0){
 | ||
|                                 args[0] = indentOffset;
 | ||
|                                 args[1] = mSettings;
 | ||
|                                 xmlString.append(formatString(mStringsBundle.getStringEx("settings",mError),args,2,t));
 | ||
|                                 writtenSettings = TRUE;
 | ||
|                                 mSettings.truncate(0);
 | ||
|                             }
 | ||
| 							if(appendedRules == FALSE){
 | ||
| 								args[0] = indentOffset;
 | ||
| 								args[1] = "";
 | ||
| 								xmlString.append(formatString(mStringsBundle.getStringEx("rules",mError),args,2,t));
 | ||
| 								indentOffset.append("\t");
 | ||
| 								appendedRules = TRUE;
 | ||
| 							}
 | ||
|                             args[1] = collStr;
 | ||
| 							switch(prevStrength){
 | ||
| 							case UCOL_IDENTICAL:
 | ||
| 								singleKey = "identical";
 | ||
| 								seqKey = "identicalSeq";
 | ||
| 								break;
 | ||
| 							case UCOL_PRIMARY:
 | ||
| 								singleKey = "primary";
 | ||
| 								seqKey = "primarySeq";
 | ||
| 								break;
 | ||
| 							case UCOL_SECONDARY:
 | ||
| 								singleKey = "secondary";
 | ||
| 								seqKey = "secondarySeq";
 | ||
| 								break;
 | ||
| 							case UCOL_TERTIARY:
 | ||
| 								singleKey = "tertiary";
 | ||
| 								seqKey = "tertiarySeq";
 | ||
| 								break;
 | ||
| 							case UCOL_QUATERNARY:
 | ||
| 								singleKey = "quaternary";
 | ||
| 								seqKey = "quaternarySeq";
 | ||
| 								break;
 | ||
| 
 | ||
| 							}
 | ||
| 							if(count <= 1){
 | ||
| 								//xmlString.append(formatString(mStringsBundle.getStringEx(singleKey,mError),args,2,t));
 | ||
|                                 writeCollation(args[1].getString(),xmlString, prevStrength, singleKey);
 | ||
| 
 | ||
| 							}else{
 | ||
| 								//xmlString.append(formatString(mStringsBundle.getStringEx(seqKey,mError),args,2,t));
 | ||
| 							    writeCollation(args[1].getString(),xmlString, prevStrength, seqKey);
 | ||
|                             }
 | ||
|                             //if(src.current== src.end){
 | ||
|                             //    break;
 | ||
|                             //}
 | ||
|                           
 | ||
| 						}
 | ||
|                         //reset
 | ||
| 						
 | ||
|                         count = 0;
 | ||
| 						collStr.remove();
 | ||
| 
 | ||
| 					}
 | ||
| 			  }
 | ||
| 
 | ||
|               
 | ||
|               isCollStrContraction = isTempStrContraction;
 | ||
|               isTempStrContraction = FALSE;
 | ||
| 			  collStr.append(tempStr);
 | ||
| 
 | ||
|              
 | ||
| 			  count++;
 | ||
| 			  prevStrength = strength;		
 | ||
| 
 | ||
| 		}
 | ||
| 	}
 | ||
| 	if(appendedRules==TRUE){
 | ||
| 		chopIndent();
 | ||
| 		Formattable args[]= {indentOffset,UnicodeString(XML_END_SLASH)};
 | ||
| 		xmlString.append(formatString(mStringsBundle.getStringEx("rules",mError),args,2,t));
 | ||
| 	}
 | ||
| 
 | ||
| 	free(src.chars);
 | ||
| 	return xmlString;
 | ||
| }
 | ||
| 
 | ||
| int32_t findUChar(const UChar* src, int32_t len, UChar c){
 | ||
|     int32_t i=0;
 | ||
|     while(i<len){
 | ||
|         if(src[i]==c){
 | ||
|             return i;
 | ||
|         }
 | ||
|         i++;
 | ||
|     }
 | ||
|     return -1;
 | ||
| }
 | ||
| void GenerateXML::writeCollation(UnicodeString& src, UnicodeString &xmlString,uint32_t prevStrength, const char* keyName){
 | ||
| // strength context string extension
 | ||
| // <<<<  <context> | <string> / <extension>
 | ||
|     Formattable args[] = {"" , ""};
 | ||
|     UnicodeString context, string, extension, temp;
 | ||
|     int32_t index =  src.indexOf((UChar) 0x7C);
 | ||
|     int32_t contextMarker = (index>-1 && src.length() > 1) ? index : -1 ;
 | ||
|     if(contextMarker >=0 ){
 | ||
|         src.extract(0, contextMarker, context);
 | ||
|         escape(context);
 | ||
|         args[1] = context;
 | ||
|         context = formatString(mStringsBundle.getStringEx("context", mError), args, 2, temp);
 | ||
|     }
 | ||
|     int32_t extensionMarker = src.indexOf((UChar) UCOL_TOK_EXPANSION_MARKER);
 | ||
|     if(extensionMarker >= 0){
 | ||
|         src.extract(extensionMarker+1 /*skip past the extension marker*/,
 | ||
|                     src.length(), extension);
 | ||
|         escape(extension);
 | ||
|         args[1] = extension;
 | ||
|         extension = formatString(mStringsBundle.getStringEx("extend",mError),args,2,temp);
 | ||
|     }
 | ||
|     if(contextMarker >=0 && extensionMarker >=0){
 | ||
|         src.extract(contextMarker+1, extensionMarker - (contextMarker+1), string);
 | ||
|     }else if(contextMarker >=0){
 | ||
|         src.extract(contextMarker+1, src.length()-contextMarker, string);
 | ||
|     }else if(extensionMarker >=0){
 | ||
|         src.extract(0,extensionMarker, string);
 | ||
|     }else{
 | ||
|         string = src;
 | ||
|     }
 | ||
|     escape(string);
 | ||
|     args[0] = "";
 | ||
|     args[1] = string;
 | ||
|     string  = formatString(mStringsBundle.getStringEx(keyName,mError),args,2,temp);
 | ||
|     temp.remove();
 | ||
| 
 | ||
|     if(contextMarker>-1){
 | ||
|         temp.append(context);
 | ||
|     }
 | ||
|     temp.append(string);
 | ||
|     if(extensionMarker>-1){
 | ||
|         temp.append(extension);
 | ||
|     }
 | ||
|     if(contextMarker > -1 || extensionMarker > -1){
 | ||
|         temp.insert(0,"<x>");
 | ||
|         temp.append("</x>");
 | ||
|     }
 | ||
|     temp.insert(0, indentOffset);
 | ||
|     temp.append("\n");
 | ||
|     xmlString.append(temp);
 | ||
| }
 | ||
| void GenerateXML::escape(UnicodeString& str){
 | ||
| 	UnicodeString temp;
 | ||
|     UChar test[10] = {'\0'};
 | ||
| 	Formattable args[] = {indentOffset,""};
 | ||
| 	UnicodeString t;
 | ||
| 	for(int i=0;i<str.length();i++){
 | ||
|         UChar32 c = str.char32At(i);
 | ||
|         if(c >0xFFFF){
 | ||
|             i++;
 | ||
|         }
 | ||
|         switch(c){
 | ||
|         case '<':
 | ||
| 			temp.append("<");
 | ||
|             break;
 | ||
|         case '>':
 | ||
| 			temp.append(">");
 | ||
|             break;
 | ||
|         case '&':
 | ||
| 			temp.append("&");
 | ||
|             break;
 | ||
|         case '"':
 | ||
|             temp.append(""");
 | ||
| 		    break;
 | ||
| 		case 0x00:
 | ||
|         case 0x01:
 | ||
|         case 0x02:
 | ||
|         case 0x03:
 | ||
|         case 0x04:
 | ||
|         case 0x05:
 | ||
|         case 0x06:
 | ||
|         case 0x07:
 | ||
|         case 0x08:
 | ||
|         case 0x09:
 | ||
|        /* case 0x0A: */
 | ||
|         case 0x0b:
 | ||
|         case 0x0c:
 | ||
|        /* case 0x0D: */
 | ||
|         case 0x0e:
 | ||
|         case 0x0f:
 | ||
|         case 0x10:
 | ||
|         case 0x11:
 | ||
|         case 0x12:
 | ||
|         case 0x13:
 | ||
|         case 0x14:
 | ||
|         case 0x15:
 | ||
|         case 0x16:
 | ||
|         case 0x17:
 | ||
|         case 0x18:
 | ||
|         case 0x19:
 | ||
|         case 0x1A:
 | ||
|         case 0x1b:
 | ||
|         case 0x1c:
 | ||
|         case 0x1d:
 | ||
|         case 0x1e:
 | ||
|         case 0x1f:
 | ||
|             itou(test,c,16,4);  
 | ||
| 			args[1] = UnicodeString(test); 
 | ||
|             temp.append(formatString(mStringsBundle.getStringEx("cp",mError),args,2,t));
 | ||
|             break;
 | ||
|         default:
 | ||
| 			temp.append(c);
 | ||
|         }
 | ||
|         
 | ||
| 	}
 | ||
| 	str=temp;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| static
 | ||
| int32_t u_strncmpNoCase(const UChar     *s1, 
 | ||
|      const UChar     *s2, 
 | ||
|      int32_t     n) 
 | ||
| {
 | ||
|     if(n > 0) {
 | ||
|         int32_t rc;
 | ||
|         for(;;) {
 | ||
|             rc = (int32_t)u_tolower(*s1) - (int32_t)u_tolower(*s2);
 | ||
|             if(rc != 0 || *s1 == 0 || --n == 0) {
 | ||
|                 return rc;
 | ||
|             }
 | ||
|             ++s1;
 | ||
|             ++s2;
 | ||
|         }
 | ||
|     }
 | ||
|     return 0;
 | ||
| }
 | ||
| 
 | ||
| static inline 
 | ||
| void syntaxError(const UChar* rules, 
 | ||
|                  int32_t pos,
 | ||
|                  int32_t rulesLen,
 | ||
|                  UParseError* parseError) {
 | ||
|     parseError->offset = pos;
 | ||
|     parseError->line = 0 ; /* we are not using line numbers */
 | ||
|     
 | ||
|     // for pre-context
 | ||
|     int32_t start = (pos <=U_PARSE_CONTEXT_LEN)? 0 : (pos - (U_PARSE_CONTEXT_LEN-1));
 | ||
|     int32_t stop  = pos;
 | ||
|     
 | ||
|     u_memcpy(parseError->preContext,rules+start,stop-start);
 | ||
|     //null terminate the buffer
 | ||
|     parseError->preContext[stop-start] = 0;
 | ||
|     
 | ||
|     //for post-context
 | ||
|     start = pos+1;
 | ||
|     stop  = ((pos+U_PARSE_CONTEXT_LEN)<= rulesLen )? (pos+(U_PARSE_CONTEXT_LEN-1)) : 
 | ||
|                                                             u_strlen(rules);
 | ||
| 
 | ||
|     u_memcpy(parseError->postContext,rules+start,stop-start);
 | ||
|     //null terminate the buffer
 | ||
|     parseError->postContext[stop-start]= 0;
 | ||
| 
 | ||
|     UnicodeString preCon,postCon;
 | ||
| 	prettify(UnicodeString(parseError->preContext),preCon);
 | ||
| 	prettify(parseError->postContext,postCon);
 | ||
| 	char preChar[256], postChar[256];
 | ||
| 	preCon.extract(0,preCon.length(),preChar,sizeof(preChar));
 | ||
| 	postCon.extract(0,postCon.length(),postChar,sizeof(postChar));
 | ||
| 	printf("parseRules() failed. Pre-context: %s \t post-context: %s \n",preChar, postChar);
 | ||
| 	exit(-1);
 | ||
| }
 | ||
| 
 | ||
| #define ucol_tok_isSpecialChar(ch)              \
 | ||
|     (((((ch) <= 0x002F) && ((ch) > 0x0020)) || \
 | ||
|       (((ch) <= 0x003F) && ((ch) >= 0x003A)) || \
 | ||
|       /* (((ch) <= 0x0060) && ((ch) >= 0x005B)) || \ */ \
 | ||
| 	  (((ch) == 0x0060) ||    ((ch) == 0x005c) || ((ch) == 0x005e) || ((ch) == 0x005f) ) || \
 | ||
|       (((ch) <= 0x007E) && ((ch) >= 0x007D)) || \
 | ||
|       (ch) == 0x007B))
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| void GenerateXML::growBuffer(UChar* src, int32_t len, int32_t size, int32_t requiredCapacity, UErrorCode* status){
 | ||
| 	UChar* temp =NULL;
 | ||
| 	
 | ||
| 	if(status ==NULL || U_FAILURE(*status)){
 | ||
| 		return;
 | ||
| 	}
 | ||
| 	if(requiredCapacity < len ){
 | ||
| 		*status = U_ILLEGAL_ARGUMENT_ERROR;
 | ||
| 		return;
 | ||
| 	}
 | ||
| 	temp = (UChar*) malloc ( size * requiredCapacity);
 | ||
| 	if(temp ==NULL){
 | ||
| 		*status = U_MEMORY_ALLOCATION_ERROR;
 | ||
| 		return;
 | ||
| 	}
 | ||
| 	memmove(temp,src,len*size);
 | ||
| 	free(src);
 | ||
| 	src = temp;
 | ||
| }
 | ||
| 
 | ||
| /*
 | ||
|  *
 | ||
|  *  "&		a	<<		befg	<<		c		<<		d		<<		d"
 | ||
|  *   ^			^				^										^
 | ||
|  *   start		prevCurrent		current 								end
 | ||
|  */
 | ||
| 
 | ||
| uint32_t GenerateXML::parseRules(Token* src,UBool startOfRules){
 | ||
|   /* parsing part */
 | ||
|   UBool variableTop = FALSE;
 | ||
|   //UBool top = FALSE;
 | ||
|   UBool inChars = TRUE;
 | ||
|   UBool inQuote = FALSE;
 | ||
|   UBool wasInQuote = FALSE;
 | ||
|   UChar *optionEnd = NULL;
 | ||
|   uint8_t before = 0;
 | ||
|   UBool isEscaped = FALSE;
 | ||
|   UParseError parseError;
 | ||
|   uint32_t newExtensionLen = 0;
 | ||
|   uint32_t extensionOffset = 0;
 | ||
|   uint32_t newStrength = UCOL_TOK_UNSET; 
 | ||
|   UBool isSetting = FALSE;
 | ||
|   const UChar top[] = {0x005b,0x0074,0x006f,0x0070,0x005d};
 | ||
| 
 | ||
|   src->prevCurrent = src->current;
 | ||
|   src->charsLen = 0;
 | ||
| 
 | ||
|   while (src->current < src->end) {
 | ||
|     UChar ch = *(src->current);
 | ||
| 
 | ||
| 
 | ||
|     if (inQuote) {
 | ||
|       if (ch == 0x0027/*'\''*/) {
 | ||
|           inQuote = FALSE;
 | ||
|       }else{
 | ||
| 		  if(src->charsLen >= (src->charsCapacity-1)){
 | ||
| 			  src->charsCapacity*=2;
 | ||
| 			 growBuffer(src->chars,src->charsLen,U_SIZEOF_UCHAR, src->charsCapacity,&mError);
 | ||
| 		  }
 | ||
| 		  src->chars[src->charsLen++] =ch;
 | ||
| 	  }
 | ||
|     }else if(isEscaped){
 | ||
|       isEscaped =FALSE;
 | ||
|       if (newStrength == UCOL_TOK_UNSET) {
 | ||
| 		mError = U_INVALID_FORMAT_ERROR;
 | ||
|         syntaxError(src->start,(int32_t)(src->current-src->start),(int32_t)(src->end-src->start),&parseError);
 | ||
|         return NULL;
 | ||
|         // enabling rules to start with non-tokens a < b
 | ||
| 		// newStrength = UCOL_TOK_RESET;
 | ||
|       }
 | ||
| 
 | ||
|     }else if(isSetting==TRUE ||!uprv_isRuleWhiteSpace(ch)) {
 | ||
|         /* Sets the strength for this entry */
 | ||
|         switch (ch) {
 | ||
|           case 0x003D/*'='*/ : 
 | ||
|             if (newStrength != UCOL_TOK_UNSET) {
 | ||
|               goto EndOfLoop;
 | ||
|             }
 | ||
| 
 | ||
|             /* if we start with strength, we'll reset to top */
 | ||
|             if(startOfRules == TRUE) {
 | ||
|               newStrength = UCOL_TOK_RESET;
 | ||
| 			  u_strcpy(src->chars+src->charsLen,top);
 | ||
| 			  src->charsLen+=u_strlen(top);
 | ||
|               goto EndOfLoop;
 | ||
|             }
 | ||
|             newStrength = UCOL_IDENTICAL;
 | ||
|             break;
 | ||
| 
 | ||
|           case 0x002C/*','*/:  
 | ||
|             if (newStrength != UCOL_TOK_UNSET) {
 | ||
|               goto EndOfLoop;
 | ||
|             }
 | ||
| 
 | ||
|             /* if we start with strength, we'll reset to top */
 | ||
|             if(startOfRules == TRUE) {
 | ||
|               newStrength = UCOL_TOK_RESET;
 | ||
| 			  u_strcpy(src->chars+src->charsLen,top);
 | ||
| 			  src->charsLen+=u_strlen(top);
 | ||
|               goto EndOfLoop;
 | ||
|             }
 | ||
|             newStrength = UCOL_TERTIARY;
 | ||
|             break;
 | ||
| 		  
 | ||
| 		  case 0x002D: /* - add to src->chars and continue */
 | ||
| 			  if(src->charsLen >= (src->charsCapacity-1)){
 | ||
| 				src->charsCapacity*=2;
 | ||
| 				growBuffer(src->chars,src->charsLen,U_SIZEOF_UCHAR, src->charsCapacity,&mError);
 | ||
| 			  }
 | ||
| 			  src->chars[src->charsLen++] = ch;
 | ||
| 			  break;
 | ||
|           case  0x003B/*';'*/:
 | ||
|             if (newStrength != UCOL_TOK_UNSET) {
 | ||
|               goto EndOfLoop;
 | ||
|             }
 | ||
| 
 | ||
|             /* if we start with strength, we'll reset to top */
 | ||
|             if(startOfRules == TRUE) {
 | ||
| 			  u_strcpy(src->chars+src->charsLen,top);
 | ||
| 			  src->charsLen+=u_strlen(top);
 | ||
|               newStrength = UCOL_TOK_RESET;
 | ||
|               goto EndOfLoop;
 | ||
|             }
 | ||
|             newStrength = UCOL_SECONDARY;
 | ||
|             break;
 | ||
| 
 | ||
|           case 0x003C/*'<'*/:  
 | ||
|             if (newStrength != UCOL_TOK_UNSET) {
 | ||
|               goto EndOfLoop;
 | ||
|             }
 | ||
| 
 | ||
|             /* if we start with strength, we'll reset to top */
 | ||
|             if(startOfRules == TRUE) {
 | ||
| 			  u_strcpy(src->chars+src->charsLen,top);
 | ||
| 			  src->charsLen+=u_strlen(top);
 | ||
|               newStrength = UCOL_TOK_RESET;
 | ||
|               goto EndOfLoop;
 | ||
|             }
 | ||
|             /* before this, do a scan to verify whether this is */
 | ||
|             /* another strength */
 | ||
|             if(*(src->current+1) == 0x003C) {
 | ||
|               src->current++;
 | ||
|               if(*(src->current+1) == 0x003C) {
 | ||
|                 src->current++; /* three in a row! */
 | ||
|                 newStrength = UCOL_TERTIARY;
 | ||
|               } else { /* two in a row */
 | ||
|                 newStrength = UCOL_SECONDARY;
 | ||
|               }
 | ||
|             } else { /* just one */
 | ||
|               newStrength = UCOL_PRIMARY;
 | ||
|             }
 | ||
|             break;
 | ||
| 
 | ||
|           case 0x0026/*'&'*/:  
 | ||
|             if (newStrength != UCOL_TOK_UNSET) {
 | ||
|               /**/
 | ||
|               goto EndOfLoop;
 | ||
|             }
 | ||
| 
 | ||
|             newStrength = UCOL_TOK_RESET; /* PatternEntry::RESET = 0 */
 | ||
|             break;
 | ||
| 
 | ||
| 		  case 0x005B:
 | ||
| 			  if (newStrength == UCOL_TOK_UNSET){
 | ||
| 				  newStrength = UCOL_TOK_SETTING;
 | ||
| 			  }
 | ||
| 			  if(!inQuote){
 | ||
| 				  isSetting=TRUE;
 | ||
| 			  }
 | ||
| 			  if(src->charsLen >= (src->charsCapacity-1)){
 | ||
| 				src->charsCapacity*=2;
 | ||
| 				growBuffer(src->chars,src->charsLen,U_SIZEOF_UCHAR, src->charsCapacity,&mError);
 | ||
| 			  }
 | ||
| 			  src->chars[src->charsLen++] =ch;
 | ||
| 			  break;
 | ||
| 		  case 0x005D:
 | ||
| 			  if(isSetting==TRUE){
 | ||
| 				  isSetting = FALSE;
 | ||
| 			  }
 | ||
| 			  if(src->charsLen >= (src->charsCapacity-1)){
 | ||
| 				src->charsCapacity*=2;
 | ||
| 				growBuffer(src->chars,src->charsLen,U_SIZEOF_UCHAR, src->charsCapacity,&mError);
 | ||
| 			  }
 | ||
| 			  src->chars[src->charsLen++] = ch;
 | ||
| 			  break;
 | ||
| 		  case 0x0021/*! skip java thai modifier reordering*/:
 | ||
| 			  break; 
 | ||
|           case 0x002F/*'/'*/:
 | ||
|             wasInQuote = FALSE; /* if we were copying source characters, we want to stop now */
 | ||
|             /* RAM: expansion just add the character back */
 | ||
|             src->chars[src->charsLen++] = UCOL_TOK_EXPANSION_MARKER;
 | ||
|             inChars = FALSE; /* we're now processing expansion */
 | ||
|             break;
 | ||
|           case 0x005C /* back slash for escaped chars */:
 | ||
|               isEscaped = TRUE;
 | ||
|               break;
 | ||
|           /* found a quote, we're gonna start copying */
 | ||
|           case 0x0027/*'\''*/:
 | ||
|             if (newStrength == UCOL_TOK_UNSET) { /* quote is illegal until we have a strength */
 | ||
| 			  mError = U_INVALID_FORMAT_ERROR;
 | ||
|               syntaxError(src->start,(int32_t)(src->current-src->start),(int32_t)(src->end-src->start),&parseError);
 | ||
|               return NULL;
 | ||
| 			  // enabling rules to start with a non-token character a < b
 | ||
|               // newStrength = UCOL_TOK_RESET;
 | ||
|             }
 | ||
| 			if(inQuote==FALSE){
 | ||
| 				inQuote = TRUE;
 | ||
| 				wasInQuote = TRUE;
 | ||
| 			}else{
 | ||
| 				inQuote =FALSE;
 | ||
| 				wasInQuote = FALSE;
 | ||
| 			}
 | ||
| 			// removed inChars
 | ||
| 
 | ||
|             
 | ||
| 
 | ||
|             ch = *(++(src->current)); 
 | ||
|             if(ch == 0x0027) { /* copy the double quote */
 | ||
|               //*src->extraCurrent++ = ch;
 | ||
| 			  if(src->charsLen >= (src->charsCapacity-1)){
 | ||
| 				 src->charsCapacity*=2;
 | ||
| 			     growBuffer(src->chars,src->charsLen,U_SIZEOF_UCHAR, src->charsCapacity,&mError);
 | ||
| 			  }
 | ||
| 			  src->chars[src->charsLen++] = ch;
 | ||
| 			  if(*(src->current+1)!=0x0027){
 | ||
| 				inQuote = FALSE;
 | ||
| 			  }
 | ||
|             }else{
 | ||
| 				--src->current;
 | ||
| 			}
 | ||
|             break;
 | ||
| 
 | ||
|           /* '@' is french only if the strength is not currently set */
 | ||
|           /* if it is, it's just a regular character in collation rules */
 | ||
|           case 0x0040/*'@'*/:
 | ||
|             if (newStrength == UCOL_TOK_UNSET) {
 | ||
|               //src->opts->frenchCollation = UCOL_ON;
 | ||
| 			  //french secondary
 | ||
| 			  newStrength = UCOL_TOK_OVERRIDE;
 | ||
|               break;
 | ||
|             }
 | ||
| 
 | ||
|           case 0x007C /*|*/: /* this means we have actually been reading prefix part */
 | ||
|             // we want to store read characters to the prefix part and continue reading
 | ||
|             // the characters (proper way would be to restart reading the chars, but in
 | ||
|             // that case we would have to complicate the token hasher, which I do not 
 | ||
|             // intend to play with. Instead, we will do prefixes when prefixes are due
 | ||
|             // (before adding the elements).
 | ||
| 
 | ||
| 			//wasInQuote = TRUE;
 | ||
| 			if(src->charsLen >= (src->charsCapacity-1)){
 | ||
| 			  src->charsCapacity*=2;
 | ||
| 			  growBuffer(src->chars,src->charsLen,U_SIZEOF_UCHAR, src->charsCapacity,&mError);
 | ||
| 			}
 | ||
| 			src->chars[src->charsLen++]=ch;
 | ||
|             //ch = *(++(src->current)); 
 | ||
|             break;
 | ||
|           
 | ||
|             //charsOffset = 0;
 | ||
|             //newCharsLen = 0;
 | ||
|             //break; // We want to store the whole prefix/character sequence. If we break
 | ||
|                      // the '|' is going to get lost.
 | ||
|           default:
 | ||
|             if (newStrength == UCOL_TOK_UNSET) {
 | ||
| 			  mError = U_INVALID_FORMAT_ERROR;
 | ||
|               syntaxError(src->start,(int32_t)(src->current-src->start),(int32_t)(src->end-src->start),&parseError);
 | ||
|               return NULL;
 | ||
|             }
 | ||
| 
 | ||
|             if (ucol_tok_isSpecialChar(ch) && (inQuote == FALSE)) {
 | ||
|               mError = U_INVALID_FORMAT_ERROR;
 | ||
|               syntaxError(src->start,(int32_t)(src->current-src->start),(int32_t)(src->end-src->start),&parseError);
 | ||
|               return NULL;
 | ||
|             }
 | ||
| 			if(src->charsLen >= (src->charsCapacity-1)){
 | ||
| 			 src->charsCapacity*=2;
 | ||
| 			 growBuffer(src->chars,src->charsLen,U_SIZEOF_UCHAR, src->charsCapacity,&mError);
 | ||
| 
 | ||
| 			}
 | ||
| 			src->chars[src->charsLen++] =ch;
 | ||
|             if(ch == 0x0000 && src->current+1 == src->end) {
 | ||
|               break;
 | ||
|             }
 | ||
| 
 | ||
|             break;
 | ||
|           }         
 | ||
|        }
 | ||
| 	   src->current++;
 | ||
|     }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|  EndOfLoop:
 | ||
|     if(newStrength == UCOL_TOK_UNSET && src->current == src->end){
 | ||
|         return UCOL_TOK_DONE;
 | ||
|     }
 | ||
|   wasInQuote = FALSE;
 | ||
|   return newStrength;
 | ||
| }
 | ||
| 
 | ||
| static UnicodeString suppIndent;
 | ||
| void GenerateXML::addIndent(UnicodeString& indent){
 | ||
|     indent.append("    ");
 | ||
| }
 | ||
| void GenerateXML::chopIndent(UnicodeString& indent){
 | ||
|     indent.remove(indent.length()-4);
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeSupplementalData(){
 | ||
| 	FILE* sFile=getFileHandle(destDir,"supplementalData");
 | ||
|     UErrorCode error = U_ZERO_ERROR;
 | ||
|     
 | ||
|     // write the xml version
 | ||
|   	UnicodeString xmlString;
 | ||
| 
 | ||
| 	UnicodeString temp = mStringsBundle.getStringEx("supplementalDeclaration",error);
 | ||
|     xmlString.append(temp);
 | ||
| 	Formattable arguments[] = {"",""};
 | ||
| 	UnicodeString tempStr;
 | ||
| 	xmlString.append(formatString(mStringsBundle.getStringEx("supplementalData",error),arguments,1,tempStr));
 | ||
| 
 | ||
|     // TODO: change later
 | ||
|     UResourceBundle* root = ures_openDirect(path, "CurrencyData", &error);
 | ||
| 
 | ||
|     addIndent(suppIndent);
 | ||
|     arguments[0] = suppIndent;
 | ||
|     arguments[1] = "";
 | ||
| 	xmlString.append(formatString(mStringsBundle.getStringEx("currencyData",error),arguments,2,tempStr));
 | ||
| 
 | ||
|     tempStr.remove();
 | ||
|     writeCurrencyMeta(tempStr, root,error);
 | ||
|     if(tempStr.length()!=0){
 | ||
|         xmlString.append(tempStr);
 | ||
|     }
 | ||
|     tempStr.remove();
 | ||
|     writeCurrencyMap(tempStr, root, error);
 | ||
|     if(tempStr.length()!=0){
 | ||
|         xmlString.append(tempStr);
 | ||
|     }
 | ||
|     arguments[0] = suppIndent;
 | ||
|     arguments[1] = UnicodeString(XML_END_SLASH);
 | ||
|     xmlString.append(formatString(mStringsBundle.getStringEx("currencyData",error),arguments,2,tempStr));
 | ||
|     chopIndent(suppIndent);
 | ||
| 	
 | ||
|     arguments[0] = UnicodeString(XML_END_SLASH);
 | ||
| 	xmlString.append(formatString(mStringsBundle.getStringEx("supplementalData",error),arguments,1,tempStr));
 | ||
| 	printString(&xmlString, sFile);
 | ||
| 
 | ||
|     ures_close(root);
 | ||
| 
 | ||
| }
 | ||
| void GenerateXML::writeCurrencyMap(UnicodeString& xmlString, UResourceBundle* root, UErrorCode& error){
 | ||
|     if(U_FAILURE(error)){
 | ||
|         return;
 | ||
|     }
 | ||
|     UResourceBundle* curr = ures_getByKey(root, "CurrencyMap", NULL, &error);
 | ||
|     char altKey[100] = {0};
 | ||
|     const char* preEuro = "_PREEURO";
 | ||
|     const char* euro    = "_EURO";
 | ||
|     if(U_SUCCESS(error)){
 | ||
|         addIndent(suppIndent);
 | ||
|         while(ures_hasNext(curr)){
 | ||
|             UResourceBundle* element = ures_getNextResource(curr,NULL, &error);
 | ||
|             const char*   country  =  ures_getKey(element);
 | ||
|             if(strstr(country, preEuro) != NULL || strstr(country, euro)!=NULL){
 | ||
|                 continue;
 | ||
|             }
 | ||
|             int32_t len =0;
 | ||
|             const UChar* temp = ures_getString(element,&len, &error);
 | ||
|             UnicodeString currency (temp, len);
 | ||
|             Formattable args[] = {suppIndent, country, "" };
 | ||
|             UnicodeString tempStr;
 | ||
|             xmlString.append(formatString(mStringsBundle.getStringEx("regionStart",error),args,2,tempStr));
 | ||
|             addIndent(suppIndent);
 | ||
|             args[0] = suppIndent;
 | ||
|             args[1] = currency;
 | ||
|             
 | ||
|             xmlString.append(formatString(mStringsBundle.getStringEx("suppCurrencyStart",mError),args,3,tempStr));
 | ||
|             
 | ||
|             addIndent(suppIndent);
 | ||
|             strcpy(altKey, country);
 | ||
|             strcat(altKey, preEuro);
 | ||
|             len=0;
 | ||
|             temp = ures_getStringByKey(curr, altKey, &len, &error);
 | ||
|             UnicodeString altCurrency (temp, len);
 | ||
|             if(U_SUCCESS(error)){
 | ||
|                 args[0] = suppIndent;
 | ||
|                 args[1] = altCurrency;
 | ||
|                 xmlString.append(formatString(mStringsBundle.getStringEx("alternate",error),args,2,tempStr));
 | ||
|             }else{
 | ||
|                 error = U_ZERO_ERROR;
 | ||
|             }
 | ||
|             chopIndent(suppIndent);
 | ||
|            
 | ||
|             args[0] = suppIndent;
 | ||
|             xmlString.append(formatString(mStringsBundle.getStringEx("suppCurrencyEnd",error),args,1,tempStr));
 | ||
| 
 | ||
|             chopIndent(suppIndent);
 | ||
| 
 | ||
|             args[0] = suppIndent;
 | ||
|             xmlString.append(formatString(mStringsBundle.getStringEx("regionEnd",error),args,1,tempStr));
 | ||
| 
 | ||
|         }
 | ||
|         chopIndent(suppIndent);
 | ||
|     }
 | ||
| 
 | ||
| }
 | ||
| void GenerateXML::writeCurrencyMeta(UnicodeString& xmlString, UResourceBundle* root, UErrorCode& error){
 | ||
|     if(U_FAILURE(error)){
 | ||
|         return;
 | ||
|     }
 | ||
|     UResourceBundle* curr = ures_getByKey(root, "CurrencyMeta", NULL, &error);
 | ||
|     if(U_SUCCESS(error)){
 | ||
|         addIndent(suppIndent);
 | ||
|         Formattable args[] = {suppIndent, "", "", ""};
 | ||
|         Formattable args1[] = {""};
 | ||
|         UnicodeString tempStr;
 | ||
|         xmlString.append(formatString(mStringsBundle.getStringEx("fractions",error),args,2,tempStr));
 | ||
|         
 | ||
|         addIndent(suppIndent);
 | ||
|         while(ures_hasNext(curr)){
 | ||
|             UResourceBundle* element = ures_getNextResource(curr, NULL, &error);
 | ||
|             const char* key = ures_getKey(element);
 | ||
|             int32_t len =0;
 | ||
|             const int32_t* intVector = ures_getIntVector(element,&len, &error);
 | ||
|             ures_close(element);
 | ||
|             if(len < 2){
 | ||
|                 error = U_INTERNAL_PROGRAM_ERROR;
 | ||
|                 return;
 | ||
|             }
 | ||
|             UChar buffer[100] = {0};
 | ||
|             len = itou(buffer, intVector[0], 10, 0);
 | ||
|              
 | ||
|             args[0] = suppIndent;
 | ||
|             args[1] = key;
 | ||
|             args[2] = formatString(mStringsBundle.getStringEx("digits", error), UnicodeString(buffer, len), tempStr);
 | ||
| 
 | ||
|             if(intVector!=0){
 | ||
|                 len = itou(buffer, intVector[1], 10, 0);
 | ||
|                 args[3] = formatString(mStringsBundle.getStringEx("rounding", error), UnicodeString(buffer, len), tempStr);
 | ||
|             }else{
 | ||
|                 args[3] = "";
 | ||
|             }
 | ||
|             
 | ||
|             xmlString.append(formatString(mStringsBundle.getStringEx("info",mError),args,4,tempStr));
 | ||
|             
 | ||
|         }
 | ||
|         chopIndent(suppIndent);
 | ||
|         
 | ||
|         args[0] = suppIndent;
 | ||
|         args[1] = UnicodeString(XML_END_SLASH);
 | ||
|         xmlString.append(formatString(mStringsBundle.getStringEx("fractions",mError),args,2,tempStr));
 | ||
|         
 | ||
|         chopIndent(suppIndent);
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writePaperSize(UnicodeString& xmlString){
 | ||
|     ResourceBundle paperSize = mSourceBundle.get("PaperSize", mError);
 | ||
|     int32_t len=0;
 | ||
|     const int32_t* sizes = paperSize.getIntVector(len,mError);
 | ||
|     UnicodeString tempStr;
 | ||
| 
 | ||
|     if( mError!=U_USING_DEFAULT_WARNING && 
 | ||
| 		mError!=U_USING_FALLBACK_WARNING && 
 | ||
|             U_SUCCESS(mError)){
 | ||
|         Formattable args[] = {indentOffset, "", ""};
 | ||
|         xmlString.append(formatString( mStringsBundle.getStringEx("paperSize", mError), args, 2, tempStr));
 | ||
|         indentOffset.append("\t");
 | ||
| 
 | ||
|         char c[10] = {0};
 | ||
|         itoa(sizes[0], c, 10);
 | ||
|         args[0] = indentOffset;
 | ||
|         args[1] = UnicodeString(c);
 | ||
|         tempStr.remove();
 | ||
|         xmlString.append(formatString( mStringsBundle.getStringEx("height", mError), args, 2, tempStr));
 | ||
|         
 | ||
|         c[0] = 0;
 | ||
|         itoa(sizes[1], c, 10);
 | ||
|         args[1] = UnicodeString(c);
 | ||
|         tempStr.remove();
 | ||
|         xmlString.append(formatString( mStringsBundle.getStringEx("width", mError), args, 2, tempStr));
 | ||
| 
 | ||
|         chopIndent();
 | ||
|         tempStr.remove();
 | ||
|         args[0] = indentOffset;
 | ||
|         args[1] = UnicodeString(XML_END_SLASH);
 | ||
|         xmlString.append(formatString( mStringsBundle.getStringEx("paperSize", mError), args, 2, tempStr));
 | ||
|         mError = U_ZERO_ERROR;
 | ||
|         return;
 | ||
|     }
 | ||
|     mError = U_ZERO_ERROR;
 | ||
|     xmlString.remove();
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeMeasurement(UnicodeString& xmlString){
 | ||
|     UnicodeString tempStr;
 | ||
|     Formattable args[] = { indentOffset, "", "" };
 | ||
|     xmlString.append(formatString( mStringsBundle.getStringEx("measurement", mError), args, 2, tempStr));
 | ||
|     UBool print = FALSE;
 | ||
| 
 | ||
|     ResourceBundle measurementSystem = mSourceBundle.get("MeasurementSystem", mError);
 | ||
|     indentOffset.append("\t");
 | ||
|     
 | ||
|     if( mError!=U_USING_DEFAULT_WARNING && 
 | ||
| 		mError!=U_USING_FALLBACK_WARNING && 
 | ||
|             U_SUCCESS(mError)){
 | ||
| 
 | ||
|         args[0] = indentOffset;
 | ||
|         args[1] = (measurementSystem.getInt(mError)== 0) ? "metric" : "US";
 | ||
|         if(U_SUCCESS(mError)){
 | ||
|             tempStr.remove();
 | ||
|             xmlString.append(formatString( mStringsBundle.getStringEx("measurementSystem", mError), args, 2, tempStr));
 | ||
|             print = TRUE;
 | ||
|         }
 | ||
|     }
 | ||
|     
 | ||
|     tempStr.remove();
 | ||
|     writePaperSize(tempStr);
 | ||
|     if(tempStr.length()>0){
 | ||
|         xmlString.append(tempStr);
 | ||
|         print = TRUE;
 | ||
|     }
 | ||
|     tempStr.remove();
 | ||
|     chopIndent();
 | ||
|     args[0] = indentOffset;
 | ||
|     args[1] = UnicodeString(XML_END_SLASH);
 | ||
|     xmlString.append(formatString( mStringsBundle.getStringEx("measurement", mError), args, 2, tempStr));
 | ||
|     if(print==FALSE){
 | ||
|         xmlString.remove();
 | ||
|     }
 | ||
|     mError = U_ZERO_ERROR;
 | ||
| }
 | ||
| 
 | ||
| /*
 | ||
| void GenerateXML::writePosixCompData(){
 | ||
|     char temp[50]={'\0'};
 | ||
|     strcpy(temp,locName);
 | ||
|     strcat(temp,"_PCD");
 | ||
|     Locale loc(temp);
 | ||
|     ResourceBundle bundle(path, loc,mError);
 | ||
|     if(mError==U_ZERO_ERROR){
 | ||
|         UnicodeString xmlString;
 | ||
|         xmlString.append(formatString(UnicodeString(POSIX_START),indentOffset));
 | ||
|         indentOffset.append("\t");
 | ||
|         
 | ||
|         writeMessages(bundle,xmlString);
 | ||
|         addressFormat(bundle,xmlString);
 | ||
|         nameFormat(bundle, xmlString);
 | ||
|         identity(bundle, xmlString);
 | ||
|         telephoneFormat( bundle, xmlString);
 | ||
|         
 | ||
|         chopIndent();
 | ||
|         xmlString.append(formatString(UnicodeString(POSIX_END), indentOffset));
 | ||
|         printString(&xmlString);
 | ||
| 
 | ||
|     }
 | ||
|     
 | ||
|     
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::writeMessages(ResourceBundle& bundle, UnicodeString& xmlString){
 | ||
|     UnicodeString temp,temp1;
 | ||
|     ResourceBundle dBundle = bundle.get("Messages",mError);
 | ||
|     if(U_SUCCESS(mError)){
 | ||
|         temp.append(formatString(UnicodeString(MSG_START),indentOffset));
 | ||
|         indentOffset.append("\t");
 | ||
|         getStringRes("yesExpression",dBundle,temp1,UnicodeString(YES));
 | ||
|         getStringRes("noExpression",dBundle,temp1, UnicodeString(NO));
 | ||
|         if(temp1.length()!=0){
 | ||
|             temp.append(temp1);
 | ||
|             temp.append(formatString(UnicodeString(MSG_END),indentOffset));
 | ||
|         }else{
 | ||
|             temp.remove();
 | ||
|         }
 | ||
|         chopIndent();
 | ||
|         xmlString.append(temp);
 | ||
|     }
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::addressFormat(ResourceBundle& bundle,UnicodeString& xmlString){
 | ||
|     UnicodeString temp,temp1;
 | ||
|     ResourceBundle dBundle = bundle.get("AddressFormat",mError);
 | ||
|     if(U_SUCCESS(mError)){
 | ||
|         temp.append(formatString(UnicodeString(ADDR_START),indentOffset));
 | ||
|         indentOffset.append("\t");
 | ||
|         getStringRes("PostalFormat",dBundle,temp1,UnicodeString(POSTAL));
 | ||
|         if(temp1.length()!=0){
 | ||
|             temp.append(temp1);
 | ||
|             temp.append(formatString(UnicodeString(ADDR_END),indentOffset));
 | ||
|         }else{
 | ||
|             temp.remove();
 | ||
|         }
 | ||
|         chopIndent();
 | ||
|         xmlString.append(temp);
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::nameFormat(ResourceBundle& bundle,UnicodeString& xmlString){
 | ||
|     UnicodeString temp,temp1;
 | ||
|     ResourceBundle dBundle = bundle.get("NameFormat",mError);
 | ||
|     if(U_SUCCESS(mError)){
 | ||
|         temp.append(formatString(UnicodeString(NF_START),indentOffset));
 | ||
|         indentOffset.append("\t");
 | ||
| 
 | ||
|         getStringRes("NamePattern",dBundle,temp1,UnicodeString(NAME_PAT));
 | ||
|         getStringRes("GeneralSalutaion",dBundle,temp1, UnicodeString(GEN_SALUT));
 | ||
|         getStringRes("ShortSalutationMr",dBundle,temp1, UnicodeString(SH_SALUT_MR));
 | ||
|         getStringRes("ShortSalutationMiss",dBundle,temp1, UnicodeString(SH_SALUT_MS));
 | ||
|         getStringRes("ShortSalutationMrs",dBundle,temp1, UnicodeString(SH_SALUT_MI));
 | ||
|         getStringRes("LongSalutationMr",dBundle,temp1, UnicodeString(LG_SALUT_MR));
 | ||
|         getStringRes("LongSalutationMiss",dBundle,temp1, UnicodeString(LG_SALUT_MS));
 | ||
|         getStringRes("LongSalutationMrs",dBundle,temp1, UnicodeString(LG_SALUT_MI));
 | ||
| 
 | ||
|         if(temp1.length()!=0){
 | ||
|             temp.append(temp1);
 | ||
|             temp.append(formatString(UnicodeString(NF_END),indentOffset));
 | ||
|         }else{
 | ||
|             temp.remove();
 | ||
|         }
 | ||
|         chopIndent();
 | ||
|         xmlString.append(temp);
 | ||
|     }
 | ||
| }
 | ||
| 	
 | ||
| void GenerateXML::identity(ResourceBundle& bundle,UnicodeString& xmlString){
 | ||
| 	    UnicodeString temp,temp1;
 | ||
| 	    ResourceBundle dBundle = bundle.get("Identification",mError);
 | ||
| 		if(U_SUCCESS(mError)){
 | ||
| 	        temp.append(formatString(UnicodeString(ID_START),indentOffset));
 | ||
|         indentOffset.append("\t");
 | ||
| 
 | ||
|         getStringRes("Title",dBundle,temp1,UnicodeString(TITLE));
 | ||
|         getStringRes("Source",dBundle,temp1, UnicodeString(SOURCE));
 | ||
|         getStringRes("Address",dBundle,temp1, UnicodeString(ADDR_1));
 | ||
|        // getStringRes("Contact",dBundle,temp1, UnicodeString(CONTACT));
 | ||
|         getStringRes("Email",dBundle,temp1, UnicodeString(EMAIL));
 | ||
|         getStringRes("Telephone",dBundle,temp1, UnicodeString(TELEPH));
 | ||
|         getStringRes("Fax",dBundle,temp1, UnicodeString(FAX));
 | ||
|         getStringRes("u",dBundle,temp1, UnicodeString(LANG_1));
 | ||
|         getStringRes("Territory",dBundle,temp1,UnicodeString(TRTRY));
 | ||
|         getStringRes("Audience",dBundle,temp1, UnicodeString(AUDIENCE));
 | ||
|         getStringRes("Application",dBundle,temp1, UnicodeString(APPLIC));
 | ||
|         getStringRes("Abbreviation",dBundle,temp1, UnicodeString(ABBR_1));
 | ||
|         getStringRes("Revision",dBundle,temp1, UnicodeString(REV));
 | ||
|         getStringRes("Date",dBundle,temp1, UnicodeString(DATE_1));
 | ||
| 
 | ||
|         if(temp1.length()!=0){
 | ||
|             temp.append(temp1);
 | ||
|             temp.append(formatString(UnicodeString(ID_END),indentOffset));
 | ||
|         }else{
 | ||
|             temp.remove();
 | ||
|         }
 | ||
|         chopIndent();
 | ||
|         xmlString.append(temp);
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| void GenerateXML::telephoneFormat(ResourceBundle& bundle,UnicodeString& xmlString){
 | ||
|     UnicodeString temp,temp1;
 | ||
|     ResourceBundle dBundle = bundle.get("TelephoneFormat",mError);
 | ||
|     if(U_SUCCESS(mError)){
 | ||
|         temp.append(formatString(UnicodeString(TF_START),indentOffset));
 | ||
|         indentOffset.append("\t");
 | ||
| 
 | ||
|         getStringRes("InternationalFormat",dBundle,temp1, UnicodeString(IP_TF));
 | ||
|         getStringRes("DomesticFormat",dBundle,temp1, UnicodeString(DP_TF));
 | ||
|         getStringRes("InternationalDialCode",dBundle,temp1, UnicodeString(IDC_TF));
 | ||
|         getStringRes("InternationalPrefix",dBundle,temp1, UnicodeString(IPF_TF));
 | ||
| 
 | ||
|         if(temp1.length()!=0){
 | ||
|             temp.append(temp1);
 | ||
|             temp.append(formatString(UnicodeString(TF_END),indentOffset));
 | ||
|         }else{
 | ||
|             temp.remove();
 | ||
|         }
 | ||
|         chopIndent();
 | ||
|         xmlString.append(temp);
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| void GenerateXML::writePosixAdditions(){
 | ||
|     UnicodeString xmlString;
 | ||
|     writeMeasurement(xmlString);
 | ||
|     writeCountryPost(xmlString);
 | ||
|     writeCountryCar(xmlString);
 | ||
|     writeCountryISBNNumber(xmlString);
 | ||
|     writeLanguageLibraryUse(xmlString);
 | ||
|     writePaperSize(xmlString);
 | ||
|     if(xmlString.length()>0){
 | ||
|         printString(&xmlString);
 | ||
|     }
 | ||
| }
 | ||
| void GenerateXML::writeCountryPost(UnicodeString& xmlString){
 | ||
|     UnicodeString temp;
 | ||
|     getStringRes("CountryPost",temp,UnicodeString(POST));
 | ||
|     if(temp.length()>0){
 | ||
|         xmlString.append(temp);
 | ||
|     }
 | ||
| }
 | ||
| void GenerateXML::writeCountryCar(UnicodeString& xmlString){
 | ||
|     
 | ||
|     UnicodeString temp;
 | ||
|     getStringRes("CountryCar",temp,UnicodeString(CNTRY_CAR));
 | ||
|     if(temp.length()>0){
 | ||
|         xmlString.append(temp);
 | ||
|     }
 | ||
| }
 | ||
| void GenerateXML::writeCountryISBNNumber(UnicodeString& xmlString){
 | ||
|     
 | ||
|     UnicodeString temp;
 | ||
|     getStringRes("CountryISBN",temp,UnicodeString(ISBN_NUM));
 | ||
|     if(temp.length()>0){
 | ||
|         xmlString.append(temp);
 | ||
|     }
 | ||
| }
 | ||
| void GenerateXML::writeLanguageLibraryUse(UnicodeString& xmlString){
 | ||
|     UnicodeString temp;
 | ||
|     getStringRes("LanguageLibUse",temp,UnicodeString(LANG_LIB));
 | ||
|     if(temp.length()>0){
 | ||
|         xmlString.append(temp);
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| void GenerateXML::getStringRes(const char *key,ResourceBundle& bundle,UnicodeString& xmlString,UnicodeString pattern){
 | ||
|     ResourceBundle myBundle = mSourceBundle;
 | ||
|     mSourceBundle = bundle;
 | ||
|     getStringRes(key,xmlString,pattern);
 | ||
|     mSourceBundle = myBundle;
 | ||
| }
 | ||
| void GenerateXML::getStringRes(const char* key,UnicodeString& xmlString,UnicodeString pattern){
 | ||
|     UnicodeString temp=mSourceBundle.getStringEx(key,mError);
 | ||
| 	Formattable args[]={indentOffset,""};
 | ||
| 	if(!U_FAILURE(mError)){
 | ||
| 		args[1] = temp;
 | ||
| 		xmlString.append(formatString(pattern,args,2));
 | ||
| 	}
 | ||
| 	mError = U_ZERO_ERROR;
 | ||
| }
 | ||
| 
 | ||
| */ |