aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2000-08-22 14:59:28 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2000-08-22 14:59:28 +0000
commitf9b2f9bb760780997e5433960ae86f577ccd8914 (patch)
tree5559ec77049a41196bf38b93df668d85cbdcb433 /src
parent84d0865d03af861a6652709504f61131026e0c3f (diff)
downloadpostgresql-f9b2f9bb760780997e5433960ae86f577ccd8914.tar.gz
postgresql-f9b2f9bb760780997e5433960ae86f577ccd8914.zip
Fix plpgsql lexer to accept Windows-style and Mac-style newlines as
newlines.
Diffstat (limited to 'src')
-rw-r--r--src/pl/plpgsql/src/scan.l71
1 files changed, 44 insertions, 27 deletions
diff --git a/src/pl/plpgsql/src/scan.l b/src/pl/plpgsql/src/scan.l
index 7256ba78707..a3eae579205 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) {
+ int n = max;
+
+ if (n > plpgsql_bytes_left)
n = plpgsql_bytes_left;
- }
- if (n == 0) {
+ 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;
}
-
-