aboutsummaryrefslogtreecommitdiff
path: root/gdb/c-valprint.c
diff options
context:
space:
mode:
authorPer Bothner <per@bothner.com>1994-06-05 01:43:40 +0000
committerPer Bothner <per@bothner.com>1994-06-05 01:43:40 +0000
commite10cfcaa374a1a493e5aa68dc251534800d38124 (patch)
treed383531402da1319216a25ca121bef26f3610d54 /gdb/c-valprint.c
parentc4d7d826d72aeabda9a30bf836a2734033c476e3 (diff)
downloadgdb-e10cfcaa374a1a493e5aa68dc251534800d38124.zip
gdb-e10cfcaa374a1a493e5aa68dc251534800d38124.tar.gz
gdb-e10cfcaa374a1a493e5aa68dc251534800d38124.tar.bz2
Fix value_print, which used to be ostensibly langauge-indepentdent,
but would print pointers and arrays in C syntax. Instead, call a language-specific function. See ChangeLog for details.
Diffstat (limited to 'gdb/c-valprint.c')
-rw-r--r--gdb/c-valprint.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/gdb/c-valprint.c b/gdb/c-valprint.c
index cea6889..5960369 100644
--- a/gdb/c-valprint.c
+++ b/gdb/c-valprint.c
@@ -434,3 +434,64 @@ c_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
gdb_flush (stream);
return (0);
}
+
+int
+c_value_print (val, stream, format, pretty)
+ value_ptr val;
+ GDB_FILE *stream;
+ int format;
+ enum val_prettyprint pretty;
+{
+ /* A "repeated" value really contains several values in a row.
+ They are made by the @ operator.
+ Print such values as if they were arrays. */
+
+ if (VALUE_REPEATED (val))
+ {
+ register unsigned int n = VALUE_REPETITIONS (val);
+ register unsigned int typelen = TYPE_LENGTH (VALUE_TYPE (val));
+ fprintf_filtered (stream, "{");
+ /* Print arrays of characters using string syntax. */
+ if (typelen == 1 && TYPE_CODE (VALUE_TYPE (val)) == TYPE_CODE_INT
+ && format == 0)
+ LA_PRINT_STRING (stream, VALUE_CONTENTS (val), n, 0);
+ else
+ {
+ value_print_array_elements (val, stream, format, pretty);
+ }
+ fprintf_filtered (stream, "}");
+ return (n * typelen);
+ }
+ else
+ {
+ struct type *type = VALUE_TYPE (val);
+
+ /* If it is a pointer, indicate what it points to.
+
+ Print type also if it is a reference.
+
+ C++: if it is a member pointer, we will take care
+ of that when we print it. */
+ if (TYPE_CODE (type) == TYPE_CODE_PTR ||
+ TYPE_CODE (type) == TYPE_CODE_REF)
+ {
+ /* Hack: remove (char *) for char strings. Their
+ type is indicated by the quoted string anyway. */
+ if (TYPE_CODE (type) == TYPE_CODE_PTR &&
+ TYPE_LENGTH (TYPE_TARGET_TYPE (type)) == sizeof(char) &&
+ TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_INT &&
+ !TYPE_UNSIGNED (TYPE_TARGET_TYPE (type)))
+ {
+ /* Print nothing */
+ }
+ else
+ {
+ fprintf_filtered (stream, "(");
+ type_print (type, "", stream, -1);
+ fprintf_filtered (stream, ") ");
+ }
+ }
+ return (val_print (type, VALUE_CONTENTS (val),
+ VALUE_ADDRESS (val), stream, format, 1, 0, pretty));
+ }
+}