summaryrefslogtreecommitdiff
path: root/tools/ffescape.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/ffescape.c')
-rw-r--r--tools/ffescape.c93
1 files changed, 20 insertions, 73 deletions
diff --git a/tools/ffescape.c b/tools/ffescape.c
index d777fe4572..0530d28c6d 100644
--- a/tools/ffescape.c
+++ b/tools/ffescape.c
@@ -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;
}