1*2e9d4914SAndroid Build Coastguard Worker /* -*- mode: C -*- */ 2*2e9d4914SAndroid Build Coastguard Worker /* ---------------------------------------------------------------------------- 3*2e9d4914SAndroid Build Coastguard Worker libconfig - A library for processing structured configuration files 4*2e9d4914SAndroid Build Coastguard Worker Copyright (C) 2005-2018 Mark A Lindner 5*2e9d4914SAndroid Build Coastguard Worker 6*2e9d4914SAndroid Build Coastguard Worker This file is part of libconfig. 7*2e9d4914SAndroid Build Coastguard Worker 8*2e9d4914SAndroid Build Coastguard Worker This library is free software; you can redistribute it and/or 9*2e9d4914SAndroid Build Coastguard Worker modify it under the terms of the GNU Lesser General Public License 10*2e9d4914SAndroid Build Coastguard Worker as published by the Free Software Foundation; either version 2.1 of 11*2e9d4914SAndroid Build Coastguard Worker the License, or (at your option) any later version. 12*2e9d4914SAndroid Build Coastguard Worker 13*2e9d4914SAndroid Build Coastguard Worker This library is distributed in the hope that it will be useful, but 14*2e9d4914SAndroid Build Coastguard Worker WITHOUT ANY WARRANTY; without even the implied warranty of 15*2e9d4914SAndroid Build Coastguard Worker MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16*2e9d4914SAndroid Build Coastguard Worker Lesser General Public License for more details. 17*2e9d4914SAndroid Build Coastguard Worker 18*2e9d4914SAndroid Build Coastguard Worker You should have received a copy of the GNU Library General Public 19*2e9d4914SAndroid Build Coastguard Worker License along with this library; if not, see 20*2e9d4914SAndroid Build Coastguard Worker <http://www.gnu.org/licenses/>. 21*2e9d4914SAndroid Build Coastguard Worker ---------------------------------------------------------------------------- 22*2e9d4914SAndroid Build Coastguard Worker */ 23*2e9d4914SAndroid Build Coastguard Worker 24*2e9d4914SAndroid Build Coastguard Worker %defines 25*2e9d4914SAndroid Build Coastguard Worker %output "y.tab.c" 26*2e9d4914SAndroid Build Coastguard Worker %pure-parser 27*2e9d4914SAndroid Build Coastguard Worker %lex-param{void *scanner} 28*2e9d4914SAndroid Build Coastguard Worker %parse-param{void *scanner} 29*2e9d4914SAndroid Build Coastguard Worker %parse-param{struct parse_context *ctx} 30*2e9d4914SAndroid Build Coastguard Worker %parse-param{struct scan_context *scan_ctx} 31*2e9d4914SAndroid Build Coastguard Worker 32*2e9d4914SAndroid Build Coastguard Worker %{ 33*2e9d4914SAndroid Build Coastguard Worker #include <string.h> 34*2e9d4914SAndroid Build Coastguard Worker #include <stdlib.h> 35*2e9d4914SAndroid Build Coastguard Worker 36*2e9d4914SAndroid Build Coastguard Worker #include "libconfig.h" 37*2e9d4914SAndroid Build Coastguard Worker #include "parsectx.h" 38*2e9d4914SAndroid Build Coastguard Worker #include "scanctx.h" 39*2e9d4914SAndroid Build Coastguard Worker #include "util.h" 40*2e9d4914SAndroid Build Coastguard Worker #include "wincompat.h" 41*2e9d4914SAndroid Build Coastguard Worker 42*2e9d4914SAndroid Build Coastguard Worker /* These declarations are provided to suppress compiler warnings. */ 43*2e9d4914SAndroid Build Coastguard Worker extern int libconfig_yylex(); 44*2e9d4914SAndroid Build Coastguard Worker extern int libconfig_yyget_lineno(); 45*2e9d4914SAndroid Build Coastguard Worker 46*2e9d4914SAndroid Build Coastguard Worker static const char *err_array_elem_type = "mismatched element type in array"; 47*2e9d4914SAndroid Build Coastguard Worker static const char *err_duplicate_setting = "duplicate setting name"; 48*2e9d4914SAndroid Build Coastguard Worker 49*2e9d4914SAndroid Build Coastguard Worker #define IN_ARRAY() \ 50*2e9d4914SAndroid Build Coastguard Worker (ctx->parent && (ctx->parent->type == CONFIG_TYPE_ARRAY)) 51*2e9d4914SAndroid Build Coastguard Worker 52*2e9d4914SAndroid Build Coastguard Worker #define IN_LIST() \ 53*2e9d4914SAndroid Build Coastguard Worker (ctx->parent && (ctx->parent->type == CONFIG_TYPE_LIST)) 54*2e9d4914SAndroid Build Coastguard Worker 55*2e9d4914SAndroid Build Coastguard Worker static void capture_parse_pos(void *scanner, struct scan_context *scan_ctx, 56*2e9d4914SAndroid Build Coastguard Worker config_setting_t *setting) 57*2e9d4914SAndroid Build Coastguard Worker { 58*2e9d4914SAndroid Build Coastguard Worker setting->line = (unsigned int)libconfig_yyget_lineno(scanner); 59*2e9d4914SAndroid Build Coastguard Worker setting->file = libconfig_scanctx_current_filename(scan_ctx); 60*2e9d4914SAndroid Build Coastguard Worker } 61*2e9d4914SAndroid Build Coastguard Worker 62*2e9d4914SAndroid Build Coastguard Worker #define CAPTURE_PARSE_POS(S) \ 63*2e9d4914SAndroid Build Coastguard Worker capture_parse_pos(scanner, scan_ctx, (S)) 64*2e9d4914SAndroid Build Coastguard Worker 65*2e9d4914SAndroid Build Coastguard Worker void libconfig_yyerror(void *scanner, struct parse_context *ctx, 66*2e9d4914SAndroid Build Coastguard Worker struct scan_context *scan_ctx, char const *s) 67*2e9d4914SAndroid Build Coastguard Worker { 68*2e9d4914SAndroid Build Coastguard Worker if(ctx->config->error_text) return; 69*2e9d4914SAndroid Build Coastguard Worker ctx->config->error_line = libconfig_yyget_lineno(scanner); 70*2e9d4914SAndroid Build Coastguard Worker ctx->config->error_text = s; 71*2e9d4914SAndroid Build Coastguard Worker } 72*2e9d4914SAndroid Build Coastguard Worker 73*2e9d4914SAndroid Build Coastguard Worker %} 74*2e9d4914SAndroid Build Coastguard Worker 75*2e9d4914SAndroid Build Coastguard Worker %union 76*2e9d4914SAndroid Build Coastguard Worker { 77*2e9d4914SAndroid Build Coastguard Worker int ival; 78*2e9d4914SAndroid Build Coastguard Worker long long llval; 79*2e9d4914SAndroid Build Coastguard Worker double fval; 80*2e9d4914SAndroid Build Coastguard Worker char *sval; 81*2e9d4914SAndroid Build Coastguard Worker } 82*2e9d4914SAndroid Build Coastguard Worker 83*2e9d4914SAndroid Build Coastguard Worker %token <ival> TOK_BOOLEAN TOK_INTEGER TOK_HEX 84*2e9d4914SAndroid Build Coastguard Worker %token <llval> TOK_INTEGER64 TOK_HEX64 85*2e9d4914SAndroid Build Coastguard Worker %token <fval> TOK_FLOAT 86*2e9d4914SAndroid Build Coastguard Worker %token <sval> TOK_STRING TOK_NAME 87*2e9d4914SAndroid Build Coastguard Worker %token TOK_EQUALS TOK_NEWLINE TOK_ARRAY_START TOK_ARRAY_END TOK_LIST_START TOK_LIST_END TOK_COMMA TOK_GROUP_START TOK_GROUP_END TOK_SEMICOLON TOK_GARBAGE TOK_ERROR 88*2e9d4914SAndroid Build Coastguard Worker %destructor { free($$); } TOK_STRING 89*2e9d4914SAndroid Build Coastguard Worker 90*2e9d4914SAndroid Build Coastguard Worker %% 91*2e9d4914SAndroid Build Coastguard Worker 92*2e9d4914SAndroid Build Coastguard Worker configuration: 93*2e9d4914SAndroid Build Coastguard Worker /* empty */ 94*2e9d4914SAndroid Build Coastguard Worker | setting_list 95*2e9d4914SAndroid Build Coastguard Worker ; 96*2e9d4914SAndroid Build Coastguard Worker 97*2e9d4914SAndroid Build Coastguard Worker setting_list: 98*2e9d4914SAndroid Build Coastguard Worker setting 99*2e9d4914SAndroid Build Coastguard Worker | setting_list setting 100*2e9d4914SAndroid Build Coastguard Worker ; 101*2e9d4914SAndroid Build Coastguard Worker 102*2e9d4914SAndroid Build Coastguard Worker setting_list_optional: 103*2e9d4914SAndroid Build Coastguard Worker /* empty */ 104*2e9d4914SAndroid Build Coastguard Worker | setting_list 105*2e9d4914SAndroid Build Coastguard Worker ; 106*2e9d4914SAndroid Build Coastguard Worker 107*2e9d4914SAndroid Build Coastguard Worker setting_terminator: 108*2e9d4914SAndroid Build Coastguard Worker /* empty */ 109*2e9d4914SAndroid Build Coastguard Worker | TOK_SEMICOLON 110*2e9d4914SAndroid Build Coastguard Worker | TOK_COMMA 111*2e9d4914SAndroid Build Coastguard Worker ; 112*2e9d4914SAndroid Build Coastguard Worker 113*2e9d4914SAndroid Build Coastguard Worker setting: 114*2e9d4914SAndroid Build Coastguard Worker TOK_NAME 115*2e9d4914SAndroid Build Coastguard Worker { 116*2e9d4914SAndroid Build Coastguard Worker ctx->setting = config_setting_add(ctx->parent, $1, CONFIG_TYPE_NONE); 117*2e9d4914SAndroid Build Coastguard Worker 118*2e9d4914SAndroid Build Coastguard Worker if(ctx->setting == NULL) 119*2e9d4914SAndroid Build Coastguard Worker { 120*2e9d4914SAndroid Build Coastguard Worker libconfig_yyerror(scanner, ctx, scan_ctx, err_duplicate_setting); 121*2e9d4914SAndroid Build Coastguard Worker YYABORT; 122*2e9d4914SAndroid Build Coastguard Worker } 123*2e9d4914SAndroid Build Coastguard Worker else 124*2e9d4914SAndroid Build Coastguard Worker { 125*2e9d4914SAndroid Build Coastguard Worker CAPTURE_PARSE_POS(ctx->setting); 126*2e9d4914SAndroid Build Coastguard Worker } 127*2e9d4914SAndroid Build Coastguard Worker } 128*2e9d4914SAndroid Build Coastguard Worker 129*2e9d4914SAndroid Build Coastguard Worker TOK_EQUALS value setting_terminator 130*2e9d4914SAndroid Build Coastguard Worker ; 131*2e9d4914SAndroid Build Coastguard Worker 132*2e9d4914SAndroid Build Coastguard Worker array: 133*2e9d4914SAndroid Build Coastguard Worker TOK_ARRAY_START 134*2e9d4914SAndroid Build Coastguard Worker { 135*2e9d4914SAndroid Build Coastguard Worker if(IN_LIST()) 136*2e9d4914SAndroid Build Coastguard Worker { 137*2e9d4914SAndroid Build Coastguard Worker ctx->parent = config_setting_add(ctx->parent, NULL, CONFIG_TYPE_ARRAY); 138*2e9d4914SAndroid Build Coastguard Worker CAPTURE_PARSE_POS(ctx->parent); 139*2e9d4914SAndroid Build Coastguard Worker } 140*2e9d4914SAndroid Build Coastguard Worker else 141*2e9d4914SAndroid Build Coastguard Worker { 142*2e9d4914SAndroid Build Coastguard Worker ctx->setting->type = CONFIG_TYPE_ARRAY; 143*2e9d4914SAndroid Build Coastguard Worker ctx->parent = ctx->setting; 144*2e9d4914SAndroid Build Coastguard Worker ctx->setting = NULL; 145*2e9d4914SAndroid Build Coastguard Worker } 146*2e9d4914SAndroid Build Coastguard Worker } 147*2e9d4914SAndroid Build Coastguard Worker simple_value_list_optional 148*2e9d4914SAndroid Build Coastguard Worker TOK_ARRAY_END 149*2e9d4914SAndroid Build Coastguard Worker { 150*2e9d4914SAndroid Build Coastguard Worker if(ctx->parent) 151*2e9d4914SAndroid Build Coastguard Worker ctx->parent = ctx->parent->parent; 152*2e9d4914SAndroid Build Coastguard Worker } 153*2e9d4914SAndroid Build Coastguard Worker ; 154*2e9d4914SAndroid Build Coastguard Worker 155*2e9d4914SAndroid Build Coastguard Worker list: 156*2e9d4914SAndroid Build Coastguard Worker TOK_LIST_START 157*2e9d4914SAndroid Build Coastguard Worker { 158*2e9d4914SAndroid Build Coastguard Worker if(IN_LIST()) 159*2e9d4914SAndroid Build Coastguard Worker { 160*2e9d4914SAndroid Build Coastguard Worker ctx->parent = config_setting_add(ctx->parent, NULL, CONFIG_TYPE_LIST); 161*2e9d4914SAndroid Build Coastguard Worker CAPTURE_PARSE_POS(ctx->parent); 162*2e9d4914SAndroid Build Coastguard Worker } 163*2e9d4914SAndroid Build Coastguard Worker else 164*2e9d4914SAndroid Build Coastguard Worker { 165*2e9d4914SAndroid Build Coastguard Worker ctx->setting->type = CONFIG_TYPE_LIST; 166*2e9d4914SAndroid Build Coastguard Worker ctx->parent = ctx->setting; 167*2e9d4914SAndroid Build Coastguard Worker ctx->setting = NULL; 168*2e9d4914SAndroid Build Coastguard Worker } 169*2e9d4914SAndroid Build Coastguard Worker } 170*2e9d4914SAndroid Build Coastguard Worker value_list_optional 171*2e9d4914SAndroid Build Coastguard Worker TOK_LIST_END 172*2e9d4914SAndroid Build Coastguard Worker { 173*2e9d4914SAndroid Build Coastguard Worker if(ctx->parent) 174*2e9d4914SAndroid Build Coastguard Worker ctx->parent = ctx->parent->parent; 175*2e9d4914SAndroid Build Coastguard Worker } 176*2e9d4914SAndroid Build Coastguard Worker ; 177*2e9d4914SAndroid Build Coastguard Worker 178*2e9d4914SAndroid Build Coastguard Worker value: 179*2e9d4914SAndroid Build Coastguard Worker simple_value 180*2e9d4914SAndroid Build Coastguard Worker | array 181*2e9d4914SAndroid Build Coastguard Worker | list 182*2e9d4914SAndroid Build Coastguard Worker | group 183*2e9d4914SAndroid Build Coastguard Worker ; 184*2e9d4914SAndroid Build Coastguard Worker 185*2e9d4914SAndroid Build Coastguard Worker string: 186*2e9d4914SAndroid Build Coastguard Worker TOK_STRING { libconfig_parsectx_append_string(ctx, $1); free($1); } 187*2e9d4914SAndroid Build Coastguard Worker | string TOK_STRING { libconfig_parsectx_append_string(ctx, $2); free($2); } 188*2e9d4914SAndroid Build Coastguard Worker ; 189*2e9d4914SAndroid Build Coastguard Worker 190*2e9d4914SAndroid Build Coastguard Worker simple_value: 191*2e9d4914SAndroid Build Coastguard Worker TOK_BOOLEAN 192*2e9d4914SAndroid Build Coastguard Worker { 193*2e9d4914SAndroid Build Coastguard Worker if(IN_ARRAY() || IN_LIST()) 194*2e9d4914SAndroid Build Coastguard Worker { 195*2e9d4914SAndroid Build Coastguard Worker config_setting_t *e = config_setting_set_bool_elem(ctx->parent, -1, 196*2e9d4914SAndroid Build Coastguard Worker (int)$1); 197*2e9d4914SAndroid Build Coastguard Worker 198*2e9d4914SAndroid Build Coastguard Worker if(! e) 199*2e9d4914SAndroid Build Coastguard Worker { 200*2e9d4914SAndroid Build Coastguard Worker libconfig_yyerror(scanner, ctx, scan_ctx, err_array_elem_type); 201*2e9d4914SAndroid Build Coastguard Worker YYABORT; 202*2e9d4914SAndroid Build Coastguard Worker } 203*2e9d4914SAndroid Build Coastguard Worker else 204*2e9d4914SAndroid Build Coastguard Worker { 205*2e9d4914SAndroid Build Coastguard Worker CAPTURE_PARSE_POS(e); 206*2e9d4914SAndroid Build Coastguard Worker } 207*2e9d4914SAndroid Build Coastguard Worker } 208*2e9d4914SAndroid Build Coastguard Worker else 209*2e9d4914SAndroid Build Coastguard Worker config_setting_set_bool(ctx->setting, (int)$1); 210*2e9d4914SAndroid Build Coastguard Worker } 211*2e9d4914SAndroid Build Coastguard Worker | TOK_INTEGER 212*2e9d4914SAndroid Build Coastguard Worker { 213*2e9d4914SAndroid Build Coastguard Worker if(IN_ARRAY() || IN_LIST()) 214*2e9d4914SAndroid Build Coastguard Worker { 215*2e9d4914SAndroid Build Coastguard Worker config_setting_t *e = config_setting_set_int_elem(ctx->parent, -1, $1); 216*2e9d4914SAndroid Build Coastguard Worker if(! e) 217*2e9d4914SAndroid Build Coastguard Worker { 218*2e9d4914SAndroid Build Coastguard Worker libconfig_yyerror(scanner, ctx, scan_ctx, err_array_elem_type); 219*2e9d4914SAndroid Build Coastguard Worker YYABORT; 220*2e9d4914SAndroid Build Coastguard Worker } 221*2e9d4914SAndroid Build Coastguard Worker else 222*2e9d4914SAndroid Build Coastguard Worker { 223*2e9d4914SAndroid Build Coastguard Worker config_setting_set_format(e, CONFIG_FORMAT_DEFAULT); 224*2e9d4914SAndroid Build Coastguard Worker CAPTURE_PARSE_POS(e); 225*2e9d4914SAndroid Build Coastguard Worker } 226*2e9d4914SAndroid Build Coastguard Worker } 227*2e9d4914SAndroid Build Coastguard Worker else 228*2e9d4914SAndroid Build Coastguard Worker { 229*2e9d4914SAndroid Build Coastguard Worker config_setting_set_int(ctx->setting, $1); 230*2e9d4914SAndroid Build Coastguard Worker config_setting_set_format(ctx->setting, CONFIG_FORMAT_DEFAULT); 231*2e9d4914SAndroid Build Coastguard Worker } 232*2e9d4914SAndroid Build Coastguard Worker } 233*2e9d4914SAndroid Build Coastguard Worker | TOK_INTEGER64 234*2e9d4914SAndroid Build Coastguard Worker { 235*2e9d4914SAndroid Build Coastguard Worker if(IN_ARRAY() || IN_LIST()) 236*2e9d4914SAndroid Build Coastguard Worker { 237*2e9d4914SAndroid Build Coastguard Worker config_setting_t *e = config_setting_set_int64_elem(ctx->parent, -1, $1); 238*2e9d4914SAndroid Build Coastguard Worker if(! e) 239*2e9d4914SAndroid Build Coastguard Worker { 240*2e9d4914SAndroid Build Coastguard Worker libconfig_yyerror(scanner, ctx, scan_ctx, err_array_elem_type); 241*2e9d4914SAndroid Build Coastguard Worker YYABORT; 242*2e9d4914SAndroid Build Coastguard Worker } 243*2e9d4914SAndroid Build Coastguard Worker else 244*2e9d4914SAndroid Build Coastguard Worker { 245*2e9d4914SAndroid Build Coastguard Worker config_setting_set_format(e, CONFIG_FORMAT_DEFAULT); 246*2e9d4914SAndroid Build Coastguard Worker CAPTURE_PARSE_POS(e); 247*2e9d4914SAndroid Build Coastguard Worker } 248*2e9d4914SAndroid Build Coastguard Worker } 249*2e9d4914SAndroid Build Coastguard Worker else 250*2e9d4914SAndroid Build Coastguard Worker { 251*2e9d4914SAndroid Build Coastguard Worker config_setting_set_int64(ctx->setting, $1); 252*2e9d4914SAndroid Build Coastguard Worker config_setting_set_format(ctx->setting, CONFIG_FORMAT_DEFAULT); 253*2e9d4914SAndroid Build Coastguard Worker } 254*2e9d4914SAndroid Build Coastguard Worker } 255*2e9d4914SAndroid Build Coastguard Worker | TOK_HEX 256*2e9d4914SAndroid Build Coastguard Worker { 257*2e9d4914SAndroid Build Coastguard Worker if(IN_ARRAY() || IN_LIST()) 258*2e9d4914SAndroid Build Coastguard Worker { 259*2e9d4914SAndroid Build Coastguard Worker config_setting_t *e = config_setting_set_int_elem(ctx->parent, -1, $1); 260*2e9d4914SAndroid Build Coastguard Worker if(! e) 261*2e9d4914SAndroid Build Coastguard Worker { 262*2e9d4914SAndroid Build Coastguard Worker libconfig_yyerror(scanner, ctx, scan_ctx, err_array_elem_type); 263*2e9d4914SAndroid Build Coastguard Worker YYABORT; 264*2e9d4914SAndroid Build Coastguard Worker } 265*2e9d4914SAndroid Build Coastguard Worker else 266*2e9d4914SAndroid Build Coastguard Worker { 267*2e9d4914SAndroid Build Coastguard Worker config_setting_set_format(e, CONFIG_FORMAT_HEX); 268*2e9d4914SAndroid Build Coastguard Worker CAPTURE_PARSE_POS(e); 269*2e9d4914SAndroid Build Coastguard Worker } 270*2e9d4914SAndroid Build Coastguard Worker } 271*2e9d4914SAndroid Build Coastguard Worker else 272*2e9d4914SAndroid Build Coastguard Worker { 273*2e9d4914SAndroid Build Coastguard Worker config_setting_set_int(ctx->setting, $1); 274*2e9d4914SAndroid Build Coastguard Worker config_setting_set_format(ctx->setting, CONFIG_FORMAT_HEX); 275*2e9d4914SAndroid Build Coastguard Worker } 276*2e9d4914SAndroid Build Coastguard Worker } 277*2e9d4914SAndroid Build Coastguard Worker | TOK_HEX64 278*2e9d4914SAndroid Build Coastguard Worker { 279*2e9d4914SAndroid Build Coastguard Worker if(IN_ARRAY() || IN_LIST()) 280*2e9d4914SAndroid Build Coastguard Worker { 281*2e9d4914SAndroid Build Coastguard Worker config_setting_t *e = config_setting_set_int64_elem(ctx->parent, -1, $1); 282*2e9d4914SAndroid Build Coastguard Worker if(! e) 283*2e9d4914SAndroid Build Coastguard Worker { 284*2e9d4914SAndroid Build Coastguard Worker libconfig_yyerror(scanner, ctx, scan_ctx, err_array_elem_type); 285*2e9d4914SAndroid Build Coastguard Worker YYABORT; 286*2e9d4914SAndroid Build Coastguard Worker } 287*2e9d4914SAndroid Build Coastguard Worker else 288*2e9d4914SAndroid Build Coastguard Worker { 289*2e9d4914SAndroid Build Coastguard Worker config_setting_set_format(e, CONFIG_FORMAT_HEX); 290*2e9d4914SAndroid Build Coastguard Worker CAPTURE_PARSE_POS(e); 291*2e9d4914SAndroid Build Coastguard Worker } 292*2e9d4914SAndroid Build Coastguard Worker } 293*2e9d4914SAndroid Build Coastguard Worker else 294*2e9d4914SAndroid Build Coastguard Worker { 295*2e9d4914SAndroid Build Coastguard Worker config_setting_set_int64(ctx->setting, $1); 296*2e9d4914SAndroid Build Coastguard Worker config_setting_set_format(ctx->setting, CONFIG_FORMAT_HEX); 297*2e9d4914SAndroid Build Coastguard Worker } 298*2e9d4914SAndroid Build Coastguard Worker } 299*2e9d4914SAndroid Build Coastguard Worker | TOK_FLOAT 300*2e9d4914SAndroid Build Coastguard Worker { 301*2e9d4914SAndroid Build Coastguard Worker if(IN_ARRAY() || IN_LIST()) 302*2e9d4914SAndroid Build Coastguard Worker { 303*2e9d4914SAndroid Build Coastguard Worker config_setting_t *e = config_setting_set_float_elem(ctx->parent, -1, $1); 304*2e9d4914SAndroid Build Coastguard Worker if(! e) 305*2e9d4914SAndroid Build Coastguard Worker { 306*2e9d4914SAndroid Build Coastguard Worker libconfig_yyerror(scanner, ctx, scan_ctx, err_array_elem_type); 307*2e9d4914SAndroid Build Coastguard Worker YYABORT; 308*2e9d4914SAndroid Build Coastguard Worker } 309*2e9d4914SAndroid Build Coastguard Worker else 310*2e9d4914SAndroid Build Coastguard Worker { 311*2e9d4914SAndroid Build Coastguard Worker CAPTURE_PARSE_POS(e); 312*2e9d4914SAndroid Build Coastguard Worker } 313*2e9d4914SAndroid Build Coastguard Worker } 314*2e9d4914SAndroid Build Coastguard Worker else 315*2e9d4914SAndroid Build Coastguard Worker config_setting_set_float(ctx->setting, $1); 316*2e9d4914SAndroid Build Coastguard Worker } 317*2e9d4914SAndroid Build Coastguard Worker | string 318*2e9d4914SAndroid Build Coastguard Worker { 319*2e9d4914SAndroid Build Coastguard Worker if(IN_ARRAY() || IN_LIST()) 320*2e9d4914SAndroid Build Coastguard Worker { 321*2e9d4914SAndroid Build Coastguard Worker const char *s = libconfig_parsectx_take_string(ctx); 322*2e9d4914SAndroid Build Coastguard Worker config_setting_t *e = config_setting_set_string_elem(ctx->parent, -1, s); 323*2e9d4914SAndroid Build Coastguard Worker __delete(s); 324*2e9d4914SAndroid Build Coastguard Worker 325*2e9d4914SAndroid Build Coastguard Worker if(! e) 326*2e9d4914SAndroid Build Coastguard Worker { 327*2e9d4914SAndroid Build Coastguard Worker libconfig_yyerror(scanner, ctx, scan_ctx, err_array_elem_type); 328*2e9d4914SAndroid Build Coastguard Worker YYABORT; 329*2e9d4914SAndroid Build Coastguard Worker } 330*2e9d4914SAndroid Build Coastguard Worker else 331*2e9d4914SAndroid Build Coastguard Worker { 332*2e9d4914SAndroid Build Coastguard Worker CAPTURE_PARSE_POS(e); 333*2e9d4914SAndroid Build Coastguard Worker } 334*2e9d4914SAndroid Build Coastguard Worker } 335*2e9d4914SAndroid Build Coastguard Worker else 336*2e9d4914SAndroid Build Coastguard Worker { 337*2e9d4914SAndroid Build Coastguard Worker const char *s = libconfig_parsectx_take_string(ctx); 338*2e9d4914SAndroid Build Coastguard Worker config_setting_set_string(ctx->setting, s); 339*2e9d4914SAndroid Build Coastguard Worker __delete(s); 340*2e9d4914SAndroid Build Coastguard Worker } 341*2e9d4914SAndroid Build Coastguard Worker } 342*2e9d4914SAndroid Build Coastguard Worker ; 343*2e9d4914SAndroid Build Coastguard Worker 344*2e9d4914SAndroid Build Coastguard Worker value_list: 345*2e9d4914SAndroid Build Coastguard Worker value 346*2e9d4914SAndroid Build Coastguard Worker | value_list TOK_COMMA value 347*2e9d4914SAndroid Build Coastguard Worker | value_list TOK_COMMA 348*2e9d4914SAndroid Build Coastguard Worker ; 349*2e9d4914SAndroid Build Coastguard Worker 350*2e9d4914SAndroid Build Coastguard Worker value_list_optional: 351*2e9d4914SAndroid Build Coastguard Worker /* empty */ 352*2e9d4914SAndroid Build Coastguard Worker | value_list 353*2e9d4914SAndroid Build Coastguard Worker ; 354*2e9d4914SAndroid Build Coastguard Worker 355*2e9d4914SAndroid Build Coastguard Worker simple_value_list: 356*2e9d4914SAndroid Build Coastguard Worker simple_value 357*2e9d4914SAndroid Build Coastguard Worker | simple_value_list TOK_COMMA simple_value 358*2e9d4914SAndroid Build Coastguard Worker | simple_value_list TOK_COMMA 359*2e9d4914SAndroid Build Coastguard Worker ; 360*2e9d4914SAndroid Build Coastguard Worker 361*2e9d4914SAndroid Build Coastguard Worker simple_value_list_optional: 362*2e9d4914SAndroid Build Coastguard Worker /* empty */ 363*2e9d4914SAndroid Build Coastguard Worker | simple_value_list 364*2e9d4914SAndroid Build Coastguard Worker ; 365*2e9d4914SAndroid Build Coastguard Worker 366*2e9d4914SAndroid Build Coastguard Worker group: 367*2e9d4914SAndroid Build Coastguard Worker TOK_GROUP_START 368*2e9d4914SAndroid Build Coastguard Worker { 369*2e9d4914SAndroid Build Coastguard Worker if(IN_LIST()) 370*2e9d4914SAndroid Build Coastguard Worker { 371*2e9d4914SAndroid Build Coastguard Worker ctx->parent = config_setting_add(ctx->parent, NULL, CONFIG_TYPE_GROUP); 372*2e9d4914SAndroid Build Coastguard Worker CAPTURE_PARSE_POS(ctx->parent); 373*2e9d4914SAndroid Build Coastguard Worker } 374*2e9d4914SAndroid Build Coastguard Worker else 375*2e9d4914SAndroid Build Coastguard Worker { 376*2e9d4914SAndroid Build Coastguard Worker ctx->setting->type = CONFIG_TYPE_GROUP; 377*2e9d4914SAndroid Build Coastguard Worker ctx->parent = ctx->setting; 378*2e9d4914SAndroid Build Coastguard Worker ctx->setting = NULL; 379*2e9d4914SAndroid Build Coastguard Worker } 380*2e9d4914SAndroid Build Coastguard Worker } 381*2e9d4914SAndroid Build Coastguard Worker setting_list_optional 382*2e9d4914SAndroid Build Coastguard Worker TOK_GROUP_END 383*2e9d4914SAndroid Build Coastguard Worker { 384*2e9d4914SAndroid Build Coastguard Worker if(ctx->parent) 385*2e9d4914SAndroid Build Coastguard Worker ctx->parent = ctx->parent->parent; 386*2e9d4914SAndroid Build Coastguard Worker } 387*2e9d4914SAndroid Build Coastguard Worker ; 388*2e9d4914SAndroid Build Coastguard Worker 389*2e9d4914SAndroid Build Coastguard Worker %% 390