You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mt...@apache.org on 2009/09/10 13:20:55 UTC

svn commit: r813369 - in /commons/sandbox/runtime/trunk/src/main/native: include/acr_port.h port/shquote.c

Author: mturk
Date: Thu Sep 10 11:20:54 2009
New Revision: 813369

URL: http://svn.apache.org/viewvc?rev=813369&view=rev
Log:
Add strquote that is mandatory for windows cmdlines

Modified:
    commons/sandbox/runtime/trunk/src/main/native/include/acr_port.h
    commons/sandbox/runtime/trunk/src/main/native/port/shquote.c

Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr_port.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr_port.h?rev=813369&r1=813368&r2=813369&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr_port.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr_port.h Thu Sep 10 11:20:54 2009
@@ -118,6 +118,7 @@
 size_t shquote(const char *, char *, size_t);
 size_t shquotev(int, char * const *, char *, size_t);
 #endif
+size_t strquote(const char *, char *, size_t);
+size_t wcsquote(const wchar_t *, wchar_t *, size_t);
 
 #endif /* _ACR_PORT_H */
-

Modified: commons/sandbox/runtime/trunk/src/main/native/port/shquote.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/port/shquote.c?rev=813369&r1=813368&r2=813369&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/port/shquote.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/port/shquote.c Thu Sep 10 11:20:54 2009
@@ -78,11 +78,9 @@
 #include "acr_arch.h"
 #include "acr_port.h"
 
-#if defined(ACR_WANT_SHQUOTE)
-
 #define INCH()                              \
     do {                                    \
-        n = ((c = *arg) != '\0') ? 1 : 0;   \
+        n = ((c = *arg) != 0) ? 1 : 0;      \
     } while (0)
 
 #define PUTC(x)                             \
@@ -91,8 +89,8 @@
         if (bufsize != 0) {                 \
             if (bufsize < 1 ||              \
                 (bufsize == 1 &&            \
-                (x) != '\0')) {             \
-                *buf = '\0';                \
+                (x) != 0)) {                \
+                *buf = 0;                   \
                 bufsize = 0;                \
             } else {                        \
                 *(buf++) = (x);             \
@@ -101,6 +99,7 @@
         }                                   \
     } while (0)
 
+#if defined(ACR_WANT_SHQUOTE)
 size_t shquote(const char *arg, char *buf, size_t bufsize)
 {
     char c, lastc;
@@ -191,8 +190,115 @@
 bad:
     return (size_t)-1;
 }
-#else
+#endif /* ACR_WANT_SHQUOTE */
 
-UNUSED_SOURCE_FILE(shquote);
+/* Just like shquote but surounds the arg by double quotes if
+ * the arg contains space sharacters
+ */
+size_t strquote(const char *arg, char *buf, size_t bufsize)
+{
+    char c, lastc;
+    size_t rv;
+    int n;
 
-#endif /* ACR_WANT_SHQUOTE */
+    rv    = 0;
+    lastc = 0;
+    if (!strpbrk(arg, " \t")) {
+        /* Just copy over the arg */
+        return strlcpy(buf, arg, bufsize);
+    }
+    if (*arg != '"') {
+        PUTC('"');
+    }
+    for (;;) {
+        INCH();
+        if (n <= 0)
+            break;
+        arg += n;
+        lastc = c;
+
+        if (c == '"') {
+            if (rv != 0) {
+                PUTC('"');
+            }
+            PUTC('\\');
+            PUTC('"');
+            for (;;) {
+                INCH();
+                if (n <= 0 || c != '"')
+                    break;
+                PUTC('\\');
+                PUTC('"');
+                arg += n;
+            }
+            if (n > 0) {
+                PUTC('"');
+            }
+        }
+        else {
+            PUTC(c);
+        }
+    }
+    if (lastc != '"') {
+        PUTC('"');
+    }
+    /* Put NUL terminator, but don't count the NUL. */
+    PUTC('\0');
+    rv--;
+
+    return rv;
+}
+
+size_t wcsquote(const wchar_t *arg, wchar_t *buf, size_t bufsize)
+{
+    wchar_t c, lastc;
+    size_t rv;
+    int n;
+
+    rv    = 0;
+    lastc = 0;
+    if (!wcspbrk(arg, L" \t")) {
+        /* Just copy over the arg */
+        return wcslcpy(buf, arg, bufsize);
+    }
+    if (*arg != L'"') {
+        PUTC(L'"');
+    }
+    for (;;) {
+        INCH();
+        if (n <= 0)
+            break;
+        arg += n;
+        lastc = c;
+
+        if (c == L'"') {
+            if (rv != 0) {
+                PUTC(L'"');
+            }
+            PUTC(L'\\');
+            PUTC(L'"');
+            for (;;) {
+                INCH();
+                if (n <= 0 || c != L'"')
+                    break;
+                PUTC(L'\\');
+                PUTC(L'"');
+                arg += n;
+            }
+            if (n > 0) {
+                PUTC(L'"');
+            }
+        }
+        else {
+            PUTC(c);
+        }
+    }
+    if (lastc != L'"') {
+        PUTC(L'"');
+    }
+    /* Put NUL terminator, but don't count the NUL. */
+    PUTC(L'\0');
+    rv--;
+
+    return rv;
+}