[5/6] wpp: Remove the assumption pp_internal_error calls exit()

Matteo Bruni matteo.mystral at gmail.com
Thu Sep 10 10:41:24 CDT 2009


-------------- next part --------------
From da9c639ba4338eb5ce4c773b85ce6380f8087b7c Mon Sep 17 00:00:00 2001
From: Matteo Bruni <matteo.mystral at gmail.com>
Date: Sun, 6 Sep 2009 00:26:58 +0200
Subject: wpp: Remove the assumption pp_internal_error calls exit()

---
 libs/wpp/ppl.l     |   32 +++++++++++++++++++++++++++-----
 libs/wpp/preproc.c |    4 ++++
 2 files changed, 31 insertions(+), 5 deletions(-)

diff --git a/libs/wpp/ppl.l b/libs/wpp/ppl.l
index d303118..c458489 100644
--- a/libs/wpp/ppl.l
+++ b/libs/wpp/ppl.l
@@ -553,10 +553,13 @@ void writestring( const char *format, ... )
 <pp_macign>{ws}*\\\r?\n	newline(0);
 <pp_macign>{ws}+|{ws}*\\\r?|.	{
 		macexpstackentry_t *mac = pop_macro();
-		yy_pop_state();
-		put_buffer(mac->ppp->ident, strlen(mac->ppp->ident));
-		put_buffer(ppy_text, ppy_leng);
-		free_macro(mac);
+		if(mac)
+		{
+			yy_pop_state();
+			put_buffer(mac->ppp->ident, strlen(mac->ppp->ident));
+			put_buffer(ppy_text, ppy_leng);
+			free_macro(mac);
+		}
 	}
 
 	/*
@@ -783,7 +786,8 @@ void writestring( const char *format, ... )
 		{
 			macexpstackentry_t *mac;
 			mac = pop_macro();
-			expand_macro(mac);
+			if(mac)
+				expand_macro(mac);
 		}
 		ppy__delete_buffer(b);
 	}
@@ -990,7 +994,10 @@ static void expand_special(pp_entry_t *ppp)
 		sprintf(buf, "\"%s\"", pp_status.input);
 	}
 	else
+	{
 		pp_internal_error(__FILE__, __LINE__, "Special macro '%s' not found...\n", ppp->ident);
+		return;
+	}
 
 	if(pp_flex_debug)
 		fprintf(stderr, "expand_special(%d): %s:%d: '%s' -> '%s'\n",
@@ -1298,7 +1305,10 @@ static void push_buffer(pp_entry_t *ppp, char *filename, char *incname, int pop)
 	if(ppy_debug)
 		printf("push_buffer(%d): %p %p %p %d\n", bufferstackidx, ppp, filename, incname, pop);
 	if(bufferstackidx >= MAXBUFFERSTACK)
+	{
 		pp_internal_error(__FILE__, __LINE__, "Buffer stack overflow");
+		return;
+	}
 
 	memset(&bufferstack[bufferstackidx], 0, sizeof(bufferstack[0]));
 	bufferstack[bufferstackidx].bufferstate	= YY_CURRENT_BUFFER;
@@ -1324,14 +1334,20 @@ static void push_buffer(pp_entry_t *ppp, char *filename, char *incname, int pop)
 		ncontinuations = 0;
 	}
 	else if(!pop)
+	{
 		pp_internal_error(__FILE__, __LINE__, "Pushing buffer without knowing where to go to");
+		return;
+	}
 	bufferstackidx++;
 }
 
 static bufferstackentry_t *pop_buffer(void)
 {
 	if(bufferstackidx < 0)
+	{
 		pp_internal_error(__FILE__, __LINE__, "Bufferstack underflow?");
+		return NULL;
+	}
 
 	if(bufferstackidx == 0)
 		return NULL;
@@ -1400,7 +1416,10 @@ static bufferstackentry_t *pop_buffer(void)
 		if(yy_current_state() == pp_macexp)
 			macro_add_expansion();
 		else
+		{
 			pp_internal_error(__FILE__, __LINE__, "Pop buffer and state without macro expansion state");
+			return &bufferstack[bufferstackidx];
+		}
 		yy_pop_state();
 	}
 
@@ -1437,7 +1456,10 @@ static macexpstackentry_t *top_macro(void)
 static macexpstackentry_t *pop_macro(void)
 {
 	if(macexpstackidx <= 0)
+	{
 		pp_internal_error(__FILE__, __LINE__, "Macro expansion stack underflow\n");
+		return NULL;
+	}
 	return macexpstack[--macexpstackidx];
 }
 
diff --git a/libs/wpp/preproc.c b/libs/wpp/preproc.c
index 1c1e582..2eb055d 100644
--- a/libs/wpp/preproc.c
+++ b/libs/wpp/preproc.c
@@ -585,7 +585,10 @@ static const char * const pp_if_state_str[] = {
 void pp_push_if(pp_if_state_t s)
 {
 	if(if_stack_idx >= MAXIFSTACK)
+	{
 		pp_internal_error(__FILE__, __LINE__, "#if-stack overflow; #{if,ifdef,ifndef} nested too deeply (> %d)", MAXIFSTACK);
+		return;
+	}
 
 	if(pp_flex_debug)
 		fprintf(stderr, "Push if %s:%d: %s(%d) -> %s(%d)\n", pp_status.input, pp_status.line_number, pp_if_state_str[pp_if_state()], if_stack_idx, pp_if_state_str[s], if_stack_idx+1);
@@ -629,6 +632,7 @@ pp_if_state_t pp_pop_if(void)
 		break;
 	default:
 		pp_internal_error(__FILE__, __LINE__, "Invalid pp_if_state (%d)", (int)pp_if_state());
+		return if_error;
 	}
 
 	if(pp_flex_debug)
-- 
1.6.3.3


More information about the wine-patches mailing list