X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Flanguage.c;h=eb853d1b45aa074de5c17f583867ba1eb8044ad0;hb=3be49e7a08c06ff93ce328e902b8cc33984de71b;hp=26136330ed87ea545c80d3a47c964aedc566767d;hpb=176620f10b295fa215a01d9e5da62b246c8cfe83;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/language.c b/gdb/language.c index 26136330ed..eb853d1b45 100644 --- a/gdb/language.c +++ b/gdb/language.c @@ -1,7 +1,7 @@ /* Multiple source language support for GDB. Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, - 2001, 2002, 2003 Free Software Foundation, Inc. + 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. Contributed by the Department of Computer Science at the State University of New York at Buffalo. @@ -86,19 +86,11 @@ static void unk_lang_emit_char (int c, struct ui_file *stream, int quoter); static void unk_lang_printchar (int c, struct ui_file *stream); -static void unk_lang_printstr (struct ui_file * stream, char *string, - unsigned int length, int width, - int force_ellipses); - static struct type *unk_lang_create_fundamental_type (struct objfile *, int); static void unk_lang_print_type (struct type *, char *, struct ui_file *, int, int); -static int unk_lang_val_print (struct type *, char *, int, CORE_ADDR, - struct ui_file *, int, int, int, - enum val_prettyprint); - static int unk_lang_value_print (struct value *, struct ui_file *, int, enum val_prettyprint); static CORE_ADDR unk_lang_trampoline (CORE_ADDR pc); @@ -151,7 +143,6 @@ static char *case_sensitive; char lang_frame_mismatch_warn[] = "Warning: the current language does not match this frame."; - /* This page contains the functions corresponding to GDB commands and their helpers. */ @@ -206,7 +197,7 @@ set_language_command (char *ignore, int from_tty) /* Search the list of languages for a match. */ for (i = 0; i < languages_size; i++) { - if (STREQ (languages[i]->la_name, language)) + if (strcmp (languages[i]->la_name, language) == 0) { /* Found it! Go into manual mode, and use this language. */ if (languages[i]->la_language == language_auto) @@ -254,22 +245,22 @@ show_type_command (char *ignore, int from_tty) static void set_type_command (char *ignore, int from_tty) { - if (STREQ (type, "on")) + if (strcmp (type, "on") == 0) { type_check = type_check_on; type_mode = type_mode_manual; } - else if (STREQ (type, "warn")) + else if (strcmp (type, "warn") == 0) { type_check = type_check_warn; type_mode = type_mode_manual; } - else if (STREQ (type, "off")) + else if (strcmp (type, "off") == 0) { type_check = type_check_off; type_mode = type_mode_manual; } - else if (STREQ (type, "auto")) + else if (strcmp (type, "auto") == 0) { type_mode = type_mode_auto; set_type_range_case (); @@ -300,22 +291,22 @@ show_range_command (char *ignore, int from_tty) static void set_range_command (char *ignore, int from_tty) { - if (STREQ (range, "on")) + if (strcmp (range, "on") == 0) { range_check = range_check_on; range_mode = range_mode_manual; } - else if (STREQ (range, "warn")) + else if (strcmp (range, "warn") == 0) { range_check = range_check_warn; range_mode = range_mode_manual; } - else if (STREQ (range, "off")) + else if (strcmp (range, "off") == 0) { range_check = range_check_off; range_mode = range_mode_manual; } - else if (STREQ (range, "auto")) + else if (strcmp (range, "auto") == 0) { range_mode = range_mode_auto; set_type_range_case (); @@ -345,17 +336,17 @@ show_case_command (char *ignore, int from_tty) static void set_case_command (char *ignore, int from_tty) { - if (STREQ (case_sensitive, "on")) + if (DEPRECATED_STREQ (case_sensitive, "on")) { case_sensitivity = case_sensitive_on; case_mode = case_mode_manual; } - else if (STREQ (case_sensitive, "off")) + else if (DEPRECATED_STREQ (case_sensitive, "off")) { case_sensitivity = case_sensitive_off; case_mode = case_mode_manual; } - else if (STREQ (case_sensitive, "auto")) + else if (DEPRECATED_STREQ (case_sensitive, "auto")) { case_mode = case_mode_auto; set_type_range_case (); @@ -579,131 +570,6 @@ binop_result_type (struct value *v1, struct value *v2) } #endif /* 0 */ - - -/* This page contains functions that return format strings for - printf for printing out numbers in different formats */ - -/* Returns the appropriate printf format for hexadecimal - numbers. */ -char * -local_hex_format_custom (char *pre) -{ - static char form[50]; - - strcpy (form, local_hex_format_prefix ()); - strcat (form, "%"); - strcat (form, pre); - strcat (form, local_hex_format_specifier ()); - strcat (form, local_hex_format_suffix ()); - return form; -} - -/* Converts a LONGEST to custom hexadecimal and stores it in a static - string. Returns a pointer to this string. */ -char * -local_hex_string (LONGEST num) -{ - return local_hex_string_custom (num, "l"); -} - -/* Converts a LONGEST number to custom hexadecimal and stores it in a static - string. Returns a pointer to this string. Note that the width parameter - should end with "l", e.g. "08l" as with calls to local_hex_string_custom */ - -char * -local_hex_string_custom (LONGEST num, char *width) -{ -#define RESULT_BUF_LEN 50 - static char res2[RESULT_BUF_LEN]; - char format[RESULT_BUF_LEN]; - int field_width; - int num_len; - int num_pad_chars; - char *pad_char; /* string with one character */ - int pad_on_left; - char *parse_ptr; - char temp_nbr_buf[RESULT_BUF_LEN]; - - /* Use phex_nz to print the number into a string, then - build the result string from local_hex_format_prefix, padding and - the hex representation as indicated by "width". */ - strcpy (temp_nbr_buf, phex_nz (num, sizeof (num))); - /* parse width */ - parse_ptr = width; - pad_on_left = 1; - pad_char = " "; - if (*parse_ptr == '-') - { - parse_ptr++; - pad_on_left = 0; - } - if (*parse_ptr == '0') - { - parse_ptr++; - if (pad_on_left) - pad_char = "0"; /* If padding is on the right, it is blank */ - } - field_width = atoi (parse_ptr); - num_len = strlen (temp_nbr_buf); - num_pad_chars = field_width - strlen (temp_nbr_buf); /* possibly negative */ - - if (strlen (local_hex_format_prefix ()) + num_len + num_pad_chars - >= RESULT_BUF_LEN) /* paranoia */ - internal_error (__FILE__, __LINE__, - "local_hex_string_custom: insufficient space to store result"); - - strcpy (res2, local_hex_format_prefix ()); - if (pad_on_left) - { - while (num_pad_chars > 0) - { - strcat (res2, pad_char); - num_pad_chars--; - } - } - strcat (res2, temp_nbr_buf); - if (!pad_on_left) - { - while (num_pad_chars > 0) - { - strcat (res2, pad_char); - num_pad_chars--; - } - } - return res2; - -} /* local_hex_string_custom */ - -/* Returns the appropriate printf format for octal - numbers. */ -char * -local_octal_format_custom (char *pre) -{ - static char form[50]; - - strcpy (form, local_octal_format_prefix ()); - strcat (form, "%"); - strcat (form, pre); - strcat (form, local_octal_format_specifier ()); - strcat (form, local_octal_format_suffix ()); - return form; -} - -/* Returns the appropriate printf format for decimal numbers. */ -char * -local_decimal_format_custom (char *pre) -{ - static char form[50]; - - strcpy (form, local_decimal_format_prefix ()); - strcat (form, "%"); - strcat (form, pre); - strcat (form, local_decimal_format_specifier ()); - strcat (form, local_decimal_format_suffix ()); - return form; -} - #if 0 /* This page contains functions that are used in type/range checking. They all return zero if the type/range check fails. @@ -986,210 +852,10 @@ value_true (struct value *val) return !value_logical_not (val); } -/* Returns non-zero if the operator OP is defined on - the values ARG1 and ARG2. */ - -#if 0 /* Currently unused */ - -void -binop_type_check (struct value *arg1, struct value *arg2, int op) -{ - struct type *t1, *t2; - - /* If we're not checking types, always return success. */ - if (!STRICT_TYPE) - return; - - t1 = VALUE_TYPE (arg1); - if (arg2 != NULL) - t2 = VALUE_TYPE (arg2); - else - t2 = NULL; - - switch (op) - { - case BINOP_ADD: - case BINOP_SUB: - if ((numeric_type (t1) && pointer_type (t2)) || - (pointer_type (t1) && numeric_type (t2))) - { - warning ("combining pointer and integer.\n"); - break; - } - case BINOP_MUL: - case BINOP_LSH: - case BINOP_RSH: - if (!numeric_type (t1) || !numeric_type (t2)) - type_op_error ("Arguments to %s must be numbers.", op); - else if (!same_type (t1, t2)) - type_op_error ("Arguments to %s must be of the same type.", op); - break; - - case BINOP_LOGICAL_AND: - case BINOP_LOGICAL_OR: - if (!boolean_type (t1) || !boolean_type (t2)) - type_op_error ("Arguments to %s must be of boolean type.", op); - break; - - case BINOP_EQUAL: - if ((pointer_type (t1) && !(pointer_type (t2) || integral_type (t2))) || - (pointer_type (t2) && !(pointer_type (t1) || integral_type (t1)))) - type_op_error ("A pointer can only be compared to an integer or pointer.", op); - else if ((pointer_type (t1) && integral_type (t2)) || - (integral_type (t1) && pointer_type (t2))) - { - warning ("combining integer and pointer.\n"); - break; - } - else if (!simple_type (t1) || !simple_type (t2)) - type_op_error ("Arguments to %s must be of simple type.", op); - else if (!same_type (t1, t2)) - type_op_error ("Arguments to %s must be of the same type.", op); - break; - - case BINOP_REM: - case BINOP_MOD: - if (!integral_type (t1) || !integral_type (t2)) - type_op_error ("Arguments to %s must be of integral type.", op); - break; - - case BINOP_LESS: - case BINOP_GTR: - case BINOP_LEQ: - case BINOP_GEQ: - if (!ordered_type (t1) || !ordered_type (t2)) - type_op_error ("Arguments to %s must be of ordered type.", op); - else if (!same_type (t1, t2)) - type_op_error ("Arguments to %s must be of the same type.", op); - break; - - case BINOP_ASSIGN: - if (pointer_type (t1) && !integral_type (t2)) - type_op_error ("A pointer can only be assigned an integer.", op); - else if (pointer_type (t1) && integral_type (t2)) - { - warning ("combining integer and pointer."); - break; - } - else if (!simple_type (t1) || !simple_type (t2)) - type_op_error ("Arguments to %s must be of simple type.", op); - else if (!same_type (t1, t2)) - type_op_error ("Arguments to %s must be of the same type.", op); - break; - - case BINOP_CONCAT: - /* FIXME: Needs to handle bitstrings as well. */ - if (!(string_type (t1) || character_type (t1) || integral_type (t1)) - || !(string_type (t2) || character_type (t2) || integral_type (t2))) - type_op_error ("Arguments to %s must be strings or characters.", op); - break; - - /* Unary checks -- arg2 is null */ - - case UNOP_LOGICAL_NOT: - if (!boolean_type (t1)) - type_op_error ("Argument to %s must be of boolean type.", op); - break; - - case UNOP_PLUS: - case UNOP_NEG: - if (!numeric_type (t1)) - type_op_error ("Argument to %s must be of numeric type.", op); - break; - - case UNOP_IND: - if (integral_type (t1)) - { - warning ("combining pointer and integer.\n"); - break; - } - else if (!pointer_type (t1)) - type_op_error ("Argument to %s must be a pointer.", op); - break; - - case UNOP_PREINCREMENT: - case UNOP_POSTINCREMENT: - case UNOP_PREDECREMENT: - case UNOP_POSTDECREMENT: - if (!ordered_type (t1)) - type_op_error ("Argument to %s must be of an ordered type.", op); - break; - - default: - /* Ok. The following operators have different meanings in - different languages. */ - switch (current_language->la_language) - { -#ifdef _LANG_c - case language_c: - case language_cplus: - case language_objc: - switch (op) - { - case BINOP_DIV: - if (!numeric_type (t1) || !numeric_type (t2)) - type_op_error ("Arguments to %s must be numbers.", op); - break; - } - break; -#endif - -#ifdef _LANG_m2 - case language_m2: - switch (op) - { - case BINOP_DIV: - if (!float_type (t1) || !float_type (t2)) - type_op_error ("Arguments to %s must be floating point numbers.", op); - break; - case BINOP_INTDIV: - if (!integral_type (t1) || !integral_type (t2)) - type_op_error ("Arguments to %s must be of integral type.", op); - break; - } -#endif - -#ifdef _LANG_pascal - case language_pascal: - switch(op) - { - case BINOP_DIV: - if (!float_type(t1) && !float_type(t2)) - type_op_error ("Arguments to %s must be floating point numbers.",op); - break; - case BINOP_INTDIV: - if (!integral_type(t1) || !integral_type(t2)) - type_op_error ("Arguments to %s must be of integral type.",op); - break; - } -#endif - - } - } -} - -#endif /* 0 */ - - /* This page contains functions for the printing out of error messages that occur during type- and range- checking. */ -/* Prints the format string FMT with the operator as a string - corresponding to the opcode OP. If FATAL is non-zero, then - this is an error and error () is called. Otherwise, it is - a warning and printf() is called. */ -void -op_error (char *fmt, enum exp_opcode op, int fatal) -{ - if (fatal) - error (fmt, op_string (op)); - else - { - warning (fmt, op_string (op)); - } -} - /* These are called when a language fails a type- or range-check. The first argument should be a printf()-style format string, and the rest of the arguments should be its arguments. If @@ -1260,7 +926,7 @@ language_enum (char *str) int i; for (i = 0; i < languages_size; i++) - if (STREQ (languages[i]->la_name, str)) + if (DEPRECATED_STREQ (languages[i]->la_name, str)) return languages[i]->la_language; return language_unknown; @@ -1377,6 +1043,25 @@ language_demangle (const struct language_defn *current_language, return NULL; } +/* Return class name from physname or NULL. */ +char * +language_class_name_from_physname (const struct language_defn *current_language, + const char *physname) +{ + if (current_language != NULL && current_language->la_class_name_from_physname) + return current_language->la_class_name_from_physname (physname); + return NULL; +} + +/* Return the default string containing the list of characters + delimiting words. This is a reasonable default value that + most languages should be able to use. */ + +char * +default_word_break_characters (void) +{ + return " \t\n!@#$%^&*()+=|~`}{[]\"';:?/>.<,-"; +} /* Define the language that is no language. */ @@ -1393,20 +1078,20 @@ unk_lang_error (char *msg) } static void -unk_lang_emit_char (register int c, struct ui_file *stream, int quoter) +unk_lang_emit_char (int c, struct ui_file *stream, int quoter) { error ("internal error - unimplemented function unk_lang_emit_char called."); } static void -unk_lang_printchar (register int c, struct ui_file *stream) +unk_lang_printchar (int c, struct ui_file *stream) { error ("internal error - unimplemented function unk_lang_printchar called."); } static void -unk_lang_printstr (struct ui_file *stream, char *string, unsigned int length, - int width, int force_ellipses) +unk_lang_printstr (struct ui_file *stream, const bfd_byte *string, + unsigned int length, int width, int force_ellipses) { error ("internal error - unimplemented function unk_lang_printstr called."); } @@ -1425,8 +1110,9 @@ unk_lang_print_type (struct type *type, char *varstring, struct ui_file *stream, } static int -unk_lang_val_print (struct type *type, char *valaddr, int embedded_offset, - CORE_ADDR address, struct ui_file *stream, int format, +unk_lang_val_print (struct type *type, const bfd_byte *valaddr, + int embedded_offset, CORE_ADDR address, + struct ui_file *stream, int format, int deref_ref, int recurse, enum val_prettyprint pretty) { error ("internal error - unimplemented function unk_lang_val_print called."); @@ -1450,27 +1136,38 @@ static char *unk_lang_demangle (const char *mangled, int options) return cplus_demangle (mangled, options); } - -static struct type **const (unknown_builtin_types[]) = +static char *unk_lang_class_name (const char *mangled) { - 0 -}; + return NULL; +} + static const struct op_print unk_op_print_tab[] = { {NULL, OP_NULL, PREC_NULL, 0} }; +static void +unknown_language_arch_info (struct gdbarch *gdbarch, + struct language_arch_info *lai) +{ + lai->string_char_type = builtin_type (gdbarch)->builtin_char; + lai->primitive_type_vector = GDBARCH_OBSTACK_CALLOC (gdbarch, 1, + struct type *); +} + const struct language_defn unknown_language_defn = { "unknown", language_unknown, - &unknown_builtin_types[0], + NULL, range_check_off, type_check_off, + array_row_major, case_sensitive_on, + &exp_descriptor_standard, unk_lang_parser, unk_lang_error, - evaluate_subexp_standard, + null_post_parser, unk_lang_printchar, /* Print character constant */ unk_lang_printstr, unk_lang_emit_char, @@ -1479,15 +1176,17 @@ const struct language_defn unknown_language_defn = 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 */ + basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ + basic_lookup_transparent_type,/* lookup_transparent_type */ unk_lang_demangle, /* Language specific symbol demangler */ - {"", "", "", ""}, /* Binary format info */ - {"0%lo", "0", "o", ""}, /* Octal format info */ - {"%ld", "", "d", ""}, /* Decimal format info */ - {"0x%lx", "0x", "x", ""}, /* Hex format info */ + unk_lang_class_name, /* Language specific class_name_from_physname */ unk_op_print_tab, /* expression operators for printing */ 1, /* c-style arrays */ 0, /* String lower bound */ - &builtin_type_char, /* Type of string elements */ + NULL, + default_word_break_characters, + unknown_language_arch_info, /* la_language_arch_info. */ LANG_MAGIC }; @@ -1496,13 +1195,15 @@ const struct language_defn auto_language_defn = { "auto", language_auto, - &unknown_builtin_types[0], + NULL, range_check_off, type_check_off, + array_row_major, case_sensitive_on, + &exp_descriptor_standard, unk_lang_parser, unk_lang_error, - evaluate_subexp_standard, + null_post_parser, unk_lang_printchar, /* Print character constant */ unk_lang_printstr, unk_lang_emit_char, @@ -1511,15 +1212,17 @@ const struct language_defn auto_language_defn = 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 */ + basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ + basic_lookup_transparent_type,/* lookup_transparent_type */ unk_lang_demangle, /* Language specific symbol demangler */ - {"", "", "", ""}, /* Binary format info */ - {"0%lo", "0", "o", ""}, /* Octal format info */ - {"%ld", "", "d", ""}, /* Decimal format info */ - {"0x%lx", "0x", "x", ""}, /* Hex format info */ + unk_lang_class_name, /* Language specific class_name_from_physname */ unk_op_print_tab, /* expression operators for printing */ 1, /* c-style arrays */ 0, /* String lower bound */ - &builtin_type_char, /* Type of string elements */ + NULL, + default_word_break_characters, + unknown_language_arch_info, /* la_language_arch_info. */ LANG_MAGIC }; @@ -1527,13 +1230,15 @@ const struct language_defn local_language_defn = { "local", language_auto, - &unknown_builtin_types[0], + NULL, range_check_off, type_check_off, case_sensitive_on, + array_row_major, + &exp_descriptor_standard, unk_lang_parser, unk_lang_error, - evaluate_subexp_standard, + null_post_parser, unk_lang_printchar, /* Print character constant */ unk_lang_printstr, unk_lang_emit_char, @@ -1542,18 +1247,90 @@ const struct language_defn local_language_defn = 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 */ + basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ + basic_lookup_transparent_type,/* lookup_transparent_type */ unk_lang_demangle, /* Language specific symbol demangler */ - {"", "", "", ""}, /* Binary format info */ - {"0%lo", "0", "o", ""}, /* Octal format info */ - {"%ld", "", "d", ""}, /* Decimal format info */ - {"0x%lx", "0x", "x", ""}, /* Hex format info */ + unk_lang_class_name, /* Language specific class_name_from_physname */ unk_op_print_tab, /* expression operators for printing */ 1, /* c-style arrays */ 0, /* String lower bound */ - &builtin_type_char, /* Type of string elements */ + NULL, + default_word_break_characters, + unknown_language_arch_info, /* la_language_arch_info. */ LANG_MAGIC }; +/* Per-architecture language information. */ + +static struct gdbarch_data *language_gdbarch_data; + +struct language_gdbarch +{ + /* A vector of per-language per-architecture info. Indexed by "enum + language". */ + struct language_arch_info arch_info[nr_languages]; +}; + +static void * +language_gdbarch_post_init (struct gdbarch *gdbarch) +{ + struct language_gdbarch *l; + int i; + + l = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct language_gdbarch); + for (i = 0; i < languages_size; i++) + { + if (languages[i] != NULL + && languages[i]->la_language_arch_info != NULL) + languages[i]->la_language_arch_info + (gdbarch, l->arch_info + languages[i]->la_language); + } + return l; +} + +struct type * +language_string_char_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].string_char_type != NULL) + return ld->arch_info[la->la_language].string_char_type; + else + return (*la->string_char_type); +} + +struct type * +language_lookup_primitive_type_by_name (const struct language_defn *la, + struct gdbarch *gdbarch, + const char *name) +{ + struct language_gdbarch *ld = gdbarch_data (gdbarch, + language_gdbarch_data); + if (ld->arch_info[la->la_language].primitive_type_vector != NULL) + { + struct type *const *p; + for (p = ld->arch_info[la->la_language].primitive_type_vector; + (*p) != NULL; + p++) + { + if (strcmp (TYPE_NAME (*p), name) == 0) + return (*p); + } + } + else + { + struct type **const *p; + for (p = current_language->la_builtin_type_vector; *p != NULL; p++) + { + if (strcmp (TYPE_NAME (**p), name) == 0) + return (**p); + } + } + return (NULL); +} + /* Initialize the language routines */ void @@ -1561,13 +1338,16 @@ _initialize_language (void) { struct cmd_list_element *set, *show; + language_gdbarch_data + = gdbarch_data_register_post_init (language_gdbarch_post_init); + /* GDB commands for language specific stuff */ set = add_set_cmd ("language", class_support, var_string_noescape, (char *) &language, "Set the current source language.", &setlist); - show = add_show_from_set (set, &showlist); + show = deprecated_add_show_from_set (set, &showlist); set_cmd_cfunc (set, set_language_command); set_cmd_cfunc (show, show_language_command); @@ -1587,7 +1367,7 @@ _initialize_language (void) (char *) &type, "Set type checking. (on/warn/off/auto)", &setchecklist); - show = add_show_from_set (set, &showchecklist); + show = deprecated_add_show_from_set (set, &showchecklist); set_cmd_cfunc (set, set_type_command); set_cmd_cfunc (show, show_type_command); @@ -1595,7 +1375,7 @@ _initialize_language (void) (char *) &range, "Set range checking. (on/warn/off/auto)", &setchecklist); - show = add_show_from_set (set, &showchecklist); + show = deprecated_add_show_from_set (set, &showchecklist); set_cmd_cfunc (set, set_range_command); set_cmd_cfunc (show, show_range_command); @@ -1604,7 +1384,7 @@ _initialize_language (void) "Set case sensitivity in name search. (on/off/auto)\n\ For Fortran the default is off; for other languages the default is on.", &setlist); - show = add_show_from_set (set, &showlist); + show = deprecated_add_show_from_set (set, &showlist); set_cmd_cfunc (set, set_case_command); set_cmd_cfunc (show, show_case_command);