Smarty_Internal_Configfileparser   F
last analyzed

Complexity

Total Complexity 155

Size/Duplication

Total Lines 1020
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 593
c 1
b 0
f 0
dl 0
loc 1020
rs 2
wmc 155

40 Methods

Rating   Name   Duplication   Size   Complexity  
A yy_accept() 0 12 3
A yy_pop_parser_stack() 0 17 4
A yy_r8() 0 3 1
A yy_r4() 0 4 1
C yy_get_expected_tokens() 0 83 16
A parse_tripple_double_quoted_string() 0 3 1
A yy_r5() 0 9 2
A yy_r9() 0 6 1
A yy_r7() 0 4 1
A __destruct() 0 7 3
A yy_destructor() 0 5 1
A parse_single_quoted_string() 0 14 5
A PrintTrace() 0 4 1
A parse_double_quoted_string() 0 4 1
A Trace() 0 9 3
B yy_reduce() 0 40 10
A yy_r0() 0 3 1
F doParse() 0 96 27
A add_global_vars() 0 7 3
A yy_r15() 0 3 1
A __construct() 0 7 1
A tokenName() 0 9 4
A yy_r17() 0 3 1
A add_section_vars() 0 7 3
A yy_r6() 0 3 1
A yy_r13() 0 3 1
A yy_parse_failed() 0 7 3
A set_var() 0 9 3
B yy_find_reduce_action() 0 19 7
D yy_is_expected_token() 0 87 18
A yy_r12() 0 3 1
A yy_r11() 0 3 1
A yy_r1() 0 4 1
A yy_r14() 0 3 1
A parse_bool() 0 9 2
A yy_r16() 0 3 1
B yy_find_shift_action() 0 30 11
A yy_r10() 0 3 1
A yy_syntax_error() 0 6 1
B yy_shift() 0 37 7

How to fix   Complexity   

Complex Class

Complex classes like Smarty_Internal_Configfileparser often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use Smarty_Internal_Configfileparser, and based on these observations, apply Extract Interface, too.

1
<?php
2
3
class TPC_yyStackEntry
4
{
5
    public $stateno;       /* The state-number */
6
    public $major;         /* The major token value.  This is the code
7
                     ** number for the token at this stack level */
8
    public $minor; /* The user-supplied minor token value.  This
9
                     ** is the value of the token  */
10
}
11
12
// line 12 "../smarty/lexer/smarty_internal_configfileparser.y"
13
14
/**
15
 * Smarty Internal Plugin Configfileparse
16
 *
17
 * This is the config file parser.
18
 * It is generated from the smarty_internal_configfileparser.y file
19
 *
20
 * @package    Smarty
21
 * @subpackage Compiler
22
 * @author     Uwe Tews
23
 */
24
class Smarty_Internal_Configfileparser
25
{
26
    // line 25 "../smarty/lexer/smarty_internal_configfileparser.y"
27
    const TPC_OPENB                = 1;
28
    const TPC_SECTION              = 2;
29
    const TPC_CLOSEB               = 3;
30
    const TPC_DOT                  = 4;
31
    const TPC_ID                   = 5;
32
    const TPC_EQUAL                = 6;
33
    const TPC_FLOAT                = 7;
34
    const TPC_INT                  = 8;
35
    const TPC_BOOL                 = 9;
36
    const TPC_SINGLE_QUOTED_STRING = 10;
37
    const TPC_DOUBLE_QUOTED_STRING = 11;
38
    const TPC_TRIPPLE_QUOTES       = 12;
39
    const TPC_TRIPPLE_TEXT         = 13;
40
    const TPC_TRIPPLE_QUOTES_END   = 14;
41
    const TPC_NAKED_STRING         = 15;
42
    const TPC_OTHER                = 16;
43
    const TPC_NEWLINE              = 17;
44
    const TPC_COMMENTSTART         = 18;
45
    const YY_NO_ACTION             = 60;
46
    const YY_ACCEPT_ACTION         = 59;
47
    const YY_ERROR_ACTION          = 58;
48
    const YY_SZ_ACTTAB             = 38;
49
    const YY_SHIFT_USE_DFLT        = -8;
50
    const YY_SHIFT_MAX             = 19;
51
    const YY_REDUCE_USE_DFLT       = -17;
52
    const YY_REDUCE_MAX            = 10;
53
    const YYNOCODE                 = 29;
54
    const YYSTACKDEPTH             = 100;
55
    const YYNSTATE                 = 36;
56
    const YYNRULE                  = 22;
57
    const YYERRORSYMBOL            = 19;
58
    const YYERRSYMDT               = 'yy0';
59
    const YYFALLBACK               = 0;
60
61
    public static $yy_action        = array(
62
        32, 31, 30, 29, 35, 13, 19, 3, 24, 26,
63
        59, 9, 14, 1, 16, 25, 11, 28, 25, 11,
64
        17, 27, 34, 20, 18, 15, 23, 5, 6, 22,
65
        10, 8, 4, 12, 2, 33, 7, 21,
66
    );
67
68
    public static $yy_lookahead     = array(
69
        7, 8, 9, 10, 11, 12, 5, 23, 15, 16,
70
        20, 21, 2, 23, 4, 17, 18, 14, 17, 18,
71
        13, 14, 25, 26, 15, 2, 17, 3, 3, 17,
72
        25, 25, 6, 1, 23, 27, 22, 24,
73
    );
74
75
    public static $yy_shift_ofst    = array(
76
        -8, 1, 1, 1, -7, -2, -2, 32, -8, -8,
77
        -8, 9, 10, 7, 25, 24, 23, 3, 12, 26,
78
    );
79
80
    public static $yy_reduce_ofst   = array(
81
        -10, -3, -3, -3, 8, 6, 5, 13, 11, 14,
82
        -16,
83
    );
84
85
    public static $yyExpectedTokens = array(
86
        array(),
87
        array(5, 17, 18,),
88
        array(5, 17, 18,),
89
        array(5, 17, 18,),
90
        array(7, 8, 9, 10, 11, 12, 15, 16,),
91
        array(17, 18,),
92
        array(17, 18,),
93
        array(1,),
94
        array(),
95
        array(),
96
        array(),
97
        array(15, 17,),
98
        array(2, 4,),
99
        array(13, 14,),
100
        array(3,),
101
        array(3,),
102
        array(2,),
103
        array(14,),
104
        array(17,),
105
        array(6,),
106
        array(),
107
        array(),
108
        array(),
109
        array(),
110
        array(),
111
        array(),
112
        array(),
113
        array(),
114
        array(),
115
        array(),
116
        array(),
117
        array(),
118
        array(),
119
        array(),
120
        array(),
121
        array(),
122
    );
123
124
    public static $yy_default       = array(
125
        44, 37, 41, 40, 58, 58, 58, 36, 44, 39,
126
        44, 58, 58, 58, 58, 58, 58, 58, 58, 58,
127
        43, 38, 57, 56, 53, 55, 54, 52, 51, 49,
128
        48, 47, 46, 45, 42, 50,
129
    );
130
131
    public static $yyFallback       = array();
132
133
    public static $yyRuleName       = array(
134
        'start ::= global_vars sections',
135
        'global_vars ::= var_list',
136
        'sections ::= sections section',
137
        'sections ::=',
138
        'section ::= OPENB SECTION CLOSEB newline var_list',
139
        'section ::= OPENB DOT SECTION CLOSEB newline var_list',
140
        'var_list ::= var_list newline',
141
        'var_list ::= var_list var',
142
        'var_list ::=',
143
        'var ::= ID EQUAL value',
144
        'value ::= FLOAT',
145
        'value ::= INT',
146
        'value ::= BOOL',
147
        'value ::= SINGLE_QUOTED_STRING',
148
        'value ::= DOUBLE_QUOTED_STRING',
149
        'value ::= TRIPPLE_QUOTES TRIPPLE_TEXT TRIPPLE_QUOTES_END',
150
        'value ::= TRIPPLE_QUOTES TRIPPLE_QUOTES_END',
151
        'value ::= NAKED_STRING',
152
        'value ::= OTHER',
153
        'newline ::= NEWLINE',
154
        'newline ::= COMMENTSTART NEWLINE',
155
        'newline ::= COMMENTSTART NAKED_STRING NEWLINE',
156
    );
157
158
    public static $yyRuleInfo       = array(
159
        array(0 => 20, 1 => 2),
160
        array(0 => 21, 1 => 1),
161
        array(0 => 22, 1 => 2),
162
        array(0 => 22, 1 => 0),
163
        array(0 => 24, 1 => 5),
164
        array(0 => 24, 1 => 6),
165
        array(0 => 23, 1 => 2),
166
        array(0 => 23, 1 => 2),
167
        array(0 => 23, 1 => 0),
168
        array(0 => 26, 1 => 3),
169
        array(0 => 27, 1 => 1),
170
        array(0 => 27, 1 => 1),
171
        array(0 => 27, 1 => 1),
172
        array(0 => 27, 1 => 1),
173
        array(0 => 27, 1 => 1),
174
        array(0 => 27, 1 => 3),
175
        array(0 => 27, 1 => 2),
176
        array(0 => 27, 1 => 1),
177
        array(0 => 27, 1 => 1),
178
        array(0 => 25, 1 => 1),
179
        array(0 => 25, 1 => 2),
180
        array(0 => 25, 1 => 3),
181
    );
182
183
    public static $yyReduceMap      = array(
184
        0  => 0,
185
        2  => 0,
186
        3  => 0,
187
        19 => 0,
188
        20 => 0,
189
        21 => 0,
190
        1  => 1,
191
        4  => 4,
192
        5  => 5,
193
        6  => 6,
194
        7  => 7,
195
        8  => 8,
196
        9  => 9,
197
        10 => 10,
198
        11 => 11,
199
        12 => 12,
200
        13 => 13,
201
        14 => 14,
202
        15 => 15,
203
        16 => 16,
204
        17 => 17,
205
        18 => 17,
206
    );
207
208
    /**
209
     * helper map
210
     *
211
     * @var array
212
     */
213
    private static $escapes_single = array(
214
        '\\' => '\\',
215
        '\'' => '\''
216
    );
217
218
    /**
219
     * result status
220
     *
221
     * @var bool
222
     */
223
    public $successful = true;
224
225
    /**
226
     * return value
227
     *
228
     * @var mixed
229
     */
230
    public $retvalue = 0;
231
232
    /**
233
     * @var
234
     */
235
    public $yymajor;
236
237
    /**
238
     * compiler object
239
     *
240
     * @var Smarty_Internal_Config_File_Compiler
241
     */
242
    public $compiler = null;
243
244
    /**
245
     * smarty object
246
     *
247
     * @var Smarty
248
     */
249
    public $smarty      = null;
250
251
    public $yyTraceFILE;
252
253
    public $yyTracePrompt;
254
255
    public $yyidx;
256
257
    public $yyerrcnt;
258
259
    public $yystack     = array();
260
261
    public $yyTokenName = array(
262
        '$', 'OPENB', 'SECTION', 'CLOSEB',
263
        'DOT', 'ID', 'EQUAL', 'FLOAT',
264
        'INT', 'BOOL', 'SINGLE_QUOTED_STRING', 'DOUBLE_QUOTED_STRING',
265
        'TRIPPLE_QUOTES', 'TRIPPLE_TEXT', 'TRIPPLE_QUOTES_END', 'NAKED_STRING',
266
        'OTHER', 'NEWLINE', 'COMMENTSTART', 'error',
267
        'start', 'global_vars', 'sections', 'var_list',
268
        'section', 'newline', 'var', 'value',
269
    );
270
271
    /**
272
     * lexer object
273
     *
274
     * @var Smarty_Internal_Configfilelexer
275
     */
276
    private $lex;
277
278
    /**
279
     * internal error flag
280
     *
281
     * @var bool
282
     */
283
    private $internalError = false;
284
285
    /**
286
     * copy of config_overwrite property
287
     *
288
     * @var bool
289
     */
290
    private $configOverwrite = false;
291
292
    /**
293
     * copy of config_read_hidden property
294
     *
295
     * @var bool
296
     */
297
    private $configReadHidden = false;
298
299
    private $_retvalue;
300
301
    /**
302
     * constructor
303
     *
304
     * @param Smarty_Internal_Configfilelexer      $lex
305
     * @param Smarty_Internal_Config_File_Compiler $compiler
306
     */
307
    public function __construct(Smarty_Internal_Configfilelexer $lex, Smarty_Internal_Config_File_Compiler $compiler)
308
    {
309
        $this->lex = $lex;
310
        $this->smarty = $compiler->smarty;
311
        $this->compiler = $compiler;
312
        $this->configOverwrite = $this->smarty->config_overwrite;
313
        $this->configReadHidden = $this->smarty->config_read_hidden;
314
    }
315
316
    public static function yy_destructor($yymajor, $yypminor)
317
    {
318
        switch ($yymajor) {
319
            default:
320
                break;   /* If no destructor action specified: do nothing */
321
        }
322
    }
323
324
    /**
325
     * parse single quoted string
326
     *  remove outer quotes
327
     *  unescape inner quotes
328
     *
329
     * @param string $qstr
330
     *
331
     * @return string
332
     */
333
    private static function parse_single_quoted_string($qstr)
334
    {
335
        $escaped_string = substr($qstr, 1, strlen($qstr) - 2); //remove outer quotes
336
        $ss = preg_split('/(\\\\.)/', $escaped_string, -1, PREG_SPLIT_DELIM_CAPTURE);
337
        $str = '';
338
        foreach ($ss as $s) {
339
            if (strlen($s) === 2 && $s[ 0 ] === '\\') {
340
                if (isset(self::$escapes_single[ $s[ 1 ] ])) {
341
                    $s = self::$escapes_single[ $s[ 1 ] ];
342
                }
343
            }
344
            $str .= $s;
345
        }
346
        return $str;
347
    }                    /* Index of top element in stack */
348
    /**
349
     * parse double quoted string
350
     *
351
     * @param string $qstr
352
     *
353
     * @return string
354
     */
355
    private static function parse_double_quoted_string($qstr)
356
    {
357
        $inner_str = substr($qstr, 1, strlen($qstr) - 2);
358
        return stripcslashes($inner_str);
359
    }                 /* Shifts left before out of the error */
360
    /**
361
     * parse triple quoted string
362
     *
363
     * @param string $qstr
364
     *
365
     * @return string
366
     */
367
    private static function parse_tripple_double_quoted_string($qstr)
368
    {
369
        return stripcslashes($qstr);
370
    }  /* The parser's stack */
371
    public function Trace($TraceFILE, $zTracePrompt)
372
    {
373
        if (!$TraceFILE) {
374
            $zTracePrompt = 0;
375
        } elseif (!$zTracePrompt) {
376
            $TraceFILE = 0;
377
        }
378
        $this->yyTraceFILE = $TraceFILE;
379
        $this->yyTracePrompt = $zTracePrompt;
380
    }
381
382
    public function PrintTrace()
383
    {
384
        $this->yyTraceFILE = fopen('php://output', 'w');
385
        $this->yyTracePrompt = '<br>';
386
    }
387
388
    public function tokenName($tokenType)
389
    {
390
        if ($tokenType === 0) {
391
            return 'End of Input';
392
        }
393
        if ($tokenType > 0 && $tokenType < count($this->yyTokenName)) {
394
            return $this->yyTokenName[ $tokenType ];
395
        } else {
396
            return 'Unknown';
397
        }
398
    }
399
400
    public function yy_pop_parser_stack()
401
    {
402
        if (empty($this->yystack)) {
403
            return;
404
        }
405
        $yytos = array_pop($this->yystack);
406
        if ($this->yyTraceFILE && $this->yyidx >= 0) {
407
            fwrite(
408
                $this->yyTraceFILE,
409
                $this->yyTracePrompt . 'Popping ' . $this->yyTokenName[ $yytos->major ] .
410
                "\n"
411
            );
412
        }
413
        $yymajor = $yytos->major;
414
        self::yy_destructor($yymajor, $yytos->minor);
415
        $this->yyidx--;
416
        return $yymajor;
417
    }
418
419
    public function __destruct()
420
    {
421
        while ($this->yystack !== array()) {
422
            $this->yy_pop_parser_stack();
423
        }
424
        if (is_resource($this->yyTraceFILE)) {
425
            fclose($this->yyTraceFILE);
426
        }
427
    }
428
429
    public function yy_get_expected_tokens($token)
430
    {
431
        static $res3 = array();
432
        static $res4 = array();
433
        $state = $this->yystack[ $this->yyidx ]->stateno;
434
        $expected = self::$yyExpectedTokens[ $state ];
435
        if (isset($res3[ $state ][ $token ])) {
436
            if ($res3[ $state ][ $token ]) {
437
                return $expected;
438
            }
439
        } else {
440
            if ($res3[ $state ][ $token ] = in_array($token, self::$yyExpectedTokens[ $state ], true)) {
441
                return $expected;
442
            }
443
        }
444
        $stack = $this->yystack;
445
        $yyidx = $this->yyidx;
446
        do {
447
            $yyact = $this->yy_find_shift_action($token);
448
            if ($yyact >= self::YYNSTATE && $yyact < self::YYNSTATE + self::YYNRULE) {
449
                // reduce action
450
                $done = 0;
451
                do {
452
                    if ($done++ === 100) {
453
                        $this->yyidx = $yyidx;
454
                        $this->yystack = $stack;
455
                        // too much recursion prevents proper detection
456
                        // so give up
457
                        return array_unique($expected);
458
                    }
459
                    $yyruleno = $yyact - self::YYNSTATE;
460
                    $this->yyidx -= self::$yyRuleInfo[ $yyruleno ][ 1 ];
461
                    $nextstate = $this->yy_find_reduce_action(
462
                        $this->yystack[ $this->yyidx ]->stateno,
463
                        self::$yyRuleInfo[ $yyruleno ][ 0 ]
464
                    );
465
                    if (isset(self::$yyExpectedTokens[ $nextstate ])) {
466
                        $expected = array_merge($expected, self::$yyExpectedTokens[ $nextstate ]);
467
                        if (isset($res4[ $nextstate ][ $token ])) {
468
                            if ($res4[ $nextstate ][ $token ]) {
469
                                $this->yyidx = $yyidx;
470
                                $this->yystack = $stack;
471
                                return array_unique($expected);
472
                            }
473
                        } else {
474
                            if ($res4[ $nextstate ][ $token ] =
475
                                in_array($token, self::$yyExpectedTokens[ $nextstate ], true)) {
476
                                $this->yyidx = $yyidx;
477
                                $this->yystack = $stack;
478
                                return array_unique($expected);
479
                            }
480
                        }
481
                    }
482
                    if ($nextstate < self::YYNSTATE) {
483
                        // we need to shift a non-terminal
484
                        $this->yyidx++;
485
                        $x = new TPC_yyStackEntry;
486
                        $x->stateno = $nextstate;
487
                        $x->major = self::$yyRuleInfo[ $yyruleno ][ 0 ];
488
                        $this->yystack[ $this->yyidx ] = $x;
489
                        continue 2;
490
                    } elseif ($nextstate === self::YYNSTATE + self::YYNRULE + 1) {
491
                        $this->yyidx = $yyidx;
492
                        $this->yystack = $stack;
493
                        // the last token was just ignored, we can't accept
494
                        // by ignoring input, this is in essence ignoring a
495
                        // syntax error!
496
                        return array_unique($expected);
497
                    } elseif ($nextstate === self::YY_NO_ACTION) {
498
                        $this->yyidx = $yyidx;
499
                        $this->yystack = $stack;
500
                        // input accepted, but not shifted (I guess)
501
                        return $expected;
502
                    } else {
503
                        $yyact = $nextstate;
504
                    }
505
                } while (true);
506
            }
507
            break;
508
        } while (true);
509
        $this->yyidx = $yyidx;
510
        $this->yystack = $stack;
511
        return array_unique($expected);
512
    }
513
514
    public function yy_is_expected_token($token)
515
    {
516
        static $res = array();
517
        static $res2 = array();
518
        if ($token === 0) {
519
            return true; // 0 is not part of this
520
        }
521
        $state = $this->yystack[ $this->yyidx ]->stateno;
522
        if (isset($res[ $state ][ $token ])) {
523
            if ($res[ $state ][ $token ]) {
524
                return true;
525
            }
526
        } else {
527
            if ($res[ $state ][ $token ] = in_array($token, self::$yyExpectedTokens[ $state ], true)) {
528
                return true;
529
            }
530
        }
531
        $stack = $this->yystack;
532
        $yyidx = $this->yyidx;
533
        do {
534
            $yyact = $this->yy_find_shift_action($token);
535
            if ($yyact >= self::YYNSTATE && $yyact < self::YYNSTATE + self::YYNRULE) {
536
                // reduce action
537
                $done = 0;
538
                do {
539
                    if ($done++ === 100) {
540
                        $this->yyidx = $yyidx;
541
                        $this->yystack = $stack;
542
                        // too much recursion prevents proper detection
543
                        // so give up
544
                        return true;
545
                    }
546
                    $yyruleno = $yyact - self::YYNSTATE;
547
                    $this->yyidx -= self::$yyRuleInfo[ $yyruleno ][ 1 ];
548
                    $nextstate = $this->yy_find_reduce_action(
549
                        $this->yystack[ $this->yyidx ]->stateno,
550
                        self::$yyRuleInfo[ $yyruleno ][ 0 ]
551
                    );
552
                    if (isset($res2[ $nextstate ][ $token ])) {
553
                        if ($res2[ $nextstate ][ $token ]) {
554
                            $this->yyidx = $yyidx;
555
                            $this->yystack = $stack;
556
                            return true;
557
                        }
558
                    } else {
559
                        if ($res2[ $nextstate ][ $token ] =
560
                            (isset(self::$yyExpectedTokens[ $nextstate ]) &&
561
                             in_array($token, self::$yyExpectedTokens[ $nextstate ], true))) {
562
                            $this->yyidx = $yyidx;
563
                            $this->yystack = $stack;
564
                            return true;
565
                        }
566
                    }
567
                    if ($nextstate < self::YYNSTATE) {
568
                        // we need to shift a non-terminal
569
                        $this->yyidx++;
570
                        $x = new TPC_yyStackEntry;
571
                        $x->stateno = $nextstate;
572
                        $x->major = self::$yyRuleInfo[ $yyruleno ][ 0 ];
573
                        $this->yystack[ $this->yyidx ] = $x;
574
                        continue 2;
575
                    } elseif ($nextstate === self::YYNSTATE + self::YYNRULE + 1) {
576
                        $this->yyidx = $yyidx;
577
                        $this->yystack = $stack;
578
                        if (!$token) {
579
                            // end of input: this is valid
580
                            return true;
581
                        }
582
                        // the last token was just ignored, we can't accept
583
                        // by ignoring input, this is in essence ignoring a
584
                        // syntax error!
585
                        return false;
586
                    } elseif ($nextstate === self::YY_NO_ACTION) {
587
                        $this->yyidx = $yyidx;
588
                        $this->yystack = $stack;
589
                        // input accepted, but not shifted (I guess)
590
                        return true;
591
                    } else {
592
                        $yyact = $nextstate;
593
                    }
594
                } while (true);
595
            }
596
            break;
597
        } while (true);
598
        $this->yyidx = $yyidx;
599
        $this->yystack = $stack;
600
        return true;
601
    }
602
603
    public function yy_find_shift_action($iLookAhead)
604
    {
605
        $stateno = $this->yystack[ $this->yyidx ]->stateno;
606
        /* if ($this->yyidx < 0) return self::YY_NO_ACTION;  */
607
        if (!isset(self::$yy_shift_ofst[ $stateno ])) {
608
            // no shift actions
609
            return self::$yy_default[ $stateno ];
610
        }
611
        $i = self::$yy_shift_ofst[ $stateno ];
612
        if ($i === self::YY_SHIFT_USE_DFLT) {
613
            return self::$yy_default[ $stateno ];
614
        }
615
        if ($iLookAhead === self::YYNOCODE) {
616
            return self::YY_NO_ACTION;
617
        }
618
        $i += $iLookAhead;
619
        if ($i < 0 || $i >= self::YY_SZ_ACTTAB ||
620
            self::$yy_lookahead[ $i ] != $iLookAhead) {
621
            if (count(self::$yyFallback) && $iLookAhead < count(self::$yyFallback)
622
                && ($iFallback = self::$yyFallback[ $iLookAhead ]) != 0) {
623
                if ($this->yyTraceFILE) {
624
                    fwrite($this->yyTraceFILE, $this->yyTracePrompt . 'FALLBACK ' .
625
                                               $this->yyTokenName[ $iLookAhead ] . ' => ' .
626
                                               $this->yyTokenName[ $iFallback ] . "\n");
627
                }
628
                return $this->yy_find_shift_action($iFallback);
629
            }
630
            return self::$yy_default[ $stateno ];
631
        } else {
632
            return self::$yy_action[ $i ];
633
        }
634
    }
635
636
    public function yy_find_reduce_action($stateno, $iLookAhead)
637
    {
638
        /* $stateno = $this->yystack[$this->yyidx]->stateno; */
639
        if (!isset(self::$yy_reduce_ofst[ $stateno ])) {
640
            return self::$yy_default[ $stateno ];
641
        }
642
        $i = self::$yy_reduce_ofst[ $stateno ];
643
        if ($i === self::YY_REDUCE_USE_DFLT) {
644
            return self::$yy_default[ $stateno ];
645
        }
646
        if ($iLookAhead === self::YYNOCODE) {
647
            return self::YY_NO_ACTION;
648
        }
649
        $i += $iLookAhead;
650
        if ($i < 0 || $i >= self::YY_SZ_ACTTAB ||
651
            self::$yy_lookahead[ $i ] != $iLookAhead) {
652
            return self::$yy_default[ $stateno ];
653
        } else {
654
            return self::$yy_action[ $i ];
655
        }
656
    }
657
658
    public function yy_shift($yyNewState, $yyMajor, $yypMinor)
659
    {
660
        $this->yyidx++;
661
        if ($this->yyidx >= self::YYSTACKDEPTH) {
662
            $this->yyidx--;
663
            if ($this->yyTraceFILE) {
664
                fprintf($this->yyTraceFILE, "%sStack Overflow!\n", $this->yyTracePrompt);
665
            }
666
            while ($this->yyidx >= 0) {
667
                $this->yy_pop_parser_stack();
668
            }
669
            // line 239 "../smarty/lexer/smarty_internal_configfileparser.y"
670
            $this->internalError = true;
671
            $this->compiler->trigger_config_file_error('Stack overflow in configfile parser');
672
            return;
673
        }
674
        $yytos = new TPC_yyStackEntry;
675
        $yytos->stateno = $yyNewState;
676
        $yytos->major = $yyMajor;
677
        $yytos->minor = $yypMinor;
678
        $this->yystack[] = $yytos;
679
        if ($this->yyTraceFILE && $this->yyidx > 0) {
680
            fprintf(
681
                $this->yyTraceFILE,
682
                "%sShift %d\n",
683
                $this->yyTracePrompt,
684
                $yyNewState
685
            );
686
            fprintf($this->yyTraceFILE, "%sStack:", $this->yyTracePrompt);
687
            for ($i = 1; $i <= $this->yyidx; $i++) {
688
                fprintf(
689
                    $this->yyTraceFILE,
690
                    " %s",
691
                    $this->yyTokenName[ $this->yystack[ $i ]->major ]
692
                );
693
            }
694
            fwrite($this->yyTraceFILE, "\n");
695
        }
696
    }
697
698
    public function yy_r0()
699
    {
700
        $this->_retvalue = null;
701
    }
702
703
    public function yy_r1()
704
    {
705
        $this->add_global_vars($this->yystack[ $this->yyidx + 0 ]->minor);
706
        $this->_retvalue = null;
707
    }
708
709
    public function yy_r4()
710
    {
711
        $this->add_section_vars($this->yystack[ $this->yyidx + -3 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor);
712
        $this->_retvalue = null;
713
    }
714
715
    // line 245 "../smarty/lexer/smarty_internal_configfileparser.y"
716
    public function yy_r5()
717
    {
718
        if ($this->configReadHidden) {
719
            $this->add_section_vars(
720
                $this->yystack[ $this->yyidx + -3 ]->minor,
721
                $this->yystack[ $this->yyidx + 0 ]->minor
722
            );
723
        }
724
        $this->_retvalue = null;
725
    }
726
727
    // line 250 "../smarty/lexer/smarty_internal_configfileparser.y"
728
    public function yy_r6()
729
    {
730
        $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor;
731
    }
732
733
    // line 264 "../smarty/lexer/smarty_internal_configfileparser.y"
734
    public function yy_r7()
735
    {
736
        $this->_retvalue =
737
            array_merge($this->yystack[ $this->yyidx + -1 ]->minor, array($this->yystack[ $this->yyidx + 0 ]->minor));
738
    }
739
740
    // line 269 "../smarty/lexer/smarty_internal_configfileparser.y"
741
    public function yy_r8()
742
    {
743
        $this->_retvalue = array();
744
    }
745
746
    // line 277 "../smarty/lexer/smarty_internal_configfileparser.y"
747
    public function yy_r9()
748
    {
749
        $this->_retvalue =
750
            array(
751
                'key'   => $this->yystack[ $this->yyidx + -2 ]->minor,
752
                'value' => $this->yystack[ $this->yyidx + 0 ]->minor
753
            );
754
    }
755
756
    // line 281 "../smarty/lexer/smarty_internal_configfileparser.y"
757
    public function yy_r10()
758
    {
759
        $this->_retvalue = (float)$this->yystack[ $this->yyidx + 0 ]->minor;
760
    }
761
762
    // line 285 "../smarty/lexer/smarty_internal_configfileparser.y"
763
    public function yy_r11()
764
    {
765
        $this->_retvalue = (int)$this->yystack[ $this->yyidx + 0 ]->minor;
766
    }
767
768
    // line 291 "../smarty/lexer/smarty_internal_configfileparser.y"
769
    public function yy_r12()
770
    {
771
        $this->_retvalue = $this->parse_bool($this->yystack[ $this->yyidx + 0 ]->minor);
772
    }
773
774
    // line 296 "../smarty/lexer/smarty_internal_configfileparser.y"
775
    public function yy_r13()
776
    {
777
        $this->_retvalue = self::parse_single_quoted_string($this->yystack[ $this->yyidx + 0 ]->minor);
778
    }
779
780
    // line 300 "../smarty/lexer/smarty_internal_configfileparser.y"
781
    public function yy_r14()
782
    {
783
        $this->_retvalue = self::parse_double_quoted_string($this->yystack[ $this->yyidx + 0 ]->minor);
784
    }
785
786
    // line 304 "../smarty/lexer/smarty_internal_configfileparser.y"
787
    public function yy_r15()
788
    {
789
        $this->_retvalue = self::parse_tripple_double_quoted_string($this->yystack[ $this->yyidx + -1 ]->minor);
790
    }
791
792
    // line 308 "../smarty/lexer/smarty_internal_configfileparser.y"
793
    public function yy_r16()
794
    {
795
        $this->_retvalue = '';
796
    }
797
798
    // line 312 "../smarty/lexer/smarty_internal_configfileparser.y"
799
    public function yy_r17()
800
    {
801
        $this->_retvalue = $this->yystack[ $this->yyidx + 0 ]->minor;
802
    }
803
804
    // line 316 "../smarty/lexer/smarty_internal_configfileparser.y"
805
    public function yy_reduce($yyruleno)
806
    {
807
        if ($this->yyTraceFILE && $yyruleno >= 0
808
            && $yyruleno < count(self::$yyRuleName)) {
809
            fprintf(
810
                $this->yyTraceFILE,
811
                "%sReduce (%d) [%s].\n",
812
                $this->yyTracePrompt,
813
                $yyruleno,
814
                self::$yyRuleName[ $yyruleno ]
815
            );
816
        }
817
        $this->_retvalue = $yy_lefthand_side = null;
818
        if (isset(self::$yyReduceMap[ $yyruleno ])) {
819
            // call the action
820
            $this->_retvalue = null;
821
            $this->{'yy_r' . self::$yyReduceMap[ $yyruleno ]}();
822
            $yy_lefthand_side = $this->_retvalue;
823
        }
824
        $yygoto = self::$yyRuleInfo[ $yyruleno ][ 0 ];
825
        $yysize = self::$yyRuleInfo[ $yyruleno ][ 1 ];
826
        $this->yyidx -= $yysize;
827
        for ($i = $yysize; $i; $i--) {
828
            // pop all of the right-hand side parameters
829
            array_pop($this->yystack);
830
        }
831
        $yyact = $this->yy_find_reduce_action($this->yystack[ $this->yyidx ]->stateno, $yygoto);
832
        if ($yyact < self::YYNSTATE) {
833
            if (!$this->yyTraceFILE && $yysize) {
834
                $this->yyidx++;
835
                $x = new TPC_yyStackEntry;
836
                $x->stateno = $yyact;
837
                $x->major = $yygoto;
838
                $x->minor = $yy_lefthand_side;
839
                $this->yystack[ $this->yyidx ] = $x;
840
            } else {
841
                $this->yy_shift($yyact, $yygoto, $yy_lefthand_side);
842
            }
843
        } elseif ($yyact === self::YYNSTATE + self::YYNRULE + 1) {
844
            $this->yy_accept();
845
        }
846
    }
847
848
    // line 320 "../smarty/lexer/smarty_internal_configfileparser.y"
849
    public function yy_parse_failed()
850
    {
851
        if ($this->yyTraceFILE) {
852
            fprintf($this->yyTraceFILE, "%sFail!\n", $this->yyTracePrompt);
853
        }
854
        while ($this->yyidx >= 0) {
855
            $this->yy_pop_parser_stack();
856
        }
857
    }
858
859
    // line 324 "../smarty/lexer/smarty_internal_configfileparser.y"
860
    public function yy_syntax_error($yymajor, $TOKEN)
861
    {
862
        // line 232 "../smarty/lexer/smarty_internal_configfileparser.y"
863
        $this->internalError = true;
864
        $this->yymajor = $yymajor;
865
        $this->compiler->trigger_config_file_error();
866
    }
867
868
    public function yy_accept()
869
    {
870
        if ($this->yyTraceFILE) {
871
            fprintf($this->yyTraceFILE, "%sAccept!\n", $this->yyTracePrompt);
872
        }
873
        while ($this->yyidx >= 0) {
874
            $this->yy_pop_parser_stack();
875
        }
876
        // line 225 "../smarty/lexer/smarty_internal_configfileparser.y"
877
        $this->successful = !$this->internalError;
878
        $this->internalError = false;
879
        $this->retvalue = $this->_retvalue;
880
    }
881
882
    public function doParse($yymajor, $yytokenvalue)
883
    {
884
        $yyerrorhit = 0;   /* True if yymajor has invoked an error */
885
        if ($this->yyidx === null || $this->yyidx < 0) {
886
            $this->yyidx = 0;
887
            $this->yyerrcnt = -1;
888
            $x = new TPC_yyStackEntry;
889
            $x->stateno = 0;
890
            $x->major = 0;
891
            $this->yystack = array();
892
            $this->yystack[] = $x;
893
        }
894
        $yyendofinput = ($yymajor == 0);
895
        if ($this->yyTraceFILE) {
896
            fprintf(
897
                $this->yyTraceFILE,
898
                "%sInput %s\n",
899
                $this->yyTracePrompt,
900
                $this->yyTokenName[ $yymajor ]
901
            );
902
        }
903
        do {
904
            $yyact = $this->yy_find_shift_action($yymajor);
905
            if ($yymajor < self::YYERRORSYMBOL &&
906
                !$this->yy_is_expected_token($yymajor)) {
907
                // force a syntax error
908
                $yyact = self::YY_ERROR_ACTION;
909
            }
910
            if ($yyact < self::YYNSTATE) {
911
                $this->yy_shift($yyact, $yymajor, $yytokenvalue);
912
                $this->yyerrcnt--;
913
                if ($yyendofinput && $this->yyidx >= 0) {
914
                    $yymajor = 0;
915
                } else {
916
                    $yymajor = self::YYNOCODE;
917
                }
918
            } elseif ($yyact < self::YYNSTATE + self::YYNRULE) {
919
                $this->yy_reduce($yyact - self::YYNSTATE);
920
            } elseif ($yyact === self::YY_ERROR_ACTION) {
921
                if ($this->yyTraceFILE) {
922
                    fprintf(
923
                        $this->yyTraceFILE,
924
                        "%sSyntax Error!\n",
925
                        $this->yyTracePrompt
926
                    );
927
                }
928
                if (self::YYERRORSYMBOL) {
929
                    if ($this->yyerrcnt < 0) {
930
                        $this->yy_syntax_error($yymajor, $yytokenvalue);
931
                    }
932
                    $yymx = $this->yystack[ $this->yyidx ]->major;
933
                    if ($yymx === self::YYERRORSYMBOL || $yyerrorhit) {
934
                        if ($this->yyTraceFILE) {
935
                            fprintf(
936
                                $this->yyTraceFILE,
937
                                "%sDiscard input token %s\n",
938
                                $this->yyTracePrompt,
939
                                $this->yyTokenName[ $yymajor ]
940
                            );
941
                        }
942
                        $this->yy_destructor($yymajor, $yytokenvalue);
943
                        $yymajor = self::YYNOCODE;
944
                    } else {
945
                        while ($this->yyidx >= 0 &&
946
                               $yymx !== self::YYERRORSYMBOL &&
947
                               ($yyact = $this->yy_find_shift_action(self::YYERRORSYMBOL)) >= self::YYNSTATE
948
                        ) {
949
                            $this->yy_pop_parser_stack();
950
                        }
951
                        if ($this->yyidx < 0 || $yymajor == 0) {
952
                            $this->yy_destructor($yymajor, $yytokenvalue);
953
                            $this->yy_parse_failed();
954
                            $yymajor = self::YYNOCODE;
955
                        } elseif ($yymx !== self::YYERRORSYMBOL) {
956
                            $u2 = 0;
957
                            $this->yy_shift($yyact, self::YYERRORSYMBOL, $u2);
958
                        }
959
                    }
960
                    $this->yyerrcnt = 3;
961
                    $yyerrorhit = 1;
962
                } else {
963
                    if ($this->yyerrcnt <= 0) {
964
                        $this->yy_syntax_error($yymajor, $yytokenvalue);
965
                    }
966
                    $this->yyerrcnt = 3;
967
                    $this->yy_destructor($yymajor, $yytokenvalue);
968
                    if ($yyendofinput) {
969
                        $this->yy_parse_failed();
970
                    }
971
                    $yymajor = self::YYNOCODE;
972
                }
973
            } else {
974
                $this->yy_accept();
975
                $yymajor = self::YYNOCODE;
976
            }
977
        } while ($yymajor !== self::YYNOCODE && $this->yyidx >= 0);
978
    }
979
980
    /**
981
     * parse optional boolean keywords
982
     *
983
     * @param string $str
984
     *
985
     * @return bool
986
     */
987
    private function parse_bool($str)
988
    {
989
        $str = strtolower($str);
990
        if (in_array($str, array('on', 'yes', 'true'))) {
991
            $res = true;
992
        } else {
993
            $res = false;
994
        }
995
        return $res;
996
    }
997
998
    /**
999
     * set a config variable in target array
1000
     *
1001
     * @param array $var
1002
     * @param array $target_array
1003
     */
1004
    private function set_var(array $var, array &$target_array)
1005
    {
1006
        $key = $var[ 'key' ];
1007
        $value = $var[ 'value' ];
1008
        if ($this->configOverwrite || !isset($target_array[ 'vars' ][ $key ])) {
1009
            $target_array[ 'vars' ][ $key ] = $value;
1010
        } else {
1011
            settype($target_array[ 'vars' ][ $key ], 'array');
1012
            $target_array[ 'vars' ][ $key ][] = $value;
1013
        }
1014
    }
1015
1016
    /**
1017
     * add config variable to global vars
1018
     *
1019
     * @param array $vars
1020
     */
1021
    private function add_global_vars(array $vars)
1022
    {
1023
        if (!isset($this->compiler->config_data[ 'vars' ])) {
1024
            $this->compiler->config_data[ 'vars' ] = array();
1025
        }
1026
        foreach ($vars as $var) {
1027
            $this->set_var($var, $this->compiler->config_data);
1028
        }
1029
    }
1030
1031
    /**
1032
     * add config variable to section
1033
     *
1034
     * @param string $section_name
1035
     * @param array  $vars
1036
     */
1037
    private function add_section_vars($section_name, array $vars)
1038
    {
1039
        if (!isset($this->compiler->config_data[ 'sections' ][ $section_name ][ 'vars' ])) {
1040
            $this->compiler->config_data[ 'sections' ][ $section_name ][ 'vars' ] = array();
1041
        }
1042
        foreach ($vars as $var) {
1043
            $this->set_var($var, $this->compiler->config_data[ 'sections' ][ $section_name ]);
1044
        }
1045
    }
1046
}
1047