+/* c_val_print helper for TYPE_CODE_UNION. */
+
+static void
+c_val_print_union (struct type *type, const gdb_byte *valaddr,
+ int embedded_offset, CORE_ADDR address,
+ struct ui_file *stream, int recurse,
+ const struct value *original_value,
+ const struct value_print_options *options)
+{
+ if (recurse && !options->unionprint)
+ {
+ fprintf_filtered (stream, "{...}");
+ }
+ else
+ {
+ c_val_print_struct (type, valaddr, embedded_offset, address, stream,
+ recurse, original_value, options);
+ }
+}
+
+/* c_val_print helper for TYPE_CODE_INT. */
+
+static void
+c_val_print_int (struct type *type, struct type *unresolved_type,
+ const gdb_byte *valaddr, int embedded_offset,
+ struct ui_file *stream, const struct value *original_value,
+ const struct value_print_options *options)
+{
+ struct gdbarch *arch = get_type_arch (type);
+ int unit_size = gdbarch_addressable_memory_unit_size (arch);
+
+ if (options->format || options->output_format)
+ {
+ struct value_print_options opts = *options;
+
+ opts.format = (options->format ? options->format
+ : options->output_format);
+ val_print_scalar_formatted (type, valaddr, embedded_offset,
+ original_value, &opts, 0, stream);
+ }
+ else
+ {
+ val_print_type_code_int (type, valaddr + embedded_offset * unit_size,
+ stream);
+ /* C and C++ has no single byte int type, char is used
+ instead. Since we don't know whether the value is really
+ intended to be used as an integer or a character, print
+ the character equivalent as well. */
+ if (c_textual_element_type (unresolved_type, options->format))