1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ******************************************************************************* 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Copyright (C) 1999-2008, International Business Machines 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Corporation and others. All Rights Reserved. 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ******************************************************************************* 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * file name: gennames.c 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * encoding: US-ASCII 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * tab size: 8 (not used) 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * indentation:4 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * created on: 1999nov01 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * created by: Markus W. Scherer 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * This program reads a binary file and creates a C source code file 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * with a byte array that contains the data of the binary file. 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 12/09/1999 weiv Added multiple file handling 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "unicode/utypes.h" 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef U_WINDOWS 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott# define VC_EXTRALEAN 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott# define WIN32_LEAN_AND_MEAN 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott# define NOUSER 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott# define NOSERVICE 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott# define NOIME 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott# define NOMCX 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <windows.h> 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <time.h> 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef U_LINUX 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott# define U_ELF 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef U_ELF 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott# include <elf.h> 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott# if defined(ELFCLASS64) 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott# define U_ELF64 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott# endif 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Old elf.h headers may not have EM_X86_64, or have EM_X8664 instead. */ 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott# ifndef EM_X86_64 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott# define EM_X86_64 62 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott# endif 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott# define ICU_ENTRY_OFFSET 0 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <stdio.h> 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <stdlib.h> 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "unicode/putil.h" 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "cmemory.h" 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "cstring.h" 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "filestrm.h" 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "toolutil.h" 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "unicode/uclean.h" 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "uoptions.h" 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "pkg_genc.h" 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(U_WINDOWS) || defined(U_ELF) 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define CAN_GENERATE_OBJECTS 62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottenum { 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott kOptHelpH = 0, 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott kOptHelpQuestionMark, 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott kOptDestDir, 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott kOptName, 69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott kOptEntryPoint, 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef CAN_GENERATE_OBJECTS 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott kOptObject, 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott kOptMatchArch, 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott kOptFilename, 75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott kOptAssembly 76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic UOption options[]={ 79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/*0*/UOPTION_HELP_H, 80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott UOPTION_HELP_QUESTION_MARK, 81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott UOPTION_DESTDIR, 82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott UOPTION_DEF("name", 'n', UOPT_REQUIRES_ARG), 83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott UOPTION_DEF("entrypoint", 'e', UOPT_REQUIRES_ARG), 84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef CAN_GENERATE_OBJECTS 85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/*5*/UOPTION_DEF("object", 'o', UOPT_NO_ARG), 86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott UOPTION_DEF("match-arch", 'm', UOPT_REQUIRES_ARG), 87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott UOPTION_DEF("filename", 'f', UOPT_REQUIRES_ARG), 89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott UOPTION_DEF("assembly", 'a', UOPT_REQUIRES_ARG) 90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define CALL_WRITECCODE 'c' 93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define CALL_WRITEASSEMBLY 'a' 94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define CALL_WRITEOBJECT 'o' 95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottextern int 96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottmain(int argc, char* argv[]) { 97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott UBool verbose = TRUE; 98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott char writeCode; 99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott U_MAIN_INIT_ARGS(argc, argv); 101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott options[kOptDestDir].value = "."; 103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* read command line options */ 105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott argc=u_parseArgs(argc, argv, sizeof(options)/sizeof(options[0]), options); 106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* error handling, printing usage message */ 108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if(argc<0) { 109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, 110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "error in command line argument \"%s\"\n", 111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott argv[-argc]); 112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if(argc<0 || options[kOptHelpH].doesOccur || options[kOptHelpQuestionMark].doesOccur) { 114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, 115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "usage: %s [-options] filename1 filename2 ...\n" 116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\tread each binary input file and \n" 117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\tcreate a .c file with a byte array that contains the input file's data\n" 118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "options:\n" 119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\t-h or -? or --help this usage text\n" 120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\t-d or --destdir destination directory, followed by the path\n" 121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\t-n or --name symbol prefix, followed by the prefix\n" 122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\t-e or --entrypoint entry point name, followed by the name (_dat will be appended)\n" 123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\t-r or --revision Specify a version\n" 124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott , argv[0]); 125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef CAN_GENERATE_OBJECTS 126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, 127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\t-o or --object write a .obj file instead of .c\n" 128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\t-m or --match-arch file.o match the architecture (CPU, 32/64 bits) of the specified .o\n" 129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\t ELF format defaults to i386. Windows defaults to the native platform.\n"); 130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, 132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\t-f or --filename Specify an alternate base filename. (default: symbolname_typ)\n" 133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "\t-a or --assembly Create assembly file. (possible values are: "); 134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott printAssemblyHeadersToStdErr(); 136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else { 137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char *message, *filename; 138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* TODO: remove void (*writeCode)(const char *, const char *); */ 139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if(options[kOptAssembly].doesOccur) { 141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott message="generating assembly code for %s\n"; 142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott writeCode = CALL_WRITEASSEMBLY; 143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* TODO: remove writeCode=&writeAssemblyCode; */ 144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!checkAssemblyHeaderName(options[kOptAssembly].value)) { 146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stderr, 147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Assembly type \"%s\" is unknown.\n", options[kOptAssembly].value); 148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return -1; 149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef CAN_GENERATE_OBJECTS 152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else if(options[kOptObject].doesOccur) { 153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott message="generating object code for %s\n"; 154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott writeCode = CALL_WRITEOBJECT; 155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* TODO: remove writeCode=&writeObjectCode; */ 156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott else 159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { 160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott message="generating C code for %s\n"; 161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott writeCode = CALL_WRITECCODE; 162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* TODO: remove writeCode=&writeCCode; */ 163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott while(--argc) { 165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott filename=getLongPathname(argv[argc]); 166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (verbose) { 167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fprintf(stdout, message, filename); 168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott switch (writeCode) { 171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case CALL_WRITECCODE: 172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott writeCCode(filename, options[kOptDestDir].value, 173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott options[kOptName].doesOccur ? options[kOptName].value : NULL, 174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott options[kOptFilename].doesOccur ? options[kOptFilename].value : NULL, 175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott NULL); 176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case CALL_WRITEASSEMBLY: 178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott writeAssemblyCode(filename, options[kOptDestDir].value, 179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott options[kOptEntryPoint].doesOccur ? options[kOptEntryPoint].value : NULL, 180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott options[kOptFilename].doesOccur ? options[kOptFilename].value : NULL, 181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott NULL); 182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef CAN_GENERATE_OBJECTS 184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case CALL_WRITEOBJECT: 185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott writeObjectCode(filename, options[kOptDestDir].value, 186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott options[kOptEntryPoint].doesOccur ? options[kOptEntryPoint].value : NULL, 187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott options[kOptMatchArch].doesOccur ? options[kOptMatchArch].value : NULL, 188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott options[kOptFilename].doesOccur ? options[kOptFilename].value : NULL, 189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott NULL); 190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott default: 193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* Should never occur. */ 194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* TODO: remove writeCode(filename, options[kOptDestDir].value); */ 197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return 0; 201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 202