From: | Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us> |
---|---|
To: | Larry Rosenman <ler(at)lerctr(dot)org> |
Cc: | Peter Eisentraut <peter_e(at)gmx(dot)net>, PostgreSQL Hackers List <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Re: Syslog Facility Patch |
Date: | 2000-11-16 05:50:00 |
Message-ID: | 200011160550.AAA00290@candle.pha.pa.us |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
Applied.
> Here is one with a stray character removed.
>
>
> Index: src/backend/utils/misc/guc-file.l
> ===================================================================
> RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/utils/misc/guc-file.l,v
> retrieving revision 1.4
> diff -c -r1.4 guc-file.l
> *** src/backend/utils/misc/guc-file.l 2000/07/27 19:49:18 1.4
> --- src/backend/utils/misc/guc-file.l 2000/11/15 19:50:32
> ***************
> *** 16,21 ****
> --- 16,22 ----
> #include <sys/stat.h>
> #include <unistd.h>
> #include <errno.h>
> + #include <ctype.h>
>
> #include "miscadmin.h"
> #include "storage/fd.h"
> ***************
> *** 32,37 ****
> --- 33,39 ----
> GUC_INTEGER = 3,
> GUC_REAL = 4,
> GUC_EQUALS = 5,
> + GUC_UNQUOTED_STRING = 6,
> GUC_EOL = 99,
> GUC_ERROR = 100
> };
> ***************
> *** 45,51 ****
>
> /* prototype, so compiler is happy with our high warnings setting */
> int GUC_yylex(void);
> !
> %}
>
> SIGN ("-"|"+")
> --- 47,53 ----
>
> /* prototype, so compiler is happy with our high warnings setting */
> int GUC_yylex(void);
> ! char *GUC_scanstr(char *);
> %}
>
> SIGN ("-"|"+")
> ***************
> *** 61,77 ****
> LETTER_OR_DIGIT [A-Za-z_0-9\200-\377]
>
> ID {LETTER}{LETTER_OR_DIGIT}*
> - /*
> - * FIXME: This string syntax is nice and all but of course the quotes
> - * need to be stripped before we can make any use of the string value.
> - * There is a function in parser/scansup.c that does this but it uses
> - * palloc and there might be a little more magic needed to get it to
> - * work right. Now there are no string options, and if there were then
> - * the unquoted (`ID') tokens should still work. Of course this only
> - * affects the configuration file.
> - */
> - STRING \'([^'\n]|\\.)*'
>
> %%
>
> \n ConfigFileLineno++; return GUC_EOL;
> --- 63,72 ----
> LETTER_OR_DIGIT [A-Za-z_0-9\200-\377]
>
> ID {LETTER}{LETTER_OR_DIGIT}*
>
> + UNQUOTED_STRING {LETTER}({LETTER_OR_DIGIT}|[-._:/])*
> + STRING \'([^'"\n]|\\.)*\'
> +
> %%
>
> \n ConfigFileLineno++; return GUC_EOL;
> ***************
> *** 80,85 ****
> --- 75,81 ----
>
> {ID} return GUC_ID;
> {STRING} return GUC_STRING;
> + {UNQUOTED_STRING} return GUC_UNQUOTED_STRING;
> {INTEGER} return GUC_INTEGER;
> {REAL} return GUC_REAL;
> = return GUC_EQUALS;
> ***************
> *** 139,145 ****
> int elevel;
> FILE * fp;
>
> ! Assert(context == PGC_POSTMASTER || context == PGC_BACKEND || context == PGC_SIGHUP);
> Assert(DataDir);
> elevel = (context == PGC_SIGHUP) ? DEBUG : ERROR;
>
> --- 135,142 ----
> int elevel;
> FILE * fp;
>
> ! Assert(context == PGC_POSTMASTER || context == PGC_BACKEND
> ! || context == PGC_SIGHUP);
> Assert(DataDir);
> elevel = (context == PGC_SIGHUP) ? DEBUG : ERROR;
>
> ***************
> *** 210,220 ****
> if (token == GUC_EQUALS)
> token = yylex();
>
> ! if (token != GUC_ID && token != GUC_STRING && token != GUC_INTEGER && token != GUC_REAL)
> goto parse_error;
> opt_value = strdup(yytext);
> if (opt_value == NULL)
> goto out_of_memory;
> parse_state = 2;
> break;
>
> --- 207,230 ----
> if (token == GUC_EQUALS)
> token = yylex();
>
> ! if (token != GUC_ID && token != GUC_STRING &&
> ! token != GUC_INTEGER && token != GUC_REAL &&
> ! token != GUC_UNQUOTED_STRING)
> goto parse_error;
> opt_value = strdup(yytext);
> if (opt_value == NULL)
> goto out_of_memory;
> + if (token == GUC_STRING)
> + {
> + /* remove the beginning and ending quote/apostrophe */
> + /* first: shift the whole shooting match down one
> + character */
> + memmove(opt_value,opt_value+1,strlen(opt_value)-1);
> + /* second: null out the 2 characters we shifted */
> + opt_value[strlen(opt_value)-2]='\0';
> + /* do the escape thing. free()'s the strdup above */
> + opt_value=GUC_scanstr(opt_value);
> + }
> parse_state = 2;
> break;
>
> ***************
> *** 266,272 ****
> FreeFile(fp);
> free(filename);
> free_name_value_list(head);
> ! elog(elevel, CONFIG_FILENAME ":%u: syntax error", ConfigFileLineno);
> return;
>
> out_of_memory:
> --- 276,283 ----
> FreeFile(fp);
> free(filename);
> free_name_value_list(head);
> ! elog(elevel, CONFIG_FILENAME ":%u: syntax error, token=\"%s\"",
> ! ConfigFileLineno,yytext);
> return;
>
> out_of_memory:
> ***************
> *** 283,286 ****
> --- 294,382 ----
> yywrap(void)
> {
> return 1;
> + }
> +
> + /* ----------------
> + * scanstr
> + *
> + * if the string passed in has escaped codes, map the escape codes to actual
> + * chars
> + *
> + * the string returned is malloc'd and should eventually be free'd by the
> + * caller!
> + * ----------------
> + */
> +
> + char *
> + GUC_scanstr(char *s)
> + {
> + char *newStr;
> + int len,
> + i,
> + j;
> +
> + if (s == NULL || s[0] == '\0')
> + {
> + if (s != NULL) free (s);
> + return strdup("");
> +
> + }
> + len = strlen(s);
> +
> + newStr = malloc(len + 1); /* string cannot get longer */
> +
> + for (i = 0, j = 0; i < len; i++)
> + {
> + if (s[i] == '\\')
> + {
> + i++;
> + switch (s[i])
> + {
> + case 'b':
> + newStr[j] = '\b';
> + break;
> + case 'f':
> + newStr[j] = '\f';
> + break;
> + case 'n':
> + newStr[j] = '\n';
> + break;
> + case 'r':
> + newStr[j] = '\r';
> + break;
> + case 't':
> + newStr[j] = '\t';
> + break;
> + case '0':
> + case '1':
> + case '2':
> + case '3':
> + case '4':
> + case '5':
> + case '6':
> + case '7':
> + {
> + int k;
> + long octVal = 0;
> +
> + for (k = 0;
> + s[i + k] >= '0' && s[i + k] <= '7' && k < 3;
> + k++)
> + octVal = (octVal << 3) + (s[i + k] - '0');
> + i += k - 1;
> + newStr[j] = ((char) octVal);
> + }
> + break;
> + default:
> + newStr[j] = s[i];
> + break;
> + }
> + } /* switch */
> + else
> + newStr[j] = s[i];
> + j++;
> + }
> + newStr[j] = '\0';
> + free(s);
> + return newStr;
> }
> --
> Larry Rosenman http://www.lerctr.org/~ler
> Phone: +1 972-414-9812 (voice) Internet: ler(at)lerctr(dot)org
> US Mail: 1905 Steamboat Springs Drive, Garland, TX 75044-6749
>
--
Bruce Momjian | http://candle.pha.pa.us
pgman(at)candle(dot)pha(dot)pa(dot)us | (610) 853-3000
+ If your life is a hard drive, | 830 Blythe Avenue
+ Christ can be your backup. | Drexel Hill, Pennsylvania 19026
From | Date | Subject | |
---|---|---|---|
Next Message | Bruce Momjian | 2000-11-16 06:01:30 | Re: Re: [PATCHES] A Patch for MIC to EUC_TW code converting in mbsupport |
Previous Message | Bruce Momjian | 2000-11-16 05:49:05 | Re: Syslog Facility Patch |