From 9c749101ef6a6a406221b79c0352f97e29b3787a Mon Sep 17 00:00:00 2001 From: "H. Peter Anvin" Date: Sat, 14 Jun 2008 21:08:38 -0700 Subject: Support __utf16__ and __utf32__ in an expression context Support __utf16__ and __utf32__ in expression contexts. --- eval.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) (limited to 'eval.c') diff --git a/eval.c b/eval.c index eb5af889..917dcfce 100644 --- a/eval.c +++ b/eval.c @@ -662,6 +662,48 @@ static expr *eval_floatize(enum floatize type) return finishtemp(); } +static expr *eval_strfunc(enum strfunc type) +{ + char *string; + size_t string_len; + int64_t val; + bool parens, rn_warn; + + i = scan(scpriv, tokval); + if (i == '(') { + parens = true; + i = scan(scpriv, tokval); + } + if (i != TOKEN_STR) { + error(ERR_NONFATAL, "expecting string"); + return NULL; + } + string_len = string_transform(tokval->t_charptr, tokval->t_inttwo, + &string, type); + if (string_len == (size_t)-1) { + error(ERR_NONFATAL, "invalid string for transform"); + return NULL; + } + + val = readstrnum(string, string_len, &rn_warn); + if (parens) { + i = scan(scpriv, tokval); + if (i != ')') { + error(ERR_NONFATAL, "expecting `)'"); + return NULL; + } + } + + if (rn_warn) + error(ERR_WARNING|ERR_PASS1, "character constant too long"); + + begintemp(); + addtotemp(EXPR_SIMPLE, val); + + i = scan(scpriv, tokval); + return finishtemp(); +} + static expr *expr6(int critical) { int32_t type; @@ -730,6 +772,9 @@ static expr *expr6(int critical) case TOKEN_FLOATIZE: return eval_floatize(tokval->t_integer); + case TOKEN_STRFUNC: + return eval_strfunc(tokval->t_integer); + case '(': i = scan(scpriv, tokval); e = bexpr(critical); -- cgit v1.2.1