|
@@ -42,80 +42,16 @@ static void usage(void)
|
|
|
printf("\n"
|
|
|
"Options:\n"
|
|
|
"-e echo each input line on output\n"
|
|
|
+ "-f flag select an escape flag, can assume the values 'whitespace' and 'strict'\n"
|
|
|
"-h print this help\n"
|
|
|
"-i INFILE set INFILE as input file, stdin if omitted\n"
|
|
|
"-l LEVEL set the number of escaping levels, 1 if omitted\n"
|
|
|
- "-m ESCAPE_MODE select escape mode between 'full', 'lazy', 'quote', default is 'lazy'\n"
|
|
|
+ "-m ESCAPE_MODE select escape mode between 'auto', 'backslash', 'quote'\n"
|
|
|
"-o OUTFILE set OUTFILE as output file, stdout if omitted\n"
|
|
|
"-p PROMPT set output prompt, is '=> ' by default\n"
|
|
|
"-s SPECIAL_CHARS set the list of special characters\n");
|
|
|
}
|
|
|
|
|
|
-#define WHITESPACES " \n\t"
|
|
|
-
|
|
|
-enum EscapeMode {
|
|
|
- ESCAPE_MODE_FULL,
|
|
|
- ESCAPE_MODE_LAZY,
|
|
|
- ESCAPE_MODE_QUOTE,
|
|
|
-};
|
|
|
-
|
|
|
-static int escape(char **dst, const char *src, const char *special_chars,
|
|
|
- enum EscapeMode mode)
|
|
|
-{
|
|
|
- AVBPrint dstbuf;
|
|
|
-
|
|
|
- av_bprint_init(&dstbuf, 1, AV_BPRINT_SIZE_UNLIMITED);
|
|
|
-
|
|
|
- switch (mode) {
|
|
|
- case ESCAPE_MODE_FULL:
|
|
|
- case ESCAPE_MODE_LAZY:
|
|
|
- /* \-escape characters */
|
|
|
-
|
|
|
- if (mode == ESCAPE_MODE_LAZY && strchr(WHITESPACES, *src))
|
|
|
- av_bprintf(&dstbuf, "\\%c", *src++);
|
|
|
-
|
|
|
- for (; *src; src++) {
|
|
|
- if ((special_chars && strchr(special_chars, *src)) ||
|
|
|
- strchr("'\\", *src) ||
|
|
|
- (mode == ESCAPE_MODE_FULL && strchr(WHITESPACES, *src)))
|
|
|
- av_bprintf(&dstbuf, "\\%c", *src);
|
|
|
- else
|
|
|
- av_bprint_chars(&dstbuf, *src, 1);
|
|
|
- }
|
|
|
-
|
|
|
- if (mode == ESCAPE_MODE_LAZY && strchr(WHITESPACES, dstbuf.str[dstbuf.len-1])) {
|
|
|
- char c = dstbuf.str[dstbuf.len-1];
|
|
|
- dstbuf.str[dstbuf.len-1] = '\\';
|
|
|
- av_bprint_chars(&dstbuf, c, 1);
|
|
|
- }
|
|
|
- break;
|
|
|
-
|
|
|
- case ESCAPE_MODE_QUOTE:
|
|
|
- /* enclose between '' the string */
|
|
|
- av_bprint_chars(&dstbuf, '\'', 1);
|
|
|
- for (; *src; src++) {
|
|
|
- if (*src == '\'')
|
|
|
- av_bprintf(&dstbuf, "'\\''");
|
|
|
- else
|
|
|
- av_bprint_chars(&dstbuf, *src, 1);
|
|
|
- }
|
|
|
- av_bprint_chars(&dstbuf, '\'', 1);
|
|
|
- break;
|
|
|
-
|
|
|
- default:
|
|
|
- /* unknown escape mode */
|
|
|
- return AVERROR(EINVAL);
|
|
|
- }
|
|
|
-
|
|
|
- if (!av_bprint_is_complete(&dstbuf)) {
|
|
|
- av_bprint_finalize(&dstbuf, NULL);
|
|
|
- return AVERROR(ENOMEM);
|
|
|
- } else {
|
|
|
- av_bprint_finalize(&dstbuf, dst);
|
|
|
- return 0;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
int main(int argc, char **argv)
|
|
|
{
|
|
|
AVBPrint src;
|
|
@@ -123,13 +59,14 @@ int main(int argc, char **argv)
|
|
|
const char *outfilename = NULL, *infilename = NULL;
|
|
|
FILE *outfile = NULL, *infile = NULL;
|
|
|
const char *prompt = "=> ";
|
|
|
- enum EscapeMode escape_mode = ESCAPE_MODE_LAZY;
|
|
|
+ enum AVEscapeMode escape_mode = AV_ESCAPE_MODE_AUTO;
|
|
|
+ int escape_flags = 0;
|
|
|
int level = 1;
|
|
|
int echo = 0;
|
|
|
char *special_chars = NULL;
|
|
|
int c;
|
|
|
|
|
|
- while ((c = getopt(argc, argv, "ehi:l:o:m:p:s:")) != -1) {
|
|
|
+ while ((c = getopt(argc, argv, "ef:hi:l:o:m:p:s:")) != -1) {
|
|
|
switch (c) {
|
|
|
case 'e':
|
|
|
echo = 1;
|
|
@@ -140,6 +77,16 @@ int main(int argc, char **argv)
|
|
|
case 'i':
|
|
|
infilename = optarg;
|
|
|
break;
|
|
|
+ case 'f':
|
|
|
+ if (!strcmp(optarg, "whitespace")) escape_flags |= AV_ESCAPE_FLAG_WHITESPACE;
|
|
|
+ else if (!strcmp(optarg, "strict")) escape_flags |= AV_ESCAPE_FLAG_STRICT;
|
|
|
+ else {
|
|
|
+ av_log(NULL, AV_LOG_ERROR,
|
|
|
+ "Invalid value '%s' for option -f, "
|
|
|
+ "valid arguments are 'whitespace', and 'strict'\n", optarg);
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ break;
|
|
|
case 'l':
|
|
|
{
|
|
|
char *tail;
|
|
@@ -154,13 +101,13 @@ int main(int argc, char **argv)
|
|
|
break;
|
|
|
}
|
|
|
case 'm':
|
|
|
- if (!strcmp(optarg, "full")) escape_mode = ESCAPE_MODE_FULL;
|
|
|
- else if (!strcmp(optarg, "lazy")) escape_mode = ESCAPE_MODE_LAZY;
|
|
|
- else if (!strcmp(optarg, "quote")) escape_mode = ESCAPE_MODE_QUOTE;
|
|
|
+ if (!strcmp(optarg, "auto")) escape_mode = AV_ESCAPE_MODE_AUTO;
|
|
|
+ else if (!strcmp(optarg, "backslash")) escape_mode = AV_ESCAPE_MODE_BACKSLASH;
|
|
|
+ else if (!strcmp(optarg, "quote")) escape_mode = AV_ESCAPE_MODE_QUOTE;
|
|
|
else {
|
|
|
av_log(NULL, AV_LOG_ERROR,
|
|
|
"Invalid value '%s' for option -m, "
|
|
|
- "valid arguments are 'full', 'lazy', 'quote'\n", optarg);
|
|
|
+ "valid arguments are 'backslash', and 'quote'\n", optarg);
|
|
|
return 1;
|
|
|
}
|
|
|
break;
|
|
@@ -219,7 +166,7 @@ int main(int argc, char **argv)
|
|
|
/* escape */
|
|
|
dst_buf = src_buf;
|
|
|
while (level--) {
|
|
|
- if (escape(&dst_buf, src_buf, special_chars, escape_mode) < 0) {
|
|
|
+ if (av_escape(&dst_buf, src_buf, special_chars, escape_mode, escape_flags) < 0) {
|
|
|
av_log(NULL, AV_LOG_ERROR, "Could not escape string\n");
|
|
|
return 1;
|
|
|
}
|