This way we do not lose the location information of the string.
}
case INITIALIZER_STRING:
- print_string(get_string_encoding_prefix(initializer->string.encoding));
- print_quoted_string(&initializer->string.string, '"');
+ print_string_literal(get_init_string(initializer), '"');
return;
case INITIALIZER_DESIGNATOR:
typedef struct initializer_base_t initializer_base_t;
typedef struct initializer_list_t initializer_list_t;
typedef struct initializer_value_t initializer_value_t;
-typedef struct initializer_string_t initializer_string_t;
typedef struct initializer_designator_t initializer_designator_t;
typedef union initializer_t initializer_t;
return result;
}
-static ir_initializer_t *create_ir_initializer_string(initializer_string_t const *const initializer, type_t *type)
+static ir_initializer_t *create_ir_initializer_string(initializer_t const *const init, type_t *type)
{
type = skip_typeref(type);
assert(type->kind == TYPE_ARRAY);
assert(type->array.size_constant);
- size_t const str_len = initializer->string.size;
+ string_literal_expression_t const *const str = get_init_string(init);
+ size_t const str_len = str->value.size;
size_t const arr_len = type->array.size;
ir_initializer_t *const irinit = create_initializer_compound(arr_len);
ir_mode *const mode = get_ir_mode_storage(type->array.element_type);
- char const * p = initializer->string.begin;
- switch (initializer->encoding) {
+ char const * p = str->value.begin;
+ switch (str->encoding) {
case STRING_ENCODING_CHAR:
for (size_t i = 0; i != arr_len; ++i) {
char const c = i < str_len ? *p++ : 0;
{
switch(initializer->kind) {
case INITIALIZER_STRING:
- return create_ir_initializer_string(&initializer->string, type);
+ return create_ir_initializer_string(initializer, type);
case INITIALIZER_LIST:
return create_ir_initializer_list(&initializer->list, type);
initializer_t *initializers[];
};
-struct initializer_string_t {
- initializer_base_t base;
- string_encoding_t encoding;
- string_t string;
-};
-
struct initializer_designator_t {
initializer_base_t base;
designator_t *designator;
initializer_base_t base;
initializer_value_t value;
initializer_list_t list;
- initializer_string_t string;
initializer_designator_t designator;
};
+static inline string_literal_expression_t const *get_init_string(initializer_t const *const init)
+{
+ assert(init->kind == INITIALIZER_STRING);
+ assert(init->value.value->kind == EXPR_STRING_LITERAL);
+ return &init->value.value->string_literal;
+}
+
/**
* The statement kinds.
*/
{
static const size_t sizes[] = {
[INITIALIZER_VALUE] = sizeof(initializer_value_t),
- [INITIALIZER_STRING] = sizeof(initializer_string_t),
+ [INITIALIZER_STRING] = sizeof(initializer_value_t),
[INITIALIZER_LIST] = sizeof(initializer_list_t),
[INITIALIZER_DESIGNATOR] = sizeof(initializer_designator_t)
};
}
}
-static initializer_t *initializer_from_string(array_type_t *const type, string_encoding_t const enc, string_t const *const string)
-{
- /* TODO: check len vs. size of array type */
- (void) type;
-
- initializer_t *initializer = allocate_initializer_zero(INITIALIZER_STRING);
- initializer->string.encoding = enc;
- initializer->string.string = *string;
-
- return initializer;
-}
-
/**
* Build an initializer from a given expression.
*/
case STRING_ENCODING_WIDE: {
type_t *bare_wchar_type = skip_typeref(type_wchar_t);
if (get_unqualified_type(element_type) == bare_wchar_type) {
-make_string_init:
- return initializer_from_string(array_type, expression->string_literal.encoding, &expression->string_literal.value);
+make_string_init:;
+ initializer_t *const init = allocate_initializer_zero(INITIALIZER_STRING);
+ init->value.value = expression;
+ return init;
}
break;
}
size = max_index + 1;
break;
- case INITIALIZER_STRING:
- size = get_string_len(result->string.encoding, &result->string.string) + 1;
+ case INITIALIZER_STRING: {
+ string_literal_expression_t const *const str = get_init_string(result);
+ size = get_string_len(str->encoding, &str->value) + 1;
break;
+ }
case INITIALIZER_DESIGNATOR:
case INITIALIZER_VALUE: