Annotation of embedaddon/strongswan/src/libstrongswan/settings/settings_parser.c, revision 1.1

1.1     ! misho       1: /* A Bison parser, made by GNU Bison 3.0.4.  */
        !             2: 
        !             3: /* Bison implementation for Yacc-like parsers in C
        !             4: 
        !             5:    Copyright (C) 1984, 1989-1990, 2000-2015 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.4"
        !            48: 
        !            49: /* Skeleton name.  */
        !            50: #define YYSKELETON_NAME "yacc.c"
        !            51: 
        !            52: /* Pure parsers.  */
        !            53: #define YYPURE 1
        !            54: 
        !            55: /* Push parsers.  */
        !            56: #define YYPUSH 0
        !            57: 
        !            58: /* Pull parsers.  */
        !            59: #define YYPULL 1
        !            60: 
        !            61: 
        !            62: /* Substitute the variable and function names.  */
        !            63: #define yyparse         settings_parser_parse
        !            64: #define yylex           settings_parser_lex
        !            65: #define yyerror         settings_parser_error
        !            66: #define yydebug         settings_parser_debug
        !            67: #define yynerrs         settings_parser_nerrs
        !            68: 
        !            69: 
        !            70: /* Copy the first part of user declarations.  */
        !            71: #line 1 "settings/settings_parser.y" /* yacc.c:339  */
        !            72: 
        !            73: /*
        !            74:  * Copyright (C) 2014-2018 Tobias Brunner
        !            75:  * HSR Hochschule fuer Technik Rapperswil
        !            76:  *
        !            77:  * This program is free software; you can redistribute it and/or modify it
        !            78:  * under the terms of the GNU General Public License as published by the
        !            79:  * Free Software Foundation; either version 2 of the License, or (at your
        !            80:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
        !            81:  *
        !            82:  * This program is distributed in the hope that it will be useful, but
        !            83:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
        !            84:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
        !            85:  * for more details.
        !            86:  */
        !            87: 
        !            88: #define _GNU_SOURCE /* for asprintf() */
        !            89: #include <stdio.h>
        !            90: 
        !            91: #include <library.h>
        !            92: #include <collections/array.h>
        !            93: #include <settings/settings_types.h>
        !            94: #include <utils/parser_helper.h>
        !            95: 
        !            96: #include "settings_parser.h"
        !            97: 
        !            98: #define YYDEBUG 1
        !            99: 
        !           100: /**
        !           101:  * Defined by the lexer
        !           102:  */
        !           103: int settings_parser_lex(YYSTYPE *lvalp, void *scanner);
        !           104: int settings_parser_lex_init_extra(parser_helper_t *extra, void *scanner);
        !           105: int settings_parser_lex_destroy(void *scanner);
        !           106: int settings_parser_set_in(FILE *in, void *scanner);
        !           107: void settings_parser_set_debug(int debug, void *scanner);
        !           108: char *settings_parser_get_text(void *scanner);
        !           109: int settings_parser_get_leng(void *scanner);
        !           110: int settings_parser_get_lineno(void *scanner);
        !           111: /* Custom functions in lexer */
        !           112: bool settings_parser_open_next_file(parser_helper_t *ctx);
        !           113: bool settings_parser_load_string(parser_helper_t *ctx, const char *content);
        !           114: 
        !           115: /**
        !           116:  * Forward declarations
        !           117:  */
        !           118: static void settings_parser_error(parser_helper_t *ctx, const char *s);
        !           119: static section_t *push_section(parser_helper_t *ctx, char *name);
        !           120: static section_t *pop_section(parser_helper_t *ctx);
        !           121: static void add_section(parser_helper_t *ctx, section_t *section);
        !           122: static void add_setting(parser_helper_t *ctx, kv_t *kv);
        !           123: static void add_references(parser_helper_t *ctx, array_t *references);
        !           124: 
        !           125: /**
        !           126:  * Make sure to call lexer with the proper context
        !           127:  */
        !           128: #undef yylex
        !           129: static int yylex(YYSTYPE *lvalp, parser_helper_t *ctx)
        !           130: {
        !           131:        return settings_parser_lex(lvalp, ctx->scanner);
        !           132: }
        !           133: 
        !           134: 
        !           135: #line 136 "settings/settings_parser.c" /* yacc.c:339  */
        !           136: 
        !           137: # ifndef YY_NULLPTR
        !           138: #  if defined __cplusplus && 201103L <= __cplusplus
        !           139: #   define YY_NULLPTR nullptr
        !           140: #  else
        !           141: #   define YY_NULLPTR 0
        !           142: #  endif
        !           143: # endif
        !           144: 
        !           145: /* Enabling verbose error messages.  */
        !           146: #ifdef YYERROR_VERBOSE
        !           147: # undef YYERROR_VERBOSE
        !           148: # define YYERROR_VERBOSE 1
        !           149: #else
        !           150: # define YYERROR_VERBOSE 1
        !           151: #endif
        !           152: 
        !           153: /* In a future release of Bison, this section will be replaced
        !           154:    by #include "y.tab.h".  */
        !           155: #ifndef YY_SETTINGS_PARSER_SETTINGS_SETTINGS_PARSER_H_INCLUDED
        !           156: # define YY_SETTINGS_PARSER_SETTINGS_SETTINGS_PARSER_H_INCLUDED
        !           157: /* Debug traces.  */
        !           158: #ifndef YYDEBUG
        !           159: # define YYDEBUG 1
        !           160: #endif
        !           161: #if YYDEBUG
        !           162: extern int settings_parser_debug;
        !           163: #endif
        !           164: 
        !           165: /* Token type.  */
        !           166: #ifndef YYTOKENTYPE
        !           167: # define YYTOKENTYPE
        !           168:   enum yytokentype
        !           169:   {
        !           170:     NAME = 258,
        !           171:     STRING = 259,
        !           172:     DOT = 260,
        !           173:     COMMA = 261,
        !           174:     COLON = 262,
        !           175:     NEWLINE = 263,
        !           176:     STRING_ERROR = 264
        !           177:   };
        !           178: #endif
        !           179: /* Tokens.  */
        !           180: #define NAME 258
        !           181: #define STRING 259
        !           182: #define DOT 260
        !           183: #define COMMA 261
        !           184: #define COLON 262
        !           185: #define NEWLINE 263
        !           186: #define STRING_ERROR 264
        !           187: 
        !           188: /* Value type.  */
        !           189: #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
        !           190: 
        !           191: union YYSTYPE
        !           192: {
        !           193: #line 78 "settings/settings_parser.y" /* yacc.c:355  */
        !           194: 
        !           195:        char *s;
        !           196:        struct section_t *sec;
        !           197:        struct kv_t *kv;
        !           198:        array_t *refs;
        !           199: 
        !           200: #line 201 "settings/settings_parser.c" /* yacc.c:355  */
        !           201: };
        !           202: 
        !           203: typedef union YYSTYPE YYSTYPE;
        !           204: # define YYSTYPE_IS_TRIVIAL 1
        !           205: # define YYSTYPE_IS_DECLARED 1
        !           206: #endif
        !           207: 
        !           208: 
        !           209: 
        !           210: int settings_parser_parse (parser_helper_t *ctx);
        !           211: 
        !           212: #endif /* !YY_SETTINGS_PARSER_SETTINGS_SETTINGS_PARSER_H_INCLUDED  */
        !           213: 
        !           214: /* Copy the second part of user declarations.  */
        !           215: 
        !           216: #line 217 "settings/settings_parser.c" /* yacc.c:358  */
        !           217: 
        !           218: #ifdef short
        !           219: # undef short
        !           220: #endif
        !           221: 
        !           222: #ifdef YYTYPE_UINT8
        !           223: typedef YYTYPE_UINT8 yytype_uint8;
        !           224: #else
        !           225: typedef unsigned char yytype_uint8;
        !           226: #endif
        !           227: 
        !           228: #ifdef YYTYPE_INT8
        !           229: typedef YYTYPE_INT8 yytype_int8;
        !           230: #else
        !           231: typedef signed char yytype_int8;
        !           232: #endif
        !           233: 
        !           234: #ifdef YYTYPE_UINT16
        !           235: typedef YYTYPE_UINT16 yytype_uint16;
        !           236: #else
        !           237: typedef unsigned short int yytype_uint16;
        !           238: #endif
        !           239: 
        !           240: #ifdef YYTYPE_INT16
        !           241: typedef YYTYPE_INT16 yytype_int16;
        !           242: #else
        !           243: typedef short int yytype_int16;
        !           244: #endif
        !           245: 
        !           246: #ifndef YYSIZE_T
        !           247: # ifdef __SIZE_TYPE__
        !           248: #  define YYSIZE_T __SIZE_TYPE__
        !           249: # elif defined size_t
        !           250: #  define YYSIZE_T size_t
        !           251: # elif ! defined YYSIZE_T
        !           252: #  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
        !           253: #  define YYSIZE_T size_t
        !           254: # else
        !           255: #  define YYSIZE_T unsigned int
        !           256: # endif
        !           257: #endif
        !           258: 
        !           259: #define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
        !           260: 
        !           261: #ifndef YY_
        !           262: # if defined YYENABLE_NLS && YYENABLE_NLS
        !           263: #  if ENABLE_NLS
        !           264: #   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
        !           265: #   define YY_(Msgid) dgettext ("bison-runtime", Msgid)
        !           266: #  endif
        !           267: # endif
        !           268: # ifndef YY_
        !           269: #  define YY_(Msgid) Msgid
        !           270: # endif
        !           271: #endif
        !           272: 
        !           273: #ifndef YY_ATTRIBUTE
        !           274: # if (defined __GNUC__                                               \
        !           275:       && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__)))  \
        !           276:      || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C
        !           277: #  define YY_ATTRIBUTE(Spec) __attribute__(Spec)
        !           278: # else
        !           279: #  define YY_ATTRIBUTE(Spec) /* empty */
        !           280: # endif
        !           281: #endif
        !           282: 
        !           283: #ifndef YY_ATTRIBUTE_PURE
        !           284: # define YY_ATTRIBUTE_PURE   YY_ATTRIBUTE ((__pure__))
        !           285: #endif
        !           286: 
        !           287: #ifndef YY_ATTRIBUTE_UNUSED
        !           288: # define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__))
        !           289: #endif
        !           290: 
        !           291: #if !defined _Noreturn \
        !           292:      && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112)
        !           293: # if defined _MSC_VER && 1200 <= _MSC_VER
        !           294: #  define _Noreturn __declspec (noreturn)
        !           295: # else
        !           296: #  define _Noreturn YY_ATTRIBUTE ((__noreturn__))
        !           297: # endif
        !           298: #endif
        !           299: 
        !           300: /* Suppress unused-variable warnings by "using" E.  */
        !           301: #if ! defined lint || defined __GNUC__
        !           302: # define YYUSE(E) ((void) (E))
        !           303: #else
        !           304: # define YYUSE(E) /* empty */
        !           305: #endif
        !           306: 
        !           307: #if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
        !           308: /* Suppress an incorrect diagnostic about yylval being uninitialized.  */
        !           309: # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
        !           310:     _Pragma ("GCC diagnostic push") \
        !           311:     _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\
        !           312:     _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
        !           313: # define YY_IGNORE_MAYBE_UNINITIALIZED_END \
        !           314:     _Pragma ("GCC diagnostic pop")
        !           315: #else
        !           316: # define YY_INITIAL_VALUE(Value) Value
        !           317: #endif
        !           318: #ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
        !           319: # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
        !           320: # define YY_IGNORE_MAYBE_UNINITIALIZED_END
        !           321: #endif
        !           322: #ifndef YY_INITIAL_VALUE
        !           323: # define YY_INITIAL_VALUE(Value) /* Nothing. */
        !           324: #endif
        !           325: 
        !           326: 
        !           327: #if ! defined yyoverflow || YYERROR_VERBOSE
        !           328: 
        !           329: /* The parser invokes alloca or malloc; define the necessary symbols.  */
        !           330: 
        !           331: # ifdef YYSTACK_USE_ALLOCA
        !           332: #  if YYSTACK_USE_ALLOCA
        !           333: #   ifdef __GNUC__
        !           334: #    define YYSTACK_ALLOC __builtin_alloca
        !           335: #   elif defined __BUILTIN_VA_ARG_INCR
        !           336: #    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
        !           337: #   elif defined _AIX
        !           338: #    define YYSTACK_ALLOC __alloca
        !           339: #   elif defined _MSC_VER
        !           340: #    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
        !           341: #    define alloca _alloca
        !           342: #   else
        !           343: #    define YYSTACK_ALLOC alloca
        !           344: #    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS
        !           345: #     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
        !           346:       /* Use EXIT_SUCCESS as a witness for stdlib.h.  */
        !           347: #     ifndef EXIT_SUCCESS
        !           348: #      define EXIT_SUCCESS 0
        !           349: #     endif
        !           350: #    endif
        !           351: #   endif
        !           352: #  endif
        !           353: # endif
        !           354: 
        !           355: # ifdef YYSTACK_ALLOC
        !           356:    /* Pacify GCC's 'empty if-body' warning.  */
        !           357: #  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
        !           358: #  ifndef YYSTACK_ALLOC_MAXIMUM
        !           359:     /* The OS might guarantee only one guard page at the bottom of the stack,
        !           360:        and a page size can be as small as 4096 bytes.  So we cannot safely
        !           361:        invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
        !           362:        to allow for a few compiler-allocated temporary stack slots.  */
        !           363: #   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
        !           364: #  endif
        !           365: # else
        !           366: #  define YYSTACK_ALLOC YYMALLOC
        !           367: #  define YYSTACK_FREE YYFREE
        !           368: #  ifndef YYSTACK_ALLOC_MAXIMUM
        !           369: #   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
        !           370: #  endif
        !           371: #  if (defined __cplusplus && ! defined EXIT_SUCCESS \
        !           372:        && ! ((defined YYMALLOC || defined malloc) \
        !           373:              && (defined YYFREE || defined free)))
        !           374: #   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
        !           375: #   ifndef EXIT_SUCCESS
        !           376: #    define EXIT_SUCCESS 0
        !           377: #   endif
        !           378: #  endif
        !           379: #  ifndef YYMALLOC
        !           380: #   define YYMALLOC malloc
        !           381: #   if ! defined malloc && ! defined EXIT_SUCCESS
        !           382: void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
        !           383: #   endif
        !           384: #  endif
        !           385: #  ifndef YYFREE
        !           386: #   define YYFREE free
        !           387: #   if ! defined free && ! defined EXIT_SUCCESS
        !           388: void free (void *); /* INFRINGES ON USER NAME SPACE */
        !           389: #   endif
        !           390: #  endif
        !           391: # endif
        !           392: #endif /* ! defined yyoverflow || YYERROR_VERBOSE */
        !           393: 
        !           394: 
        !           395: #if (! defined yyoverflow \
        !           396:      && (! defined __cplusplus \
        !           397:          || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
        !           398: 
        !           399: /* A type that is properly aligned for any stack member.  */
        !           400: union yyalloc
        !           401: {
        !           402:   yytype_int16 yyss_alloc;
        !           403:   YYSTYPE yyvs_alloc;
        !           404: };
        !           405: 
        !           406: /* The size of the maximum gap between one aligned stack and the next.  */
        !           407: # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
        !           408: 
        !           409: /* The size of an array large to enough to hold all stacks, each with
        !           410:    N elements.  */
        !           411: # define YYSTACK_BYTES(N) \
        !           412:      ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
        !           413:       + YYSTACK_GAP_MAXIMUM)
        !           414: 
        !           415: # define YYCOPY_NEEDED 1
        !           416: 
        !           417: /* Relocate STACK from its old location to the new one.  The
        !           418:    local variables YYSIZE and YYSTACKSIZE give the old and new number of
        !           419:    elements in the stack, and YYPTR gives the new location of the
        !           420:    stack.  Advance YYPTR to a properly aligned location for the next
        !           421:    stack.  */
        !           422: # define YYSTACK_RELOCATE(Stack_alloc, Stack)                           \
        !           423:     do                                                                  \
        !           424:       {                                                                 \
        !           425:         YYSIZE_T yynewbytes;                                            \
        !           426:         YYCOPY (&yyptr->Stack_alloc, Stack, yysize);                    \
        !           427:         Stack = &yyptr->Stack_alloc;                                    \
        !           428:         yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
        !           429:         yyptr += yynewbytes / sizeof (*yyptr);                          \
        !           430:       }                                                                 \
        !           431:     while (0)
        !           432: 
        !           433: #endif
        !           434: 
        !           435: #if defined YYCOPY_NEEDED && YYCOPY_NEEDED
        !           436: /* Copy COUNT objects from SRC to DST.  The source and destination do
        !           437:    not overlap.  */
        !           438: # ifndef YYCOPY
        !           439: #  if defined __GNUC__ && 1 < __GNUC__
        !           440: #   define YYCOPY(Dst, Src, Count) \
        !           441:       __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src)))
        !           442: #  else
        !           443: #   define YYCOPY(Dst, Src, Count)              \
        !           444:       do                                        \
        !           445:         {                                       \
        !           446:           YYSIZE_T yyi;                         \
        !           447:           for (yyi = 0; yyi < (Count); yyi++)   \
        !           448:             (Dst)[yyi] = (Src)[yyi];            \
        !           449:         }                                       \
        !           450:       while (0)
        !           451: #  endif
        !           452: # endif
        !           453: #endif /* !YYCOPY_NEEDED */
        !           454: 
        !           455: /* YYFINAL -- State number of the termination state.  */
        !           456: #define YYFINAL  2
        !           457: /* YYLAST -- Last index in YYTABLE.  */
        !           458: #define YYLAST   19
        !           459: 
        !           460: /* YYNTOKENS -- Number of terminals.  */
        !           461: #define YYNTOKENS  13
        !           462: /* YYNNTS -- Number of nonterminals.  */
        !           463: #define YYNNTS  9
        !           464: /* YYNRULES -- Number of rules.  */
        !           465: #define YYNRULES  17
        !           466: /* YYNSTATES -- Number of states.  */
        !           467: #define YYNSTATES  24
        !           468: 
        !           469: /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
        !           470:    by yylex, with out-of-bounds checking.  */
        !           471: #define YYUNDEFTOK  2
        !           472: #define YYMAXUTOK   264
        !           473: 
        !           474: #define YYTRANSLATE(YYX)                                                \
        !           475:   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
        !           476: 
        !           477: /* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
        !           478:    as returned by yylex, without out-of-bounds checking.  */
        !           479: static const yytype_uint8 yytranslate[] =
        !           480: {
        !           481:        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           482:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           483:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           484:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           485:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           486:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           487:        2,    12,     2,     2,     2,     2,     2,     2,     2,     2,
        !           488:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           489:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           490:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           491:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           492:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           493:        2,     2,     2,    11,     2,    10,     2,     2,     2,     2,
        !           494:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           495:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           496:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           497:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           498:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           499:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           500:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           501:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           502:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           503:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           504:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           505:        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        !           506:        2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
        !           507:        5,     6,     7,     8,     9
        !           508: };
        !           509: 
        !           510: #if YYDEBUG
        !           511:   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
        !           512: static const yytype_uint8 yyrline[] =
        !           513: {
        !           514:        0,   112,   112,   114,   115,   119,   123,   130,   138,   143,
        !           515:      152,   157,   165,   170,   177,   178,   192,   193
        !           516: };
        !           517: #endif
        !           518: 
        !           519: #if YYDEBUG || YYERROR_VERBOSE || 1
        !           520: /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
        !           521:    First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
        !           522: static const char *const yytname[] =
        !           523: {
        !           524:   "$end", "error", "$undefined", "NAME", "STRING", "\".\"", "\",\"",
        !           525:   "\":\"", "NEWLINE", "STRING_ERROR", "'}'", "'{'", "'='", "$accept",
        !           526:   "statements", "statement", "section", "section_start", "references",
        !           527:   "setting", "value", "valuepart", YY_NULLPTR
        !           528: };
        !           529: #endif
        !           530: 
        !           531: # ifdef YYPRINT
        !           532: /* YYTOKNUM[NUM] -- (External) token number corresponding to the
        !           533:    (internal) symbol number NUM (which must be that of a token).  */
        !           534: static const yytype_uint16 yytoknum[] =
        !           535: {
        !           536:        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
        !           537:      125,   123,    61
        !           538: };
        !           539: # endif
        !           540: 
        !           541: #define YYPACT_NINF -7
        !           542: 
        !           543: #define yypact_value_is_default(Yystate) \
        !           544:   (!!((Yystate) == (-7)))
        !           545: 
        !           546: #define YYTABLE_NINF -1
        !           547: 
        !           548: #define yytable_value_is_error(Yytable_value) \
        !           549:   0
        !           550: 
        !           551:   /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
        !           552:      STATE-NUM.  */
        !           553: static const yytype_int8 yypact[] =
        !           554: {
        !           555:       -7,     0,    -7,    -6,    -7,    -7,    -7,    -7,    -7,     1,
        !           556:       -7,     8,    -1,    -7,     4,    -7,    -7,     8,    -7,    -7,
        !           557:       10,    -7,    -7,    -7
        !           558: };
        !           559: 
        !           560:   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
        !           561:      Performed when YYTABLE does not specify something else to do.  Zero
        !           562:      means the default is an error.  */
        !           563: static const yytype_uint8 yydefact[] =
        !           564: {
        !           565:        2,     0,     1,     0,     3,     4,     5,     2,     6,     0,
        !           566:        8,    13,     0,    10,     0,    16,    17,    12,    14,     7,
        !           567:        0,     9,    15,    11
        !           568: };
        !           569: 
        !           570:   /* YYPGOTO[NTERM-NUM].  */
        !           571: static const yytype_int8 yypgoto[] =
        !           572: {
        !           573:       -7,     7,    -7,    -7,    -7,    -7,    -7,    -7,     2
        !           574: };
        !           575: 
        !           576:   /* YYDEFGOTO[NTERM-NUM].  */
        !           577: static const yytype_int8 yydefgoto[] =
        !           578: {
        !           579:       -1,     1,     5,     6,     7,    14,     8,    17,    18
        !           580: };
        !           581: 
        !           582:   /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
        !           583:      positive, shift that token.  If negative, reduce the rule whose
        !           584:      number is the opposite.  If YYTABLE_NINF, syntax error.  */
        !           585: static const yytype_uint8 yytable[] =
        !           586: {
        !           587:        2,     9,     3,     3,    13,    10,    11,     4,     4,    19,
        !           588:       20,    15,    16,    23,    12,    21,     0,     0,     0,    22
        !           589: };
        !           590: 
        !           591: static const yytype_int8 yycheck[] =
        !           592: {
        !           593:        0,     7,     3,     3,     3,    11,    12,     8,     8,    10,
        !           594:        6,     3,     4,     3,     7,    11,    -1,    -1,    -1,    17
        !           595: };
        !           596: 
        !           597:   /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
        !           598:      symbol of state STATE-NUM.  */
        !           599: static const yytype_uint8 yystos[] =
        !           600: {
        !           601:        0,    14,     0,     3,     8,    15,    16,    17,    19,     7,
        !           602:       11,    12,    14,     3,    18,     3,     4,    20,    21,    10,
        !           603:        6,    11,    21,     3
        !           604: };
        !           605: 
        !           606:   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
        !           607: static const yytype_uint8 yyr1[] =
        !           608: {
        !           609:        0,    13,    14,    14,    14,    15,    15,    16,    17,    17,
        !           610:       18,    18,    19,    19,    20,    20,    21,    21
        !           611: };
        !           612: 
        !           613:   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
        !           614: static const yytype_uint8 yyr2[] =
        !           615: {
        !           616:        0,     2,     0,     2,     2,     1,     1,     3,     2,     4,
        !           617:        1,     3,     3,     2,     1,     2,     1,     1
        !           618: };
        !           619: 
        !           620: 
        !           621: #define yyerrok         (yyerrstatus = 0)
        !           622: #define yyclearin       (yychar = YYEMPTY)
        !           623: #define YYEMPTY         (-2)
        !           624: #define YYEOF           0
        !           625: 
        !           626: #define YYACCEPT        goto yyacceptlab
        !           627: #define YYABORT         goto yyabortlab
        !           628: #define YYERROR         goto yyerrorlab
        !           629: 
        !           630: 
        !           631: #define YYRECOVERING()  (!!yyerrstatus)
        !           632: 
        !           633: #define YYBACKUP(Token, Value)                                  \
        !           634: do                                                              \
        !           635:   if (yychar == YYEMPTY)                                        \
        !           636:     {                                                           \
        !           637:       yychar = (Token);                                         \
        !           638:       yylval = (Value);                                         \
        !           639:       YYPOPSTACK (yylen);                                       \
        !           640:       yystate = *yyssp;                                         \
        !           641:       goto yybackup;                                            \
        !           642:     }                                                           \
        !           643:   else                                                          \
        !           644:     {                                                           \
        !           645:       yyerror (ctx, YY_("syntax error: cannot back up")); \
        !           646:       YYERROR;                                                  \
        !           647:     }                                                           \
        !           648: while (0)
        !           649: 
        !           650: /* Error token number */
        !           651: #define YYTERROR        1
        !           652: #define YYERRCODE       256
        !           653: 
        !           654: 
        !           655: 
        !           656: /* Enable debugging if requested.  */
        !           657: #if YYDEBUG
        !           658: 
        !           659: # ifndef YYFPRINTF
        !           660: #  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
        !           661: #  define YYFPRINTF fprintf
        !           662: # endif
        !           663: 
        !           664: # define YYDPRINTF(Args)                        \
        !           665: do {                                            \
        !           666:   if (yydebug)                                  \
        !           667:     YYFPRINTF Args;                             \
        !           668: } while (0)
        !           669: 
        !           670: /* This macro is provided for backward compatibility. */
        !           671: #ifndef YY_LOCATION_PRINT
        !           672: # define YY_LOCATION_PRINT(File, Loc) ((void) 0)
        !           673: #endif
        !           674: 
        !           675: 
        !           676: # define YY_SYMBOL_PRINT(Title, Type, Value, Location)                    \
        !           677: do {                                                                      \
        !           678:   if (yydebug)                                                            \
        !           679:     {                                                                     \
        !           680:       YYFPRINTF (stderr, "%s ", Title);                                   \
        !           681:       yy_symbol_print (stderr,                                            \
        !           682:                   Type, Value, ctx); \
        !           683:       YYFPRINTF (stderr, "\n");                                           \
        !           684:     }                                                                     \
        !           685: } while (0)
        !           686: 
        !           687: 
        !           688: /*----------------------------------------.
        !           689: | Print this symbol's value on YYOUTPUT.  |
        !           690: `----------------------------------------*/
        !           691: 
        !           692: static void
        !           693: yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, parser_helper_t *ctx)
        !           694: {
        !           695:   FILE *yyo = yyoutput;
        !           696:   YYUSE (yyo);
        !           697:   YYUSE (ctx);
        !           698:   if (!yyvaluep)
        !           699:     return;
        !           700: # ifdef YYPRINT
        !           701:   if (yytype < YYNTOKENS)
        !           702:     YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
        !           703: # endif
        !           704:   YYUSE (yytype);
        !           705: }
        !           706: 
        !           707: 
        !           708: /*--------------------------------.
        !           709: | Print this symbol on YYOUTPUT.  |
        !           710: `--------------------------------*/
        !           711: 
        !           712: static void
        !           713: yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, parser_helper_t *ctx)
        !           714: {
        !           715:   YYFPRINTF (yyoutput, "%s %s (",
        !           716:              yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]);
        !           717: 
        !           718:   yy_symbol_value_print (yyoutput, yytype, yyvaluep, ctx);
        !           719:   YYFPRINTF (yyoutput, ")");
        !           720: }
        !           721: 
        !           722: /*------------------------------------------------------------------.
        !           723: | yy_stack_print -- Print the state stack from its BOTTOM up to its |
        !           724: | TOP (included).                                                   |
        !           725: `------------------------------------------------------------------*/
        !           726: 
        !           727: static void
        !           728: yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
        !           729: {
        !           730:   YYFPRINTF (stderr, "Stack now");
        !           731:   for (; yybottom <= yytop; yybottom++)
        !           732:     {
        !           733:       int yybot = *yybottom;
        !           734:       YYFPRINTF (stderr, " %d", yybot);
        !           735:     }
        !           736:   YYFPRINTF (stderr, "\n");
        !           737: }
        !           738: 
        !           739: # define YY_STACK_PRINT(Bottom, Top)                            \
        !           740: do {                                                            \
        !           741:   if (yydebug)                                                  \
        !           742:     yy_stack_print ((Bottom), (Top));                           \
        !           743: } while (0)
        !           744: 
        !           745: 
        !           746: /*------------------------------------------------.
        !           747: | Report that the YYRULE is going to be reduced.  |
        !           748: `------------------------------------------------*/
        !           749: 
        !           750: static void
        !           751: yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule, parser_helper_t *ctx)
        !           752: {
        !           753:   unsigned long int yylno = yyrline[yyrule];
        !           754:   int yynrhs = yyr2[yyrule];
        !           755:   int yyi;
        !           756:   YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
        !           757:              yyrule - 1, yylno);
        !           758:   /* The symbols being reduced.  */
        !           759:   for (yyi = 0; yyi < yynrhs; yyi++)
        !           760:     {
        !           761:       YYFPRINTF (stderr, "   $%d = ", yyi + 1);
        !           762:       yy_symbol_print (stderr,
        !           763:                        yystos[yyssp[yyi + 1 - yynrhs]],
        !           764:                        &(yyvsp[(yyi + 1) - (yynrhs)])
        !           765:                                               , ctx);
        !           766:       YYFPRINTF (stderr, "\n");
        !           767:     }
        !           768: }
        !           769: 
        !           770: # define YY_REDUCE_PRINT(Rule)          \
        !           771: do {                                    \
        !           772:   if (yydebug)                          \
        !           773:     yy_reduce_print (yyssp, yyvsp, Rule, ctx); \
        !           774: } while (0)
        !           775: 
        !           776: /* Nonzero means print parse trace.  It is left uninitialized so that
        !           777:    multiple parsers can coexist.  */
        !           778: int yydebug;
        !           779: #else /* !YYDEBUG */
        !           780: # define YYDPRINTF(Args)
        !           781: # define YY_SYMBOL_PRINT(Title, Type, Value, Location)
        !           782: # define YY_STACK_PRINT(Bottom, Top)
        !           783: # define YY_REDUCE_PRINT(Rule)
        !           784: #endif /* !YYDEBUG */
        !           785: 
        !           786: 
        !           787: /* YYINITDEPTH -- initial size of the parser's stacks.  */
        !           788: #ifndef YYINITDEPTH
        !           789: # define YYINITDEPTH 200
        !           790: #endif
        !           791: 
        !           792: /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
        !           793:    if the built-in stack extension method is used).
        !           794: 
        !           795:    Do not make this value too large; the results are undefined if
        !           796:    YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
        !           797:    evaluated with infinite-precision integer arithmetic.  */
        !           798: 
        !           799: #ifndef YYMAXDEPTH
        !           800: # define YYMAXDEPTH 10000
        !           801: #endif
        !           802: 
        !           803: 
        !           804: #if YYERROR_VERBOSE
        !           805: 
        !           806: # ifndef yystrlen
        !           807: #  if defined __GLIBC__ && defined _STRING_H
        !           808: #   define yystrlen strlen
        !           809: #  else
        !           810: /* Return the length of YYSTR.  */
        !           811: static YYSIZE_T
        !           812: yystrlen (const char *yystr)
        !           813: {
        !           814:   YYSIZE_T yylen;
        !           815:   for (yylen = 0; yystr[yylen]; yylen++)
        !           816:     continue;
        !           817:   return yylen;
        !           818: }
        !           819: #  endif
        !           820: # endif
        !           821: 
        !           822: # ifndef yystpcpy
        !           823: #  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
        !           824: #   define yystpcpy stpcpy
        !           825: #  else
        !           826: /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
        !           827:    YYDEST.  */
        !           828: static char *
        !           829: yystpcpy (char *yydest, const char *yysrc)
        !           830: {
        !           831:   char *yyd = yydest;
        !           832:   const char *yys = yysrc;
        !           833: 
        !           834:   while ((*yyd++ = *yys++) != '\0')
        !           835:     continue;
        !           836: 
        !           837:   return yyd - 1;
        !           838: }
        !           839: #  endif
        !           840: # endif
        !           841: 
        !           842: # ifndef yytnamerr
        !           843: /* Copy to YYRES the contents of YYSTR after stripping away unnecessary
        !           844:    quotes and backslashes, so that it's suitable for yyerror.  The
        !           845:    heuristic is that double-quoting is unnecessary unless the string
        !           846:    contains an apostrophe, a comma, or backslash (other than
        !           847:    backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
        !           848:    null, do not copy; instead, return the length of what the result
        !           849:    would have been.  */
        !           850: static YYSIZE_T
        !           851: yytnamerr (char *yyres, const char *yystr)
        !           852: {
        !           853:   if (*yystr == '"')
        !           854:     {
        !           855:       YYSIZE_T yyn = 0;
        !           856:       char const *yyp = yystr;
        !           857: 
        !           858:       for (;;)
        !           859:         switch (*++yyp)
        !           860:           {
        !           861:           case '\'':
        !           862:           case ',':
        !           863:             goto do_not_strip_quotes;
        !           864: 
        !           865:           case '\\':
        !           866:             if (*++yyp != '\\')
        !           867:               goto do_not_strip_quotes;
        !           868:             /* Fall through.  */
        !           869:           default:
        !           870:             if (yyres)
        !           871:               yyres[yyn] = *yyp;
        !           872:             yyn++;
        !           873:             break;
        !           874: 
        !           875:           case '"':
        !           876:             if (yyres)
        !           877:               yyres[yyn] = '\0';
        !           878:             return yyn;
        !           879:           }
        !           880:     do_not_strip_quotes: ;
        !           881:     }
        !           882: 
        !           883:   if (! yyres)
        !           884:     return yystrlen (yystr);
        !           885: 
        !           886:   return yystpcpy (yyres, yystr) - yyres;
        !           887: }
        !           888: # endif
        !           889: 
        !           890: /* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message
        !           891:    about the unexpected token YYTOKEN for the state stack whose top is
        !           892:    YYSSP.
        !           893: 
        !           894:    Return 0 if *YYMSG was successfully written.  Return 1 if *YYMSG is
        !           895:    not large enough to hold the message.  In that case, also set
        !           896:    *YYMSG_ALLOC to the required number of bytes.  Return 2 if the
        !           897:    required number of bytes is too large to store.  */
        !           898: static int
        !           899: yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
        !           900:                 yytype_int16 *yyssp, int yytoken)
        !           901: {
        !           902:   YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]);
        !           903:   YYSIZE_T yysize = yysize0;
        !           904:   enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
        !           905:   /* Internationalized format string. */
        !           906:   const char *yyformat = YY_NULLPTR;
        !           907:   /* Arguments of yyformat. */
        !           908:   char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
        !           909:   /* Number of reported tokens (one for the "unexpected", one per
        !           910:      "expected"). */
        !           911:   int yycount = 0;
        !           912: 
        !           913:   /* There are many possibilities here to consider:
        !           914:      - If this state is a consistent state with a default action, then
        !           915:        the only way this function was invoked is if the default action
        !           916:        is an error action.  In that case, don't check for expected
        !           917:        tokens because there are none.
        !           918:      - The only way there can be no lookahead present (in yychar) is if
        !           919:        this state is a consistent state with a default action.  Thus,
        !           920:        detecting the absence of a lookahead is sufficient to determine
        !           921:        that there is no unexpected or expected token to report.  In that
        !           922:        case, just report a simple "syntax error".
        !           923:      - Don't assume there isn't a lookahead just because this state is a
        !           924:        consistent state with a default action.  There might have been a
        !           925:        previous inconsistent state, consistent state with a non-default
        !           926:        action, or user semantic action that manipulated yychar.
        !           927:      - Of course, the expected token list depends on states to have
        !           928:        correct lookahead information, and it depends on the parser not
        !           929:        to perform extra reductions after fetching a lookahead from the
        !           930:        scanner and before detecting a syntax error.  Thus, state merging
        !           931:        (from LALR or IELR) and default reductions corrupt the expected
        !           932:        token list.  However, the list is correct for canonical LR with
        !           933:        one exception: it will still contain any token that will not be
        !           934:        accepted due to an error action in a later state.
        !           935:   */
        !           936:   if (yytoken != YYEMPTY)
        !           937:     {
        !           938:       int yyn = yypact[*yyssp];
        !           939:       yyarg[yycount++] = yytname[yytoken];
        !           940:       if (!yypact_value_is_default (yyn))
        !           941:         {
        !           942:           /* Start YYX at -YYN if negative to avoid negative indexes in
        !           943:              YYCHECK.  In other words, skip the first -YYN actions for
        !           944:              this state because they are default actions.  */
        !           945:           int yyxbegin = yyn < 0 ? -yyn : 0;
        !           946:           /* Stay within bounds of both yycheck and yytname.  */
        !           947:           int yychecklim = YYLAST - yyn + 1;
        !           948:           int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
        !           949:           int yyx;
        !           950: 
        !           951:           for (yyx = yyxbegin; yyx < yyxend; ++yyx)
        !           952:             if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR
        !           953:                 && !yytable_value_is_error (yytable[yyx + yyn]))
        !           954:               {
        !           955:                 if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
        !           956:                   {
        !           957:                     yycount = 1;
        !           958:                     yysize = yysize0;
        !           959:                     break;
        !           960:                   }
        !           961:                 yyarg[yycount++] = yytname[yyx];
        !           962:                 {
        !           963:                   YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]);
        !           964:                   if (! (yysize <= yysize1
        !           965:                          && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
        !           966:                     return 2;
        !           967:                   yysize = yysize1;
        !           968:                 }
        !           969:               }
        !           970:         }
        !           971:     }
        !           972: 
        !           973:   switch (yycount)
        !           974:     {
        !           975: # define YYCASE_(N, S)                      \
        !           976:       case N:                               \
        !           977:         yyformat = S;                       \
        !           978:       break
        !           979:       YYCASE_(0, YY_("syntax error"));
        !           980:       YYCASE_(1, YY_("syntax error, unexpected %s"));
        !           981:       YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
        !           982:       YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
        !           983:       YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
        !           984:       YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
        !           985: # undef YYCASE_
        !           986:     }
        !           987: 
        !           988:   {
        !           989:     YYSIZE_T yysize1 = yysize + yystrlen (yyformat);
        !           990:     if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
        !           991:       return 2;
        !           992:     yysize = yysize1;
        !           993:   }
        !           994: 
        !           995:   if (*yymsg_alloc < yysize)
        !           996:     {
        !           997:       *yymsg_alloc = 2 * yysize;
        !           998:       if (! (yysize <= *yymsg_alloc
        !           999:              && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM))
        !          1000:         *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM;
        !          1001:       return 1;
        !          1002:     }
        !          1003: 
        !          1004:   /* Avoid sprintf, as that infringes on the user's name space.
        !          1005:      Don't have undefined behavior even if the translation
        !          1006:      produced a string with the wrong number of "%s"s.  */
        !          1007:   {
        !          1008:     char *yyp = *yymsg;
        !          1009:     int yyi = 0;
        !          1010:     while ((*yyp = *yyformat) != '\0')
        !          1011:       if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount)
        !          1012:         {
        !          1013:           yyp += yytnamerr (yyp, yyarg[yyi++]);
        !          1014:           yyformat += 2;
        !          1015:         }
        !          1016:       else
        !          1017:         {
        !          1018:           yyp++;
        !          1019:           yyformat++;
        !          1020:         }
        !          1021:   }
        !          1022:   return 0;
        !          1023: }
        !          1024: #endif /* YYERROR_VERBOSE */
        !          1025: 
        !          1026: /*-----------------------------------------------.
        !          1027: | Release the memory associated to this symbol.  |
        !          1028: `-----------------------------------------------*/
        !          1029: 
        !          1030: static void
        !          1031: yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, parser_helper_t *ctx)
        !          1032: {
        !          1033:   YYUSE (yyvaluep);
        !          1034:   YYUSE (ctx);
        !          1035:   if (!yymsg)
        !          1036:     yymsg = "Deleting";
        !          1037:   YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
        !          1038: 
        !          1039:   YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
        !          1040:   switch (yytype)
        !          1041:     {
        !          1042:           case 3: /* NAME  */
        !          1043: #line 97 "settings/settings_parser.y" /* yacc.c:1257  */
        !          1044:       { free(((*yyvaluep).s)); }
        !          1045: #line 1046 "settings/settings_parser.c" /* yacc.c:1257  */
        !          1046:         break;
        !          1047: 
        !          1048:     case 4: /* STRING  */
        !          1049: #line 97 "settings/settings_parser.y" /* yacc.c:1257  */
        !          1050:       { free(((*yyvaluep).s)); }
        !          1051: #line 1052 "settings/settings_parser.c" /* yacc.c:1257  */
        !          1052:         break;
        !          1053: 
        !          1054:     case 16: /* section  */
        !          1055: #line 99 "settings/settings_parser.y" /* yacc.c:1257  */
        !          1056:       { pop_section(ctx); settings_section_destroy(((*yyvaluep).sec), NULL); }
        !          1057: #line 1058 "settings/settings_parser.c" /* yacc.c:1257  */
        !          1058:         break;
        !          1059: 
        !          1060:     case 17: /* section_start  */
        !          1061: #line 99 "settings/settings_parser.y" /* yacc.c:1257  */
        !          1062:       { pop_section(ctx); settings_section_destroy(((*yyvaluep).sec), NULL); }
        !          1063: #line 1064 "settings/settings_parser.c" /* yacc.c:1257  */
        !          1064:         break;
        !          1065: 
        !          1066:     case 18: /* references  */
        !          1067: #line 101 "settings/settings_parser.y" /* yacc.c:1257  */
        !          1068:       { array_destroy_function(((*yyvaluep).refs), (void*)free, NULL); }
        !          1069: #line 1070 "settings/settings_parser.c" /* yacc.c:1257  */
        !          1070:         break;
        !          1071: 
        !          1072:     case 19: /* setting  */
        !          1073: #line 100 "settings/settings_parser.y" /* yacc.c:1257  */
        !          1074:       { settings_kv_destroy(((*yyvaluep).kv), NULL); }
        !          1075: #line 1076 "settings/settings_parser.c" /* yacc.c:1257  */
        !          1076:         break;
        !          1077: 
        !          1078:     case 20: /* value  */
        !          1079: #line 97 "settings/settings_parser.y" /* yacc.c:1257  */
        !          1080:       { free(((*yyvaluep).s)); }
        !          1081: #line 1082 "settings/settings_parser.c" /* yacc.c:1257  */
        !          1082:         break;
        !          1083: 
        !          1084:     case 21: /* valuepart  */
        !          1085: #line 97 "settings/settings_parser.y" /* yacc.c:1257  */
        !          1086:       { free(((*yyvaluep).s)); }
        !          1087: #line 1088 "settings/settings_parser.c" /* yacc.c:1257  */
        !          1088:         break;
        !          1089: 
        !          1090: 
        !          1091:       default:
        !          1092:         break;
        !          1093:     }
        !          1094:   YY_IGNORE_MAYBE_UNINITIALIZED_END
        !          1095: }
        !          1096: 
        !          1097: 
        !          1098: 
        !          1099: 
        !          1100: /*----------.
        !          1101: | yyparse.  |
        !          1102: `----------*/
        !          1103: 
        !          1104: int
        !          1105: yyparse (parser_helper_t *ctx)
        !          1106: {
        !          1107: /* The lookahead symbol.  */
        !          1108: int yychar;
        !          1109: 
        !          1110: 
        !          1111: /* The semantic value of the lookahead symbol.  */
        !          1112: /* Default value used for initialization, for pacifying older GCCs
        !          1113:    or non-GCC compilers.  */
        !          1114: YY_INITIAL_VALUE (static YYSTYPE yyval_default;)
        !          1115: YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default);
        !          1116: 
        !          1117:     /* Number of syntax errors so far.  */
        !          1118:     int yynerrs;
        !          1119: 
        !          1120:     int yystate;
        !          1121:     /* Number of tokens to shift before error messages enabled.  */
        !          1122:     int yyerrstatus;
        !          1123: 
        !          1124:     /* The stacks and their tools:
        !          1125:        'yyss': related to states.
        !          1126:        'yyvs': related to semantic values.
        !          1127: 
        !          1128:        Refer to the stacks through separate pointers, to allow yyoverflow
        !          1129:        to reallocate them elsewhere.  */
        !          1130: 
        !          1131:     /* The state stack.  */
        !          1132:     yytype_int16 yyssa[YYINITDEPTH];
        !          1133:     yytype_int16 *yyss;
        !          1134:     yytype_int16 *yyssp;
        !          1135: 
        !          1136:     /* The semantic value stack.  */
        !          1137:     YYSTYPE yyvsa[YYINITDEPTH];
        !          1138:     YYSTYPE *yyvs;
        !          1139:     YYSTYPE *yyvsp;
        !          1140: 
        !          1141:     YYSIZE_T yystacksize;
        !          1142: 
        !          1143:   int yyn;
        !          1144:   int yyresult;
        !          1145:   /* Lookahead token as an internal (translated) token number.  */
        !          1146:   int yytoken = 0;
        !          1147:   /* The variables used to return semantic value and location from the
        !          1148:      action routines.  */
        !          1149:   YYSTYPE yyval;
        !          1150: 
        !          1151: #if YYERROR_VERBOSE
        !          1152:   /* Buffer for error messages, and its allocated size.  */
        !          1153:   char yymsgbuf[128];
        !          1154:   char *yymsg = yymsgbuf;
        !          1155:   YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
        !          1156: #endif
        !          1157: 
        !          1158: #define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))
        !          1159: 
        !          1160:   /* The number of symbols on the RHS of the reduced rule.
        !          1161:      Keep to zero when no symbol should be popped.  */
        !          1162:   int yylen = 0;
        !          1163: 
        !          1164:   yyssp = yyss = yyssa;
        !          1165:   yyvsp = yyvs = yyvsa;
        !          1166:   yystacksize = YYINITDEPTH;
        !          1167: 
        !          1168:   YYDPRINTF ((stderr, "Starting parse\n"));
        !          1169: 
        !          1170:   yystate = 0;
        !          1171:   yyerrstatus = 0;
        !          1172:   yynerrs = 0;
        !          1173:   yychar = YYEMPTY; /* Cause a token to be read.  */
        !          1174:   goto yysetstate;
        !          1175: 
        !          1176: /*------------------------------------------------------------.
        !          1177: | yynewstate -- Push a new state, which is found in yystate.  |
        !          1178: `------------------------------------------------------------*/
        !          1179:  yynewstate:
        !          1180:   /* In all cases, when you get here, the value and location stacks
        !          1181:      have just been pushed.  So pushing a state here evens the stacks.  */
        !          1182:   yyssp++;
        !          1183: 
        !          1184:  yysetstate:
        !          1185:   *yyssp = yystate;
        !          1186: 
        !          1187:   if (yyss + yystacksize - 1 <= yyssp)
        !          1188:     {
        !          1189:       /* Get the current used size of the three stacks, in elements.  */
        !          1190:       YYSIZE_T yysize = yyssp - yyss + 1;
        !          1191: 
        !          1192: #ifdef yyoverflow
        !          1193:       {
        !          1194:         /* Give user a chance to reallocate the stack.  Use copies of
        !          1195:            these so that the &'s don't force the real ones into
        !          1196:            memory.  */
        !          1197:         YYSTYPE *yyvs1 = yyvs;
        !          1198:         yytype_int16 *yyss1 = yyss;
        !          1199: 
        !          1200:         /* Each stack pointer address is followed by the size of the
        !          1201:            data in use in that stack, in bytes.  This used to be a
        !          1202:            conditional around just the two extra args, but that might
        !          1203:            be undefined if yyoverflow is a macro.  */
        !          1204:         yyoverflow (YY_("memory exhausted"),
        !          1205:                     &yyss1, yysize * sizeof (*yyssp),
        !          1206:                     &yyvs1, yysize * sizeof (*yyvsp),
        !          1207:                     &yystacksize);
        !          1208: 
        !          1209:         yyss = yyss1;
        !          1210:         yyvs = yyvs1;
        !          1211:       }
        !          1212: #else /* no yyoverflow */
        !          1213: # ifndef YYSTACK_RELOCATE
        !          1214:       goto yyexhaustedlab;
        !          1215: # else
        !          1216:       /* Extend the stack our own way.  */
        !          1217:       if (YYMAXDEPTH <= yystacksize)
        !          1218:         goto yyexhaustedlab;
        !          1219:       yystacksize *= 2;
        !          1220:       if (YYMAXDEPTH < yystacksize)
        !          1221:         yystacksize = YYMAXDEPTH;
        !          1222: 
        !          1223:       {
        !          1224:         yytype_int16 *yyss1 = yyss;
        !          1225:         union yyalloc *yyptr =
        !          1226:           (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
        !          1227:         if (! yyptr)
        !          1228:           goto yyexhaustedlab;
        !          1229:         YYSTACK_RELOCATE (yyss_alloc, yyss);
        !          1230:         YYSTACK_RELOCATE (yyvs_alloc, yyvs);
        !          1231: #  undef YYSTACK_RELOCATE
        !          1232:         if (yyss1 != yyssa)
        !          1233:           YYSTACK_FREE (yyss1);
        !          1234:       }
        !          1235: # endif
        !          1236: #endif /* no yyoverflow */
        !          1237: 
        !          1238:       yyssp = yyss + yysize - 1;
        !          1239:       yyvsp = yyvs + yysize - 1;
        !          1240: 
        !          1241:       YYDPRINTF ((stderr, "Stack size increased to %lu\n",
        !          1242:                   (unsigned long int) yystacksize));
        !          1243: 
        !          1244:       if (yyss + yystacksize - 1 <= yyssp)
        !          1245:         YYABORT;
        !          1246:     }
        !          1247: 
        !          1248:   YYDPRINTF ((stderr, "Entering state %d\n", yystate));
        !          1249: 
        !          1250:   if (yystate == YYFINAL)
        !          1251:     YYACCEPT;
        !          1252: 
        !          1253:   goto yybackup;
        !          1254: 
        !          1255: /*-----------.
        !          1256: | yybackup.  |
        !          1257: `-----------*/
        !          1258: yybackup:
        !          1259: 
        !          1260:   /* Do appropriate processing given the current state.  Read a
        !          1261:      lookahead token if we need one and don't already have one.  */
        !          1262: 
        !          1263:   /* First try to decide what to do without reference to lookahead token.  */
        !          1264:   yyn = yypact[yystate];
        !          1265:   if (yypact_value_is_default (yyn))
        !          1266:     goto yydefault;
        !          1267: 
        !          1268:   /* Not known => get a lookahead token if don't already have one.  */
        !          1269: 
        !          1270:   /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
        !          1271:   if (yychar == YYEMPTY)
        !          1272:     {
        !          1273:       YYDPRINTF ((stderr, "Reading a token: "));
        !          1274:       yychar = yylex (&yylval, ctx);
        !          1275:     }
        !          1276: 
        !          1277:   if (yychar <= YYEOF)
        !          1278:     {
        !          1279:       yychar = yytoken = YYEOF;
        !          1280:       YYDPRINTF ((stderr, "Now at end of input.\n"));
        !          1281:     }
        !          1282:   else
        !          1283:     {
        !          1284:       yytoken = YYTRANSLATE (yychar);
        !          1285:       YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
        !          1286:     }
        !          1287: 
        !          1288:   /* If the proper action on seeing token YYTOKEN is to reduce or to
        !          1289:      detect an error, take that action.  */
        !          1290:   yyn += yytoken;
        !          1291:   if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
        !          1292:     goto yydefault;
        !          1293:   yyn = yytable[yyn];
        !          1294:   if (yyn <= 0)
        !          1295:     {
        !          1296:       if (yytable_value_is_error (yyn))
        !          1297:         goto yyerrlab;
        !          1298:       yyn = -yyn;
        !          1299:       goto yyreduce;
        !          1300:     }
        !          1301: 
        !          1302:   /* Count tokens shifted since error; after three, turn off error
        !          1303:      status.  */
        !          1304:   if (yyerrstatus)
        !          1305:     yyerrstatus--;
        !          1306: 
        !          1307:   /* Shift the lookahead token.  */
        !          1308:   YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
        !          1309: 
        !          1310:   /* Discard the shifted token.  */
        !          1311:   yychar = YYEMPTY;
        !          1312: 
        !          1313:   yystate = yyn;
        !          1314:   YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
        !          1315:   *++yyvsp = yylval;
        !          1316:   YY_IGNORE_MAYBE_UNINITIALIZED_END
        !          1317: 
        !          1318:   goto yynewstate;
        !          1319: 
        !          1320: 
        !          1321: /*-----------------------------------------------------------.
        !          1322: | yydefault -- do the default action for the current state.  |
        !          1323: `-----------------------------------------------------------*/
        !          1324: yydefault:
        !          1325:   yyn = yydefact[yystate];
        !          1326:   if (yyn == 0)
        !          1327:     goto yyerrlab;
        !          1328:   goto yyreduce;
        !          1329: 
        !          1330: 
        !          1331: /*-----------------------------.
        !          1332: | yyreduce -- Do a reduction.  |
        !          1333: `-----------------------------*/
        !          1334: yyreduce:
        !          1335:   /* yyn is the number of a rule to reduce with.  */
        !          1336:   yylen = yyr2[yyn];
        !          1337: 
        !          1338:   /* If YYLEN is nonzero, implement the default value of the action:
        !          1339:      '$$ = $1'.
        !          1340: 
        !          1341:      Otherwise, the following line sets YYVAL to garbage.
        !          1342:      This behavior is undocumented and Bison
        !          1343:      users should not rely upon it.  Assigning to YYVAL
        !          1344:      unconditionally makes the parser a bit smaller, and it avoids a
        !          1345:      GCC warning that YYVAL may be used uninitialized.  */
        !          1346:   yyval = yyvsp[1-yylen];
        !          1347: 
        !          1348: 
        !          1349:   YY_REDUCE_PRINT (yyn);
        !          1350:   switch (yyn)
        !          1351:     {
        !          1352:         case 5:
        !          1353: #line 120 "settings/settings_parser.y" /* yacc.c:1646  */
        !          1354:     {
        !          1355:                add_section(ctx, (yyvsp[0].sec));
        !          1356:        }
        !          1357: #line 1358 "settings/settings_parser.c" /* yacc.c:1646  */
        !          1358:     break;
        !          1359: 
        !          1360:   case 6:
        !          1361: #line 124 "settings/settings_parser.y" /* yacc.c:1646  */
        !          1362:     {
        !          1363:                add_setting(ctx, (yyvsp[0].kv));
        !          1364:        }
        !          1365: #line 1366 "settings/settings_parser.c" /* yacc.c:1646  */
        !          1366:     break;
        !          1367: 
        !          1368:   case 7:
        !          1369: #line 131 "settings/settings_parser.y" /* yacc.c:1646  */
        !          1370:     {
        !          1371:                pop_section(ctx);
        !          1372:                (yyval.sec) = (yyvsp[-2].sec);
        !          1373:        }
        !          1374: #line 1375 "settings/settings_parser.c" /* yacc.c:1646  */
        !          1375:     break;
        !          1376: 
        !          1377:   case 8:
        !          1378: #line 139 "settings/settings_parser.y" /* yacc.c:1646  */
        !          1379:     {
        !          1380:                (yyval.sec) = push_section(ctx, (yyvsp[-1].s));
        !          1381:        }
        !          1382: #line 1383 "settings/settings_parser.c" /* yacc.c:1646  */
        !          1383:     break;
        !          1384: 
        !          1385:   case 9:
        !          1386: #line 144 "settings/settings_parser.y" /* yacc.c:1646  */
        !          1387:     {
        !          1388:                (yyval.sec) = push_section(ctx, (yyvsp[-3].s));
        !          1389:                add_references(ctx, (yyvsp[-1].refs));
        !          1390:                array_destroy((yyvsp[-1].refs));
        !          1391:        }
        !          1392: #line 1393 "settings/settings_parser.c" /* yacc.c:1646  */
        !          1393:     break;
        !          1394: 
        !          1395:   case 10:
        !          1396: #line 153 "settings/settings_parser.y" /* yacc.c:1646  */
        !          1397:     {
        !          1398:                (yyval.refs) = array_create(0, 0);
        !          1399:                array_insert((yyval.refs), ARRAY_TAIL, (yyvsp[0].s));
        !          1400:        }
        !          1401: #line 1402 "settings/settings_parser.c" /* yacc.c:1646  */
        !          1402:     break;
        !          1403: 
        !          1404:   case 11:
        !          1405: #line 158 "settings/settings_parser.y" /* yacc.c:1646  */
        !          1406:     {
        !          1407:                array_insert((yyvsp[-2].refs), ARRAY_TAIL, (yyvsp[0].s));
        !          1408:                (yyval.refs) = (yyvsp[-2].refs);
        !          1409:        }
        !          1410: #line 1411 "settings/settings_parser.c" /* yacc.c:1646  */
        !          1411:     break;
        !          1412: 
        !          1413:   case 12:
        !          1414: #line 166 "settings/settings_parser.y" /* yacc.c:1646  */
        !          1415:     {
        !          1416:                (yyval.kv) = settings_kv_create((yyvsp[-2].s), (yyvsp[0].s));
        !          1417:        }
        !          1418: #line 1419 "settings/settings_parser.c" /* yacc.c:1646  */
        !          1419:     break;
        !          1420: 
        !          1421:   case 13:
        !          1422: #line 171 "settings/settings_parser.y" /* yacc.c:1646  */
        !          1423:     {
        !          1424:                (yyval.kv) = settings_kv_create((yyvsp[-1].s), NULL);
        !          1425:        }
        !          1426: #line 1427 "settings/settings_parser.c" /* yacc.c:1646  */
        !          1427:     break;
        !          1428: 
        !          1429:   case 15:
        !          1430: #line 179 "settings/settings_parser.y" /* yacc.c:1646  */
        !          1431:     {  /* just put a single space between them, use strings for more */
        !          1432:                if (asprintf(&(yyval.s), "%s %s", (yyvsp[-1].s), (yyvsp[0].s)) < 0)
        !          1433:                {
        !          1434:                        free((yyvsp[-1].s));
        !          1435:                        free((yyvsp[0].s));
        !          1436:                        YYERROR;
        !          1437:                }
        !          1438:                free((yyvsp[-1].s));
        !          1439:                free((yyvsp[0].s));
        !          1440:        }
        !          1441: #line 1442 "settings/settings_parser.c" /* yacc.c:1646  */
        !          1442:     break;
        !          1443: 
        !          1444: 
        !          1445: #line 1446 "settings/settings_parser.c" /* yacc.c:1646  */
        !          1446:       default: break;
        !          1447:     }
        !          1448:   /* User semantic actions sometimes alter yychar, and that requires
        !          1449:      that yytoken be updated with the new translation.  We take the
        !          1450:      approach of translating immediately before every use of yytoken.
        !          1451:      One alternative is translating here after every semantic action,
        !          1452:      but that translation would be missed if the semantic action invokes
        !          1453:      YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or
        !          1454:      if it invokes YYBACKUP.  In the case of YYABORT or YYACCEPT, an
        !          1455:      incorrect destructor might then be invoked immediately.  In the
        !          1456:      case of YYERROR or YYBACKUP, subsequent parser actions might lead
        !          1457:      to an incorrect destructor call or verbose syntax error message
        !          1458:      before the lookahead is translated.  */
        !          1459:   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
        !          1460: 
        !          1461:   YYPOPSTACK (yylen);
        !          1462:   yylen = 0;
        !          1463:   YY_STACK_PRINT (yyss, yyssp);
        !          1464: 
        !          1465:   *++yyvsp = yyval;
        !          1466: 
        !          1467:   /* Now 'shift' the result of the reduction.  Determine what state
        !          1468:      that goes to, based on the state we popped back to and the rule
        !          1469:      number reduced by.  */
        !          1470: 
        !          1471:   yyn = yyr1[yyn];
        !          1472: 
        !          1473:   yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
        !          1474:   if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
        !          1475:     yystate = yytable[yystate];
        !          1476:   else
        !          1477:     yystate = yydefgoto[yyn - YYNTOKENS];
        !          1478: 
        !          1479:   goto yynewstate;
        !          1480: 
        !          1481: 
        !          1482: /*--------------------------------------.
        !          1483: | yyerrlab -- here on detecting error.  |
        !          1484: `--------------------------------------*/
        !          1485: yyerrlab:
        !          1486:   /* Make sure we have latest lookahead translation.  See comments at
        !          1487:      user semantic actions for why this is necessary.  */
        !          1488:   yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);
        !          1489: 
        !          1490:   /* If not already recovering from an error, report this error.  */
        !          1491:   if (!yyerrstatus)
        !          1492:     {
        !          1493:       ++yynerrs;
        !          1494: #if ! YYERROR_VERBOSE
        !          1495:       yyerror (ctx, YY_("syntax error"));
        !          1496: #else
        !          1497: # define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \
        !          1498:                                         yyssp, yytoken)
        !          1499:       {
        !          1500:         char const *yymsgp = YY_("syntax error");
        !          1501:         int yysyntax_error_status;
        !          1502:         yysyntax_error_status = YYSYNTAX_ERROR;
        !          1503:         if (yysyntax_error_status == 0)
        !          1504:           yymsgp = yymsg;
        !          1505:         else if (yysyntax_error_status == 1)
        !          1506:           {
        !          1507:             if (yymsg != yymsgbuf)
        !          1508:               YYSTACK_FREE (yymsg);
        !          1509:             yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc);
        !          1510:             if (!yymsg)
        !          1511:               {
        !          1512:                 yymsg = yymsgbuf;
        !          1513:                 yymsg_alloc = sizeof yymsgbuf;
        !          1514:                 yysyntax_error_status = 2;
        !          1515:               }
        !          1516:             else
        !          1517:               {
        !          1518:                 yysyntax_error_status = YYSYNTAX_ERROR;
        !          1519:                 yymsgp = yymsg;
        !          1520:               }
        !          1521:           }
        !          1522:         yyerror (ctx, yymsgp);
        !          1523:         if (yysyntax_error_status == 2)
        !          1524:           goto yyexhaustedlab;
        !          1525:       }
        !          1526: # undef YYSYNTAX_ERROR
        !          1527: #endif
        !          1528:     }
        !          1529: 
        !          1530: 
        !          1531: 
        !          1532:   if (yyerrstatus == 3)
        !          1533:     {
        !          1534:       /* If just tried and failed to reuse lookahead token after an
        !          1535:          error, discard it.  */
        !          1536: 
        !          1537:       if (yychar <= YYEOF)
        !          1538:         {
        !          1539:           /* Return failure if at end of input.  */
        !          1540:           if (yychar == YYEOF)
        !          1541:             YYABORT;
        !          1542:         }
        !          1543:       else
        !          1544:         {
        !          1545:           yydestruct ("Error: discarding",
        !          1546:                       yytoken, &yylval, ctx);
        !          1547:           yychar = YYEMPTY;
        !          1548:         }
        !          1549:     }
        !          1550: 
        !          1551:   /* Else will try to reuse lookahead token after shifting the error
        !          1552:      token.  */
        !          1553:   goto yyerrlab1;
        !          1554: 
        !          1555: 
        !          1556: /*---------------------------------------------------.
        !          1557: | yyerrorlab -- error raised explicitly by YYERROR.  |
        !          1558: `---------------------------------------------------*/
        !          1559: yyerrorlab:
        !          1560: 
        !          1561:   /* Pacify compilers like GCC when the user code never invokes
        !          1562:      YYERROR and the label yyerrorlab therefore never appears in user
        !          1563:      code.  */
        !          1564:   if (/*CONSTCOND*/ 0)
        !          1565:      goto yyerrorlab;
        !          1566: 
        !          1567:   /* Do not reclaim the symbols of the rule whose action triggered
        !          1568:      this YYERROR.  */
        !          1569:   YYPOPSTACK (yylen);
        !          1570:   yylen = 0;
        !          1571:   YY_STACK_PRINT (yyss, yyssp);
        !          1572:   yystate = *yyssp;
        !          1573:   goto yyerrlab1;
        !          1574: 
        !          1575: 
        !          1576: /*-------------------------------------------------------------.
        !          1577: | yyerrlab1 -- common code for both syntax error and YYERROR.  |
        !          1578: `-------------------------------------------------------------*/
        !          1579: yyerrlab1:
        !          1580:   yyerrstatus = 3;      /* Each real token shifted decrements this.  */
        !          1581: 
        !          1582:   for (;;)
        !          1583:     {
        !          1584:       yyn = yypact[yystate];
        !          1585:       if (!yypact_value_is_default (yyn))
        !          1586:         {
        !          1587:           yyn += YYTERROR;
        !          1588:           if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
        !          1589:             {
        !          1590:               yyn = yytable[yyn];
        !          1591:               if (0 < yyn)
        !          1592:                 break;
        !          1593:             }
        !          1594:         }
        !          1595: 
        !          1596:       /* Pop the current state because it cannot handle the error token.  */
        !          1597:       if (yyssp == yyss)
        !          1598:         YYABORT;
        !          1599: 
        !          1600: 
        !          1601:       yydestruct ("Error: popping",
        !          1602:                   yystos[yystate], yyvsp, ctx);
        !          1603:       YYPOPSTACK (1);
        !          1604:       yystate = *yyssp;
        !          1605:       YY_STACK_PRINT (yyss, yyssp);
        !          1606:     }
        !          1607: 
        !          1608:   YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
        !          1609:   *++yyvsp = yylval;
        !          1610:   YY_IGNORE_MAYBE_UNINITIALIZED_END
        !          1611: 
        !          1612: 
        !          1613:   /* Shift the error token.  */
        !          1614:   YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
        !          1615: 
        !          1616:   yystate = yyn;
        !          1617:   goto yynewstate;
        !          1618: 
        !          1619: 
        !          1620: /*-------------------------------------.
        !          1621: | yyacceptlab -- YYACCEPT comes here.  |
        !          1622: `-------------------------------------*/
        !          1623: yyacceptlab:
        !          1624:   yyresult = 0;
        !          1625:   goto yyreturn;
        !          1626: 
        !          1627: /*-----------------------------------.
        !          1628: | yyabortlab -- YYABORT comes here.  |
        !          1629: `-----------------------------------*/
        !          1630: yyabortlab:
        !          1631:   yyresult = 1;
        !          1632:   goto yyreturn;
        !          1633: 
        !          1634: #if !defined yyoverflow || YYERROR_VERBOSE
        !          1635: /*-------------------------------------------------.
        !          1636: | yyexhaustedlab -- memory exhaustion comes here.  |
        !          1637: `-------------------------------------------------*/
        !          1638: yyexhaustedlab:
        !          1639:   yyerror (ctx, YY_("memory exhausted"));
        !          1640:   yyresult = 2;
        !          1641:   /* Fall through.  */
        !          1642: #endif
        !          1643: 
        !          1644: yyreturn:
        !          1645:   if (yychar != YYEMPTY)
        !          1646:     {
        !          1647:       /* Make sure we have latest lookahead translation.  See comments at
        !          1648:          user semantic actions for why this is necessary.  */
        !          1649:       yytoken = YYTRANSLATE (yychar);
        !          1650:       yydestruct ("Cleanup: discarding lookahead",
        !          1651:                   yytoken, &yylval, ctx);
        !          1652:     }
        !          1653:   /* Do not reclaim the symbols of the rule whose action triggered
        !          1654:      this YYABORT or YYACCEPT.  */
        !          1655:   YYPOPSTACK (yylen);
        !          1656:   YY_STACK_PRINT (yyss, yyssp);
        !          1657:   while (yyssp != yyss)
        !          1658:     {
        !          1659:       yydestruct ("Cleanup: popping",
        !          1660:                   yystos[*yyssp], yyvsp, ctx);
        !          1661:       YYPOPSTACK (1);
        !          1662:     }
        !          1663: #ifndef yyoverflow
        !          1664:   if (yyss != yyssa)
        !          1665:     YYSTACK_FREE (yyss);
        !          1666: #endif
        !          1667: #if YYERROR_VERBOSE
        !          1668:   if (yymsg != yymsgbuf)
        !          1669:     YYSTACK_FREE (yymsg);
        !          1670: #endif
        !          1671:   return yyresult;
        !          1672: }
        !          1673: #line 196 "settings/settings_parser.y" /* yacc.c:1906  */
        !          1674: 
        !          1675: 
        !          1676: /**
        !          1677:  * Referenced by the generated parser
        !          1678:  */
        !          1679: static void settings_parser_error(parser_helper_t *ctx, const char *s)
        !          1680: {
        !          1681:        char *text = settings_parser_get_text(ctx->scanner);
        !          1682:        int len = settings_parser_get_leng(ctx->scanner);
        !          1683: 
        !          1684:        if (len && text[len-1] == '\n')
        !          1685:        {       /* cut off newline at the end to avoid muti-line log messages */
        !          1686:                len--;
        !          1687:        }
        !          1688:        PARSER_DBG1(ctx, "%s [%.*s]", s, len, text);
        !          1689: }
        !          1690: 
        !          1691: /**
        !          1692:  * Create a section and push it to the stack (the name is adopted), returns
        !          1693:  * the created section
        !          1694:  */
        !          1695: static section_t *push_section(parser_helper_t *ctx, char *name)
        !          1696: {
        !          1697:        array_t *sections = (array_t*)ctx->context;
        !          1698:        section_t *section;
        !          1699: 
        !          1700:        section = settings_section_create(name);
        !          1701:        array_insert(sections, ARRAY_TAIL, section);
        !          1702:        return section;
        !          1703: }
        !          1704: 
        !          1705: /**
        !          1706:  * Removes the top section of the stack and returns it
        !          1707:  */
        !          1708: static section_t *pop_section(parser_helper_t *ctx)
        !          1709: {
        !          1710:        array_t *sections = (array_t*)ctx->context;
        !          1711:        section_t *section;
        !          1712: 
        !          1713:        array_remove(sections, ARRAY_TAIL, &section);
        !          1714:        return section;
        !          1715: }
        !          1716: 
        !          1717: /**
        !          1718:  * Adds the given section to the section on top of the stack
        !          1719:  */
        !          1720: static void add_section(parser_helper_t *ctx, section_t *section)
        !          1721: {
        !          1722:        array_t *sections = (array_t*)ctx->context;
        !          1723:        section_t *parent;
        !          1724: 
        !          1725:        array_get(sections, ARRAY_TAIL, &parent);
        !          1726:        settings_section_add(parent, section, NULL);
        !          1727: }
        !          1728: 
        !          1729: /**
        !          1730:  * Adds the given key/value pair to the section on top of the stack
        !          1731:  */
        !          1732: static void add_setting(parser_helper_t *ctx, kv_t *kv)
        !          1733: {
        !          1734:        array_t *sections = (array_t*)ctx->context;
        !          1735:        section_t *section;
        !          1736: 
        !          1737:        array_get(sections, ARRAY_TAIL, &section);
        !          1738:        settings_kv_add(section, kv, NULL);
        !          1739: }
        !          1740: 
        !          1741: /**
        !          1742:  * Adds the given references to the section on top of the stack
        !          1743:  */
        !          1744: static void add_references(parser_helper_t *ctx, array_t *references)
        !          1745: {
        !          1746:        array_t *sections = (array_t*)ctx->context;
        !          1747:        section_t *section;
        !          1748:        enumerator_t *refs;
        !          1749:        char *ref;
        !          1750: 
        !          1751:        array_get(sections, ARRAY_TAIL, &section);
        !          1752: 
        !          1753:        refs = array_create_enumerator(references);
        !          1754:        while (refs->enumerate(refs, &ref))
        !          1755:        {
        !          1756:                settings_reference_add(section, ref, FALSE);
        !          1757:                array_remove_at(references, refs);
        !          1758:        }
        !          1759:        refs->destroy(refs);
        !          1760: }
        !          1761: 
        !          1762: /**
        !          1763:  * Parse the given file and add all sections and key/value pairs to the
        !          1764:  * given section.
        !          1765:  */
        !          1766: bool settings_parser_parse_file(section_t *root, char *name)
        !          1767: {
        !          1768:        parser_helper_t *helper;
        !          1769:        array_t *sections = NULL;
        !          1770:        bool success = FALSE;
        !          1771: 
        !          1772:        array_insert_create(&sections, ARRAY_TAIL, root);
        !          1773:        helper = parser_helper_create(sections);
        !          1774:        helper->get_lineno = settings_parser_get_lineno;
        !          1775:        if (settings_parser_lex_init_extra(helper, &helper->scanner) != 0)
        !          1776:        {
        !          1777:                helper->destroy(helper);
        !          1778:                array_destroy(sections);
        !          1779:                return FALSE;
        !          1780:        }
        !          1781:        helper->file_include(helper, name);
        !          1782:        if (!settings_parser_open_next_file(helper))
        !          1783:        {
        !          1784:                if (lib->conf && streq(name, lib->conf))
        !          1785:                {
        !          1786:                        DBG2(DBG_CFG, "failed to open config file '%s'", name);
        !          1787:                }
        !          1788:                else
        !          1789:                {
        !          1790:                        DBG1(DBG_CFG, "failed to open config file '%s'", name);
        !          1791:                }
        !          1792:        }
        !          1793:        else
        !          1794:        {
        !          1795:                if (getenv("DEBUG_SETTINGS_PARSER"))
        !          1796:                {
        !          1797:                        yydebug = 1;
        !          1798:                        settings_parser_set_debug(1, helper->scanner);
        !          1799:                }
        !          1800:                success = yyparse(helper) == 0;
        !          1801:                if (!success)
        !          1802:                {
        !          1803:                        DBG1(DBG_CFG, "invalid config file '%s'", name);
        !          1804:                }
        !          1805:        }
        !          1806:        array_destroy(sections);
        !          1807:        settings_parser_lex_destroy(helper->scanner);
        !          1808:        helper->destroy(helper);
        !          1809:        return success;
        !          1810: }
        !          1811: 
        !          1812: /**
        !          1813:  * Parse the given string and add all sections and key/value pairs to the
        !          1814:  * given section.
        !          1815:  */
        !          1816: bool settings_parser_parse_string(section_t *root, char *settings)
        !          1817: {
        !          1818:        parser_helper_t *helper;
        !          1819:        array_t *sections = NULL;
        !          1820:        bool success = FALSE;
        !          1821: 
        !          1822:        array_insert_create(&sections, ARRAY_TAIL, root);
        !          1823:        helper = parser_helper_create(sections);
        !          1824:        helper->get_lineno = settings_parser_get_lineno;
        !          1825:        if (settings_parser_lex_init_extra(helper, &helper->scanner) != 0)
        !          1826:        {
        !          1827:                helper->destroy(helper);
        !          1828:                array_destroy(sections);
        !          1829:                return FALSE;
        !          1830:        }
        !          1831:        settings_parser_load_string(helper, settings);
        !          1832:        if (getenv("DEBUG_SETTINGS_PARSER"))
        !          1833:        {
        !          1834:                yydebug = 1;
        !          1835:                settings_parser_set_debug(1, helper->scanner);
        !          1836:        }
        !          1837:        success = yyparse(helper) == 0;
        !          1838:        if (!success)
        !          1839:        {
        !          1840:                DBG1(DBG_CFG, "failed to parse settings '%s'", settings);
        !          1841:        }
        !          1842:        array_destroy(sections);
        !          1843:        settings_parser_lex_destroy(helper->scanner);
        !          1844:        helper->destroy(helper);
        !          1845:        return success;
        !          1846: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>