zpm-parse: zpm-parse.o libzpm.a
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< -lzpm -lelf
-zpm-quote: zpm-quote.o libzpm.a
- $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< -lzpm -lelf
+zpm-quote: zpm-quote.o
+ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $<
newdb.c: db.sql
echo "char createdb[] = {" > $@
-#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 = "''";
+
+ while ((opt = getopt(ac, av, "sqi")) != -1) {
+ switch (opt) {
+ case 's': shellmode = 1; break;
+ case 'q': addquotes = 1; break;
+ case 'i': ident = 1; break;
+ default:
+ exit(EXIT_FAILURE);
+ break;
+ }
+ }
+ int argn = optind;
+
+ if (shellmode) {
+ repl = "'\\''";
+ } else if (ident) {
+ ch = '"';
+ repl = "\"\"";
+ }
+
+ for (i=argn;i<ac;i++) {
+ quoted = quote(av[i], ch, repl, addquotes);
+ printf("%s\n", quoted);
}
return 0;
}