Fix plpgsql lexer to accept Windows-style and Mac-style newlines as
authorTom Lane
Tue, 22 Aug 2000 14:59:28 +0000 (14:59 +0000)
committerTom Lane
Tue, 22 Aug 2000 14:59:28 +0000 (14:59 +0000)
newlines.

src/pl/plpgsql/src/scan.l

index 7256ba78707cfaae70068c257a980bc456a8bffb..a3eae579205268cbba543b9adfdc446c40c50e68 100644 (file)
@@ -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;
 }
-
-