Alexandre Julliard : wrc: Add support for loading multiple input files at once.

Alexandre Julliard julliard at winehq.org
Mon Jun 22 09:04:13 CDT 2009


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Jun 22 12:05:57 2009 +0200

wrc: Add support for loading multiple input files at once.

---

 tools/wrc/parser.h   |    1 +
 tools/wrc/parser.l   |    2 +
 tools/wrc/parser.y   |   20 +++++--
 tools/wrc/wrc.c      |  154 ++++++++++++++++++++++++++-----------------------
 tools/wrc/wrc.man.in |    4 +-
 5 files changed, 102 insertions(+), 79 deletions(-)

diff --git a/tools/wrc/parser.h b/tools/wrc/parser.h
index b9e2045..e9fc8e6 100644
--- a/tools/wrc/parser.h
+++ b/tools/wrc/parser.h
@@ -34,5 +34,6 @@ extern char *parser_text;
 extern int yy_flex_debug;
 
 int parser_lex(void);
+int parser_lex_destroy(void);
 
 #endif
diff --git a/tools/wrc/parser.l b/tools/wrc/parser.l
index bddc309..e706100 100644
--- a/tools/wrc/parser.l
+++ b/tools/wrc/parser.l
@@ -121,6 +121,8 @@ cident	[a-zA-Z_][0-9a-zA-Z_]*
 /* Always update the current character position within a line */
 #define YY_USER_ACTION	char_number+=yyleng; wanted_id = want_id; want_id = 0;
 
+#define YY_USER_INIT current_codepage = -1;
+
 static void addcchar(char c);
 static void addwchar(WCHAR s);
 static string_t *get_buffered_cstring(void);
diff --git a/tools/wrc/parser.y b/tools/wrc/parser.y
index 512d272..f891f24 100644
--- a/tools/wrc/parser.y
+++ b/tools/wrc/parser.y
@@ -169,12 +169,12 @@
 
 int want_nl = 0;	/* Signal flex that we need the next newline */
 int want_id = 0;	/* Signal flex that we need the next identifier */
-stringtable_t *tagstt;	/* Stringtable tag.
+static stringtable_t *tagstt;	/* Stringtable tag.
 			 * It is set while parsing a stringtable to one of
 			 * the stringtables in the sttres list or a new one
 			 * if the language was not parsed before.
 			 */
-stringtable_t *sttres;	/* Stringtable resources. This holds the list of
+static stringtable_t *sttres;	/* Stringtable resources. This holds the list of
 			 * stringtables with different lanuages
 			 */
 static int dont_want_id = 0;	/* See language parsing for details */
@@ -358,7 +358,7 @@ static int rsrcid_to_token(int lookahead);
 
 resource_file
 	: resources {
-		resource_t *rsc;
+		resource_t *rsc, *head;
 		/* First add stringtables to the resource-list */
 		rsc = build_stt_resources(sttres);
 		/* 'build_stt_resources' returns a head and $1 is a tail */
@@ -384,8 +384,18 @@ resource_file
 		}
 		else
 			$1 = rsc;
-		/* Final statement before were done */
-		resource_top = get_resource_head($1);
+
+		/* Final statements before were done */
+                head = get_resource_head($1);
+                if (resource_top)  /* append to existing resources */
+                {
+                    resource_t *tail = resource_top;
+                    while (tail->next) tail = tail->next;
+                    tail->next = head;
+                    head->prev = tail;
+                }
+                else resource_top = head;
+                sttres = NULL;
 		}
 	;
 
diff --git a/tools/wrc/wrc.c b/tools/wrc/wrc.c
index 05bd3f8..833d602 100644
--- a/tools/wrc/wrc.c
+++ b/tools/wrc/wrc.c
@@ -232,6 +232,68 @@ static void exit_on_signal( int sig )
     exit(1);  /* this will call the atexit functions */
 }
 
+/* load a single input file */
+static int load_file( const char *input_name, const char *output_name )
+{
+    int ret;
+
+    /* Run the preprocessor on the input */
+    if(!no_preprocess)
+    {
+        /*
+         * Preprocess the input to a temp-file, or stdout if
+         * no output was given.
+         */
+
+        chat("Starting preprocess\n");
+
+        if (!preprocess_only)
+        {
+            ret = wpp_parse_temp( input_name, output_name, &temp_name );
+        }
+        else if (output_name)
+        {
+            FILE *output;
+
+            if (!(output = fopen( output_name, "w" )))
+                fatal_perror( "Could not open %s for writing", output_name );
+            ret = wpp_parse( input_name, output );
+            fclose( output );
+        }
+        else
+        {
+            ret = wpp_parse( input_name, stdout );
+        }
+
+        if (ret) return ret;
+
+        if(preprocess_only)
+        {
+            output_name = NULL;
+            exit(0);
+        }
+
+        input_name = temp_name;
+    }
+
+    /* Go from .rc to .res */
+    chat("Starting parse\n");
+
+    if(!(parser_in = fopen(input_name, "rb")))
+        fatal_perror("Could not open %s for input", input_name);
+
+    ret = parser_parse();
+    fclose(parser_in);
+    parser_lex_destroy();
+    if (temp_name)
+    {
+        unlink( temp_name );
+        temp_name = NULL;
+    }
+    return ret;
+}
+
+
 int main(int argc,char *argv[])
 {
 	extern char* optarg;
@@ -240,7 +302,6 @@ int main(int argc,char *argv[])
 	int opti = 0;
 	int stdinc = 1;
 	int lose = 0;
-	int ret;
 	int i;
 	int cmdlen;
 
@@ -402,20 +463,6 @@ int main(int argc,char *argv[])
 		wpp_add_include_path(INCLUDEDIR"/msvcrt");
 		wpp_add_include_path(INCLUDEDIR"/windows");
 	}
-	
-	/* Check for input file on command-line */
-	if(optind < argc)
-	{
-		if (!input_name) input_name = argv[optind++];
-		else error("Too many input files.\n");
-	}
-
-	/* Check for output file on command-line */
-	if(optind < argc)
-	{
-		if (!output_name) output_name = argv[optind++];
-		else error("Too many output files.\n");
-	}
 
 	/* Kill io buffering when some kind of debuglevel is enabled */
 	if(debuglevel)
@@ -435,65 +482,28 @@ int main(int argc,char *argv[])
 	if(!currentlanguage)
 		currentlanguage = new_language(0, 0);
 
-	/* Generate appropriate outfile names */
-	if(!output_name && !preprocess_only)
-	{
-		output_name = dup_basename(input_name, ".rc");
-		strcat(output_name, ".res");
-	}
 	atexit(cleanup_files);
 
-	/* Run the preprocessor on the input */
-	if(!no_preprocess)
-	{
-		/*
-		 * Preprocess the input to a temp-file, or stdout if
-		 * no output was given.
-		 */
-
-		chat("Starting preprocess\n");
-
-                if (!preprocess_only)
-                {
-                    ret = wpp_parse_temp( input_name, output_name, &temp_name );
-                }
-                else if (output_name)
-                {
-                    FILE *output;
-
-                    if (!(output = fopen( output_name, "w" )))
-                        fatal_perror( "Could not open %s for writing", output_name );
-                    ret = wpp_parse( input_name, output );
-                    fclose( output );
-                }
-                else
-                {
-                    ret = wpp_parse( input_name, stdout );
-                }
-
-		if(ret)
-			exit(1);	/* Error during preprocess */
-
-		if(preprocess_only)
-		{
-			output_name = NULL;
-			exit(0);
-		}
-
-		input_name = temp_name;
-	}
-
-	/* Go from .rc to .res */
-	chat("Starting parse\n");
-
-	if(!(parser_in = fopen(input_name, "rb")))
-            fatal_perror("Could not open %s for input", input_name);
-
-	ret = parser_parse();
-
-	if(input_name) fclose(parser_in);
-
-	if(ret) exit(1); /* Error during parse */
+        if (input_name)  /* specified with -i option */
+        {
+            if(!output_name && !preprocess_only)
+            {
+		output_name = dup_basename(input_name, ".rc");
+		strcat(output_name, ".res");
+            }
+            if (load_file( input_name, output_name )) exit(1);
+        }
+
+        while (optind < argc)
+        {
+            input_name = argv[optind++];
+            if(!output_name && !preprocess_only)
+            {
+		output_name = dup_basename(input_name, ".rc");
+		strcat(output_name, ".res");
+            }
+            if (load_file( input_name, output_name )) exit(1);
+        }
 
 	if(debuglevel & DEBUGLEVEL_DUMP)
 		dump_resources(resource_top);
diff --git a/tools/wrc/wrc.man.in b/tools/wrc/wrc.man.in
index 7dfefc0..5c8d0c0 100644
--- a/tools/wrc/wrc.man.in
+++ b/tools/wrc/wrc.man.in
@@ -3,7 +3,7 @@
 .SH NAME
 wrc \- Wine Resource Compiler
 .SH SYNOPSIS
-.BI "wrc " "[options] " "[inputfile]"
+.BI "wrc " "[options] " "[inputfiles]"
 .SH DESCRIPTION
 .B wrc
 compiles resources from \fBinputfile\fR
@@ -14,7 +14,7 @@ preprocessor before the resources are compiled. See \fBPREPROCESSOR\fR
 below.
 .PP
 .B wrc
-takes only one \fBinputfile\fR as argument. The resources are read from 
+takes a series of \fBinputfile\fR as argument. The resources are read from 
 standard input if no inputfile is given. If the output file is not 
 specified with \fI-o\fR, then \fBwrc\fR will write the output to 
 \fBinputfile.res\fR with \fB.rc\fR stripped, or to \fBwrc.tab.res\fR if 




More information about the wine-cvs mailing list