/* Multiple source language support for GDB.
Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
- 2002, 2003, 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+ 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010
+ Free Software Foundation, Inc.
Contributed by the Department of Computer Science at the State University
of New York at Buffalo.
extern void _initialize_language (void);
-static void set_case_str (void);
-
-static void set_range_str (void);
-
-static void set_type_str (void);
-
-static void set_lang_str (void);
-
static void unk_lang_error (char *);
static int unk_lang_parser (void);
static void set_type_range_case (void);
-static void unk_lang_emit_char (int c, struct ui_file *stream, int quoter);
+static void unk_lang_emit_char (int c, struct type *type,
+ struct ui_file *stream, int quoter);
-static void unk_lang_printchar (int c, struct ui_file *stream);
+static void unk_lang_printchar (int c, struct type *type,
+ struct ui_file *stream);
-static void unk_lang_print_type (struct type *, char *, struct ui_file *,
+static void unk_lang_print_type (struct type *, const char *, struct ui_file *,
int, int);
-static int unk_lang_value_print (struct value *, struct ui_file *, int, enum val_prettyprint);
+static int unk_lang_value_print (struct value *, struct ui_file *,
+ const struct value_print_options *);
static CORE_ADDR unk_lang_trampoline (struct frame_info *, CORE_ADDR pc);
static unsigned languages_allocsize;
#define DEFAULT_ALLOCSIZE 4
-/* The "set language/type/range" commands all put stuff in these
- buffers. This is to make them work as set/show commands. The
- user's string is copied here, then the set_* commands look at
- them and update them to something that looks nice when it is
- printed out. */
-
-static char *language;
-static char *type;
-static char *range;
-static char *case_sensitive;
+/* The current values of the "set language/type/range" enum
+ commands. */
+static const char *language;
+static const char *type;
+static const char *range;
+static const char *case_sensitive;
/* Warning issued when current_language and the language of the current
frame do not match. */
{
enum language flang; /* The language of the current frame */
- deprecated_show_value_hack (file, from_tty, c, value);
+ if (language_mode == language_mode_auto)
+ fprintf_filtered (gdb_stdout,
+ _("The current source language is "
+ "\"auto; currently %s\".\n"),
+ current_language->la_name);
+ else
+ fprintf_filtered (gdb_stdout, _("The current source language is \"%s\".\n"),
+ current_language->la_name);
+
flang = get_frame_language ();
if (flang != language_unknown &&
language_mode == language_mode_manual &&
{
int i;
enum language flang;
- char *err_lang;
-
- if (!language || !language[0])
- {
- printf_unfiltered (_("\
-The currently understood settings are:\n\n\
-local or auto Automatic setting based on source file\n"));
-
- for (i = 0; i < languages_size; ++i)
- {
- /* Already dealt with these above. */
- if (languages[i]->la_language == language_unknown
- || languages[i]->la_language == language_auto)
- continue;
-
- /* FIXME: i18n: for now assume that the human-readable name
- is just a capitalization of the internal name. */
- printf_unfiltered ("%-16s Use the %c%s language\n",
- languages[i]->la_name,
- /* Capitalize first letter of language
- name. */
- toupper (languages[i]->la_name[0]),
- languages[i]->la_name + 1);
- }
- /* Restore the silly string. */
- set_language (current_language->la_language);
- return;
- }
/* Search the list of languages for a match. */
for (i = 0; i < languages_size; i++)
language_mode = language_mode_manual;
current_language = languages[i];
set_type_range_case ();
- set_lang_str ();
expected_language = current_language;
return;
}
}
}
- /* Reset the language (esp. the global string "language") to the
- correct values. */
- err_lang = savestring (language, strlen (language));
- make_cleanup (xfree, err_lang); /* Free it after error */
- set_language (current_language->la_language);
- error (_("Unknown language `%s'."), err_lang);
+ internal_error (__FILE__, __LINE__,
+ "Couldn't find language `%s' in known languages list.",
+ language);
}
/* Show command. Display a warning if the type setting does
show_type_command (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
{
- deprecated_show_value_hack (file, from_tty, c, value);
- if (type_check != current_language->la_type_check)
- printf_unfiltered (
- "Warning: the current type check setting does not match the language.\n");
+ if (type_mode == type_mode_auto)
+ {
+ char *tmp = NULL;
+
+ switch (type_check)
+ {
+ case type_check_on:
+ tmp = "on";
+ break;
+ case type_check_off:
+ tmp = "off";
+ break;
+ case type_check_warn:
+ tmp = "warn";
+ break;
+ default:
+ internal_error (__FILE__, __LINE__,
+ "Unrecognized type check setting.");
+ }
+
+ fprintf_filtered (gdb_stdout,
+ _("Type checking is \"auto; currently %s\".\n"),
+ tmp);
+ }
+ else
+ fprintf_filtered (gdb_stdout, _("Type checking is \"%s\".\n"),
+ value);
+
+ if (type_check != current_language->la_type_check)
+ warning (_("the current type check setting"
+ " does not match the language.\n"));
}
/* Set command. Change the setting for type checking. */
{
type_mode = type_mode_auto;
set_type_range_case ();
- /* Avoid hitting the set_type_str call below. We
- did it in set_type_range_case. */
return;
}
else
- {
- warning (_("Unrecognized type check setting: \"%s\""), type);
- }
- set_type_str ();
- show_type_command (NULL, from_tty, NULL, NULL);
+ internal_error (__FILE__, __LINE__,
+ _("Unrecognized type check setting: \"%s\""), type);
+
+ if (type_check != current_language->la_type_check)
+ warning (_("the current type check setting"
+ " does not match the language.\n"));
}
/* Show command. Display a warning if the range setting does
show_range_command (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
{
- deprecated_show_value_hack (file, from_tty, c, value);
+ if (range_mode == range_mode_auto)
+ {
+ char *tmp;
+
+ switch (range_check)
+ {
+ case range_check_on:
+ tmp = "on";
+ break;
+ case range_check_off:
+ tmp = "off";
+ break;
+ case range_check_warn:
+ tmp = "warn";
+ break;
+ default:
+ internal_error (__FILE__, __LINE__,
+ "Unrecognized range check setting.");
+ }
+
+ fprintf_filtered (gdb_stdout,
+ _("Range checking is \"auto; currently %s\".\n"),
+ tmp);
+ }
+ else
+ fprintf_filtered (gdb_stdout, _("Range checking is \"%s\".\n"),
+ value);
+
if (range_check != current_language->la_range_check)
- printf_unfiltered (
- "Warning: the current range check setting does not match the language.\n");
+ warning (_("the current range check setting "
+ "does not match the language.\n"));
}
/* Set command. Change the setting for range checking. */
{
range_mode = range_mode_auto;
set_type_range_case ();
- /* Avoid hitting the set_range_str call below. We
- did it in set_type_range_case. */
return;
}
else
{
- warning (_("Unrecognized range check setting: \"%s\""), range);
+ internal_error (__FILE__, __LINE__,
+ _("Unrecognized range check setting: \"%s\""), range);
}
- set_range_str ();
- show_range_command (NULL, from_tty, NULL, NULL);
+ if (range_check != current_language->la_range_check)
+ warning (_("the current range check setting "
+ "does not match the language.\n"));
}
/* Show command. Display a warning if the case sensitivity setting does
show_case_command (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
{
- deprecated_show_value_hack (file, from_tty, c, value);
+ if (case_mode == case_mode_auto)
+ {
+ char *tmp = NULL;
+
+ switch (case_sensitivity)
+ {
+ case case_sensitive_on:
+ tmp = "on";
+ break;
+ case case_sensitive_off:
+ tmp = "off";
+ break;
+ default:
+ internal_error (__FILE__, __LINE__,
+ "Unrecognized case-sensitive setting.");
+ }
+
+ fprintf_filtered (gdb_stdout,
+ _("Case sensitivity in "
+ "name search is \"auto; currently %s\".\n"),
+ tmp);
+ }
+ else
+ fprintf_filtered (gdb_stdout, _("Case sensitivity in name search is \"%s\".\n"),
+ value);
+
if (case_sensitivity != current_language->la_case_sensitivity)
- printf_unfiltered(
-"Warning: the current case sensitivity setting does not match the language.\n");
+ warning (_("the current case sensitivity setting does not match "
+ "the language.\n"));
}
/* Set command. Change the setting for case sensitivity. */
{
case_mode = case_mode_auto;
set_type_range_case ();
- /* Avoid hitting the set_case_str call below. We did it in
- set_type_range_case. */
return;
}
else
{
- warning (_("Unrecognized case-sensitive setting: \"%s\""),
- case_sensitive);
+ internal_error (__FILE__, __LINE__,
+ "Unrecognized case-sensitive setting: \"%s\"",
+ case_sensitive);
}
- set_case_str();
- show_case_command (NULL, from_tty, NULL, NULL);
+
+ if (case_sensitivity != current_language->la_case_sensitivity)
+ warning (_("the current case sensitivity setting does not match "
+ "the language.\n"));
}
/* Set the status of range and type checking and case sensitivity based on
static void
set_type_range_case (void)
{
-
if (range_mode == range_mode_auto)
range_check = current_language->la_range_check;
if (case_mode == case_mode_auto)
case_sensitivity = current_language->la_case_sensitivity;
-
- set_type_str ();
- set_range_str ();
- set_case_str ();
}
/* Set current language to (enum language) LANG. Returns previous language. */
{
current_language = languages[i];
set_type_range_case ();
- set_lang_str ();
break;
}
}
return prev_language;
}
\f
-/* This page contains functions that update the global vars
- language, type and range. */
-static void
-set_lang_str (void)
-{
- char *prefix = "";
-
- if (language)
- xfree (language);
- if (language_mode == language_mode_auto)
- prefix = "auto; currently ";
-
- language = concat (prefix, current_language->la_name, (char *)NULL);
-}
-
-static void
-set_type_str (void)
-{
- char *tmp = NULL, *prefix = "";
-
- if (type)
- xfree (type);
- if (type_mode == type_mode_auto)
- prefix = "auto; currently ";
-
- switch (type_check)
- {
- case type_check_on:
- tmp = "on";
- break;
- case type_check_off:
- tmp = "off";
- break;
- case type_check_warn:
- tmp = "warn";
- break;
- default:
- error (_("Unrecognized type check setting."));
- }
-
- type = concat (prefix, tmp, (char *)NULL);
-}
-
-static void
-set_range_str (void)
-{
- char *tmp, *pref = "";
-
- if (range_mode == range_mode_auto)
- pref = "auto; currently ";
-
- switch (range_check)
- {
- case range_check_on:
- tmp = "on";
- break;
- case range_check_off:
- tmp = "off";
- break;
- case range_check_warn:
- tmp = "warn";
- break;
- default:
- error (_("Unrecognized range check setting."));
- }
-
- if (range)
- xfree (range);
- range = concat (pref, tmp, (char *)NULL);
-}
-
-static void
-set_case_str (void)
-{
- char *tmp = NULL, *prefix = "";
-
- if (case_mode==case_mode_auto)
- prefix = "auto; currently ";
-
- switch (case_sensitivity)
- {
- case case_sensitive_on:
- tmp = "on";
- break;
- case case_sensitive_off:
- tmp = "off";
- break;
- default:
- error (_("Unrecognized case-sensitive setting."));
- }
-
- xfree (case_sensitive);
- case_sensitive = concat (prefix, tmp, (char *)NULL);
-}
/* Print out the current language settings: language, range and
type checking. If QUIETLY, print only what has changed. */
{
case language_c:
case language_cplus:
+ case language_d:
case language_objc:
if (TYPE_CODE (t1) == TYPE_CODE_FLT)
return TYPE_CODE (t2) == TYPE_CODE_FLT && l2 > l1 ?
{
case language_c:
case language_cplus:
+ case language_d:
case language_objc:
return (TYPE_CODE (type) != TYPE_CODE_INT) &&
(TYPE_CODE (type) != TYPE_CODE_ENUM) ? 0 : 1;
case language_c:
case language_cplus:
+ case language_d:
case language_objc:
return (TYPE_CODE (type) == TYPE_CODE_INT) &&
TYPE_LENGTH (type) == sizeof (char)
case language_c:
case language_cplus:
+ case language_d:
case language_objc:
/* C does not have distinct string type. */
return (0);
{
case language_c:
case language_cplus:
+ case language_d:
case language_objc:
/* Might be more cleanly handled by having a
TYPE_CODE_INT_NOT_BOOL for (the deleted) CHILL and such
CHECK_TYPEDEF (type);
return TYPE_CODE (type) == TYPE_CODE_FLT;
}
+#endif
/* Returns non-zero if the value is a pointer type */
int
TYPE_CODE (type) == TYPE_CODE_REF;
}
+#if 0
/* Returns non-zero if the value is a structured type */
int
structured_type (struct type *type)
{
case language_c:
case language_cplus:
+ case language_d:
case language_objc:
return (TYPE_CODE (type) == TYPE_CODE_STRUCT) ||
(TYPE_CODE (type) == TYPE_CODE_UNION) ||
}
#endif
\f
-struct type *
-lang_bool_type (void)
-{
- struct symbol *sym;
- struct type *type;
- switch (current_language->la_language)
- {
- case language_fortran:
- sym = lookup_symbol ("logical", NULL, VAR_DOMAIN, NULL, NULL);
- if (sym)
- {
- type = SYMBOL_TYPE (sym);
- if (type && TYPE_CODE (type) == TYPE_CODE_BOOL)
- return type;
- }
- return builtin_type_f_logical_s2;
- case language_cplus:
- case language_pascal:
- case language_ada:
- if (current_language->la_language==language_cplus)
- {sym = lookup_symbol ("bool", NULL, VAR_DOMAIN, NULL, NULL);}
- else
- {sym = lookup_symbol ("boolean", NULL, VAR_DOMAIN, NULL, NULL);}
- if (sym)
- {
- type = SYMBOL_TYPE (sym);
- if (type && TYPE_CODE (type) == TYPE_CODE_BOOL)
- return type;
- }
- return builtin_type_bool;
- case language_java:
- sym = lookup_symbol ("boolean", NULL, VAR_DOMAIN, NULL, NULL);
- if (sym)
- {
- type = SYMBOL_TYPE (sym);
- if (type && TYPE_CODE (type) == TYPE_CODE_BOOL)
- return type;
- }
- return java_boolean_type;
-
- default:
- return builtin_type_int;
- }
-}
-\f
/* This page contains functions that return info about
(struct value) values used in GDB. */
type_error (const char *string,...)
{
va_list args;
- va_start (args, string);
+ va_start (args, string);
switch (type_check)
{
case type_check_warn:
range_error (const char *string,...)
{
va_list args;
- va_start (args, string);
+ va_start (args, string);
switch (range_check)
{
case range_check_warn:
void
add_language (const struct language_defn *lang)
{
+ /* For the "set language" command. */
+ static char **language_names = NULL;
+ /* For the "help set language" command. */
+ char *language_set_doc = NULL;
+
+ int i;
+ struct ui_file *tmp_stream;
+
if (lang->la_magic != LANG_MAGIC)
{
fprintf_unfiltered (gdb_stderr, "Magic number of %s language struct wrong\n",
languages_allocsize * sizeof (*languages));
}
languages[languages_size++] = lang;
+
+ /* Build the language names array, to be used as enumeration in the
+ set language" enum command. */
+ language_names = xrealloc (language_names,
+ (languages_size + 1) * sizeof (const char *));
+ for (i = 0; i < languages_size; ++i)
+ language_names[i] = languages[i]->la_name;
+ language_names[i] = NULL;
+
+ /* Build the "help set language" docs. */
+ tmp_stream = mem_fileopen ();
+
+ fprintf_unfiltered (tmp_stream, _("\
+Set the current source language.\n\
+The currently understood settings are:\n\n\
+local or auto Automatic setting based on source file\n"));
+
+ for (i = 0; i < languages_size; ++i)
+ {
+ /* Already dealt with these above. */
+ if (languages[i]->la_language == language_unknown
+ || languages[i]->la_language == language_auto)
+ continue;
+
+ /* FIXME: i18n: for now assume that the human-readable name
+ is just a capitalization of the internal name. */
+ fprintf_unfiltered (tmp_stream, "%-16s Use the %c%s language\n",
+ languages[i]->la_name,
+ /* Capitalize first letter of language
+ name. */
+ toupper (languages[i]->la_name[0]),
+ languages[i]->la_name + 1);
+ }
+
+ language_set_doc = ui_file_xstrdup (tmp_stream, NULL);
+ ui_file_delete (tmp_stream);
+
+ add_setshow_enum_cmd ("language", class_support,
+ (const char **) language_names,
+ &language,
+ language_set_doc, _("\
+Show the current source language."), NULL,
+ set_language_command,
+ show_language_command,
+ &setlist, &showlist);
+
+ xfree (language_set_doc);
}
/* Iterate through all registered languages looking for and calling
if (languages[i]->skip_trampoline)
{
CORE_ADDR real_pc = (languages[i]->skip_trampoline) (frame, pc);
+
if (real_pc)
return real_pc;
}
void
default_print_array_index (struct value *index_value, struct ui_file *stream,
- int format, enum val_prettyprint pretty)
+ const struct value_print_options *options)
{
fprintf_filtered (stream, "[");
- LA_VALUE_PRINT (index_value, stream, format, pretty);
+ LA_VALUE_PRINT (index_value, stream, options);
fprintf_filtered (stream, "] = ");
}
+void
+default_get_string (struct value *value, gdb_byte **buffer, int *length,
+ struct type **char_type, const char **charset)
+{
+ error (_("Getting a string is unsupported in this language."));
+}
+
/* Define the language that is no language. */
static int
}
static void
-unk_lang_emit_char (int c, struct ui_file *stream, int quoter)
+unk_lang_emit_char (int c, struct type *type, struct ui_file *stream,
+ int quoter)
{
error (_("internal error - unimplemented function unk_lang_emit_char called."));
}
static void
-unk_lang_printchar (int c, struct ui_file *stream)
+unk_lang_printchar (int c, struct type *type, struct ui_file *stream)
{
error (_("internal error - unimplemented function unk_lang_printchar called."));
}
static void
-unk_lang_printstr (struct ui_file *stream, const gdb_byte *string,
- unsigned int length, int width, int force_ellipses)
+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 void
-unk_lang_print_type (struct type *type, char *varstring, struct ui_file *stream,
- int show, int level)
+unk_lang_print_type (struct type *type, const char *varstring,
+ struct ui_file *stream, int show, int level)
{
error (_("internal error - unimplemented function unk_lang_print_type called."));
}
static int
unk_lang_val_print (struct type *type, const gdb_byte *valaddr,
int embedded_offset, CORE_ADDR address,
- struct ui_file *stream, int format,
- int deref_ref, int recurse, enum val_prettyprint pretty)
+ struct ui_file *stream, int recurse,
+ const struct value *val,
+ const struct value_print_options *options)
{
error (_("internal error - unimplemented function unk_lang_val_print called."));
}
static int
-unk_lang_value_print (struct value *val, struct ui_file *stream, int format,
- enum val_prettyprint pretty)
+unk_lang_value_print (struct value *val, struct ui_file *stream,
+ const struct value_print_options *options)
{
error (_("internal error - unimplemented function unk_lang_value_print called."));
}
struct language_arch_info *lai)
{
lai->string_char_type = builtin_type (gdbarch)->builtin_char;
+ lai->bool_type_default = builtin_type (gdbarch)->builtin_int;
lai->primitive_type_vector = GDBARCH_OBSTACK_CALLOC (gdbarch, 1,
struct type *);
}
language_unknown,
range_check_off,
type_check_off,
- array_row_major,
case_sensitive_on,
+ array_row_major,
+ macro_expansion_no,
&exp_descriptor_standard,
unk_lang_parser,
unk_lang_error,
unk_lang_printstr,
unk_lang_emit_char,
unk_lang_print_type, /* Print a type using appropriate syntax */
+ default_print_typedef, /* Print a typedef using appropriate syntax */
unk_lang_val_print, /* Print a value using appropriate syntax */
unk_lang_value_print, /* Print a top-level value */
unk_lang_trampoline, /* Language specific skip_trampoline */
- value_of_this, /* value_of_this */
+ "this", /* name_of_this */
basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
basic_lookup_transparent_type,/* lookup_transparent_type */
unk_lang_demangle, /* Language specific symbol demangler */
unknown_language_arch_info, /* la_language_arch_info. */
default_print_array_index,
default_pass_by_reference,
+ default_get_string,
LANG_MAGIC
};
language_auto,
range_check_off,
type_check_off,
- array_row_major,
case_sensitive_on,
+ array_row_major,
+ macro_expansion_no,
&exp_descriptor_standard,
unk_lang_parser,
unk_lang_error,
unk_lang_printstr,
unk_lang_emit_char,
unk_lang_print_type, /* Print a type using appropriate syntax */
+ default_print_typedef, /* Print a typedef using appropriate syntax */
unk_lang_val_print, /* Print a value using appropriate syntax */
unk_lang_value_print, /* Print a top-level value */
unk_lang_trampoline, /* Language specific skip_trampoline */
- value_of_this, /* value_of_this */
+ "this", /* name_of_this */
basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
basic_lookup_transparent_type,/* lookup_transparent_type */
unk_lang_demangle, /* Language specific symbol demangler */
unknown_language_arch_info, /* la_language_arch_info. */
default_print_array_index,
default_pass_by_reference,
+ default_get_string,
LANG_MAGIC
};
type_check_off,
case_sensitive_on,
array_row_major,
+ macro_expansion_no,
&exp_descriptor_standard,
unk_lang_parser,
unk_lang_error,
unk_lang_printstr,
unk_lang_emit_char,
unk_lang_print_type, /* Print a type using appropriate syntax */
+ default_print_typedef, /* Print a typedef using appropriate syntax */
unk_lang_val_print, /* Print a value using appropriate syntax */
unk_lang_value_print, /* Print a top-level value */
unk_lang_trampoline, /* Language specific skip_trampoline */
- value_of_this, /* value_of_this */
+ "this", /* name_of_this */
basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
basic_lookup_transparent_type,/* lookup_transparent_type */
unk_lang_demangle, /* Language specific symbol demangler */
unknown_language_arch_info, /* la_language_arch_info. */
default_print_array_index,
default_pass_by_reference,
+ default_get_string,
LANG_MAGIC
};
\f
{
struct language_gdbarch *ld = gdbarch_data (gdbarch,
language_gdbarch_data);
+
return ld->arch_info[la->la_language].string_char_type;
}
+struct type *
+language_bool_type (const struct language_defn *la,
+ struct gdbarch *gdbarch)
+{
+ struct language_gdbarch *ld = gdbarch_data (gdbarch,
+ language_gdbarch_data);
+
+ if (ld->arch_info[la->la_language].bool_type_symbol)
+ {
+ struct symbol *sym;
+
+ sym = lookup_symbol (ld->arch_info[la->la_language].bool_type_symbol,
+ NULL, VAR_DOMAIN, NULL);
+ if (sym)
+ {
+ struct type *type = SYMBOL_TYPE (sym);
+
+ if (type && TYPE_CODE (type) == TYPE_CODE_BOOL)
+ return type;
+ }
+ }
+
+ return ld->arch_info[la->la_language].bool_type_default;
+}
+
struct type *
language_lookup_primitive_type_by_name (const struct language_defn *la,
struct gdbarch *gdbarch,
struct language_gdbarch *ld = gdbarch_data (gdbarch,
language_gdbarch_data);
struct type *const *p;
+
for (p = ld->arch_info[la->la_language].primitive_type_vector;
(*p) != NULL;
p++)
void
_initialize_language (void)
{
- struct cmd_list_element *set, *show;
+ static const char *type_or_range_names[]
+ = { "on", "off", "warn", "auto", NULL };
+
+ static const char *case_sensitive_names[]
+ = { "on", "off", "auto", NULL };
language_gdbarch_data
= gdbarch_data_register_post_init (language_gdbarch_post_init);
/* GDB commands for language specific stuff */
- /* FIXME: cagney/2005-02-20: This should be implemented using an
- enum. */
- add_setshow_string_noescape_cmd ("language", class_support, &language, _("\
-Set the current source language."), _("\
-Show the current source language."), NULL,
- set_language_command,
- show_language_command,
- &setlist, &showlist);
-
add_prefix_cmd ("check", no_class, set_check,
_("Set the status of the type/range checker."),
&setchecklist, "set check ", 0, &setlist);
add_alias_cmd ("c", "check", no_class, 1, &showlist);
add_alias_cmd ("ch", "check", no_class, 1, &showlist);
- /* FIXME: cagney/2005-02-20: This should be implemented using an
- enum. */
- add_setshow_string_noescape_cmd ("type", class_support, &type, _("\
+ add_setshow_enum_cmd ("type", class_support, type_or_range_names, &type, _("\
Set type checking. (on/warn/off/auto)"), _("\
Show type checking. (on/warn/off/auto)"), NULL,
- set_type_command,
- show_type_command,
- &setchecklist, &showchecklist);
+ set_type_command,
+ show_type_command,
+ &setchecklist, &showchecklist);
- /* FIXME: cagney/2005-02-20: This should be implemented using an
- enum. */
- add_setshow_string_noescape_cmd ("range", class_support, &range, _("\
+ 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)"), NULL,
- set_range_command,
- show_range_command,
- &setchecklist, &showchecklist);
-
- /* FIXME: cagney/2005-02-20: This should be implemented using an
- enum. */
- add_setshow_string_noescape_cmd ("case-sensitive", class_support,
- &case_sensitive, _("\
+ 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)"), _("\
For Fortran the default is off; for other languages the default is on."),
- set_case_command,
- show_case_command,
- &setlist, &showlist);
+ set_case_command,
+ show_case_command,
+ &setlist, &showlist);
- add_language (&unknown_language_defn);
- add_language (&local_language_defn);
add_language (&auto_language_defn);
+ add_language (&local_language_defn);
+ add_language (&unknown_language_defn);
- language = savestring ("auto", strlen ("auto"));
- type = savestring ("auto", strlen ("auto"));
- range = savestring ("auto", strlen ("auto"));
- case_sensitive = savestring ("auto",strlen ("auto"));
+ language = xstrdup ("auto");
+ type = xstrdup ("auto");
+ range = xstrdup ("auto");
+ case_sensitive = xstrdup ("auto");
/* Have the above take effect */
set_language (language_auto);