Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/Firefox/intl/icu/source/tools/genrb/   (Browser von der Mozilla Stiftung Version 136.0.1©)  Datei vom 10.2.2025 mit Größe 20 kB image not shown  

Quelle  wrtjava.cpp   Sprache: C

 
// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/*
*******************************************************************************
*
*   Copyright (C) 2000-2015, International Business Machines
*   Corporation and others.  All Rights Reserved.
*
*******************************************************************************
*
* File wrtjava.cpp
*
* Modification History:
*
*   Date        Name        Description
*   01/11/02    Ram         Creation.
*   02/12/08    Spieth      Fix errant 'new Object[][]{' insertion
*   02/19/08    Spieth      Removed ICUListResourceBundle dependency
*******************************************************************************
*/


#include <assert.h>
#include "unicode/unistr.h"
#include "reslist.h"
#include "unewdata.h"
#include "unicode/ures.h"
#include "errmsg.h"
#include "filestrm.h"
#include "cstring.h"
#include "unicode/ucnv.h"
#include "genrb.h"
#include "rle.h"
#include "uhash.h"
#include "uresimp.h"
#include "unicode/ustring.h"
#include "unicode/utf8.h"

void res_write_java(struct SResource *res,UErrorCode *status);


static const char copyRight[] =
    "/* \n"
    " *******************************************************************************\n"
    " *\n"
    " * Copyright (C) International Business Machines\n"
    " * Corporation and others. All Rights Reserved.\n"
    " *\n"
    " *******************************************************************************\n"
    " * $" "Source: $ \n"
    " * $" "Date: $ \n"
    " * $" "Revision: $ \n"
    " *******************************************************************************\n"
    " */\n\n";
static const char warningMsg[] =
    "/*********************************************************************\n"
    "######################################################################\n"
    "\n"
    " WARNING: This file is generated by genrb Version " GENRB_VERSION ".\n"
    " If you edit this file, please make sure that, the source\n"
    " of this file (XXXX.txt in LocaleElements_XXXX.java)\n"
    " is also edited.\n"
    "######################################################################\n"
    " *********************************************************************\n"
    " */\n\n";
static const char* openBrace="{\n";
static const char* closeClass=" };\n"
                              "}\n";

static const char* javaClass =  "import java.util.ListResourceBundle;\n\n"
                                "public class ";

static const char* javaClass1=  " extends ListResourceBundle {\n\n"
                                " /**\n"
                                " * Overrides ListResourceBundle \n"
                                " */\n"
                                " public final Object[][] getContents() { \n"
                                " return contents;\n"
                                " }\n\n"
                                " private static Object[][] contents = {\n";
/*static const char* javaClassICU= " extends ListResourceBundle {\n\n"
                                 "    public %s  () {\n"
                                 "          super.contents = data;\n"
                                 "    }\n"
                                 "    static final Object[][] data = new Object[][] { \n";*/

static int tabCount = 3;

static FileStream* out=nullptr;
static struct SRBRoot* srBundle ;
/*static const char* outDir = nullptr;*/

static const char* bName=nullptr;
static const char* pName=nullptr;

static void write_tabs(FileStream* os){
    int i=0;
    for(;i<=tabCount;i++){
        T_FileStream_write(os," ",4);
    }
}

#define ZERO 0x30

static const char* enc ="";
static UConverter* conv = nullptr;

static int32_t
uCharsToChars(char *target, int32_t targetLen, const char16_t *source, int32_t sourceLen, UErrorCode *status) {
    int i=0, j=0;
    char str[30]={'\0'};
    while(i<sourceLen){
        if (source[i] == '\n') {
            if (j + 2 < targetLen) {
                uprv_strcat(target, "\\n");
            }
            j += 2;
        }else if(source[i]==0x0D){
            if(j+2<targetLen){
                uprv_strcat(target,"\\f");
            }
            j+=2;
        }else if(source[i] == '"'){
            if(source[i-1]=='\''){
                if(j+2<targetLen){
                    uprv_strcat(target,"\\");
                    target[j + 1] = static_cast<char>(source[i]);
                }
                j+=2;
            }else if(source[i-1]!='\\'){

                if(j+2<targetLen){
                    uprv_strcat(target,"\\");
                    target[j + 1] = static_cast<char>(source[i]);
                }
                j+=2;
            }else if(source[i-1]=='\\'){
                target[j++] = static_cast<char>(source[i]);
            }
        }else if(source[i]=='\\'){
            if(i+1<sourceLen){
                switch(source[i+1]){
                case ',':
                case '!':
                case '?':
                case '#':
                case '.':
                case '%':
                case '&':
                case ':':
                case ';':
                    if(j+2<targetLen){
                       uprv_strcat(target,"\\\\");
                    }
                    j+=2;
                    break;
                case '"':
                case '\'':
                    if(j+3<targetLen){
                       uprv_strcat(target,"\\\\\\");
                    }
                    j+=3;
                    break;
                default :
                    if(j<targetLen){
                        target[j] = static_cast<char>(source[i]);
                    }
                    j++;
                    break;
                }
            }else{
                if(j<targetLen){
                    uprv_strcat(target,"\\\\");
                }
                j+=2;
            }
        }else if(source[i]>=0x20 && source[i]<0x7F/*ASCII*/){
            if(j<targetLen){
                target[j] = static_cast<char>(source[i]);
            }
            j++;
        }else{
            if(*enc =='\0' || source[i]==0x0000){
                uprv_strcpy(str,"\\u");
                itostr(str+2,source[i],16,4);
                if(j+6<targetLen){
                    uprv_strcat(target,str);
                }
                j+=6;
            }else{
                char dest[30] = {0};
                int retVal=ucnv_fromUChars(conv,dest,30,source+i,1,status);
                if(U_FAILURE(*status)){
                    return 0;
                }
                if(j+retVal<targetLen){
                    uprv_strcat(target,dest);
                }
                j+=retVal;
            }
        }
        i++;
    }
    return j;
}


static uint32_t
strrch(const char* source,uint32_t sourceLen,char find){
    const char* tSourceEnd =source + (sourceLen-1);
    while(tSourceEnd>= source){
        if(*tSourceEnd==find){
            return static_cast<uint32_t>(tSourceEnd - source);
        }
        tSourceEnd--;
    }
    return static_cast<uint32_t>(tSourceEnd - source);
}

static int32_t getColumnCount(int32_t len){
    int32_t columnCount = 80;
    int32_t maxLines = 3000;
    int32_t adjustedLen = len*5; /* assume that every codepoint is represented in \uXXXX format*/
    /*
     * calculate the number of lines that
     * may be required if column count is 80
     */

    if (maxLines  < (adjustedLen / columnCount) ){
        columnCount = adjustedLen / maxLines;
    }
    return columnCount;
}
static void
str_write_java(const char16_t *src, int32_t srcLen, UBool printEndLine, UErrorCode *status) {

    uint32_t length = srcLen*8;
    uint32_t bufLen = 0;
    uint32_t columnCount;
    char* buf = static_cast<char*>(malloc(sizeof(char) * length));

    if(buf == nullptr) {
        *status = U_MEMORY_ALLOCATION_ERROR;
        return;
    }

    columnCount = getColumnCount(srcLen);
    memset(buf,0,length);

    bufLen = uCharsToChars(buf,length,src,srcLen,status);
    // buflen accounts for extra bytes added due to multi byte encoding of
    //        non ASCII characters
    if(printEndLine)
        write_tabs(out);

    if(U_FAILURE(*status)){
        uprv_free(buf);
        return;
    }

    if(bufLen+(tabCount*4) > columnCount  ){
        uint32_t len = 0;
        char* current = buf;
        uint32_t add;
        while(len < bufLen){
            add = columnCount-(tabCount*4)-5/* for ", +\n */;
            current = buf +len;
            if (add < (bufLen-len)) {
                uint32_t idx = strrch(current,add,'\\');
                if (idx > add) {
                    idx = add;
                } else {
                    int32_t num =idx-1;
                    uint32_t seqLen;
                    while(num>0){
                        if(current[num]=='\\'){
                            num--;
                        }else{
                            break;
                        }
                    }
                    if ((idx-num)%2==0) {
                        idx--;
                    }
                    seqLen = (current[idx+1]=='u') ? 6 : 2;
                    if ((add-idx) < seqLen) {
                        add = idx + seqLen;
                    }
                }
            }
            T_FileStream_write(out,"\"",1);
            uint32_t byteIndex = 0;
            uint32_t trailBytes = 0;
            if(len+add<bufLen){
                // check the trail bytes to be added to the output line
                while (byteIndex < add) {
                    if (U8_IS_LEAD(*(current + byteIndex))) {
                        trailBytes = U8_COUNT_TRAIL_BYTES(*(current + byteIndex));
                        add += trailBytes;
                    }
                    byteIndex++;
                }
                T_FileStream_write(out,current,add);
                if (len + add < bufLen) {
                    T_FileStream_write(out,"\" +\n",4);
                    write_tabs(out);
                }
            }else{
                T_FileStream_write(out,current,bufLen-len);
            }
            len+=add;
        }
    }else{
        T_FileStream_write(out,"\"",1);
        T_FileStream_write(out, buf,bufLen);
    }
    if(printEndLine){
        T_FileStream_write(out,"\",\n",3);
    }else{
        T_FileStream_write(out,"\"",1);
    }
    uprv_free(buf);
}

/* Writing Functions */
static void
string_write_java(const StringResource *res,UErrorCode *status) {
    (void)res->getKeyString(srBundle);

    str_write_java(res->getBuffer(), res->length(), true, status);
}

static void
array_write_java(const ArrayResource *res, UErrorCode *status) {

    const char* arr ="new String[] { \n";
    struct SResource *current = nullptr;
    UBool allStrings    = true;

    if (U_FAILURE(*status)) {
        return;
    }

    if (res->fCount > 0) {

        current = res->fFirst;
        while(current != nullptr){
            if(!current->isString()){
                allStrings = false;
                break;
            }
            current= current->fNext;
        }

        current = res->fFirst;
        if(allStrings==false){
            const char* object = "new Object[]{\n";
            write_tabs(out);
            T_FileStream_write(out, object, static_cast<int32_t>(uprv_strlen(object)));
            tabCount++;
        }else{
            write_tabs(out);
            T_FileStream_write(out, arr, static_cast<int32_t>(uprv_strlen(arr)));
            tabCount++;
        }
        while (current != nullptr) {
            /*if(current->isString()){
                write_tabs(out);
            }*/

            res_write_java(current, status);
            if(U_FAILURE(*status)){
                return;
            }
            current = current->fNext;
        }
        T_FileStream_write(out,"\n",1);

        tabCount--;
        write_tabs(out);
        T_FileStream_write(out,"},\n",3);

    } else {
        write_tabs(out);
        T_FileStream_write(out, arr, static_cast<int32_t>(uprv_strlen(arr)));
        write_tabs(out);
        T_FileStream_write(out,"},\n",3);
    }
}

static void
intvector_write_java(const IntVectorResource *res, UErrorCode * /*status*/) {
    uint32_t i = 0;
    const char* intArr = "new int[] {\n";
    /* const char* intC   = "new Integer(";   */
    const char* stringArr = "new String[]{\n";
    const char *resname = res->getKeyString(srBundle);
    char buf[100];
    int len =0;
    buf[0]=0;
    write_tabs(out);

    if(resname != nullptr && uprv_strcmp(resname,"DateTimeElements")==0){
        T_FileStream_write(out, stringArr, static_cast<int32_t>(uprv_strlen(stringArr)));
        tabCount++;
        for(i = 0; i<res->fCount; i++) {
            write_tabs(out);
            len=itostr(buf,res->fArray[i],10,0);
            T_FileStream_write(out,"\"",1);
            T_FileStream_write(out,buf,len);
            T_FileStream_write(out,"\",",2);
            T_FileStream_write(out,"\n",1);
        }
    }else{
        T_FileStream_write(out, intArr, static_cast<int32_t>(uprv_strlen(intArr)));
        tabCount++;
        for(i = 0; i<res->fCount; i++) {
            write_tabs(out);
            /* T_FileStream_write(out, intC, (int32_t)uprv_strlen(intC)); */
            len=itostr(buf,res->fArray[i],10,0);
            T_FileStream_write(out,buf,len);
            /* T_FileStream_write(out,"),",2);  */
            /* T_FileStream_write(out,"\n",1);  */
            T_FileStream_write(out,",\n",2);
        }
    }
    tabCount--;
    write_tabs(out);
    T_FileStream_write(out,"},\n",3);
}

static void
int_write_java(const IntResource *res, UErrorCode * /*status*/) {
    const char* intC   =  "new Integer(";
    char buf[100];
    int len =0;
    buf[0]=0;

    /* write the binary data */
    write_tabs(out);
    T_FileStream_write(out, intC, static_cast<int32_t>(uprv_strlen(intC)));
    len=itostr(buf, res->fValue, 10, 0);
    T_FileStream_write(out,buf,len);
    T_FileStream_write(out,"),\n",3 );

}

static void
bytes_write_java(const BinaryResource *res, UErrorCode * /*status*/) {
 const char* type  = "new byte[] {";
 const char* byteDecl = "%i, ";
    char byteBuffer[100] = { 0 };
 uint8_t*  byteArray = nullptr;
    int byteIterator = 0;
    int32_t srcLen=res->fLength;
    if(srcLen>0 )
 {
        byteArray = res->fData;

        write_tabs(out);
        T_FileStream_write(out, type, static_cast<int32_t>(uprv_strlen(type)));
        T_FileStream_write(out, "\n", 1);
        tabCount++;

  for (;byteIterator<srcLen;byteIterator++)
  {
            if (byteIterator%16 == 0)
   {
       write_tabs(out);
   }

   if (byteArray[byteIterator] < 128)
   {
                snprintf(byteBuffer, sizeof(byteBuffer), byteDecl, byteArray[byteIterator]);
   }
   else
   {
                snprintf(byteBuffer, sizeof(byteBuffer), byteDecl, (byteArray[byteIterator]-256));
   }

            T_FileStream_write(out, byteBuffer, static_cast<int32_t>(uprv_strlen(byteBuffer)));

   if (byteIterator%16 == 15)
   {
                T_FileStream_write(out, "\n", 1);
   }

  }

        if (((byteIterator-1)%16) != 15)
  {
            T_FileStream_write(out, "\n", 1);
     }

  tabCount--;
        write_tabs(out);
  T_FileStream_write(out, "},\n", 3);

 }
 else
    {
  /* Empty array */
        write_tabs(out);
        T_FileStream_write(out, type, static_cast<int32_t>(uprv_strlen(type)));
  T_FileStream_write(out,"},\n",3);
    }

}

static UBool start = true;

static void
table_write_java(const TableResource *res, UErrorCode *status) {
    uint32_t  i         = 0;
    struct SResource *current = nullptr;
    const char* obj = "new Object[][]{\n";

    if (U_FAILURE(*status)) {
        return ;
    }

    if (res->fCount > 0) {
        if(start==false){
            write_tabs(out);
            T_FileStream_write(out, obj, static_cast<int32_t>(uprv_strlen(obj)));
            tabCount++;
        }
        start = false;
        current = res->fFirst;
        i       = 0;


        while (current != nullptr) {
            const char *currentKeyString = current->getKeyString(srBundle);

            assert(i < res->fCount);
            write_tabs(out);

            T_FileStream_write(out, openBrace, 2);


            tabCount++;

            write_tabs(out);
            if(currentKeyString != nullptr) {
                T_FileStream_write(out, "\"", 1);
                T_FileStream_write(out, currentKeyString,
                                   static_cast<int32_t>(uprv_strlen(currentKeyString)));
                T_FileStream_write(out, "\",\n", 2);

                T_FileStream_write(out, "\n", 1);
            }
            res_write_java(current, status);
            if(U_FAILURE(*status)){
                return;
            }
            i++;
            current = current->fNext;
            tabCount--;
            write_tabs(out);
            T_FileStream_write(out, "},\n", 3);
        }
        if(tabCount>4){
            tabCount--;
            write_tabs(out);
            T_FileStream_write(out, "},\n", 3);
        }

    } else {
        write_tabs(out);
        T_FileStream_write(out, obj, static_cast<int32_t>(uprv_strlen(obj)));

        write_tabs(out);
        T_FileStream_write(out,"},\n",3);

    }

}

void
res_write_java(struct SResource *res,UErrorCode *status) {

    if (U_FAILURE(*status)) {
        return ;
    }

    if (res != nullptr) {
        switch (res->fType) {
        case URES_STRING:
             string_write_java    (static_cast<const StringResource *>(res), status);
             return;
        case URES_ALIAS:
             printf("Encountered unsupported resource type %d of alias\n", res->fType);
             *status = U_UNSUPPORTED_ERROR;
    return;
        case URES_INT_VECTOR:
             intvector_write_java (static_cast<const IntVectorResource *>(res), status);
             return;
        case URES_BINARY:
             bytes_write_java     (static_cast<const BinaryResource *>(res), status);
             return;
        case URES_INT:
             int_write_java       (static_cast<const IntResource *>(res), status);
             return;
        case URES_ARRAY:
             array_write_java     (static_cast<const ArrayResource *>(res), status);
             return;
        case URES_TABLE:
             table_write_java     (static_cast<const TableResource *>(res), status);
             return;
        default:
            break;
        }
    }

    *status = U_INTERNAL_PROGRAM_ERROR;
}

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) {

    char fileName[256] = {'\0'};
    char className[256]={'\0'};
    /*char constructor[1000] = { 0 };*/
    /*UBool j1 =false;*/
    /*outDir = outputDir;*/

    start = true;                        /* Reset the start indicator*/

    bName = (bundleName==nullptr) ? "LocaleElements" : bundleName;
    pName = (packageName==nullptr)? "com.ibm.icu.impl.data" : packageName;

    uprv_strcpy(className, bName);
    srBundle = bundle;
    if(uprv_strcmp(srBundle->fLocale,"root")!=0){
        uprv_strcat(className,"_");
        uprv_strcat(className,srBundle->fLocale);
    }
    if(outputDir){
        uprv_strcpy(fileName, outputDir);
        if(outputDir[uprv_strlen(outputDir)-1] !=U_FILE_SEP_CHAR){
            uprv_strcat(fileName,U_FILE_SEP_STRING);
        }
        uprv_strcat(fileName,className);
        uprv_strcat(fileName,".java");
    }else{
        uprv_strcat(fileName,className);
        uprv_strcat(fileName,".java");
    }

    if (writtenFilename) {
        uprv_strncpy(writtenFilename, fileName, writtenFilenameLen);
    }

    if (U_FAILURE(*status)) {
        return;
    }

    out= T_FileStream_open(fileName,"w");

    if(out==nullptr){
        *status = U_FILE_ACCESS_ERROR;
        return;
    }
    if(getIncludeCopyright()){
        T_FileStream_write(out, copyRight, static_cast<int32_t>(uprv_strlen(copyRight)));
        T_FileStream_write(out, warningMsg, static_cast<int32_t>(uprv_strlen(warningMsg)));
    }
    T_FileStream_write(out, "package "static_cast<int32_t>(uprv_strlen("package ")));
    T_FileStream_write(out, pName, static_cast<int32_t>(uprv_strlen(pName)));
    T_FileStream_write(out,";\n\n",3);
    T_FileStream_write(out, javaClass, static_cast<int32_t>(uprv_strlen(javaClass)));
    T_FileStream_write(out, className, static_cast<int32_t>(uprv_strlen(className)));
    T_FileStream_write(out, javaClass1, static_cast<int32_t>(uprv_strlen(javaClass1)));

    /* if(j1){
          T_FileStream_write(out, javaClass1, (int32_t)uprv_strlen(javaClass1));
       }else{
           sprintf(constructor,javaClassICU,className);
           T_FileStream_write(out, constructor, (int32_t)uprv_strlen(constructor));
       }
    */


    if(outputEnc && *outputEnc!='\0'){
        /* store the output encoding */
        enc = outputEnc;
        conv=ucnv_open(enc,status);
        if(U_FAILURE(*status)){
            return;
        }
    }
    res_write_java(bundle->fRoot, status);

    T_FileStream_write(out, closeClass, static_cast<int32_t>(uprv_strlen(closeClass)));

    T_FileStream_close(out);

    ucnv_close(conv);
}

Messung V0.5
C=95 H=94 G=94

¤ Dauer der Verarbeitung: 0.9 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.