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