Re: Syslog Facility Patch - Mailing list pgsql-hackers

From Bruce Momjian
Subject Re: Syslog Facility Patch
Date
Msg-id 200011160550.AAA00290@candle.pha.pa.us
Whole thread Raw
In response to Re: Syslog Facility Patch  (Larry Rosenman <ler@lerctr.org>)
List 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@lerctr.org
> US Mail: 1905 Steamboat Springs Drive, Garland, TX 75044-6749
> 


--  Bruce Momjian                        |  http://candle.pha.pa.us pgman@candle.pha.pa.us               |  (610)
853-3000+  If your life is a hard drive,     |  830 Blythe Avenue +  Christ can be your backup.        |  Drexel Hill,
Pennsylvania19026
 


pgsql-hackers by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: Syslog Facility Patch
Next
From: Bruce Momjian
Date:
Subject: Re: Re: [PATCHES] A Patch for MIC to EUC_TW code converting in mbsupport