From 1c6fb40e79a1344c35dcc69b292f9b6913cd4e95 Mon Sep 17 00:00:00 2001
From: Michael Banack <bob5972 at gmail.com>
Date: Fri, 9 Apr 2010 17:56:05 -0700
Subject: Changed the lexer to copy string values out of yytext.

Fixes BerliOS bug #14257.
---
 rcfile_l.l | 54 +++++++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 41 insertions(+), 13 deletions(-)

diff --git a/rcfile_l.l b/rcfile_l.l
index d40648d5..6854851b 100644
--- a/rcfile_l.l
+++ b/rcfile_l.l
@@ -32,18 +32,36 @@ int prc_lineno = 1;
 %%
 
 \"[^\"]*\"	{
-			yytext[yyleng-1] = '\0';
-			escapes(yytext+1, yytext);
-			yyleng = strlen(yytext);
-			yylval.sval = yytext;
+			static char *in = NULL;
+			static size_t ins = 0;
+
+			if ((size_t)yyleng + 1 > ins) {
+			    ins = yyleng + 1;
+			    in = (char *)xrealloc(in, ins);
+			}
+			memcpy(in, yytext, yyleng);
+
+			in[yyleng-1] = '\0';
+			escapes(in+1, in);
+			yyleng = strlen(in);
+			yylval.sval = in;
                         SETSTATE(0);
 			return STRING;
 		}
 \'[^\']*\'	{
-			yytext[yyleng-1] = '\0';
-			escapes(yytext+1, yytext);
-			yyleng = strlen(yytext);
-			yylval.sval = yytext;
+			static char *in = NULL;
+			static size_t ins = 0;
+
+			if ((size_t)yyleng + 1 > ins) {
+			    ins = yyleng + 1;
+			    in = (char *)xrealloc(in, ins);
+			}
+			memcpy(in, yytext, yyleng);
+
+			in[yyleng-1] = '\0';
+			escapes(in+1, in);
+			yyleng = strlen(in);
+			yylval.sval = in;
                         SETSTATE(0);
 			return STRING;
 		}
@@ -51,8 +69,8 @@ int prc_lineno = 1;
 "*"		{ BEGIN(0); return WILDCARD; }
 
 <NAME>[^=;:, \t\r\n]+	{
-			static char *in;
-			static size_t ins;
+			static char *in = NULL;
+			static size_t ins = 0;
 
 			if ((size_t)yyleng + 1 > ins) {
 			    ins = yyleng + 1;
@@ -220,9 +238,19 @@ options		{/* EMPTY */}
 -?[0-9]+	{ yylval.number = atoi(yytext); return NUMBER; }
 
 [^=;:, \t\r\n]+	{
-			escapes(yytext, yytext);
-			yyleng = strlen(yytext);
-			yylval.sval = yytext;
+			static char *in = NULL;
+			static size_t ins = 0;
+
+			if ((size_t)yyleng + 1 > ins) {
+			    ins = yyleng + 1;
+			    in = (char *)xrealloc(in, ins);
+			}
+			memcpy(in, yytext, yyleng);
+			in[yyleng] = '\0';
+
+			escapes(in, in);
+			yyleng = strlen(in);
+			yylval.sval = in;
 			return STRING;
 		}
 
-- 
cgit v1.2.3