#define _POSIX_C_SOURCE 2 #include #include #include #include /* for quoting against the shell replace ' with '\'' and surround with * single quotes */ 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 { *d++ = *s++; } *d = 0; } 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; }