diff options
author | Per Bothner <per@bothner.com> | 1994-06-05 01:43:40 +0000 |
---|---|---|
committer | Per Bothner <per@bothner.com> | 1994-06-05 01:43:40 +0000 |
commit | e10cfcaa374a1a493e5aa68dc251534800d38124 (patch) | |
tree | d383531402da1319216a25ca121bef26f3610d54 /gdb/c-valprint.c | |
parent | c4d7d826d72aeabda9a30bf836a2734033c476e3 (diff) | |
download | gdb-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.c | 61 |
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)); + } +} |