ICU-1948 Update wrtjava.c and to cope with %%CollationBin move and Alias type.

X-SVN-Rev: 9081
This commit is contained in:
Ram Viswanadha 2002-07-10 20:30:56 +00:00
parent 9d7409462a
commit 92158dfa0e
6 changed files with 185 additions and 113 deletions

View File

@ -44,6 +44,8 @@ enum
ENCODING,
ICUDATADIR,
WRITE_JAVA,
PACKAGE_NAME,
BUNDLE_NAME,
COPYRIGHT
};
@ -58,12 +60,17 @@ UOption options[]={
UOPTION_ENCODING,
UOPTION_ICUDATADIR,
UOPTION_WRITE_JAVA,
UOPTION_PACKAGE_NAME,
UOPTION_BUNDLE_NAME,
UOPTION_COPYRIGHT
};
static UBool verbose = FALSE;
static UBool write_java = FALSE;
static const char* outputEnc ="";
static const char* packageName=NULL;
static const char* bundleName=NULL;
int
main(int argc,
char* argv[])
@ -106,22 +113,27 @@ main(int argc,
argv[0]);
fprintf(stderr,
"Options:\n"
"\t-h or -? or --help this usage text\n"
"\t-q or --quiet do not display warnings\n"
"\t-v or --verbose prints out extra information about processing the files\n"
"\t-V or --version prints out version number and exits\n"
"\t-c or --copyright include copyright notice\n");
"\t-h or -? or --help this usage text\n"
"\t-q or --quiet do not display warnings\n"
"\t-v or --verbose prints out extra information about processing the files\n"
"\t-V or --version prints out version number and exits\n"
"\t-c or --copyright include copyright notice\n");
fprintf(stderr,
"\t-e or --encoding encoding of source files, leave empty for system default encoding\n"
"\t NOTE: ICU must be completely built to use this option\n"
"\t-d of --destdir destination directory, followed by the path, defaults to %s\n"
"\t-s or --sourcedir source directory for files followed by path, defaults to %s\n"
"\t-i or --icudatadir directory for locating any needed intermediate data files,\n"
"\t followed by path, defaults to %s\n",
"\t-e or --encoding encoding of source files, leave empty for system default encoding\n"
"\t NOTE: ICU must be completely built to use this option\n"
"\t-d of --destdir destination directory, followed by the path, defaults to %s\n"
"\t-s or --sourcedir source directory for files followed by path, defaults to %s\n"
"\t-i or --icudatadir directory for locating any needed intermediate data files,\n"
"\t followed by path, defaults to %s\n",
u_getDataDirectory(), u_getDataDirectory(), u_getDataDirectory());
fprintf(stderr,
"\t-j or --write-java write a Java ListResourceBundle for ICU4J, followed by optional encoding\n"
"\t defaults to ASCII and \\uXXXX format.\n");
"\t-j or --write-java write a Java ListResourceBundle for ICU4J, followed by optional encoding\n"
"\t defaults to ASCII and \\uXXXX format.\n"
"\t-p or --package-name package name for writing the ListResourceBundle for ICU4J, defaults to\n"
"\t com.ibm.icu.impl.data\n"
"\t-b or --bundle-name bundle name for writing the ListResourceBundle for ICU4J, defaults to\n"
"\t LocaleElements");
return argc < 0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR;
}
@ -156,6 +168,13 @@ main(int argc,
write_java = TRUE;
outputEnc = options[WRITE_JAVA].value;
}
if(options[PACKAGE_NAME].doesOccur) {
packageName = options[PACKAGE_NAME].value;
}
if(options[BUNDLE_NAME].doesOccur) {
bundleName = options[BUNDLE_NAME].value;
}
initParser();
@ -303,7 +322,7 @@ processFile(const char *filename, const char *cp, const char *inputDir, const ch
/* Write the data to the file */
bundle_write(data, outputDir, outputFileName, sizeof(outputFileName), status);
}else{
bundle_write_java(data,outputDir,outputEnc, outputFileName, sizeof(outputFileName), status);
bundle_write_java(data,outputDir,outputEnc, outputFileName, sizeof(outputFileName),packageName,bundleName,status);
}
if (U_FAILURE(*status)) {
fprintf(stderr, "couldn't write bundle %s. Error:%s\n", outputFileName,u_errorName(*status));

View File

@ -37,7 +37,7 @@
#include "unicode/uloc.h"
/* The version of genrb */
#define GENRB_VERSION "3.2"
#define GENRB_VERSION "3.3"
#endif

View File

@ -35,7 +35,7 @@ my $pkg = "com\\ibm\\icu\\impl\\data";
my $javaDir = "$javaRootDir\\$pkg";
chdir($dataDir);
mkpath($javaDir);
my $op = "$genrb -s. -d$javaDir -j";
my $op = "$genrb -s. -d$javaDir -j -p com.ibm.icu.impl.data -b LocaleElements ";
print "Command: $op*.txt\n";
print "Directory: $dataDir\n";
my @list;
@ -115,6 +115,7 @@ foreach my $loc (sort keys %aliases) {
}
# Step 5. Patch transliteration resources.
# ICU resources have TransliterateLATIN but ICU4J resources expect Transliterate_LATIN
foreach my $file (sort @list) {
my $hasTrans = 0;
open(IN, $file) or die;

View File

@ -44,7 +44,8 @@ struct SRBRoot *bundle_open(UErrorCode *status);
void bundle_write(struct SRBRoot *bundle, const char *outputDir, char *writtenFilename, int writtenFilenameLen, UErrorCode *status);
/* write a java resource file */
void bundle_write_java(struct SRBRoot *bundle, const char *outputDir, const char* outputEnc, char *writtenFilename, int writtenFilenameLen, UErrorCode *status);
void bundle_write_java(struct SRBRoot *bundle, const char *outputDir, const char* outputEnc, char *writtenFilename,
int writtenFilenameLen, const char* packageName, const char* bundleName, UErrorCode *status);
void bundle_close(struct SRBRoot *bundle, UErrorCode *status);
void bundle_setlocale(struct SRBRoot *bundle, UChar *locale, UErrorCode *status);

View File

@ -27,6 +27,8 @@
#include "rle.h"
#include "ucol_tok.h"
#include "uhash.h"
#include "uresimp.h"
#include "unicode/ustring.h"
void res_write_java(struct SResource *res,UErrorCode *status);
@ -39,9 +41,9 @@ static const char copyRight[] =
" * Corporation and others. All Rights Reserved.\n"
" *\n"
" *******************************************************************************\n"
" * $Source: /xsrl/Nsvn/icu/icu/source/tools/genrb/wrtjava.c,v $ \n"
" * $Date: 2002/07/01 18:04:24 $ \n"
" * $Revision: 1.14 $ \n"
" * $" "Source: $ \n"
" * $" "Date: $ \n"
" * $" "Revision: $ \n"
" *******************************************************************************\n"
" */\n\n";
static const char warningMsg[] =
@ -60,8 +62,7 @@ static const char* closeBrace="}\n";
static const char* closeClass=" };\n"
"}\n";
static const char* javaClass = "package com.ibm.icu.impl.data;\n\n"
"import java.util.ListResourceBundle;\n"
static const char* javaClass = "import java.util.ListResourceBundle;\n"
"import com.ibm.icu.impl.ICUListResourceBundle;\n\n"
"public class ";
@ -75,13 +76,18 @@ static const char* javaClass1= " extends ICUListResourceBundle {\n\n"
" private static Object[][] contents = {\n";
static const char* javaClassICU= " extends ICUListResourceBundle {\n\n"
" public %s () {\n"
" contents = new Object[][] { \n";
" super.contents = data;\n"
" }\n"
" private static Object[][] data = new Object[][] { \n";
static int tabCount = 3;
static FileStream* out=NULL;
static struct SRBRoot* srBundle ;
static const char* outDir = NULL;
static const char* bName=NULL;
static const char* pName=NULL;
static void write_tabs(FileStream* os){
int i=0;
for(;i<=tabCount;i++){
@ -164,11 +170,14 @@ uCharsToChars( char* target,int32_t targetLen, UChar* source, int32_t sourceLen,
}
j+=2;
}else if(source[i-1]!='\\'){
if(j+2<targetLen){
uprv_strcat(target,"\\");
target[j+1]= (char)source[i];
}
j+=2;
}else if(source[i-1]=='\\'){
target[j++]= (char)source[i];
}
}else if(source[i]=='\\'){
if(i+1<sourceLen){
@ -251,7 +260,7 @@ strrch(const char* source,uint32_t sourceLen,char find){
}
static void
str_write_java( uint16_t* src, int32_t srcLen, UErrorCode *status){
str_write_java( uint16_t* src, int32_t srcLen, UBool printEndLine, UErrorCode *status){
uint32_t length = srcLen*8;
uint32_t bufLen = 0;
@ -266,7 +275,9 @@ str_write_java( uint16_t* src, int32_t srcLen, UErrorCode *status){
memset(buf,0,length);
bufLen = uCharsToChars(buf,length,src,srcLen,status);
write_tabs(out);
if(printEndLine) write_tabs(out);
if(U_FAILURE(*status)){
return;
}
@ -315,26 +326,96 @@ str_write_java( uint16_t* src, int32_t srcLen, UErrorCode *status){
T_FileStream_write(out,"\"",1);
T_FileStream_write(out, buf,bufLen);
}
T_FileStream_write(out,"\",\n",3);
if(printEndLine){
T_FileStream_write(out,"\",\n",3);
}else{
T_FileStream_write(out,"\"",1);
}
}
/* Writing Functions */
static void
string_write_java(struct SResource *res,UErrorCode *status) {
str_write_java(res->u.fString.fChars,res->u.fString.fLength,status);
if(uprv_strcmp(srBundle->fKeys+res->fKey,"Rule")==0){
UChar* buf = (UChar*) uprv_malloc(sizeof(UChar)*res->u.fString.fLength);
if(uprv_strcmp(srBundle->fKeys+res->fKey,"%%UCARULES")==0 ){
char fileName[1024] ={0};
const char* file = "UCARules.utf8";
FileStream* datFile = NULL;
const char* type = "new ICUListResourceBundle.ResourceString(";
char* dest = (char*) uprv_malloc( 8 * res->u.fString.fLength);
int32_t len = 0;
const UChar* src = res->u.fString.fChars;
uprv_strcat(fileName,outDir);
if(outDir[uprv_strlen(outDir)-1]!=U_FILE_SEP_CHAR){
uprv_strcat(fileName,U_FILE_SEP_STRING);
}
uprv_strcat(fileName,file);/* UCARULES.utf8 UTF-8 file */
write_tabs(out);
/* test for NULL */
if(buf == NULL) {
*status = U_MEMORY_ALLOCATION_ERROR;
T_FileStream_write(out, openBrace, (int32_t)uprv_strlen(openBrace));
tabCount++;
write_tabs(out);
T_FileStream_write(out, type, (int32_t)uprv_strlen(type));
T_FileStream_write(out, "\"", 1);
T_FileStream_write(out, file, (int32_t)uprv_strlen(file));
T_FileStream_write(out, "\")\n", 3);
tabCount--;
write_tabs(out);
T_FileStream_write(out, "},\n", 3);
datFile=T_FileStream_open(fileName,"w");
if(!dest){
*status=U_MEMORY_ALLOCATION_ERROR;
}
u_strToUTF8(dest,8*res->u.fString.fLength,&len,res->u.fString.fChars,res->u.fString.fLength,status);
if(U_FAILURE(*status)){
T_FileStream_close(datFile);
uprv_free(dest);
return;
}
T_FileStream_write(datFile,dest,len);
T_FileStream_close(datFile);
uprv_free(dest);
uprv_memcpy(buf,res->u.fString.fChars,res->u.fString.fLength);
uprv_free(buf);
}
}else{
str_write_java(res->u.fString.fChars,res->u.fString.fLength,TRUE,status);
if(uprv_strcmp(srBundle->fKeys+res->fKey,"Rule")==0){
UChar* buf = (UChar*) uprv_malloc(sizeof(UChar)*res->u.fString.fLength);
uprv_memcpy(buf,res->u.fString.fChars,res->u.fString.fLength);
uprv_free(buf);
}
}
}
static void
alias_write_java(struct SResource *res,UErrorCode *status) {
char* str = "new ICUListResourceBundle.Alias(";
write_tabs(out);
T_FileStream_write(out,str,uprv_strlen(str));
/*str_write_java(res->u.fString.fChars,res->u.fString.fLength,FALSE,status);*/
/*if(*res->u.fString.fChars == RES_PATH_SEPARATOR) {
/* there is a path included
locale = u_strchr(res->u.fString.fChars +1, RES_PATH_SEPARATOR);
*locale = 0;
locale++;
T_FileStream_write(out,"\"/",2);
T_FileStream_write(out,apName,(int32_t)uprv_strlen(apName));
T_FileStream_write(out,"/",1);
T_FileStream_write(out,abName,(int32_t)uprv_strlen(abName));
T_FileStream_write(out,"/\"+",3);
str_write_java(locale,res->u.fString.fLength-(locale-res->u.fString.fChars),FALSE,status);
} else {
str_write_java(res->u.fString.fChars,res->u.fString.fLength,FALSE,status);
}*/
str_write_java(res->u.fString.fChars,res->u.fString.fLength,FALSE,status);
T_FileStream_write(out,"),\n",3);
}
static void
@ -346,7 +427,7 @@ array_write_java( struct SResource *res, UErrorCode *status) {
struct SResource *first =NULL;
UBool decrementTabs = FALSE;
UBool allStrings = TRUE;
if (U_FAILURE(*status)) {
return;
}
@ -394,8 +475,10 @@ array_write_java( struct SResource *res, UErrorCode *status) {
T_FileStream_write(out,"},\n",3);
} else {
/* array is empty */
write_tabs(out);
T_FileStream_write(out,arr,uprv_strlen(arr));
write_tabs(out);
T_FileStream_write(out,"},\n",3);
}
}
@ -456,22 +539,23 @@ int_write_java(struct SResource *res,UErrorCode *status) {
static void
bin_write_java( struct SResource *res, UErrorCode *status) {
const char* arr ="new Object[][]{\n";
const char* type = "COMPRESSED_BINARY, ";
const char* type = "new ICUListResourceBundle.CompressedBinary(";
const char* ext;
int32_t srcLen=res->u.fBinaryValue.fLength;
if(srcLen>0 ){
uint16_t* target=NULL;
uint16_t* saveTarget = NULL;
int32_t tgtLen = 0;
char* dest = NULL;
if(uprv_strcmp(srBundle->fKeys+res->fKey,"%%CollationBin")==0 || uprv_strcmp(srBundle->fKeys+res->fKey,"BreakDictionaryData")==0){
char fileName[1024] ={0};
char fn[1024] = {0};
FileStream* datFile = NULL;
if(uprv_strcmp(srBundle->fKeys+res->fKey,"BreakDictionaryData")==0){
uprv_strcat(fileName,"BreakDictionaryData");
ext = ".ucs";
ext = ".bin";
}else{
uprv_strcat(fileName,"CollationElements");
ext=".res";
@ -488,35 +572,24 @@ bin_write_java( struct SResource *res, UErrorCode *status) {
uprv_strcat(fn,U_FILE_SEP_STRING);
}
uprv_strcat(fn,fileName);
type = "RESOURCE_BINARY,";
write_tabs(out);
T_FileStream_write(out, arr, (int32_t)uprv_strlen(arr));
tabCount++;
write_tabs(out);
T_FileStream_write(out, openBrace, (int32_t)uprv_strlen(openBrace));
tabCount++;
type = "new ICUListResourceBundle.ResourceBinary(";
write_tabs(out);
T_FileStream_write(out, type, (int32_t)uprv_strlen(type));
T_FileStream_write(out, "\"", 1);
T_FileStream_write(out, fileName, (int32_t)uprv_strlen(fileName));
T_FileStream_write(out, "\"\n", 2);
tabCount--;
write_tabs(out);
T_FileStream_write(out, "},\n", 3);
tabCount--;
write_tabs(out);
T_FileStream_write(out, "},\n", 3);
T_FileStream_write(out, "\"),\n", 4);
datFile=T_FileStream_open(fn,"w");
T_FileStream_write(datFile, res->u.fBinaryValue.fData, res->u.fBinaryValue.fLength);
T_FileStream_close(datFile);
}else{
if(uprv_strcmp(srBundle->fKeys+res->fKey, "BreakDictionaryData")==0){
if(uprv_strcmp(srBundle->fKeys+res->fKey, "%%")==0){
srcLen = res->u.fBinaryValue.fLength/2;
target = (uint16_t*)malloc(sizeof(uint16_t) * srcLen);
if(target){
saveTarget = target;
type = "COMPRESSED_STRING, ";
type = "new ICUListResourceBundle.CompressedString(\n";
tgtLen = usArrayToRLEString((uint16_t*)res->u.fBinaryValue.fData,
srcLen,target, srcLen, status);
if(U_FAILURE(*status)){
@ -610,52 +683,23 @@ bin_write_java( struct SResource *res, UErrorCode *status) {
write_tabs(out);
T_FileStream_write(out, arr, (int32_t)uprv_strlen(arr));
tabCount++;
write_tabs(out);
T_FileStream_write(out, openBrace, (int32_t)uprv_strlen(openBrace));
tabCount++;
write_tabs(out);
T_FileStream_write(out, type, (int32_t)uprv_strlen(type));
str_write_java(target, tgtLen, status);
tabCount--;
T_FileStream_write(out, "\n", 1);
tabCount++;
write_tabs(out);
T_FileStream_write(out, "},\n", 3);
str_write_java(target, tgtLen,FALSE, status);
tabCount--;
write_tabs(out);
T_FileStream_write(out, "},\n", 3);
T_FileStream_write(out, "),\n", 3);
free(target);
}
}else{
write_tabs(out);
T_FileStream_write(out,type,uprv_strlen(type));
T_FileStream_write(out,"null),\n",7);
}
/* uprv_strcpy(buffer,"(byte) 0x");
if(res->u.fBinaryValue.fLength>0 ){
write_tabs(out);
T_FileStream_write(out,byte,uprv_strlen(byte));
tabCount++;
write_tabs(out);
while(i<res->u.fBinaryValue.fLength){
uint8_t data= res->u.fBinaryValue.fData[i];
buffer[9] =0;
len=itostr(&buffer[9],data,16,2);
T_FileStream_write(out,buffer,len+9);
T_FileStream_write(out,", ",2);
if(count==10){
count=0;
T_FileStream_write(out,"\n",1);
write_tabs(out);
}
count++;
i++;
}
T_FileStream_write(out,"\n",1);
tabCount--;
write_tabs(out);
T_FileStream_write(out,"},\n",3);
}*/
}
@ -720,7 +764,11 @@ table_write_java(struct SResource *res, UErrorCode *status) {
}
} else {
/* table is empty */
write_tabs(out);
T_FileStream_write(out,obj,uprv_strlen(obj));
write_tabs(out);
T_FileStream_write(out,"},\n",3);
}
@ -738,6 +786,9 @@ res_write_java(struct SResource *res,UErrorCode *status) {
case RES_STRING:
string_write_java (res, status);
return;
case RES_ALIAS:
alias_write_java (res, status);
return;
case RES_INT_VECTOR:
intvector_write_java (res, status);
return;
@ -763,14 +814,21 @@ res_write_java(struct SResource *res,UErrorCode *status) {
}
void
bundle_write_java(struct SRBRoot *bundle, const char *outputDir,const char* outputEnc, char *writtenFilename, int writtenFilenameLen, UErrorCode *status) {
bundle_write_java(struct SRBRoot *bundle, const char *outputDir,const char* outputEnc,
char *writtenFilename, int writtenFilenameLen,
const char* packageName, const char* bundleName,
UErrorCode *status) {
char fileName[256] = {'\0'};
char className[256]={'\0'};
char constructor[1000] = { 0 };
UBool j1 =FALSE;
outDir = outputDir;
uprv_strcpy(className, "LocaleElements");
bName = (bundleName==NULL) ? "LocaleElements" : bundleName;
pName = (packageName==NULL)? "com.ibm.icu.impl.data" : packageName;
uprv_strcpy(className, bName);
srBundle = bundle;
if(uprv_strcmp(srBundle->fLocale,"root")!=0){
uprv_strcat(className,"_");
@ -806,6 +864,9 @@ bundle_write_java(struct SRBRoot *bundle, const char *outputDir,const char* outp
T_FileStream_write(out, copyRight, (int32_t)uprv_strlen(copyRight));
T_FileStream_write(out, warningMsg, (int32_t)uprv_strlen(warningMsg));
}
T_FileStream_write(out,"package ",(int32_t)uprv_strlen("package "));
T_FileStream_write(out,pName,(int32_t)uprv_strlen(pName));
T_FileStream_write(out,";\n\n",3);
T_FileStream_write(out, javaClass, (int32_t)uprv_strlen(javaClass));
T_FileStream_write(out, className, (int32_t)uprv_strlen(className));
if(j1){
@ -824,19 +885,8 @@ bundle_write_java(struct SRBRoot *bundle, const char *outputDir,const char* outp
}
}
res_write_java(bundle->fRoot, status);
if(j1){
T_FileStream_write(out, closeClass, (int32_t)uprv_strlen(closeClass));
}else{
tabCount--;
write_tabs(out);
T_FileStream_write(out,"};\n",3);
tabCount--;
write_tabs(out);
T_FileStream_write(out, closeBrace, (int32_t)uprv_strlen(closeBrace));
T_FileStream_write(out, closeBrace, (int32_t)uprv_strlen(closeBrace));
}
T_FileStream_write(out, closeClass, (int32_t)uprv_strlen(closeClass));
T_FileStream_close(out);

View File

@ -73,8 +73,9 @@ struct UOption {
#define UOPTION_SOURCEDIR UOPTION_DEF("sourcedir", 's', UOPT_REQUIRES_ARG)
#define UOPTION_ENCODING UOPTION_DEF("encoding", 'e', UOPT_REQUIRES_ARG)
#define UOPTION_ICUDATADIR UOPTION_DEF("icudatadir", 'i', UOPT_REQUIRES_ARG)
#define UOPTION_WRITE_JAVA UOPTION_DEF("write-java", 'j', UOPT_NO_ARG)
#define UOPTION_WRITE_JAVA UOPTION_DEF("write-java", 'j', UOPT_OPTIONAL_ARG)
#define UOPTION_PACKAGE_NAME UOPTION_DEF("package-name", 'p', UOPT_REQUIRES_ARG)
#define UOPTION_BUNDLE_NAME UOPTION_DEF("bundle-name", 'b', UOPT_REQUIRES_ARG)
/**
* C Command line argument parser.