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