From d10b5ecfc4b3a37e67c2ee43450adf944a8c4941 Mon Sep 17 00:00:00 2001
From: Lionel Debroux <lionel_debroux@yahoo.fr>
Date: Sun, 28 Dec 2008 18:04:04 +0100
Subject: tprbuilder: under *nix, escape shell metacharacters in command lines.
 This way, a data variable named "a\a" in the TPR works properly (previously, "a\\a" had to be used instead).

---
 trunk/tigcc/tprbuilder/src/tprbuilder.c |   54 +++++++++++++++++++++++++++++++
 1 files changed, 54 insertions(+), 0 deletions(-)

diff --git a/trunk/tigcc/tprbuilder/src/tprbuilder.c b/trunk/tigcc/tprbuilder/src/tprbuilder.c
index 5de76fe..81cb8d3 100644
--- a/trunk/tigcc/tprbuilder/src/tprbuilder.c
+++ b/trunk/tigcc/tprbuilder/src/tprbuilder.c
@@ -371,6 +371,46 @@ int delete(char *filename)
     return 0;
 }
 
+#ifndef __WIN32__
+/*
+   Escape command line.
+*/
+static inline void escape_arg(char *escaped_arg, const char *unescaped_arg)
+{
+    char *p;
+    strcpy(escaped_arg,unescaped_arg);
+    for (p=escaped_arg; *p; p++) {
+        switch (*p) {
+            /* The following characters are shell characters and need to be escaped! */
+            case '\\':
+            case '\"':
+            case '\'':
+            case '$':
+            case '!':
+            case '^':
+            case '&':
+            case '*':
+            case '(':
+            case ')':
+            case '~':
+            case '[':
+            case ']':
+            case '|':
+            case '{':
+            case '}':
+            case ';':
+            case '<':
+            case '>':
+            case '?':
+                memmove(p+1,p,strlen(p)+1);
+                *(p++)='\\';
+            default:
+                break;
+        }
+    }
+}
+#endif
+
 /*
    Execute a program by calling the shell
 */
@@ -380,9 +420,22 @@ int execute(char *cmdline)
         fprintf(stderr, "tprbuilder: %s\n", cmdline);
     }
 
+#ifndef __WIN32__
+    /* Under *nix, we need to escape shell metacharacters. */
+    char escapedcmdline[((strlen(cmdline))<<1)+1];
+    escape_arg(escapedcmdline,cmdline);
+    if (!quiet) {
+        fprintf(stderr, "tprbuilder: %s\n", escapedcmdline);
+    }
+
+    if(system(escapedcmdline) != 0) {
+        exit(0);
+    }
+#else
     if(system(cmdline) != 0) {
         exit(0);
     }
+#endif
 
     return 0;
 }
@@ -426,6 +479,7 @@ char* strip(char *str)
     return str;
 }
 
+
 /*
    Print an error msg
 */
-- 
1.6.1.15.g159c88


