From f9b2f9bb760780997e5433960ae86f577ccd8914 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 22 Aug 2000 14:59:28 +0000 Subject: [PATCH] Fix plpgsql lexer to accept Windows-style and Mac-style newlines as newlines. --- src/pl/plpgsql/src/scan.l | 73 ++++++++++++++++++++++++--------------- 1 file changed, 45 insertions(+), 28 deletions(-) diff --git a/src/pl/plpgsql/src/scan.l b/src/pl/plpgsql/src/scan.l index 7256ba7870..a3eae57920 100644 --- a/src/pl/plpgsql/src/scan.l +++ b/src/pl/plpgsql/src/scan.l @@ -4,7 +4,7 @@ * procedural language * * 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. * @@ -40,11 +40,13 @@ static char *plpgsql_source; static int plpgsql_bytes_left; static int scanner_functype; static int scanner_typereported; + int plpgsql_SpaceScanned = 0; extern int yylineno; static void plpgsql_input(char *buf, int *result, int max); + #define YY_INPUT(buf,res,max) plpgsql_input(buf, &res, max) #define YY_NO_UNPUT %} @@ -74,37 +76,38 @@ WC [[:alnum:]_"] * functions type (T_FUNCTION or T_TRIGGER) * ---------- */ - if (!scanner_typereported) { - scanner_typereported = 1; - return scanner_functype; - } + if (!scanner_typereported) + { + scanner_typereported = 1; + return scanner_functype; + } /* ---------- * The keyword rules * ---------- */ -:= { return K_ASSIGN; } -= { return K_ASSIGN; } +:= { return K_ASSIGN; } += { return K_ASSIGN; } \.\. { return K_DOTDOT; } alias { return K_ALIAS; } begin { return K_BEGIN; } bpchar { return T_BPCHAR; } char { return T_CHAR; } -constant { return K_CONSTANT; } +constant { return K_CONSTANT; } debug { return K_DEBUG; } declare { return K_DECLARE; } default { return K_DEFAULT; } else { return K_ELSE; } -end { return K_END; } -exception { return K_EXCEPTION; } +end { return K_END; } +exception { return K_EXCEPTION; } exit { return K_EXIT; } -for { return K_FOR; } +for { return K_FOR; } from { return K_FROM; } -if { return K_IF; } -in { return K_IN; } +if { return K_IF; } +in { return K_IN; } into { return K_INTO; } loop { return K_LOOP; } -not { return K_NOT; } +not { return K_NOT; } notice { return K_NOTICE; } null { return K_NULL; } perform { return K_PERFORM; } @@ -115,7 +118,7 @@ return { return K_RETURN; } reverse { return K_REVERSE; } select { return K_SELECT; } then { return K_THEN; } -to { return K_TO; } +to { return K_TO; } type { return K_TYPE; } varchar { return T_VARCHAR; } when { return K_WHEN; } @@ -143,13 +146,13 @@ dump { return O_DUMP; } * Ignore whitespaces but remember this happened * ---------- */ -[ \t\n]+ { plpgsql_SpaceScanned = 1; } +[ \t\r\n]+ { plpgsql_SpaceScanned = 1; } /* ---------- * Eat up comments * ---------- */ ---[^\n]* ; +--[^\r\n]* ; \/\* { start_lineno = yylineno; BEGIN IN_COMMENT; } @@ -188,22 +191,25 @@ dump { return O_DUMP; } %% -int yywrap() +int +yywrap() { 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; - if (n > plpgsql_bytes_left) { - n = plpgsql_bytes_left; - } + int n = max; - if (n == 0) { + if (n > plpgsql_bytes_left) + n = plpgsql_bytes_left; + + if (n == 0) + { *result = YY_NULL; - return; + return; } *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); yylineno = 1; 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') plpgsql_source++; + plpgsql_bytes_left = strlen(plpgsql_source); scanner_functype = functype; scanner_typereported = 0; } - -