X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ast.c;h=4bf325829c0182c6c19b9d4b7474155ac79f0bc0;hb=387f3d71d78020617fd4c0edbf080f49b5319d18;hp=df07b015d86f965f0b7925a4f1c231829a860f67;hpb=7deed9b517413dd0e44dcbcb3087891348994477;p=cparser diff --git a/ast.c b/ast.c index df07b01..4bf3258 100644 --- a/ast.c +++ b/ast.c @@ -79,6 +79,7 @@ static unsigned get_expression_precedence(expression_kind_t kind) [EXPR_UNKNOWN] = PREC_PRIM, [EXPR_INVALID] = PREC_PRIM, [EXPR_REFERENCE] = PREC_PRIM, + [EXPR_CHAR_CONST] = PREC_PRIM, [EXPR_CONST] = PREC_PRIM, [EXPR_STRING_LITERAL] = PREC_PRIM, [EXPR_WIDE_STRING_LITERAL] = PREC_PRIM, @@ -176,10 +177,14 @@ static void print_const(const const_expression_t *cnst) if(cnst->base.type == NULL) return; - if(is_type_integer(cnst->base.type)) { + const type_t *const type = skip_typeref(cnst->base.type); + + if (is_type_integer(type)) { fprintf(out, "%lld", cnst->v.int_value); - } else if(is_type_float(cnst->base.type)) { + } else if (is_type_float(type)) { fprintf(out, "%Lf", cnst->v.float_value); + } else { + panic("unknown constant"); } } @@ -187,14 +192,17 @@ static void print_const(const const_expression_t *cnst) * Print a quoted string constant. * * @param string the string constant + * @param border the border char */ -static void print_quoted_string(const string_t *const string) +static void print_quoted_string(const string_t *const string, char border) { - fputc('"', out); + fputc(border, out); const char *end = string->begin + string->size; for (const char *c = string->begin; c != end; ++c) { + if (*c == border) { + fputc('\\', out); + } switch(*c) { - case '\"': fputs("\\\"", out); break; case '\\': fputs("\\\\", out); break; case '\a': fputs("\\a", out); break; case '\b': fputs("\\b", out); break; @@ -213,7 +221,17 @@ static void print_quoted_string(const string_t *const string) break; } } - fputc('"', out); + fputc(border, out); +} + +/** + * Print a constant character expression. + * + * @param cnst the constant character expression + */ +static void print_char_const(const const_expression_t *cnst) +{ + print_quoted_string(&cnst->v.chars, '\''); } /** @@ -224,7 +242,7 @@ static void print_quoted_string(const string_t *const string) static void print_string_literal( const string_literal_expression_t *string_literal) { - print_quoted_string(&string_literal->value); + print_quoted_string(&string_literal->value, '"'); } /** @@ -654,6 +672,9 @@ static void print_expression_prec(const expression_t *expression, unsigned top_p case EXPR_INVALID: fprintf(out, "*invalid expression*"); break; + case EXPR_CHAR_CONST: + print_char_const(&expression->conste); + break; case EXPR_CONST: print_const(&expression->conste); break; @@ -845,6 +866,10 @@ static void print_case_label(const case_label_statement_t *statement) } else { fputs("case ", out); print_expression(statement->expression); + if (statement->end_range != NULL) { + fputs(" ... ", out); + print_expression(statement->end_range); + } fputs(":\n", out); } ++indent; @@ -954,7 +979,7 @@ static void print_asm_constraints(asm_constraint_t *constraints) if(constraint->symbol) { fprintf(out, "[%s] ", constraint->symbol->string); } - print_quoted_string(&constraint->constraints); + print_quoted_string(&constraint->constraints, '"'); fputs(" (", out); print_expression(constraint->expression); fputs(")", out); @@ -973,7 +998,7 @@ static void print_asm_clobbers(asm_clobber_t *clobbers) if(clobber != clobbers) fputs(", ", out); - print_quoted_string(&clobber->clobber); + print_quoted_string(&clobber->clobber, '"'); } } @@ -989,7 +1014,7 @@ static void print_asm_statement(const asm_statement_t *statement) fputs("volatile ", out); } fputs("(", out); - print_quoted_string(&statement->asm_text); + print_quoted_string(&statement->asm_text, '"'); if(statement->inputs == NULL && statement->outputs == NULL && statement->clobbers == NULL) goto end_of_print_asm_statement; @@ -1230,6 +1255,7 @@ bool is_constant_expression(const expression_t *expression) switch(expression->kind) { case EXPR_CONST: + case EXPR_CHAR_CONST: case EXPR_STRING_LITERAL: case EXPR_WIDE_STRING_LITERAL: case EXPR_SIZEOF: