- size_t i, n = get_initializer_compound_n_entries(initializer);
- ir_type *element_type = get_array_element_type(type);
- for (i = 0; i < n; ++i) {
- ir_initializer_t *sub_initializer
- = get_initializer_compound_value(initializer, i);
-
- if (need_nl) {
- fprintf(F, "\n%s ", prefix);
- need_nl = 0;
+ size_t const n = get_initializer_compound_n_entries(initializer);
+ size_t i;
+
+ if (is_init_string(initializer, type)) {
+ fprintf(F, "\t[0...%u] = '", (unsigned)n - 1);
+ for (i = 0; i != n; ++i) {
+ ir_initializer_t const* const val = get_initializer_compound_value(initializer, i);
+ ir_tarval* const tv = get_initializer_tarval_value(val);
+ long const v = get_tarval_long(tv);
+
+ switch (v) {
+ case 0x00: fprintf(F, "\\\\000"); break;
+ case 0x07: fprintf(F, "\\\\a"); break;
+ case 0x08: fprintf(F, "\\\\b"); break;
+ case 0x09: fprintf(F, "\\\\t"); break;
+ case 0x0A: fprintf(F, "\\\\n"); break;
+ case 0x0B: fprintf(F, "\\\\v"); break;
+ case 0x0C: fprintf(F, "\\\\f"); break;
+ case 0x0D: fprintf(F, "\\\\r"); break;
+ case 0x1B: fprintf(F, "\\\\033"); break;
+ case 0x22: fprintf(F, "\\\\\\\""); break;
+ case 0x5C: fprintf(F, "\\\\\\\\"); break;
+ default: fprintf(F, "%c", (unsigned char)v); break;
+ }
+ }
+ fprintf(F, "'");
+ } else {
+ ir_type *const element_type = get_array_element_type(type);
+
+ for (i = 0; i < n; ++i) {
+ ir_initializer_t *sub_initializer
+ = get_initializer_compound_value(initializer, i);
+
+ if (need_nl) {
+ fprintf(F, "\n%s ", prefix);
+ need_nl = 0;
+ }
+ fprintf(F, "[%d]", (int) i);
+ dump_ir_initializers_to_file(F, prefix, sub_initializer, element_type);