/* Multiple source language support for GDB.
- Copyright (C) 1991-2018 Free Software Foundation, Inc.
+ Copyright (C) 1991-2019 Free Software Foundation, Inc.
Contributed by the Department of Computer Science at the State University
of New York at Buffalo.
#include "frame.h"
#include "c-lang.h"
#include <algorithm>
-
-static void unk_lang_error (const char *);
+#include "gdbarch.h"
static int unk_lang_parser (struct parser_state *);
&ada_language_defn,
};
-/* The current values of the "set language/type/range" enum
+/* The current values of the "set language/range/case-sensitive" enum
commands. */
static const char *language;
-static const char *type;
static const char *range;
static const char *case_sensitive;
/* Enter auto mode. Set to the current frame's language, if
known, or fallback to the initial language. */
language_mode = language_mode_auto;
- TRY
+ try
{
struct frame_info *frame;
frame = get_selected_frame (NULL);
flang = get_frame_language (frame);
}
- CATCH (ex, RETURN_MASK_ERROR)
+ catch (const gdb_exception_error &ex)
{
flang = language_unknown;
}
- END_CATCH
if (flang != language_unknown)
set_language (flang);
doc.printf (_("Set the current source language.\n"
"The currently understood settings are:\n\nlocal or "
- "auto Automatic setting based on source file\n"));
+ "auto Automatic setting based on source file"));
for (const auto &lang : languages)
{
/* FIXME: i18n: for now assume that the human-readable name is
just a capitalization of the internal name. */
- doc.printf ("%-16s Use the %c%s language\n",
+ /* Note that we add the newline at the front, so we don't wind
+ up with a trailing newline. */
+ doc.printf ("\n%-16s Use the %c%s language",
lang->la_name,
/* Capitalize first letter of language name. */
toupper (lang->la_name[0]),
return NULL;
}
-/* See langauge.h. */
+/* See language.h. */
int
language_sniff_from_mangled_name (const struct language_defn *lang,
}
void
-default_get_string (struct value *value, gdb_byte **buffer, int *length,
- struct type **char_type, const char **charset)
+default_get_string (struct value *value,
+ gdb::unique_xmalloc_ptr<gdb_byte> *buffer,
+ int *length, struct type **char_type, const char **charset)
{
error (_("Getting a string is unsupported in this language."));
}
/* See language.h. */
+bool
+default_is_string_type_p (struct type *type)
+{
+ type = check_typedef (type);
+ while (TYPE_CODE (type) == TYPE_CODE_REF)
+ {
+ type = TYPE_TARGET_TYPE (type);
+ type = check_typedef (type);
+ }
+ return (TYPE_CODE (type) == TYPE_CODE_STRING);
+}
+
+/* See language.h. */
+
symbol_name_matcher_ftype *
-language_get_symbol_name_matcher (const language_defn *lang,
- const lookup_name_info &lookup_name)
+get_symbol_name_matcher (const language_defn *lang,
+ const lookup_name_info &lookup_name)
{
+ /* If currently in Ada mode, and the lookup name is wrapped in
+ '<...>', hijack all symbol name comparisons using the Ada
+ matcher, which handles the verbatim matching. */
+ if (current_language->la_language == language_ada
+ && lookup_name.ada ().verbatim_p ())
+ return current_language->la_get_symbol_name_matcher (lookup_name);
+
if (lang->la_get_symbol_name_matcher != nullptr)
return lang->la_get_symbol_name_matcher (lookup_name);
return default_symbol_name_matcher;
}
static void
-unk_lang_error (const char *msg)
-{
- error (_("Attempted to parse an expression with unknown language"));
-}
-
-static void
unk_lang_emit_char (int c, struct type *type, struct ui_file *stream,
int quoter)
{
NULL,
&exp_descriptor_standard,
unk_lang_parser,
- unk_lang_error,
null_post_parser,
unk_lang_printchar, /* Print character constant */
unk_lang_printstr,
default_read_var_value, /* la_read_var_value */
unk_lang_trampoline, /* Language specific skip_trampoline */
"this", /* name_of_this */
+ true, /* store_sym_names_in_linkage_form_p */
basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
basic_lookup_transparent_type,/* lookup_transparent_type */
unk_lang_demangle, /* Language specific symbol demangler */
&default_varobj_ops,
NULL,
NULL,
- LANG_MAGIC
+ default_is_string_type_p,
+ "{...}" /* la_struct_too_deep_ellipsis */
};
/* These two structs define fake entries for the "local" and "auto"
NULL,
&exp_descriptor_standard,
unk_lang_parser,
- unk_lang_error,
null_post_parser,
unk_lang_printchar, /* Print character constant */
unk_lang_printstr,
default_read_var_value, /* la_read_var_value */
unk_lang_trampoline, /* Language specific skip_trampoline */
"this", /* name_of_this */
+ false, /* store_sym_names_in_linkage_form_p */
basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
basic_lookup_transparent_type,/* lookup_transparent_type */
unk_lang_demangle, /* Language specific symbol demangler */
&default_varobj_ops,
NULL,
NULL,
- LANG_MAGIC
+ default_is_string_type_p,
+ "{...}" /* la_struct_too_deep_ellipsis */
};
\f
add_setshow_enum_cmd ("range", class_support, type_or_range_names,
&range,
- _("Set range checking. (on/warn/off/auto)"),
- _("Show range checking. (on/warn/off/auto)"),
+ _("Set range checking (on/warn/off/auto)."),
+ _("Show range checking (on/warn/off/auto)."),
NULL, set_range_command,
show_range_command,
&setchecklist, &showchecklist);
add_setshow_enum_cmd ("case-sensitive", class_support, case_sensitive_names,
&case_sensitive, _("\
-Set case sensitivity in name search. (on/off/auto)"), _("\
-Show case sensitivity in name search. (on/off/auto)"), _("\
+Set case sensitivity in name search (on/off/auto)."), _("\
+Show case sensitivity in name search (on/off/auto)."), _("\
For Fortran the default is off; for other languages the default is on."),
set_case_command,
show_case_command,
add_set_language_command ();
- language = xstrdup ("auto");
- type = xstrdup ("auto");
- range = xstrdup ("auto");
- case_sensitive = xstrdup ("auto");
+ language = "auto";
+ range = "auto";
+ case_sensitive = "auto";
/* Have the above take effect. */
set_language (language_auto);