* aout64.h (BMAGIC): Define.
[deliverable/binutils-gdb.git] / gdb / language.h
index d09d4d355e5fabcda7ef0daf5e5263b411dc2496..a4ec6fb52347d4f51b284d1cfbb4df3409e05696 100644 (file)
@@ -1,5 +1,5 @@
 /* Source-language-related definitions for GDB.
-   Copyright 1991 Free Software Foundation, Inc.
+   Copyright 1991, 1992 Free Software Foundation, Inc.
    Contributed by the Department of Computer Science at the State University
    of New York at Buffalo.
 
@@ -19,11 +19,21 @@ You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
+#if !defined (LANGUAGE_H)
+#define LANGUAGE_H 1
+
+#ifdef __STDC__                /* Forward decls for prototypes */
+struct value;
+struct objfile;
+/* enum exp_opcode;    ANSI's `wisdom' didn't include forward enum decls. */
+#endif
+
 /* This used to be included to configure GDB for one or more specific
    languages.  Now it is shortcutted to configure for all of them.  FIXME.  */
 /* #include "lang_def.h" */
 #define        _LANG_c
 #define        _LANG_m2
+#define        _LANG_chill
 
 /* range_mode ==
    range_mode_auto:   range_check set automatically to default of language.
@@ -53,39 +63,148 @@ extern enum type_mode {type_mode_auto, type_mode_manual} type_mode;
 extern enum type_check
   {type_check_off, type_check_warn, type_check_on} type_check;
 \f
+/* Information for doing language dependent formatting of printed values. */
+
+struct language_format_info
+{
+  /* The format that can be passed directly to standard C printf functions
+     to generate a completely formatted value in the format appropriate for
+     the language. */
+
+  char *la_format;
+
+  /* The prefix to be used when directly printing a value, or constructing
+     a standard C printf format.  This generally is everything up to the
+     conversion specification (the part introduced by the '%' character
+     and terminated by the conversion specifier character). */
+
+  char *la_format_prefix;
+
+  /* The conversion specifier.  This is generally everything after the
+     field width and precision, typically only a single character such
+     as 'o' for octal format or 'x' for hexadecimal format. */
+
+  char *la_format_specifier;
+
+  /* The suffix to be used when directly printing a value, or constructing
+     a standard C printf format.  This generally is everything after the
+     conversion specification (the part introduced by the '%' character
+     and terminated by the conversion specifier character). */
+
+  char *la_format_suffix;              /* Suffix for custom format string */
+};
+
 /* Structure tying together assorted information about a language.  */
 
-struct language_defn {
-  char *          la_name;             /* Name of the language */
-  enum language    la_language;                /* its symtab language-enum (defs.h) */
-  struct type ** const
-                 *la_builtin_type_vector;  /* Its builtin types */
-  enum range_check la_range_check;     /* Default range checking */
-  enum type_check  la_type_check;      /* Default type checking */
-  int           (*la_parser)();        /* Parser function */
-  void          (*la_error)();         /* Parser error function */
-  struct type   **la_longest_int;      /* Longest signed integral type */
-  struct type   **la_longest_unsigned_int; /* Longest uns integral type */
-  struct type   **la_longest_float;    /* Longest floating point type */
-  char           *la_hex_format;       /* Hexadecimal printf format str */
-  char           *la_hex_format_pre;   /* Prefix for custom format string */
-  char           *la_hex_format_suf;   /* Suffix for custom format string */
-  char           *la_octal_format;     /* Octal printf format str */
-  char           *la_octal_format_pre; /* Prefix for custom format string */
-  char           *la_octal_format_suf; /* Suffix for custom format string */
-const struct op_print
-                 *la_op_print_tab;     /* Table for printing expressions */
-/* Add fields above this point, so the magic number is always last. */
-  long                    la_magic;            /* Magic number for compat checking */
+struct language_defn
+{
+  /* Name of the language */
+  
+  char *la_name;
+
+  /* its symtab language-enum (defs.h) */
+
+  enum language la_language;
+
+  /* Its builtin types.  This is a vector ended by a NULL pointer.  These
+     types can be specified by name in parsing types in expressions,
+     regardless of whether the program being debugged actually defines
+     such a type.  */
+
+  struct type ** const *la_builtin_type_vector;
+
+  /* Default range checking */
+
+  enum range_check la_range_check;
+
+  /* Default type checking */
+
+  enum type_check la_type_check;
+
+  /* Parser function. */
+  
+  int (*la_parser) PARAMS((void));
+
+  /* Parser error function */
+
+  void (*la_error) PARAMS ((char *));
+
+  void (*la_printchar) PARAMS ((int, GDB_FILE *));
+
+  void (*la_printstr) PARAMS ((GDB_FILE *, char *, unsigned int, int));
+
+  struct type *(*la_fund_type) PARAMS ((struct objfile *, int));
+
+  /* Print a type using syntax appropriate for this language. */
+
+  void (*la_print_type) PARAMS ((struct type *, char *, GDB_FILE *, int, int));
+
+  /* Print a value using syntax appropriate for this language. */
+
+  int (*la_val_print) PARAMS ((struct type *, char *,  CORE_ADDR, GDB_FILE *,
+                              int, int, int, enum val_prettyprint));
+
+  /* Print a top-level value using syntax appropriate for this language. */
+
+  int (*la_value_print) PARAMS ((struct value *, GDB_FILE *,
+                                int, enum val_prettyprint));
+
+  /* Longest floating point type */
+
+  struct type **la_longest_float;
+
+  /* Base 2 (binary) formats. */
+
+  struct language_format_info la_binary_format;
+
+  /* Base 8 (octal) formats. */
+
+  struct language_format_info la_octal_format;
+
+  /* Base 10 (decimal) formats */
+
+  struct language_format_info la_decimal_format;
+
+  /* Base 16 (hexadecimal) formats */
+
+  struct language_format_info la_hex_format;
+
+
+  /* Table for printing expressions */
+
+  const struct op_print *la_op_print_tab;
+
+  /* Add fields above this point, so the magic number is always last. */
+  /* Magic number for compat checking */
+
+  long la_magic;
+
 };
 
 #define LANG_MAGIC     910823L
 
 /* Pointer to the language_defn for our current language.  This pointer
    always points to *some* valid struct; it can be used without checking
-   it for validity.  */
+   it for validity.
+
+   The current language affects expression parsing and evaluation
+   (FIXME: it might be cleaner to make the evaluation-related stuff
+   separate exp_opcodes for each different set of semantics.  We
+   should at least think this through more clearly with respect to
+   what happens if the language is changed between parsing and
+   evaluation) and printing of things like types and arrays.  It does
+   *not* affect symbol-reading-- each source file in a symbol-file has
+   its own language and we should keep track of that regardless of the
+   language when symbols are read.  If we want some manual setting for
+   the language of symbol files (e.g. detecting when ".c" files are
+   C++), it should be a seprate setting from the current_language.  */
+
+extern const struct language_defn *current_language;
+
+/* Pointer to the language_defn expected by the user, e.g. the language
+   of main(), or the language we last mentioned in a message, or C.  */
 
-extern struct language_defn *current_language;
+extern const struct language_defn *expected_language;
 
 /* language_mode == 
    language_mode_auto:   current_language automatically set upon selection
@@ -99,17 +218,22 @@ extern enum language_mode
    evaluator.  */
 
 /* Should we strictly type check expressions? */
-#define STRICT_TYPE (type_check != range_check_off)
+#define STRICT_TYPE (type_check != type_check_off)
 
 /* Should we range check values against the domain of their type? */
-#define RANGE_CHECK (range_check != type_check_off)
+#define RANGE_CHECK (range_check != range_check_off)
 
 /* "cast" really means conversion */
 /* FIXME -- should be a setting in language_defn */
-#define CAST_IS_CONVERSION (current_language->la_language == language_c)
+#define CAST_IS_CONVERSION (current_language->la_language == language_c  || \
+                           current_language->la_language == language_cplus)
+
+extern void
+language_info PARAMS ((int));
+
+extern void
+set_language PARAMS ((enum language));
 
-void language_info();
-void set_language();
 \f
 /* This page contains functions that return things that are
    specific to languages.  Each of these functions is based on
@@ -117,54 +241,173 @@ void set_language();
    with the "set language" command. */
 
 /* Returns some built-in types */
-#define        longest_int()           (*current_language->la_longest_int)
-#define        longest_unsigned_int()  (*current_language->la_longest_unsigned_int)
 #define        longest_float()         (*current_language->la_longest_float)
-struct type *binop_result_type();
 
-/* Hexadecimal number formatting is in defs.h because it is so common
-   throughout GDB.  */
+#define create_fundamental_type(objfile,typeid) \
+  (current_language->la_fund_type(objfile, typeid))
+
+#define LA_PRINT_TYPE(type,varstring,stream,show,level) \
+  (current_language->la_print_type(type,varstring,stream,show,level))
+
+#define LA_VAL_PRINT(type,valaddr,addr,stream,fmt,deref,recurse,pretty) \
+  (current_language->la_val_print(type,valaddr,addr,stream,fmt,deref, \
+                                 recurse,pretty))
+#define LA_VALUE_PRINT(val,stream,fmt,pretty) \
+  (current_language->la_value_print(val,stream,fmt,pretty))
+
+/* Return a format string for printf that will print a number in one of
+   the local (language-specific) formats.  Result is static and is
+   overwritten by the next call.  Takes printf options like "08" or "l"
+   (to produce e.g. %08x or %lx).  */
+
+#define local_binary_format() \
+  (current_language->la_binary_format.la_format)
+#define local_binary_format_prefix() \
+  (current_language->la_binary_format.la_format_prefix)
+#define local_binary_format_specifier() \
+  (current_language->la_binary_format.la_format_specifier)
+#define local_binary_format_suffix() \
+  (current_language->la_binary_format.la_format_suffix)
+
+#define local_octal_format() \
+  (current_language->la_octal_format.la_format)
+#define local_octal_format_prefix() \
+  (current_language->la_octal_format.la_format_prefix)
+#define local_octal_format_specifier() \
+  (current_language->la_octal_format.la_format_specifier)
+#define local_octal_format_suffix() \
+  (current_language->la_octal_format.la_format_suffix)
+
+#define local_decimal_format() \
+  (current_language->la_decimal_format.la_format)
+#define local_decimal_format_prefix() \
+  (current_language->la_decimal_format.la_format_prefix)
+#define local_decimal_format_specifier() \
+  (current_language->la_decimal_format.la_format_specifier)
+#define local_decimal_format_suffix() \
+  (current_language->la_decimal_format.la_format_suffix)
+
+#define local_hex_format() \
+  (current_language->la_hex_format.la_format)
+#define local_hex_format_prefix() \
+  (current_language->la_hex_format.la_format_prefix)
+#define local_hex_format_specifier() \
+  (current_language->la_hex_format.la_format_specifier)
+#define local_hex_format_suffix() \
+  (current_language->la_hex_format.la_format_suffix)
+
+#define LA_PRINT_CHAR(ch, stream) \
+  (current_language->la_printchar(ch, stream))
+#define LA_PRINT_STRING(stream, string, length, force_ellipses) \
+  (current_language->la_printstr(stream, string, length, force_ellipses))
+
+/* Test a character to decide whether it can be printed in literal form
+   or needs to be printed in another representation.  For example,
+   in C the literal form of the character with octal value 141 is 'a'
+   and the "other representation" is '\141'.  The "other representation"
+   is program language dependent. */
+
+#define PRINT_LITERAL_FORM(c) \
+  ((c)>=0x20 && ((c)<0x7F || (c)>=0xA0) && (!sevenbit_strings || (c)<0x80))
+
+/* Return a format string for printf that will print a number in one of
+   the local (language-specific) formats.  Result is static and is
+   overwritten by the next call.  Takes printf options like "08" or "l"
+   (to produce e.g. %08x or %lx).  */
+
+extern char *
+local_decimal_format_custom PARAMS ((char *)); /* language.c */
+
+extern char *
+local_octal_format_custom PARAMS ((char *));   /* language.c */
+
+extern char *
+local_hex_format_custom PARAMS ((char *));     /* language.c */
+
+/* Return a string that contains a number formatted in one of the local
+   (language-specific) formats.  Result is static and is overwritten by
+   the next call.  Takes printf options like "08" or "l".  */
+
+extern char *
+local_hex_string PARAMS ((unsigned long));             /* language.c */
+
+extern char *
+local_hex_string_custom PARAMS ((unsigned long, char *)); /* language.c */
 
-/* Return a format string for printf that will print a number in the local
-   (language-specific) octal format.  Result is static and is
-   overwritten by the next call.  local_octal_format_custom takes printf
-   options like "08" or "l" (to produce e.g. %08x or %lx).  */
+/* Type predicates */
 
-#define local_octal_format() (current_language->la_octal_format)
-char *local_octal_format_custom();
+extern int
+simple_type PARAMS ((struct type *));
 
-/* Type predicates */
-int simple_type();
-int ordered_type();
-int same_type();
-int integral_type();
-int numeric_type();
-int character_type();
-int boolean_type();
-int float_type();
-int pointer_type();
-int structured_type();
+extern int
+ordered_type PARAMS ((struct type *));
+
+extern int
+same_type PARAMS ((struct type *, struct type *));
+
+extern int
+integral_type PARAMS ((struct type *));
+
+extern int
+numeric_type PARAMS ((struct type *));
+
+extern int
+character_type PARAMS ((struct type *));
+
+extern int
+boolean_type PARAMS ((struct type *));
+
+extern int
+float_type PARAMS ((struct type *));
+
+extern int
+pointer_type PARAMS ((struct type *));
+
+extern int
+structured_type PARAMS ((struct type *));
 
 /* Checks Binary and Unary operations for semantic type correctness */
-void binop_type_check();
+/* FIXME:  Does not appear to be used */
 #define unop_type_check(v,o) binop_type_check((v),NULL,(o))
 
+extern void
+binop_type_check PARAMS ((struct value *, struct value *, int));
+
 /* Error messages */
-void op_error();
+
+extern void
+op_error PARAMS ((char *fmt, enum exp_opcode, int));
+
 #define type_op_error(f,o) \
    op_error((f),(o),type_check==type_check_on ? 1 : 0)
 #define range_op_error(f,o) \
    op_error((f),(o),range_check==range_check_on ? 1 : 0)
-void type_error();
-void range_error();
+
+extern void
+type_error ();
+
+void
+range_error ();
 
 /* Data:  Does this value represent "truth" to the current language?  */
-int value_true();
+
+extern int
+value_true PARAMS ((struct value *));
 
 /* Misc:  The string representing a particular enum language.  */
-char *language_str();
+
+extern const struct language_defn *
+language_def PARAMS ((enum language));
+
+extern char *
+language_str PARAMS ((enum language));
 
 /* Add a language to the set known by GDB (at initialization time).  */
-void add_language ();          /* Arg is &language_defn */
 
-extern enum language get_frame_language ();    /* In stack.c */
+extern void
+add_language PARAMS ((const struct language_defn *));
+
+extern enum language
+get_frame_language PARAMS ((void));            /* In stack.c */
+
+#endif /* defined (LANGUAGE_H) */
This page took 0.027981 seconds and 4 git commands to generate.