Jacek Caban : winegcc: Add support for @file arguments.

Alexandre Julliard julliard at winehq.org
Tue May 26 17:17:05 CDT 2020


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon May 25 20:34:08 2020 +0200

winegcc: Add support for @file arguments.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 tools/winegcc/winegcc.c | 40 +++++++++++++++++++++++++++++++++++++++-
 1 file changed, 39 insertions(+), 1 deletion(-)

diff --git a/tools/winegcc/winegcc.c b/tools/winegcc/winegcc.c
index d350adc724..a1ba034009 100644
--- a/tools/winegcc/winegcc.c
+++ b/tools/winegcc/winegcc.c
@@ -1623,7 +1623,45 @@ int main(int argc, char **argv)
     
     for (i = 1; i < argc; i++)
     {
-        strarray_add( opts.args, argv[i] );
+        char *input_buffer = NULL, *iter, *opt, *out;
+        struct stat st;
+        int fd;
+
+        if (argv[i][0] != '@' || (fd = open( argv[i] + 1, O_RDONLY | O_BINARY )) == -1)
+        {
+            strarray_add( opts.args, argv[i] );
+            continue;
+        }
+        if ((fstat( fd, &st ) == -1)) error( "Cannot stat %s", argv[i] + 1 );
+        if (st.st_size)
+        {
+            input_buffer = xmalloc( st.st_size + 1 );
+            if (read( fd, input_buffer, st.st_size ) != st.st_size) error( "Cannot read %s\n", argv[i] + 1 );
+        }
+        close( fd );
+        for (iter = input_buffer; iter < input_buffer + st.st_size; iter++)
+        {
+            char quote = 0;
+            while (iter < input_buffer + st.st_size && isspace(*iter)) iter++;
+            if (iter == input_buffer + st.st_size) break;
+            opt = out = iter;
+            while (iter < input_buffer + st.st_size && (quote || !isspace(*iter)))
+            {
+                if (*iter == quote)
+                {
+                    iter++;
+                    quote = 0;
+                }
+                else if (*iter == '\'' || *iter == '"') quote = *iter++;
+                else
+                {
+                    if (*iter == '\\' && iter + 1 < input_buffer + st.st_size) iter++;
+                    *out++ = *iter++;
+                }
+            }
+            *out = 0;
+            strarray_add( opts.args, opt );
+        }
     }
 
     /* parse options */




More information about the wine-cvs mailing list