/* Multiple source language support for GDB.
- Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
+ Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
Free Software Foundation, Inc.
Contributed by the Department of Computer Science at the State University
of New York at Buffalo.
#include "gdbtypes.h"
#include "value.h"
#include "gdbcmd.h"
-#include "frame.h"
#include "expression.h"
#include "language.h"
#include "target.h"
struct ui_file *, int, int, int,
enum val_prettyprint);
-static int unk_lang_value_print (value_ptr, struct ui_file *, int, enum val_prettyprint);
+static int unk_lang_value_print (struct value *, struct ui_file *, int, enum val_prettyprint);
/* Forward declaration */
extern const struct language_defn unknown_language_defn;
-extern char *warning_pre_print;
/* The current (default at startup) state of type and range checking.
(If the modes are set to "auto", though, these are changed based
#if 0 /* Currently unused */
struct type *
-binop_result_type (value_ptr v1, value_ptr v2)
+binop_result_type (struct value *v1, struct value *v2)
{
int size, uns;
struct type *t1 = check_typedef (VALUE_TYPE (v1));
return form;
}
-#if 0
-/* FIXME: cagney/2000-03-04: This function does not appear to be used.
- It can be deleted once 5.0 has been released. */
-/* FIXME: cagney/2000-03-04: This code assumes that the compiler
- supports ``long long''. */
-/* Converts a number to hexadecimal (without leading "0x") and stores it in a
- static string. Returns a pointer to this string. */
-
-char *
-longest_raw_hex_string (LONGEST num)
-{
- static char res_longest_raw_hex_string[50];
- long long ll = num; /* MERGEBUG ?? see below */
- res_longest_raw_hex_string[0] = 0;
- /* MERGEBUG ?? As a quick fix I am replacing this with sprintf
- strcat_address_numeric (num, 0, res_longest_raw_hex_string, 50);
- */
-
- sprintf (res_longest_raw_hex_string, "%llx", ll);
- return res_longest_raw_hex_string;
-}
-#endif
-
-/* Converts a number to hexadecimal and stores it in a static
- string. Returns a pointer to this string. */
-char *
-local_hex_string (unsigned long num)
-{
- static char res[50];
-
- sprintf (res, local_hex_format (), num);
- return res;
-}
-
-/* Converts a LONGEST number to hexadecimal and stores it in a static
- string. Returns a pointer to this string. */
-char *
-longest_local_hex_string (LONGEST num)
-{
- return longest_local_hex_string_custom (num, "l");
-}
-
-/* Converts a number to custom hexadecimal and stores it in a static
+/* Converts a LONGEST to custom hexadecimal and stores it in a static
string. Returns a pointer to this string. */
char *
-local_hex_string_custom (unsigned long num, char *pre)
+local_hex_string (LONGEST num)
{
- static char res[50];
-
- sprintf (res, local_hex_format_custom (pre), num);
- return res;
+ return local_hex_string_custom (num, "l");
}
/* Converts a LONGEST number to custom hexadecimal and stores it in a static
should end with "l", e.g. "08l" as with calls to local_hex_string_custom */
char *
-longest_local_hex_string_custom (LONGEST num, char *width)
+local_hex_string_custom (LONGEST num, char *width)
{
#define RESULT_BUF_LEN 50
static char res2[RESULT_BUF_LEN];
char format[RESULT_BUF_LEN];
-#if !defined (PRINTF_HAS_LONG_LONG)
int field_width;
int num_len;
int num_pad_chars;
int pad_on_left;
char *parse_ptr;
char temp_nbr_buf[RESULT_BUF_LEN];
-#endif
-#ifndef CC_HAS_LONG_LONG
- /* If there is no long long, then LONGEST should be just long and we
- can use local_hex_string_custom
- */
- return local_hex_string_custom ((unsigned long) num, width);
-#elif defined (PRINTF_HAS_LONG_LONG)
- /* Just use printf. */
- strcpy (format, local_hex_format_prefix ()); /* 0x */
- strcat (format, "%");
- strcat (format, width); /* e.g. "08l" */
- strcat (format, "l"); /* need "ll" for long long */
- strcat (format, local_hex_format_specifier ()); /* "x" */
- strcat (format, local_hex_format_suffix ()); /* "" */
- sprintf (res2, format, num);
- return res2;
-#else /* !defined (PRINTF_HAS_LONG_LONG) */
- /* Use strcat_address_numeric to print the number into a string, then
+ /* 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". */
-
- temp_nbr_buf[0] = 0;
- /* With use_local == 0, we don't get the leading "0x" prefix. */
- /* MERGEBUG ?? As a quick fix I am replacing this call to
- strcat_address_numeric with sprintf
- strcat_address_numeric(num, 0, temp_nbr_buf, RESULT_BUF_LEN);
- */
-
- {
- long long ll = num;
- sprintf (temp_nbr_buf, "%llx", ll);
- }
+ strcpy (temp_nbr_buf, phex_nz (num, sizeof (num)));
/* parse width */
parse_ptr = width;
pad_on_left = 1;
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 */
+ >= RESULT_BUF_LEN) /* paranoia */
internal_error (__FILE__, __LINE__,
- "longest_local_hex_string_custom: insufficient space to store result");
+ "local_hex_string_custom: insufficient space to store result");
strcpy (res2, local_hex_format_prefix ());
if (pad_on_left)
}
}
return res2;
-#endif
-} /* longest_local_hex_string_custom */
+} /* local_hex_string_custom */
/* Returns the appropriate printf format for octal
numbers. */
/* Returns non-zero if the value VAL represents a true value. */
int
-value_true (value_ptr val)
+value_true (struct value *val)
{
/* It is possible that we should have some sort of error if a non-boolean
value is used in this context. Possibly dependent on some kind of
#if 0 /* Currently unused */
void
-binop_type_check (value_ptr arg1, value_ptr arg2, int op)
+binop_type_check (struct value *arg1, struct value *arg2, int op)
{
struct type *t1, *t2;
}
}
-/* 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
- [type|range]_check is [type|range]_check_on, then return_to_top_level()
- is called in the style of error (). Otherwise, the message is prefixed
- by the value of warning_pre_print and we do not return to the top level. */
+/* 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
+ [type|range]_check is [type|range]_check_on, an error is printed;
+ if [type|range]_check_warn, a warning; otherwise just the
+ message. */
void
-type_error (char *string,...)
+type_error (const char *string,...)
{
va_list args;
va_start (args, string);
- if (type_check == type_check_warn)
- fprintf_filtered (gdb_stderr, warning_pre_print);
- else
- error_begin ();
-
- vfprintf_filtered (gdb_stderr, string, args);
- fprintf_filtered (gdb_stderr, "\n");
+ switch (type_check)
+ {
+ case type_check_warn:
+ vwarning (string, args);
+ break;
+ case type_check_on:
+ verror (string, args);
+ break;
+ case type_check_off:
+ /* FIXME: cagney/2002-01-30: Should this function print anything
+ when type error is off? */
+ vfprintf_filtered (gdb_stderr, string, args);
+ fprintf_filtered (gdb_stderr, "\n");
+ break;
+ default:
+ internal_error (__FILE__, __LINE__, "bad switch");
+ }
va_end (args);
- if (type_check == type_check_on)
- return_to_top_level (RETURN_ERROR);
}
void
-range_error (char *string,...)
+range_error (const char *string,...)
{
va_list args;
va_start (args, string);
- if (range_check == range_check_warn)
- fprintf_filtered (gdb_stderr, warning_pre_print);
- else
- error_begin ();
-
- vfprintf_filtered (gdb_stderr, string, args);
- fprintf_filtered (gdb_stderr, "\n");
+ switch (range_check)
+ {
+ case range_check_warn:
+ vwarning (string, args);
+ break;
+ case range_check_on:
+ verror (string, args);
+ break;
+ case range_check_off:
+ /* FIXME: cagney/2002-01-30: Should this function print anything
+ when range error is off? */
+ vfprintf_filtered (gdb_stderr, string, args);
+ fprintf_filtered (gdb_stderr, "\n");
+ break;
+ default:
+ internal_error (__FILE__, __LINE__, "bad switch");
+ }
va_end (args);
- if (range_check == range_check_on)
- return_to_top_level (RETURN_ERROR);
}
\f
}
static int
-unk_lang_value_print (value_ptr val, struct ui_file *stream, int format,
+unk_lang_value_print (struct value *val, struct ui_file *stream, int format,
enum val_prettyprint pretty)
{
error ("internal error - unimplemented function unk_lang_value_print called.");
}
-static struct type **CONST_PTR (unknown_builtin_types[]) =
+static struct type **const (unknown_builtin_types[]) =
{
0
};
"Set the current source language.",
&setlist);
show = add_show_from_set (set, &showlist);
- set->function.cfunc = set_language_command;
- show->function.cfunc = show_language_command;
+ set_cmd_cfunc (set, set_language_command);
+ set_cmd_cfunc (show, show_language_command);
add_prefix_cmd ("check", no_class, set_check,
- "Set the status of the type/range checker",
+ "Set the status of the type/range checker.",
&setchecklist, "set check ", 0, &setlist);
add_alias_cmd ("c", "check", no_class, 1, &setlist);
add_alias_cmd ("ch", "check", no_class, 1, &setlist);
add_prefix_cmd ("check", no_class, show_check,
- "Show the status of the type/range checker",
+ "Show the status of the type/range checker.",
&showchecklist, "show check ", 0, &showlist);
add_alias_cmd ("c", "check", no_class, 1, &showlist);
add_alias_cmd ("ch", "check", no_class, 1, &showlist);
"Set type checking. (on/warn/off/auto)",
&setchecklist);
show = add_show_from_set (set, &showchecklist);
- set->function.cfunc = set_type_command;
- show->function.cfunc = show_type_command;
+ set_cmd_cfunc (set, set_type_command);
+ set_cmd_cfunc (show, show_type_command);
set = add_set_cmd ("range", class_support, var_string_noescape,
(char *) &range,
"Set range checking. (on/warn/off/auto)",
&setchecklist);
show = add_show_from_set (set, &showchecklist);
- set->function.cfunc = set_range_command;
- show->function.cfunc = show_range_command;
+ set_cmd_cfunc (set, set_range_command);
+ set_cmd_cfunc (show, show_range_command);
set = add_set_cmd ("case-sensitive", class_support, var_string_noescape,
(char *) &case_sensitive,
For Fortran the default is off; for other languages the default is on.",
&setlist);
show = add_show_from_set (set, &showlist);
- set->function.cfunc = set_case_command;
- show->function.cfunc = show_case_command;
+ set_cmd_cfunc (set, set_case_command);
+ set_cmd_cfunc (show, show_case_command);
add_language (&unknown_language_defn);
add_language (&local_language_defn);