Include string encoding in string_t.
[cparser] / ast.c
diff --git a/ast.c b/ast.c
index 9617b1f..005d0fc 100644 (file)
--- a/ast.c
+++ b/ast.c
@@ -107,10 +107,8 @@ static unsigned get_expression_precedence(expression_kind_t kind)
                [EXPR_LITERAL_INTEGER]            = PREC_PRIMARY,
                [EXPR_LITERAL_FLOATINGPOINT]      = PREC_PRIMARY,
                [EXPR_LITERAL_CHARACTER]          = PREC_PRIMARY,
-               [EXPR_LITERAL_WIDE_CHARACTER]     = PREC_PRIMARY,
                [EXPR_LITERAL_MS_NOOP]            = PREC_PRIMARY,
                [EXPR_STRING_LITERAL]             = PREC_PRIMARY,
-               [EXPR_WIDE_STRING_LITERAL]        = PREC_PRIMARY,
                [EXPR_COMPOUND_LITERAL]           = PREC_UNARY,
                [EXPR_CALL]                       = PREC_POSTFIX,
                [EXPR_CONDITIONAL]                = PREC_CONDITIONAL,
@@ -196,13 +194,13 @@ static unsigned get_expression_precedence(expression_kind_t kind)
  *
  * @param string  the string constant
  * @param border  the border char
- * @param skip    number of chars to skip at the end
  */
-static void print_quoted_string(const string_t *const string, char border,
-                                int skip)
+static void print_quoted_string(const string_t *const string, char border)
 {
+       print_string(get_string_encoding_prefix(string->encoding));
+
        print_char(border);
-       const char *end = string->begin + string->size - skip;
+       const char *end = string->begin + string->size;
        for (const char *c = string->begin; c != end; ++c) {
                const char tc = *c;
                if (tc == border) {
@@ -235,12 +233,9 @@ static void print_quoted_string(const string_t *const string, char border,
        print_char(border);
 }
 
-static void print_string_literal(const string_literal_expression_t *literal)
+static void print_string_literal(string_literal_expression_t const *const literal, char const delimiter)
 {
-       if (literal->base.kind == EXPR_WIDE_STRING_LITERAL) {
-               print_char('L');
-       }
-       print_quoted_string(&literal->value, '"', 1);
+       print_quoted_string(&literal->value, delimiter);
 }
 
 static void print_literal(const literal_expression_t *literal)
@@ -257,12 +252,6 @@ static void print_literal(const literal_expression_t *literal)
                print_stringrep(&literal->suffix);
                return;
 
-       case EXPR_LITERAL_WIDE_CHARACTER:
-               print_char('L');
-               /* FALLTHROUGH */
-       case EXPR_LITERAL_CHARACTER:
-               print_quoted_string(&literal->value, '\'', 0);
-               return;
        default:
                break;
        }
@@ -466,11 +455,10 @@ static void print_array_expression(const array_access_expression_t *expression)
  */
 static void print_typeprop_expression(const typeprop_expression_t *expression)
 {
-       if (expression->base.kind == EXPR_SIZEOF) {
-               print_string("sizeof");
-       } else {
-               assert(expression->base.kind == EXPR_ALIGNOF);
-               print_string("__alignof__");
+       switch (expression->base.kind) {
+       case EXPR_SIZEOF:  print_string("sizeof");      break;
+       case EXPR_ALIGNOF: print_string("__alignof__"); break;
+       default:           panic("invalid typeprop kind");
        }
        if (expression->tp_expression != NULL) {
                /* PREC_TOP: always print the '()' here, sizeof x is right but unusual */
@@ -538,7 +526,7 @@ static void print_va_start(const va_start_expression_t *const expression)
        print_string("__builtin_va_start(");
        print_assignment_expression(expression->ap);
        print_string(", ");
-       print_string(expression->parameter->base.base.symbol->string);
+       print_assignment_expression(expression->parameter);
        print_char(')');
 }
 
@@ -663,9 +651,9 @@ static bool needs_parentheses(expression_t const *const expr, unsigned const top
                case EXPR_ENUM_CONSTANT:
                case EXPR_FUNCNAME:
                case EXPR_LITERAL_CASES:
+               case EXPR_LITERAL_CHARACTER:
                case EXPR_REFERENCE:
                case EXPR_STRING_LITERAL:
-               case EXPR_WIDE_STRING_LITERAL:
                        /* Do not print () around subexpressions consisting of a single token. */
                        return false;
 
@@ -708,13 +696,13 @@ static void print_expression_prec(expression_t const *expr, unsigned const top_p
        case EXPR_FUNCNAME:                   print_funcname(                &expr->funcname);                 break;
        case EXPR_LABEL_ADDRESS:              print_label_address_expression(&expr->label_address);            break;
        case EXPR_LITERAL_CASES:              print_literal(                 &expr->literal);                  break;
+       case EXPR_LITERAL_CHARACTER:          print_string_literal(          &expr->string_literal, '\'');     break;
        case EXPR_OFFSETOF:                   print_offsetof_expression(     &expr->offsetofe);                break;
        case EXPR_REFERENCE:
        case EXPR_ENUM_CONSTANT:              print_reference_expression(    &expr->reference);                break;
        case EXPR_SELECT:                     print_select(                  &expr->select);                   break;
        case EXPR_STATEMENT:                  print_statement_expression(    &expr->statement);                break;
-       case EXPR_STRING_LITERAL:
-       case EXPR_WIDE_STRING_LITERAL:        print_string_literal(          &expr->string_literal);           break;
+       case EXPR_STRING_LITERAL:             print_string_literal(          &expr->string_literal, '"');      break;
        case EXPR_UNARY_CASES:                print_unary_expression(        &expr->unary);                    break;
        case EXPR_VA_ARG:                     print_va_arg(                  &expr->va_arge);                  break;
        case EXPR_VA_COPY:                    print_va_copy(                 &expr->va_copye);                 break;
@@ -1043,7 +1031,7 @@ static void print_asm_arguments(asm_argument_t *arguments)
                if (argument->symbol) {
                        print_format("[%s] ", argument->symbol->string);
                }
-               print_quoted_string(&argument->constraints, '"', 1);
+               print_quoted_string(&argument->constraints, '"');
                print_string(" (");
                print_expression(argument->expression);
                print_char(')');
@@ -1062,7 +1050,7 @@ static void print_asm_clobbers(asm_clobber_t *clobbers)
                if (clobber != clobbers)
                        print_string(", ");
 
-               print_quoted_string(&clobber->clobber, '"', 1);
+               print_quoted_string(&clobber->clobber, '"');
        }
 }
 
@@ -1078,7 +1066,7 @@ static void print_asm_statement(const asm_statement_t *statement)
                print_string("volatile ");
        }
        print_char('(');
-       print_quoted_string(&statement->asm_text, '"', 1);
+       print_quoted_string(&statement->asm_text, '"');
        if (statement->outputs  == NULL &&
            statement->inputs   == NULL &&
            statement->clobbers == NULL)
@@ -1200,7 +1188,6 @@ void print_initializer(const initializer_t *initializer)
                return;
        }
        case INITIALIZER_LIST: {
-               assert(initializer->kind == INITIALIZER_LIST);
                print_string("{ ");
                const initializer_list_t *list = &initializer->list;
 
@@ -1215,12 +1202,11 @@ void print_initializer(const initializer_t *initializer)
                print_string(" }");
                return;
        }
+
        case INITIALIZER_STRING:
-               print_quoted_string(&initializer->string.string, '"', 1);
-               return;
-       case INITIALIZER_WIDE_STRING:
-               print_quoted_string(&initializer->string.string, '"', 1);
+               print_string_literal(get_init_string(initializer), '"');
                return;
+
        case INITIALIZER_DESIGNATOR:
                print_designator(initializer->designator.designator);
                print_string(" = ");
@@ -1509,7 +1495,6 @@ expression_classification_t is_constant_initializer(const initializer_t *initial
 {
        switch (initializer->kind) {
        case INITIALIZER_STRING:
-       case INITIALIZER_WIDE_STRING:
        case INITIALIZER_DESIGNATOR:
                return EXPR_CLASS_CONSTANT;
 
@@ -1595,7 +1580,6 @@ expression_classification_t is_linker_constant(const expression_t *expression)
 {
        switch (expression->kind) {
        case EXPR_STRING_LITERAL:
-       case EXPR_WIDE_STRING_LITERAL:
        case EXPR_FUNCNAME:
        case EXPR_LABEL_ADDRESS:
                return EXPR_CLASS_CONSTANT;
@@ -1790,6 +1774,7 @@ expression_classification_t is_constant_expression(const expression_t *expressio
 {
        switch (expression->kind) {
        case EXPR_LITERAL_CASES:
+       case EXPR_LITERAL_CHARACTER:
        case EXPR_CLASSIFY_TYPE:
        case EXPR_OFFSETOF:
        case EXPR_ALIGNOF:
@@ -1806,7 +1791,6 @@ expression_classification_t is_constant_expression(const expression_t *expressio
        }
 
        case EXPR_STRING_LITERAL:
-       case EXPR_WIDE_STRING_LITERAL:
        case EXPR_FUNCNAME:
        case EXPR_LABEL_ADDRESS:
        case EXPR_SELECT: