aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorAndrew Burgess <andrew.burgess@embecosm.com>2020-06-03 16:44:05 +0100
committerAndrew Burgess <andrew.burgess@embecosm.com>2020-06-23 13:34:11 +0100
commitd711ee67aca06c9753f09dc154eb8c75cb4f58ef (patch)
tree3eb445d93e521604f3e07adadf2eba3ceac068f6 /gdb
parent52b50f2c1b1eaf6fd6e685e2c9575f92c581a6dc (diff)
downloadgdb-d711ee67aca06c9753f09dc154eb8c75cb4f58ef.zip
gdb-d711ee67aca06c9753f09dc154eb8c75cb4f58ef.tar.gz
gdb-d711ee67aca06c9753f09dc154eb8c75cb4f58ef.tar.bz2
gdb: Convert language la_printstr field to a method
This commit changes the language_data::la_printstr function pointer member variable into a member function of language_defn. There should be no user visible changes after this commit. gdb/ChangeLog: * ada-lang.c (ada_language_data): Delete la_printstr initializer. (ada_language::printstr): New member function. * c-lang.c (c_language_data): Delete la_printstr initializer. (cplus_language_data): Likewise. (asm_language_data): Likewise. (minimal_language_data): Likewise. * d-lang.c (d_language_data): Likewise. * f-lang.c (f_printstr): Rename to f_language::printstr. (f_language_data): Delete la_printstr initializer. (f_language::printstr): New member function, implementation from f_printstr. * go-lang.c (go_language_data): Delete la_printstr initializer. * language.c (language_defn::printstr): Define new member function. (unk_lang_printstr): Delete. (unknown_language_data): Delete la_printstr initializer. (unknown_language::printstr): New member function. (auto_language_data): Delete la_printstr initializer. (auto_language::printstr): New member function. * language.h (language_data): Delete la_printstr field. (language_defn::printstr): Declare new member function. (LA_PRINT_STRING): Update call to printstr. * m2-lang.c (m2_printstr): Rename to m2_language::printstr. (m2_language_data): Delete la_printstr initializer. (m2_language::printstr): New member function, implementation from m2_printstr. * objc-lang.c (objc_language_data): Delete la_printstr initializer. * opencl-lang.c (opencl_language_data): Likewise. * p-lang.c (pascal_printstr): Rename to pascal_language::printstr. (pascal_language_data): Delete la_printstr initializer. (pascal_language::printstr): New member function, implementation from pascal_printstr. * p-lang.h (pascal_printstr): Delete declaration. * rust-lang.c (rust_printstr): Update header comment. (rust_language_data): Delete la_printstr initializer. (rust_language::printstr): New member function.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog40
-rw-r--r--gdb/ada-lang.c12
-rw-r--r--gdb/c-lang.c4
-rw-r--r--gdb/d-lang.c1
-rw-r--r--gdb/f-lang.c43
-rw-r--r--gdb/go-lang.c1
-rw-r--r--gdb/language.c44
-rw-r--r--gdb/language.h19
-rw-r--r--gdb/m2-lang.c156
-rw-r--r--gdb/objc-lang.c1
-rw-r--r--gdb/opencl-lang.c1
-rw-r--r--gdb/p-lang.c197
-rw-r--r--gdb/p-lang.h4
-rw-r--r--gdb/rust-lang.c14
14 files changed, 297 insertions, 240 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 8287719..e768e44 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,45 @@
2020-06-23 Andrew Burgess <andrew.burgess@embecosm.com>
+ * ada-lang.c (ada_language_data): Delete la_printstr initializer.
+ (ada_language::printstr): New member function.
+ * c-lang.c (c_language_data): Delete la_printstr initializer.
+ (cplus_language_data): Likewise.
+ (asm_language_data): Likewise.
+ (minimal_language_data): Likewise.
+ * d-lang.c (d_language_data): Likewise.
+ * f-lang.c (f_printstr): Rename to f_language::printstr.
+ (f_language_data): Delete la_printstr initializer.
+ (f_language::printstr): New member function, implementation from
+ f_printstr.
+ * go-lang.c (go_language_data): Delete la_printstr initializer.
+ * language.c (language_defn::printstr): Define new member
+ function.
+ (unk_lang_printstr): Delete.
+ (unknown_language_data): Delete la_printstr initializer.
+ (unknown_language::printstr): New member function.
+ (auto_language_data): Delete la_printstr initializer.
+ (auto_language::printstr): New member function.
+ * language.h (language_data): Delete la_printstr field.
+ (language_defn::printstr): Declare new member function.
+ (LA_PRINT_STRING): Update call to printstr.
+ * m2-lang.c (m2_printstr): Rename to m2_language::printstr.
+ (m2_language_data): Delete la_printstr initializer.
+ (m2_language::printstr): New member function, implementation from
+ m2_printstr.
+ * objc-lang.c (objc_language_data): Delete la_printstr
+ initializer.
+ * opencl-lang.c (opencl_language_data): Likewise.
+ * p-lang.c (pascal_printstr): Rename to pascal_language::printstr.
+ (pascal_language_data): Delete la_printstr initializer.
+ (pascal_language::printstr): New member function, implementation
+ from pascal_printstr.
+ * p-lang.h (pascal_printstr): Delete declaration.
+ * rust-lang.c (rust_printstr): Update header comment.
+ (rust_language_data): Delete la_printstr initializer.
+ (rust_language::printstr): New member function.
+
+2020-06-23 Andrew Burgess <andrew.burgess@embecosm.com>
+
* ada-lang.c (ada_language_data): Delete la_printchar initializer.
(ada_language::printchar): New member function.
* c-lang.c (c_language_data): Delete la_printchar initializer.
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index e69c3cb..62ea21a 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -13681,7 +13681,6 @@ extern const struct language_data ada_language_data =
macro_expansion_no,
ada_extensions,
&ada_exp_descriptor,
- ada_printstr, /* Function to print string constant */
ada_print_typedef, /* Print a typedef using appropriate syntax */
NULL, /* name_of_this */
true, /* la_store_sym_names_in_linkage_form_p */
@@ -14122,6 +14121,17 @@ public:
ada_printchar (ch, chtype, stream);
}
+ /* See language.h. */
+
+ void printstr (struct ui_file *stream, struct type *elttype,
+ const gdb_byte *string, unsigned int length,
+ const char *encoding, int force_ellipses,
+ const struct value_print_options *options) const override
+ {
+ ada_printstr (stream, elttype, string, length, encoding,
+ force_ellipses, options);
+ }
+
protected:
/* See language.h. */
diff --git a/gdb/c-lang.c b/gdb/c-lang.c
index f7b1b80..d6bbc02 100644
--- a/gdb/c-lang.c
+++ b/gdb/c-lang.c
@@ -889,7 +889,6 @@ extern const struct language_data c_language_data =
macro_expansion_c,
c_extensions,
&exp_descriptor_c,
- c_printstr, /* Function to print string constant */
c_print_typedef, /* Print a typedef using appropriate syntax */
NULL, /* name_of_this */
true, /* la_store_sym_names_in_linkage_form_p */
@@ -993,7 +992,6 @@ extern const struct language_data cplus_language_data =
macro_expansion_c,
cplus_extensions,
&exp_descriptor_c,
- c_printstr, /* Function to print string constant */
c_print_typedef, /* Print a typedef using appropriate syntax */
"this", /* name_of_this */
false, /* la_store_sym_names_in_linkage_form_p */
@@ -1194,7 +1192,6 @@ extern const struct language_data asm_language_data =
macro_expansion_c,
asm_extensions,
&exp_descriptor_c,
- c_printstr, /* Function to print string constant */
c_print_typedef, /* Print a typedef using appropriate syntax */
NULL, /* name_of_this */
true, /* la_store_sym_names_in_linkage_form_p */
@@ -1253,7 +1250,6 @@ extern const struct language_data minimal_language_data =
macro_expansion_c,
NULL,
&exp_descriptor_c,
- c_printstr, /* Function to print string constant */
c_print_typedef, /* Print a typedef using appropriate syntax */
NULL, /* name_of_this */
true, /* la_store_sym_names_in_linkage_form_p */
diff --git a/gdb/d-lang.c b/gdb/d-lang.c
index f76b74f..17ab38e 100644
--- a/gdb/d-lang.c
+++ b/gdb/d-lang.c
@@ -142,7 +142,6 @@ extern const struct language_data d_language_data =
macro_expansion_no,
d_extensions,
&exp_descriptor_c,
- c_printstr, /* Function to print string constant. */
c_print_typedef, /* Print a typedef using appropriate
syntax. */
"this",
diff --git a/gdb/f-lang.c b/gdb/f-lang.c
index 68d0a4e..67c2ea3 100644
--- a/gdb/f-lang.c
+++ b/gdb/f-lang.c
@@ -68,29 +68,6 @@ f_get_encoding (struct type *type)
return encoding;
}
-/* Print the character string STRING, printing at most LENGTH characters.
- Printing stops early if the number hits print_max; repeat counts
- are printed as appropriate. Print ellipses at the end if we
- had to stop before printing LENGTH characters, or if FORCE_ELLIPSES.
- FIXME: This is a copy of the same function from c-exp.y. It should
- be replaced with a true F77 version. */
-
-static void
-f_printstr (struct ui_file *stream, struct type *type, const gdb_byte *string,
- unsigned int length, const char *encoding, int force_ellipses,
- const struct value_print_options *options)
-{
- const char *type_encoding = f_get_encoding (type);
-
- if (TYPE_LENGTH (type) == 4)
- fputs_filtered ("4_", stream);
-
- if (!encoding || !*encoding)
- encoding = type_encoding;
-
- generic_printstr (stream, type, string, length, encoding,
- force_ellipses, '\'', 0, options);
-}
/* Table of operators and their precedences for printing expressions. */
@@ -536,7 +513,6 @@ extern const struct language_data f_language_data =
macro_expansion_no,
f_extensions,
&exp_descriptor_f,
- f_printstr, /* function to print string constant */
f_print_typedef, /* Print a typedef using appropriate syntax */
NULL, /* name_of_this */
false, /* la_store_sym_names_in_linkage_form_p */
@@ -707,6 +683,25 @@ public:
fputs_filtered ("'", stream);
}
+ /* See language.h. */
+
+ void printstr (struct ui_file *stream, struct type *elttype,
+ const gdb_byte *string, unsigned int length,
+ const char *encoding, int force_ellipses,
+ const struct value_print_options *options) const override
+ {
+ const char *type_encoding = f_get_encoding (elttype);
+
+ if (TYPE_LENGTH (elttype) == 4)
+ fputs_filtered ("4_", stream);
+
+ if (!encoding || !*encoding)
+ encoding = type_encoding;
+
+ generic_printstr (stream, elttype, string, length, encoding,
+ force_ellipses, '\'', 0, options);
+ }
+
protected:
/* See language.h. */
diff --git a/gdb/go-lang.c b/gdb/go-lang.c
index 819780b..69f14b8 100644
--- a/gdb/go-lang.c
+++ b/gdb/go-lang.c
@@ -527,7 +527,6 @@ extern const struct language_data go_language_data =
macro_expansion_no,
NULL,
&exp_descriptor_c,
- c_printstr, /* Function to print string constant. */
c_print_typedef, /* Print a typedef using appropriate
syntax. */
NULL, /* name_of_this */
diff --git a/gdb/language.c b/gdb/language.c
index 34990e0..9867ac4 100644
--- a/gdb/language.c
+++ b/gdb/language.c
@@ -669,6 +669,18 @@ language_defn::printchar (int ch, struct type *chtype,
c_printchar (ch, chtype, stream);
}
+/* See language.h. */
+
+void
+language_defn::printstr (struct ui_file *stream, struct type *elttype,
+ const gdb_byte *string, unsigned int length,
+ const char *encoding, int force_ellipses,
+ const struct value_print_options *options) const
+{
+ c_printstr (stream, elttype, string, length, encoding, force_ellipses,
+ options);
+}
+
/* The default implementation of the get_symbol_name_matcher_inner method
from the language_defn class. Matches with strncmp_iw. */
@@ -734,16 +746,6 @@ default_is_string_type_p (struct type *type)
return (type->code () == TYPE_CODE_STRING);
}
-static void
-unk_lang_printstr (struct ui_file *stream, struct type *type,
- const gdb_byte *string, unsigned int length,
- const char *encoding, int force_ellipses,
- const struct value_print_options *options)
-{
- error (_("internal error - unimplemented "
- "function unk_lang_printstr called."));
-}
-
static const struct op_print unk_op_print_tab[] =
{
{NULL, OP_NULL, PREC_NULL, 0}
@@ -772,7 +774,6 @@ extern const struct language_data unknown_language_data =
macro_expansion_no,
NULL,
&exp_descriptor_standard,
- unk_lang_printstr,
default_print_typedef, /* Print a typedef using appropriate syntax */
"this", /* name_of_this */
true, /* store_sym_names_in_linkage_form_p */
@@ -857,6 +858,16 @@ public:
{
error (_("unimplemented unknown_language::printchar called"));
}
+
+ /* See language.h. */
+
+ void printstr (struct ui_file *stream, struct type *elttype,
+ const gdb_byte *string, unsigned int length,
+ const char *encoding, int force_ellipses,
+ const struct value_print_options *options) const override
+ {
+ error (_("unimplemented unknown_language::printstr called"));
+ }
};
/* Single instance of the unknown language class. */
@@ -876,7 +887,6 @@ extern const struct language_data auto_language_data =
macro_expansion_no,
NULL,
&exp_descriptor_standard,
- unk_lang_printstr,
default_print_typedef, /* Print a typedef using appropriate syntax */
"this", /* name_of_this */
false, /* store_sym_names_in_linkage_form_p */
@@ -961,6 +971,16 @@ public:
{
error (_("unimplemented auto_language::printchar called"));
}
+
+ /* See language.h. */
+
+ void printstr (struct ui_file *stream, struct type *elttype,
+ const gdb_byte *string, unsigned int length,
+ const char *encoding, int force_ellipses,
+ const struct value_print_options *options) const override
+ {
+ error (_("unimplemented auto_language::printstr called"));
+ }
};
/* Single instance of the fake "auto" language. */
diff --git a/gdb/language.h b/gdb/language.h
index fc9efd8..a68b6df 100644
--- a/gdb/language.h
+++ b/gdb/language.h
@@ -225,11 +225,6 @@ struct language_data
const struct exp_descriptor *la_exp_desc;
- void (*la_printstr) (struct ui_file * stream, struct type *elttype,
- const gdb_byte *string, unsigned int length,
- const char *encoding, int force_ellipses,
- const struct value_print_options *);
-
/* Print a typedef using syntax appropriate for this language.
TYPE is the underlying type. NEW_SYMBOL is the symbol naming
the type. STREAM is the output stream on which to print. */
@@ -547,6 +542,16 @@ struct language_defn : language_data
virtual void printchar (int ch, struct type *chtype,
struct ui_file * stream) const;
+/* Print the character string STRING, printing at most LENGTH characters.
+ Printing stops early if the number hits print_max; repeat counts
+ are printed as appropriate. Print ellipses at the end if we
+ had to stop before printing LENGTH characters, or if FORCE_ELLIPSES. */
+
+ virtual void printstr (struct ui_file *stream, struct type *elttype,
+ const gdb_byte *string, unsigned int length,
+ const char *encoding, int force_ellipses,
+ const struct value_print_options *options) const;
+
protected:
/* This is the overridable part of the GET_SYMBOL_NAME_MATCHER method.
@@ -651,8 +656,8 @@ extern enum language set_language (enum language);
#define LA_PRINT_CHAR(ch, type, stream) \
(current_language->printchar (ch, type, stream))
#define LA_PRINT_STRING(stream, elttype, string, length, encoding, force_ellipses, options) \
- (current_language->la_printstr(stream, elttype, string, length, \
- encoding, force_ellipses,options))
+ (current_language->printstr (stream, elttype, string, length, \
+ encoding, force_ellipses,options))
#define LA_EMIT_CHAR(ch, type, stream, quoter) \
(current_language->emitchar (ch, type, stream, quoter))
diff --git a/gdb/m2-lang.c b/gdb/m2-lang.c
index bdb1a46..b84a9a4 100644
--- a/gdb/m2-lang.c
+++ b/gdb/m2-lang.c
@@ -42,86 +42,6 @@ m2_printchar (int c, struct type *type, struct ui_file *stream)
fputs_filtered ("'", stream);
}
-/* Print the character string STRING, printing at most LENGTH characters.
- Printing stops early if the number hits print_max; repeat counts
- are printed as appropriate. Print ellipses at the end if we
- had to stop before printing LENGTH characters, or if FORCE_ELLIPSES.
- FIXME: This is a copy of the same function from c-exp.y. It should
- be replaced with a true Modula version. */
-
-static void
-m2_printstr (struct ui_file *stream, struct type *type, const gdb_byte *string,
- unsigned int length, const char *encoding, int force_ellipses,
- const struct value_print_options *options)
-{
- unsigned int i;
- unsigned int things_printed = 0;
- int in_quotes = 0;
- int need_comma = 0;
-
- if (length == 0)
- {
- fputs_filtered ("\"\"", gdb_stdout);
- return;
- }
-
- for (i = 0; i < length && things_printed < options->print_max; ++i)
- {
- /* Position of the character we are examining
- to see whether it is repeated. */
- unsigned int rep1;
- /* Number of repetitions we have detected so far. */
- unsigned int reps;
-
- QUIT;
-
- if (need_comma)
- {
- fputs_filtered (", ", stream);
- need_comma = 0;
- }
-
- rep1 = i + 1;
- reps = 1;
- while (rep1 < length && string[rep1] == string[i])
- {
- ++rep1;
- ++reps;
- }
-
- if (reps > options->repeat_count_threshold)
- {
- if (in_quotes)
- {
- fputs_filtered ("\", ", stream);
- in_quotes = 0;
- }
- m2_printchar (string[i], type, stream);
- fprintf_filtered (stream, " <repeats %u times>", reps);
- i = rep1 - 1;
- things_printed += options->repeat_count_threshold;
- need_comma = 1;
- }
- else
- {
- if (!in_quotes)
- {
- fputs_filtered ("\"", stream);
- in_quotes = 1;
- }
- LA_EMIT_CHAR (string[i], type, stream, '"');
- ++things_printed;
- }
- }
-
- /* Terminate the quotes if necessary. */
- if (in_quotes)
- fputs_filtered ("\"", stream);
-
- if (force_ellipses || i < length)
- fputs_filtered ("...", stream);
-}
-
/* Return true if TYPE is a string. */
static bool
@@ -309,7 +229,6 @@ extern const struct language_data m2_language_data =
macro_expansion_no,
NULL,
&exp_descriptor_modula2,
- m2_printstr, /* function to print string constant */
m2_print_typedef, /* Print a typedef using appropriate syntax */
NULL, /* name_of_this */
false, /* la_store_sym_names_in_linkage_form_p */
@@ -433,6 +352,81 @@ public:
{
m2_printchar (ch, chtype, stream);
}
+
+ /* See language.h. */
+
+ void printstr (struct ui_file *stream, struct type *elttype,
+ const gdb_byte *string, unsigned int length,
+ const char *encoding, int force_ellipses,
+ const struct value_print_options *options) const override
+ {
+ unsigned int i;
+ unsigned int things_printed = 0;
+ int in_quotes = 0;
+ int need_comma = 0;
+
+ if (length == 0)
+ {
+ fputs_filtered ("\"\"", gdb_stdout);
+ return;
+ }
+
+ for (i = 0; i < length && things_printed < options->print_max; ++i)
+ {
+ /* Position of the character we are examining
+ to see whether it is repeated. */
+ unsigned int rep1;
+ /* Number of repetitions we have detected so far. */
+ unsigned int reps;
+
+ QUIT;
+
+ if (need_comma)
+ {
+ fputs_filtered (", ", stream);
+ need_comma = 0;
+ }
+
+ rep1 = i + 1;
+ reps = 1;
+ while (rep1 < length && string[rep1] == string[i])
+ {
+ ++rep1;
+ ++reps;
+ }
+
+ if (reps > options->repeat_count_threshold)
+ {
+ if (in_quotes)
+ {
+ fputs_filtered ("\", ", stream);
+ in_quotes = 0;
+ }
+ m2_printchar (string[i], elttype, stream);
+ fprintf_filtered (stream, " <repeats %u times>", reps);
+ i = rep1 - 1;
+ things_printed += options->repeat_count_threshold;
+ need_comma = 1;
+ }
+ else
+ {
+ if (!in_quotes)
+ {
+ fputs_filtered ("\"", stream);
+ in_quotes = 1;
+ }
+ LA_EMIT_CHAR (string[i], elttype, stream, '"');
+ ++things_printed;
+ }
+ }
+
+ /* Terminate the quotes if necessary. */
+ if (in_quotes)
+ fputs_filtered ("\"", stream);
+
+ if (force_ellipses || i < length)
+ fputs_filtered ("...", stream);
+ }
};
/* Single instance of the M2 language. */
diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c
index 736c868..95c6c0a 100644
--- a/gdb/objc-lang.c
+++ b/gdb/objc-lang.c
@@ -337,7 +337,6 @@ extern const struct language_data objc_language_data =
macro_expansion_c,
objc_extensions,
&exp_descriptor_standard,
- c_printstr, /* Function to print string constant */
c_print_typedef, /* Print a typedef using appropriate syntax */
"self", /* name_of_this */
false, /* la_store_sym_names_in_linkage_form_p */
diff --git a/gdb/opencl-lang.c b/gdb/opencl-lang.c
index d66f3f8..765202a 100644
--- a/gdb/opencl-lang.c
+++ b/gdb/opencl-lang.c
@@ -1016,7 +1016,6 @@ extern const struct language_data opencl_language_data =
macro_expansion_c,
NULL,
&exp_descriptor_opencl,
- c_printstr, /* Function to print string constant */
c_print_typedef, /* Print a typedef using appropriate syntax */
NULL, /* name_of_this */
false, /* la_store_sym_names_in_linkage_form_p */
diff --git a/gdb/p-lang.c b/gdb/p-lang.c
index b8c99c4..1c6aea9 100644
--- a/gdb/p-lang.c
+++ b/gdb/p-lang.c
@@ -202,106 +202,6 @@ pascal_printchar (int c, struct type *type, struct ui_file *stream)
fputs_filtered ("'", stream);
}
-/* Print the character string STRING, printing at most LENGTH characters.
- Printing stops early if the number hits print_max; repeat counts
- are printed as appropriate. Print ellipses at the end if we
- had to stop before printing LENGTH characters, or if FORCE_ELLIPSES. */
-
-void
-pascal_printstr (struct ui_file *stream, struct type *type,
- const gdb_byte *string, unsigned int length,
- const char *encoding, int force_ellipses,
- const struct value_print_options *options)
-{
- enum bfd_endian byte_order = type_byte_order (type);
- unsigned int i;
- unsigned int things_printed = 0;
- int in_quotes = 0;
- int need_comma = 0;
- int width;
-
- /* Preserve TYPE's original type, just set its LENGTH. */
- check_typedef (type);
- width = TYPE_LENGTH (type);
-
- /* If the string was not truncated due to `set print elements', and
- the last byte of it is a null, we don't print that, in traditional C
- style. */
- if ((!force_ellipses) && length > 0
- && extract_unsigned_integer (string + (length - 1) * width, width,
- byte_order) == 0)
- length--;
-
- if (length == 0)
- {
- fputs_filtered ("''", stream);
- return;
- }
-
- for (i = 0; i < length && things_printed < options->print_max; ++i)
- {
- /* Position of the character we are examining
- to see whether it is repeated. */
- unsigned int rep1;
- /* Number of repetitions we have detected so far. */
- unsigned int reps;
- unsigned long int current_char;
-
- QUIT;
-
- if (need_comma)
- {
- fputs_filtered (", ", stream);
- need_comma = 0;
- }
-
- current_char = extract_unsigned_integer (string + i * width, width,
- byte_order);
-
- rep1 = i + 1;
- reps = 1;
- while (rep1 < length
- && extract_unsigned_integer (string + rep1 * width, width,
- byte_order) == current_char)
- {
- ++rep1;
- ++reps;
- }
-
- if (reps > options->repeat_count_threshold)
- {
- if (in_quotes)
- {
- fputs_filtered ("', ", stream);
- in_quotes = 0;
- }
- pascal_printchar (current_char, type, stream);
- fprintf_filtered (stream, " %p[<repeats %u times>%p]",
- metadata_style.style ().ptr (),
- reps, nullptr);
- i = rep1 - 1;
- things_printed += options->repeat_count_threshold;
- need_comma = 1;
- }
- else
- {
- if ((!in_quotes) && (PRINT_LITERAL_FORM (current_char)))
- {
- fputs_filtered ("'", stream);
- in_quotes = 1;
- }
- pascal_one_char (current_char, stream, &in_quotes);
- ++things_printed;
- }
- }
-
- /* Terminate the quotes if necessary. */
- if (in_quotes)
- fputs_filtered ("'", stream);
-
- if (force_ellipses || i < length)
- fputs_filtered ("...", stream);
-}
/* Table mapping opcodes into strings for printing operators
@@ -376,7 +276,6 @@ extern const struct language_data pascal_language_data =
macro_expansion_no,
p_extensions,
&exp_descriptor_standard,
- pascal_printstr, /* Function to print string constant */
pascal_print_typedef, /* Print a typedef using appropriate syntax */
"this", /* name_of_this */
false, /* la_store_sym_names_in_linkage_form_p */
@@ -499,6 +398,102 @@ public:
pascal_printchar (ch, chtype, stream);
}
+ /* See language.h. */
+
+ void printstr (struct ui_file *stream, struct type *elttype,
+ const gdb_byte *string, unsigned int length,
+ const char *encoding, int force_ellipses,
+ const struct value_print_options *options) const override
+ {
+ enum bfd_endian byte_order = type_byte_order (elttype);
+ unsigned int i;
+ unsigned int things_printed = 0;
+ int in_quotes = 0;
+ int need_comma = 0;
+ int width;
+
+ /* Preserve ELTTYPE's original type, just set its LENGTH. */
+ check_typedef (elttype);
+ width = TYPE_LENGTH (elttype);
+
+ /* If the string was not truncated due to `set print elements', and
+ the last byte of it is a null, we don't print that, in traditional C
+ style. */
+ if ((!force_ellipses) && length > 0
+ && extract_unsigned_integer (string + (length - 1) * width, width,
+ byte_order) == 0)
+ length--;
+
+ if (length == 0)
+ {
+ fputs_filtered ("''", stream);
+ return;
+ }
+
+ for (i = 0; i < length && things_printed < options->print_max; ++i)
+ {
+ /* Position of the character we are examining
+ to see whether it is repeated. */
+ unsigned int rep1;
+ /* Number of repetitions we have detected so far. */
+ unsigned int reps;
+ unsigned long int current_char;
+
+ QUIT;
+
+ if (need_comma)
+ {
+ fputs_filtered (", ", stream);
+ need_comma = 0;
+ }
+
+ current_char = extract_unsigned_integer (string + i * width, width,
+ byte_order);
+
+ rep1 = i + 1;
+ reps = 1;
+ while (rep1 < length
+ && extract_unsigned_integer (string + rep1 * width, width,
+ byte_order) == current_char)
+ {
+ ++rep1;
+ ++reps;
+ }
+
+ if (reps > options->repeat_count_threshold)
+ {
+ if (in_quotes)
+ {
+ fputs_filtered ("', ", stream);
+ in_quotes = 0;
+ }
+ pascal_printchar (current_char, elttype, stream);
+ fprintf_filtered (stream, " %p[<repeats %u times>%p]",
+ metadata_style.style ().ptr (),
+ reps, nullptr);
+ i = rep1 - 1;
+ things_printed += options->repeat_count_threshold;
+ need_comma = 1;
+ }
+ else
+ {
+ if ((!in_quotes) && (PRINT_LITERAL_FORM (current_char)))
+ {
+ fputs_filtered ("'", stream);
+ in_quotes = 1;
+ }
+ pascal_one_char (current_char, stream, &in_quotes);
+ ++things_printed;
+ }
+ }
+
+ /* Terminate the quotes if necessary. */
+ if (in_quotes)
+ fputs_filtered ("'", stream);
+
+ if (force_ellipses || i < length)
+ fputs_filtered ("...", stream);
+ }
};
/* Single instance of the Pascal language class. */
diff --git a/gdb/p-lang.h b/gdb/p-lang.h
index 9ce6131..3eaad01 100644
--- a/gdb/p-lang.h
+++ b/gdb/p-lang.h
@@ -56,10 +56,6 @@ extern int
extern void pascal_printchar (int, struct type *, struct ui_file *);
-extern void pascal_printstr (struct ui_file *, struct type *, const gdb_byte *,
- unsigned int, const char *, int,
- const struct value_print_options *);
-
extern struct type **const pascal_builtin_types[];
/* These are in p-typeprint.c: */
diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c
index 36e2617..b13623f 100644
--- a/gdb/rust-lang.c
+++ b/gdb/rust-lang.c
@@ -281,7 +281,7 @@ rust_get_trait_object_pointer (struct value *value)
-/* la_printstr implementation for Rust. */
+/* language_defn::printstr implementation for Rust. */
static void
rust_printstr (struct ui_file *stream, struct type *type,
@@ -1953,7 +1953,6 @@ extern const struct language_data rust_language_data =
macro_expansion_no,
rust_extensions,
&exp_descriptor_rust,
- rust_printstr, /* Function to print string constant */
rust_print_typedef, /* Print a typedef using appropriate syntax */
NULL, /* name_of_this */
false, /* la_store_sym_names_in_linkage_form_p */
@@ -2145,6 +2144,17 @@ public:
LA_EMIT_CHAR (ch, chtype, stream, '\'');
fputs_filtered ("'", stream);
}
+
+ /* See language.h. */
+
+ void printstr (struct ui_file *stream, struct type *elttype,
+ const gdb_byte *string, unsigned int length,
+ const char *encoding, int force_ellipses,
+ const struct value_print_options *options) const override
+ {
+ rust_printstr (stream, elttype, string, length, encoding,
+ force_ellipses, options);
+ }
};
/* Single instance of the Rust language class. */