]> pd.if.org Git - zpackage/blobdiff - zpm-quote.c
fix compile process for elf programs
[zpackage] / zpm-quote.c
index ea306b4b00ab742a3e1b7791b96ade2680a9e83f..02df6781d319fe626ccff733bc2ca0c0dcc9f4e1 100644 (file)
-#include <stdlib.h>
+#define _POSIX_C_SOURCE 2
 
-#include "zpm.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
 
 /* for quoting against the shell replace ' with '\'' and surround with
  * single quotes
  */
-int main(int ac, char **av) {
-       size_t n = 0;
-       size_t bufsize = 0;
-       char *buffer = 0;
-       int i;
 
-       for (i=1;i<ac;i++) {
-               n = zpm_quote(av[i], 0, 0);
-               if (n+1 > bufsize) {
-                       buffer = realloc(buffer, n+1);
-                       if (buffer) {
-                               bufsize = n+1;
+char *quote(char *s, int chi, char *repl, int addquotes) {
+       size_t size = 0, rsize = 0;
+       char *d, *q, *r;
+       char ch = chi;
+
+       if (!s) return NULL;
+       if (!repl) return NULL;
+
+       rsize = strlen(repl);
+
+       for (d = s; *d; d++) {
+               if (*d == ch) {
+                       size += rsize-1;
+               }
+               size++;
+       }
+
+       if (addquotes) {
+               size += 2;
+       }
+
+       d = q = malloc(size+1);
+
+       if (q) {
+               if (addquotes) {
+                       *d++ = ch;
+               }
+
+               while (*s) {
+                       if (*s == ch) {
+                               r = repl;
+                               while (*r) {
+                                       *d++ = *r++;
+                               }
+                               s++;
                        } else {
-                               exit(EXIT_FAILURE);
+                               *d++ = *s++;
                        }
+                       *d = 0;
                }
-               zpm_quote(av[i], buffer, bufsize);
-               printf("%s\n", buffer);
+
+               if (addquotes) {
+                       *d++ = ch;
+               }
+               *d = 0;
+       }
+
+       return q;
+}
+
+int main(int ac, char **av) {
+       char *quoted;
+       int i;
+       int ch = '\'';
+       int opt, shellmode = 0, addquotes = 0, ident = 0;
+       char *repl = "''";
+       int count = 0;
+       char *separator = "\n";
+
+       while ((opt = getopt(ac, av, "sqid:")) != -1) {
+               switch (opt) {
+                       case 's': shellmode = 1; break;
+                       case 'q': addquotes = 1; break;
+                       case 'i': ident = 1; break;
+                       case 'd': separator = optarg; break;
+                       default:
+                                 exit(EXIT_FAILURE);
+                                 break;
+               }
+       }
+       int argn = optind;
+
+       if (shellmode) {
+               repl = "'\\''";
+       } else if (ident) {
+               ch = '"';
+               repl = "\"\"";
+       }
+
+       count = 0;
+       for (i=argn;i<ac;i++) {
+               quoted = quote(av[i], ch, repl, addquotes);
+               printf("%s%s", count > 0 ? separator : "", quoted);
+               free(quoted);
+               count++;
+       }
+       if (count > 0) {
+               printf("\n");
        }
        return 0;
 }