*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.157 2008/01/01 19:45:59 momjian Exp $
+ * $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.158 2008/01/11 15:19:16 meskes Exp $
*
*-------------------------------------------------------------------------
*/
static int xcdepth = 0; /* depth of nesting in slash-star comments */
static char *dolqstart; /* current $foo$ quote start string */
static bool escape_string_warning;
-static bool warn_on_first_escape;
static YY_BUFFER_STATE scanbufhandle;
static char *scanbuf;
static void addlit(char *ytext, int yleng);
static void addlitchar (unsigned char);
static void parse_include (void);
-static void check_escape_warning(void);
static bool ecpg_isspace(char ch);
static bool isdefine(void);
static bool isinformixdefine(void);
* delimited identifiers (double-quoted identifiers) - thomas 1997-10-27
* hexadecimal numeric string - thomas 1997-11-16
* standard quoted strings - thomas 1997-07-30
+ * standard quoted strings in C - michael
* extended quoted strings (support backslash escape sequences)
* national character quoted strings
* $foo$ quoted strings
%x xe
%x xn
%x xq
+%x xqc
%x xdolq
%x xcond
%x xskip
*/
xqstart {quote}
xqdouble {quote}{quote}
+xqcquote [\\]{quote}
xqinside [^']+
/* $foo$ style quotes ("dollar quoting")
/* National character.
* Transfer it as-is to the backend.
*/
- warn_on_first_escape = true;
- token_start = yytext;
+ token_start = yytext;
state_before = YYSTATE;
BEGIN(xn);
startlit();
}
{xqstart} {
- warn_on_first_escape = false;
token_start = yytext;
state_before = YYSTATE;
- BEGIN(xq);
+ BEGIN(xqc);
startlit();
}
{xqstart} {
- warn_on_first_escape = true;
token_start = yytext;
state_before = YYSTATE;
BEGIN(xq);
startlit();
}
{xestart} {
- warn_on_first_escape = false;
token_start = yytext;
state_before = YYSTATE;
BEGIN(xe);
startlit();
}
-{quotestop} |
-{quotefail} {
+,xqc>{quotestop} |
+,xqc>{quotefail} {
yyless(1);
BEGIN(state_before);
yylval.str = mm_strdup(literalbuf);
yylval.str = mm_strdup(literalbuf);
return NCONST;
}
-{xqdouble} { addlitchar('\''); }
-{xqinside} { addlit(yytext, yyleng); }
-{xeinside} { addlit(yytext, yyleng); }
-{xeescape} {
- check_escape_warning();
- addlit(yytext, yyleng);
+{xqdouble} { addlitchar('\''); }
+{xqcquote} {
+ addlitchar('\\');
+ addlitchar('\'');
}
-{xeoctesc} {
- check_escape_warning();
- addlit(yytext, yyleng);
- }
-{xehexesc} {
- check_escape_warning();
- addlit(yytext, yyleng);
- }
-{quotecontinue} { /* ignore */ }
+{xqinside} { addlit(yytext, yyleng); }
+{xeinside} { addlit(yytext, yyleng); }
+{xeescape} { addlit(yytext, yyleng); }
+{xeoctesc} { addlit(yytext, yyleng); }
+{xehexesc} { addlit(yytext, yyleng); }
+{quotecontinue} { /* ignore */ }
. {
/* This is only needed for \ just before EOF */
addlitchar(yytext[0]);
}
-e,xn><> { mmerror(PARSE_ERROR, ET_FATAL, "Unterminated quoted string"); }
+qc,xe,xn><> { mmerror(PARSE_ERROR, ET_FATAL, "Unterminated quoted string"); }
{dolqfailed} {
/* throw back all but the initial "$" */
yyless(1);
BEGIN(C);
}
-static void
-check_escape_warning(void)
-{
- if (warn_on_first_escape && escape_string_warning)
- mmerror (PARSE_ERROR, ET_WARNING, "nonstandard use of escape in a string literal");
- warn_on_first_escape = false; /* warn only once per string */
-}
-
/*
* ecpg_isspace() --- return TRUE if flex scanner considers char whitespace
*/