version 1.160, 2018/08/23 15:45:05 |
version 1.161, 2018/08/26 09:28:42 |
|
|
#define FORMAT_BASENAME 0x2 |
#define FORMAT_BASENAME 0x2 |
#define FORMAT_DIRNAME 0x4 |
#define FORMAT_DIRNAME 0x4 |
#define FORMAT_SUBSTITUTE 0x8 |
#define FORMAT_SUBSTITUTE 0x8 |
|
#define FORMAT_QUOTE 0x10 |
|
|
/* Entry in format tree. */ |
/* Entry in format tree. */ |
struct format_entry { |
struct format_entry { |
|
|
fe->value = NULL; |
fe->value = NULL; |
} |
} |
|
|
|
/* Quote special characters in string. */ |
|
static char * |
|
format_quote(const char *s) |
|
{ |
|
const char *cp; |
|
char *out, *at; |
|
|
|
at = out = xmalloc(strlen(s) * 2 + 1); |
|
for (cp = s; *cp != '\0'; cp++) { |
|
if (strchr("|&;<>()$`\\\"'*?[# =%", *cp) != NULL) |
|
*at++ = '\\'; |
|
*at++ = *cp; |
|
} |
|
*at = '\0'; |
|
return (out); |
|
} |
|
|
/* Find a format entry. */ |
/* Find a format entry. */ |
static char * |
static char * |
format_find(struct format_tree *ft, const char *key, int modifiers) |
format_find(struct format_tree *ft, const char *key, int modifiers) |
|
|
copy = xstrdup(dirname(saved)); |
copy = xstrdup(dirname(saved)); |
free(saved); |
free(saved); |
} |
} |
|
if (modifiers & FORMAT_QUOTE) { |
|
saved = copy; |
|
copy = xstrdup(format_quote(saved)); |
|
free(saved); |
|
} |
return (copy); |
return (copy); |
} |
} |
|
|
|
|
if (copy[1] != ':') |
if (copy[1] != ':') |
break; |
break; |
modifiers |= FORMAT_TIMESTRING; |
modifiers |= FORMAT_TIMESTRING; |
|
copy += 2; |
|
break; |
|
case 'q': |
|
if (copy[1] != ':') |
|
break; |
|
modifiers |= FORMAT_QUOTE; |
copy += 2; |
copy += 2; |
break; |
break; |
case 's': |
case 's': |