Simplify test for string initializers in initializer_from_expression().
[cparser] / token.c
diff --git a/token.c b/token.c
index a0a7d7e..5d97f92 100644 (file)
--- a/token.c
+++ b/token.c
@@ -28,6 +28,7 @@
 #include "symbol.h"
 #include "lang_features.h"
 #include "adt/array.h"
+#include "adt/error.h"
 #include "adt/util.h"
 
 static symbol_t *token_symbols[T_LAST_TOKEN];
@@ -123,6 +124,15 @@ void print_token_kind(FILE *f, token_kind_t token_kind)
        }
 }
 
+char const *get_string_encoding_prefix(string_encoding_t const enc)
+{
+       switch (enc) {
+       case STRING_ENCODING_CHAR: return "";
+       case STRING_ENCODING_WIDE: return "L";
+       }
+       panic("invalid string encoding");
+}
+
 static void print_stringrep(const string_t *string, FILE *f)
 {
        for (size_t i = 0; i < string->size; ++i) {
@@ -134,13 +144,10 @@ void print_token(FILE *f, const token_t *token)
 {
        switch(token->kind) {
        case T_IDENTIFIER:
-               fprintf(f, "identifier '%s'", token->identifier.symbol->string);
+               fprintf(f, "identifier '%s'", token->base.symbol->string);
                break;
        case T_INTEGER:
-       case T_INTEGER_OCTAL:
-       case T_INTEGER_HEXADECIMAL:
        case T_FLOATINGPOINT:
-       case T_FLOATINGPOINT_HEXADECIMAL:
                print_token_kind(f, (token_kind_t)token->kind);
                fputs(" '", f);
                print_stringrep(&token->number.number, f);
@@ -148,22 +155,25 @@ void print_token(FILE *f, const token_t *token)
                        print_stringrep(&token->number.suffix, f);
                fputc('\'', f);
                break;
-       case T_WIDE_STRING_LITERAL:
-       case T_STRING_LITERAL:
-               print_token_kind(f, (token_kind_t)token->kind);
-               fprintf(f, " \"%s\"", token->string.string.begin);
-               break;
-       case T_CHARACTER_CONSTANT:
-       case T_WIDE_CHARACTER_CONSTANT:
+
+               char delim;
+       case T_STRING_LITERAL:     delim = '"';  goto print_string;
+       case T_CHARACTER_CONSTANT: delim = '\''; goto print_string;
+print_string:
                print_token_kind(f, (token_kind_t)token->kind);
-               fputs(" \'", f);
+               fprintf(f, " %s%c", get_string_encoding_prefix(token->string.encoding), delim);
                print_stringrep(&token->string.string, f);
-               fputs("'", f);
+               fputc(delim, f);
                break;
+
        default:
-               fputc('\'', f);
-               print_token_kind(f, (token_kind_t)token->kind);
-               fputc('\'', f);
+               if (token->base.symbol) {
+                       fprintf(f, "'%s'", token->base.symbol->string);
+               } else {
+                       fputc('\'', f);
+                       print_token_kind(f, (token_kind_t)token->kind);
+                       fputc('\'', f);
+               }
                break;
        }
 }
@@ -197,7 +207,7 @@ void print_pp_token(FILE *f, const token_t *token)
 {
        switch((preprocessor_token_kind_t) token->kind) {
        case TP_IDENTIFIER:
-               fprintf(f, "identifier '%s'", token->identifier.symbol->string);
+               fprintf(f, "identifier '%s'", token->base.symbol->string);
                break;
        case TP_NUMBER:
                fprintf(f, "number '%s'", token->number.number.begin);
@@ -236,8 +246,6 @@ bool tokens_would_paste(preprocessor_token_kind_t token1,
        case TP_IDENTIFIER:
                return token2 == TP_IDENTIFIER || token2 == TP_NUMBER ||
                       token2 == TP_CHARACTER_CONSTANT ||
-                      token2 == TP_WIDE_CHARACTER_CONSTANT ||
-                      token2 == TP_WIDE_STRING_LITERAL ||
                       token2 == TP_STRING_LITERAL; /* L */
        case TP_NUMBER:
                return token2 == TP_NUMBER || token2 == TP_IDENTIFIER ||