YugabyteDB (2.13.1.0-b60, 21121d69985fbf76aa6958d8f04a9bfa936293b5)

Coverage Report

Created: 2022-03-22 16:43

/Users/deen/code/yugabyte-db/build/debugcov-clang-dynamic-arm64-ninja/postgres_build/src/backend/utils/misc/guc-file.c
Line
Count
Source (jump to first uncovered line)
1
#line 1 "guc-file.c"
2
3
#line 3 "guc-file.c"
4
5
#define  YY_INT_ALIGNED short int
6
7
/* A lexical scanner generated by flex */
8
9
#define yy_create_buffer GUC_yy_create_buffer
10
#define yy_delete_buffer GUC_yy_delete_buffer
11
#define yy_flex_debug GUC_yy_flex_debug
12
#define yy_init_buffer GUC_yy_init_buffer
13
#define yy_flush_buffer GUC_yy_flush_buffer
14
#define yy_load_buffer_state GUC_yy_load_buffer_state
15
#define yy_switch_to_buffer GUC_yy_switch_to_buffer
16
#define yyin GUC_yyin
17
#define yyleng GUC_yyleng
18
#define yylex GUC_yylex
19
#define yylineno GUC_yylineno
20
#define yyout GUC_yyout
21
#define yyrestart GUC_yyrestart
22
#define yytext GUC_yytext
23
#define yywrap GUC_yywrap
24
#define yyalloc GUC_yyalloc
25
#define yyrealloc GUC_yyrealloc
26
#define yyfree GUC_yyfree
27
28
#define FLEX_SCANNER
29
#define YY_FLEX_MAJOR_VERSION 2
30
#define YY_FLEX_MINOR_VERSION 6
31
#define YY_FLEX_SUBMINOR_VERSION 3
32
#if YY_FLEX_SUBMINOR_VERSION > 0
33
#define FLEX_BETA
34
#endif
35
36
20.1k
    #define yy_create_buffer GUC_yy_create_buffer
37
38
20.1k
    #define yy_delete_buffer GUC_yy_delete_buffer
39
40
    #define yy_scan_buffer GUC_yy_scan_buffer
41
42
    #define yy_scan_string GUC_yy_scan_string
43
44
    #define yy_scan_bytes GUC_yy_scan_bytes
45
46
    #define yy_init_buffer GUC_yy_init_buffer
47
48
    #define yy_flush_buffer GUC_yy_flush_buffer
49
50
    #define yy_load_buffer_state GUC_yy_load_buffer_state
51
52
20.1k
    #define yy_switch_to_buffer GUC_yy_switch_to_buffer
53
54
    #define yypush_buffer_state GUC_yypush_buffer_state
55
56
    #define yypop_buffer_state GUC_yypop_buffer_state
57
58
    #define yyensure_buffer_stack GUC_yyensure_buffer_stack
59
60
6.02M
    #define yylex GUC_yylex
61
62
    #define yyrestart GUC_yyrestart
63
64
    #define yylex_init GUC_yylex_init
65
66
    #define yylex_init_extra GUC_yylex_init_extra
67
68
    #define yylex_destroy GUC_yylex_destroy
69
70
    #define yyget_debug GUC_yyget_debug
71
72
    #define yyset_debug GUC_yyset_debug
73
74
    #define yyget_extra GUC_yyget_extra
75
76
    #define yyset_extra GUC_yyset_extra
77
78
    #define yyget_in GUC_yyget_in
79
80
    #define yyset_in GUC_yyset_in
81
82
    #define yyget_out GUC_yyget_out
83
84
    #define yyset_out GUC_yyset_out
85
86
    #define yyget_leng GUC_yyget_leng
87
88
    #define yyget_text GUC_yyget_text
89
90
    #define yyget_lineno GUC_yyget_lineno
91
92
    #define yyset_lineno GUC_yyset_lineno
93
94
    #define yywrap GUC_yywrap
95
96
    #define yyalloc GUC_yyalloc
97
98
    #define yyrealloc GUC_yyrealloc
99
100
    #define yyfree GUC_yyfree
101
102
217k
    #define yytext GUC_yytext
103
104
    #define yyleng GUC_yyleng
105
106
    #define yyin GUC_yyin
107
108
    #define yyout GUC_yyout
109
110
    #define yy_flex_debug GUC_yy_flex_debug
111
112
    #define yylineno GUC_yylineno
113
114
/* First, we deal with  platform-specific or compiler-specific issues. */
115
116
/* begin standard C headers. */
117
#include <stdio.h>
118
#include <string.h>
119
#include <errno.h>
120
#include <stdlib.h>
121
122
/* end standard C headers. */
123
124
/* flex integer type definitions */
125
126
#ifndef FLEXINT_H
127
#define FLEXINT_H
128
129
/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
130
131
#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
132
133
/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
134
 * if you want the limit (max/min) macros for int types. 
135
 */
136
#ifndef __STDC_LIMIT_MACROS
137
#define __STDC_LIMIT_MACROS 1
138
#endif
139
140
#include <inttypes.h>
141
typedef int8_t flex_int8_t;
142
typedef uint8_t flex_uint8_t;
143
typedef int16_t flex_int16_t;
144
typedef uint16_t flex_uint16_t;
145
typedef int32_t flex_int32_t;
146
typedef uint32_t flex_uint32_t;
147
#else
148
typedef signed char flex_int8_t;
149
typedef short int flex_int16_t;
150
typedef int flex_int32_t;
151
typedef unsigned char flex_uint8_t; 
152
typedef unsigned short int flex_uint16_t;
153
typedef unsigned int flex_uint32_t;
154
155
/* Limits of integral types. */
156
#ifndef INT8_MIN
157
#define INT8_MIN               (-128)
158
#endif
159
#ifndef INT16_MIN
160
#define INT16_MIN              (-32767-1)
161
#endif
162
#ifndef INT32_MIN
163
#define INT32_MIN              (-2147483647-1)
164
#endif
165
#ifndef INT8_MAX
166
#define INT8_MAX               (127)
167
#endif
168
#ifndef INT16_MAX
169
#define INT16_MAX              (32767)
170
#endif
171
#ifndef INT32_MAX
172
#define INT32_MAX              (2147483647)
173
#endif
174
#ifndef UINT8_MAX
175
#define UINT8_MAX              (255U)
176
#endif
177
#ifndef UINT16_MAX
178
#define UINT16_MAX             (65535U)
179
#endif
180
#ifndef UINT32_MAX
181
#define UINT32_MAX             (4294967295U)
182
#endif
183
184
#endif /* ! C99 */
185
186
#endif /* ! FLEXINT_H */
187
188
/* TODO: this is always defined, so inline it */
189
#define yyconst const
190
191
#if defined(__GNUC__) && __GNUC__ >= 3
192
#define yynoreturn __attribute__((__noreturn__))
193
#else
194
#define yynoreturn
195
#endif
196
197
/* Returned upon end-of-file. */
198
20.1k
#define YY_NULL 0
199
200
/* Promotes a possibly negative, possibly signed char to an
201
 *   integer in range [0..255] for use as an array index.
202
 */
203
209M
#define YY_SC_TO_UI(c) ((YY_CHAR) (c))
204
205
/* Enter a start condition.  This macro really ought to take a parameter,
206
 * but we do it the disgusting crufty way forced on us by the ()-less
207
 * definition of BEGIN.
208
 */
209
#define BEGIN (yy_start) = 1 + 2 *
210
/* Translate the current start state into a value that can be later handed
211
 * to BEGIN to return to the state.  The YYSTATE alias is for lex
212
 * compatibility.
213
 */
214
#define YY_START (((yy_start) - 1) / 2)
215
#define YYSTATE YY_START
216
/* Action number for EOF rule of a given start state. */
217
40.2k
#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
218
/* Special action meaning "start processing a new file". */
219
0
#define YY_NEW_FILE GUC_yyrestart(GUC_yyin  )
220
201k
#define YY_END_OF_BUFFER_CHAR 0
221
222
/* Size of default input buffer. */
223
#ifndef YY_BUF_SIZE
224
#ifdef __ia64__
225
/* On IA-64, the buffer size is 16k, not 8k.
226
 * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
227
 * Ditto for the __ia64__ case accordingly.
228
 */
229
#define YY_BUF_SIZE 32768
230
#else
231
20.1k
#define YY_BUF_SIZE 16384
232
#endif /* __ia64__ */
233
#endif
234
235
/* The state buf must be large enough to hold one state per character in the main buffer.
236
 */
237
#define YY_STATE_BUF_SIZE   ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
238
239
#ifndef YY_TYPEDEF_YY_BUFFER_STATE
240
#define YY_TYPEDEF_YY_BUFFER_STATE
241
typedef struct yy_buffer_state *YY_BUFFER_STATE;
242
#endif
243
244
#ifndef YY_TYPEDEF_YY_SIZE_T
245
#define YY_TYPEDEF_YY_SIZE_T
246
typedef size_t yy_size_t;
247
#endif
248
249
extern int GUC_yyleng;
250
251
extern FILE *GUC_yyin, *GUC_yyout;
252
253
56.7k
#define EOB_ACT_CONTINUE_SCAN 0
254
40.2k
#define EOB_ACT_END_OF_FILE 1
255
24.2k
#define EOB_ACT_LAST_MATCH 2
256
    
257
    #define YY_LESS_LINENO(n)
258
    #define YY_LINENO_REWIND_TO(ptr)
259
    
260
/* Return all but the first "n" matched characters back to the input stream. */
261
#define yyless(n) \
262
  do \
263
    { \
264
    /* Undo effects of setting up GUC_yytext. */ \
265
        int yyless_macro_arg = (n); \
266
        YY_LESS_LINENO(yyless_macro_arg);\
267
    *yy_cp = (yy_hold_char); \
268
    YY_RESTORE_YY_MORE_OFFSET \
269
    (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
270
    YY_DO_BEFORE_ACTION; /* set up GUC_yytext again */ \
271
    } \
272
  while ( 0 )
273
#define unput(c) yyunput( c, (yytext_ptr)  )
274
275
#ifndef YY_STRUCT_YY_BUFFER_STATE
276
#define YY_STRUCT_YY_BUFFER_STATE
277
struct yy_buffer_state
278
  {
279
  FILE *yy_input_file;
280
281
  char *yy_ch_buf;    /* input buffer */
282
  char *yy_buf_pos;   /* current position in input buffer */
283
284
  /* Size of input buffer in bytes, not including room for EOB
285
   * characters.
286
   */
287
  int yy_buf_size;
288
289
  /* Number of characters read into yy_ch_buf, not including EOB
290
   * characters.
291
   */
292
  int yy_n_chars;
293
294
  /* Whether we "own" the buffer - i.e., we know we created it,
295
   * and can realloc() it to grow it, and should free() it to
296
   * delete it.
297
   */
298
  int yy_is_our_buffer;
299
300
  /* Whether this is an "interactive" input source; if so, and
301
   * if we're using stdio for input, then we want to use getc()
302
   * instead of fread(), to make sure we stop fetching input after
303
   * each newline.
304
   */
305
  int yy_is_interactive;
306
307
  /* Whether we're considered to be at the beginning of a line.
308
   * If so, '^' rules will be active on the next match, otherwise
309
   * not.
310
   */
311
  int yy_at_bol;
312
313
    int yy_bs_lineno; /**< The line count. */
314
    int yy_bs_column; /**< The column count. */
315
316
  /* Whether to try to fill the input buffer when we reach the
317
   * end of it.
318
   */
319
  int yy_fill_buffer;
320
321
  int yy_buffer_status;
322
323
100k
#define YY_BUFFER_NEW 0
324
20.1k
#define YY_BUFFER_NORMAL 1
325
  /* When an EOF's been seen but there's still some text to process
326
   * then we mark the buffer as YY_EOF_PENDING, to indicate that we
327
   * shouldn't try reading from the input source any more.  We might
328
   * still have a bunch of tokens to match, though, because of
329
   * possible backing-up.
330
   *
331
   * When we actually see the EOF, we change the status to "new"
332
   * (via GUC_yyrestart()), so that the user can continue scanning by
333
   * just pointing GUC_yyin at a new input file.
334
   */
335
72.7k
#define YY_BUFFER_EOF_PENDING 2
336
337
  };
338
#endif /* !YY_STRUCT_YY_BUFFER_STATE */
339
340
/* Stack of input buffers. */
341
static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
342
static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
343
static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */
344
345
/* We provide macros for accessing buffer states in case in the
346
 * future we want to put the buffer states in a more general
347
 * "scanner state".
348
 *
349
 * Returns the top of the stack, or NULL.
350
 */
351
189k
#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
352
189k
                          ? 
(yy_buffer_stack)[(yy_buffer_stack_top)]173k
\
353
189k
                          : NULL)
354
/* Same as previous macro, but useful when we know that the buffer stack is not
355
 * NULL or when we need an lvalue. For internal use only.
356
 */
357
1.09M
#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
358
359
/* yy_hold_char holds the character lost when GUC_yytext is formed. */
360
static char yy_hold_char;
361
static int yy_n_chars;    /* number of characters read into yy_ch_buf */
362
int GUC_yyleng;
363
364
/* Points to current character in buffer. */
365
static char *yy_c_buf_p = NULL;
366
static int yy_init = 0;   /* whether we need to initialize */
367
static int yy_start = 0;  /* start state number */
368
369
/* Flag which is used to allow GUC_yywrap()'s to do buffer switches
370
 * instead of setting up a fresh GUC_yyin.  A bit of a hack ...
371
 */
372
static int yy_did_buffer_switch_on_eof;
373
374
void GUC_yyrestart ( FILE *input_file  );
375
void GUC_yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer  );
376
YY_BUFFER_STATE GUC_yy_create_buffer ( FILE *file, int size  );
377
void GUC_yy_delete_buffer ( YY_BUFFER_STATE b  );
378
void GUC_yy_flush_buffer ( YY_BUFFER_STATE b  );
379
void GUC_yypush_buffer_state ( YY_BUFFER_STATE new_buffer  );
380
void GUC_yypop_buffer_state ( void );
381
382
static void GUC_yyensure_buffer_stack ( void );
383
static void GUC_yy_load_buffer_state ( void );
384
static void GUC_yy_init_buffer ( YY_BUFFER_STATE b, FILE *file  );
385
#define YY_FLUSH_BUFFER GUC_yy_flush_buffer(YY_CURRENT_BUFFER )
386
387
YY_BUFFER_STATE GUC_yy_scan_buffer ( char *base, yy_size_t size  );
388
YY_BUFFER_STATE GUC_yy_scan_string ( const char *yy_str  );
389
YY_BUFFER_STATE GUC_yy_scan_bytes ( const char *bytes, int len  );
390
391
void *GUC_yyalloc ( yy_size_t  );
392
void *GUC_yyrealloc ( void *, yy_size_t  );
393
void GUC_yyfree ( void *  );
394
395
#define yy_new_buffer GUC_yy_create_buffer
396
#define yy_set_interactive(is_interactive) \
397
  { \
398
  if ( ! YY_CURRENT_BUFFER ){ \
399
        GUC_yyensure_buffer_stack (); \
400
    YY_CURRENT_BUFFER_LVALUE =    \
401
            GUC_yy_create_buffer(GUC_yyin,YY_BUF_SIZE ); \
402
  } \
403
  YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
404
  }
405
#define yy_set_bol(at_bol) \
406
  { \
407
  if ( ! YY_CURRENT_BUFFER ){\
408
        GUC_yyensure_buffer_stack (); \
409
    YY_CURRENT_BUFFER_LVALUE =    \
410
            GUC_yy_create_buffer(GUC_yyin,YY_BUF_SIZE ); \
411
  } \
412
  YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
413
  }
414
#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
415
416
/* Begin user sect3 */
417
418
20.1k
#define GUC_yywrap() (/*CONSTCOND*/1)
419
#define YY_SKIP_YYWRAP
420
typedef flex_uint8_t YY_CHAR;
421
422
FILE *GUC_yyin = NULL, *GUC_yyout = NULL;
423
424
typedef int yy_state_type;
425
426
extern int GUC_yylineno;
427
int GUC_yylineno = 1;
428
429
extern char *GUC_yytext;
430
#ifdef yytext_ptr
431
#undef yytext_ptr
432
#endif
433
12.9M
#define yytext_ptr GUC_yytext
434
435
static yy_state_type yy_get_previous_state ( void );
436
static yy_state_type yy_try_NUL_trans ( yy_state_type current_state  );
437
static int yy_get_next_buffer ( void );
438
static void yynoreturn yy_fatal_error ( const char* msg  );
439
440
/* Done after the current pattern has been matched and before the
441
 * corresponding action - sets up GUC_yytext.
442
 */
443
#define YY_DO_BEFORE_ACTION \
444
12.4M
  (yytext_ptr) = yy_bp; \
445
12.4M
  GUC_yyleng = (int) (yy_cp - yy_bp); \
446
12.4M
  (yy_hold_char) = *yy_cp; \
447
12.4M
  *yy_cp = '\0'; \
448
12.4M
  (yy_c_buf_p) = yy_cp;
449
#define YY_NUM_RULES 12
450
100k
#define YY_END_OF_BUFFER 13
451
/* This struct is not used in this scanner,
452
   but its presence is necessary. */
453
struct yy_trans_info
454
  {
455
  flex_int32_t yy_verify;
456
  flex_int32_t yy_nxt;
457
  };
458
static const flex_int16_t yy_accept[41] =
459
    {   0,
460
        0,    0,   13,   11,    2,    1,    3,   11,   11,    9,
461
        8,    8,   10,    4,    2,    3,    0,    6,    0,    9,
462
        8,    8,    9,    0,    8,    8,    7,    7,    4,    4,
463
        0,    9,    8,    8,    7,    5,    5,    5,    5,    0
464
    } ;
465
466
static const YY_CHAR yy_ec[256] =
467
    {   0,
468
        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
469
        1,    1,    2,    1,    1,    1,    1,    1,    1,    1,
470
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
471
        1,    2,    1,    1,    4,    1,    1,    1,    5,    1,
472
        1,    1,    6,    1,    7,    8,    9,   10,   11,   11,
473
       11,   11,   11,   11,   11,   11,   11,    9,    1,    1,
474
       12,    1,    1,    1,   13,   13,   13,   13,   14,   13,
475
       15,   15,   15,   15,   15,   15,   15,   15,   15,   15,
476
       15,   15,   15,   15,   15,   15,   15,   15,   15,   15,
477
        1,   16,    1,    1,   17,    1,   13,   13,   13,   13,
478
479
       14,   13,   15,   15,   15,   15,   15,   15,   15,   15,
480
       15,   15,   15,   15,   15,   15,   15,   15,   15,   18,
481
       15,   15,    1,    1,    1,    1,    1,   19,   19,   19,
482
       19,   19,   19,   19,   19,   19,   19,   19,   19,   19,
483
       19,   19,   19,   19,   19,   19,   19,   19,   19,   19,
484
       19,   19,   19,   19,   19,   19,   19,   19,   19,   19,
485
       19,   19,   19,   19,   19,   19,   19,   19,   19,   19,
486
       19,   19,   19,   19,   19,   19,   19,   19,   19,   19,
487
       19,   19,   19,   19,   19,   19,   19,   19,   19,   19,
488
       19,   19,   19,   19,   19,   19,   19,   19,   19,   19,
489
490
       19,   19,   19,   19,   19,   19,   19,   19,   19,   19,
491
       19,   19,   19,   19,   19,   19,   19,   19,   19,   19,
492
       19,   19,   19,   19,   19,   19,   19,   19,   19,   19,
493
       19,   19,   19,   19,   19,   19,   19,   19,   19,   19,
494
       19,   19,   19,   19,   19,   19,   19,   19,   19,   19,
495
       19,   19,   19,   19,   19
496
    } ;
497
498
static const YY_CHAR yy_meta[20] =
499
    {   0,
500
        1,    1,    2,    1,    1,    1,    3,    3,    3,    4,
501
        4,    1,    5,    6,    5,    1,    3,    5,    3
502
    } ;
503
504
static const flex_int16_t yy_base[48] =
505
    {   0,
506
        0,    0,   50,  148,   43,  148,    0,   15,   24,   30,
507
       28,   22,  148,   40,   35,    0,   17,   25,    0,   15,
508
        0,   10,    0,   52,    0,   54,   10,   66,   79,    0,
509
       13,   15,    0,    0,    4,   90,  101,    0,    0,  148,
510
      118,  124,  127,  131,  133,  137,  141
511
    } ;
512
513
static const flex_int16_t yy_def[48] =
514
    {   0,
515
       40,    1,   40,   40,   40,   40,   41,   42,   40,   43,
516
       40,   11,   40,   44,   40,   41,   42,   40,   42,   43,
517
       11,   11,   20,   40,   45,   40,   46,   40,   44,   29,
518
       40,   40,   26,   26,   46,   47,   47,   37,   37,    0,
519
       40,   40,   40,   40,   40,   40,   40
520
    } ;
521
522
static const flex_int16_t yy_nxt[168] =
523
    {   0,
524
        4,    5,    6,    7,    8,    9,    9,   10,    4,   11,
525
       12,   13,   14,   14,   14,    4,   14,   14,   14,   18,
526
       35,   18,   32,   32,   32,   32,   35,   25,   24,   17,
527
       19,   20,   19,   21,   22,   20,   15,   22,   22,   25,
528
       25,   25,   25,   24,   15,   26,   27,   28,   27,   40,
529
       40,   40,   40,   40,   40,   40,   30,   31,   31,   40,
530
       40,   32,   32,   33,   33,   40,   34,   34,   25,   40,
531
       40,   25,   27,   27,   27,   27,   27,   40,   36,   36,
532
       36,   40,   37,   36,   36,   27,   28,   27,   40,   40,
533
       40,   40,   40,   40,   40,   30,   27,   27,   27,   40,
534
535
       40,   40,   40,   40,   40,   40,   39,   27,   27,   27,
536
       40,   40,   40,   40,   40,   40,   40,   39,   16,   40,
537
       16,   16,   16,   16,   17,   40,   17,   17,   17,   17,
538
       23,   40,   23,   29,   29,   29,   29,   25,   25,   27,
539
       27,   27,   27,   38,   38,   38,   38,    3,   40,   40,
540
       40,   40,   40,   40,   40,   40,   40,   40,   40,   40,
541
       40,   40,   40,   40,   40,   40,   40
542
    } ;
543
544
static const flex_int16_t yy_chk[168] =
545
    {   0,
546
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
547
        1,    1,    1,    1,    1,    1,    1,    1,    1,    8,
548
       35,   17,   31,   31,   32,   32,   27,   22,   20,   18,
549
        8,    9,   17,    9,    9,   11,   15,   11,   11,   12,
550
       11,   11,   11,   10,    5,   11,   14,   14,   14,    3,
551
        0,    0,    0,    0,    0,    0,   14,   24,   24,    0,
552
        0,   24,   24,   26,   26,    0,   26,   26,   26,    0,
553
        0,   26,   28,   28,   28,   28,   28,    0,   28,   28,
554
       28,    0,   28,   28,   28,   29,   29,   29,    0,    0,
555
        0,    0,    0,    0,    0,   29,   36,   36,   36,    0,
556
557
        0,    0,    0,    0,    0,    0,   36,   37,   37,   37,
558
        0,    0,    0,    0,    0,    0,    0,   37,   41,    0,
559
       41,   41,   41,   41,   42,    0,   42,   42,   42,   42,
560
       43,    0,   43,   44,   44,   44,   44,   45,   45,   46,
561
       46,   46,   46,   47,   47,   47,   47,   40,   40,   40,
562
       40,   40,   40,   40,   40,   40,   40,   40,   40,   40,
563
       40,   40,   40,   40,   40,   40,   40
564
    } ;
565
566
static yy_state_type yy_last_accepting_state;
567
static char *yy_last_accepting_cpos;
568
569
extern int GUC_yy_flex_debug;
570
int GUC_yy_flex_debug = 0;
571
572
/* The intent behind this definition is that it'll catch
573
 * any uses of REJECT which flex missed.
574
 */
575
#define REJECT reject_used_but_not_detected
576
#define yymore() yymore_used_but_not_detected
577
133k
#define YY_MORE_ADJ 0
578
#define YY_RESTORE_YY_MORE_OFFSET
579
char *GUC_yytext;
580
#line 1 "guc-file.l"
581
/* -*-pgsql-c-*- */
582
/*
583
 * Scanner for the configuration file
584
 *
585
 * Copyright (c) 2000-2018, PostgreSQL Global Development Group
586
 *
587
 * src/backend/utils/misc/guc-file.l
588
 */
589
#line 11 "guc-file.l"
590
591
#include "postgres.h"
592
593
#include <ctype.h>
594
#include <unistd.h>
595
596
#include "mb/pg_wchar.h"
597
#include "miscadmin.h"
598
#include "storage/fd.h"
599
#include "utils/guc.h"
600
601
602
/*
603
 * flex emits a yy_fatal_error() function that it calls in response to
604
 * critical errors like malloc failure, file I/O errors, and detection of
605
 * internal inconsistency.  That function prints a message and calls exit().
606
 * Mutate it to instead call our handler, which jumps out of the parser.
607
 */
608
#undef fprintf
609
0
#define fprintf(file, fmt, msg) GUC_flex_fatal(msg)
610
611
enum
612
{
613
  GUC_ID = 1,
614
  GUC_STRING = 2,
615
  GUC_INTEGER = 3,
616
  GUC_REAL = 4,
617
  GUC_EQUALS = 5,
618
  GUC_UNQUOTED_STRING = 6,
619
  GUC_QUALIFIED_ID = 7,
620
  GUC_EOL = 99,
621
  GUC_ERROR = 100
622
};
623
624
static unsigned int ConfigFileLineno;
625
static const char *GUC_flex_fatal_errmsg;
626
static sigjmp_buf *GUC_flex_fatal_jmp;
627
628
static void FreeConfigVariable(ConfigVariable *item);
629
630
static void record_config_file_error(const char *errmsg,
631
             const char *config_file,
632
             int lineno,
633
             ConfigVariable **head_p,
634
             ConfigVariable **tail_p);
635
636
static int  GUC_flex_fatal(const char *msg);
637
static char *GUC_scanstr(const char *s);
638
639
/* LCOV_EXCL_START */
640
641
#line 641 "guc-file.c"
642
#define YY_NO_INPUT 1
643
#line 643 "guc-file.c"
644
645
#define INITIAL 0
646
647
#ifndef YY_NO_UNISTD_H
648
/* Special case for "unistd.h", since it is non-ANSI. We include it way
649
 * down here because we want the user's section 1 to have been scanned first.
650
 * The user has a chance to override it with an option.
651
 */
652
#include <unistd.h>
653
#endif
654
655
#ifndef YY_EXTRA_TYPE
656
#define YY_EXTRA_TYPE void *
657
#endif
658
659
static int yy_init_globals ( void );
660
661
/* Accessor methods to globals.
662
   These are made visible to non-reentrant scanners for convenience. */
663
664
int GUC_yylex_destroy ( void );
665
666
int GUC_yyget_debug ( void );
667
668
void GUC_yyset_debug ( int debug_flag  );
669
670
YY_EXTRA_TYPE GUC_yyget_extra ( void );
671
672
void GUC_yyset_extra ( YY_EXTRA_TYPE user_defined  );
673
674
FILE *GUC_yyget_in ( void );
675
676
void GUC_yyset_in  ( FILE * _in_str  );
677
678
FILE *GUC_yyget_out ( void );
679
680
void GUC_yyset_out  ( FILE * _out_str  );
681
682
      int GUC_yyget_leng ( void );
683
684
char *GUC_yyget_text ( void );
685
686
int GUC_yyget_lineno ( void );
687
688
void GUC_yyset_lineno ( int _line_number  );
689
690
/* Macros after this point can all be overridden by user definitions in
691
 * section 1.
692
 */
693
694
#ifndef YY_SKIP_YYWRAP
695
#ifdef __cplusplus
696
extern "C" int GUC_yywrap ( void );
697
#else
698
extern int GUC_yywrap ( void );
699
#endif
700
#endif
701
702
#ifndef YY_NO_UNPUT
703
    
704
#endif
705
706
#ifndef yytext_ptr
707
static void yy_flex_strncpy ( char *, const char *, int );
708
#endif
709
710
#ifdef YY_NEED_STRLEN
711
static int yy_flex_strlen ( const char * );
712
#endif
713
714
#ifndef YY_NO_INPUT
715
#ifdef __cplusplus
716
static int yyinput ( void );
717
#else
718
static int input ( void );
719
#endif
720
721
#endif
722
723
/* Amount of stuff to slurp up with each read. */
724
#ifndef YY_READ_BUF_SIZE
725
#ifdef __ia64__
726
/* On IA-64, the buffer size is 16k, not 8k */
727
#define YY_READ_BUF_SIZE 16384
728
#else
729
97.0k
#define YY_READ_BUF_SIZE 8192
730
#endif /* __ia64__ */
731
#endif
732
733
/* Copy whatever the last rule matched to the standard output. */
734
#ifndef ECHO
735
/* This used to be an fputs(), but since the string might contain NUL's,
736
 * we now use fwrite().
737
 */
738
#define ECHO do { if (fwrite( GUC_yytext, (size_t) GUC_yyleng, 1, GUC_yyout )) {} } while (0)
739
#endif
740
741
/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
742
 * is returned in "result".
743
 */
744
#ifndef YY_INPUT
745
#define YY_INPUT(buf,result,max_size) \
746
48.5k
  if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
747
48.5k
    { \
748
0
    int c = '*'; \
749
0
    int n; \
750
0
    for ( n = 0; n < max_size && \
751
0
           (c = getc( GUC_yyin )) != EOF && c != '\n'; ++n ) \
752
0
      buf[n] = (char) c; \
753
0
    if ( c == '\n' ) \
754
0
      buf[n++] = (char) c; \
755
0
    if ( c == EOF && ferror( GUC_yyin ) ) \
756
0
      YY_FATAL_ERROR( "input in flex scanner failed" ); \
757
0
    result = n; \
758
0
    } \
759
48.5k
  else \
760
48.5k
    { \
761
48.5k
    errno=0; \
762
48.5k
    while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, GUC_yyin)) == 0 && 
ferror(GUC_yyin)20.1k
) \
763
48.5k
      { \
764
0
      if( errno != EINTR) \
765
0
        { \
766
0
        YY_FATAL_ERROR( "input in flex scanner failed" ); \
767
0
        break; \
768
0
        } \
769
0
      errno=0; \
770
0
      clearerr(GUC_yyin); \
771
0
      } \
772
48.5k
    }\
773
\
774
775
#endif
776
777
/* No semi-colon after return; correct usage is to write "yyterminate();" -
778
 * we don't want an extra ';' after the "return" because that will cause
779
 * some compilers to complain about unreachable statements.
780
 */
781
#ifndef yyterminate
782
20.1k
#define yyterminate() return YY_NULL
783
#endif
784
785
/* Number of entries by which start-condition stack grows. */
786
#ifndef YY_START_STACK_INCR
787
#define YY_START_STACK_INCR 25
788
#endif
789
790
/* Report a fatal error. */
791
#ifndef YY_FATAL_ERROR
792
0
#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
793
#endif
794
795
/* end tables serialization structures and prototypes */
796
797
/* Default declaration of generated scanner - a define so the user can
798
 * easily add parameters.
799
 */
800
#ifndef YY_DECL
801
#define YY_DECL_IS_OURS 1
802
803
extern int GUC_yylex (void);
804
805
#define YY_DECL int GUC_yylex (void)
806
#endif /* !YY_DECL */
807
808
/* Code executed at the beginning of each rule, after GUC_yytext and GUC_yyleng
809
 * have been set up.
810
 */
811
#ifndef YY_USER_ACTION
812
#define YY_USER_ACTION
813
#endif
814
815
/* Code executed at the end of each rule. */
816
#ifndef YY_BREAK
817
6.40M
#define YY_BREAK /*LINTED*/break;
818
#endif
819
820
#define YY_RULE_SETUP \
821
  YY_USER_ACTION
822
823
/** The main scanner function which does all the work.
824
 */
825
YY_DECL
826
6.02M
{
827
6.02M
  yy_state_type yy_current_state;
828
6.02M
  char *yy_cp, *yy_bp;
829
6.02M
  int yy_act;
830
    
831
6.02M
  if ( !(yy_init) )
832
8.01k
    {
833
8.01k
    (yy_init) = 1;
834
835
#ifdef YY_USER_INIT
836
    YY_USER_INIT;
837
#endif
838
839
8.01k
    if ( ! (yy_start) )
840
8.01k
      (yy_start) = 1; /* first start state */
841
842
8.01k
    if ( ! GUC_yyin )
843
0
      GUC_yyin = stdin;
844
845
8.01k
    if ( ! GUC_yyout )
846
8.01k
      GUC_yyout = stdout;
847
848
8.01k
    if ( ! YY_CURRENT_BUFFER ) {
849
0
      GUC_yyensure_buffer_stack ();
850
0
      YY_CURRENT_BUFFER_LVALUE =
851
0
        GUC_yy_create_buffer(GUC_yyin,YY_BUF_SIZE );
852
0
    }
853
854
8.01k
    GUC_yy_load_buffer_state( );
855
8.01k
    }
856
857
6.02M
  {
858
6.02M
#line 94 "guc-file.l"
859
860
861
6.02M
#line 861 "guc-file.c"
862
863
12.4M
  while ( /*CONSTCOND*/1 )    /* loops until end-of-file is reached */
864
12.4M
    {
865
12.4M
    yy_cp = (yy_c_buf_p);
866
867
    /* Support of GUC_yytext. */
868
12.4M
    *yy_cp = (yy_hold_char);
869
870
    /* yy_bp points to the position in yy_ch_buf of the start of
871
     * the current run.
872
     */
873
12.4M
    yy_bp = yy_cp;
874
875
12.4M
    yy_current_state = (yy_start);
876
12.4M
yy_match:
877
12.4M
    do
878
209M
      {
879
209M
      YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ;
880
209M
      if ( yy_accept[yy_current_state] )
881
196M
        {
882
196M
        (yy_last_accepting_state) = yy_current_state;
883
196M
        (yy_last_accepting_cpos) = yy_cp;
884
196M
        }
885
405M
      while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
886
195M
        {
887
195M
        yy_current_state = (int) yy_def[yy_current_state];
888
195M
        if ( yy_current_state >= 41 )
889
183M
          yy_c = yy_meta[yy_c];
890
195M
        }
891
209M
      yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
892
209M
      ++yy_cp;
893
209M
      }
894
209M
    while ( yy_current_state != 40 );
895
12.4M
    yy_cp = (yy_last_accepting_cpos);
896
12.4M
    yy_current_state = (yy_last_accepting_state);
897
898
12.4M
yy_find_action:
899
12.4M
    yy_act = yy_accept[yy_current_state];
900
901
12.4M
    YY_DO_BEFORE_ACTION;
902
903
12.4M
do_action:  /* This label is used only to access EOF actions. */
904
905
12.4M
    switch ( yy_act )
906
12.4M
  { /* beginning of action switch */
907
0
      case 0: /* must back up */
908
      /* undo the effects of YY_DO_BEFORE_ACTION */
909
0
      *yy_cp = (yy_hold_char);
910
0
      yy_cp = (yy_last_accepting_cpos);
911
0
      yy_current_state = (yy_last_accepting_state);
912
0
      goto yy_find_action;
913
914
5.67M
case 1:
915
/* rule 1 can match eol */
916
5.67M
YY_RULE_SETUP
917
5.67M
#line 96 "guc-file.l"
918
5.67M
ConfigFileLineno++; return GUC_EOL;
919
0
  YY_BREAK
920
1.77M
case 2:
921
1.77M
YY_RULE_SETUP
922
1.77M
#line 97 "guc-file.l"
923
/* eat whitespace */
924
1.77M
  YY_BREAK
925
4.62M
case 3:
926
4.62M
YY_RULE_SETUP
927
4.62M
#line 98 "guc-file.l"
928
/* eat comment (.* matches anything until newline) */
929
4.62M
  YY_BREAK
930
117k
case 4:
931
117k
YY_RULE_SETUP
932
117k
#line 100 "guc-file.l"
933
117k
return GUC_ID;
934
0
  YY_BREAK
935
0
case 5:
936
0
YY_RULE_SETUP
937
0
#line 101 "guc-file.l"
938
0
return GUC_QUALIFIED_ID;
939
0
  YY_BREAK
940
68.5k
case 6:
941
68.5k
YY_RULE_SETUP
942
68.5k
#line 102 "guc-file.l"
943
68.5k
return GUC_STRING;
944
0
  YY_BREAK
945
0
case 7:
946
0
YY_RULE_SETUP
947
0
#line 103 "guc-file.l"
948
0
return GUC_UNQUOTED_STRING;
949
0
  YY_BREAK
950
32.2k
case 8:
951
32.2k
YY_RULE_SETUP
952
32.2k
#line 104 "guc-file.l"
953
32.2k
return GUC_INTEGER;
954
0
  YY_BREAK
955
0
case 9:
956
0
YY_RULE_SETUP
957
0
#line 105 "guc-file.l"
958
0
return GUC_REAL;
959
0
  YY_BREAK
960
108k
case 10:
961
108k
YY_RULE_SETUP
962
108k
#line 106 "guc-file.l"
963
108k
return GUC_EQUALS;
964
0
  YY_BREAK
965
0
case 11:
966
0
YY_RULE_SETUP
967
0
#line 108 "guc-file.l"
968
0
return GUC_ERROR;
969
0
  YY_BREAK
970
0
case 12:
971
0
YY_RULE_SETUP
972
0
#line 110 "guc-file.l"
973
0
YY_FATAL_ERROR( "flex scanner jammed" );
974
0
  YY_BREAK
975
0
#line 975 "guc-file.c"
976
20.1k
case YY_STATE_EOF(INITIAL):
977
20.1k
  yyterminate();
978
979
60.6k
  case YY_END_OF_BUFFER:
980
60.6k
    {
981
    /* Amount of text matched not including the EOB char. */
982
60.6k
    int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
983
984
    /* Undo the effects of YY_DO_BEFORE_ACTION. */
985
60.6k
    *yy_cp = (yy_hold_char);
986
60.6k
    YY_RESTORE_YY_MORE_OFFSET
987
988
60.6k
    if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
989
20.1k
      {
990
      /* We're scanning a new file or input source.  It's
991
       * possible that this happened because the user
992
       * just pointed GUC_yyin at a new source and called
993
       * GUC_yylex().  If so, then we have to assure
994
       * consistency between YY_CURRENT_BUFFER and our
995
       * globals.  Here is the right place to do so, because
996
       * this is the first action (other than possibly a
997
       * back-up) that will match for the new input source.
998
       */
999
20.1k
      (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
1000
20.1k
      YY_CURRENT_BUFFER_LVALUE->yy_input_file = GUC_yyin;
1001
20.1k
      YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
1002
20.1k
      }
1003
1004
    /* Note that here we test for yy_c_buf_p "<=" to the position
1005
     * of the first EOB in the buffer, since yy_c_buf_p will
1006
     * already have been incremented past the NUL character
1007
     * (since all states make transitions on EOB to the
1008
     * end-of-buffer state).  Contrast this with the test
1009
     * in input().
1010
     */
1011
60.6k
    if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
1012
0
      { /* This was really a NUL. */
1013
0
      yy_state_type yy_next_state;
1014
1015
0
      (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
1016
1017
0
      yy_current_state = yy_get_previous_state(  );
1018
1019
      /* Okay, we're now positioned to make the NUL
1020
       * transition.  We couldn't have
1021
       * yy_get_previous_state() go ahead and do it
1022
       * for us because it doesn't know how to deal
1023
       * with the possibility of jamming (and we don't
1024
       * want to build jamming into it because then it
1025
       * will run more slowly).
1026
       */
1027
1028
0
      yy_next_state = yy_try_NUL_trans( yy_current_state );
1029
1030
0
      yy_bp = (yytext_ptr) + YY_MORE_ADJ;
1031
1032
0
      if ( yy_next_state )
1033
0
        {
1034
        /* Consume the NUL. */
1035
0
        yy_cp = ++(yy_c_buf_p);
1036
0
        yy_current_state = yy_next_state;
1037
0
        goto yy_match;
1038
0
        }
1039
1040
0
      else
1041
0
        {
1042
0
        yy_cp = (yy_last_accepting_cpos);
1043
0
        yy_current_state = (yy_last_accepting_state);
1044
0
        goto yy_find_action;
1045
0
        }
1046
0
      }
1047
1048
60.6k
    else switch ( yy_get_next_buffer(  ) )
1049
60.6k
      {
1050
20.1k
      case EOB_ACT_END_OF_FILE:
1051
20.1k
        {
1052
20.1k
        (yy_did_buffer_switch_on_eof) = 0;
1053
1054
20.1k
        if ( GUC_yywrap( ) )
1055
20.1k
          {
1056
          /* Note: because we've taken care in
1057
           * yy_get_next_buffer() to have set up
1058
           * GUC_yytext, we can now set up
1059
           * yy_c_buf_p so that if some total
1060
           * hoser (like flex itself) wants to
1061
           * call the scanner after we return the
1062
           * YY_NULL, it'll still work - another
1063
           * YY_NULL will get returned.
1064
           */
1065
20.1k
          (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
1066
1067
20.1k
          yy_act = YY_STATE_EOF(YY_START);
1068
20.1k
          goto do_action;
1069
20.1k
          }
1070
1071
0
        else
1072
0
          {
1073
0
          if ( ! (yy_did_buffer_switch_on_eof) )
1074
0
            YY_NEW_FILE;
1075
0
          }
1076
0
        break;
1077
20.1k
        }
1078
1079
28.3k
      case EOB_ACT_CONTINUE_SCAN:
1080
28.3k
        (yy_c_buf_p) =
1081
28.3k
          (yytext_ptr) + yy_amount_of_matched_text;
1082
1083
28.3k
        yy_current_state = yy_get_previous_state(  );
1084
1085
28.3k
        yy_cp = (yy_c_buf_p);
1086
28.3k
        yy_bp = (yytext_ptr) + YY_MORE_ADJ;
1087
28.3k
        goto yy_match;
1088
1089
12.1k
      case EOB_ACT_LAST_MATCH:
1090
12.1k
        (yy_c_buf_p) =
1091
12.1k
        &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
1092
1093
12.1k
        yy_current_state = yy_get_previous_state(  );
1094
1095
12.1k
        yy_cp = (yy_c_buf_p);
1096
12.1k
        yy_bp = (yytext_ptr) + YY_MORE_ADJ;
1097
12.1k
        goto yy_find_action;
1098
60.6k
      }
1099
0
    break;
1100
60.6k
    }
1101
1102
0
  default:
1103
0
    YY_FATAL_ERROR(
1104
12.4M
      "fatal flex scanner internal error--no action found" );
1105
12.4M
  } /* end of action switch */
1106
12.4M
    } /* end of scanning one token */
1107
6.02M
  } /* end of user's declarations */
1108
6.02M
} /* end of GUC_yylex */
1109
1110
/* yy_get_next_buffer - try to read in a new buffer
1111
 *
1112
 * Returns a code representing an action:
1113
 *  EOB_ACT_LAST_MATCH -
1114
 *  EOB_ACT_CONTINUE_SCAN - continue scanning from current position
1115
 *  EOB_ACT_END_OF_FILE - end of file
1116
 */
1117
static int yy_get_next_buffer (void)
1118
60.6k
{
1119
60.6k
      char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
1120
60.6k
  char *source = (yytext_ptr);
1121
60.6k
  int number_to_move, i;
1122
60.6k
  int ret_val;
1123
1124
60.6k
  if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
1125
0
    YY_FATAL_ERROR(
1126
60.6k
    "fatal flex scanner internal error--end of buffer missed" );
1127
1128
60.6k
  if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
1129
0
    { /* Don't try to fill the buffer, so this is an EOF. */
1130
0
    if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
1131
0
      {
1132
      /* We matched a single character, the EOB, so
1133
       * treat this as a final EOF.
1134
       */
1135
0
      return EOB_ACT_END_OF_FILE;
1136
0
      }
1137
1138
0
    else
1139
0
      {
1140
      /* We matched some text prior to the EOB, first
1141
       * process it.
1142
       */
1143
0
      return EOB_ACT_LAST_MATCH;
1144
0
      }
1145
0
    }
1146
1147
  /* Try to read more data. */
1148
1149
  /* First move last chars to start of buffer. */
1150
60.6k
  number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1);
1151
1152
329k
  for ( i = 0; i < number_to_move; 
++i268k
)
1153
268k
    *(dest++) = *(source++);
1154
1155
60.6k
  if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
1156
    /* don't do the read, it's not guaranteed to return an EOF,
1157
     * just force an EOF
1158
     */
1159
12.1k
    YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
1160
1161
48.5k
  else
1162
48.5k
    {
1163
48.5k
      int num_to_read =
1164
48.5k
      YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
1165
1166
48.5k
    while ( num_to_read <= 0 )
1167
0
      { /* Not enough room in the buffer - grow it. */
1168
1169
      /* just a shorter name for the current buffer */
1170
0
      YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE;
1171
1172
0
      int yy_c_buf_p_offset =
1173
0
        (int) ((yy_c_buf_p) - b->yy_ch_buf);
1174
1175
0
      if ( b->yy_is_our_buffer )
1176
0
        {
1177
0
        int new_size = b->yy_buf_size * 2;
1178
1179
0
        if ( new_size <= 0 )
1180
0
          b->yy_buf_size += b->yy_buf_size / 8;
1181
0
        else
1182
0
          b->yy_buf_size *= 2;
1183
1184
0
        b->yy_ch_buf = (char *)
1185
          /* Include room in for 2 EOB chars. */
1186
0
          GUC_yyrealloc((void *) b->yy_ch_buf,(yy_size_t) (b->yy_buf_size + 2)  );
1187
0
        }
1188
0
      else
1189
        /* Can't grow it, we don't own it. */
1190
0
        b->yy_ch_buf = NULL;
1191
1192
0
      if ( ! b->yy_ch_buf )
1193
0
        YY_FATAL_ERROR(
1194
0
        "fatal error - scanner input buffer overflow" );
1195
1196
0
      (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
1197
1198
0
      num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
1199
0
            number_to_move - 1;
1200
1201
0
      }
1202
1203
48.5k
    if ( num_to_read > YY_READ_BUF_SIZE )
1204
48.5k
      num_to_read = YY_READ_BUF_SIZE;
1205
1206
    /* Read in more data. */
1207
48.5k
    YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
1208
48.5k
      (yy_n_chars), num_to_read );
1209
1210
48.5k
    YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
1211
48.5k
    }
1212
1213
60.6k
  if ( (yy_n_chars) == 0 )
1214
32.2k
    {
1215
32.2k
    if ( number_to_move == YY_MORE_ADJ )
1216
20.1k
      {
1217
20.1k
      ret_val = EOB_ACT_END_OF_FILE;
1218
20.1k
      GUC_yyrestart(GUC_yyin  );
1219
20.1k
      }
1220
1221
12.1k
    else
1222
12.1k
      {
1223
12.1k
      ret_val = EOB_ACT_LAST_MATCH;
1224
12.1k
      YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
1225
12.1k
        YY_BUFFER_EOF_PENDING;
1226
12.1k
      }
1227
32.2k
    }
1228
1229
28.3k
  else
1230
28.3k
    ret_val = EOB_ACT_CONTINUE_SCAN;
1231
1232
60.6k
  if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
1233
    /* Extend the array by 50%, plus the number we really need. */
1234
0
    int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
1235
0
    YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) GUC_yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,(yy_size_t) new_size  );
1236
0
    if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
1237
0
      YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
1238
0
  }
1239
1240
60.6k
  (yy_n_chars) += number_to_move;
1241
60.6k
  YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
1242
60.6k
  YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
1243
1244
60.6k
  (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
1245
1246
60.6k
  return ret_val;
1247
60.6k
}
1248
1249
/* yy_get_previous_state - get the state just before the EOB char was reached */
1250
1251
    static yy_state_type yy_get_previous_state (void)
1252
40.5k
{
1253
40.5k
  yy_state_type yy_current_state;
1254
40.5k
  char *yy_cp;
1255
    
1256
40.5k
  yy_current_state = (yy_start);
1257
1258
308k
  for ( yy_cp = (
yytext_ptr40.5k
) +
YY_MORE_ADJ40.5k
; yy_cp < (yy_c_buf_p);
++yy_cp268k
)
1259
268k
    {
1260
268k
    YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 
10
);
1261
268k
    if ( yy_accept[yy_current_state] )
1262
237k
      {
1263
237k
      (yy_last_accepting_state) = yy_current_state;
1264
237k
      (yy_last_accepting_cpos) = yy_cp;
1265
237k
      }
1266
500k
    while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
1267
231k
      {
1268
231k
      yy_current_state = (int) yy_def[yy_current_state];
1269
231k
      if ( yy_current_state >= 41 )
1270
231k
        yy_c = yy_meta[yy_c];
1271
231k
      }
1272
268k
    yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
1273
268k
    }
1274
1275
40.5k
  return yy_current_state;
1276
40.5k
}
1277
1278
/* yy_try_NUL_trans - try to make a transition on the NUL character
1279
 *
1280
 * synopsis
1281
 *  next_state = yy_try_NUL_trans( current_state );
1282
 */
1283
    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state )
1284
0
{
1285
0
  int yy_is_jam;
1286
0
      char *yy_cp = (yy_c_buf_p);
1287
1288
0
  YY_CHAR yy_c = 1;
1289
0
  if ( yy_accept[yy_current_state] )
1290
0
    {
1291
0
    (yy_last_accepting_state) = yy_current_state;
1292
0
    (yy_last_accepting_cpos) = yy_cp;
1293
0
    }
1294
0
  while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
1295
0
    {
1296
0
    yy_current_state = (int) yy_def[yy_current_state];
1297
0
    if ( yy_current_state >= 41 )
1298
0
      yy_c = yy_meta[yy_c];
1299
0
    }
1300
0
  yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
1301
0
  yy_is_jam = (yy_current_state == 40);
1302
1303
0
    return yy_is_jam ? 0 : yy_current_state;
1304
0
}
1305
1306
#ifndef YY_NO_UNPUT
1307
1308
#endif
1309
1310
#ifndef YY_NO_INPUT
1311
#ifdef __cplusplus
1312
    static int yyinput (void)
1313
#else
1314
    static int input  (void)
1315
#endif
1316
1317
{
1318
  int c;
1319
    
1320
  *(yy_c_buf_p) = (yy_hold_char);
1321
1322
  if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
1323
    {
1324
    /* yy_c_buf_p now points to the character we want to return.
1325
     * If this occurs *before* the EOB characters, then it's a
1326
     * valid NUL; if not, then we've hit the end of the buffer.
1327
     */
1328
    if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
1329
      /* This was really a NUL. */
1330
      *(yy_c_buf_p) = '\0';
1331
1332
    else
1333
      { /* need more input */
1334
      int offset = (int) ((yy_c_buf_p) - (yytext_ptr));
1335
      ++(yy_c_buf_p);
1336
1337
      switch ( yy_get_next_buffer(  ) )
1338
        {
1339
        case EOB_ACT_LAST_MATCH:
1340
          /* This happens because yy_g_n_b()
1341
           * sees that we've accumulated a
1342
           * token and flags that we need to
1343
           * try matching the token before
1344
           * proceeding.  But for input(),
1345
           * there's no matching to consider.
1346
           * So convert the EOB_ACT_LAST_MATCH
1347
           * to EOB_ACT_END_OF_FILE.
1348
           */
1349
1350
          /* Reset buffer status. */
1351
          GUC_yyrestart(GUC_yyin );
1352
1353
          /*FALLTHROUGH*/
1354
1355
        case EOB_ACT_END_OF_FILE:
1356
          {
1357
          if ( GUC_yywrap( ) )
1358
            return 0;
1359
1360
          if ( ! (yy_did_buffer_switch_on_eof) )
1361
            YY_NEW_FILE;
1362
#ifdef __cplusplus
1363
          return yyinput();
1364
#else
1365
          return input();
1366
#endif
1367
          }
1368
1369
        case EOB_ACT_CONTINUE_SCAN:
1370
          (yy_c_buf_p) = (yytext_ptr) + offset;
1371
          break;
1372
        }
1373
      }
1374
    }
1375
1376
  c = *(unsigned char *) (yy_c_buf_p);  /* cast for 8-bit char's */
1377
  *(yy_c_buf_p) = '\0'; /* preserve GUC_yytext */
1378
  (yy_hold_char) = *++(yy_c_buf_p);
1379
1380
  return c;
1381
}
1382
#endif  /* ifndef YY_NO_INPUT */
1383
1384
/** Immediately switch to a different input stream.
1385
 * @param input_file A readable stream.
1386
 * 
1387
 * @note This function does not reset the start condition to @c INITIAL .
1388
 */
1389
    void GUC_yyrestart  (FILE * input_file )
1390
20.1k
{
1391
    
1392
20.1k
  if ( ! YY_CURRENT_BUFFER ){
1393
0
        GUC_yyensure_buffer_stack ();
1394
0
    YY_CURRENT_BUFFER_LVALUE =
1395
0
            GUC_yy_create_buffer(GUC_yyin,YY_BUF_SIZE );
1396
0
  }
1397
1398
20.1k
  GUC_yy_init_buffer(YY_CURRENT_BUFFER,input_file );
1399
20.1k
  GUC_yy_load_buffer_state( );
1400
20.1k
}
1401
1402
/** Switch to a different input buffer.
1403
 * @param new_buffer The new input buffer.
1404
 * 
1405
 */
1406
    void GUC_yy_switch_to_buffer  (YY_BUFFER_STATE  new_buffer )
1407
20.1k
{
1408
    
1409
  /* TODO. We should be able to replace this entire function body
1410
   * with
1411
   *    GUC_yypop_buffer_state();
1412
   *    GUC_yypush_buffer_state(new_buffer);
1413
     */
1414
20.1k
  GUC_yyensure_buffer_stack ();
1415
20.1k
  if ( YY_CURRENT_BUFFER == new_buffer )
1416
0
    return;
1417
1418
20.1k
  if ( YY_CURRENT_BUFFER )
1419
0
    {
1420
    /* Flush out information for old buffer. */
1421
0
    *(yy_c_buf_p) = (yy_hold_char);
1422
0
    YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
1423
0
    YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
1424
0
    }
1425
1426
20.1k
  YY_CURRENT_BUFFER_LVALUE = new_buffer;
1427
20.1k
  GUC_yy_load_buffer_state( );
1428
1429
  /* We don't actually know whether we did this switch during
1430
   * EOF (GUC_yywrap()) processing, but the only time this flag
1431
   * is looked at is after GUC_yywrap() is called, so it's safe
1432
   * to go ahead and always set it.
1433
   */
1434
20.1k
  (yy_did_buffer_switch_on_eof) = 1;
1435
20.1k
}
1436
1437
static void GUC_yy_load_buffer_state  (void)
1438
68.4k
{
1439
68.4k
      (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
1440
68.4k
  (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
1441
68.4k
  GUC_yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
1442
68.4k
  (yy_hold_char) = *(yy_c_buf_p);
1443
68.4k
}
1444
1445
/** Allocate and initialize an input buffer state.
1446
 * @param file A readable stream.
1447
 * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
1448
 * 
1449
 * @return the allocated buffer state.
1450
 */
1451
    YY_BUFFER_STATE GUC_yy_create_buffer  (FILE * file, int  size )
1452
20.1k
{
1453
20.1k
  YY_BUFFER_STATE b;
1454
    
1455
20.1k
  b = (YY_BUFFER_STATE) GUC_yyalloc(sizeof( struct yy_buffer_state )  );
1456
20.1k
  if ( ! b )
1457
0
    YY_FATAL_ERROR( "out of dynamic memory in GUC_yy_create_buffer()" );
1458
1459
20.1k
  b->yy_buf_size = size;
1460
1461
  /* yy_ch_buf has to be 2 characters longer than the size given because
1462
   * we need to put in 2 end-of-buffer characters.
1463
   */
1464
20.1k
  b->yy_ch_buf = (char *) GUC_yyalloc((yy_size_t) (b->yy_buf_size + 2)  );
1465
20.1k
  if ( ! b->yy_ch_buf )
1466
0
    YY_FATAL_ERROR( "out of dynamic memory in GUC_yy_create_buffer()" );
1467
1468
20.1k
  b->yy_is_our_buffer = 1;
1469
1470
20.1k
  GUC_yy_init_buffer(b,file );
1471
1472
20.1k
  return b;
1473
20.1k
}
1474
1475
/** Destroy the buffer.
1476
 * @param b a buffer created with GUC_yy_create_buffer()
1477
 * 
1478
 */
1479
    void GUC_yy_delete_buffer (YY_BUFFER_STATE  b )
1480
20.1k
{
1481
    
1482
20.1k
  if ( ! b )
1483
0
    return;
1484
1485
20.1k
  if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
1486
20.1k
    YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
1487
1488
20.1k
  if ( b->yy_is_our_buffer )
1489
20.1k
    GUC_yyfree((void *) b->yy_ch_buf  );
1490
1491
20.1k
  GUC_yyfree((void *) b  );
1492
20.1k
}
1493
1494
/* Initializes or reinitializes a buffer.
1495
 * This function is sometimes called more than once on the same buffer,
1496
 * such as during a GUC_yyrestart() or at EOF.
1497
 */
1498
    static void GUC_yy_init_buffer  (YY_BUFFER_STATE  b, FILE * file )
1499
1500
40.2k
{
1501
40.2k
  int oerrno = errno;
1502
    
1503
40.2k
  GUC_yy_flush_buffer(b );
1504
1505
40.2k
  b->yy_input_file = file;
1506
40.2k
  b->yy_fill_buffer = 1;
1507
1508
    /* If b is the current buffer, then GUC_yy_init_buffer was _probably_
1509
     * called from GUC_yyrestart() or through yy_get_next_buffer.
1510
     * In that case, we don't want to reset the lineno or column.
1511
     */
1512
40.2k
    if (b != YY_CURRENT_BUFFER){
1513
20.1k
        b->yy_bs_lineno = 1;
1514
20.1k
        b->yy_bs_column = 0;
1515
20.1k
    }
1516
1517
40.2k
        b->yy_is_interactive = 0;
1518
    
1519
40.2k
  errno = oerrno;
1520
40.2k
}
1521
1522
/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
1523
 * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
1524
 * 
1525
 */
1526
    void GUC_yy_flush_buffer (YY_BUFFER_STATE  b )
1527
40.2k
{
1528
40.2k
      if ( ! b )
1529
0
    return;
1530
1531
40.2k
  b->yy_n_chars = 0;
1532
1533
  /* We always need two end-of-buffer characters.  The first causes
1534
   * a transition to the end-of-buffer state.  The second causes
1535
   * a jam in that state.
1536
   */
1537
40.2k
  b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
1538
40.2k
  b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
1539
1540
40.2k
  b->yy_buf_pos = &b->yy_ch_buf[0];
1541
1542
40.2k
  b->yy_at_bol = 1;
1543
40.2k
  b->yy_buffer_status = YY_BUFFER_NEW;
1544
1545
40.2k
  if ( b == YY_CURRENT_BUFFER )
1546
20.1k
    GUC_yy_load_buffer_state( );
1547
40.2k
}
1548
1549
/** Pushes the new state onto the stack. The new state becomes
1550
 *  the current state. This function will allocate the stack
1551
 *  if necessary.
1552
 *  @param new_buffer The new state.
1553
 *  
1554
 */
1555
void GUC_yypush_buffer_state (YY_BUFFER_STATE new_buffer )
1556
0
{
1557
0
      if (new_buffer == NULL)
1558
0
    return;
1559
1560
0
  GUC_yyensure_buffer_stack();
1561
1562
  /* This block is copied from GUC_yy_switch_to_buffer. */
1563
0
  if ( YY_CURRENT_BUFFER )
1564
0
    {
1565
    /* Flush out information for old buffer. */
1566
0
    *(yy_c_buf_p) = (yy_hold_char);
1567
0
    YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
1568
0
    YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
1569
0
    }
1570
1571
  /* Only push if top exists. Otherwise, replace top. */
1572
0
  if (YY_CURRENT_BUFFER)
1573
0
    (yy_buffer_stack_top)++;
1574
0
  YY_CURRENT_BUFFER_LVALUE = new_buffer;
1575
1576
  /* copied from GUC_yy_switch_to_buffer. */
1577
0
  GUC_yy_load_buffer_state( );
1578
0
  (yy_did_buffer_switch_on_eof) = 1;
1579
0
}
1580
1581
/** Removes and deletes the top of the stack, if present.
1582
 *  The next element becomes the new top.
1583
 *  
1584
 */
1585
void GUC_yypop_buffer_state (void)
1586
0
{
1587
0
      if (!YY_CURRENT_BUFFER)
1588
0
    return;
1589
1590
0
  GUC_yy_delete_buffer(YY_CURRENT_BUFFER );
1591
0
  YY_CURRENT_BUFFER_LVALUE = NULL;
1592
0
  if ((yy_buffer_stack_top) > 0)
1593
0
    --(yy_buffer_stack_top);
1594
1595
0
  if (YY_CURRENT_BUFFER) {
1596
0
    GUC_yy_load_buffer_state( );
1597
0
    (yy_did_buffer_switch_on_eof) = 1;
1598
0
  }
1599
0
}
1600
1601
/* Allocates the stack if it does not exist.
1602
 *  Guarantees space for at least one push.
1603
 */
1604
static void GUC_yyensure_buffer_stack (void)
1605
20.1k
{
1606
20.1k
  yy_size_t num_to_alloc;
1607
    
1608
20.1k
  if (!(yy_buffer_stack)) {
1609
1610
    /* First allocation is just for 2 elements, since we don't know if this
1611
     * scanner will even need a stack. We use 2 instead of 1 to avoid an
1612
     * immediate realloc on the next call.
1613
         */
1614
8.01k
      num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */
1615
8.01k
    (yy_buffer_stack) = (struct yy_buffer_state**)GUC_yyalloc
1616
8.01k
                (num_to_alloc * sizeof(struct yy_buffer_state*)
1617
8.01k
                );
1618
8.01k
    if ( ! (yy_buffer_stack) )
1619
0
      YY_FATAL_ERROR( "out of dynamic memory in GUC_yyensure_buffer_stack()" );
1620
1621
8.01k
    memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
1622
1623
8.01k
    (yy_buffer_stack_max) = num_to_alloc;
1624
8.01k
    (yy_buffer_stack_top) = 0;
1625
8.01k
    return;
1626
8.01k
  }
1627
1628
12.1k
  if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
1629
1630
    /* Increase the buffer to prepare for a possible push. */
1631
8.01k
    yy_size_t grow_size = 8 /* arbitrary grow size */;
1632
1633
8.01k
    num_to_alloc = (yy_buffer_stack_max) + grow_size;
1634
8.01k
    (yy_buffer_stack) = (struct yy_buffer_state**)GUC_yyrealloc
1635
8.01k
                ((yy_buffer_stack),
1636
8.01k
                num_to_alloc * sizeof(struct yy_buffer_state*)
1637
8.01k
                );
1638
8.01k
    if ( ! (yy_buffer_stack) )
1639
0
      YY_FATAL_ERROR( "out of dynamic memory in GUC_yyensure_buffer_stack()" );
1640
1641
    /* zero only the new slots.*/
1642
8.01k
    memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
1643
8.01k
    (yy_buffer_stack_max) = num_to_alloc;
1644
8.01k
  }
1645
12.1k
}
1646
1647
/** Setup the input buffer state to scan directly from a user-specified character buffer.
1648
 * @param base the character buffer
1649
 * @param size the size in bytes of the character buffer
1650
 * 
1651
 * @return the newly allocated buffer state object.
1652
 */
1653
YY_BUFFER_STATE GUC_yy_scan_buffer  (char * base, yy_size_t  size )
1654
0
{
1655
0
  YY_BUFFER_STATE b;
1656
    
1657
0
  if ( size < 2 ||
1658
0
       base[size-2] != YY_END_OF_BUFFER_CHAR ||
1659
0
       base[size-1] != YY_END_OF_BUFFER_CHAR )
1660
    /* They forgot to leave room for the EOB's. */
1661
0
    return NULL;
1662
1663
0
  b = (YY_BUFFER_STATE) GUC_yyalloc(sizeof( struct yy_buffer_state )  );
1664
0
  if ( ! b )
1665
0
    YY_FATAL_ERROR( "out of dynamic memory in GUC_yy_scan_buffer()" );
1666
1667
0
  b->yy_buf_size = (int) (size - 2);  /* "- 2" to take care of EOB's */
1668
0
  b->yy_buf_pos = b->yy_ch_buf = base;
1669
0
  b->yy_is_our_buffer = 0;
1670
0
  b->yy_input_file = NULL;
1671
0
  b->yy_n_chars = b->yy_buf_size;
1672
0
  b->yy_is_interactive = 0;
1673
0
  b->yy_at_bol = 1;
1674
0
  b->yy_fill_buffer = 0;
1675
0
  b->yy_buffer_status = YY_BUFFER_NEW;
1676
1677
0
  GUC_yy_switch_to_buffer(b  );
1678
1679
0
  return b;
1680
0
}
1681
1682
/** Setup the input buffer state to scan a string. The next call to GUC_yylex() will
1683
 * scan from a @e copy of @a str.
1684
 * @param yystr a NUL-terminated string to scan
1685
 * 
1686
 * @return the newly allocated buffer state object.
1687
 * @note If you want to scan bytes that may contain NUL values, then use
1688
 *       GUC_yy_scan_bytes() instead.
1689
 */
1690
YY_BUFFER_STATE GUC_yy_scan_string (const char * yystr )
1691
0
{
1692
    
1693
0
  return GUC_yy_scan_bytes(yystr,(int) strlen(yystr) );
1694
0
}
1695
1696
/** Setup the input buffer state to scan the given bytes. The next call to GUC_yylex() will
1697
 * scan from a @e copy of @a bytes.
1698
 * @param yybytes the byte buffer to scan
1699
 * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
1700
 * 
1701
 * @return the newly allocated buffer state object.
1702
 */
1703
YY_BUFFER_STATE GUC_yy_scan_bytes  (const char * yybytes, int  _yybytes_len )
1704
0
{
1705
0
  YY_BUFFER_STATE b;
1706
0
  char *buf;
1707
0
  yy_size_t n;
1708
0
  int i;
1709
    
1710
  /* Get memory for full buffer, including space for trailing EOB's. */
1711
0
  n = (yy_size_t) (_yybytes_len + 2);
1712
0
  buf = (char *) GUC_yyalloc(n  );
1713
0
  if ( ! buf )
1714
0
    YY_FATAL_ERROR( "out of dynamic memory in GUC_yy_scan_bytes()" );
1715
1716
0
  for ( i = 0; i < _yybytes_len; ++i )
1717
0
    buf[i] = yybytes[i];
1718
1719
0
  buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
1720
1721
0
  b = GUC_yy_scan_buffer(buf,n );
1722
0
  if ( ! b )
1723
0
    YY_FATAL_ERROR( "bad buffer in GUC_yy_scan_bytes()" );
1724
1725
  /* It's okay to grow etc. this buffer, and we should throw it
1726
   * away when we're done.
1727
   */
1728
0
  b->yy_is_our_buffer = 1;
1729
1730
0
  return b;
1731
0
}
1732
1733
#ifndef YY_EXIT_FAILURE
1734
0
#define YY_EXIT_FAILURE 2
1735
#endif
1736
1737
static void yynoreturn yy_fatal_error (const char* msg )
1738
0
{
1739
0
      (void) fprintf( stderr, "%s\n", msg );
1740
0
  exit( YY_EXIT_FAILURE );
1741
0
}
1742
1743
/* Redefine yyless() so it works in section 3 code. */
1744
1745
#undef yyless
1746
#define yyless(n) \
1747
  do \
1748
    { \
1749
    /* Undo effects of setting up GUC_yytext. */ \
1750
        int yyless_macro_arg = (n); \
1751
        YY_LESS_LINENO(yyless_macro_arg);\
1752
    GUC_yytext[GUC_yyleng] = (yy_hold_char); \
1753
    (yy_c_buf_p) = GUC_yytext + yyless_macro_arg; \
1754
    (yy_hold_char) = *(yy_c_buf_p); \
1755
    *(yy_c_buf_p) = '\0'; \
1756
    GUC_yyleng = yyless_macro_arg; \
1757
    } \
1758
  while ( 0 )
1759
1760
/* Accessor  methods (get/set functions) to struct members. */
1761
1762
/** Get the current line number.
1763
 * 
1764
 */
1765
int GUC_yyget_lineno  (void)
1766
0
{
1767
    
1768
0
    return GUC_yylineno;
1769
0
}
1770
1771
/** Get the input stream.
1772
 * 
1773
 */
1774
FILE *GUC_yyget_in  (void)
1775
0
{
1776
0
        return GUC_yyin;
1777
0
}
1778
1779
/** Get the output stream.
1780
 * 
1781
 */
1782
FILE *GUC_yyget_out  (void)
1783
0
{
1784
0
        return GUC_yyout;
1785
0
}
1786
1787
/** Get the length of the current token.
1788
 * 
1789
 */
1790
int GUC_yyget_leng  (void)
1791
0
{
1792
0
        return GUC_yyleng;
1793
0
}
1794
1795
/** Get the current token.
1796
 * 
1797
 */
1798
1799
char *GUC_yyget_text  (void)
1800
0
{
1801
0
        return GUC_yytext;
1802
0
}
1803
1804
/** Set the current line number.
1805
 * @param _line_number line number
1806
 * 
1807
 */
1808
void GUC_yyset_lineno (int  _line_number )
1809
0
{
1810
    
1811
0
    GUC_yylineno = _line_number;
1812
0
}
1813
1814
/** Set the input stream. This does not discard the current
1815
 * input buffer.
1816
 * @param _in_str A readable stream.
1817
 * 
1818
 * @see GUC_yy_switch_to_buffer
1819
 */
1820
void GUC_yyset_in (FILE *  _in_str )
1821
0
{
1822
0
        GUC_yyin = _in_str ;
1823
0
}
1824
1825
void GUC_yyset_out (FILE *  _out_str )
1826
0
{
1827
0
        GUC_yyout = _out_str ;
1828
0
}
1829
1830
int GUC_yyget_debug  (void)
1831
0
{
1832
0
        return GUC_yy_flex_debug;
1833
0
}
1834
1835
void GUC_yyset_debug (int  _bdebug )
1836
0
{
1837
0
        GUC_yy_flex_debug = _bdebug ;
1838
0
}
1839
1840
static int yy_init_globals (void)
1841
0
{
1842
        /* Initialization is the same as for the non-reentrant scanner.
1843
     * This function is called from GUC_yylex_destroy(), so don't allocate here.
1844
     */
1845
1846
0
    (yy_buffer_stack) = NULL;
1847
0
    (yy_buffer_stack_top) = 0;
1848
0
    (yy_buffer_stack_max) = 0;
1849
0
    (yy_c_buf_p) = NULL;
1850
0
    (yy_init) = 0;
1851
0
    (yy_start) = 0;
1852
1853
/* Defined in main.c */
1854
#ifdef YY_STDINIT
1855
    GUC_yyin = stdin;
1856
    GUC_yyout = stdout;
1857
#else
1858
0
    GUC_yyin = NULL;
1859
0
    GUC_yyout = NULL;
1860
0
#endif
1861
1862
    /* For future reference: Set errno on error, since we are called by
1863
     * GUC_yylex_init()
1864
     */
1865
0
    return 0;
1866
0
}
1867
1868
/* GUC_yylex_destroy is for both reentrant and non-reentrant scanners. */
1869
int GUC_yylex_destroy  (void)
1870
0
{
1871
    
1872
    /* Pop the buffer stack, destroying each element. */
1873
0
  while(YY_CURRENT_BUFFER){
1874
0
    GUC_yy_delete_buffer(YY_CURRENT_BUFFER  );
1875
0
    YY_CURRENT_BUFFER_LVALUE = NULL;
1876
0
    GUC_yypop_buffer_state();
1877
0
  }
1878
1879
  /* Destroy the stack itself. */
1880
0
  GUC_yyfree((yy_buffer_stack) );
1881
0
  (yy_buffer_stack) = NULL;
1882
1883
    /* Reset the globals. This is important in a non-reentrant scanner so the next time
1884
     * GUC_yylex() is called, initialization will occur. */
1885
0
    yy_init_globals( );
1886
1887
0
    return 0;
1888
0
}
1889
1890
/*
1891
 * Internal utility routines.
1892
 */
1893
1894
#ifndef yytext_ptr
1895
static void yy_flex_strncpy (char* s1, const char * s2, int n )
1896
{
1897
    
1898
  int i;
1899
  for ( i = 0; i < n; ++i )
1900
    s1[i] = s2[i];
1901
}
1902
#endif
1903
1904
#ifdef YY_NEED_STRLEN
1905
static int yy_flex_strlen (const char * s )
1906
{
1907
  int n;
1908
  for ( n = 0; s[n]; ++n )
1909
    ;
1910
1911
  return n;
1912
}
1913
#endif
1914
1915
void *GUC_yyalloc (yy_size_t  size )
1916
48.3k
{
1917
48.3k
      return malloc(size);
1918
48.3k
}
1919
1920
void *GUC_yyrealloc  (void * ptr, yy_size_t  size )
1921
8.01k
{
1922
    
1923
  /* The cast to (char *) in the following accommodates both
1924
   * implementations that use char* generic pointers, and those
1925
   * that use void* generic pointers.  It works with the latter
1926
   * because both ANSI C and C++ allow castless assignment from
1927
   * any pointer type to void*, and deal with argument conversions
1928
   * as though doing an assignment.
1929
   */
1930
8.01k
  return realloc(ptr, size);
1931
8.01k
}
1932
1933
void GUC_yyfree (void * ptr )
1934
40.2k
{
1935
40.2k
      free( (char *) ptr ); /* see GUC_yyrealloc() for (char *) cast */
1936
40.2k
}
1937
1938
#define YYTABLES_NAME "yytables"
1939
1940
#line 110 "guc-file.l"
1941
1942
1943
/* LCOV_EXCL_STOP */
1944
1945
/*
1946
 * Exported function to read and process the configuration file. The
1947
 * parameter indicates in what context the file is being read --- either
1948
 * postmaster startup (including standalone-backend startup) or SIGHUP.
1949
 * All options mentioned in the configuration file are set to new values.
1950
 * If a hard error occurs, no values will be changed.  (There can also be
1951
 * errors that prevent just one value from being changed.)
1952
 */
1953
void
1954
ProcessConfigFile(GucContext context)
1955
16.0k
{
1956
16.0k
  int     elevel;
1957
16.0k
  MemoryContext config_cxt;
1958
16.0k
  MemoryContext caller_cxt;
1959
1960
  /*
1961
   * Config files are processed on startup (by the postmaster only) and on
1962
   * SIGHUP (by the postmaster and its children)
1963
   */
1964
16.0k
  Assert((context == PGC_POSTMASTER && !IsUnderPostmaster) ||
1965
16.0k
       context == PGC_SIGHUP);
1966
1967
  /*
1968
   * To avoid cluttering the log, only the postmaster bleats loudly about
1969
   * problems with the config file.
1970
   */
1971
16.0k
  elevel = IsUnderPostmaster ? 
DEBUG218
:
LOG16.0k
;
1972
1973
  /*
1974
   * This function is usually called within a process-lifespan memory
1975
   * context.  To ensure that any memory leaked during GUC processing does
1976
   * not accumulate across repeated SIGHUP cycles, do the work in a private
1977
   * context that we can free at exit.
1978
   */
1979
16.0k
  config_cxt = AllocSetContextCreate(GetCurrentMemoryContext(),
1980
16.0k
                     "config file processing",
1981
16.0k
                     ALLOCSET_DEFAULT_SIZES);
1982
16.0k
  caller_cxt = MemoryContextSwitchTo(config_cxt);
1983
1984
  /*
1985
   * Read and apply the config file.  We don't need to examine the result.
1986
   */
1987
16.0k
  (void) ProcessConfigFileInternal(context, true, elevel);
1988
1989
  /* Clean up */
1990
16.0k
  MemoryContextSwitchTo(caller_cxt);
1991
16.0k
  MemoryContextDelete(config_cxt);
1992
16.0k
}
1993
1994
/*
1995
 * This function handles both actual config file (re)loads and execution of
1996
 * show_all_file_settings() (i.e., the pg_file_settings view).  In the latter
1997
 * case we don't apply any of the settings, but we make all the usual validity
1998
 * checks, and we return the ConfigVariable list so that it can be printed out
1999
 * by show_all_file_settings().
2000
 */
2001
static ConfigVariable *
2002
ProcessConfigFileInternal(GucContext context, bool applySettings, int elevel)
2003
16.0k
{
2004
16.0k
  bool    error = false;
2005
16.0k
  bool    applying = false;
2006
16.0k
  const char *ConfFileWithError;
2007
16.0k
  ConfigVariable *item,
2008
16.0k
         *head,
2009
16.0k
         *tail;
2010
16.0k
  int     i;
2011
2012
  /* Parse the main config file into a list of option names and values */
2013
16.0k
  ConfFileWithError = ConfigFileName;
2014
16.0k
  head = tail = NULL;
2015
2016
16.0k
  if (!ParseConfigFile(ConfigFileName, true,
2017
16.0k
             NULL, 0, 0, elevel,
2018
16.0k
             &head, &tail))
2019
0
  {
2020
    /* Syntax error(s) detected in the file, so bail out */
2021
0
    error = true;
2022
0
    goto bail_out;
2023
0
  }
2024
2025
  /*
2026
   * Parse the PG_AUTOCONF_FILENAME file, if present, after the main file to
2027
   * replace any parameters set by ALTER SYSTEM command.  Because this file
2028
   * is in the data directory, we can't read it until the DataDir has been
2029
   * set.
2030
   */
2031
16.0k
  if (DataDir)
2032
8.04k
  {
2033
8.04k
    if (!ParseConfigFile(PG_AUTOCONF_FILENAME, false,
2034
8.04k
               NULL, 0, 0, elevel,
2035
8.04k
               &head, &tail))
2036
0
    {
2037
      /* Syntax error(s) detected in the file, so bail out */
2038
0
      error = true;
2039
0
      ConfFileWithError = PG_AUTOCONF_FILENAME;
2040
0
      goto bail_out;
2041
0
    }
2042
8.04k
  }
2043
8.01k
  else
2044
8.01k
  {
2045
    /*
2046
     * If DataDir is not set, the PG_AUTOCONF_FILENAME file cannot be
2047
     * read.  In this case, we don't want to accept any settings but
2048
     * data_directory from postgresql.conf, because they might be
2049
     * overwritten with settings in the PG_AUTOCONF_FILENAME file which
2050
     * will be read later. OTOH, since data_directory isn't allowed in the
2051
     * PG_AUTOCONF_FILENAME file, it will never be overwritten later.
2052
     */
2053
8.01k
    ConfigVariable *newlist = NULL;
2054
2055
    /*
2056
     * Prune all items except the last "data_directory" from the list.
2057
     */
2058
62.1k
    for (item = head; item; 
item = item->next54.1k
)
2059
54.1k
    {
2060
54.1k
      if (!item->ignore &&
2061
54.1k
        strcmp(item->name, "data_directory") == 0)
2062
0
        newlist = item;
2063
54.1k
    }
2064
2065
8.01k
    if (newlist)
2066
0
      newlist->next = NULL;
2067
8.01k
    head = tail = newlist;
2068
2069
    /*
2070
     * Quick exit if data_directory is not present in file.
2071
     *
2072
     * We need not do any further processing, in particular we don't set
2073
     * PgReloadTime; that will be set soon by subsequent full loading of
2074
     * the config file.
2075
     */
2076
8.01k
    if (head == NULL)
2077
8.01k
      goto bail_out;
2078
8.01k
  }
2079
2080
  /*
2081
   * Mark all extant GUC variables as not present in the config file. We
2082
   * need this so that we can tell below which ones have been removed from
2083
   * the file since we last processed it.
2084
   */
2085
2.61M
  
for (i = 0; 8.04k
i < num_guc_variables;
i++2.60M
)
2086
2.60M
  {
2087
2.60M
    struct config_generic *gconf = guc_variables[i];
2088
2089
2.60M
    gconf->status &= ~GUC_IS_IN_FILE;
2090
2.60M
  }
2091
2092
  /*
2093
   * Check if all the supplied option names are valid, as an additional
2094
   * quasi-syntactic check on the validity of the config file.  It is
2095
   * important that the postmaster and all backends agree on the results of
2096
   * this phase, else we will have strange inconsistencies about which
2097
   * processes accept a config file update and which don't.  Hence, unknown
2098
   * custom variable names have to be accepted without complaint.  For the
2099
   * same reason, we don't attempt to validate the options' values here.
2100
   *
2101
   * In addition, the GUC_IS_IN_FILE flag is set on each existing GUC
2102
   * variable mentioned in the file; and we detect duplicate entries in the
2103
   * file and mark the earlier occurrences as ignorable.
2104
   */
2105
62.5k
  for (item = head; item; 
item = item->next54.5k
)
2106
54.5k
  {
2107
54.5k
    struct config_generic *record;
2108
2109
    /* Ignore anything already marked as ignorable */
2110
54.5k
    if (item->ignore)
2111
0
      continue;
2112
2113
    /*
2114
     * Try to find the variable; but do not create a custom placeholder if
2115
     * it's not there already.
2116
     */
2117
54.5k
    record = find_option(item->name, false, elevel);
2118
2119
54.5k
    if (record)
2120
54.5k
    {
2121
      /* If it's already marked, then this is a duplicate entry */
2122
54.5k
      if (record->status & GUC_IS_IN_FILE)
2123
25
      {
2124
        /*
2125
         * Mark the earlier occurrence(s) as dead/ignorable.  We could
2126
         * avoid the O(N^2) behavior here with some additional state,
2127
         * but it seems unlikely to be worth the trouble.
2128
         */
2129
25
        ConfigVariable *pitem;
2130
2131
396
        for (pitem = head; pitem != item; 
pitem = pitem->next371
)
2132
371
        {
2133
371
          if (!pitem->ignore &&
2134
371
            
strcmp(pitem->name, item->name) == 0362
)
2135
25
            pitem->ignore = true;
2136
371
        }
2137
25
      }
2138
      /* Now mark it as present in file */
2139
54.5k
      record->status |= GUC_IS_IN_FILE;
2140
54.5k
    }
2141
0
    else if (strchr(item->name, GUC_QUALIFIER_SEPARATOR) == NULL)
2142
0
    {
2143
      /* Invalid non-custom variable, so complain */
2144
0
      ereport(elevel,
2145
0
          (errcode(ERRCODE_UNDEFINED_OBJECT),
2146
0
           errmsg("unrecognized configuration parameter \"%s\" in file \"%s\" line %u",
2147
0
              item->name,
2148
0
              item->filename, item->sourceline)));
2149
0
      item->errmsg = pstrdup("unrecognized configuration parameter");
2150
0
      error = true;
2151
0
      ConfFileWithError = item->filename;
2152
0
    }
2153
54.5k
  }
2154
2155
  /*
2156
   * If we've detected any errors so far, we don't want to risk applying any
2157
   * changes.
2158
   */
2159
8.04k
  if (error)
2160
0
    goto bail_out;
2161
2162
  /* Otherwise, set flag that we're beginning to apply changes */
2163
8.04k
  applying = true;
2164
2165
  /*
2166
   * Check for variables having been removed from the config file, and
2167
   * revert their reset values (and perhaps also effective values) to the
2168
   * boot-time defaults.  If such a variable can't be changed after startup,
2169
   * report that and continue.
2170
   */
2171
2.61M
  for (i = 0; i < num_guc_variables; 
i++2.60M
)
2172
2.60M
  {
2173
2.60M
    struct config_generic *gconf = guc_variables[i];
2174
2.60M
    GucStack   *stack;
2175
2176
2.60M
    if (gconf->reset_source != PGC_S_FILE ||
2177
2.60M
      
(gconf->status & 389
GUC_IS_IN_FILE389
))
2178
2.60M
      continue;
2179
0
    if (gconf->context < PGC_SIGHUP)
2180
0
    {
2181
0
      ereport(elevel,
2182
0
          (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
2183
0
           errmsg("parameter \"%s\" cannot be changed without restarting the server",
2184
0
              gconf->name)));
2185
0
      record_config_file_error(psprintf("parameter \"%s\" cannot be changed without restarting the server",
2186
0
                        gconf->name),
2187
0
                   NULL, 0,
2188
0
                   &head, &tail);
2189
0
      error = true;
2190
0
      continue;
2191
0
    }
2192
2193
    /* No more to do if we're just doing show_all_file_settings() */
2194
0
    if (!applySettings)
2195
0
      continue;
2196
2197
    /*
2198
     * Reset any "file" sources to "default", else set_config_option will
2199
     * not override those settings.
2200
     */
2201
0
    if (gconf->reset_source == PGC_S_FILE)
2202
0
      gconf->reset_source = PGC_S_DEFAULT;
2203
0
    if (gconf->source == PGC_S_FILE)
2204
0
      gconf->source = PGC_S_DEFAULT;
2205
0
    for (stack = gconf->stack; stack; stack = stack->prev)
2206
0
    {
2207
0
      if (stack->source == PGC_S_FILE)
2208
0
        stack->source = PGC_S_DEFAULT;
2209
0
    }
2210
2211
    /* Now we can re-apply the wired-in default (i.e., the boot_val) */
2212
0
    if (set_config_option(gconf->name, NULL,
2213
0
                context, PGC_S_DEFAULT,
2214
0
                GUC_ACTION_SET, true, 0, false) > 0)
2215
0
    {
2216
      /* Log the change if appropriate */
2217
0
      if (context == PGC_SIGHUP)
2218
0
        ereport(elevel,
2219
0
            (errmsg("parameter \"%s\" removed from configuration file, reset to default",
2220
0
                gconf->name)));
2221
0
    }
2222
0
  }
2223
2224
  /*
2225
   * Restore any variables determined by environment variables or
2226
   * dynamically-computed defaults.  This is a no-op except in the case
2227
   * where one of these had been in the config file and is now removed.
2228
   *
2229
   * In particular, we *must not* do this during the postmaster's initial
2230
   * loading of the file, since the timezone functions in particular should
2231
   * be run only after initialization is complete.
2232
   *
2233
   * XXX this is an unmaintainable crock, because we have to know how to set
2234
   * (or at least what to call to set) every variable that could potentially
2235
   * have PGC_S_DYNAMIC_DEFAULT or PGC_S_ENV_VAR source. However, there's no
2236
   * time to redesign it for 9.1.
2237
   */
2238
8.04k
  if (context == PGC_SIGHUP && 
applySettings28
)
2239
26
  {
2240
26
    InitializeGUCOptionsFromEnvironment();
2241
26
    pg_timezone_abbrev_initialize();
2242
    /* this selects SQL_ASCII in processes not connected to a database */
2243
26
    SetConfigOption("client_encoding", GetDatabaseEncodingName(),
2244
26
            PGC_BACKEND, PGC_S_DYNAMIC_DEFAULT);
2245
26
  }
2246
2247
  /*
2248
   * Now apply the values from the config file.
2249
   */
2250
62.5k
  for (item = head; item; 
item = item->next54.5k
)
2251
54.5k
  {
2252
54.5k
    char     *pre_value = NULL;
2253
54.5k
    int     scres;
2254
2255
    /* Ignore anything marked as ignorable */
2256
54.5k
    if (item->ignore)
2257
25
      continue;
2258
2259
    /* In SIGHUP cases in the postmaster, we want to report changes */
2260
54.5k
    if (context == PGC_SIGHUP && 
applySettings396
&&
!IsUnderPostmaster368
)
2261
113
    {
2262
113
      const char *preval = GetConfigOption(item->name, true, false);
2263
2264
      /* If option doesn't exist yet or is NULL, treat as empty string */
2265
113
      if (!preval)
2266
0
        preval = "";
2267
      /* must dup, else might have dangling pointer below */
2268
113
      pre_value = pstrdup(preval);
2269
113
    }
2270
2271
54.5k
    scres = set_config_option(item->name, item->value,
2272
54.5k
                  context, PGC_S_FILE,
2273
54.5k
                  GUC_ACTION_SET, applySettings, 0, false);
2274
54.5k
    if (scres > 0)
2275
54.3k
    {
2276
      /* variable was updated, so log the change if appropriate */
2277
54.3k
      if (pre_value)
2278
81
      {
2279
81
        const char *post_value = GetConfigOption(item->name, true, false);
2280
2281
81
        if (!post_value)
2282
0
          post_value = "";
2283
81
        if (strcmp(pre_value, post_value) != 0)
2284
81
          ereport(elevel,
2285
81
              (errmsg("parameter \"%s\" changed to \"%s\"",
2286
81
                  item->name, item->value)));
2287
81
      }
2288
54.3k
      item->applied = true;
2289
54.3k
    }
2290
137
    else if (scres == 0)
2291
0
    {
2292
0
      error = true;
2293
0
      item->errmsg = pstrdup("setting could not be applied");
2294
0
      ConfFileWithError = item->filename;
2295
0
    }
2296
137
    else
2297
137
    {
2298
      /* no error, but variable's active value was not changed */
2299
137
      item->applied = true;
2300
137
    }
2301
2302
    /*
2303
     * We should update source location unless there was an error, since
2304
     * even if the active value didn't change, the reset value might have.
2305
     * (In the postmaster, there won't be a difference, but it does matter
2306
     * in backends.)
2307
     */
2308
54.5k
    
if (54.5k
scres != 054.5k
&& applySettings)
2309
54.4k
      set_config_sourcefile(item->name, item->filename,
2310
54.4k
                  item->sourceline);
2311
2312
54.5k
    if (pre_value)
2313
113
      pfree(pre_value);
2314
54.5k
  }
2315
2316
  /* Remember when we last successfully loaded the config file. */
2317
8.04k
  if (applySettings)
2318
8.04k
    PgReloadTime = GetCurrentTimestamp();
2319
2320
16.0k
bail_out:
2321
16.0k
  if (error && 
applySettings0
)
2322
0
  {
2323
    /* During postmaster startup, any error is fatal */
2324
0
    if (context == PGC_POSTMASTER)
2325
0
      ereport(ERROR,
2326
0
          (errcode(ERRCODE_CONFIG_FILE_ERROR),
2327
0
           errmsg("configuration file \"%s\" contains errors",
2328
0
              ConfFileWithError)));
2329
0
    else if (applying)
2330
0
      ereport(elevel,
2331
0
          (errcode(ERRCODE_CONFIG_FILE_ERROR),
2332
0
           errmsg("configuration file \"%s\" contains errors; unaffected changes were applied",
2333
0
              ConfFileWithError)));
2334
0
    else
2335
0
      ereport(elevel,
2336
0
          (errcode(ERRCODE_CONFIG_FILE_ERROR),
2337
0
           errmsg("configuration file \"%s\" contains errors; no changes were applied",
2338
0
              ConfFileWithError)));
2339
0
  }
2340
2341
  /* Successful or otherwise, return the collected data list */
2342
16.0k
  return head;
2343
16.0k
}
2344
2345
/*
2346
 * Given a configuration file or directory location that may be a relative
2347
 * path, return an absolute one.  We consider the location to be relative to
2348
 * the directory holding the calling file, or to DataDir if no calling file.
2349
 */
2350
static char *
2351
AbsoluteConfigLocation(const char *location, const char *calling_file)
2352
24.0k
{
2353
24.0k
  char    abs_path[MAXPGPATH];
2354
2355
24.0k
  if (is_absolute_path(location))
2356
16.0k
    return pstrdup(location);
2357
8.04k
  else
2358
8.04k
  {
2359
8.04k
    if (calling_file != NULL)
2360
0
    {
2361
0
      strlcpy(abs_path, calling_file, sizeof(abs_path));
2362
0
      get_parent_directory(abs_path);
2363
0
      join_path_components(abs_path, abs_path, location);
2364
0
      canonicalize_path(abs_path);
2365
0
    }
2366
8.04k
    else
2367
8.04k
    {
2368
8.04k
      AssertState(DataDir);
2369
8.04k
      join_path_components(abs_path, DataDir, location);
2370
8.04k
      canonicalize_path(abs_path);
2371
8.04k
    }
2372
8.04k
    return pstrdup(abs_path);
2373
8.04k
  }
2374
24.0k
}
2375
2376
/*
2377
 * Read and parse a single configuration file.  This function recurses
2378
 * to handle "include" directives.
2379
 *
2380
 * If "strict" is true, treat failure to open the config file as an error,
2381
 * otherwise just skip the file.
2382
 *
2383
 * calling_file/calling_lineno identify the source of the request.
2384
 * Pass NULL/0 if not recursing from an inclusion request.
2385
 *
2386
 * See ParseConfigFp for further details.  This one merely adds opening the
2387
 * config file rather than working from a caller-supplied file descriptor,
2388
 * and absolute-ifying the path name if necessary.
2389
 */
2390
bool
2391
ParseConfigFile(const char *config_file, bool strict,
2392
        const char *calling_file, int calling_lineno,
2393
        int depth, int elevel,
2394
        ConfigVariable **head_p,
2395
        ConfigVariable **tail_p)
2396
24.0k
{
2397
24.0k
  char     *abs_path;
2398
24.0k
  bool    OK = true;
2399
24.0k
  FILE     *fp;
2400
2401
  /*
2402
   * Reject too-deep include nesting depth.  This is just a safety check to
2403
   * avoid dumping core due to stack overflow if an include file loops back
2404
   * to itself.  The maximum nesting depth is pretty arbitrary.
2405
   */
2406
24.0k
  if (depth > 10)
2407
0
  {
2408
0
    ereport(elevel,
2409
0
        (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
2410
0
         errmsg("could not open configuration file \"%s\": maximum nesting depth exceeded",
2411
0
            config_file)));
2412
0
    record_config_file_error("nesting depth exceeded",
2413
0
                 calling_file, calling_lineno,
2414
0
                 head_p, tail_p);
2415
0
    return false;
2416
0
  }
2417
2418
24.0k
  abs_path = AbsoluteConfigLocation(config_file, calling_file);
2419
24.0k
  fp = AllocateFile(abs_path, "r");
2420
24.0k
  if (!fp)
2421
4.01k
  {
2422
4.01k
    if (strict)
2423
0
    {
2424
0
      ereport(elevel,
2425
0
          (errcode_for_file_access(),
2426
0
           errmsg("could not open configuration file \"%s\": %m",
2427
0
              abs_path)));
2428
0
      record_config_file_error(psprintf("could not open file \"%s\"",
2429
0
                        abs_path),
2430
0
                   calling_file, calling_lineno,
2431
0
                   head_p, tail_p);
2432
0
      OK = false;
2433
0
    }
2434
4.01k
    else
2435
4.01k
    {
2436
4.01k
      ereport(LOG,
2437
4.01k
          (errmsg("skipping missing configuration file \"%s\"",
2438
4.01k
              abs_path)));
2439
4.01k
    }
2440
4.01k
    goto cleanup;
2441
4.01k
  }
2442
2443
20.0k
  OK = ParseConfigFp(fp, abs_path, depth, elevel, head_p, tail_p);
2444
2445
24.0k
cleanup:
2446
24.0k
  if (fp)
2447
20.0k
    FreeFile(fp);
2448
24.0k
  pfree(abs_path);
2449
2450
24.0k
  return OK;
2451
20.0k
}
2452
2453
/*
2454
 * Capture an error message in the ConfigVariable list returned by
2455
 * config file parsing.
2456
 */
2457
static void
2458
record_config_file_error(const char *errmsg,
2459
             const char *config_file,
2460
             int lineno,
2461
             ConfigVariable **head_p,
2462
             ConfigVariable **tail_p)
2463
0
{
2464
0
  ConfigVariable *item;
2465
2466
0
  item = palloc(sizeof *item);
2467
0
  item->name = NULL;
2468
0
  item->value = NULL;
2469
0
  item->errmsg = pstrdup(errmsg);
2470
0
  item->filename = config_file ? pstrdup(config_file) : NULL;
2471
0
  item->sourceline = lineno;
2472
0
  item->ignore = true;
2473
0
  item->applied = false;
2474
0
  item->next = NULL;
2475
0
  if (*head_p == NULL)
2476
0
    *head_p = item;
2477
0
  else
2478
0
    (*tail_p)->next = item;
2479
0
  *tail_p = item;
2480
0
}
2481
2482
/*
2483
 * Flex fatal errors bring us here.  Stash the error message and jump back to
2484
 * ParseConfigFp().  Assume all msg arguments point to string constants; this
2485
 * holds for flex 2.5.31 (earliest we support) and flex 2.5.35 (latest as of
2486
 * this writing).  Otherwise, we would need to copy the message.
2487
 *
2488
 * We return "int" since this takes the place of calls to fprintf().
2489
*/
2490
static int
2491
GUC_flex_fatal(const char *msg)
2492
0
{
2493
0
  GUC_flex_fatal_errmsg = msg;
2494
0
  siglongjmp(*GUC_flex_fatal_jmp, 1);
2495
0
  return 0;         /* keep compiler quiet */
2496
0
}
2497
2498
/*
2499
 * Read and parse a single configuration file.  This function recurses
2500
 * to handle "include" directives.
2501
 *
2502
 * Input parameters:
2503
 *  fp: file pointer from AllocateFile for the configuration file to parse
2504
 *  config_file: absolute or relative path name of the configuration file
2505
 *  depth: recursion depth (should be 0 in the outermost call)
2506
 *  elevel: error logging level to use
2507
 * Input/Output parameters:
2508
 *  head_p, tail_p: head and tail of linked list of name/value pairs
2509
 *
2510
 * *head_p and *tail_p must be initialized, either to NULL or valid pointers
2511
 * to a ConfigVariable list, before calling the outer recursion level.  Any
2512
 * name-value pairs read from the input file(s) will be appended to the list.
2513
 * Error reports will also be appended to the list, if elevel < ERROR.
2514
 *
2515
 * Returns TRUE if successful, FALSE if an error occurred.  The error has
2516
 * already been ereport'd, it is only necessary for the caller to clean up
2517
 * its own state and release the ConfigVariable list.
2518
 *
2519
 * Note: if elevel >= ERROR then an error will not return control to the
2520
 * caller, so there is no need to check the return value in that case.
2521
 *
2522
 * Note: this function is used to parse not only postgresql.conf, but
2523
 * various other configuration files that use the same "name = value"
2524
 * syntax.  Hence, do not do anything here or in the subsidiary routines
2525
 * ParseConfigFile/ParseConfigDirectory that assumes we are processing
2526
 * GUCs specifically.
2527
 */
2528
bool
2529
ParseConfigFp(FILE *fp, const char *config_file, int depth, int elevel,
2530
        ConfigVariable **head_p, ConfigVariable **tail_p)
2531
20.1k
{
2532
20.1k
  volatile bool OK = true;
2533
20.1k
  unsigned int save_ConfigFileLineno = ConfigFileLineno;
2534
20.1k
  sigjmp_buf *save_GUC_flex_fatal_jmp = GUC_flex_fatal_jmp;
2535
20.1k
  sigjmp_buf  flex_fatal_jmp;
2536
20.1k
  volatile YY_BUFFER_STATE lex_buffer = NULL;
2537
20.1k
  int     errorcount;
2538
20.1k
  int     token;
2539
2540
20.1k
  if (sigsetjmp(flex_fatal_jmp, 1) == 0)
2541
20.1k
    GUC_flex_fatal_jmp = &flex_fatal_jmp;
2542
0
  else
2543
0
  {
2544
    /*
2545
     * Regain control after a fatal, internal flex error.  It may have
2546
     * corrupted parser state.  Consequently, abandon the file, but trust
2547
     * that the state remains sane enough for yy_delete_buffer().
2548
     */
2549
0
    elog(elevel, "%s at file \"%s\" line %u",
2550
0
       GUC_flex_fatal_errmsg, config_file, ConfigFileLineno);
2551
0
    record_config_file_error(GUC_flex_fatal_errmsg,
2552
0
                 config_file, ConfigFileLineno,
2553
0
                 head_p, tail_p);
2554
0
    OK = false;
2555
0
    goto cleanup;
2556
0
  }
2557
2558
  /*
2559
   * Parse
2560
   */
2561
20.1k
  ConfigFileLineno = 1;
2562
20.1k
  errorcount = 0;
2563
2564
20.1k
  lex_buffer = yy_create_buffer(fp, YY_BUF_SIZE);
2565
20.1k
  yy_switch_to_buffer(lex_buffer);
2566
2567
  /* This loop iterates once per logical line */
2568
5.69M
  while ((token = yylex()))
2569
5.67M
  {
2570
5.67M
    char     *opt_name = NULL;
2571
5.67M
    char     *opt_value = NULL;
2572
5.67M
    ConfigVariable *item;
2573
2574
5.67M
    if (token == GUC_EOL)  /* empty or comment line */
2575
5.56M
      continue;
2576
2577
    /* first token on line is option name */
2578
108k
    if (token != GUC_ID && 
token != GUC_QUALIFIED_ID0
)
2579
0
      goto parse_error;
2580
108k
    opt_name = pstrdup(yytext);
2581
2582
    /* next we have an optional equal sign; discard if present */
2583
108k
    token = yylex();
2584
108k
    if (token == GUC_EQUALS)
2585
108k
      token = yylex();
2586
2587
    /* now we must have the option value */
2588
108k
    if (token != GUC_ID &&
2589
108k
      
token != GUC_STRING100k
&&
2590
108k
      
token != GUC_INTEGER32.2k
&&
2591
108k
      
token != GUC_REAL0
&&
2592
108k
      
token != GUC_UNQUOTED_STRING0
)
2593
0
      goto parse_error;
2594
108k
    if (token == GUC_STRING)  /* strip quotes and escapes */
2595
68.5k
      opt_value = GUC_scanstr(yytext);
2596
40.4k
    else
2597
40.4k
      opt_value = pstrdup(yytext);
2598
2599
    /* now we'd like an end of line, or possibly EOF */
2600
108k
    token = yylex();
2601
108k
    if (token != GUC_EOL)
2602
0
    {
2603
0
      if (token != 0)
2604
0
        goto parse_error;
2605
      /* treat EOF like \n for line numbering purposes, cf bug 4752 */
2606
0
      ConfigFileLineno++;
2607
0
    }
2608
2609
    /* OK, process the option name and value */
2610
108k
    if (guc_name_compare(opt_name, "include_dir") == 0)
2611
0
    {
2612
      /*
2613
       * An include_dir directive isn't a variable and should be
2614
       * processed immediately.
2615
       */
2616
0
      if (!ParseConfigDirectory(opt_value,
2617
0
                    config_file, ConfigFileLineno - 1,
2618
0
                    depth + 1, elevel,
2619
0
                    head_p, tail_p))
2620
0
        OK = false;
2621
0
      yy_switch_to_buffer(lex_buffer);
2622
0
      pfree(opt_name);
2623
0
      pfree(opt_value);
2624
0
    }
2625
108k
    else if (guc_name_compare(opt_name, "include_if_exists") == 0)
2626
0
    {
2627
      /*
2628
       * An include_if_exists directive isn't a variable and should be
2629
       * processed immediately.
2630
       */
2631
0
      if (!ParseConfigFile(opt_value, false,
2632
0
                 config_file, ConfigFileLineno - 1,
2633
0
                 depth + 1, elevel,
2634
0
                 head_p, tail_p))
2635
0
        OK = false;
2636
0
      yy_switch_to_buffer(lex_buffer);
2637
0
      pfree(opt_name);
2638
0
      pfree(opt_value);
2639
0
    }
2640
108k
    else if (guc_name_compare(opt_name, "include") == 0)
2641
0
    {
2642
      /*
2643
       * An include directive isn't a variable and should be processed
2644
       * immediately.
2645
       */
2646
0
      if (!ParseConfigFile(opt_value, true,
2647
0
                 config_file, ConfigFileLineno - 1,
2648
0
                 depth + 1, elevel,
2649
0
                 head_p, tail_p))
2650
0
        OK = false;
2651
0
      yy_switch_to_buffer(lex_buffer);
2652
0
      pfree(opt_name);
2653
0
      pfree(opt_value);
2654
0
    }
2655
108k
    else
2656
108k
    {
2657
      /* ordinary variable, append to list */
2658
108k
      item = palloc(sizeof *item);
2659
108k
      item->name = opt_name;
2660
108k
      item->value = opt_value;
2661
108k
      item->errmsg = NULL;
2662
108k
      item->filename = pstrdup(config_file);
2663
108k
      item->sourceline = ConfigFileLineno - 1;
2664
108k
      item->ignore = false;
2665
108k
      item->applied = false;
2666
108k
      item->next = NULL;
2667
108k
      if (*head_p == NULL)
2668
8.08k
        *head_p = item;
2669
100k
      else
2670
100k
        (*tail_p)->next = item;
2671
108k
      *tail_p = item;
2672
108k
    }
2673
2674
    /* break out of loop if read EOF, else loop for next line */
2675
108k
    if (token == 0)
2676
0
      break;
2677
108k
    continue;
2678
2679
108k
parse_error:
2680
    /* release storage if we allocated any on this line */
2681
0
    if (opt_name)
2682
0
      pfree(opt_name);
2683
0
    if (opt_value)
2684
0
      pfree(opt_value);
2685
2686
    /* report the error */
2687
0
    if (token == GUC_EOL || token == 0)
2688
0
    {
2689
0
      ereport(elevel,
2690
0
          (errcode(ERRCODE_SYNTAX_ERROR),
2691
0
        errmsg("syntax error in file \"%s\" line %u, near end of line",
2692
0
           config_file, ConfigFileLineno - 1)));
2693
0
      record_config_file_error("syntax error",
2694
0
                   config_file, ConfigFileLineno - 1,
2695
0
                   head_p, tail_p);
2696
0
    }
2697
0
    else
2698
0
    {
2699
0
      ereport(elevel,
2700
0
          (errcode(ERRCODE_SYNTAX_ERROR),
2701
0
       errmsg("syntax error in file \"%s\" line %u, near token \"%s\"",
2702
0
          config_file, ConfigFileLineno, yytext)));
2703
0
      record_config_file_error("syntax error",
2704
0
                   config_file, ConfigFileLineno,
2705
0
                   head_p, tail_p);
2706
0
    }
2707
0
    OK = false;
2708
0
    errorcount++;
2709
2710
    /*
2711
     * To avoid producing too much noise when fed a totally bogus file,
2712
     * give up after 100 syntax errors per file (an arbitrary number).
2713
     * Also, if we're only logging the errors at DEBUG level anyway, might
2714
     * as well give up immediately.  (This prevents postmaster children
2715
     * from bloating the logs with duplicate complaints.)
2716
     */
2717
0
    if (errorcount >= 100 || elevel <= DEBUG1)
2718
0
    {
2719
0
      ereport(elevel,
2720
0
          (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
2721
0
         errmsg("too many syntax errors found, abandoning file \"%s\"",
2722
0
            config_file)));
2723
0
      break;
2724
0
    }
2725
2726
    /* resync to next end-of-line or EOF */
2727
0
    while (token != GUC_EOL && token != 0)
2728
0
      token = yylex();
2729
    /* break out of loop on EOF */
2730
0
    if (token == 0)
2731
0
      break;
2732
0
  }
2733
2734
20.1k
cleanup:
2735
20.1k
  yy_delete_buffer(lex_buffer);
2736
  /* Each recursion level must save and restore these static variables. */
2737
20.1k
  ConfigFileLineno = save_ConfigFileLineno;
2738
20.1k
  GUC_flex_fatal_jmp = save_GUC_flex_fatal_jmp;
2739
20.1k
  return OK;
2740
20.1k
}
2741
2742
/*
2743
 * Read and parse all config files in a subdirectory in alphabetical order
2744
 *
2745
 * includedir is the absolute or relative path to the subdirectory to scan.
2746
 *
2747
 * calling_file/calling_lineno identify the source of the request.
2748
 * Pass NULL/0 if not recursing from an inclusion request.
2749
 *
2750
 * See ParseConfigFp for further details.
2751
 */
2752
bool
2753
ParseConfigDirectory(const char *includedir,
2754
           const char *calling_file, int calling_lineno,
2755
           int depth, int elevel,
2756
           ConfigVariable **head_p,
2757
           ConfigVariable **tail_p)
2758
0
{
2759
0
  char     *directory;
2760
0
  DIR      *d;
2761
0
  struct dirent *de;
2762
0
  char    **filenames;
2763
0
  int     num_filenames;
2764
0
  int     size_filenames;
2765
0
  bool    status;
2766
2767
0
  directory = AbsoluteConfigLocation(includedir, calling_file);
2768
0
  d = AllocateDir(directory);
2769
0
  if (d == NULL)
2770
0
  {
2771
0
    ereport(elevel,
2772
0
        (errcode_for_file_access(),
2773
0
         errmsg("could not open configuration directory \"%s\": %m",
2774
0
            directory)));
2775
0
    record_config_file_error(psprintf("could not open directory \"%s\"",
2776
0
                      directory),
2777
0
                 calling_file, calling_lineno,
2778
0
                 head_p, tail_p);
2779
0
    status = false;
2780
0
    goto cleanup;
2781
0
  }
2782
2783
  /*
2784
   * Read the directory and put the filenames in an array, so we can sort
2785
   * them prior to processing the contents.
2786
   */
2787
0
  size_filenames = 32;
2788
0
  filenames = (char **) palloc(size_filenames * sizeof(char *));
2789
0
  num_filenames = 0;
2790
2791
0
  while ((de = ReadDir(d, directory)) != NULL)
2792
0
  {
2793
0
    struct stat st;
2794
0
    char    filename[MAXPGPATH];
2795
2796
    /*
2797
     * Only parse files with names ending in ".conf".  Explicitly reject
2798
     * files starting with ".".  This excludes things like "." and "..",
2799
     * as well as typical hidden files, backup files, and editor debris.
2800
     */
2801
0
    if (strlen(de->d_name) < 6)
2802
0
      continue;
2803
0
    if (de->d_name[0] == '.')
2804
0
      continue;
2805
0
    if (strcmp(de->d_name + strlen(de->d_name) - 5, ".conf") != 0)
2806
0
      continue;
2807
2808
0
    join_path_components(filename, directory, de->d_name);
2809
0
    canonicalize_path(filename);
2810
0
    if (stat(filename, &st) == 0)
2811
0
    {
2812
0
      if (!S_ISDIR(st.st_mode))
2813
0
      {
2814
        /* Add file to array, increasing its size in blocks of 32 */
2815
0
        if (num_filenames >= size_filenames)
2816
0
        {
2817
0
          size_filenames += 32;
2818
0
          filenames = (char **) repalloc(filenames,
2819
0
                      size_filenames * sizeof(char *));
2820
0
        }
2821
0
        filenames[num_filenames] = pstrdup(filename);
2822
0
        num_filenames++;
2823
0
      }
2824
0
    }
2825
0
    else
2826
0
    {
2827
      /*
2828
       * stat does not care about permissions, so the most likely reason
2829
       * a file can't be accessed now is if it was removed between the
2830
       * directory listing and now.
2831
       */
2832
0
      ereport(elevel,
2833
0
          (errcode_for_file_access(),
2834
0
           errmsg("could not stat file \"%s\": %m",
2835
0
              filename)));
2836
0
      record_config_file_error(psprintf("could not stat file \"%s\"",
2837
0
                        filename),
2838
0
                   calling_file, calling_lineno,
2839
0
                   head_p, tail_p);
2840
0
      status = false;
2841
0
      goto cleanup;
2842
0
    }
2843
0
  }
2844
2845
0
  if (num_filenames > 0)
2846
0
  {
2847
0
    int     i;
2848
2849
0
    qsort(filenames, num_filenames, sizeof(char *), pg_qsort_strcmp);
2850
0
    for (i = 0; i < num_filenames; i++)
2851
0
    {
2852
0
      if (!ParseConfigFile(filenames[i], true,
2853
0
                 calling_file, calling_lineno,
2854
0
                 depth, elevel,
2855
0
                 head_p, tail_p))
2856
0
      {
2857
0
        status = false;
2858
0
        goto cleanup;
2859
0
      }
2860
0
    }
2861
0
  }
2862
0
  status = true;
2863
2864
0
cleanup:
2865
0
  if (d)
2866
0
    FreeDir(d);
2867
0
  pfree(directory);
2868
0
  return status;
2869
0
}
2870
2871
/*
2872
 * Free a list of ConfigVariables, including the names and the values
2873
 */
2874
void
2875
FreeConfigVariables(ConfigVariable *list)
2876
61
{
2877
61
  ConfigVariable *item;
2878
2879
61
  item = list;
2880
312
  while (item)
2881
251
  {
2882
251
    ConfigVariable *next = item->next;
2883
2884
251
    FreeConfigVariable(item);
2885
251
    item = next;
2886
251
  }
2887
61
}
2888
2889
/*
2890
 * Free a single ConfigVariable
2891
 */
2892
static void
2893
FreeConfigVariable(ConfigVariable *item)
2894
251
{
2895
251
  if (item->name)
2896
251
    pfree(item->name);
2897
251
  if (item->value)
2898
251
    pfree(item->value);
2899
251
  if (item->errmsg)
2900
0
    pfree(item->errmsg);
2901
251
  if (item->filename)
2902
251
    pfree(item->filename);
2903
251
  pfree(item);
2904
251
}
2905
2906
2907
/*
2908
 *    scanstr
2909
 *
2910
 * Strip the quotes surrounding the given string, and collapse any embedded
2911
 * '' sequences and backslash escapes.
2912
 *
2913
 * the string returned is palloc'd and should eventually be pfree'd by the
2914
 * caller.
2915
 */
2916
static char *
2917
GUC_scanstr(const char *s)
2918
68.5k
{
2919
68.5k
  char     *newStr;
2920
68.5k
  int     len,
2921
68.5k
        i,
2922
68.5k
        j;
2923
2924
68.5k
  Assert(s != NULL && s[0] == '\'');
2925
68.5k
  len = strlen(s);
2926
68.5k
  Assert(len >= 2);
2927
68.5k
  Assert(s[len - 1] == '\'');
2928
2929
  /* Skip the leading quote; we'll handle the trailing quote below */
2930
68.5k
  s++, len--;
2931
2932
  /* Since len still includes trailing quote, this is enough space */
2933
68.5k
  newStr = palloc(len);
2934
2935
1.13M
  for (i = 0, j = 0; i < len; 
i++1.06M
)
2936
1.06M
  {
2937
1.06M
    if (s[i] == '\\')
2938
0
    {
2939
0
      i++;
2940
0
      switch (s[i])
2941
0
      {
2942
0
        case 'b':
2943
0
          newStr[j] = '\b';
2944
0
          break;
2945
0
        case 'f':
2946
0
          newStr[j] = '\f';
2947
0
          break;
2948
0
        case 'n':
2949
0
          newStr[j] = '\n';
2950
0
          break;
2951
0
        case 'r':
2952
0
          newStr[j] = '\r';
2953
0
          break;
2954
0
        case 't':
2955
0
          newStr[j] = '\t';
2956
0
          break;
2957
0
        case '0':
2958
0
        case '1':
2959
0
        case '2':
2960
0
        case '3':
2961
0
        case '4':
2962
0
        case '5':
2963
0
        case '6':
2964
0
        case '7':
2965
0
          {
2966
0
            int     k;
2967
0
            long    octVal = 0;
2968
2969
0
            for (k = 0;
2970
0
               s[i + k] >= '0' && s[i + k] <= '7' && k < 3;
2971
0
               k++)
2972
0
              octVal = (octVal << 3) + (s[i + k] - '0');
2973
0
            i += k - 1;
2974
0
            newStr[j] = ((char) octVal);
2975
0
          }
2976
0
          break;
2977
0
        default:
2978
0
          newStr[j] = s[i];
2979
0
          break;
2980
0
      }         /* switch */
2981
0
    }
2982
1.06M
    else if (s[i] == '\'' && 
s[i + 1] == '\''68.5k
)
2983
0
    {
2984
      /* doubled quote becomes just one quote */
2985
0
      newStr[j] = s[++i];
2986
0
    }
2987
1.06M
    else
2988
1.06M
      newStr[j] = s[i];
2989
1.06M
    j++;
2990
1.06M
  }
2991
2992
  /* We copied the ending quote to newStr, so replace with \0 */
2993
68.5k
  Assert(j > 0 && j <= len);
2994
68.5k
  newStr[--j] = '\0';
2995
2996
68.5k
  return newStr;
2997
68.5k
}
2998