Do not include the terminating \0 in the size of T_STRING_LITERAL.
authorChristoph Mallon <christoph.mallon@gmx.de>
Tue, 22 May 2012 09:02:16 +0000 (11:02 +0200)
committerChristoph Mallon <christoph.mallon@gmx.de>
Wed, 23 May 2012 05:31:14 +0000 (07:31 +0200)
ast.c
ast2firm.c
lexer.c
parser.c
token.c

diff --git a/ast.c b/ast.c
index 80efca1..2daa235 100644 (file)
--- a/ast.c
+++ b/ast.c
@@ -195,13 +195,11 @@ 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_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) {
@@ -237,7 +235,7 @@ static void print_quoted_string(const string_t *const string, char border,
 static void print_string_literal(const string_literal_expression_t *literal)
 {
        print_string(get_string_encoding_prefix(literal->encoding));
-       print_quoted_string(&literal->value, '"', 1);
+       print_quoted_string(&literal->value, '"');
 }
 
 static void print_literal(const literal_expression_t *literal)
@@ -258,7 +256,7 @@ static void print_literal(const literal_expression_t *literal)
                print_char('L');
                /* FALLTHROUGH */
        case EXPR_LITERAL_CHARACTER:
-               print_quoted_string(&literal->value, '\'', 0);
+               print_quoted_string(&literal->value, '\'');
                return;
        default:
                break;
@@ -1038,7 +1036,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(')');
@@ -1057,7 +1055,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, '"');
        }
 }
 
@@ -1073,7 +1071,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)
@@ -1211,10 +1209,10 @@ void print_initializer(const initializer_t *initializer)
                return;
        }
        case INITIALIZER_STRING:
-               print_quoted_string(&initializer->string.string, '"', 1);
+               print_quoted_string(&initializer->string.string, '"');
                return;
        case INITIALIZER_WIDE_STRING:
-               print_quoted_string(&initializer->string.string, '"', 1);
+               print_quoted_string(&initializer->string.string, '"');
                return;
        case INITIALIZER_DESIGNATOR:
                print_designator(initializer->designator.designator);
index 066434a..3edec46 100644 (file)
@@ -1115,7 +1115,7 @@ static ir_node *string_to_firm(source_position_t const *const src_pos, char cons
        ir_initializer_t *initializer;
        switch (enc) {
        case STRING_ENCODING_CHAR: {
-               slen        = value->size;
+               slen        = value->size + 1;
                elem_type   = ir_type_char;
                initializer = create_initializer_compound(slen);
 
@@ -1130,14 +1130,14 @@ static ir_node *string_to_firm(source_position_t const *const src_pos, char cons
        }
 
        case STRING_ENCODING_WIDE: {
-               slen        = wstrlen(value);
+               slen        = wstrlen(value) + 1;
                elem_type   = ir_type_wchar_t;
                initializer = create_initializer_compound(slen);
 
                ir_mode *const mode = get_type_mode(elem_type);
                char const    *p    = value->begin;
                for (size_t i = 0; i < slen; ++i) {
-                       assert(p < value->begin + value->size);
+                       assert(p <= value->begin + value->size);
                        utf32             v   = read_utf8_char(&p);
                        ir_tarval        *tv  = new_tarval_from_long(v, mode);
                        ir_initializer_t *val = create_initializer_tarval(tv);
@@ -3137,7 +3137,7 @@ static ir_node *function_name_to_firm(
                if (current_function_name == NULL) {
                        const source_position_t *const src_pos = &expr->base.source_position;
                        const char    *name  = current_function_entity->base.symbol->string;
-                       const string_t string = { name, strlen(name) + 1 };
+                       const string_t string = { name, strlen(name) };
                        current_function_name = string_to_firm(src_pos, "__func__.%u", STRING_ENCODING_CHAR, &string);
                }
                return current_function_name;
@@ -3146,7 +3146,7 @@ static ir_node *function_name_to_firm(
                        const source_position_t *const src_pos = &expr->base.source_position;
                        ir_entity *ent = get_irg_entity(current_ir_graph);
                        const char *const name = get_entity_ld_name(ent);
-                       const string_t string = { name, strlen(name) + 1 };
+                       const string_t string = { name, strlen(name) };
                        current_funcsig = string_to_firm(src_pos, "__FUNCSIG__.%u", STRING_ENCODING_CHAR, &string);
                }
                return current_funcsig;
@@ -5632,13 +5632,8 @@ static void global_asm_to_firm(statement_t *s)
                assert(s->kind == STATEMENT_ASM);
 
                char const *const text = s->asms.asm_text.begin;
-               size_t            size = s->asms.asm_text.size;
-
-               /* skip the last \0 */
-               if (text[size - 1] == '\0')
-                       --size;
-
-               ident *const id = new_id_from_chars(text, size);
+               size_t      const size = s->asms.asm_text.size;
+               ident      *const id   = new_id_from_chars(text, size);
                add_irp_asm(id);
        }
 }
diff --git a/lexer.c b/lexer.c
index 0d09927..6bafd8b 100644 (file)
--- a/lexer.c
+++ b/lexer.c
@@ -680,8 +680,8 @@ end_of_string:
 
        /* add finishing 0 to the string */
        obstack_1grow(&symbol_obstack, '\0');
-       const size_t  size   = (size_t)obstack_object_size(&symbol_obstack);
-       char         *string = obstack_finish(&symbol_obstack);
+       size_t const size   = (size_t)obstack_object_size(&symbol_obstack) - 1;
+       char        *string = obstack_finish(&symbol_obstack);
 
        lexer_token.kind            = T_STRING_LITERAL;
        lexer_token.string.encoding = enc;
index a14086f..0d2c9a2 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -1038,13 +1038,13 @@ static void append_string(string_t const *const s)
 {
        /* FIXME Using the ast_obstack is a hack.  Using the symbol_obstack is not
         * possible, because other tokens are grown there alongside. */
-       obstack_grow(&ast_obstack, s->begin, s->size - 1);
+       obstack_grow(&ast_obstack, s->begin, s->size);
 }
 
 static string_t finish_string(void)
 {
        obstack_1grow(&ast_obstack, '\0');
-       size_t      const size   = obstack_object_size(&ast_obstack);
+       size_t      const size   = obstack_object_size(&ast_obstack) - 1;
        char const *const string = obstack_finish(&ast_obstack);
        return (string_t){ string, size };
 }
@@ -2235,7 +2235,7 @@ static initializer_t *parse_initializer(parse_initializer_env_t *env)
                        break;
 
                case INITIALIZER_STRING:
-                       size = result->string.string.size;
+                       size = result->string.string.size + 1;
                        break;
 
                case INITIALIZER_WIDE_STRING:
@@ -5973,7 +5973,7 @@ type_t *revert_automatic_type_conversion(const expression_t *expression)
        }
 
        case EXPR_STRING_LITERAL: {
-               size_t  const size = expression->string_literal.value.size;
+               size_t  const size = expression->string_literal.value.size + 1;
                type_t *const elem = get_unqualified_type(expression->base.type->pointer.points_to);
                return make_array_type(elem, size, TYPE_QUALIFIER_NONE);
        }
diff --git a/token.c b/token.c
index 755b2c9..55e3b02 100644 (file)
--- a/token.c
+++ b/token.c
@@ -156,16 +156,14 @@ void print_token(FILE *f, const token_t *token)
                fputc('\'', f);
                break;
 
-       case T_STRING_LITERAL:
+               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);
-               fprintf(f, " %s\"%s\"", get_string_encoding_prefix(token->string.encoding), token->string.string.begin);
-               break;
-
-       case T_CHARACTER_CONSTANT:
-               print_token_kind(f, (token_kind_t)token->kind);
-               fprintf(f, " %s'", get_string_encoding_prefix(token->string.encoding));
+               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: