print_string(" }");
return;
}
+
case INITIALIZER_STRING:
+ print_string(get_string_encoding_prefix(initializer->string.encoding));
print_quoted_string(&initializer->string.string, '"');
return;
- case INITIALIZER_WIDE_STRING:
- print_quoted_string(&initializer->string.string, '"');
- return;
+
case INITIALIZER_DESIGNATOR:
print_designator(initializer->designator.designator);
print_string(" = ");
{
switch (initializer->kind) {
case INITIALIZER_STRING:
- case INITIALIZER_WIDE_STRING:
case INITIALIZER_DESIGNATOR:
return EXPR_CLASS_CONSTANT;
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_wide_string_t initializer_wide_string_t;
typedef struct initializer_designator_t initializer_designator_t;
typedef union initializer_t initializer_t;
break;
descend_into_subtype(&path);
}
- } else if (sub_initializer->kind == INITIALIZER_STRING
- || sub_initializer->kind == INITIALIZER_WIDE_STRING) {
+ } else if (sub_initializer->kind == INITIALIZER_STRING) {
/* we might have to descend into types until we're at a scalar
* type */
while (true) {
return result;
}
-static ir_initializer_t *create_ir_initializer_string(
- const initializer_string_t *initializer, type_t *type)
+static ir_initializer_t *create_ir_initializer_string(initializer_string_t const *const initializer, type_t *type)
{
type = skip_typeref(type);
- size_t string_len = initializer->string.size;
assert(type->kind == TYPE_ARRAY);
assert(type->array.size_constant);
- size_t len = type->array.size;
- ir_initializer_t *irinitializer = create_initializer_compound(len);
-
- const char *string = initializer->string.begin;
- ir_mode *mode = get_ir_mode_storage(type->array.element_type);
-
- for (size_t i = 0; i < len; ++i) {
- char c = 0;
- if (i < string_len)
- c = string[i];
-
- ir_tarval *tv = new_tarval_from_long(c, mode);
- ir_initializer_t *char_initializer = create_initializer_tarval(tv);
-
- set_initializer_compound_value(irinitializer, i, char_initializer);
- }
-
- return irinitializer;
-}
-
-static ir_initializer_t *create_ir_initializer_wide_string(
- const initializer_wide_string_t *initializer, type_t *type)
-{
- assert(type->kind == TYPE_ARRAY);
- assert(type->array.size_constant);
- size_t len = type->array.size;
- size_t string_len = wstrlen(&initializer->string);
- ir_initializer_t *irinitializer = create_initializer_compound(len);
-
- const char *p = initializer->string.begin;
- ir_mode *mode = get_type_mode(ir_type_wchar_t);
-
- for (size_t i = 0; i < len; ++i) {
- utf32 c = 0;
- if (i < string_len) {
- c = read_utf8_char(&p);
+ size_t const str_len = initializer->string.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) {
+ case STRING_ENCODING_CHAR:
+ for (size_t i = 0; i != arr_len; ++i) {
+ char const c = i < str_len ? *p++ : 0;
+ ir_tarval *const tv = new_tarval_from_long(c, mode);
+ ir_initializer_t *const tvinit = create_initializer_tarval(tv);
+ set_initializer_compound_value(irinit, i, tvinit);
}
- ir_tarval *tv = new_tarval_from_long(c, mode);
- ir_initializer_t *char_initializer = create_initializer_tarval(tv);
+ break;
- set_initializer_compound_value(irinitializer, i, char_initializer);
+ case STRING_ENCODING_WIDE:
+ for (size_t i = 0; i != arr_len; ++i) {
+ utf32 const c = i < str_len ? read_utf8_char(&p) : 0;
+ ir_tarval *const tv = new_tarval_from_long(c, mode);
+ ir_initializer_t *const tvinit = create_initializer_tarval(tv);
+ set_initializer_compound_value(irinit, i, tvinit);
+ }
+ break;
}
- return irinitializer;
+ return irinit;
}
static ir_initializer_t *create_ir_initializer(
case INITIALIZER_STRING:
return create_ir_initializer_string(&initializer->string, type);
- case INITIALIZER_WIDE_STRING:
- return create_ir_initializer_wide_string(&initializer->wide_string,
- type);
-
case INITIALIZER_LIST:
return create_ir_initializer_list(&initializer->list, type);
INITIALIZER_VALUE,
INITIALIZER_LIST,
INITIALIZER_STRING,
- INITIALIZER_WIDE_STRING,
INITIALIZER_DESIGNATOR
} initializer_kind_t;
struct initializer_string_t {
initializer_base_t base;
+ string_encoding_t encoding;
string_t string;
};
-struct initializer_wide_string_t {
- initializer_base_t base;
- string_t string;
-};
-
struct initializer_designator_t {
initializer_base_t base;
designator_t *designator;
initializer_value_t value;
initializer_list_t list;
initializer_string_t string;
- initializer_wide_string_t wide_string;
initializer_designator_t designator;
};
static const size_t sizes[] = {
[INITIALIZER_VALUE] = sizeof(initializer_value_t),
[INITIALIZER_STRING] = sizeof(initializer_string_t),
- [INITIALIZER_WIDE_STRING] = sizeof(initializer_wide_string_t),
[INITIALIZER_LIST] = sizeof(initializer_list_t),
[INITIALIZER_DESIGNATOR] = sizeof(initializer_designator_t)
};
}
}
-static initializer_t *initializer_from_string(array_type_t *const type,
- const string_t *const string)
+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.string = *string;
-
- return initializer;
-}
-
-static initializer_t *initializer_from_wide_string(array_type_t *const type,
- const string_t *const string)
-{
- /* TODO: check len vs. size of array type */
- (void) type;
-
- initializer_t *const initializer =
- allocate_initializer_zero(INITIALIZER_WIDE_STRING);
- initializer->wide_string.string = *string;
+ initializer->string.encoding = enc;
+ initializer->string.string = *string;
return initializer;
}
if (akind == ATOMIC_TYPE_CHAR
|| akind == ATOMIC_TYPE_SCHAR
|| akind == ATOMIC_TYPE_UCHAR) {
- return initializer_from_string(array_type,
- &expression->string_literal.value);
+ goto make_string_init;
}
break;
}
case STRING_ENCODING_WIDE: {
type_t *bare_wchar_type = skip_typeref(type_wchar_t);
if (get_unqualified_type(element_type) == bare_wchar_type) {
- return initializer_from_wide_string(array_type,
- &expression->string_literal.value);
+make_string_init:
+ return initializer_from_string(array_type, expression->string_literal.encoding, &expression->string_literal.value);
}
break;
}
size = result->string.string.size + 1;
break;
- case INITIALIZER_WIDE_STRING:
- size = result->wide_string.string.size;
- break;
-
case INITIALIZER_DESIGNATOR:
case INITIALIZER_VALUE:
/* can happen for parse errors */
}
case INITIALIZER_STRING:
- case INITIALIZER_WIDE_STRING:
case INITIALIZER_DESIGNATOR: // designators have no payload
return true;
}
case INITIALIZER_DESIGNATOR:
walk_designator(initializer->designator.designator, env);
return;
+
case INITIALIZER_STRING:
- case INITIALIZER_WIDE_STRING:
return;
}
}