Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 1 | /* |
Dimitrie O. Paun | fea0164 | 2003-03-20 19:23:08 +0000 | [diff] [blame] | 2 | * Copyright 1994 Martin von Loewis |
Austin English | 90f89fa | 2008-01-15 19:28:45 -0600 | [diff] [blame] | 3 | * Copyright 1998 Bertho A. Stultiens (BS) |
Dimitrie O. Paun | fea0164 | 2003-03-20 19:23:08 +0000 | [diff] [blame] | 4 | * Copyright 2003 Dimitrie O. Paun |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 5 | * |
Alexandre Julliard | 0799c1a | 2002-03-09 23:29:33 +0000 | [diff] [blame] | 6 | * This library is free software; you can redistribute it and/or |
| 7 | * modify it under the terms of the GNU Lesser General Public |
| 8 | * License as published by the Free Software Foundation; either |
| 9 | * version 2.1 of the License, or (at your option) any later version. |
| 10 | * |
| 11 | * This library is distributed in the hope that it will be useful, |
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 14 | * Lesser General Public License for more details. |
| 15 | * |
| 16 | * You should have received a copy of the GNU Lesser General Public |
| 17 | * License along with this library; if not, write to the Free Software |
Jonathan Ernst | 360a3f9 | 2006-05-18 14:49:52 +0200 | [diff] [blame] | 18 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA |
Alexandre Julliard | 0799c1a | 2002-03-09 23:29:33 +0000 | [diff] [blame] | 19 | * |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 20 | */ |
| 21 | |
Patrik Stridvall | 021bd85 | 1999-07-18 18:40:11 +0000 | [diff] [blame] | 22 | #include "config.h" |
Alexandre Julliard | 65c6d38 | 2002-07-22 20:47:11 +0000 | [diff] [blame] | 23 | #include "wine/port.h" |
Patrik Stridvall | 021bd85 | 1999-07-18 18:40:11 +0000 | [diff] [blame] | 24 | |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 25 | #include <stdio.h> |
| 26 | #include <stdlib.h> |
Dmitry Timoshkov | c63d980 | 2002-08-17 18:28:43 +0000 | [diff] [blame] | 27 | #ifdef HAVE_UNISTD_H |
| 28 | # include <unistd.h> |
| 29 | #endif |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 30 | #include <string.h> |
| 31 | #include <assert.h> |
| 32 | #include <ctype.h> |
Bertho Stultiens | 27337af | 2000-05-01 20:05:58 +0000 | [diff] [blame] | 33 | #include <signal.h> |
Dimitrie O. Paun | 647c1a3 | 2002-12-10 19:16:24 +0000 | [diff] [blame] | 34 | #ifdef HAVE_GETOPT_H |
| 35 | # include <getopt.h> |
| 36 | #endif |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 37 | |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 38 | #include "wrc.h" |
| 39 | #include "utils.h" |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 40 | #include "readres.h" |
| 41 | #include "dumpres.h" |
| 42 | #include "genres.h" |
| 43 | #include "newstruc.h" |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 44 | #include "parser.h" |
Alexandre Julliard | e1a9b10 | 2003-05-01 03:16:21 +0000 | [diff] [blame] | 45 | #include "wine/wpp.h" |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 46 | |
Dimitrie O. Paun | d26933e | 2003-01-11 20:55:18 +0000 | [diff] [blame] | 47 | #ifdef WORDS_BIGENDIAN |
| 48 | #define ENDIAN "big" |
| 49 | #else |
| 50 | #define ENDIAN "little" |
| 51 | #endif |
| 52 | |
Dmitry Timoshkov | 57a579f | 2006-01-24 14:00:32 +0100 | [diff] [blame] | 53 | static const char usage[] = |
Alexandre Julliard | 683dc30 | 2009-06-29 13:12:59 +0200 | [diff] [blame] | 54 | "Usage: wrc [options...] [infile[.rc|.res]]\n" |
Alexandre Julliard | e6340f1 | 2010-09-29 20:13:28 +0200 | [diff] [blame] | 55 | " -b, --target=TARGET Specify target CPU and platform when cross-compiling\n" |
| 56 | " -D, --define id[=val] Define preprocessor identifier id=val\n" |
| 57 | " --debug=nn Set debug level to 'nn'\n" |
| 58 | " -E Preprocess only\n" |
Francois Gouget | 9c11faf | 2011-08-24 15:22:52 +0200 | [diff] [blame] | 59 | " --endianness=e Set output byte-order e={n[ative], l[ittle], b[ig]}\n" |
Alexandre Julliard | e6340f1 | 2010-09-29 20:13:28 +0200 | [diff] [blame] | 60 | " (win32 only; default is " ENDIAN "-endian)\n" |
| 61 | " -F TARGET Synonym for -b for compatibility with windres\n" |
| 62 | " -fo FILE Synonym for -o for compatibility with windres\n" |
| 63 | " -h, --help Prints this summary\n" |
| 64 | " -i, --input=FILE The name of the input file\n" |
| 65 | " -I, --include-dir=PATH Set include search dir to path (multiple -I allowed)\n" |
| 66 | " -J, --input-format=FORMAT The input format (either `rc' or `rc16')\n" |
| 67 | " -l, --language=LANG Set default language to LANG (default is neutral {0, 0})\n" |
| 68 | " -m16, -m32, -m64 Build for 16-bit, 32-bit resp. 64-bit platforms\n" |
| 69 | " --no-use-temp-file Ignored for compatibility with windres\n" |
| 70 | " --nostdinc Disables searching the standard include path\n" |
| 71 | " -o, --output=FILE Output to file (default is infile.res)\n" |
Alexandre Julliard | 10700bf | 2011-01-04 11:18:10 +0100 | [diff] [blame] | 72 | " -O, --output-format=FORMAT The output format (`po', `pot', `res', or `res16`)\n" |
Alexandre Julliard | e6340f1 | 2010-09-29 20:13:28 +0200 | [diff] [blame] | 73 | " --pedantic Enable pedantic warnings\n" |
Alexandre Julliard | d8c986e | 2011-01-04 11:18:45 +0100 | [diff] [blame] | 74 | " --po-dir=DIR Directory containing po files for translations\n" |
Alexandre Julliard | e6340f1 | 2010-09-29 20:13:28 +0200 | [diff] [blame] | 75 | " --preprocessor Specifies the preprocessor to use, including arguments\n" |
| 76 | " -r Ignored for compatibility with rc\n" |
| 77 | " -U, --undefine id Undefine preprocessor identifier id\n" |
| 78 | " --use-temp-file Ignored for compatibility with windres\n" |
| 79 | " -v, --verbose Enable verbose mode\n" |
| 80 | " --verify-translations Check the status of the various translations\n" |
| 81 | " --version Print version and exit\n" |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 82 | "Input is taken from stdin if no sourcefile specified.\n" |
| 83 | "Debug level 'n' is a bitmask with following meaning:\n" |
| 84 | " * 0x01 Tell which resource is parsed (verbose mode)\n" |
| 85 | " * 0x02 Dump internal structures\n" |
| 86 | " * 0x04 Create a parser trace (yydebug=1)\n" |
Bertho Stultiens | 27337af | 2000-05-01 20:05:58 +0000 | [diff] [blame] | 87 | " * 0x08 Preprocessor messages\n" |
| 88 | " * 0x10 Preprocessor lex messages\n" |
| 89 | " * 0x20 Preprocessor yacc trace\n" |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 90 | "If no input filename is given and the output name is not overridden\n" |
Dimitrie O. Paun | deaf02a | 2003-02-26 05:04:12 +0000 | [diff] [blame] | 91 | "with -o, then the output is written to \"wrc.tab.res\"\n" |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 92 | ; |
| 93 | |
Alexandre Julliard | ac21d34 | 2005-10-10 10:43:41 +0000 | [diff] [blame] | 94 | static const char version_string[] = "Wine Resource Compiler version " PACKAGE_VERSION "\n" |
Bertho Stultiens | 27337af | 2000-05-01 20:05:58 +0000 | [diff] [blame] | 95 | "Copyright 1998-2000 Bertho A. Stultiens\n" |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 96 | " 1994 Martin von Loewis\n"; |
| 97 | |
| 98 | /* |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 99 | * Set if compiling in 32bit mode (default). |
| 100 | */ |
| 101 | int win32 = 1; |
| 102 | |
| 103 | /* |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 104 | * debuglevel == DEBUGLEVEL_NONE Don't bother |
Austin English | 90f89fa | 2008-01-15 19:28:45 -0600 | [diff] [blame] | 105 | * debuglevel & DEBUGLEVEL_CHAT Say what's done |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 106 | * debuglevel & DEBUGLEVEL_DUMP Dump internal structures |
| 107 | * debuglevel & DEBUGLEVEL_TRACE Create parser trace |
Bertho Stultiens | 27337af | 2000-05-01 20:05:58 +0000 | [diff] [blame] | 108 | * debuglevel & DEBUGLEVEL_PPMSG Preprocessor messages |
| 109 | * debuglevel & DEBUGLEVEL_PPLEX Preprocessor lex trace |
| 110 | * debuglevel & DEBUGLEVEL_PPTRACE Preprocessor yacc trace |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 111 | */ |
| 112 | int debuglevel = DEBUGLEVEL_NONE; |
| 113 | |
| 114 | /* |
| 115 | * Recognize win32 keywords if set (-w 32 enforces this), |
| 116 | * otherwise set with -e option. |
| 117 | */ |
| 118 | int extensions = 1; |
| 119 | |
| 120 | /* |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 121 | * Language setting for resources (-l option) |
| 122 | */ |
Michael Stefaniuc | d67a9d9 | 2009-07-10 11:48:34 +0200 | [diff] [blame] | 123 | static language_t *defaultlanguage; |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 124 | language_t *currentlanguage = NULL; |
| 125 | |
| 126 | /* |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 127 | * Set when extra warnings should be generated (-W option) |
| 128 | */ |
| 129 | int pedantic = 0; |
| 130 | |
Alexandre Julliard | f90efa9 | 1998-06-14 15:24:15 +0000 | [diff] [blame] | 131 | /* |
Bertho Stultiens | 3d455c9 | 2000-05-09 22:35:10 +0000 | [diff] [blame] | 132 | * The output byte-order of resources (set with -B) |
| 133 | */ |
| 134 | int byteorder = WRC_BO_NATIVE; |
| 135 | |
| 136 | /* |
Bertho Stultiens | 27337af | 2000-05-01 20:05:58 +0000 | [diff] [blame] | 137 | * Set when _only_ to run the preprocessor (-E option) |
| 138 | */ |
| 139 | int preprocess_only = 0; |
| 140 | |
| 141 | /* |
Dimitrie O. Paun | 095322e | 2003-02-11 21:58:46 +0000 | [diff] [blame] | 142 | * Set when _not_ to run the preprocessor (-P cat option) |
Bertho Stultiens | 27337af | 2000-05-01 20:05:58 +0000 | [diff] [blame] | 143 | */ |
| 144 | int no_preprocess = 0; |
| 145 | |
Alexandre Julliard | be7558f | 2009-08-20 15:33:03 +0200 | [diff] [blame] | 146 | int check_utf8 = 1; /* whether to check for valid utf8 */ |
| 147 | |
Alexandre Julliard | e6340f1 | 2010-09-29 20:13:28 +0200 | [diff] [blame] | 148 | static int pointer_size = sizeof(void *); |
| 149 | |
Vincent Béron | 8451240 | 2004-01-18 23:24:04 +0000 | [diff] [blame] | 150 | static int verify_translations_mode; |
| 151 | |
Alexandre Julliard | 10700bf | 2011-01-04 11:18:10 +0100 | [diff] [blame] | 152 | static char *output_name; /* The name given by the -o option */ |
Jon Griffiths | 3e12aba | 2003-08-18 19:48:58 +0000 | [diff] [blame] | 153 | char *input_name = NULL; /* The name given on the command-line */ |
Rob Shearman | 903f686 | 2010-01-21 11:57:09 +0000 | [diff] [blame] | 154 | static char *temp_name = NULL; /* Temporary file for preprocess pipe */ |
Bertho Stultiens | 27337af | 2000-05-01 20:05:58 +0000 | [diff] [blame] | 155 | |
| 156 | int line_number = 1; /* The current line */ |
| 157 | int char_number = 1; /* The current char pos within the line */ |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 158 | |
| 159 | char *cmdline; /* The entire commandline */ |
Bertho Stultiens | 27337af | 2000-05-01 20:05:58 +0000 | [diff] [blame] | 160 | time_t now; /* The time of start of wrc */ |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 161 | |
Alexandre Julliard | 42418fb | 2006-09-12 09:05:20 +0200 | [diff] [blame] | 162 | int parser_debug, yy_flex_debug; |
Alexandre Julliard | 88991e2 | 2006-01-03 15:11:46 +0100 | [diff] [blame] | 163 | |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 164 | resource_t *resource_top; /* The top of the parsed resources */ |
| 165 | |
| 166 | int getopt (int argc, char *const *argv, const char *optstring); |
Alexandre Julliard | f1de64d | 2006-05-27 13:23:37 +0200 | [diff] [blame] | 167 | static void cleanup_files(void); |
Bertho Stultiens | 27337af | 2000-05-01 20:05:58 +0000 | [diff] [blame] | 168 | static void segvhandler(int sig); |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 169 | |
Alexandre Julliard | 683dc30 | 2009-06-29 13:12:59 +0200 | [diff] [blame] | 170 | enum long_options_values |
| 171 | { |
| 172 | LONG_OPT_NOSTDINC = 1, |
| 173 | LONG_OPT_TMPFILE, |
| 174 | LONG_OPT_NOTMPFILE, |
Alexandre Julliard | d8c986e | 2011-01-04 11:18:45 +0100 | [diff] [blame] | 175 | LONG_OPT_PO_DIR, |
Alexandre Julliard | 683dc30 | 2009-06-29 13:12:59 +0200 | [diff] [blame] | 176 | LONG_OPT_PREPROCESSOR, |
| 177 | LONG_OPT_VERSION, |
| 178 | LONG_OPT_DEBUG, |
Francois Gouget | 9c11faf | 2011-08-24 15:22:52 +0200 | [diff] [blame] | 179 | LONG_OPT_ENDIANNESS, |
Alexandre Julliard | 683dc30 | 2009-06-29 13:12:59 +0200 | [diff] [blame] | 180 | LONG_OPT_PEDANTIC, |
| 181 | LONG_OPT_VERIFY_TRANSL |
| 182 | }; |
| 183 | |
Dmitry Timoshkov | fcd6f66 | 2007-08-30 17:18:02 +0900 | [diff] [blame] | 184 | static const char short_options[] = |
Alexandre Julliard | e6340f1 | 2010-09-29 20:13:28 +0200 | [diff] [blame] | 185 | "b:D:Ef:F:hi:I:J:l:m:o:O:rU:v"; |
Dmitry Timoshkov | fcd6f66 | 2007-08-30 17:18:02 +0900 | [diff] [blame] | 186 | static const struct option long_options[] = { |
Rob Shearman | 903f686 | 2010-01-21 11:57:09 +0000 | [diff] [blame] | 187 | { "debug", 1, NULL, LONG_OPT_DEBUG }, |
| 188 | { "define", 1, NULL, 'D' }, |
Francois Gouget | 9c11faf | 2011-08-24 15:22:52 +0200 | [diff] [blame] | 189 | { "endianness", 1, NULL, LONG_OPT_ENDIANNESS }, |
Rob Shearman | 903f686 | 2010-01-21 11:57:09 +0000 | [diff] [blame] | 190 | { "help", 0, NULL, 'h' }, |
| 191 | { "include-dir", 1, NULL, 'I' }, |
| 192 | { "input", 1, NULL, 'i' }, |
| 193 | { "input-format", 1, NULL, 'J' }, |
| 194 | { "language", 1, NULL, 'l' }, |
| 195 | { "no-use-temp-file", 0, NULL, LONG_OPT_NOTMPFILE }, |
| 196 | { "nostdinc", 0, NULL, LONG_OPT_NOSTDINC }, |
| 197 | { "output", 1, NULL, 'o' }, |
| 198 | { "output-format", 1, NULL, 'O' }, |
| 199 | { "pedantic", 0, NULL, LONG_OPT_PEDANTIC }, |
Alexandre Julliard | d8c986e | 2011-01-04 11:18:45 +0100 | [diff] [blame] | 200 | { "po-dir", 1, NULL, LONG_OPT_PO_DIR }, |
Rob Shearman | 903f686 | 2010-01-21 11:57:09 +0000 | [diff] [blame] | 201 | { "preprocessor", 1, NULL, LONG_OPT_PREPROCESSOR }, |
| 202 | { "target", 1, NULL, 'F' }, |
| 203 | { "undefine", 1, NULL, 'U' }, |
| 204 | { "use-temp-file", 0, NULL, LONG_OPT_TMPFILE }, |
| 205 | { "verbose", 0, NULL, 'v' }, |
| 206 | { "verify-translations", 0, NULL, LONG_OPT_VERIFY_TRANSL }, |
| 207 | { "version", 0, NULL, LONG_OPT_VERSION }, |
| 208 | { NULL, 0, NULL, 0 } |
Dimitrie O. Paun | 9d8b149 | 2002-12-06 19:49:36 +0000 | [diff] [blame] | 209 | }; |
| 210 | |
Alexandre Julliard | ac21d34 | 2005-10-10 10:43:41 +0000 | [diff] [blame] | 211 | static void set_version_defines(void) |
| 212 | { |
| 213 | char *version = xstrdup( PACKAGE_VERSION ); |
| 214 | char *major, *minor, *patchlevel; |
| 215 | char buffer[100]; |
| 216 | |
| 217 | if ((minor = strchr( version, '.' ))) |
| 218 | { |
| 219 | major = version; |
| 220 | *minor++ = 0; |
| 221 | if ((patchlevel = strchr( minor, '.' ))) *patchlevel++ = 0; |
| 222 | } |
| 223 | else /* pre 0.9 version */ |
| 224 | { |
| 225 | major = NULL; |
| 226 | patchlevel = version; |
| 227 | } |
| 228 | sprintf( buffer, "__WRC__=%s", major ? major : "0" ); |
| 229 | wpp_add_cmdline_define(buffer); |
| 230 | sprintf( buffer, "__WRC_MINOR__=%s", minor ? minor : "0" ); |
| 231 | wpp_add_cmdline_define(buffer); |
| 232 | sprintf( buffer, "__WRC_PATCHLEVEL__=%s", patchlevel ? patchlevel : "0" ); |
| 233 | wpp_add_cmdline_define(buffer); |
| 234 | free( version ); |
| 235 | } |
| 236 | |
Alexandre Julliard | f1de64d | 2006-05-27 13:23:37 +0200 | [diff] [blame] | 237 | /* clean things up when aborting on a signal */ |
| 238 | static void exit_on_signal( int sig ) |
| 239 | { |
| 240 | exit(1); /* this will call the atexit functions */ |
| 241 | } |
| 242 | |
Alexandre Julliard | e25bc79 | 2009-06-22 12:05:57 +0200 | [diff] [blame] | 243 | /* load a single input file */ |
| 244 | static int load_file( const char *input_name, const char *output_name ) |
| 245 | { |
| 246 | int ret; |
| 247 | |
| 248 | /* Run the preprocessor on the input */ |
| 249 | if(!no_preprocess) |
| 250 | { |
Alexandre Julliard | cb9be96 | 2010-03-30 15:33:54 +0200 | [diff] [blame] | 251 | FILE *output; |
| 252 | int ret, fd; |
| 253 | char *name; |
| 254 | |
Alexandre Julliard | e25bc79 | 2009-06-22 12:05:57 +0200 | [diff] [blame] | 255 | /* |
| 256 | * Preprocess the input to a temp-file, or stdout if |
| 257 | * no output was given. |
| 258 | */ |
| 259 | |
Alexandre Julliard | cb9be96 | 2010-03-30 15:33:54 +0200 | [diff] [blame] | 260 | if (preprocess_only) |
Alexandre Julliard | e25bc79 | 2009-06-22 12:05:57 +0200 | [diff] [blame] | 261 | { |
Alexandre Julliard | cb9be96 | 2010-03-30 15:33:54 +0200 | [diff] [blame] | 262 | if (output_name) |
| 263 | { |
| 264 | if (!(output = fopen( output_name, "w" ))) |
| 265 | fatal_perror( "Could not open %s for writing", output_name ); |
| 266 | ret = wpp_parse( input_name, output ); |
| 267 | fclose( output ); |
| 268 | } |
| 269 | else ret = wpp_parse( input_name, stdout ); |
Alexandre Julliard | e25bc79 | 2009-06-22 12:05:57 +0200 | [diff] [blame] | 270 | |
Alexandre Julliard | cb9be96 | 2010-03-30 15:33:54 +0200 | [diff] [blame] | 271 | if (ret) return ret; |
Alexandre Julliard | e25bc79 | 2009-06-22 12:05:57 +0200 | [diff] [blame] | 272 | output_name = NULL; |
| 273 | exit(0); |
| 274 | } |
| 275 | |
Alexandre Julliard | 5fabc5c | 2010-12-29 19:54:54 +0100 | [diff] [blame] | 276 | if (output_name && output_name[0]) name = strmake( "%s.XXXXXX", output_name ); |
Alexandre Julliard | cb9be96 | 2010-03-30 15:33:54 +0200 | [diff] [blame] | 277 | else name = xstrdup( "wrc.XXXXXX" ); |
| 278 | |
| 279 | if ((fd = mkstemps( name, 0 )) == -1) |
| 280 | error("Could not generate a temp name from %s\n", name); |
| 281 | |
| 282 | temp_name = name; |
| 283 | if (!(output = fdopen(fd, "wt"))) |
| 284 | error("Could not open fd %s for writing\n", name); |
| 285 | |
| 286 | ret = wpp_parse( input_name, output ); |
| 287 | fclose( output ); |
| 288 | if (ret) return ret; |
| 289 | input_name = name; |
Alexandre Julliard | e25bc79 | 2009-06-22 12:05:57 +0200 | [diff] [blame] | 290 | } |
| 291 | |
Michael Stefaniuc | d67a9d9 | 2009-07-10 11:48:34 +0200 | [diff] [blame] | 292 | /* Reset the language */ |
| 293 | currentlanguage = dup_language( defaultlanguage ); |
Alexandre Julliard | be7558f | 2009-08-20 15:33:03 +0200 | [diff] [blame] | 294 | check_utf8 = 1; |
Michael Stefaniuc | d67a9d9 | 2009-07-10 11:48:34 +0200 | [diff] [blame] | 295 | |
Alexandre Julliard | e25bc79 | 2009-06-22 12:05:57 +0200 | [diff] [blame] | 296 | /* Go from .rc to .res */ |
| 297 | chat("Starting parse\n"); |
| 298 | |
| 299 | if(!(parser_in = fopen(input_name, "rb"))) |
| 300 | fatal_perror("Could not open %s for input", input_name); |
| 301 | |
| 302 | ret = parser_parse(); |
| 303 | fclose(parser_in); |
Michael Stefaniuc | b90a74c | 2009-12-29 18:07:22 +0100 | [diff] [blame] | 304 | parser_lex_destroy(); |
Alexandre Julliard | e25bc79 | 2009-06-22 12:05:57 +0200 | [diff] [blame] | 305 | if (temp_name) |
| 306 | { |
| 307 | unlink( temp_name ); |
| 308 | temp_name = NULL; |
| 309 | } |
Michael Stefaniuc | d67a9d9 | 2009-07-10 11:48:34 +0200 | [diff] [blame] | 310 | free( currentlanguage ); |
Alexandre Julliard | e25bc79 | 2009-06-22 12:05:57 +0200 | [diff] [blame] | 311 | return ret; |
| 312 | } |
| 313 | |
Alexandre Julliard | e6340f1 | 2010-09-29 20:13:28 +0200 | [diff] [blame] | 314 | static void set_target( const char *target ) |
| 315 | { |
| 316 | char *p, *cpu = xstrdup( target ); |
| 317 | |
| 318 | /* target specification is in the form CPU-MANUFACTURER-OS or CPU-MANUFACTURER-KERNEL-OS */ |
| 319 | if (!(p = strchr( cpu, '-' ))) error( "Invalid target specification '%s'\n", target ); |
| 320 | *p = 0; |
| 321 | if (!strcmp( cpu, "amd64" ) || !strcmp( cpu, "x86_64" ) || !strcmp( cpu, "ia64" )) |
| 322 | pointer_size = 8; |
| 323 | else |
| 324 | pointer_size = 4; |
| 325 | free( cpu ); |
| 326 | } |
Alexandre Julliard | e25bc79 | 2009-06-22 12:05:57 +0200 | [diff] [blame] | 327 | |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 328 | int main(int argc,char *argv[]) |
| 329 | { |
| 330 | extern char* optarg; |
| 331 | extern int optind; |
Gerald Pfeifer | 714148c | 2003-01-23 21:21:50 +0000 | [diff] [blame] | 332 | int optc; |
Gerald Pfeifer | 714148c | 2003-01-23 21:21:50 +0000 | [diff] [blame] | 333 | int opti = 0; |
Dimitrie O. Paun | 6f26458 | 2002-12-11 01:31:22 +0000 | [diff] [blame] | 334 | int stdinc = 1; |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 335 | int lose = 0; |
Alexandre Julliard | 683dc30 | 2009-06-29 13:12:59 +0200 | [diff] [blame] | 336 | int nb_files = 0; |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 337 | int i; |
| 338 | int cmdlen; |
Alexandre Julliard | 10700bf | 2011-01-04 11:18:10 +0100 | [diff] [blame] | 339 | int po_mode = 0; |
Alexandre Julliard | d8c986e | 2011-01-04 11:18:45 +0100 | [diff] [blame] | 340 | char *po_dir = NULL; |
Alexandre Julliard | 683dc30 | 2009-06-29 13:12:59 +0200 | [diff] [blame] | 341 | char **files = xmalloc( argc * sizeof(*files) ); |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 342 | |
Bertho Stultiens | 27337af | 2000-05-01 20:05:58 +0000 | [diff] [blame] | 343 | signal(SIGSEGV, segvhandler); |
Alexandre Julliard | f1de64d | 2006-05-27 13:23:37 +0200 | [diff] [blame] | 344 | signal( SIGTERM, exit_on_signal ); |
| 345 | signal( SIGINT, exit_on_signal ); |
| 346 | #ifdef SIGHUP |
| 347 | signal( SIGHUP, exit_on_signal ); |
| 348 | #endif |
Bertho Stultiens | 27337af | 2000-05-01 20:05:58 +0000 | [diff] [blame] | 349 | |
| 350 | now = time(NULL); |
| 351 | |
Dimitrie O. Paun | 29ba616 | 2003-03-28 19:31:49 +0000 | [diff] [blame] | 352 | /* Set the default defined stuff */ |
Alexandre Julliard | ac21d34 | 2005-10-10 10:43:41 +0000 | [diff] [blame] | 353 | set_version_defines(); |
Dimitrie O. Paun | 29ba616 | 2003-03-28 19:31:49 +0000 | [diff] [blame] | 354 | wpp_add_cmdline_define("RC_INVOKED=1"); |
Alexandre Julliard | a8d69d6 | 2005-10-10 18:07:34 +0000 | [diff] [blame] | 355 | /* Microsoft RC always searches current directory */ |
| 356 | wpp_add_include_path("."); |
Dimitrie O. Paun | 29ba616 | 2003-03-28 19:31:49 +0000 | [diff] [blame] | 357 | |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 358 | /* First rebuild the commandline to put in destination */ |
| 359 | /* Could be done through env[], but not all OS-es support it */ |
| 360 | cmdlen = 4; /* for "wrc " */ |
| 361 | for(i = 1; i < argc; i++) |
| 362 | cmdlen += strlen(argv[i]) + 1; |
Alexandre Julliard | fce74f7 | 2006-08-26 21:33:29 +0200 | [diff] [blame] | 363 | cmdline = xmalloc(cmdlen); |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 364 | strcpy(cmdline, "wrc "); |
| 365 | for(i = 1; i < argc; i++) |
| 366 | { |
| 367 | strcat(cmdline, argv[i]); |
| 368 | if(i < argc-1) |
| 369 | strcat(cmdline, " "); |
| 370 | } |
| 371 | |
Dimitrie O. Paun | d26933e | 2003-01-11 20:55:18 +0000 | [diff] [blame] | 372 | while((optc = getopt_long(argc, argv, short_options, long_options, &opti)) != EOF) |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 373 | { |
| 374 | switch(optc) |
| 375 | { |
Alexandre Julliard | 683dc30 | 2009-06-29 13:12:59 +0200 | [diff] [blame] | 376 | case LONG_OPT_NOSTDINC: |
Dimitrie O. Paun | d5a194b | 2003-03-19 22:45:51 +0000 | [diff] [blame] | 377 | stdinc = 0; |
| 378 | break; |
Alexandre Julliard | 683dc30 | 2009-06-29 13:12:59 +0200 | [diff] [blame] | 379 | case LONG_OPT_TMPFILE: |
Dimitrie O. Paun | d5a194b | 2003-03-19 22:45:51 +0000 | [diff] [blame] | 380 | if (debuglevel) warning("--use-temp-file option not yet supported, ignored.\n"); |
Dimitrie O. Paun | d26933e | 2003-01-11 20:55:18 +0000 | [diff] [blame] | 381 | break; |
Alexandre Julliard | 683dc30 | 2009-06-29 13:12:59 +0200 | [diff] [blame] | 382 | case LONG_OPT_NOTMPFILE: |
Dimitrie O. Paun | d5a194b | 2003-03-19 22:45:51 +0000 | [diff] [blame] | 383 | if (debuglevel) warning("--no-use-temp-file option not yet supported, ignored.\n"); |
| 384 | break; |
Alexandre Julliard | d8c986e | 2011-01-04 11:18:45 +0100 | [diff] [blame] | 385 | case LONG_OPT_PO_DIR: |
| 386 | po_dir = xstrdup( optarg ); |
| 387 | break; |
Alexandre Julliard | 683dc30 | 2009-06-29 13:12:59 +0200 | [diff] [blame] | 388 | case LONG_OPT_PREPROCESSOR: |
Dimitrie O. Paun | d5a194b | 2003-03-19 22:45:51 +0000 | [diff] [blame] | 389 | if (strcmp(optarg, "cat") == 0) no_preprocess = 1; |
| 390 | else fprintf(stderr, "-P option not yet supported, ignored.\n"); |
| 391 | break; |
Alexandre Julliard | 683dc30 | 2009-06-29 13:12:59 +0200 | [diff] [blame] | 392 | case LONG_OPT_VERSION: |
Dimitrie O. Paun | d5a194b | 2003-03-19 22:45:51 +0000 | [diff] [blame] | 393 | printf(version_string); |
| 394 | exit(0); |
Dimitrie O. Paun | e41ec93 | 2002-12-12 22:23:55 +0000 | [diff] [blame] | 395 | break; |
Alexandre Julliard | 683dc30 | 2009-06-29 13:12:59 +0200 | [diff] [blame] | 396 | case LONG_OPT_DEBUG: |
Dimitrie O. Paun | 29ba616 | 2003-03-28 19:31:49 +0000 | [diff] [blame] | 397 | debuglevel = strtol(optarg, NULL, 0); |
| 398 | break; |
Francois Gouget | 9c11faf | 2011-08-24 15:22:52 +0200 | [diff] [blame] | 399 | case LONG_OPT_ENDIANNESS: |
Bertho Stultiens | 3d455c9 | 2000-05-09 22:35:10 +0000 | [diff] [blame] | 400 | switch(optarg[0]) |
| 401 | { |
| 402 | case 'n': |
| 403 | case 'N': |
| 404 | byteorder = WRC_BO_NATIVE; |
| 405 | break; |
| 406 | case 'l': |
| 407 | case 'L': |
| 408 | byteorder = WRC_BO_LITTLE; |
| 409 | break; |
| 410 | case 'b': |
| 411 | case 'B': |
| 412 | byteorder = WRC_BO_BIG; |
| 413 | break; |
| 414 | default: |
Francois Gouget | 0e85f54 | 2001-05-07 18:17:58 +0000 | [diff] [blame] | 415 | fprintf(stderr, "Byte ordering must be n[ative], l[ittle] or b[ig]\n"); |
Bertho Stultiens | 3d455c9 | 2000-05-09 22:35:10 +0000 | [diff] [blame] | 416 | lose++; |
| 417 | } |
| 418 | break; |
Alexandre Julliard | 683dc30 | 2009-06-29 13:12:59 +0200 | [diff] [blame] | 419 | case LONG_OPT_PEDANTIC: |
Dimitrie O. Paun | 29ba616 | 2003-03-28 19:31:49 +0000 | [diff] [blame] | 420 | pedantic = 1; |
| 421 | wpp_set_pedantic(1); |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 422 | break; |
Alexandre Julliard | 683dc30 | 2009-06-29 13:12:59 +0200 | [diff] [blame] | 423 | case LONG_OPT_VERIFY_TRANSL: |
Vincent Béron | 8451240 | 2004-01-18 23:24:04 +0000 | [diff] [blame] | 424 | verify_translations_mode = 1; |
| 425 | break; |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 426 | case 'D': |
Alexandre Julliard | b7d3c79 | 2002-07-16 02:33:10 +0000 | [diff] [blame] | 427 | wpp_add_cmdline_define(optarg); |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 428 | break; |
Bertho Stultiens | 27337af | 2000-05-01 20:05:58 +0000 | [diff] [blame] | 429 | case 'E': |
| 430 | preprocess_only = 1; |
| 431 | break; |
Alexandre Julliard | e6340f1 | 2010-09-29 20:13:28 +0200 | [diff] [blame] | 432 | case 'b': |
Dimitrie O. Paun | 9d8b149 | 2002-12-06 19:49:36 +0000 | [diff] [blame] | 433 | case 'F': |
Alexandre Julliard | e6340f1 | 2010-09-29 20:13:28 +0200 | [diff] [blame] | 434 | set_target( optarg ); |
Dimitrie O. Paun | 9d8b149 | 2002-12-06 19:49:36 +0000 | [diff] [blame] | 435 | break; |
Dimitrie O. Paun | d26933e | 2003-01-11 20:55:18 +0000 | [diff] [blame] | 436 | case 'h': |
| 437 | printf(usage); |
| 438 | exit(0); |
Dimitrie O. Paun | 9d8b149 | 2002-12-06 19:49:36 +0000 | [diff] [blame] | 439 | case 'i': |
Alexandre Julliard | 683dc30 | 2009-06-29 13:12:59 +0200 | [diff] [blame] | 440 | files[nb_files++] = optarg; |
Dimitrie O. Paun | 9d8b149 | 2002-12-06 19:49:36 +0000 | [diff] [blame] | 441 | break; |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 442 | case 'I': |
Dimitrie O. Paun | fea0164 | 2003-03-20 19:23:08 +0000 | [diff] [blame] | 443 | wpp_add_include_path(optarg); |
| 444 | break; |
| 445 | case 'J': |
| 446 | if (strcmp(optarg, "rc16") == 0) extensions = 0; |
Dimitrie O. Paun | 45864a7 | 2003-04-19 02:47:28 +0000 | [diff] [blame] | 447 | else if (strcmp(optarg, "rc")) error("Output format %s not supported.\n", optarg); |
Dimitrie O. Paun | 6f26458 | 2002-12-11 01:31:22 +0000 | [diff] [blame] | 448 | break; |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 449 | case 'l': |
| 450 | { |
| 451 | int lan; |
| 452 | lan = strtol(optarg, NULL, 0); |
Alexandre Julliard | f22ba05 | 2002-08-15 21:57:36 +0000 | [diff] [blame] | 453 | if (get_language_codepage(PRIMARYLANGID(lan), SUBLANGID(lan)) == -1) |
Dimitrie O. Paun | 45864a7 | 2003-04-19 02:47:28 +0000 | [diff] [blame] | 454 | error("Language %04x is not supported\n", lan); |
Michael Stefaniuc | d67a9d9 | 2009-07-10 11:48:34 +0200 | [diff] [blame] | 455 | defaultlanguage = new_language(PRIMARYLANGID(lan), SUBLANGID(lan)); |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 456 | } |
| 457 | break; |
Alexandre Julliard | e6340f1 | 2010-09-29 20:13:28 +0200 | [diff] [blame] | 458 | case 'm': |
| 459 | if (!strcmp( optarg, "16" )) win32 = 0; |
| 460 | else if (!strcmp( optarg, "32" )) { win32 = 1; pointer_size = 4; } |
| 461 | else if (!strcmp( optarg, "64" )) { win32 = 1; pointer_size = 8; } |
| 462 | else error( "Invalid option: -m%s\n", optarg ); |
| 463 | break; |
Dimitrie O. Paun | 45864a7 | 2003-04-19 02:47:28 +0000 | [diff] [blame] | 464 | case 'f': |
| 465 | if (*optarg != 'o') error("Unknown option: -f%s\n", optarg); |
| 466 | optarg++; |
| 467 | /* fall through */ |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 468 | case 'o': |
Dimitrie O. Paun | 9d8b149 | 2002-12-06 19:49:36 +0000 | [diff] [blame] | 469 | if (!output_name) output_name = strdup(optarg); |
| 470 | else error("Too many output files.\n"); |
| 471 | break; |
| 472 | case 'O': |
Alexandre Julliard | 10700bf | 2011-01-04 11:18:10 +0100 | [diff] [blame] | 473 | if (strcmp(optarg, "po") == 0) po_mode = 1; |
| 474 | else if (strcmp(optarg, "pot") == 0) po_mode = 2; |
| 475 | else if (strcmp(optarg, "res16") == 0) win32 = 0; |
Dimitrie O. Paun | 45864a7 | 2003-04-19 02:47:28 +0000 | [diff] [blame] | 476 | else if (strcmp(optarg, "res")) warning("Output format %s not supported.\n", optarg); |
Dimitrie O. Paun | 095322e | 2003-02-11 21:58:46 +0000 | [diff] [blame] | 477 | break; |
Dimitrie O. Paun | 29ba616 | 2003-03-28 19:31:49 +0000 | [diff] [blame] | 478 | case 'r': |
| 479 | /* ignored for compatibility with rc */ |
| 480 | break; |
| 481 | case 'U': |
| 482 | wpp_del_define(optarg); |
| 483 | break; |
Dimitrie O. Paun | d26933e | 2003-01-11 20:55:18 +0000 | [diff] [blame] | 484 | case 'v': |
| 485 | debuglevel = DEBUGLEVEL_CHAT; |
| 486 | break; |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 487 | default: |
| 488 | lose++; |
| 489 | break; |
| 490 | } |
| 491 | } |
| 492 | |
| 493 | if(lose) |
| 494 | { |
| 495 | fprintf(stderr, usage); |
| 496 | return 1; |
| 497 | } |
| 498 | |
Alexandre Julliard | e6340f1 | 2010-09-29 20:13:28 +0200 | [diff] [blame] | 499 | if (win32) |
| 500 | { |
| 501 | wpp_add_cmdline_define("_WIN32=1"); |
| 502 | if (pointer_size == 8) wpp_add_cmdline_define("_WIN64=1"); |
| 503 | } |
| 504 | |
Dimitrie O. Paun | 6f26458 | 2002-12-11 01:31:22 +0000 | [diff] [blame] | 505 | /* If we do need to search standard includes, add them to the path */ |
| 506 | if (stdinc) |
| 507 | { |
| 508 | wpp_add_include_path(INCLUDEDIR"/msvcrt"); |
| 509 | wpp_add_include_path(INCLUDEDIR"/windows"); |
| 510 | } |
Dimitrie O. Paun | 9d8b149 | 2002-12-06 19:49:36 +0000 | [diff] [blame] | 511 | |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 512 | /* Kill io buffering when some kind of debuglevel is enabled */ |
| 513 | if(debuglevel) |
| 514 | { |
Rob Shearman | 903f686 | 2010-01-21 11:57:09 +0000 | [diff] [blame] | 515 | setbuf(stdout, NULL); |
| 516 | setbuf(stderr, NULL); |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 517 | } |
| 518 | |
Alexandre Julliard | 42418fb | 2006-09-12 09:05:20 +0200 | [diff] [blame] | 519 | parser_debug = debuglevel & DEBUGLEVEL_TRACE ? 1 : 0; |
Bertho Stultiens | 27337af | 2000-05-01 20:05:58 +0000 | [diff] [blame] | 520 | yy_flex_debug = debuglevel & DEBUGLEVEL_TRACE ? 1 : 0; |
Alexandre Julliard | b7d3c79 | 2002-07-16 02:33:10 +0000 | [diff] [blame] | 521 | |
| 522 | wpp_set_debug( (debuglevel & DEBUGLEVEL_PPLEX) != 0, |
| 523 | (debuglevel & DEBUGLEVEL_PPTRACE) != 0, |
| 524 | (debuglevel & DEBUGLEVEL_PPMSG) != 0 ); |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 525 | |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 526 | /* Check if the user set a language, else set default */ |
Michael Stefaniuc | d67a9d9 | 2009-07-10 11:48:34 +0200 | [diff] [blame] | 527 | if(!defaultlanguage) |
| 528 | defaultlanguage = new_language(0, 0); |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 529 | |
Alexandre Julliard | f1de64d | 2006-05-27 13:23:37 +0200 | [diff] [blame] | 530 | atexit(cleanup_files); |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 531 | |
Alexandre Julliard | 683dc30 | 2009-06-29 13:12:59 +0200 | [diff] [blame] | 532 | while (optind < argc) files[nb_files++] = argv[optind++]; |
Bertho Stultiens | 27337af | 2000-05-01 20:05:58 +0000 | [diff] [blame] | 533 | |
Alexandre Julliard | 683dc30 | 2009-06-29 13:12:59 +0200 | [diff] [blame] | 534 | for (i = 0; i < nb_files; i++) |
Alexandre Julliard | e25bc79 | 2009-06-22 12:05:57 +0200 | [diff] [blame] | 535 | { |
Alexandre Julliard | 683dc30 | 2009-06-29 13:12:59 +0200 | [diff] [blame] | 536 | input_name = files[i]; |
Alexandre Julliard | e25bc79 | 2009-06-22 12:05:57 +0200 | [diff] [blame] | 537 | if (load_file( input_name, output_name )) exit(1); |
| 538 | } |
Marcus Meissner | 39d4d12 | 2009-08-08 11:00:36 +0200 | [diff] [blame] | 539 | /* stdin special case. NULL means "stdin" for wpp. */ |
Alexandre Julliard | 10700bf | 2011-01-04 11:18:10 +0100 | [diff] [blame] | 540 | if (nb_files == 0 && load_file( NULL, output_name )) exit(1); |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 541 | |
Dimitrie O. Paun | deaf02a | 2003-02-26 05:04:12 +0000 | [diff] [blame] | 542 | if(debuglevel & DEBUGLEVEL_DUMP) |
| 543 | dump_resources(resource_top); |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 544 | |
Vincent Béron | 8451240 | 2004-01-18 23:24:04 +0000 | [diff] [blame] | 545 | if(verify_translations_mode) |
| 546 | { |
| 547 | verify_translations(resource_top); |
| 548 | exit(0); |
| 549 | } |
Alexandre Julliard | 10700bf | 2011-01-04 11:18:10 +0100 | [diff] [blame] | 550 | if (po_mode) |
| 551 | { |
| 552 | if (po_mode == 2) /* pot file */ |
| 553 | { |
| 554 | if (!output_name) |
| 555 | { |
| 556 | output_name = dup_basename( nb_files ? files[0] : NULL, ".rc" ); |
| 557 | strcat( output_name, ".pot" ); |
| 558 | } |
| 559 | write_pot_file( output_name ); |
| 560 | } |
| 561 | else write_po_files( output_name ); |
| 562 | output_name = NULL; |
| 563 | exit(0); |
| 564 | } |
Alexandre Julliard | f4ec097 | 2011-10-22 18:21:04 +0200 | [diff] [blame] | 565 | add_translations( po_dir ); |
Vincent Béron | 8451240 | 2004-01-18 23:24:04 +0000 | [diff] [blame] | 566 | |
Dimitrie O. Paun | deaf02a | 2003-02-26 05:04:12 +0000 | [diff] [blame] | 567 | /* Convert the internal lists to binary data */ |
| 568 | resources2res(resource_top); |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 569 | |
Francois Gouget | 7e92283 | 2007-10-18 17:11:52 +0200 | [diff] [blame] | 570 | chat("Writing .res-file\n"); |
Alexandre Julliard | 10700bf | 2011-01-04 11:18:10 +0100 | [diff] [blame] | 571 | if (!output_name) |
| 572 | { |
| 573 | output_name = dup_basename( nb_files ? files[0] : NULL, ".rc" ); |
| 574 | strcat(output_name, ".res"); |
| 575 | } |
Dimitrie O. Paun | deaf02a | 2003-02-26 05:04:12 +0000 | [diff] [blame] | 576 | write_resfile(output_name, resource_top); |
Alexandre Julliard | f1de64d | 2006-05-27 13:23:37 +0200 | [diff] [blame] | 577 | output_name = NULL; |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 578 | |
| 579 | return 0; |
| 580 | } |
| 581 | |
| 582 | |
Alexandre Julliard | f1de64d | 2006-05-27 13:23:37 +0200 | [diff] [blame] | 583 | static void cleanup_files(void) |
Bertho Stultiens | 27337af | 2000-05-01 20:05:58 +0000 | [diff] [blame] | 584 | { |
Alexandre Julliard | f1de64d | 2006-05-27 13:23:37 +0200 | [diff] [blame] | 585 | if (output_name) unlink(output_name); |
| 586 | if (temp_name) unlink(temp_name); |
Bertho Stultiens | 27337af | 2000-05-01 20:05:58 +0000 | [diff] [blame] | 587 | } |
Alexandre Julliard | a845b88 | 1998-06-01 10:44:35 +0000 | [diff] [blame] | 588 | |
Bertho Stultiens | 27337af | 2000-05-01 20:05:58 +0000 | [diff] [blame] | 589 | static void segvhandler(int sig) |
| 590 | { |
| 591 | fprintf(stderr, "\n%s:%d: Oops, segment violation\n", input_name, line_number); |
| 592 | fflush(stdout); |
| 593 | fflush(stderr); |
| 594 | abort(); |
| 595 | } |