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