return true;
}
+static const char *
+unquote_string_in_place (const char *s, struct string *tmp)
+{
+ ds_init_empty (tmp);
+ return unquote_string (s, tmp) ? ds_cstr (tmp) : s;
+}
+
static bool
parse_integer (const char *s, int *np)
{
else if (parse_macro_function (ctx, &args, ss_cstr ("!head"), 1, 1,
input_consumed))
{
- struct string content = DS_EMPTY_INITIALIZER;
- const char *s = (unquote_string (args.strings[0], &content)
- ? ds_cstr (&content) : args.strings[0]);
+ struct string tmp;
+ const char *s = unquote_string_in_place (args.strings[0], &tmp);
struct macro_tokens mts = { .n = 0 };
macro_tokens_from_string (&mts, ss_cstr (s), SEG_MODE_INTERACTIVE /* XXX */);
if (mts.n > 0)
ds_put_substring (output, mts.mts[0].representation);
macro_tokens_uninit (&mts);
- ds_destroy (&content);
+ ds_destroy (&tmp);
}
else if (parse_macro_function (ctx, &args, ss_cstr ("!index"), 2, 2,
input_consumed))
else if (parse_macro_function (ctx, &args, ss_cstr ("!tail"), 1, 1,
input_consumed))
{
- struct string content = DS_EMPTY_INITIALIZER;
- const char *s = (unquote_string (args.strings[0], &content)
- ? ds_cstr (&content) : args.strings[0]);
+ struct string tmp;
+ const char *s = unquote_string_in_place (args.strings[0], &tmp);
struct macro_tokens mts = { .n = 0 };
macro_tokens_from_string (&mts, ss_cstr (s), SEG_MODE_INTERACTIVE /* XXX */);
macro_tokens_to_representation (&tail, output);
}
macro_tokens_uninit (&mts);
- ds_destroy (&content);
+ ds_destroy (&tmp);
}
else if (parse_macro_function (ctx, &args, ss_cstr ("!unquote"), 1, 1,
input_consumed))
if (!unquote_string (args.strings[0], output))
ds_put_cstr (output, args.strings[0]);
}
+ else if (parse_macro_function (ctx, &args, ss_cstr ("!upcase"), 1, 1,
+ input_consumed))
+ {
+ struct string tmp;
+ const char *s = unquote_string_in_place (args.strings[0], &tmp);
+ char *upper = utf8_to_upper (s);
+ ds_put_cstr (output, upper);
+ free (upper);
+ ds_destroy (&tmp);
+ }
else if (ctx->n_input > 0
&& ctx->input[0].token.type == T_MACRO_ID
&& ss_equals_case (ctx->input[0].token.string, ss_cstr ("!null")))