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