X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=zpm-quote.c;h=02df6781d319fe626ccff733bc2ca0c0dcc9f4e1;hb=62f6ff407bc4f2cf03d1fa7cf3dc9a3f4026624a;hp=ea306b4b00ab742a3e1b7791b96ade2680a9e83f;hpb=4fb3f8f638558d96ebe4255e7e78e609bf2b67f6;p=zpackage diff --git a/zpm-quote.c b/zpm-quote.c index ea306b4..02df678 100644 --- a/zpm-quote.c +++ b/zpm-quote.c @@ -1,28 +1,102 @@ -#include +#define _POSIX_C_SOURCE 2 -#include "zpm.h" +#include +#include +#include +#include /* 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 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 0 ? separator : "", quoted); + free(quoted); + count++; + } + if (count > 0) { + printf("\n"); } return 0; }