Fix plpgsql lexer to accept Windows-style and Mac-style newlines as

newlines.
This commit is contained in:
Tom Lane 2000-08-22 14:59:28 +00:00
parent 84d0865d03
commit f9b2f9bb76
1 changed files with 45 additions and 28 deletions

View File

@ -4,7 +4,7 @@
* procedural language * procedural language
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/pl/plpgsql/src/Attic/scan.l,v 1.4 2000/06/20 16:40:10 petere Exp $ * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/Attic/scan.l,v 1.5 2000/08/22 14:59:28 tgl Exp $
* *
* This software is copyrighted by Jan Wieck - Hamburg. * This software is copyrighted by Jan Wieck - Hamburg.
* *
@ -40,11 +40,13 @@ static char *plpgsql_source;
static int plpgsql_bytes_left; static int plpgsql_bytes_left;
static int scanner_functype; static int scanner_functype;
static int scanner_typereported; static int scanner_typereported;
int plpgsql_SpaceScanned = 0; int plpgsql_SpaceScanned = 0;
extern int yylineno; extern int yylineno;
static void plpgsql_input(char *buf, int *result, int max); static void plpgsql_input(char *buf, int *result, int max);
#define YY_INPUT(buf,res,max) plpgsql_input(buf, &res, max) #define YY_INPUT(buf,res,max) plpgsql_input(buf, &res, max)
#define YY_NO_UNPUT #define YY_NO_UNPUT
%} %}
@ -74,37 +76,38 @@ WC [[:alnum:]_"]
* functions type (T_FUNCTION or T_TRIGGER) * functions type (T_FUNCTION or T_TRIGGER)
* ---------- * ----------
*/ */
if (!scanner_typereported) { if (!scanner_typereported)
scanner_typereported = 1; {
return scanner_functype; scanner_typereported = 1;
} return scanner_functype;
}
/* ---------- /* ----------
* The keyword rules * The keyword rules
* ---------- * ----------
*/ */
:= { return K_ASSIGN; } := { return K_ASSIGN; }
= { return K_ASSIGN; } = { return K_ASSIGN; }
\.\. { return K_DOTDOT; } \.\. { return K_DOTDOT; }
alias { return K_ALIAS; } alias { return K_ALIAS; }
begin { return K_BEGIN; } begin { return K_BEGIN; }
bpchar { return T_BPCHAR; } bpchar { return T_BPCHAR; }
char { return T_CHAR; } char { return T_CHAR; }
constant { return K_CONSTANT; } constant { return K_CONSTANT; }
debug { return K_DEBUG; } debug { return K_DEBUG; }
declare { return K_DECLARE; } declare { return K_DECLARE; }
default { return K_DEFAULT; } default { return K_DEFAULT; }
else { return K_ELSE; } else { return K_ELSE; }
end { return K_END; } end { return K_END; }
exception { return K_EXCEPTION; } exception { return K_EXCEPTION; }
exit { return K_EXIT; } exit { return K_EXIT; }
for { return K_FOR; } for { return K_FOR; }
from { return K_FROM; } from { return K_FROM; }
if { return K_IF; } if { return K_IF; }
in { return K_IN; } in { return K_IN; }
into { return K_INTO; } into { return K_INTO; }
loop { return K_LOOP; } loop { return K_LOOP; }
not { return K_NOT; } not { return K_NOT; }
notice { return K_NOTICE; } notice { return K_NOTICE; }
null { return K_NULL; } null { return K_NULL; }
perform { return K_PERFORM; } perform { return K_PERFORM; }
@ -115,7 +118,7 @@ return { return K_RETURN; }
reverse { return K_REVERSE; } reverse { return K_REVERSE; }
select { return K_SELECT; } select { return K_SELECT; }
then { return K_THEN; } then { return K_THEN; }
to { return K_TO; } to { return K_TO; }
type { return K_TYPE; } type { return K_TYPE; }
varchar { return T_VARCHAR; } varchar { return T_VARCHAR; }
when { return K_WHEN; } when { return K_WHEN; }
@ -143,13 +146,13 @@ dump { return O_DUMP; }
* Ignore whitespaces but remember this happened * Ignore whitespaces but remember this happened
* ---------- * ----------
*/ */
[ \t\n]+ { plpgsql_SpaceScanned = 1; } [ \t\r\n]+ { plpgsql_SpaceScanned = 1; }
/* ---------- /* ----------
* Eat up comments * Eat up comments
* ---------- * ----------
*/ */
--[^\n]* ; --[^\r\n]* ;
\/\* { start_lineno = yylineno; \/\* { start_lineno = yylineno;
BEGIN IN_COMMENT; BEGIN IN_COMMENT;
} }
@ -188,22 +191,25 @@ dump { return O_DUMP; }
%% %%
int yywrap() int
yywrap()
{ {
return 1; return 1;
} }
static void plpgsql_input(char *buf, int *result, int max) static void
plpgsql_input(char *buf, int *result, int max)
{ {
int n = max; int n = max;
if (n > plpgsql_bytes_left) {
n = plpgsql_bytes_left;
}
if (n == 0) { if (n > plpgsql_bytes_left)
n = plpgsql_bytes_left;
if (n == 0)
{
*result = YY_NULL; *result = YY_NULL;
return; return;
} }
*result = n; *result = n;
@ -213,18 +219,29 @@ static void plpgsql_input(char *buf, int *result, int max)
} }
void plpgsql_setinput(char *source, int functype) void
plpgsql_setinput(char *source, int functype)
{ {
yyrestart(NULL); yyrestart(NULL);
yylineno = 1; yylineno = 1;
plpgsql_source = source; plpgsql_source = source;
/*----------
* Hack: skip any initial newline, so that in the common coding layout
* CREATE FUNCTION ... AS '
* code body
* ' LANGUAGE 'plpgsql';
* we will think "line 1" is what the programmer thinks of as line 1.
*----------
*/
if (*plpgsql_source == '\r')
plpgsql_source++;
if (*plpgsql_source == '\n') if (*plpgsql_source == '\n')
plpgsql_source++; plpgsql_source++;
plpgsql_bytes_left = strlen(plpgsql_source); plpgsql_bytes_left = strlen(plpgsql_source);
scanner_functype = functype; scanner_functype = functype;
scanner_typereported = 0; scanner_typereported = 0;
} }