X-Git-Url: https://git.saurik.com/apple/icu.git/blobdiff_plain/b75a7d8f3b4adbae880cab104ce2c6a50eee4db2..38fbf2fd31f5cd99b500914d6037b1d06b608645:/icuSources/tools/genccode/genccode.c diff --git a/icuSources/tools/genccode/genccode.c b/icuSources/tools/genccode/genccode.c index 6b9fc166..d35b5890 100644 --- a/icuSources/tools/genccode/genccode.c +++ b/icuSources/tools/genccode/genccode.c @@ -1,112 +1,106 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* -******************************************************************************* -* -* Copyright (C) 1999-2003, International Business Machines -* Corporation and others. All Rights Reserved. -* -******************************************************************************* -* file name: gennames.c -* encoding: US-ASCII -* tab size: 8 (not used) -* indentation:4 -* -* created on: 1999nov01 -* created by: Markus W. Scherer -* -* This program reads a binary file and creates a C source code file -* with a byte array that contains the data of the binary file. -* -* 12/09/1999 weiv Added multiple file handling -*/ + ******************************************************************************* + * Copyright (C) 1999-2016, International Business Machines + * Corporation and others. All Rights Reserved. + ******************************************************************************* + * file name: gennames.c + * encoding: UTF-8 + * tab size: 8 (not used) + * indentation:4 + * + * created on: 1999nov01 + * created by: Markus W. Scherer + * + * This program reads a binary file and creates a C source code file + * with a byte array that contains the data of the binary file. + * + * 12/09/1999 weiv Added multiple file handling + */ -#ifdef WIN32 +#include "unicode/utypes.h" + +#if U_PLATFORM_HAS_WIN32_API # define VC_EXTRALEAN # define WIN32_LEAN_AND_MEAN -# define NOGDI # define NOUSER # define NOSERVICE # define NOIME # define NOMCX #include #include +#endif -/* _M_IA64 should be defined in windows.h */ -#ifdef _M_IA64 -# define ICU_OBJECT_MACHINE_TYPE IMAGE_FILE_MACHINE_IA64 -# define ICU_ENTRY_OFFSET 0 -#else -# define ICU_OBJECT_MACHINE_TYPE IMAGE_FILE_MACHINE_I386 -# define ICU_ENTRY_OFFSET 1 +#if U_PLATFORM_IS_LINUX_BASED && U_HAVE_ELF_H +# define U_ELF #endif +#ifdef U_ELF +# include +# if defined(ELFCLASS64) +# define U_ELF64 +# endif + /* Old elf.h headers may not have EM_X86_64, or have EM_X8664 instead. */ +# ifndef EM_X86_64 +# define EM_X86_64 62 +# endif +# define ICU_ENTRY_OFFSET 0 #endif #include #include -#include "unicode/utypes.h" #include "unicode/putil.h" #include "cmemory.h" #include "cstring.h" #include "filestrm.h" #include "toolutil.h" +#include "unicode/uclean.h" #include "uoptions.h" - -#define MAX_COLUMN ((uint32_t)(0xFFFFFFFFU)) - -static uint32_t column=MAX_COLUMN; - -#ifdef WIN32 -#define CAN_GENERATE_OBJECTS -#endif - -/* prototypes --------------------------------------------------------------- */ - -static void -writeCCode(const char *filename, const char *destdir); - +#include "pkg_genc.h" + +enum { + kOptHelpH = 0, + kOptHelpQuestionMark, + kOptDestDir, + kOptName, + kOptEntryPoint, #ifdef CAN_GENERATE_OBJECTS -static void -writeObjectCode(const char *filename, const char *destdir); + kOptObject, + kOptMatchArch, #endif - -static void -getOutFilename(const char *inFilename, const char *destdir, char *outFilename, char *entryName, const char *newSuffix); - -static void -write8(FileStream *out, uint8_t byte); - -#ifdef OS400 -static void -write8str(FileStream *out, uint8_t byte); -#endif -/* -------------------------------------------------------------------------- */ + kOptFilename, + kOptAssembly +}; static UOption options[]={ /*0*/UOPTION_HELP_H, UOPTION_HELP_QUESTION_MARK, UOPTION_DESTDIR, UOPTION_DEF("name", 'n', UOPT_REQUIRES_ARG), - UOPTION_DEF( "entrypoint", 'e', UOPT_REQUIRES_ARG) + UOPTION_DEF("entrypoint", 'e', UOPT_REQUIRES_ARG), #ifdef CAN_GENERATE_OBJECTS -/*5*/, UOPTION_DEF("object", 'o', UOPT_NO_ARG) +/*5*/UOPTION_DEF("object", 'o', UOPT_NO_ARG), + UOPTION_DEF("match-arch", 'm', UOPT_REQUIRES_ARG), #endif - + UOPTION_DEF("filename", 'f', UOPT_REQUIRES_ARG), + UOPTION_DEF("assembly", 'a', UOPT_REQUIRES_ARG) }; -char symPrefix[100]; - +#define CALL_WRITECCODE 'c' +#define CALL_WRITEASSEMBLY 'a' +#define CALL_WRITEOBJECT 'o' extern int main(int argc, char* argv[]) { UBool verbose = TRUE; + char writeCode; U_MAIN_INIT_ARGS(argc, argv); - options[2].value = "."; + options[kOptDestDir].value = "."; /* read command line options */ - argc=u_parseArgs(argc, argv, sizeof(options)/sizeof(options[0]), options); - - symPrefix[0] = 0; + argc=u_parseArgs(argc, argv, UPRV_LENGTHOF(options), options); /* error handling, printing usage message */ if(argc<0) { @@ -114,7 +108,7 @@ main(int argc, char* argv[]) { "error in command line argument \"%s\"\n", argv[-argc]); } - if(argc<0 || options[0].doesOccur || options[1].doesOccur) { + if(argc<0 || options[kOptHelpH].doesOccur || options[kOptHelpQuestionMark].doesOccur) { fprintf(stderr, "usage: %s [-options] filename1 filename2 ...\n" "\tread each binary input file and \n" @@ -123,369 +117,83 @@ main(int argc, char* argv[]) { "\t-h or -? or --help this usage text\n" "\t-d or --destdir destination directory, followed by the path\n" "\t-n or --name symbol prefix, followed by the prefix\n" - "\t-e or --entrypoint entry point name, followed by the name\n" + "\t-e or --entrypoint entry point name, followed by the name (_dat will be appended)\n" "\t-r or --revision Specify a version\n" + , argv[0]); #ifdef CAN_GENERATE_OBJECTS + fprintf(stderr, "\t-o or --object write a .obj file instead of .c\n" + "\t-m or --match-arch file.o match the architecture (CPU, 32/64 bits) of the specified .o\n" + "\t ELF format defaults to i386. Windows defaults to the native platform.\n"); #endif - , argv[0]); + fprintf(stderr, + "\t-f or --filename Specify an alternate base filename. (default: symbolname_typ)\n" + "\t-a or --assembly Create assembly file. (possible values are: "); + + printAssemblyHeadersToStdErr(); } else { const char *message, *filename; - void (*writeCode)(const char *, const char *); + /* TODO: remove void (*writeCode)(const char *, const char *); */ + + if(options[kOptAssembly].doesOccur) { + message="generating assembly code for %s\n"; + writeCode = CALL_WRITEASSEMBLY; + /* TODO: remove writeCode=&writeAssemblyCode; */ + + if (!checkAssemblyHeaderName(options[kOptAssembly].value)) { + fprintf(stderr, + "Assembly type \"%s\" is unknown.\n", options[kOptAssembly].value); + return -1; + } + } #ifdef CAN_GENERATE_OBJECTS - if(options[5].doesOccur) { + else if(options[kOptObject].doesOccur) { message="generating object code for %s\n"; - writeCode=&writeObjectCode; - } else + writeCode = CALL_WRITEOBJECT; + /* TODO: remove writeCode=&writeObjectCode; */ + } #endif + else { message="generating C code for %s\n"; - writeCode=&writeCCode; + writeCode = CALL_WRITECCODE; + /* TODO: remove writeCode=&writeCCode; */ } while(--argc) { filename=getLongPathname(argv[argc]); if (verbose) { fprintf(stdout, message, filename); } - column=MAX_COLUMN; - writeCode(filename, options[2].value); - } - } - - return 0; -} - -static void -writeCCode(const char *filename, const char *destdir) { - char buffer[4096], entry[40]; - FileStream *in, *out; - size_t i, length; - - in=T_FileStream_open(filename, "rb"); - if(in==NULL) { - fprintf(stderr, "genccode: unable to open input file %s\n", filename); - exit(U_FILE_ACCESS_ERROR); - } - - getOutFilename(filename, destdir, buffer, entry, ".c"); - out=T_FileStream_open(buffer, "w"); - if(out==NULL) { - fprintf(stderr, "genccode: unable to open output file %s\n", buffer); - exit(U_FILE_ACCESS_ERROR); - } - - /* turn dashes or dots in the entry name into underscores */ - length=uprv_strlen(entry); - for(i=0; i=100) { - s[i++]=(char)('0'+byte/100); - byte%=100; - } - if(i>0 || byte>=10) { - s[i++]=(char)('0'+byte/10); - byte%=10; - } - s[i++]=(char)('0'+byte); - s[i]=0; - - /* write the value, possibly with comma and newline */ - if(column==MAX_COLUMN) { - /* first byte */ - column=1; - } else if(column<16) { - T_FileStream_writeLine(out, ","); - ++column; - } else { - T_FileStream_writeLine(out, ",\n"); - column=1; } - T_FileStream_writeLine(out, s); -} - -#ifdef OS400 -static void -write8str(FileStream *out, uint8_t byte) { - char s[8]; - sprintf(s, "\\x%02X", byte); - - /* write the value, possibly with comma and newline */ - if(column==MAX_COLUMN) { - /* first byte */ - column=1; - T_FileStream_writeLine(out, "\""); - } else if(column<16) { - ++column; - } else { - T_FileStream_writeLine(out, "\"\n\""); - column=1; - } - T_FileStream_writeLine(out, s); + return 0; } -#endif - -