aboutsummaryrefslogtreecommitdiff
path: root/gdb/valprint.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/valprint.c')
-rw-r--r--gdb/valprint.c178
1 files changed, 80 insertions, 98 deletions
diff --git a/gdb/valprint.c b/gdb/valprint.c
index d4c8696..591978a 100644
--- a/gdb/valprint.c
+++ b/gdb/valprint.c
@@ -1,5 +1,6 @@
/* Print values for GDB, the GNU debugger.
- Copyright 1986, 1988, 1989, 1991 Free Software Foundation, Inc.
+ Copyright 1986, 1988, 1989, 1991, 1992, 1993, 1994
+ Free Software Foundation, Inc.
This file is part of GDB.
@@ -18,7 +19,7 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "defs.h"
-#include <string.h>
+#include "gdb_string.h"
#include "symtab.h"
#include "gdbtypes.h"
#include "value.h"
@@ -61,9 +62,6 @@ set_output_radix PARAMS ((char *, int, struct cmd_list_element *));
static void
set_output_radix_1 PARAMS ((int, unsigned));
-static void value_print_array_elements PARAMS ((value_ptr, GDB_FILE *, int,
- enum val_prettyprint));
-
/* Maximum number of chars to print for a string pointer value or vector
contents, or UINT_MAX for no limit. Note that "set print elements 0"
stores UINT_MAX in print_max, which displays in a show command as
@@ -84,8 +82,17 @@ int output_format = 0;
unsigned int repeat_count_threshold = 10;
-int prettyprint_structs; /* Controls pretty printing of structures */
-int prettyprint_arrays; /* Controls pretty printing of arrays. */
+/* If nonzero, stops printing of char arrays at first null. */
+
+int stop_print_at_null;
+
+/* Controls pretty printing of structures. */
+
+int prettyprint_structs;
+
+/* Controls pretty printing of arrays. */
+
+int prettyprint_arrays;
/* If nonzero, causes unions inside structures or other unions to be
printed. */
@@ -163,8 +170,6 @@ value_print (val, stream, format, pretty)
int format;
enum val_prettyprint pretty;
{
- register unsigned int n, typelen;
-
if (val == 0)
{
printf_filtered ("<address of value unknown>");
@@ -175,59 +180,7 @@ value_print (val, stream, format, pretty)
printf_filtered ("<value optimized out>");
return 0;
}
-
- /* 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))
- {
- n = VALUE_REPETITIONS (val);
- 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));
- }
+ return LA_VALUE_PRINT (val, stream, format, pretty);
}
/* Called by various <lang>_val_print routines to print TYPE_CODE_INT's */
@@ -252,29 +205,41 @@ val_print_type_code_int (type, valaddr, stream)
sizeof (LONGEST) ones. */
len = TYPE_LENGTH (type);
-#if TARGET_BYTE_ORDER == BIG_ENDIAN
- for (p = valaddr;
- len > sizeof (LONGEST) && p < valaddr + TYPE_LENGTH (type);
- p++)
-#else /* Little endian. */
- first_addr = valaddr;
- for (p = valaddr + TYPE_LENGTH (type) - 1;
- len > sizeof (LONGEST) && p >= valaddr;
- p--)
-#endif /* Little endian. */
+ if (TARGET_BYTE_ORDER == BIG_ENDIAN)
{
- if (*p == 0)
+ for (p = valaddr;
+ len > sizeof (LONGEST) && p < valaddr + TYPE_LENGTH (type);
+ p++)
{
- len--;
+ if (*p == 0)
+ {
+ len--;
+ }
+ else
+ {
+ break;
+ }
}
- else
+ first_addr = p;
+ }
+ else
+ {
+ first_addr = valaddr;
+ for (p = valaddr + TYPE_LENGTH (type) - 1;
+ len > sizeof (LONGEST) && p >= valaddr;
+ p--)
{
- break;
+ if (*p == 0)
+ {
+ len--;
+ }
+ else
+ {
+ break;
+ }
}
}
-#if TARGET_BYTE_ORDER == BIG_ENDIAN
- first_addr = p;
-#endif
+
if (len <= sizeof (LONGEST))
{
/* The most significant bytes are zero, so we can just get
@@ -363,6 +328,7 @@ print_longest (stream, format, use_local, val_long)
fprintf_filtered (stream,
use_local ? local_octal_format_custom ("ll")
: "%llo",
+ val_long);
break;
case 'b':
fprintf_filtered (stream, local_hex_format_custom ("02ll"), val_long);
@@ -499,13 +465,16 @@ print_floating (valaddr, type, stream)
/* Assume that floating point byte order is the same as
integer byte order. */
-#if TARGET_BYTE_ORDER == BIG_ENDIAN
- low = extract_unsigned_integer (valaddr + 4, 4);
- high = extract_unsigned_integer (valaddr, 4);
-#else
- low = extract_unsigned_integer (valaddr, 4);
- high = extract_unsigned_integer (valaddr + 4, 4);
-#endif
+ if (TARGET_BYTE_ORDER == BIG_ENDIAN)
+ {
+ low = extract_unsigned_integer (valaddr + 4, 4);
+ high = extract_unsigned_integer (valaddr, 4);
+ }
+ else
+ {
+ low = extract_unsigned_integer (valaddr, 4);
+ high = extract_unsigned_integer (valaddr + 4, 4);
+ }
nonnegative = ((high & 0x80000000) == 0);
is_nan = (((high >> 20) & 0x7ff) == 0x7ff
&& ! ((((high & 0xfffff) == 0)) && (low == 0)));
@@ -553,17 +522,23 @@ print_hex_chars (stream, valaddr, len)
/* FIXME: We should be not printing leading zeroes in most cases. */
fprintf_filtered (stream, local_hex_format_prefix ());
-#if TARGET_BYTE_ORDER == BIG_ENDIAN
- for (p = valaddr;
- p < valaddr + len;
- p++)
-#else /* Little endian. */
- for (p = valaddr + len - 1;
- p >= valaddr;
- p--)
-#endif
+ if (TARGET_BYTE_ORDER == BIG_ENDIAN)
{
- fprintf_filtered (stream, "%02x", *p);
+ for (p = valaddr;
+ p < valaddr + len;
+ p++)
+ {
+ fprintf_filtered (stream, "%02x", *p);
+ }
+ }
+ else
+ {
+ for (p = valaddr + len - 1;
+ p >= valaddr;
+ p--)
+ {
+ fprintf_filtered (stream, "%02x", *p);
+ }
}
fprintf_filtered (stream, local_hex_format_suffix ());
}
@@ -657,7 +632,7 @@ val_print_array_elements (type, valaddr, address, stream, format, deref_ref,
}
}
-static void
+void
value_print_array_elements (val, stream, format, pretty)
value_ptr val;
GDB_FILE *stream;
@@ -696,7 +671,7 @@ value_print_array_elements (val, stream, format, pretty)
val_print (VALUE_TYPE (val), VALUE_CONTENTS (val) + typelen * i,
VALUE_ADDRESS (val) + typelen * i, stream, format, 1,
0, pretty);
- fprintf_unfiltered (stream, " <repeats %u times>", reps);
+ fprintf_filtered (stream, " <repeats %u times>", reps);
i = rep1 - 1;
things_printed += repeat_count_threshold;
}
@@ -1056,6 +1031,13 @@ _initialize_valprint ()
&showprintlist);
add_show_from_set
+ (add_set_cmd ("null-stop", no_class, var_boolean,
+ (char *)&stop_print_at_null,
+ "Set printing of char arrays to stop at first null char.",
+ &setprintlist),
+ &showprintlist);
+
+ add_show_from_set
(add_set_cmd ("repeats", no_class, var_uinteger,
(char *)&repeat_count_threshold,
"Set threshold for repeated print elements.\n\