deffilep.c revision 1.8 1 /* A Bison parser, made by GNU Bison 3.8.2. */
2
3 /* Bison implementation for Yacc-like parsers in C
4
5 Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation,
6 Inc.
7
8 This program is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <https://www.gnu.org/licenses/>. */
20
21 /* As a special exception, you may create a larger work that contains
22 part or all of the Bison parser skeleton and distribute that work
23 under terms of your choice, so long as that work isn't itself a
24 parser generator using the skeleton or a modified version thereof
25 as a parser skeleton. Alternatively, if you modify or redistribute
26 the parser skeleton itself, you may (at your option) remove this
27 special exception, which will cause the skeleton and the resulting
28 Bison output files to be licensed under the GNU General Public
29 License without this special exception.
30
31 This special exception was added by the Free Software Foundation in
32 version 2.2 of Bison. */
33
34 /* C LALR(1) parser skeleton written by Richard Stallman, by
35 simplifying the original so-called "semantic" parser. */
36
37 /* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
38 especially those whose name start with YY_ or yy_. They are
39 private implementation details that can be changed or removed. */
40
41 /* All symbols defined below should begin with yy or YY, to avoid
42 infringing on user name space. This should be done even for local
43 variables, as they might otherwise be expanded by user macros.
44 There are some unavoidable exceptions within include files to
45 define necessary library symbols; they are noted "INFRINGES ON
46 USER NAME SPACE" below. */
47
48 /* Identify Bison output, and Bison version. */
49 #define YYBISON 30802
50
51 /* Bison version string. */
52 #define YYBISON_VERSION "3.8.2"
53
54 /* Skeleton name. */
55 #define YYSKELETON_NAME "yacc.c"
56
57 /* Pure parsers. */
58 #define YYPURE 0
59
60 /* Push parsers. */
61 #define YYPUSH 0
62
63 /* Pull parsers. */
64 #define YYPULL 1
65
66
67
68
69 /* First part of user prologue. */
70 #line 1 "deffilep.y"
71 /* deffilep.y - parser for .def files */
72
73 /* Copyright (C) 1995-2022 Free Software Foundation, Inc.
74
75 This file is part of GNU Binutils.
76
77 This program is free software; you can redistribute it and/or modify
78 it under the terms of the GNU General Public License as published by
79 the Free Software Foundation; either version 3 of the License, or
80 (at your option) any later version.
81
82 This program is distributed in the hope that it will be useful,
83 but WITHOUT ANY WARRANTY; without even the implied warranty of
84 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
85 GNU General Public License for more details.
86
87 You should have received a copy of the GNU General Public License
88 along with this program; if not, write to the Free Software
89 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
90 MA 02110-1301, USA. */
91
92 #include "sysdep.h"
93 #include "libiberty.h"
94 #include "safe-ctype.h"
95 #include "bfd.h"
96 #include "bfdlink.h"
97 #include "ld.h"
98 #include "ldmisc.h"
99 #include "deffile.h"
100
101 #define TRACE 0
102
103 #define ROUND_UP(a, b) (((a)+((b)-1))&~((b)-1))
104
105 /* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc),
106 as well as gratuitiously global symbol names, so we can have multiple
107 yacc generated parsers in ld. Note that these are only the variables
108 produced by yacc. If other parser generators (bison, byacc, etc) produce
109 additional global names that conflict at link time, then those parser
110 generators need to be fixed instead of adding those names to this list. */
111
112 #define yymaxdepth def_maxdepth
113 #define yyparse def_parse
114 #define yylex def_lex
115 #define yyerror def_error
116 #define yylval def_lval
117 #define yychar def_char
118 #define yydebug def_debug
119 #define yypact def_pact
120 #define yyr1 def_r1
121 #define yyr2 def_r2
122 #define yydef def_def
123 #define yychk def_chk
124 #define yypgo def_pgo
125 #define yyact def_act
126 #define yyexca def_exca
127 #define yyerrflag def_errflag
128 #define yynerrs def_nerrs
129 #define yyps def_ps
130 #define yypv def_pv
131 #define yys def_s
132 #define yy_yys def_yys
133 #define yystate def_state
134 #define yytmp def_tmp
135 #define yyv def_v
136 #define yy_yyv def_yyv
137 #define yyval def_val
138 #define yylloc def_lloc
139 #define yyreds def_reds /* With YYDEBUG defined. */
140 #define yytoks def_toks /* With YYDEBUG defined. */
141 #define yylhs def_yylhs
142 #define yylen def_yylen
143 #define yydefred def_yydefred
144 #define yydgoto def_yydgoto
145 #define yysindex def_yysindex
146 #define yyrindex def_yyrindex
147 #define yygindex def_yygindex
148 #define yytable def_yytable
149 #define yycheck def_yycheck
150
151 typedef struct def_pool_str {
152 struct def_pool_str *next;
153 char data[1];
154 } def_pool_str;
155
156 static def_pool_str *pool_strs = NULL;
157
158 static char *def_pool_alloc (size_t sz);
159 static char *def_pool_strdup (const char *str);
160 static void def_pool_free (void);
161
162 static void def_description (const char *);
163 static void def_exports (const char *, const char *, int, int, const char *);
164 static void def_heapsize (int, int);
165 static void def_import (const char *, const char *, const char *, const char *,
166 int, const char *);
167 static void def_image_name (const char *, bfd_vma, int);
168 static void def_section (const char *, int);
169 static void def_section_alt (const char *, const char *);
170 static void def_stacksize (int, int);
171 static void def_version (int, int);
172 static void def_directive (char *);
173 static void def_aligncomm (char *str, int align);
174 static int def_parse (void);
175 static void def_error (const char *);
176 static int def_lex (void);
177
178 static int lex_forced_token = 0;
179 static const char *lex_parse_string = 0;
180 static const char *lex_parse_string_end = 0;
181
182
183 #line 184 "deffilep.c"
184
185 # ifndef YY_CAST
186 # ifdef __cplusplus
187 # define YY_CAST(Type, Val) static_cast<Type> (Val)
188 # define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast<Type> (Val)
189 # else
190 # define YY_CAST(Type, Val) ((Type) (Val))
191 # define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val))
192 # endif
193 # endif
194 # ifndef YY_NULLPTR
195 # if defined __cplusplus
196 # if 201103L <= __cplusplus
197 # define YY_NULLPTR nullptr
198 # else
199 # define YY_NULLPTR 0
200 # endif
201 # else
202 # define YY_NULLPTR ((void*)0)
203 # endif
204 # endif
205
206 /* Use api.header.include to #include this header
207 instead of duplicating it here. */
208 #ifndef YY_YY_DEFFILEP_H_INCLUDED
209 # define YY_YY_DEFFILEP_H_INCLUDED
210 /* Debug traces. */
211 #ifndef YYDEBUG
212 # define YYDEBUG 0
213 #endif
214 #if YYDEBUG
215 extern int yydebug;
216 #endif
217
218 /* Token kinds. */
219 #ifndef YYTOKENTYPE
220 # define YYTOKENTYPE
221 enum yytokentype
222 {
223 YYEMPTY = -2,
224 YYEOF = 0, /* "end of file" */
225 YYerror = 256, /* error */
226 YYUNDEF = 257, /* "invalid token" */
227 NAME = 258, /* NAME */
228 LIBRARY = 259, /* LIBRARY */
229 DESCRIPTION = 260, /* DESCRIPTION */
230 STACKSIZE_K = 261, /* STACKSIZE_K */
231 HEAPSIZE = 262, /* HEAPSIZE */
232 CODE = 263, /* CODE */
233 DATAU = 264, /* DATAU */
234 DATAL = 265, /* DATAL */
235 SECTIONS = 266, /* SECTIONS */
236 EXPORTS = 267, /* EXPORTS */
237 IMPORTS = 268, /* IMPORTS */
238 VERSIONK = 269, /* VERSIONK */
239 BASE = 270, /* BASE */
240 CONSTANTU = 271, /* CONSTANTU */
241 CONSTANTL = 272, /* CONSTANTL */
242 PRIVATEU = 273, /* PRIVATEU */
243 PRIVATEL = 274, /* PRIVATEL */
244 ALIGNCOMM = 275, /* ALIGNCOMM */
245 READ = 276, /* READ */
246 WRITE = 277, /* WRITE */
247 EXECUTE = 278, /* EXECUTE */
248 SHARED_K = 279, /* SHARED_K */
249 NONAMEU = 280, /* NONAMEU */
250 NONAMEL = 281, /* NONAMEL */
251 DIRECTIVE = 282, /* DIRECTIVE */
252 EQUAL = 283, /* EQUAL */
253 ID = 284, /* ID */
254 DIGITS = 285 /* DIGITS */
255 };
256 typedef enum yytokentype yytoken_kind_t;
257 #endif
258 /* Token kinds. */
259 #define YYEMPTY -2
260 #define YYEOF 0
261 #define YYerror 256
262 #define YYUNDEF 257
263 #define NAME 258
264 #define LIBRARY 259
265 #define DESCRIPTION 260
266 #define STACKSIZE_K 261
267 #define HEAPSIZE 262
268 #define CODE 263
269 #define DATAU 264
270 #define DATAL 265
271 #define SECTIONS 266
272 #define EXPORTS 267
273 #define IMPORTS 268
274 #define VERSIONK 269
275 #define BASE 270
276 #define CONSTANTU 271
277 #define CONSTANTL 272
278 #define PRIVATEU 273
279 #define PRIVATEL 274
280 #define ALIGNCOMM 275
281 #define READ 276
282 #define WRITE 277
283 #define EXECUTE 278
284 #define SHARED_K 279
285 #define NONAMEU 280
286 #define NONAMEL 281
287 #define DIRECTIVE 282
288 #define EQUAL 283
289 #define ID 284
290 #define DIGITS 285
291
292 /* Value type. */
293 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
294 union YYSTYPE
295 {
296 #line 114 "deffilep.y"
297
298 char *id;
299 const char *id_const;
300 int number;
301 bfd_vma vma;
302 char *digits;
303
304 #line 305 "deffilep.c"
305
306 };
307 typedef union YYSTYPE YYSTYPE;
308 # define YYSTYPE_IS_TRIVIAL 1
309 # define YYSTYPE_IS_DECLARED 1
310 #endif
311
312
313 extern YYSTYPE yylval;
314
315
316 int yyparse (void);
317
318
319 #endif /* !YY_YY_DEFFILEP_H_INCLUDED */
320 /* Symbol kind. */
321 enum yysymbol_kind_t
322 {
323 YYSYMBOL_YYEMPTY = -2,
324 YYSYMBOL_YYEOF = 0, /* "end of file" */
325 YYSYMBOL_YYerror = 1, /* error */
326 YYSYMBOL_YYUNDEF = 2, /* "invalid token" */
327 YYSYMBOL_NAME = 3, /* NAME */
328 YYSYMBOL_LIBRARY = 4, /* LIBRARY */
329 YYSYMBOL_DESCRIPTION = 5, /* DESCRIPTION */
330 YYSYMBOL_STACKSIZE_K = 6, /* STACKSIZE_K */
331 YYSYMBOL_HEAPSIZE = 7, /* HEAPSIZE */
332 YYSYMBOL_CODE = 8, /* CODE */
333 YYSYMBOL_DATAU = 9, /* DATAU */
334 YYSYMBOL_DATAL = 10, /* DATAL */
335 YYSYMBOL_SECTIONS = 11, /* SECTIONS */
336 YYSYMBOL_EXPORTS = 12, /* EXPORTS */
337 YYSYMBOL_IMPORTS = 13, /* IMPORTS */
338 YYSYMBOL_VERSIONK = 14, /* VERSIONK */
339 YYSYMBOL_BASE = 15, /* BASE */
340 YYSYMBOL_CONSTANTU = 16, /* CONSTANTU */
341 YYSYMBOL_CONSTANTL = 17, /* CONSTANTL */
342 YYSYMBOL_PRIVATEU = 18, /* PRIVATEU */
343 YYSYMBOL_PRIVATEL = 19, /* PRIVATEL */
344 YYSYMBOL_ALIGNCOMM = 20, /* ALIGNCOMM */
345 YYSYMBOL_READ = 21, /* READ */
346 YYSYMBOL_WRITE = 22, /* WRITE */
347 YYSYMBOL_EXECUTE = 23, /* EXECUTE */
348 YYSYMBOL_SHARED_K = 24, /* SHARED_K */
349 YYSYMBOL_NONAMEU = 25, /* NONAMEU */
350 YYSYMBOL_NONAMEL = 26, /* NONAMEL */
351 YYSYMBOL_DIRECTIVE = 27, /* DIRECTIVE */
352 YYSYMBOL_EQUAL = 28, /* EQUAL */
353 YYSYMBOL_ID = 29, /* ID */
354 YYSYMBOL_DIGITS = 30, /* DIGITS */
355 YYSYMBOL_31_ = 31, /* '.' */
356 YYSYMBOL_32_ = 32, /* ',' */
357 YYSYMBOL_33_ = 33, /* '=' */
358 YYSYMBOL_34_ = 34, /* '@' */
359 YYSYMBOL_YYACCEPT = 35, /* $accept */
360 YYSYMBOL_start = 36, /* start */
361 YYSYMBOL_command = 37, /* command */
362 YYSYMBOL_explist = 38, /* explist */
363 YYSYMBOL_expline = 39, /* expline */
364 YYSYMBOL_exp_opt_list = 40, /* exp_opt_list */
365 YYSYMBOL_exp_opt = 41, /* exp_opt */
366 YYSYMBOL_implist = 42, /* implist */
367 YYSYMBOL_impline = 43, /* impline */
368 YYSYMBOL_seclist = 44, /* seclist */
369 YYSYMBOL_secline = 45, /* secline */
370 YYSYMBOL_attr_list = 46, /* attr_list */
371 YYSYMBOL_opt_comma = 47, /* opt_comma */
372 YYSYMBOL_opt_number = 48, /* opt_number */
373 YYSYMBOL_attr = 49, /* attr */
374 YYSYMBOL_keyword_as_name = 50, /* keyword_as_name */
375 YYSYMBOL_opt_name2 = 51, /* opt_name2 */
376 YYSYMBOL_opt_name = 52, /* opt_name */
377 YYSYMBOL_opt_equalequal_name = 53, /* opt_equalequal_name */
378 YYSYMBOL_opt_ordinal = 54, /* opt_ordinal */
379 YYSYMBOL_opt_equal_name = 55, /* opt_equal_name */
380 YYSYMBOL_opt_base = 56, /* opt_base */
381 YYSYMBOL_anylang_id = 57, /* anylang_id */
382 YYSYMBOL_opt_digits = 58, /* opt_digits */
383 YYSYMBOL_opt_id = 59, /* opt_id */
384 YYSYMBOL_NUMBER = 60, /* NUMBER */
385 YYSYMBOL_VMA = 61 /* VMA */
386 };
387 typedef enum yysymbol_kind_t yysymbol_kind_t;
388
389
390
391
392 #ifdef short
393 # undef short
394 #endif
395
396 /* On compilers that do not define __PTRDIFF_MAX__ etc., make sure
397 <limits.h> and (if available) <stdint.h> are included
398 so that the code can choose integer types of a good width. */
399
400 #ifndef __PTRDIFF_MAX__
401 # include <limits.h> /* INFRINGES ON USER NAME SPACE */
402 # if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
403 # include <stdint.h> /* INFRINGES ON USER NAME SPACE */
404 # define YY_STDINT_H
405 # endif
406 #endif
407
408 /* Narrow types that promote to a signed type and that can represent a
409 signed or unsigned integer of at least N bits. In tables they can
410 save space and decrease cache pressure. Promoting to a signed type
411 helps avoid bugs in integer arithmetic. */
412
413 #ifdef __INT_LEAST8_MAX__
414 typedef __INT_LEAST8_TYPE__ yytype_int8;
415 #elif defined YY_STDINT_H
416 typedef int_least8_t yytype_int8;
417 #else
418 typedef signed char yytype_int8;
419 #endif
420
421 #ifdef __INT_LEAST16_MAX__
422 typedef __INT_LEAST16_TYPE__ yytype_int16;
423 #elif defined YY_STDINT_H
424 typedef int_least16_t yytype_int16;
425 #else
426 typedef short yytype_int16;
427 #endif
428
429 /* Work around bug in HP-UX 11.23, which defines these macros
430 incorrectly for preprocessor constants. This workaround can likely
431 be removed in 2023, as HPE has promised support for HP-UX 11.23
432 (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of
433 <https://h20195.www2.hpe.com/V2/getpdf.aspx/4AA4-7673ENW.pdf>. */
434 #ifdef __hpux
435 # undef UINT_LEAST8_MAX
436 # undef UINT_LEAST16_MAX
437 # define UINT_LEAST8_MAX 255
438 # define UINT_LEAST16_MAX 65535
439 #endif
440
441 #if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__
442 typedef __UINT_LEAST8_TYPE__ yytype_uint8;
443 #elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \
444 && UINT_LEAST8_MAX <= INT_MAX)
445 typedef uint_least8_t yytype_uint8;
446 #elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX
447 typedef unsigned char yytype_uint8;
448 #else
449 typedef short yytype_uint8;
450 #endif
451
452 #if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__
453 typedef __UINT_LEAST16_TYPE__ yytype_uint16;
454 #elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \
455 && UINT_LEAST16_MAX <= INT_MAX)
456 typedef uint_least16_t yytype_uint16;
457 #elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX
458 typedef unsigned short yytype_uint16;
459 #else
460 typedef int yytype_uint16;
461 #endif
462
463 #ifndef YYPTRDIFF_T
464 # if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__
465 # define YYPTRDIFF_T __PTRDIFF_TYPE__
466 # define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__
467 # elif defined PTRDIFF_MAX
468 # ifndef ptrdiff_t
469 # include <stddef.h> /* INFRINGES ON USER NAME SPACE */
470 # endif
471 # define YYPTRDIFF_T ptrdiff_t
472 # define YYPTRDIFF_MAXIMUM PTRDIFF_MAX
473 # else
474 # define YYPTRDIFF_T long
475 # define YYPTRDIFF_MAXIMUM LONG_MAX
476 # endif
477 #endif
478
479 #ifndef YYSIZE_T
480 # ifdef __SIZE_TYPE__
481 # define YYSIZE_T __SIZE_TYPE__
482 # elif defined size_t
483 # define YYSIZE_T size_t
484 # elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
485 # include <stddef.h> /* INFRINGES ON USER NAME SPACE */
486 # define YYSIZE_T size_t
487 # else
488 # define YYSIZE_T unsigned
489 # endif
490 #endif
491
492 #define YYSIZE_MAXIMUM \
493 YY_CAST (YYPTRDIFF_T, \
494 (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \
495 ? YYPTRDIFF_MAXIMUM \
496 : YY_CAST (YYSIZE_T, -1)))
497
498 #define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X))
499
500
501 /* Stored state numbers (used for stacks). */
502 typedef yytype_uint8 yy_state_t;
503
504 /* State numbers in computations. */
505 typedef int yy_state_fast_t;
506
507 #ifndef YY_
508 # if defined YYENABLE_NLS && YYENABLE_NLS
509 # if ENABLE_NLS
510 # include <libintl.h> /* INFRINGES ON USER NAME SPACE */
511 # define YY_(Msgid) dgettext ("bison-runtime", Msgid)
512 # endif
513 # endif
514 # ifndef YY_
515 # define YY_(Msgid) Msgid
516 # endif
517 #endif
518
519
520 #ifndef YY_ATTRIBUTE_PURE
521 # if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__)
522 # define YY_ATTRIBUTE_PURE __attribute__ ((__pure__))
523 # else
524 # define YY_ATTRIBUTE_PURE
525 # endif
526 #endif
527
528 #ifndef YY_ATTRIBUTE_UNUSED
529 # if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__)
530 # define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__))
531 # else
532 # define YY_ATTRIBUTE_UNUSED
533 # endif
534 #endif
535
536 /* Suppress unused-variable warnings by "using" E. */
537 #if ! defined lint || defined __GNUC__
538 # define YY_USE(E) ((void) (E))
539 #else
540 # define YY_USE(E) /* empty */
541 #endif
542
543 /* Suppress an incorrect diagnostic about yylval being uninitialized. */
544 #if defined __GNUC__ && ! defined __ICC && 406 <= __GNUC__ * 100 + __GNUC_MINOR__
545 # if __GNUC__ * 100 + __GNUC_MINOR__ < 407
546 # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
547 _Pragma ("GCC diagnostic push") \
548 _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")
549 # else
550 # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
551 _Pragma ("GCC diagnostic push") \
552 _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \
553 _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
554 # endif
555 # define YY_IGNORE_MAYBE_UNINITIALIZED_END \
556 _Pragma ("GCC diagnostic pop")
557 #else
558 # define YY_INITIAL_VALUE(Value) Value
559 #endif
560 #ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
561 # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
562 # define YY_IGNORE_MAYBE_UNINITIALIZED_END
563 #endif
564 #ifndef YY_INITIAL_VALUE
565 # define YY_INITIAL_VALUE(Value) /* Nothing. */
566 #endif
567
568 #if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__
569 # define YY_IGNORE_USELESS_CAST_BEGIN \
570 _Pragma ("GCC diagnostic push") \
571 _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"")
572 # define YY_IGNORE_USELESS_CAST_END \
573 _Pragma ("GCC diagnostic pop")
574 #endif
575 #ifndef YY_IGNORE_USELESS_CAST_BEGIN
576 # define YY_IGNORE_USELESS_CAST_BEGIN
577 # define YY_IGNORE_USELESS_CAST_END
578 #endif
579
580
581 #define YY_ASSERT(E) ((void) (0 && (E)))
582
583 #if !defined yyoverflow
584
585 /* The parser invokes alloca or malloc; define the necessary symbols. */
586
587 # ifdef YYSTACK_USE_ALLOCA
588 # if YYSTACK_USE_ALLOCA
589 # ifdef __GNUC__
590 # define YYSTACK_ALLOC __builtin_alloca
591 # elif defined __BUILTIN_VA_ARG_INCR
592 # include <alloca.h> /* INFRINGES ON USER NAME SPACE */
593 # elif defined _AIX
594 # define YYSTACK_ALLOC __alloca
595 # elif defined _MSC_VER
596 # include <malloc.h> /* INFRINGES ON USER NAME SPACE */
597 # define alloca _alloca
598 # else
599 # define YYSTACK_ALLOC alloca
600 # if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS
601 # include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
602 /* Use EXIT_SUCCESS as a witness for stdlib.h. */
603 # ifndef EXIT_SUCCESS
604 # define EXIT_SUCCESS 0
605 # endif
606 # endif
607 # endif
608 # endif
609 # endif
610
611 # ifdef YYSTACK_ALLOC
612 /* Pacify GCC's 'empty if-body' warning. */
613 # define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
614 # ifndef YYSTACK_ALLOC_MAXIMUM
615 /* The OS might guarantee only one guard page at the bottom of the stack,
616 and a page size can be as small as 4096 bytes. So we cannot safely
617 invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
618 to allow for a few compiler-allocated temporary stack slots. */
619 # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
620 # endif
621 # else
622 # define YYSTACK_ALLOC YYMALLOC
623 # define YYSTACK_FREE YYFREE
624 # ifndef YYSTACK_ALLOC_MAXIMUM
625 # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
626 # endif
627 # if (defined __cplusplus && ! defined EXIT_SUCCESS \
628 && ! ((defined YYMALLOC || defined malloc) \
629 && (defined YYFREE || defined free)))
630 # include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
631 # ifndef EXIT_SUCCESS
632 # define EXIT_SUCCESS 0
633 # endif
634 # endif
635 # ifndef YYMALLOC
636 # define YYMALLOC malloc
637 # if ! defined malloc && ! defined EXIT_SUCCESS
638 void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
639 # endif
640 # endif
641 # ifndef YYFREE
642 # define YYFREE free
643 # if ! defined free && ! defined EXIT_SUCCESS
644 void free (void *); /* INFRINGES ON USER NAME SPACE */
645 # endif
646 # endif
647 # endif
648 #endif /* !defined yyoverflow */
649
650 #if (! defined yyoverflow \
651 && (! defined __cplusplus \
652 || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
653
654 /* A type that is properly aligned for any stack member. */
655 union yyalloc
656 {
657 yy_state_t yyss_alloc;
658 YYSTYPE yyvs_alloc;
659 };
660
661 /* The size of the maximum gap between one aligned stack and the next. */
662 # define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1)
663
664 /* The size of an array large to enough to hold all stacks, each with
665 N elements. */
666 # define YYSTACK_BYTES(N) \
667 ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \
668 + YYSTACK_GAP_MAXIMUM)
669
670 # define YYCOPY_NEEDED 1
671
672 /* Relocate STACK from its old location to the new one. The
673 local variables YYSIZE and YYSTACKSIZE give the old and new number of
674 elements in the stack, and YYPTR gives the new location of the
675 stack. Advance YYPTR to a properly aligned location for the next
676 stack. */
677 # define YYSTACK_RELOCATE(Stack_alloc, Stack) \
678 do \
679 { \
680 YYPTRDIFF_T yynewbytes; \
681 YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \
682 Stack = &yyptr->Stack_alloc; \
683 yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \
684 yyptr += yynewbytes / YYSIZEOF (*yyptr); \
685 } \
686 while (0)
687
688 #endif
689
690 #if defined YYCOPY_NEEDED && YYCOPY_NEEDED
691 /* Copy COUNT objects from SRC to DST. The source and destination do
692 not overlap. */
693 # ifndef YYCOPY
694 # if defined __GNUC__ && 1 < __GNUC__
695 # define YYCOPY(Dst, Src, Count) \
696 __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src)))
697 # else
698 # define YYCOPY(Dst, Src, Count) \
699 do \
700 { \
701 YYPTRDIFF_T yyi; \
702 for (yyi = 0; yyi < (Count); yyi++) \
703 (Dst)[yyi] = (Src)[yyi]; \
704 } \
705 while (0)
706 # endif
707 # endif
708 #endif /* !YYCOPY_NEEDED */
709
710 /* YYFINAL -- State number of the termination state. */
711 #define YYFINAL 69
712 /* YYLAST -- Last index in YYTABLE. */
713 #define YYLAST 149
714
715 /* YYNTOKENS -- Number of terminals. */
716 #define YYNTOKENS 35
717 /* YYNNTS -- Number of nonterminals. */
718 #define YYNNTS 27
719 /* YYNRULES -- Number of rules. */
720 #define YYNRULES 99
721 /* YYNSTATES -- Number of states. */
722 #define YYNSTATES 146
723
724 /* YYMAXUTOK -- Last valid token kind. */
725 #define YYMAXUTOK 285
726
727
728 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
729 as returned by yylex, with out-of-bounds checking. */
730 #define YYTRANSLATE(YYX) \
731 (0 <= (YYX) && (YYX) <= YYMAXUTOK \
732 ? YY_CAST (yysymbol_kind_t, yytranslate[YYX]) \
733 : YYSYMBOL_YYUNDEF)
734
735 /* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
736 as returned by yylex. */
737 static const yytype_int8 yytranslate[] =
738 {
739 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
740 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
741 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
742 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
743 2, 2, 2, 2, 32, 2, 31, 2, 2, 2,
744 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
745 2, 33, 2, 2, 34, 2, 2, 2, 2, 2,
746 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
747 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
748 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
749 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
750 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
751 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
752 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
753 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
754 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
755 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
756 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
757 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
758 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
759 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
760 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
761 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
762 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
763 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
764 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
765 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
766 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
767 25, 26, 27, 28, 29, 30
768 };
769
770 #if YYDEBUG
771 /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
772 static const yytype_int16 yyrline[] =
773 {
774 0, 139, 139, 140, 144, 145, 146, 147, 148, 149,
775 150, 151, 152, 153, 154, 155, 156, 157, 161, 163,
776 164, 171, 178, 179, 182, 183, 184, 185, 186, 187,
777 188, 189, 192, 193, 197, 199, 201, 203, 205, 207,
778 212, 213, 217, 218, 222, 223, 227, 228, 230, 231,
779 235, 236, 237, 238, 242, 243, 244, 245, 246, 247,
780 248, 249, 250, 251, 252, 253, 260, 261, 262, 263,
781 264, 265, 266, 267, 268, 269, 272, 273, 279, 285,
782 291, 299, 300, 303, 304, 308, 309, 313, 314, 317,
783 318, 321, 322, 328, 336, 337, 340, 341, 344, 346
784 };
785 #endif
786
787 /** Accessing symbol of state STATE. */
788 #define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State])
789
790 #if YYDEBUG || 0
791 /* The user-facing name of the symbol whose (internal) number is
792 YYSYMBOL. No bounds checking. */
793 static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED;
794
795 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
796 First, the terminals, then, starting at YYNTOKENS, nonterminals. */
797 static const char *const yytname[] =
798 {
799 "\"end of file\"", "error", "\"invalid token\"", "NAME", "LIBRARY",
800 "DESCRIPTION", "STACKSIZE_K", "HEAPSIZE", "CODE", "DATAU", "DATAL",
801 "SECTIONS", "EXPORTS", "IMPORTS", "VERSIONK", "BASE", "CONSTANTU",
802 "CONSTANTL", "PRIVATEU", "PRIVATEL", "ALIGNCOMM", "READ", "WRITE",
803 "EXECUTE", "SHARED_K", "NONAMEU", "NONAMEL", "DIRECTIVE", "EQUAL", "ID",
804 "DIGITS", "'.'", "','", "'='", "'@'", "$accept", "start", "command",
805 "explist", "expline", "exp_opt_list", "exp_opt", "implist", "impline",
806 "seclist", "secline", "attr_list", "opt_comma", "opt_number", "attr",
807 "keyword_as_name", "opt_name2", "opt_name", "opt_equalequal_name",
808 "opt_ordinal", "opt_equal_name", "opt_base", "anylang_id", "opt_digits",
809 "opt_id", "NUMBER", "VMA", YY_NULLPTR
810 };
811
812 static const char *
813 yysymbol_name (yysymbol_kind_t yysymbol)
814 {
815 return yytname[yysymbol];
816 }
817 #endif
818
819 #define YYPACT_NINF (-82)
820
821 #define yypact_value_is_default(Yyn) \
822 ((Yyn) == YYPACT_NINF)
823
824 #define YYTABLE_NINF (-48)
825
826 #define yytable_value_is_error(Yyn) \
827 0
828
829 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
830 STATE-NUM. */
831 static const yytype_int8 yypact[] =
832 {
833 122, 11, 11, -25, 9, 9, 53, 53, -17, 11,
834 14, 9, -18, 20, 95, -82, -82, -82, -82, -82,
835 -82, -82, -82, -82, -82, -82, -82, -82, -82, -82,
836 -82, -82, -82, -82, -82, -82, -82, -82, 29, 11,
837 47, -82, 67, 67, -82, -82, 54, 54, -82, -82,
838 -82, -82, 48, -82, 48, -14, -17, -82, 11, -82,
839 58, 50, 14, -82, 61, -82, 64, 33, -82, -82,
840 -82, 11, 47, -82, 11, 63, -82, -82, 9, -82,
841 -82, -82, 53, -82, 48, -82, -82, 11, 60, 76,
842 81, -82, 9, -82, 83, 9, -82, -82, 84, -82,
843 -82, -82, 9, 79, -26, 85, -82, -82, 88, -82,
844 -82, -82, -82, 36, 89, 90, -82, 55, -82, -82,
845 -82, -82, -82, -82, -82, -82, -82, -82, 79, 79,
846 -82, 92, 13, 92, 92, 36, -82, 59, -82, -82,
847 -82, -82, 92, 92, -82, -82
848 };
849
850 /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
851 Performed when YYTABLE does not specify something else to do. Zero
852 means the default is an error. */
853 static const yytype_int8 yydefact[] =
854 {
855 0, 82, 82, 0, 0, 0, 0, 0, 0, 18,
856 0, 0, 0, 0, 0, 3, 66, 60, 73, 64,
857 55, 58, 59, 63, 65, 74, 54, 56, 57, 69,
858 70, 71, 75, 62, 72, 67, 68, 61, 76, 0,
859 0, 81, 90, 90, 6, 98, 49, 49, 50, 51,
860 52, 53, 9, 45, 10, 0, 11, 41, 12, 19,
861 88, 0, 13, 33, 14, 91, 0, 0, 16, 1,
862 2, 0, 77, 78, 0, 0, 4, 5, 0, 7,
863 8, 46, 0, 43, 42, 40, 20, 0, 86, 0,
864 0, 32, 0, 92, 95, 0, 80, 79, 0, 48,
865 44, 87, 0, 47, 84, 0, 15, 94, 97, 17,
866 99, 89, 85, 23, 0, 0, 39, 0, 96, 93,
867 28, 29, 26, 27, 30, 31, 24, 25, 47, 47,
868 83, 84, 84, 84, 84, 23, 38, 0, 36, 37,
869 21, 22, 84, 84, 34, 35
870 };
871
872 /* YYPGOTO[NTERM-NUM]. */
873 static const yytype_int16 yypgoto[] =
874 {
875 -82, -82, 107, -82, 65, -11, -82, -82, 75, -82,
876 82, -4, -81, 93, 57, 102, -8, 141, -75, -82,
877 -82, 101, -82, -82, -82, -5, -82
878 };
879
880 /* YYDEFGOTO[NTERM-NUM]. */
881 static const yytype_uint8 yydefgoto[] =
882 {
883 0, 14, 15, 58, 59, 128, 129, 62, 63, 56,
884 57, 52, 82, 79, 53, 40, 41, 42, 116, 103,
885 88, 76, 67, 108, 119, 46, 111
886 };
887
888 /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
889 positive, shift that token. If negative, reduce the rule whose
890 number is the opposite. If YYTABLE_NINF, syntax error. */
891 static const yytype_int16 yytable[] =
892 {
893 47, 60, 114, 54, 44, 115, 64, 48, 49, 50,
894 51, 65, 55, 66, 16, 83, 17, 18, 19, 20,
895 21, 22, 113, 23, 24, 25, 26, 27, 28, 29,
896 30, 73, 31, 32, 33, 34, 35, 36, 37, 45,
897 38, 114, 39, 61, 137, 120, 121, 134, 135, 68,
898 60, 84, 122, 123, 124, 125, 136, 138, 139, 140,
899 71, 126, 127, 96, 94, 95, 97, 144, 145, -47,
900 -47, -47, -47, 99, 48, 49, 50, 51, 74, 101,
901 81, 89, 75, 90, 132, 45, 78, 106, 142, 45,
902 109, 87, 92, 93, 102, 69, 98, 112, 1, 2,
903 3, 4, 5, 6, 7, 104, 8, 9, 10, 11,
904 105, 81, 133, 107, 110, 12, 117, 118, 130, 131,
905 114, 70, 13, 86, 141, 1, 2, 3, 4, 5,
906 6, 7, 143, 8, 9, 10, 11, 91, 85, 100,
907 80, 72, 12, 43, 77, 0, 0, 0, 0, 13
908 };
909
910 static const yytype_int16 yycheck[] =
911 {
912 5, 9, 28, 7, 29, 31, 11, 21, 22, 23,
913 24, 29, 29, 31, 3, 29, 5, 6, 7, 8,
914 9, 10, 103, 12, 13, 14, 15, 16, 17, 18,
915 19, 39, 21, 22, 23, 24, 25, 26, 27, 30,
916 29, 28, 31, 29, 31, 9, 10, 128, 129, 29,
917 58, 55, 16, 17, 18, 19, 131, 132, 133, 134,
918 31, 25, 26, 71, 31, 32, 74, 142, 143, 21,
919 22, 23, 24, 78, 21, 22, 23, 24, 31, 87,
920 32, 31, 15, 33, 29, 30, 32, 92, 29, 30,
921 95, 33, 31, 29, 34, 0, 33, 102, 3, 4,
922 5, 6, 7, 8, 9, 29, 11, 12, 13, 14,
923 29, 32, 117, 30, 30, 20, 31, 29, 29, 29,
924 28, 14, 27, 58, 135, 3, 4, 5, 6, 7,
925 8, 9, 137, 11, 12, 13, 14, 62, 56, 82,
926 47, 39, 20, 2, 43, -1, -1, -1, -1, 27
927 };
928
929 /* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of
930 state STATE-NUM. */
931 static const yytype_int8 yystos[] =
932 {
933 0, 3, 4, 5, 6, 7, 8, 9, 11, 12,
934 13, 14, 20, 27, 36, 37, 3, 5, 6, 7,
935 8, 9, 10, 12, 13, 14, 15, 16, 17, 18,
936 19, 21, 22, 23, 24, 25, 26, 27, 29, 31,
937 50, 51, 52, 52, 29, 30, 60, 60, 21, 22,
938 23, 24, 46, 49, 46, 29, 44, 45, 38, 39,
939 51, 29, 42, 43, 60, 29, 31, 57, 29, 0,
940 37, 31, 50, 51, 31, 15, 56, 56, 32, 48,
941 48, 32, 47, 29, 46, 45, 39, 33, 55, 31,
942 33, 43, 31, 29, 31, 32, 51, 51, 33, 60,
943 49, 51, 34, 54, 29, 29, 60, 30, 58, 60,
944 30, 61, 60, 47, 28, 31, 53, 31, 29, 59,
945 9, 10, 16, 17, 18, 19, 25, 26, 40, 41,
946 29, 29, 29, 60, 47, 47, 53, 31, 53, 53,
947 53, 40, 29, 60, 53, 53
948 };
949
950 /* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */
951 static const yytype_int8 yyr1[] =
952 {
953 0, 35, 36, 36, 37, 37, 37, 37, 37, 37,
954 37, 37, 37, 37, 37, 37, 37, 37, 38, 38,
955 38, 39, 40, 40, 41, 41, 41, 41, 41, 41,
956 41, 41, 42, 42, 43, 43, 43, 43, 43, 43,
957 44, 44, 45, 45, 46, 46, 47, 47, 48, 48,
958 49, 49, 49, 49, 50, 50, 50, 50, 50, 50,
959 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
960 50, 50, 50, 50, 50, 50, 51, 51, 51, 51,
961 51, 52, 52, 53, 53, 54, 54, 55, 55, 56,
962 56, 57, 57, 57, 58, 58, 59, 59, 60, 61
963 };
964
965 /* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */
966 static const yytype_int8 yyr2[] =
967 {
968 0, 2, 2, 1, 3, 3, 2, 3, 3, 2,
969 2, 2, 2, 2, 2, 4, 2, 4, 0, 1,
970 2, 7, 3, 0, 1, 1, 1, 1, 1, 1,
971 1, 1, 2, 1, 8, 8, 6, 6, 6, 4,
972 2, 1, 2, 2, 3, 1, 1, 0, 2, 0,
973 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
974 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
975 1, 1, 1, 1, 1, 1, 1, 2, 2, 3,
976 3, 1, 0, 2, 0, 2, 0, 2, 0, 3,
977 0, 1, 2, 4, 1, 0, 1, 0, 1, 1
978 };
979
980
981 enum { YYENOMEM = -2 };
982
983 #define yyerrok (yyerrstatus = 0)
984 #define yyclearin (yychar = YYEMPTY)
985
986 #define YYACCEPT goto yyacceptlab
987 #define YYABORT goto yyabortlab
988 #define YYERROR goto yyerrorlab
989 #define YYNOMEM goto yyexhaustedlab
990
991
992 #define YYRECOVERING() (!!yyerrstatus)
993
994 #define YYBACKUP(Token, Value) \
995 do \
996 if (yychar == YYEMPTY) \
997 { \
998 yychar = (Token); \
999 yylval = (Value); \
1000 YYPOPSTACK (yylen); \
1001 yystate = *yyssp; \
1002 goto yybackup; \
1003 } \
1004 else \
1005 { \
1006 yyerror (YY_("syntax error: cannot back up")); \
1007 YYERROR; \
1008 } \
1009 while (0)
1010
1011 /* Backward compatibility with an undocumented macro.
1012 Use YYerror or YYUNDEF. */
1013 #define YYERRCODE YYUNDEF
1014
1015
1016 /* Enable debugging if requested. */
1017 #if YYDEBUG
1018
1019 # ifndef YYFPRINTF
1020 # include <stdio.h> /* INFRINGES ON USER NAME SPACE */
1021 # define YYFPRINTF fprintf
1022 # endif
1023
1024 # define YYDPRINTF(Args) \
1025 do { \
1026 if (yydebug) \
1027 YYFPRINTF Args; \
1028 } while (0)
1029
1030
1031
1032
1033 # define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \
1034 do { \
1035 if (yydebug) \
1036 { \
1037 YYFPRINTF (stderr, "%s ", Title); \
1038 yy_symbol_print (stderr, \
1039 Kind, Value); \
1040 YYFPRINTF (stderr, "\n"); \
1041 } \
1042 } while (0)
1043
1044
1045 /*-----------------------------------.
1046 | Print this symbol's value on YYO. |
1047 `-----------------------------------*/
1048
1049 static void
1050 yy_symbol_value_print (FILE *yyo,
1051 yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep)
1052 {
1053 FILE *yyoutput = yyo;
1054 YY_USE (yyoutput);
1055 if (!yyvaluep)
1056 return;
1057 YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
1058 YY_USE (yykind);
1059 YY_IGNORE_MAYBE_UNINITIALIZED_END
1060 }
1061
1062
1063 /*---------------------------.
1064 | Print this symbol on YYO. |
1065 `---------------------------*/
1066
1067 static void
1068 yy_symbol_print (FILE *yyo,
1069 yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep)
1070 {
1071 YYFPRINTF (yyo, "%s %s (",
1072 yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind));
1073
1074 yy_symbol_value_print (yyo, yykind, yyvaluep);
1075 YYFPRINTF (yyo, ")");
1076 }
1077
1078 /*------------------------------------------------------------------.
1079 | yy_stack_print -- Print the state stack from its BOTTOM up to its |
1080 | TOP (included). |
1081 `------------------------------------------------------------------*/
1082
1083 static void
1084 yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop)
1085 {
1086 YYFPRINTF (stderr, "Stack now");
1087 for (; yybottom <= yytop; yybottom++)
1088 {
1089 int yybot = *yybottom;
1090 YYFPRINTF (stderr, " %d", yybot);
1091 }
1092 YYFPRINTF (stderr, "\n");
1093 }
1094
1095 # define YY_STACK_PRINT(Bottom, Top) \
1096 do { \
1097 if (yydebug) \
1098 yy_stack_print ((Bottom), (Top)); \
1099 } while (0)
1100
1101
1102 /*------------------------------------------------.
1103 | Report that the YYRULE is going to be reduced. |
1104 `------------------------------------------------*/
1105
1106 static void
1107 yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp,
1108 int yyrule)
1109 {
1110 int yylno = yyrline[yyrule];
1111 int yynrhs = yyr2[yyrule];
1112 int yyi;
1113 YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n",
1114 yyrule - 1, yylno);
1115 /* The symbols being reduced. */
1116 for (yyi = 0; yyi < yynrhs; yyi++)
1117 {
1118 YYFPRINTF (stderr, " $%d = ", yyi + 1);
1119 yy_symbol_print (stderr,
1120 YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]),
1121 &yyvsp[(yyi + 1) - (yynrhs)]);
1122 YYFPRINTF (stderr, "\n");
1123 }
1124 }
1125
1126 # define YY_REDUCE_PRINT(Rule) \
1127 do { \
1128 if (yydebug) \
1129 yy_reduce_print (yyssp, yyvsp, Rule); \
1130 } while (0)
1131
1132 /* Nonzero means print parse trace. It is left uninitialized so that
1133 multiple parsers can coexist. */
1134 int yydebug;
1135 #else /* !YYDEBUG */
1136 # define YYDPRINTF(Args) ((void) 0)
1137 # define YY_SYMBOL_PRINT(Title, Kind, Value, Location)
1138 # define YY_STACK_PRINT(Bottom, Top)
1139 # define YY_REDUCE_PRINT(Rule)
1140 #endif /* !YYDEBUG */
1141
1142
1143 /* YYINITDEPTH -- initial size of the parser's stacks. */
1144 #ifndef YYINITDEPTH
1145 # define YYINITDEPTH 200
1146 #endif
1147
1148 /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
1149 if the built-in stack extension method is used).
1150
1151 Do not make this value too large; the results are undefined if
1152 YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
1153 evaluated with infinite-precision integer arithmetic. */
1154
1155 #ifndef YYMAXDEPTH
1156 # define YYMAXDEPTH 10000
1157 #endif
1158
1159
1160
1161
1162
1163
1164 /*-----------------------------------------------.
1165 | Release the memory associated to this symbol. |
1166 `-----------------------------------------------*/
1167
1168 static void
1169 yydestruct (const char *yymsg,
1170 yysymbol_kind_t yykind, YYSTYPE *yyvaluep)
1171 {
1172 YY_USE (yyvaluep);
1173 if (!yymsg)
1174 yymsg = "Deleting";
1175 YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp);
1176
1177 YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
1178 YY_USE (yykind);
1179 YY_IGNORE_MAYBE_UNINITIALIZED_END
1180 }
1181
1182
1183 /* Lookahead token kind. */
1184 int yychar;
1185
1186 /* The semantic value of the lookahead symbol. */
1187 YYSTYPE yylval;
1188 /* Number of syntax errors so far. */
1189 int yynerrs;
1190
1191
1192
1193
1194 /*----------.
1195 | yyparse. |
1196 `----------*/
1197
1198 int
1199 yyparse (void)
1200 {
1201 yy_state_fast_t yystate = 0;
1202 /* Number of tokens to shift before error messages enabled. */
1203 int yyerrstatus = 0;
1204
1205 /* Refer to the stacks through separate pointers, to allow yyoverflow
1206 to reallocate them elsewhere. */
1207
1208 /* Their size. */
1209 YYPTRDIFF_T yystacksize = YYINITDEPTH;
1210
1211 /* The state stack: array, bottom, top. */
1212 yy_state_t yyssa[YYINITDEPTH];
1213 yy_state_t *yyss = yyssa;
1214 yy_state_t *yyssp = yyss;
1215
1216 /* The semantic value stack: array, bottom, top. */
1217 YYSTYPE yyvsa[YYINITDEPTH];
1218 YYSTYPE *yyvs = yyvsa;
1219 YYSTYPE *yyvsp = yyvs;
1220
1221 int yyn;
1222 /* The return value of yyparse. */
1223 int yyresult;
1224 /* Lookahead symbol kind. */
1225 yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY;
1226 /* The variables used to return semantic value and location from the
1227 action routines. */
1228 YYSTYPE yyval;
1229
1230
1231
1232 #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
1233
1234 /* The number of symbols on the RHS of the reduced rule.
1235 Keep to zero when no symbol should be popped. */
1236 int yylen = 0;
1237
1238 YYDPRINTF ((stderr, "Starting parse\n"));
1239
1240 yychar = YYEMPTY; /* Cause a token to be read. */
1241
1242 goto yysetstate;
1243
1244
1245 /*------------------------------------------------------------.
1246 | yynewstate -- push a new state, which is found in yystate. |
1247 `------------------------------------------------------------*/
1248 yynewstate:
1249 /* In all cases, when you get here, the value and location stacks
1250 have just been pushed. So pushing a state here evens the stacks. */
1251 yyssp++;
1252
1253
1254 /*--------------------------------------------------------------------.
1255 | yysetstate -- set current state (the top of the stack) to yystate. |
1256 `--------------------------------------------------------------------*/
1257 yysetstate:
1258 YYDPRINTF ((stderr, "Entering state %d\n", yystate));
1259 YY_ASSERT (0 <= yystate && yystate < YYNSTATES);
1260 YY_IGNORE_USELESS_CAST_BEGIN
1261 *yyssp = YY_CAST (yy_state_t, yystate);
1262 YY_IGNORE_USELESS_CAST_END
1263 YY_STACK_PRINT (yyss, yyssp);
1264
1265 if (yyss + yystacksize - 1 <= yyssp)
1266 #if !defined yyoverflow && !defined YYSTACK_RELOCATE
1267 YYNOMEM;
1268 #else
1269 {
1270 /* Get the current used size of the three stacks, in elements. */
1271 YYPTRDIFF_T yysize = yyssp - yyss + 1;
1272
1273 # if defined yyoverflow
1274 {
1275 /* Give user a chance to reallocate the stack. Use copies of
1276 these so that the &'s don't force the real ones into
1277 memory. */
1278 yy_state_t *yyss1 = yyss;
1279 YYSTYPE *yyvs1 = yyvs;
1280
1281 /* Each stack pointer address is followed by the size of the
1282 data in use in that stack, in bytes. This used to be a
1283 conditional around just the two extra args, but that might
1284 be undefined if yyoverflow is a macro. */
1285 yyoverflow (YY_("memory exhausted"),
1286 &yyss1, yysize * YYSIZEOF (*yyssp),
1287 &yyvs1, yysize * YYSIZEOF (*yyvsp),
1288 &yystacksize);
1289 yyss = yyss1;
1290 yyvs = yyvs1;
1291 }
1292 # else /* defined YYSTACK_RELOCATE */
1293 /* Extend the stack our own way. */
1294 if (YYMAXDEPTH <= yystacksize)
1295 YYNOMEM;
1296 yystacksize *= 2;
1297 if (YYMAXDEPTH < yystacksize)
1298 yystacksize = YYMAXDEPTH;
1299
1300 {
1301 yy_state_t *yyss1 = yyss;
1302 union yyalloc *yyptr =
1303 YY_CAST (union yyalloc *,
1304 YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize))));
1305 if (! yyptr)
1306 YYNOMEM;
1307 YYSTACK_RELOCATE (yyss_alloc, yyss);
1308 YYSTACK_RELOCATE (yyvs_alloc, yyvs);
1309 # undef YYSTACK_RELOCATE
1310 if (yyss1 != yyssa)
1311 YYSTACK_FREE (yyss1);
1312 }
1313 # endif
1314
1315 yyssp = yyss + yysize - 1;
1316 yyvsp = yyvs + yysize - 1;
1317
1318 YY_IGNORE_USELESS_CAST_BEGIN
1319 YYDPRINTF ((stderr, "Stack size increased to %ld\n",
1320 YY_CAST (long, yystacksize)));
1321 YY_IGNORE_USELESS_CAST_END
1322
1323 if (yyss + yystacksize - 1 <= yyssp)
1324 YYABORT;
1325 }
1326 #endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */
1327
1328
1329 if (yystate == YYFINAL)
1330 YYACCEPT;
1331
1332 goto yybackup;
1333
1334
1335 /*-----------.
1336 | yybackup. |
1337 `-----------*/
1338 yybackup:
1339 /* Do appropriate processing given the current state. Read a
1340 lookahead token if we need one and don't already have one. */
1341
1342 /* First try to decide what to do without reference to lookahead token. */
1343 yyn = yypact[yystate];
1344 if (yypact_value_is_default (yyn))
1345 goto yydefault;
1346
1347 /* Not known => get a lookahead token if don't already have one. */
1348
1349 /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */
1350 if (yychar == YYEMPTY)
1351 {
1352 YYDPRINTF ((stderr, "Reading a token\n"));
1353 yychar = yylex ();
1354 }
1355
1356 if (yychar <= YYEOF)
1357 {
1358 yychar = YYEOF;
1359 yytoken = YYSYMBOL_YYEOF;
1360 YYDPRINTF ((stderr, "Now at end of input.\n"));
1361 }
1362 else if (yychar == YYerror)
1363 {
1364 /* The scanner already issued an error message, process directly
1365 to error recovery. But do not keep the error token as
1366 lookahead, it is too special and may lead us to an endless
1367 loop in error recovery. */
1368 yychar = YYUNDEF;
1369 yytoken = YYSYMBOL_YYerror;
1370 goto yyerrlab1;
1371 }
1372 else
1373 {
1374 yytoken = YYTRANSLATE (yychar);
1375 YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
1376 }
1377
1378 /* If the proper action on seeing token YYTOKEN is to reduce or to
1379 detect an error, take that action. */
1380 yyn += yytoken;
1381 if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
1382 goto yydefault;
1383 yyn = yytable[yyn];
1384 if (yyn <= 0)
1385 {
1386 if (yytable_value_is_error (yyn))
1387 goto yyerrlab;
1388 yyn = -yyn;
1389 goto yyreduce;
1390 }
1391
1392 /* Count tokens shifted since error; after three, turn off error
1393 status. */
1394 if (yyerrstatus)
1395 yyerrstatus--;
1396
1397 /* Shift the lookahead token. */
1398 YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
1399 yystate = yyn;
1400 YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
1401 *++yyvsp = yylval;
1402 YY_IGNORE_MAYBE_UNINITIALIZED_END
1403
1404 /* Discard the shifted token. */
1405 yychar = YYEMPTY;
1406 goto yynewstate;
1407
1408
1409 /*-----------------------------------------------------------.
1410 | yydefault -- do the default action for the current state. |
1411 `-----------------------------------------------------------*/
1412 yydefault:
1413 yyn = yydefact[yystate];
1414 if (yyn == 0)
1415 goto yyerrlab;
1416 goto yyreduce;
1417
1418
1419 /*-----------------------------.
1420 | yyreduce -- do a reduction. |
1421 `-----------------------------*/
1422 yyreduce:
1423 /* yyn is the number of a rule to reduce with. */
1424 yylen = yyr2[yyn];
1425
1426 /* If YYLEN is nonzero, implement the default value of the action:
1427 '$$ = $1'.
1428
1429 Otherwise, the following line sets YYVAL to garbage.
1430 This behavior is undocumented and Bison
1431 users should not rely upon it. Assigning to YYVAL
1432 unconditionally makes the parser a bit smaller, and it avoids a
1433 GCC warning that YYVAL may be used uninitialized. */
1434 yyval = yyvsp[1-yylen];
1435
1436
1437 YY_REDUCE_PRINT (yyn);
1438 switch (yyn)
1439 {
1440 case 4: /* command: NAME opt_name opt_base */
1441 #line 144 "deffilep.y"
1442 { def_image_name ((yyvsp[-1].id), (yyvsp[0].vma), 0); }
1443 #line 1444 "deffilep.c"
1444 break;
1445
1446 case 5: /* command: LIBRARY opt_name opt_base */
1447 #line 145 "deffilep.y"
1448 { def_image_name ((yyvsp[-1].id), (yyvsp[0].vma), 1); }
1449 #line 1450 "deffilep.c"
1450 break;
1451
1452 case 6: /* command: DESCRIPTION ID */
1453 #line 146 "deffilep.y"
1454 { def_description ((yyvsp[0].id));}
1455 #line 1456 "deffilep.c"
1456 break;
1457
1458 case 7: /* command: STACKSIZE_K NUMBER opt_number */
1459 #line 147 "deffilep.y"
1460 { def_stacksize ((yyvsp[-1].number), (yyvsp[0].number));}
1461 #line 1462 "deffilep.c"
1462 break;
1463
1464 case 8: /* command: HEAPSIZE NUMBER opt_number */
1465 #line 148 "deffilep.y"
1466 { def_heapsize ((yyvsp[-1].number), (yyvsp[0].number));}
1467 #line 1468 "deffilep.c"
1468 break;
1469
1470 case 9: /* command: CODE attr_list */
1471 #line 149 "deffilep.y"
1472 { def_section ("CODE", (yyvsp[0].number));}
1473 #line 1474 "deffilep.c"
1474 break;
1475
1476 case 10: /* command: DATAU attr_list */
1477 #line 150 "deffilep.y"
1478 { def_section ("DATA", (yyvsp[0].number));}
1479 #line 1480 "deffilep.c"
1480 break;
1481
1482 case 14: /* command: VERSIONK NUMBER */
1483 #line 154 "deffilep.y"
1484 { def_version ((yyvsp[0].number), 0);}
1485 #line 1486 "deffilep.c"
1486 break;
1487
1488 case 15: /* command: VERSIONK NUMBER '.' NUMBER */
1489 #line 155 "deffilep.y"
1490 { def_version ((yyvsp[-2].number), (yyvsp[0].number));}
1491 #line 1492 "deffilep.c"
1492 break;
1493
1494 case 16: /* command: DIRECTIVE ID */
1495 #line 156 "deffilep.y"
1496 { def_directive ((yyvsp[0].id));}
1497 #line 1498 "deffilep.c"
1498 break;
1499
1500 case 17: /* command: ALIGNCOMM anylang_id ',' NUMBER */
1501 #line 157 "deffilep.y"
1502 { def_aligncomm ((yyvsp[-2].id), (yyvsp[0].number));}
1503 #line 1504 "deffilep.c"
1504 break;
1505
1506 case 21: /* expline: opt_name2 opt_equal_name opt_ordinal opt_comma exp_opt_list opt_comma opt_equalequal_name */
1507 #line 172 "deffilep.y"
1508 { def_exports ((yyvsp[-6].id), (yyvsp[-5].id), (yyvsp[-4].number), (yyvsp[-2].number), (yyvsp[0].id)); }
1509 #line 1510 "deffilep.c"
1510 break;
1511
1512 case 22: /* exp_opt_list: exp_opt opt_comma exp_opt_list */
1513 #line 178 "deffilep.y"
1514 { (yyval.number) = (yyvsp[-2].number) | (yyvsp[0].number); }
1515 #line 1516 "deffilep.c"
1516 break;
1517
1518 case 23: /* exp_opt_list: %empty */
1519 #line 179 "deffilep.y"
1520 { (yyval.number) = 0; }
1521 #line 1522 "deffilep.c"
1522 break;
1523
1524 case 24: /* exp_opt: NONAMEU */
1525 #line 182 "deffilep.y"
1526 { (yyval.number) = 1; }
1527 #line 1528 "deffilep.c"
1528 break;
1529
1530 case 25: /* exp_opt: NONAMEL */
1531 #line 183 "deffilep.y"
1532 { (yyval.number) = 1; }
1533 #line 1534 "deffilep.c"
1534 break;
1535
1536 case 26: /* exp_opt: CONSTANTU */
1537 #line 184 "deffilep.y"
1538 { (yyval.number) = 2; }
1539 #line 1540 "deffilep.c"
1540 break;
1541
1542 case 27: /* exp_opt: CONSTANTL */
1543 #line 185 "deffilep.y"
1544 { (yyval.number) = 2; }
1545 #line 1546 "deffilep.c"
1546 break;
1547
1548 case 28: /* exp_opt: DATAU */
1549 #line 186 "deffilep.y"
1550 { (yyval.number) = 4; }
1551 #line 1552 "deffilep.c"
1552 break;
1553
1554 case 29: /* exp_opt: DATAL */
1555 #line 187 "deffilep.y"
1556 { (yyval.number) = 4; }
1557 #line 1558 "deffilep.c"
1558 break;
1559
1560 case 30: /* exp_opt: PRIVATEU */
1561 #line 188 "deffilep.y"
1562 { (yyval.number) = 8; }
1563 #line 1564 "deffilep.c"
1564 break;
1565
1566 case 31: /* exp_opt: PRIVATEL */
1567 #line 189 "deffilep.y"
1568 { (yyval.number) = 8; }
1569 #line 1570 "deffilep.c"
1570 break;
1571
1572 case 34: /* impline: ID '=' ID '.' ID '.' ID opt_equalequal_name */
1573 #line 198 "deffilep.y"
1574 { def_import ((yyvsp[-7].id), (yyvsp[-5].id), (yyvsp[-3].id), (yyvsp[-1].id), -1, (yyvsp[0].id)); }
1575 #line 1576 "deffilep.c"
1576 break;
1577
1578 case 35: /* impline: ID '=' ID '.' ID '.' NUMBER opt_equalequal_name */
1579 #line 200 "deffilep.y"
1580 { def_import ((yyvsp[-7].id), (yyvsp[-5].id), (yyvsp[-3].id), 0, (yyvsp[-1].number), (yyvsp[0].id)); }
1581 #line 1582 "deffilep.c"
1582 break;
1583
1584 case 36: /* impline: ID '=' ID '.' ID opt_equalequal_name */
1585 #line 202 "deffilep.y"
1586 { def_import ((yyvsp[-5].id), (yyvsp[-3].id), 0, (yyvsp[-1].id), -1, (yyvsp[0].id)); }
1587 #line 1588 "deffilep.c"
1588 break;
1589
1590 case 37: /* impline: ID '=' ID '.' NUMBER opt_equalequal_name */
1591 #line 204 "deffilep.y"
1592 { def_import ((yyvsp[-5].id), (yyvsp[-3].id), 0, 0, (yyvsp[-1].number), (yyvsp[0].id)); }
1593 #line 1594 "deffilep.c"
1594 break;
1595
1596 case 38: /* impline: ID '.' ID '.' ID opt_equalequal_name */
1597 #line 206 "deffilep.y"
1598 { def_import( 0, (yyvsp[-5].id), (yyvsp[-3].id), (yyvsp[-1].id), -1, (yyvsp[0].id)); }
1599 #line 1600 "deffilep.c"
1600 break;
1601
1602 case 39: /* impline: ID '.' ID opt_equalequal_name */
1603 #line 208 "deffilep.y"
1604 { def_import ( 0, (yyvsp[-3].id), 0, (yyvsp[-1].id), -1, (yyvsp[0].id)); }
1605 #line 1606 "deffilep.c"
1606 break;
1607
1608 case 42: /* secline: ID attr_list */
1609 #line 217 "deffilep.y"
1610 { def_section ((yyvsp[-1].id), (yyvsp[0].number));}
1611 #line 1612 "deffilep.c"
1612 break;
1613
1614 case 43: /* secline: ID ID */
1615 #line 218 "deffilep.y"
1616 { def_section_alt ((yyvsp[-1].id), (yyvsp[0].id));}
1617 #line 1618 "deffilep.c"
1618 break;
1619
1620 case 44: /* attr_list: attr_list opt_comma attr */
1621 #line 222 "deffilep.y"
1622 { (yyval.number) = (yyvsp[-2].number) | (yyvsp[0].number); }
1623 #line 1624 "deffilep.c"
1624 break;
1625
1626 case 45: /* attr_list: attr */
1627 #line 223 "deffilep.y"
1628 { (yyval.number) = (yyvsp[0].number); }
1629 #line 1630 "deffilep.c"
1630 break;
1631
1632 case 48: /* opt_number: ',' NUMBER */
1633 #line 230 "deffilep.y"
1634 { (yyval.number)=(yyvsp[0].number);}
1635 #line 1636 "deffilep.c"
1636 break;
1637
1638 case 49: /* opt_number: %empty */
1639 #line 231 "deffilep.y"
1640 { (yyval.number)=-1;}
1641 #line 1642 "deffilep.c"
1642 break;
1643
1644 case 50: /* attr: READ */
1645 #line 235 "deffilep.y"
1646 { (yyval.number) = 1;}
1647 #line 1648 "deffilep.c"
1648 break;
1649
1650 case 51: /* attr: WRITE */
1651 #line 236 "deffilep.y"
1652 { (yyval.number) = 2;}
1653 #line 1654 "deffilep.c"
1654 break;
1655
1656 case 52: /* attr: EXECUTE */
1657 #line 237 "deffilep.y"
1658 { (yyval.number)=4;}
1659 #line 1660 "deffilep.c"
1660 break;
1661
1662 case 53: /* attr: SHARED_K */
1663 #line 238 "deffilep.y"
1664 { (yyval.number)=8;}
1665 #line 1666 "deffilep.c"
1666 break;
1667
1668 case 54: /* keyword_as_name: BASE */
1669 #line 242 "deffilep.y"
1670 { (yyval.id_const) = "BASE"; }
1671 #line 1672 "deffilep.c"
1672 break;
1673
1674 case 55: /* keyword_as_name: CODE */
1675 #line 243 "deffilep.y"
1676 { (yyval.id_const) = "CODE"; }
1677 #line 1678 "deffilep.c"
1678 break;
1679
1680 case 56: /* keyword_as_name: CONSTANTU */
1681 #line 244 "deffilep.y"
1682 { (yyval.id_const) = "CONSTANT"; }
1683 #line 1684 "deffilep.c"
1684 break;
1685
1686 case 57: /* keyword_as_name: CONSTANTL */
1687 #line 245 "deffilep.y"
1688 { (yyval.id_const) = "constant"; }
1689 #line 1690 "deffilep.c"
1690 break;
1691
1692 case 58: /* keyword_as_name: DATAU */
1693 #line 246 "deffilep.y"
1694 { (yyval.id_const) = "DATA"; }
1695 #line 1696 "deffilep.c"
1696 break;
1697
1698 case 59: /* keyword_as_name: DATAL */
1699 #line 247 "deffilep.y"
1700 { (yyval.id_const) = "data"; }
1701 #line 1702 "deffilep.c"
1702 break;
1703
1704 case 60: /* keyword_as_name: DESCRIPTION */
1705 #line 248 "deffilep.y"
1706 { (yyval.id_const) = "DESCRIPTION"; }
1707 #line 1708 "deffilep.c"
1708 break;
1709
1710 case 61: /* keyword_as_name: DIRECTIVE */
1711 #line 249 "deffilep.y"
1712 { (yyval.id_const) = "DIRECTIVE"; }
1713 #line 1714 "deffilep.c"
1714 break;
1715
1716 case 62: /* keyword_as_name: EXECUTE */
1717 #line 250 "deffilep.y"
1718 { (yyval.id_const) = "EXECUTE"; }
1719 #line 1720 "deffilep.c"
1720 break;
1721
1722 case 63: /* keyword_as_name: EXPORTS */
1723 #line 251 "deffilep.y"
1724 { (yyval.id_const) = "EXPORTS"; }
1725 #line 1726 "deffilep.c"
1726 break;
1727
1728 case 64: /* keyword_as_name: HEAPSIZE */
1729 #line 252 "deffilep.y"
1730 { (yyval.id_const) = "HEAPSIZE"; }
1731 #line 1732 "deffilep.c"
1732 break;
1733
1734 case 65: /* keyword_as_name: IMPORTS */
1735 #line 253 "deffilep.y"
1736 { (yyval.id_const) = "IMPORTS"; }
1737 #line 1738 "deffilep.c"
1738 break;
1739
1740 case 66: /* keyword_as_name: NAME */
1741 #line 260 "deffilep.y"
1742 { (yyval.id_const) = "NAME"; }
1743 #line 1744 "deffilep.c"
1744 break;
1745
1746 case 67: /* keyword_as_name: NONAMEU */
1747 #line 261 "deffilep.y"
1748 { (yyval.id_const) = "NONAME"; }
1749 #line 1750 "deffilep.c"
1750 break;
1751
1752 case 68: /* keyword_as_name: NONAMEL */
1753 #line 262 "deffilep.y"
1754 { (yyval.id_const) = "noname"; }
1755 #line 1756 "deffilep.c"
1756 break;
1757
1758 case 69: /* keyword_as_name: PRIVATEU */
1759 #line 263 "deffilep.y"
1760 { (yyval.id_const) = "PRIVATE"; }
1761 #line 1762 "deffilep.c"
1762 break;
1763
1764 case 70: /* keyword_as_name: PRIVATEL */
1765 #line 264 "deffilep.y"
1766 { (yyval.id_const) = "private"; }
1767 #line 1768 "deffilep.c"
1768 break;
1769
1770 case 71: /* keyword_as_name: READ */
1771 #line 265 "deffilep.y"
1772 { (yyval.id_const) = "READ"; }
1773 #line 1774 "deffilep.c"
1774 break;
1775
1776 case 72: /* keyword_as_name: SHARED_K */
1777 #line 266 "deffilep.y"
1778 { (yyval.id_const) = "SHARED"; }
1779 #line 1780 "deffilep.c"
1780 break;
1781
1782 case 73: /* keyword_as_name: STACKSIZE_K */
1783 #line 267 "deffilep.y"
1784 { (yyval.id_const) = "STACKSIZE"; }
1785 #line 1786 "deffilep.c"
1786 break;
1787
1788 case 74: /* keyword_as_name: VERSIONK */
1789 #line 268 "deffilep.y"
1790 { (yyval.id_const) = "VERSION"; }
1791 #line 1792 "deffilep.c"
1792 break;
1793
1794 case 75: /* keyword_as_name: WRITE */
1795 #line 269 "deffilep.y"
1796 { (yyval.id_const) = "WRITE"; }
1797 #line 1798 "deffilep.c"
1798 break;
1799
1800 case 76: /* opt_name2: ID */
1801 #line 272 "deffilep.y"
1802 { (yyval.id) = (yyvsp[0].id); }
1803 #line 1804 "deffilep.c"
1804 break;
1805
1806 case 77: /* opt_name2: '.' keyword_as_name */
1807 #line 274 "deffilep.y"
1808 {
1809 char *name = xmalloc (strlen ((yyvsp[0].id_const)) + 2);
1810 sprintf (name, ".%s", (yyvsp[0].id_const));
1811 (yyval.id) = name;
1812 }
1813 #line 1814 "deffilep.c"
1814 break;
1815
1816 case 78: /* opt_name2: '.' opt_name2 */
1817 #line 280 "deffilep.y"
1818 {
1819 char *name = def_pool_alloc (strlen ((yyvsp[0].id)) + 2);
1820 sprintf (name, ".%s", (yyvsp[0].id));
1821 (yyval.id) = name;
1822 }
1823 #line 1824 "deffilep.c"
1824 break;
1825
1826 case 79: /* opt_name2: keyword_as_name '.' opt_name2 */
1827 #line 286 "deffilep.y"
1828 {
1829 char *name = def_pool_alloc (strlen ((yyvsp[-2].id_const)) + 1 + strlen ((yyvsp[0].id)) + 1);
1830 sprintf (name, "%s.%s", (yyvsp[-2].id_const), (yyvsp[0].id));
1831 (yyval.id) = name;
1832 }
1833 #line 1834 "deffilep.c"
1834 break;
1835
1836 case 80: /* opt_name2: ID '.' opt_name2 */
1837 #line 292 "deffilep.y"
1838 {
1839 char *name = def_pool_alloc (strlen ((yyvsp[-2].id)) + 1 + strlen ((yyvsp[0].id)) + 1);
1840 sprintf (name, "%s.%s", (yyvsp[-2].id), (yyvsp[0].id));
1841 (yyval.id) = name;
1842 }
1843 #line 1844 "deffilep.c"
1844 break;
1845
1846 case 81: /* opt_name: opt_name2 */
1847 #line 299 "deffilep.y"
1848 { (yyval.id) = (yyvsp[0].id); }
1849 #line 1850 "deffilep.c"
1850 break;
1851
1852 case 82: /* opt_name: %empty */
1853 #line 300 "deffilep.y"
1854 { (yyval.id) = ""; }
1855 #line 1856 "deffilep.c"
1856 break;
1857
1858 case 83: /* opt_equalequal_name: EQUAL ID */
1859 #line 303 "deffilep.y"
1860 { (yyval.id) = (yyvsp[0].id); }
1861 #line 1862 "deffilep.c"
1862 break;
1863
1864 case 84: /* opt_equalequal_name: %empty */
1865 #line 304 "deffilep.y"
1866 { (yyval.id) = 0; }
1867 #line 1868 "deffilep.c"
1868 break;
1869
1870 case 85: /* opt_ordinal: '@' NUMBER */
1871 #line 308 "deffilep.y"
1872 { (yyval.number) = (yyvsp[0].number);}
1873 #line 1874 "deffilep.c"
1874 break;
1875
1876 case 86: /* opt_ordinal: %empty */
1877 #line 309 "deffilep.y"
1878 { (yyval.number) = -1;}
1879 #line 1880 "deffilep.c"
1880 break;
1881
1882 case 87: /* opt_equal_name: '=' opt_name2 */
1883 #line 313 "deffilep.y"
1884 { (yyval.id) = (yyvsp[0].id); }
1885 #line 1886 "deffilep.c"
1886 break;
1887
1888 case 88: /* opt_equal_name: %empty */
1889 #line 314 "deffilep.y"
1890 { (yyval.id) = 0; }
1891 #line 1892 "deffilep.c"
1892 break;
1893
1894 case 89: /* opt_base: BASE '=' VMA */
1895 #line 317 "deffilep.y"
1896 { (yyval.vma) = (yyvsp[0].vma);}
1897 #line 1898 "deffilep.c"
1898 break;
1899
1900 case 90: /* opt_base: %empty */
1901 #line 318 "deffilep.y"
1902 { (yyval.vma) = (bfd_vma) -1;}
1903 #line 1904 "deffilep.c"
1904 break;
1905
1906 case 91: /* anylang_id: ID */
1907 #line 321 "deffilep.y"
1908 { (yyval.id) = (yyvsp[0].id); }
1909 #line 1910 "deffilep.c"
1910 break;
1911
1912 case 92: /* anylang_id: '.' ID */
1913 #line 323 "deffilep.y"
1914 {
1915 char *id = def_pool_alloc (strlen ((yyvsp[0].id)) + 2);
1916 sprintf (id, ".%s", (yyvsp[0].id));
1917 (yyval.id) = id;
1918 }
1919 #line 1920 "deffilep.c"
1920 break;
1921
1922 case 93: /* anylang_id: anylang_id '.' opt_digits opt_id */
1923 #line 329 "deffilep.y"
1924 {
1925 char *id = def_pool_alloc (strlen ((yyvsp[-3].id)) + 1 + strlen ((yyvsp[-1].digits)) + strlen ((yyvsp[0].id)) + 1);
1926 sprintf (id, "%s.%s%s", (yyvsp[-3].id), (yyvsp[-1].digits), (yyvsp[0].id));
1927 (yyval.id) = id;
1928 }
1929 #line 1930 "deffilep.c"
1930 break;
1931
1932 case 94: /* opt_digits: DIGITS */
1933 #line 336 "deffilep.y"
1934 { (yyval.digits) = (yyvsp[0].digits); }
1935 #line 1936 "deffilep.c"
1936 break;
1937
1938 case 95: /* opt_digits: %empty */
1939 #line 337 "deffilep.y"
1940 { (yyval.digits) = ""; }
1941 #line 1942 "deffilep.c"
1942 break;
1943
1944 case 96: /* opt_id: ID */
1945 #line 340 "deffilep.y"
1946 { (yyval.id) = (yyvsp[0].id); }
1947 #line 1948 "deffilep.c"
1948 break;
1949
1950 case 97: /* opt_id: %empty */
1951 #line 341 "deffilep.y"
1952 { (yyval.id) = ""; }
1953 #line 1954 "deffilep.c"
1954 break;
1955
1956 case 98: /* NUMBER: DIGITS */
1957 #line 344 "deffilep.y"
1958 { (yyval.number) = strtoul ((yyvsp[0].digits), 0, 0); }
1959 #line 1960 "deffilep.c"
1960 break;
1961
1962 case 99: /* VMA: DIGITS */
1963 #line 346 "deffilep.y"
1964 { (yyval.vma) = (bfd_vma) strtoull ((yyvsp[0].digits), 0, 0); }
1965 #line 1966 "deffilep.c"
1966 break;
1967
1968
1969 #line 1970 "deffilep.c"
1970
1971 default: break;
1972 }
1973 /* User semantic actions sometimes alter yychar, and that requires
1974 that yytoken be updated with the new translation. We take the
1975 approach of translating immediately before every use of yytoken.
1976 One alternative is translating here after every semantic action,
1977 but that translation would be missed if the semantic action invokes
1978 YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or
1979 if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an
1980 incorrect destructor might then be invoked immediately. In the
1981 case of YYERROR or YYBACKUP, subsequent parser actions might lead
1982 to an incorrect destructor call or verbose syntax error message
1983 before the lookahead is translated. */
1984 YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc);
1985
1986 YYPOPSTACK (yylen);
1987 yylen = 0;
1988
1989 *++yyvsp = yyval;
1990
1991 /* Now 'shift' the result of the reduction. Determine what state
1992 that goes to, based on the state we popped back to and the rule
1993 number reduced by. */
1994 {
1995 const int yylhs = yyr1[yyn] - YYNTOKENS;
1996 const int yyi = yypgoto[yylhs] + *yyssp;
1997 yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp
1998 ? yytable[yyi]
1999 : yydefgoto[yylhs]);
2000 }
2001
2002 goto yynewstate;
2003
2004
2005 /*--------------------------------------.
2006 | yyerrlab -- here on detecting error. |
2007 `--------------------------------------*/
2008 yyerrlab:
2009 /* Make sure we have latest lookahead translation. See comments at
2010 user semantic actions for why this is necessary. */
2011 yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar);
2012 /* If not already recovering from an error, report this error. */
2013 if (!yyerrstatus)
2014 {
2015 ++yynerrs;
2016 yyerror (YY_("syntax error"));
2017 }
2018
2019 if (yyerrstatus == 3)
2020 {
2021 /* If just tried and failed to reuse lookahead token after an
2022 error, discard it. */
2023
2024 if (yychar <= YYEOF)
2025 {
2026 /* Return failure if at end of input. */
2027 if (yychar == YYEOF)
2028 YYABORT;
2029 }
2030 else
2031 {
2032 yydestruct ("Error: discarding",
2033 yytoken, &yylval);
2034 yychar = YYEMPTY;
2035 }
2036 }
2037
2038 /* Else will try to reuse lookahead token after shifting the error
2039 token. */
2040 goto yyerrlab1;
2041
2042
2043 /*---------------------------------------------------.
2044 | yyerrorlab -- error raised explicitly by YYERROR. |
2045 `---------------------------------------------------*/
2046 yyerrorlab:
2047 /* Pacify compilers when the user code never invokes YYERROR and the
2048 label yyerrorlab therefore never appears in user code. */
2049 if (0)
2050 YYERROR;
2051 ++yynerrs;
2052
2053 /* Do not reclaim the symbols of the rule whose action triggered
2054 this YYERROR. */
2055 YYPOPSTACK (yylen);
2056 yylen = 0;
2057 YY_STACK_PRINT (yyss, yyssp);
2058 yystate = *yyssp;
2059 goto yyerrlab1;
2060
2061
2062 /*-------------------------------------------------------------.
2063 | yyerrlab1 -- common code for both syntax error and YYERROR. |
2064 `-------------------------------------------------------------*/
2065 yyerrlab1:
2066 yyerrstatus = 3; /* Each real token shifted decrements this. */
2067
2068 /* Pop stack until we find a state that shifts the error token. */
2069 for (;;)
2070 {
2071 yyn = yypact[yystate];
2072 if (!yypact_value_is_default (yyn))
2073 {
2074 yyn += YYSYMBOL_YYerror;
2075 if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror)
2076 {
2077 yyn = yytable[yyn];
2078 if (0 < yyn)
2079 break;
2080 }
2081 }
2082
2083 /* Pop the current state because it cannot handle the error token. */
2084 if (yyssp == yyss)
2085 YYABORT;
2086
2087
2088 yydestruct ("Error: popping",
2089 YY_ACCESSING_SYMBOL (yystate), yyvsp);
2090 YYPOPSTACK (1);
2091 yystate = *yyssp;
2092 YY_STACK_PRINT (yyss, yyssp);
2093 }
2094
2095 YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
2096 *++yyvsp = yylval;
2097 YY_IGNORE_MAYBE_UNINITIALIZED_END
2098
2099
2100 /* Shift the error token. */
2101 YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp);
2102
2103 yystate = yyn;
2104 goto yynewstate;
2105
2106
2107 /*-------------------------------------.
2108 | yyacceptlab -- YYACCEPT comes here. |
2109 `-------------------------------------*/
2110 yyacceptlab:
2111 yyresult = 0;
2112 goto yyreturnlab;
2113
2114
2115 /*-----------------------------------.
2116 | yyabortlab -- YYABORT comes here. |
2117 `-----------------------------------*/
2118 yyabortlab:
2119 yyresult = 1;
2120 goto yyreturnlab;
2121
2122
2123 /*-----------------------------------------------------------.
2124 | yyexhaustedlab -- YYNOMEM (memory exhaustion) comes here. |
2125 `-----------------------------------------------------------*/
2126 yyexhaustedlab:
2127 yyerror (YY_("memory exhausted"));
2128 yyresult = 2;
2129 goto yyreturnlab;
2130
2131
2132 /*----------------------------------------------------------.
2133 | yyreturnlab -- parsing is finished, clean up and return. |
2134 `----------------------------------------------------------*/
2135 yyreturnlab:
2136 if (yychar != YYEMPTY)
2137 {
2138 /* Make sure we have latest lookahead translation. See comments at
2139 user semantic actions for why this is necessary. */
2140 yytoken = YYTRANSLATE (yychar);
2141 yydestruct ("Cleanup: discarding lookahead",
2142 yytoken, &yylval);
2143 }
2144 /* Do not reclaim the symbols of the rule whose action triggered
2145 this YYABORT or YYACCEPT. */
2146 YYPOPSTACK (yylen);
2147 YY_STACK_PRINT (yyss, yyssp);
2148 while (yyssp != yyss)
2149 {
2150 yydestruct ("Cleanup: popping",
2151 YY_ACCESSING_SYMBOL (+*yyssp), yyvsp);
2152 YYPOPSTACK (1);
2153 }
2154 #ifndef yyoverflow
2155 if (yyss != yyssa)
2156 YYSTACK_FREE (yyss);
2157 #endif
2158
2159 return yyresult;
2160 }
2161
2162 #line 348 "deffilep.y"
2163
2164
2165 /*****************************************************************************
2166 API
2167 *****************************************************************************/
2168
2169 static FILE *the_file;
2170 static const char *def_filename;
2171 static int linenumber;
2172 static def_file *def;
2173 static int saw_newline;
2174
2175 struct directive
2176 {
2177 struct directive *next;
2178 char *name;
2179 int len;
2180 };
2181
2182 static struct directive *directives = 0;
2183
2184 def_file *
2185 def_file_empty (void)
2186 {
2187 def_file *rv = xmalloc (sizeof (def_file));
2188 memset (rv, 0, sizeof (def_file));
2189 rv->is_dll = -1;
2190 rv->base_address = (bfd_vma) -1;
2191 rv->stack_reserve = rv->stack_commit = -1;
2192 rv->heap_reserve = rv->heap_commit = -1;
2193 rv->version_major = rv->version_minor = -1;
2194 return rv;
2195 }
2196
2197 def_file *
2198 def_file_parse (const char *filename, def_file *add_to)
2199 {
2200 struct directive *d;
2201
2202 the_file = fopen (filename, "r");
2203 def_filename = filename;
2204 linenumber = 1;
2205 if (!the_file)
2206 {
2207 perror (filename);
2208 return 0;
2209 }
2210 if (add_to)
2211 {
2212 def = add_to;
2213 }
2214 else
2215 {
2216 def = def_file_empty ();
2217 }
2218
2219 saw_newline = 1;
2220 if (def_parse ())
2221 {
2222 def_file_free (def);
2223 fclose (the_file);
2224 def_pool_free ();
2225 return 0;
2226 }
2227
2228 fclose (the_file);
2229
2230 while ((d = directives) != NULL)
2231 {
2232 #if TRACE
2233 printf ("Adding directive %08x `%s'\n", d->name, d->name);
2234 #endif
2235 def_file_add_directive (def, d->name, d->len);
2236 directives = d->next;
2237 free (d->name);
2238 free (d);
2239 }
2240 def_pool_free ();
2241
2242 return def;
2243 }
2244
2245 void
2246 def_file_free (def_file *fdef)
2247 {
2248 int i;
2249
2250 if (!fdef)
2251 return;
2252 free (fdef->name);
2253 free (fdef->description);
2254
2255 if (fdef->section_defs)
2256 {
2257 for (i = 0; i < fdef->num_section_defs; i++)
2258 {
2259 free (fdef->section_defs[i].name);
2260 free (fdef->section_defs[i].class);
2261 }
2262 free (fdef->section_defs);
2263 }
2264
2265 if (fdef->exports)
2266 {
2267 for (i = 0; i < fdef->num_exports; i++)
2268 {
2269 if (fdef->exports[i].internal_name != fdef->exports[i].name)
2270 free (fdef->exports[i].internal_name);
2271 free (fdef->exports[i].name);
2272 free (fdef->exports[i].its_name);
2273 }
2274 free (fdef->exports);
2275 }
2276
2277 if (fdef->imports)
2278 {
2279 for (i = 0; i < fdef->num_imports; i++)
2280 {
2281 if (fdef->imports[i].internal_name != fdef->imports[i].name)
2282 free (fdef->imports[i].internal_name);
2283 free (fdef->imports[i].name);
2284 free (fdef->imports[i].its_name);
2285 }
2286 free (fdef->imports);
2287 }
2288
2289 while (fdef->modules)
2290 {
2291 def_file_module *m = fdef->modules;
2292
2293 fdef->modules = fdef->modules->next;
2294 free (m);
2295 }
2296
2297 while (fdef->aligncomms)
2298 {
2299 def_file_aligncomm *c = fdef->aligncomms;
2300
2301 fdef->aligncomms = fdef->aligncomms->next;
2302 free (c->symbol_name);
2303 free (c);
2304 }
2305
2306 free (fdef);
2307 }
2308
2309 #ifdef DEF_FILE_PRINT
2310 void
2311 def_file_print (FILE *file, def_file *fdef)
2312 {
2313 int i;
2314
2315 fprintf (file, ">>>> def_file at 0x%08x\n", fdef);
2316 if (fdef->name)
2317 fprintf (file, " name: %s\n", fdef->name ? fdef->name : "(unspecified)");
2318 if (fdef->is_dll != -1)
2319 fprintf (file, " is dll: %s\n", fdef->is_dll ? "yes" : "no");
2320 if (fdef->base_address != (bfd_vma) -1)
2321 {
2322 fprintf (file, " base address: 0x");
2323 fprintf_vma (file, fdef->base_address);
2324 fprintf (file, "\n");
2325 }
2326 if (fdef->description)
2327 fprintf (file, " description: `%s'\n", fdef->description);
2328 if (fdef->stack_reserve != -1)
2329 fprintf (file, " stack reserve: 0x%08x\n", fdef->stack_reserve);
2330 if (fdef->stack_commit != -1)
2331 fprintf (file, " stack commit: 0x%08x\n", fdef->stack_commit);
2332 if (fdef->heap_reserve != -1)
2333 fprintf (file, " heap reserve: 0x%08x\n", fdef->heap_reserve);
2334 if (fdef->heap_commit != -1)
2335 fprintf (file, " heap commit: 0x%08x\n", fdef->heap_commit);
2336
2337 if (fdef->num_section_defs > 0)
2338 {
2339 fprintf (file, " section defs:\n");
2340
2341 for (i = 0; i < fdef->num_section_defs; i++)
2342 {
2343 fprintf (file, " name: `%s', class: `%s', flags:",
2344 fdef->section_defs[i].name, fdef->section_defs[i].class);
2345 if (fdef->section_defs[i].flag_read)
2346 fprintf (file, " R");
2347 if (fdef->section_defs[i].flag_write)
2348 fprintf (file, " W");
2349 if (fdef->section_defs[i].flag_execute)
2350 fprintf (file, " X");
2351 if (fdef->section_defs[i].flag_shared)
2352 fprintf (file, " S");
2353 fprintf (file, "\n");
2354 }
2355 }
2356
2357 if (fdef->num_exports > 0)
2358 {
2359 fprintf (file, " exports:\n");
2360
2361 for (i = 0; i < fdef->num_exports; i++)
2362 {
2363 fprintf (file, " name: `%s', int: `%s', ordinal: %d, flags:",
2364 fdef->exports[i].name, fdef->exports[i].internal_name,
2365 fdef->exports[i].ordinal);
2366 if (fdef->exports[i].flag_private)
2367 fprintf (file, " P");
2368 if (fdef->exports[i].flag_constant)
2369 fprintf (file, " C");
2370 if (fdef->exports[i].flag_noname)
2371 fprintf (file, " N");
2372 if (fdef->exports[i].flag_data)
2373 fprintf (file, " D");
2374 fprintf (file, "\n");
2375 }
2376 }
2377
2378 if (fdef->num_imports > 0)
2379 {
2380 fprintf (file, " imports:\n");
2381
2382 for (i = 0; i < fdef->num_imports; i++)
2383 {
2384 fprintf (file, " int: %s, from: `%s', name: `%s', ordinal: %d\n",
2385 fdef->imports[i].internal_name,
2386 fdef->imports[i].module,
2387 fdef->imports[i].name,
2388 fdef->imports[i].ordinal);
2389 }
2390 }
2391
2392 if (fdef->version_major != -1)
2393 fprintf (file, " version: %d.%d\n", fdef->version_major, fdef->version_minor);
2394
2395 fprintf (file, "<<<< def_file at 0x%08x\n", fdef);
2396 }
2397 #endif
2398
2399 /* Helper routine to check for identity of string pointers,
2400 which might be NULL. */
2401
2402 static int
2403 are_names_equal (const char *s1, const char *s2)
2404 {
2405 if (!s1 && !s2)
2406 return 0;
2407 if (!s1 || !s2)
2408 return (!s1 ? -1 : 1);
2409 return strcmp (s1, s2);
2410 }
2411
2412 static int
2413 cmp_export_elem (const def_file_export *e, const char *ex_name,
2414 const char *in_name, const char *its_name,
2415 int ord)
2416 {
2417 int r;
2418
2419 if ((r = are_names_equal (ex_name, e->name)) != 0)
2420 return r;
2421 if ((r = are_names_equal (in_name, e->internal_name)) != 0)
2422 return r;
2423 if ((r = are_names_equal (its_name, e->its_name)) != 0)
2424 return r;
2425 return (ord - e->ordinal);
2426 }
2427
2428 /* Search the position of the identical element, or returns the position
2429 of the next higher element. If last valid element is smaller, then MAX
2430 is returned. */
2431
2432 static int
2433 find_export_in_list (def_file_export *b, int max,
2434 const char *ex_name, const char *in_name,
2435 const char *its_name, int ord, int *is_ident)
2436 {
2437 int e, l, r, p;
2438
2439 *is_ident = 0;
2440 if (!max)
2441 return 0;
2442 if ((e = cmp_export_elem (b, ex_name, in_name, its_name, ord)) <= 0)
2443 {
2444 if (!e)
2445 *is_ident = 1;
2446 return 0;
2447 }
2448 if (max == 1)
2449 return 1;
2450 if ((e = cmp_export_elem (b + (max - 1), ex_name, in_name, its_name, ord)) > 0)
2451 return max;
2452 else if (!e || max == 2)
2453 {
2454 if (!e)
2455 *is_ident = 1;
2456 return max - 1;
2457 }
2458 l = 0; r = max - 1;
2459 while (l < r)
2460 {
2461 p = (l + r) / 2;
2462 e = cmp_export_elem (b + p, ex_name, in_name, its_name, ord);
2463 if (!e)
2464 {
2465 *is_ident = 1;
2466 return p;
2467 }
2468 else if (e < 0)
2469 r = p - 1;
2470 else if (e > 0)
2471 l = p + 1;
2472 }
2473 if ((e = cmp_export_elem (b + l, ex_name, in_name, its_name, ord)) > 0)
2474 ++l;
2475 else if (!e)
2476 *is_ident = 1;
2477 return l;
2478 }
2479
2480 def_file_export *
2481 def_file_add_export (def_file *fdef,
2482 const char *external_name,
2483 const char *internal_name,
2484 int ordinal,
2485 const char *its_name,
2486 int *is_dup)
2487 {
2488 def_file_export *e;
2489 int pos;
2490 int max_exports = ROUND_UP(fdef->num_exports, 32);
2491
2492 if (internal_name && !external_name)
2493 external_name = internal_name;
2494 if (external_name && !internal_name)
2495 internal_name = external_name;
2496
2497 /* We need to avoid duplicates. */
2498 *is_dup = 0;
2499 pos = find_export_in_list (fdef->exports, fdef->num_exports,
2500 external_name, internal_name,
2501 its_name, ordinal, is_dup);
2502
2503 if (*is_dup != 0)
2504 return (fdef->exports + pos);
2505
2506 if (fdef->num_exports >= max_exports)
2507 {
2508 max_exports = ROUND_UP(fdef->num_exports + 1, 32);
2509 if (fdef->exports)
2510 fdef->exports = xrealloc (fdef->exports,
2511 max_exports * sizeof (def_file_export));
2512 else
2513 fdef->exports = xmalloc (max_exports * sizeof (def_file_export));
2514 }
2515
2516 e = fdef->exports + pos;
2517 if (pos != fdef->num_exports)
2518 memmove (&e[1], e, (sizeof (def_file_export) * (fdef->num_exports - pos)));
2519 memset (e, 0, sizeof (def_file_export));
2520 e->name = xstrdup (external_name);
2521 e->internal_name = xstrdup (internal_name);
2522 e->its_name = (its_name ? xstrdup (its_name) : NULL);
2523 e->ordinal = ordinal;
2524 fdef->num_exports++;
2525 return e;
2526 }
2527
2528 def_file_module *
2529 def_get_module (def_file *fdef, const char *name)
2530 {
2531 def_file_module *s;
2532
2533 for (s = fdef->modules; s; s = s->next)
2534 if (strcmp (s->name, name) == 0)
2535 return s;
2536
2537 return NULL;
2538 }
2539
2540 static def_file_module *
2541 def_stash_module (def_file *fdef, const char *name)
2542 {
2543 def_file_module *s;
2544
2545 if ((s = def_get_module (fdef, name)) != NULL)
2546 return s;
2547 s = xmalloc (sizeof (def_file_module) + strlen (name));
2548 s->next = fdef->modules;
2549 fdef->modules = s;
2550 s->user_data = 0;
2551 strcpy (s->name, name);
2552 return s;
2553 }
2554
2555 static int
2556 cmp_import_elem (const def_file_import *e, const char *ex_name,
2557 const char *in_name, const char *module,
2558 int ord)
2559 {
2560 int r;
2561
2562 if ((r = are_names_equal (module, (e->module ? e->module->name : NULL))))
2563 return r;
2564 if ((r = are_names_equal (ex_name, e->name)) != 0)
2565 return r;
2566 if ((r = are_names_equal (in_name, e->internal_name)) != 0)
2567 return r;
2568 if (ord != e->ordinal)
2569 return (ord < e->ordinal ? -1 : 1);
2570 return 0;
2571 }
2572
2573 /* Search the position of the identical element, or returns the position
2574 of the next higher element. If last valid element is smaller, then MAX
2575 is returned. */
2576
2577 static int
2578 find_import_in_list (def_file_import *b, int max,
2579 const char *ex_name, const char *in_name,
2580 const char *module, int ord, int *is_ident)
2581 {
2582 int e, l, r, p;
2583
2584 *is_ident = 0;
2585 if (!max)
2586 return 0;
2587 if ((e = cmp_import_elem (b, ex_name, in_name, module, ord)) <= 0)
2588 {
2589 if (!e)
2590 *is_ident = 1;
2591 return 0;
2592 }
2593 if (max == 1)
2594 return 1;
2595 if ((e = cmp_import_elem (b + (max - 1), ex_name, in_name, module, ord)) > 0)
2596 return max;
2597 else if (!e || max == 2)
2598 {
2599 if (!e)
2600 *is_ident = 1;
2601 return max - 1;
2602 }
2603 l = 0; r = max - 1;
2604 while (l < r)
2605 {
2606 p = (l + r) / 2;
2607 e = cmp_import_elem (b + p, ex_name, in_name, module, ord);
2608 if (!e)
2609 {
2610 *is_ident = 1;
2611 return p;
2612 }
2613 else if (e < 0)
2614 r = p - 1;
2615 else if (e > 0)
2616 l = p + 1;
2617 }
2618 if ((e = cmp_import_elem (b + l, ex_name, in_name, module, ord)) > 0)
2619 ++l;
2620 else if (!e)
2621 *is_ident = 1;
2622 return l;
2623 }
2624
2625 static void
2626 fill_in_import (def_file_import *i,
2627 const char *name,
2628 def_file_module *module,
2629 int ordinal,
2630 const char *internal_name,
2631 const char *its_name)
2632 {
2633 memset (i, 0, sizeof (def_file_import));
2634 if (name)
2635 i->name = xstrdup (name);
2636 i->module = module;
2637 i->ordinal = ordinal;
2638 if (internal_name)
2639 i->internal_name = xstrdup (internal_name);
2640 else
2641 i->internal_name = i->name;
2642 i->its_name = (its_name ? xstrdup (its_name) : NULL);
2643 }
2644
2645 def_file_import *
2646 def_file_add_import (def_file *fdef,
2647 const char *name,
2648 const char *module,
2649 int ordinal,
2650 const char *internal_name,
2651 const char *its_name,
2652 int *is_dup)
2653 {
2654 def_file_import *i;
2655 int pos;
2656 int max_imports = ROUND_UP (fdef->num_imports, 16);
2657
2658 /* We need to avoid here duplicates. */
2659 *is_dup = 0;
2660 pos = find_import_in_list (fdef->imports, fdef->num_imports,
2661 name,
2662 (!internal_name ? name : internal_name),
2663 module, ordinal, is_dup);
2664 if (*is_dup != 0)
2665 return fdef->imports + pos;
2666
2667 if (fdef->num_imports >= max_imports)
2668 {
2669 max_imports = ROUND_UP (fdef->num_imports+1, 16);
2670
2671 if (fdef->imports)
2672 fdef->imports = xrealloc (fdef->imports,
2673 max_imports * sizeof (def_file_import));
2674 else
2675 fdef->imports = xmalloc (max_imports * sizeof (def_file_import));
2676 }
2677 i = fdef->imports + pos;
2678 if (pos != fdef->num_imports)
2679 memmove (i + 1, i, sizeof (def_file_import) * (fdef->num_imports - pos));
2680
2681 fill_in_import (i, name, def_stash_module (fdef, module), ordinal,
2682 internal_name, its_name);
2683 fdef->num_imports++;
2684
2685 return i;
2686 }
2687
2688 int
2689 def_file_add_import_from (def_file *fdef,
2690 int num_imports,
2691 const char *name,
2692 const char *module,
2693 int ordinal,
2694 const char *internal_name,
2695 const char *its_name ATTRIBUTE_UNUSED)
2696 {
2697 def_file_import *i;
2698 int is_dup;
2699 int pos;
2700 int max_imports = ROUND_UP (fdef->num_imports, 16);
2701
2702 /* We need to avoid here duplicates. */
2703 is_dup = 0;
2704 pos = find_import_in_list (fdef->imports, fdef->num_imports,
2705 name, internal_name ? internal_name : name,
2706 module, ordinal, &is_dup);
2707 if (is_dup != 0)
2708 return -1;
2709 if (fdef->imports && pos != fdef->num_imports)
2710 {
2711 i = fdef->imports + pos;
2712 if (i->module && strcmp (i->module->name, module) == 0)
2713 return -1;
2714 }
2715
2716 if (fdef->num_imports + num_imports - 1 >= max_imports)
2717 {
2718 max_imports = ROUND_UP (fdef->num_imports + num_imports, 16);
2719
2720 if (fdef->imports)
2721 fdef->imports = xrealloc (fdef->imports,
2722 max_imports * sizeof (def_file_import));
2723 else
2724 fdef->imports = xmalloc (max_imports * sizeof (def_file_import));
2725 }
2726 i = fdef->imports + pos;
2727 if (pos != fdef->num_imports)
2728 memmove (i + num_imports, i,
2729 sizeof (def_file_import) * (fdef->num_imports - pos));
2730
2731 return pos;
2732 }
2733
2734 def_file_import *
2735 def_file_add_import_at (def_file *fdef,
2736 int pos,
2737 const char *name,
2738 const char *module,
2739 int ordinal,
2740 const char *internal_name,
2741 const char *its_name)
2742 {
2743 def_file_import *i = fdef->imports + pos;
2744
2745 fill_in_import (i, name, def_stash_module (fdef, module), ordinal,
2746 internal_name, its_name);
2747 fdef->num_imports++;
2748
2749 return i;
2750 }
2751
2752 struct
2753 {
2754 char *param;
2755 int token;
2756 }
2757 diropts[] =
2758 {
2759 { "-heap", HEAPSIZE },
2760 { "-stack", STACKSIZE_K },
2761 { "-attr", SECTIONS },
2762 { "-export", EXPORTS },
2763 { "-aligncomm", ALIGNCOMM },
2764 { 0, 0 }
2765 };
2766
2767 void
2768 def_file_add_directive (def_file *my_def, const char *param, int len)
2769 {
2770 def_file *save_def = def;
2771 const char *pend = param + len;
2772 char * tend = (char *) param;
2773 int i;
2774
2775 def = my_def;
2776
2777 while (param < pend)
2778 {
2779 while (param < pend
2780 && (ISSPACE (*param) || *param == '\n' || *param == 0))
2781 param++;
2782
2783 if (param == pend)
2784 break;
2785
2786 /* Scan forward until we encounter any of:
2787 - the end of the buffer
2788 - the start of a new option
2789 - a newline separating options
2790 - a NUL separating options. */
2791 for (tend = (char *) (param + 1);
2792 (tend < pend
2793 && !(ISSPACE (tend[-1]) && *tend == '-')
2794 && *tend != '\n' && *tend != 0);
2795 tend++)
2796 ;
2797
2798 for (i = 0; diropts[i].param; i++)
2799 {
2800 len = strlen (diropts[i].param);
2801
2802 if (tend - param >= len
2803 && strncmp (param, diropts[i].param, len) == 0
2804 && (param[len] == ':' || param[len] == ' '))
2805 {
2806 lex_parse_string_end = tend;
2807 lex_parse_string = param + len + 1;
2808 lex_forced_token = diropts[i].token;
2809 saw_newline = 0;
2810 if (def_parse ())
2811 continue;
2812 break;
2813 }
2814 }
2815
2816 if (!diropts[i].param)
2817 {
2818 if (tend < pend)
2819 {
2820 char saved;
2821
2822 saved = * tend;
2823 * tend = 0;
2824 /* xgettext:c-format */
2825 einfo (_("Warning: .drectve `%s' unrecognized\n"), param);
2826 * tend = saved;
2827 }
2828 else
2829 {
2830 einfo (_("Warning: corrupt .drectve at end of def file\n"));
2831 }
2832 }
2833
2834 lex_parse_string = 0;
2835 param = tend;
2836 }
2837
2838 def = save_def;
2839 def_pool_free ();
2840 }
2841
2842 /* Parser Callbacks. */
2843
2844 static void
2845 def_image_name (const char *name, bfd_vma base, int is_dll)
2846 {
2847 /* If a LIBRARY or NAME statement is specified without a name, there is nothing
2848 to do here. We retain the output filename specified on command line. */
2849 if (*name)
2850 {
2851 const char* image_name = lbasename (name);
2852
2853 if (image_name != name)
2854 einfo ("%s:%d: Warning: path components stripped from %s, '%s'\n",
2855 def_filename, linenumber, is_dll ? "LIBRARY" : "NAME",
2856 name);
2857 free (def->name);
2858 /* Append the default suffix, if none specified. */
2859 if (strchr (image_name, '.') == 0)
2860 {
2861 const char * suffix = is_dll ? ".dll" : ".exe";
2862
2863 def->name = xmalloc (strlen (image_name) + strlen (suffix) + 1);
2864 sprintf (def->name, "%s%s", image_name, suffix);
2865 }
2866 else
2867 def->name = xstrdup (image_name);
2868 }
2869
2870 /* Honor a BASE address statement, even if LIBRARY string is empty. */
2871 def->base_address = base;
2872 def->is_dll = is_dll;
2873 }
2874
2875 static void
2876 def_description (const char *text)
2877 {
2878 int len = def->description ? strlen (def->description) : 0;
2879
2880 len += strlen (text) + 1;
2881 if (def->description)
2882 {
2883 def->description = xrealloc (def->description, len);
2884 strcat (def->description, text);
2885 }
2886 else
2887 {
2888 def->description = xmalloc (len);
2889 strcpy (def->description, text);
2890 }
2891 }
2892
2893 static void
2894 def_stacksize (int reserve, int commit)
2895 {
2896 def->stack_reserve = reserve;
2897 def->stack_commit = commit;
2898 }
2899
2900 static void
2901 def_heapsize (int reserve, int commit)
2902 {
2903 def->heap_reserve = reserve;
2904 def->heap_commit = commit;
2905 }
2906
2907 static void
2908 def_section (const char *name, int attr)
2909 {
2910 def_file_section *s;
2911 int max_sections = ROUND_UP (def->num_section_defs, 4);
2912
2913 if (def->num_section_defs >= max_sections)
2914 {
2915 max_sections = ROUND_UP (def->num_section_defs+1, 4);
2916
2917 if (def->section_defs)
2918 def->section_defs = xrealloc (def->section_defs,
2919 max_sections * sizeof (def_file_import));
2920 else
2921 def->section_defs = xmalloc (max_sections * sizeof (def_file_import));
2922 }
2923 s = def->section_defs + def->num_section_defs;
2924 memset (s, 0, sizeof (def_file_section));
2925 s->name = xstrdup (name);
2926 if (attr & 1)
2927 s->flag_read = 1;
2928 if (attr & 2)
2929 s->flag_write = 1;
2930 if (attr & 4)
2931 s->flag_execute = 1;
2932 if (attr & 8)
2933 s->flag_shared = 1;
2934
2935 def->num_section_defs++;
2936 }
2937
2938 static void
2939 def_section_alt (const char *name, const char *attr)
2940 {
2941 int aval = 0;
2942
2943 for (; *attr; attr++)
2944 {
2945 switch (*attr)
2946 {
2947 case 'R':
2948 case 'r':
2949 aval |= 1;
2950 break;
2951 case 'W':
2952 case 'w':
2953 aval |= 2;
2954 break;
2955 case 'X':
2956 case 'x':
2957 aval |= 4;
2958 break;
2959 case 'S':
2960 case 's':
2961 aval |= 8;
2962 break;
2963 }
2964 }
2965 def_section (name, aval);
2966 }
2967
2968 static void
2969 def_exports (const char *external_name,
2970 const char *internal_name,
2971 int ordinal,
2972 int flags,
2973 const char *its_name)
2974 {
2975 def_file_export *dfe;
2976 int is_dup = 0;
2977
2978 if (!internal_name && external_name)
2979 internal_name = external_name;
2980 #if TRACE
2981 printf ("def_exports, ext=%s int=%s\n", external_name, internal_name);
2982 #endif
2983
2984 dfe = def_file_add_export (def, external_name, internal_name, ordinal,
2985 its_name, &is_dup);
2986
2987 /* We might check here for flag redefinition and warn. For now we
2988 ignore duplicates silently. */
2989 if (is_dup)
2990 return;
2991
2992 if (flags & 1)
2993 dfe->flag_noname = 1;
2994 if (flags & 2)
2995 dfe->flag_constant = 1;
2996 if (flags & 4)
2997 dfe->flag_data = 1;
2998 if (flags & 8)
2999 dfe->flag_private = 1;
3000 }
3001
3002 static void
3003 def_import (const char *internal_name,
3004 const char *module,
3005 const char *dllext,
3006 const char *name,
3007 int ordinal,
3008 const char *its_name)
3009 {
3010 char *buf = 0;
3011 const char *ext = dllext ? dllext : "dll";
3012 int is_dup = 0;
3013
3014 buf = xmalloc (strlen (module) + strlen (ext) + 2);
3015 sprintf (buf, "%s.%s", module, ext);
3016 module = buf;
3017
3018 def_file_add_import (def, name, module, ordinal, internal_name, its_name,
3019 &is_dup);
3020 free (buf);
3021 }
3022
3023 static void
3024 def_version (int major, int minor)
3025 {
3026 def->version_major = major;
3027 def->version_minor = minor;
3028 }
3029
3030 static void
3031 def_directive (char *str)
3032 {
3033 struct directive *d = xmalloc (sizeof (struct directive));
3034
3035 d->next = directives;
3036 directives = d;
3037 d->name = xstrdup (str);
3038 d->len = strlen (str);
3039 }
3040
3041 static void
3042 def_aligncomm (char *str, int align)
3043 {
3044 def_file_aligncomm *c, *p;
3045
3046 p = NULL;
3047 c = def->aligncomms;
3048 while (c != NULL)
3049 {
3050 int e = strcmp (c->symbol_name, str);
3051 if (!e)
3052 {
3053 /* Not sure if we want to allow here duplicates with
3054 different alignments, but for now we keep them. */
3055 e = (int) c->alignment - align;
3056 if (!e)
3057 return;
3058 }
3059 if (e > 0)
3060 break;
3061 c = (p = c)->next;
3062 }
3063
3064 c = xmalloc (sizeof (def_file_aligncomm));
3065 c->symbol_name = xstrdup (str);
3066 c->alignment = (unsigned int) align;
3067 if (!p)
3068 {
3069 c->next = def->aligncomms;
3070 def->aligncomms = c;
3071 }
3072 else
3073 {
3074 c->next = p->next;
3075 p->next = c;
3076 }
3077 }
3078
3079 static void
3080 def_error (const char *err)
3081 {
3082 einfo ("%P: %s:%d: %s\n",
3083 def_filename ? def_filename : "<unknown-file>", linenumber, err);
3084 }
3085
3086
3087 /* Lexical Scanner. */
3088
3089 #undef TRACE
3090 #define TRACE 0
3091
3092 /* Never freed, but always reused as needed, so no real leak. */
3093 static char *buffer = 0;
3094 static int buflen = 0;
3095 static int bufptr = 0;
3096
3097 static void
3098 put_buf (char c)
3099 {
3100 if (bufptr == buflen)
3101 {
3102 buflen += 50; /* overly reasonable, eh? */
3103 if (buffer)
3104 buffer = xrealloc (buffer, buflen + 1);
3105 else
3106 buffer = xmalloc (buflen + 1);
3107 }
3108 buffer[bufptr++] = c;
3109 buffer[bufptr] = 0; /* not optimal, but very convenient. */
3110 }
3111
3112 static struct
3113 {
3114 char *name;
3115 int token;
3116 }
3117 tokens[] =
3118 {
3119 { "BASE", BASE },
3120 { "CODE", CODE },
3121 { "CONSTANT", CONSTANTU },
3122 { "constant", CONSTANTL },
3123 { "DATA", DATAU },
3124 { "data", DATAL },
3125 { "DESCRIPTION", DESCRIPTION },
3126 { "DIRECTIVE", DIRECTIVE },
3127 { "EXECUTE", EXECUTE },
3128 { "EXPORTS", EXPORTS },
3129 { "HEAPSIZE", HEAPSIZE },
3130 { "IMPORTS", IMPORTS },
3131 { "LIBRARY", LIBRARY },
3132 { "NAME", NAME },
3133 { "NONAME", NONAMEU },
3134 { "noname", NONAMEL },
3135 { "PRIVATE", PRIVATEU },
3136 { "private", PRIVATEL },
3137 { "READ", READ },
3138 { "SECTIONS", SECTIONS },
3139 { "SEGMENTS", SECTIONS },
3140 { "SHARED", SHARED_K },
3141 { "STACKSIZE", STACKSIZE_K },
3142 { "VERSION", VERSIONK },
3143 { "WRITE", WRITE },
3144 { 0, 0 }
3145 };
3146
3147 static int
3148 def_getc (void)
3149 {
3150 int rv;
3151
3152 if (lex_parse_string)
3153 {
3154 if (lex_parse_string >= lex_parse_string_end)
3155 rv = EOF;
3156 else
3157 rv = *lex_parse_string++;
3158 }
3159 else
3160 {
3161 rv = fgetc (the_file);
3162 }
3163 if (rv == '\n')
3164 saw_newline = 1;
3165 return rv;
3166 }
3167
3168 static int
3169 def_ungetc (int c)
3170 {
3171 if (lex_parse_string)
3172 {
3173 lex_parse_string--;
3174 return c;
3175 }
3176 else
3177 return ungetc (c, the_file);
3178 }
3179
3180 static int
3181 def_lex (void)
3182 {
3183 int c, i, q;
3184
3185 if (lex_forced_token)
3186 {
3187 i = lex_forced_token;
3188 lex_forced_token = 0;
3189 #if TRACE
3190 printf ("lex: forcing token %d\n", i);
3191 #endif
3192 return i;
3193 }
3194
3195 c = def_getc ();
3196
3197 /* Trim leading whitespace. */
3198 while (c != EOF && (c == ' ' || c == '\t') && saw_newline)
3199 c = def_getc ();
3200
3201 if (c == EOF)
3202 {
3203 #if TRACE
3204 printf ("lex: EOF\n");
3205 #endif
3206 return 0;
3207 }
3208
3209 if (saw_newline && c == ';')
3210 {
3211 do
3212 {
3213 c = def_getc ();
3214 }
3215 while (c != EOF && c != '\n');
3216 if (c == '\n')
3217 return def_lex ();
3218 return 0;
3219 }
3220
3221 /* Must be something else. */
3222 saw_newline = 0;
3223
3224 if (ISDIGIT (c))
3225 {
3226 bufptr = 0;
3227 while (c != EOF && (ISXDIGIT (c) || (c == 'x')))
3228 {
3229 put_buf (c);
3230 c = def_getc ();
3231 }
3232 if (c != EOF)
3233 def_ungetc (c);
3234 yylval.digits = def_pool_strdup (buffer);
3235 #if TRACE
3236 printf ("lex: `%s' returns DIGITS\n", buffer);
3237 #endif
3238 return DIGITS;
3239 }
3240
3241 if (ISALPHA (c) || strchr ("$:-_?@", c))
3242 {
3243 bufptr = 0;
3244 q = c;
3245 put_buf (c);
3246 c = def_getc ();
3247
3248 if (q == '@')
3249 {
3250 if (ISBLANK (c) ) /* '@' followed by whitespace. */
3251 return (q);
3252 else if (ISDIGIT (c)) /* '@' followed by digit. */
3253 {
3254 def_ungetc (c);
3255 return (q);
3256 }
3257 #if TRACE
3258 printf ("lex: @ returns itself\n");
3259 #endif
3260 }
3261
3262 while (c != EOF && (ISALNUM (c) || strchr ("$:-_?/@<>", c)))
3263 {
3264 put_buf (c);
3265 c = def_getc ();
3266 }
3267 if (c != EOF)
3268 def_ungetc (c);
3269 if (ISALPHA (q)) /* Check for tokens. */
3270 {
3271 for (i = 0; tokens[i].name; i++)
3272 if (strcmp (tokens[i].name, buffer) == 0)
3273 {
3274 #if TRACE
3275 printf ("lex: `%s' is a string token\n", buffer);
3276 #endif
3277 return tokens[i].token;
3278 }
3279 }
3280 #if TRACE
3281 printf ("lex: `%s' returns ID\n", buffer);
3282 #endif
3283 yylval.id = def_pool_strdup (buffer);
3284 return ID;
3285 }
3286
3287 if (c == '\'' || c == '"')
3288 {
3289 q = c;
3290 c = def_getc ();
3291 bufptr = 0;
3292
3293 while (c != EOF && c != q)
3294 {
3295 put_buf (c);
3296 c = def_getc ();
3297 }
3298 yylval.id = def_pool_strdup (buffer);
3299 #if TRACE
3300 printf ("lex: `%s' returns ID\n", buffer);
3301 #endif
3302 return ID;
3303 }
3304
3305 if ( c == '=')
3306 {
3307 c = def_getc ();
3308 if (c == '=')
3309 {
3310 #if TRACE
3311 printf ("lex: `==' returns EQUAL\n");
3312 #endif
3313 return EQUAL;
3314 }
3315 def_ungetc (c);
3316 #if TRACE
3317 printf ("lex: `=' returns itself\n");
3318 #endif
3319 return '=';
3320 }
3321 if (c == '.' || c == ',')
3322 {
3323 #if TRACE
3324 printf ("lex: `%c' returns itself\n", c);
3325 #endif
3326 return c;
3327 }
3328
3329 if (c == '\n')
3330 {
3331 linenumber++;
3332 saw_newline = 1;
3333 }
3334
3335 /*printf ("lex: 0x%02x ignored\n", c); */
3336 return def_lex ();
3337 }
3338
3339 static char *
3340 def_pool_alloc (size_t sz)
3341 {
3342 def_pool_str *e;
3343
3344 e = (def_pool_str *) xmalloc (sizeof (def_pool_str) + sz);
3345 e->next = pool_strs;
3346 pool_strs = e;
3347 return e->data;
3348 }
3349
3350 static char *
3351 def_pool_strdup (const char *str)
3352 {
3353 char *s;
3354 size_t len;
3355 if (!str)
3356 return NULL;
3357 len = strlen (str) + 1;
3358 s = def_pool_alloc (len);
3359 memcpy (s, str, len);
3360 return s;
3361 }
3362
3363 static void
3364 def_pool_free (void)
3365 {
3366 def_pool_str *p;
3367 while ((p = pool_strs) != NULL)
3368 {
3369 pool_strs = p->next;
3370 free (p);
3371 }
3372 }
3373