Eric Pouech : winhelp: Allow MACRO_Execute to be called recursively.

Alexandre Julliard julliard at winehq.org
Mon Jul 14 05:57:06 CDT 2008


Module: wine
Branch: master
Commit: 81168297e2eb077e011b5c0f2078e8506ab31e90
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=81168297e2eb077e011b5c0f2078e8506ab31e90

Author: Eric Pouech <eric.pouech at orange.fr>
Date:   Sat Jul 12 10:37:19 2008 +0200

winhelp: Allow MACRO_Execute to be called recursively.

---

 programs/winhlp32/macro.lex.l |   65 ++++++++++++++++++++++------------------
 1 files changed, 36 insertions(+), 29 deletions(-)

diff --git a/programs/winhlp32/macro.lex.l b/programs/winhlp32/macro.lex.l
index 83457b5..f3366b0 100644
--- a/programs/winhlp32/macro.lex.l
+++ b/programs/winhlp32/macro.lex.l
@@ -3,7 +3,7 @@
  * Help Viewer
  *
  * Copyright 1996 Ulrich Schmid
- * Copyright 2002 Eric Pouech
+ * Copyright 2002,2008 Eric Pouech
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -36,16 +36,20 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(winhelp);
 
-static LPCSTR  macroptr;
-static LPSTR   strptr;
-static int     quote_stack[32];
-static unsigned int quote_stk_idx = 0;
-static LPSTR   cache_string[32];
-static int     cache_used;
+struct lex_data {
+    LPCSTR   macroptr;
+    LPSTR    strptr;
+    int      quote_stack[32];
+    unsigned quote_stk_idx;
+    LPSTR    cache_string[32];
+    int      cache_used;
+};
+static struct lex_data* lex_data = NULL;
+
 struct lexret  yylval;
 
 #define YY_INPUT(buf,result,max_size)\
-  if ((result = *macroptr ? 1 : 0)) buf[0] = *macroptr++;
+  if ((result = *lex_data->macroptr ? 1 : 0)) buf[0] = *lex_data->macroptr++;
 
 %}
 %%
@@ -61,39 +65,39 @@ struct lexret  yylval;
 <quote>\`   |
 <quote>\"   |
 <quote>\'   {
-    if (quote_stk_idx == 0 ||
-        (yytext[0] == '\"' && quote_stack[quote_stk_idx - 1] != '\"') ||
+    if (lex_data->quote_stk_idx == 0 ||
+        (yytext[0] == '\"' && lex_data->quote_stack[lex_data->quote_stk_idx - 1] != '\"') ||
         (yytext[0] == '`'))
     {
         /* opening a new one */
-        if (quote_stk_idx == 0)
+        if (lex_data->quote_stk_idx == 0)
         {
-            assert(cache_used < sizeof(cache_string) / sizeof(cache_string[0]));
-            strptr = cache_string[cache_used] = HeapAlloc(GetProcessHeap(), 0, strlen(macroptr) + 1);
-            yylval.string = strptr;
-            cache_used++;
+            assert(lex_data->cache_used < sizeof(lex_data->cache_string) / sizeof(lex_data->cache_string[0]));
+            lex_data->strptr = lex_data->cache_string[lex_data->cache_used] = HeapAlloc(GetProcessHeap(), 0, strlen(lex_data->macroptr) + 1);
+            yylval.string = lex_data->strptr;
+            lex_data->cache_used++;
             BEGIN(quote);
         }
-        else *strptr++ = yytext[0];
-        quote_stack[quote_stk_idx++] = yytext[0];
-        assert(quote_stk_idx < sizeof(quote_stack) / sizeof(quote_stack[0]));
+        else *lex_data->strptr++ = yytext[0];
+        lex_data->quote_stack[lex_data->quote_stk_idx++] = yytext[0];
+        assert(lex_data->quote_stk_idx < sizeof(lex_data->quote_stack) / sizeof(lex_data->quote_stack[0]));
     }
     else
     {
         if (yytext[0] == '`') assert(0);
         /* close the current quote */
-        if (--quote_stk_idx == 0)
+        if (--lex_data->quote_stk_idx == 0)
         {
             BEGIN INITIAL;
-            *strptr++ = '\0';
+            *lex_data->strptr++ = '\0';
             return STRING;
         }
-        else *strptr++ = yytext[0];
+        else *lex_data->strptr++ = yytext[0];
     }
 }
 
-<quote>.                *strptr++ = yytext[0];
-<quote>\\.	        *strptr++ = yytext[1];
+<quote>.                *lex_data->strptr++ = yytext[0];
+<quote>\\.	        *lex_data->strptr++ = yytext[1];
 <quote><<EOF>>	        return 0;
 
 " "
@@ -264,12 +268,17 @@ static int MACRO_CallVoidFunc(FARPROC fn, const char* args)
 
 BOOL MACRO_ExecuteMacro(LPCSTR macro)
 {
+    struct lex_data     curr_lex_data, *prev_lex_data;
     BOOL ret = TRUE;
     int t;
 
     WINE_TRACE("%s\n", wine_dbgstr_a(macro));
 
-    macroptr = macro;
+    prev_lex_data = lex_data;
+    lex_data = &curr_lex_data;
+
+    memset(lex_data, 0, sizeof(*lex_data));
+    lex_data->macroptr = macro;
 
     while ((t = yylex()) != EMPTY)
     {
@@ -295,11 +304,9 @@ BOOL MACRO_ExecuteMacro(LPCSTR macro)
     }
 
 done:
-    strptr = NULL;
-    quote_stk_idx = 0;
-    for (t = 0; t < cache_used; t++)
-        HeapFree(GetProcessHeap(), 0, cache_string[t]);
-    cache_used = 0;
+    for (t = 0; t < lex_data->cache_used; t++)
+        HeapFree(GetProcessHeap(), 0, lex_data->cache_string[t]);
+    lex_data = prev_lex_data;
 
     return ret;
 }




More information about the wine-cvs mailing list