X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Flanguage.c;h=3ce08b5b913dd9376974a104ea1e59e6bc4cb1a5;hb=a778ab81e80a778f4d9b0cf754aa6dc956bdcfd2;hp=7b0b44a6b1b19eba2936e31cec4a1491c64263b2;hpb=fbb06eb1ba120adde645d64133f5a9bbf2d62ec7;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/language.c b/gdb/language.c index 7b0b44a6b1..3ce08b5b91 100644 --- a/gdb/language.c +++ b/gdb/language.c @@ -1,7 +1,8 @@ /* 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. @@ -47,14 +48,6 @@ 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); @@ -65,14 +58,17 @@ static void set_check (char *, int); 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); @@ -108,16 +104,12 @@ static unsigned languages_size; 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. */ @@ -135,7 +127,15 @@ show_language_command (struct ui_file *file, int from_tty, { 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 && @@ -149,34 +149,6 @@ set_language_command (char *ignore, int from_tty, struct cmd_list_element *c) { 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++) @@ -203,19 +175,15 @@ local or auto Automatic setting based on source file\n")); 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 @@ -224,10 +192,37 @@ static void 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. */ @@ -253,16 +248,15 @@ set_type_command (char *ignore, int from_tty, struct cmd_list_element *c) { 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 @@ -271,10 +265,37 @@ static void 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. */ @@ -300,16 +321,16 @@ set_range_command (char *ignore, int from_tty, struct cmd_list_element *c) { 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 @@ -318,10 +339,35 @@ static void 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. */ @@ -343,17 +389,18 @@ set_case_command (char *ignore, int from_tty, struct cmd_list_element *c) { 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 @@ -363,7 +410,6 @@ set_case_command (char *ignore, int from_tty, struct cmd_list_element *c) static void set_type_range_case (void) { - if (range_mode == range_mode_auto) range_check = current_language->la_range_check; @@ -372,10 +418,6 @@ set_type_range_case (void) 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. */ @@ -394,7 +436,6 @@ set_language (enum language lang) { current_language = languages[i]; set_type_range_case (); - set_lang_str (); break; } } @@ -402,100 +443,6 @@ set_language (enum language lang) return prev_language; } -/* 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. */ @@ -539,6 +486,7 @@ binop_result_type (struct value *v1, struct value *v2) { 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 ? @@ -650,6 +598,7 @@ integral_type (struct type *type) { 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; @@ -690,6 +639,7 @@ character_type (struct type *type) case language_c: case language_cplus: + case language_d: case language_objc: return (TYPE_CODE (type) == TYPE_CODE_INT) && TYPE_LENGTH (type) == sizeof (char) @@ -712,6 +662,7 @@ string_type (struct type *type) case language_c: case language_cplus: + case language_d: case language_objc: /* C does not have distinct string type. */ return (0); @@ -731,6 +682,7 @@ boolean_type (struct type *type) { 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 @@ -750,6 +702,7 @@ float_type (struct type *type) CHECK_TYPEDEF (type); return TYPE_CODE (type) == TYPE_CODE_FLT; } +#endif /* Returns non-zero if the value is a pointer type */ int @@ -759,6 +712,7 @@ pointer_type (struct type *type) TYPE_CODE (type) == TYPE_CODE_REF; } +#if 0 /* Returns non-zero if the value is a structured type */ int structured_type (struct type *type) @@ -768,6 +722,7 @@ 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) || @@ -818,8 +773,8 @@ void type_error (const char *string,...) { va_list args; - va_start (args, string); + va_start (args, string); switch (type_check) { case type_check_warn: @@ -844,8 +799,8 @@ void range_error (const char *string,...) { va_list args; - va_start (args, string); + va_start (args, string); switch (range_check) { case range_check_warn: @@ -935,6 +890,14 @@ show_check (char *ignore, int from_tty) 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", @@ -955,6 +918,53 @@ add_language (const struct language_defn *lang) 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 @@ -971,6 +981,7 @@ skip_language_trampoline (struct frame_info *frame, CORE_ADDR pc) if (languages[i]->skip_trampoline) { CORE_ADDR real_pc = (languages[i]->skip_trampoline) (frame, pc); + if (real_pc) return real_pc; } @@ -1035,13 +1046,20 @@ default_word_break_characters (void) 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 @@ -1057,27 +1075,30 @@ unk_lang_error (char *msg) } 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.")); } @@ -1085,15 +1106,16 @@ unk_lang_print_type (struct type *type, char *varstring, struct ui_file *stream, 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.")); } @@ -1135,8 +1157,9 @@ const struct language_defn unknown_language_defn = 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, @@ -1145,6 +1168,7 @@ const struct language_defn unknown_language_defn = 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 */ @@ -1161,6 +1185,7 @@ const struct language_defn unknown_language_defn = unknown_language_arch_info, /* la_language_arch_info. */ default_print_array_index, default_pass_by_reference, + default_get_string, LANG_MAGIC }; @@ -1171,8 +1196,9 @@ const struct language_defn auto_language_defn = 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, @@ -1181,6 +1207,7 @@ const struct language_defn auto_language_defn = 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 */ @@ -1197,6 +1224,7 @@ const struct language_defn auto_language_defn = unknown_language_arch_info, /* la_language_arch_info. */ default_print_array_index, default_pass_by_reference, + default_get_string, LANG_MAGIC }; @@ -1208,6 +1236,7 @@ const struct language_defn local_language_defn = type_check_off, case_sensitive_on, array_row_major, + macro_expansion_no, &exp_descriptor_standard, unk_lang_parser, unk_lang_error, @@ -1216,6 +1245,7 @@ const struct language_defn local_language_defn = 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 */ @@ -1232,6 +1262,7 @@ const struct language_defn local_language_defn = unknown_language_arch_info, /* la_language_arch_info. */ default_print_array_index, default_pass_by_reference, + default_get_string, LANG_MAGIC }; @@ -1269,6 +1300,7 @@ language_string_char_type (const struct language_defn *la, { struct language_gdbarch *ld = gdbarch_data (gdbarch, language_gdbarch_data); + return ld->arch_info[la->la_language].string_char_type; } @@ -1282,11 +1314,13 @@ language_bool_type (const struct language_defn *la, 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; } @@ -1303,6 +1337,7 @@ language_lookup_primitive_type_by_name (const struct language_defn *la, 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++) @@ -1318,22 +1353,17 @@ language_lookup_primitive_type_by_name (const struct language_defn *la, 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); @@ -1346,43 +1376,38 @@ Show the current source language."), NULL, 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);