*
* @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) {
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)
print_char('L');
/* FALLTHROUGH */
case EXPR_LITERAL_CHARACTER:
- print_quoted_string(&literal->value, '\'', 0);
+ print_quoted_string(&literal->value, '\'');
return;
default:
break;
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(')');
if (clobber != clobbers)
print_string(", ");
- print_quoted_string(&clobber->clobber, '"', 1);
+ print_quoted_string(&clobber->clobber, '"');
}
}
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)
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);
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);
}
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);
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;
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;
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);
}
}
/* 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;
{
/* 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 };
}
break;
case INITIALIZER_STRING:
- size = result->string.string.size;
+ size = result->string.string.size + 1;
break;
case INITIALIZER_WIDE_STRING:
}
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);
}
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: