import gdb-1999-05-25 snapshot
[deliverable/binutils-gdb.git] / gdb / language.c
index af0243b7680e3c01daf0e5dd0505edb3a885b8cd..394a500f02b9693f82162e3a3efc33ec4aafee54 100644 (file)
@@ -17,7 +17,7 @@ GNU General Public License for more details.
 
 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.  */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 /* This file contains functions that return things that are specific
    to languages.  Each function should examine current_language if necessary,
@@ -28,8 +28,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
    whenever the working language changes.  That would be a lot faster.  */
 
 #include "defs.h"
-#include <string.h>
-#include <varargs.h>
+#include <ctype.h>
+#include "gdb_string.h"
 
 #include "symtab.h"
 #include "gdbtypes.h"
@@ -41,6 +41,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "target.h"
 #include "parser-defs.h"
 
+extern void _initialize_language PARAMS ((void));
+
 static void
 show_language_command PARAMS ((char *, int));
 
@@ -83,6 +85,28 @@ set_check PARAMS ((char *, int));
 static void
 set_type_range PARAMS ((void));
 
+static void
+unk_lang_emit_char PARAMS ((int c, GDB_FILE *stream, int quoter));
+
+static void
+unk_lang_printchar PARAMS ((int c, GDB_FILE *stream));
+
+static void
+unk_lang_printstr PARAMS ((GDB_FILE *stream, char *string, unsigned int length, int width, int force_ellipses));
+
+static struct type *
+unk_lang_create_fundamental_type PARAMS ((struct objfile *, int));
+
+static void
+unk_lang_print_type PARAMS ((struct type *, char *, GDB_FILE *, int, int));
+
+static int
+unk_lang_val_print PARAMS ((struct type *, char *, int, CORE_ADDR, GDB_FILE *,
+                           int, int, int, enum val_prettyprint));
+
+static int
+unk_lang_value_print PARAMS ((value_ptr, GDB_FILE *, int, enum val_prettyprint));
+
 /* Forward declaration */
 extern const struct language_defn unknown_language_defn;
 extern char *warning_pre_print;
@@ -144,9 +168,9 @@ show_language_command (ignore, from_tty)
 
    flang = get_frame_language();
    if (flang != language_unknown &&
-      language_mode == language_mode_manual &&
-      current_language->la_language != flang)
-      printf_filtered("%s\n",lang_frame_mismatch_warn);
+       language_mode == language_mode_manual &&
+       current_language->la_language != flang)
+     printf_filtered("%s\n",lang_frame_mismatch_warn);
 }
 
 /* Set command.  Change the current working language. */
@@ -159,18 +183,31 @@ set_language_command (ignore, from_tty)
   enum language flang;
   char *err_lang;
 
-  /* FIXME -- do this from the list, with HELP.  */
-  if (!language || !language[0]) {
-    printf_unfiltered("The currently understood settings are:\n\n");
-    printf_unfiltered ("local or auto    Automatic setting based on source file\n");
-    printf_unfiltered ("c                Use the C language\n");
-    printf_unfiltered ("c++              Use the C++ language\n");
-    printf_unfiltered ("chill            Use the Chill language\n");
-    printf_unfiltered ("modula-2         Use the Modula-2 language\n");
-    /* Restore the silly string. */
-    set_language(current_language->la_language);
-    return;
-  }
+  if (!language || !language[0])
+    {
+      printf_unfiltered("The currently understood settings are:\n\n");
+      printf_unfiltered ("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 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++) {
@@ -313,13 +350,16 @@ set_type_range()
   set_range_str();
 }
 
-/* Set current language to (enum language) LANG.  */
+/* Set current language to (enum language) LANG.  Returns previous language. */
 
-void
+enum language
 set_language(lang)
    enum language lang;
 {
   int i;
+  enum language prev_language;
+
+  prev_language = current_language->la_language;
 
   for (i = 0; i < languages_size; i++) {
     if (languages[i]->la_language == lang) {
@@ -329,6 +369,8 @@ set_language(lang)
       break;
     }
   }
+
+  return prev_language;
 }
 \f
 /* This page contains functions that update the global vars
@@ -431,24 +473,26 @@ struct type *
 binop_result_type (v1, v2)
    value_ptr v1, v2;
 {
-   int l1,l2,size,uns;
+   int size,uns;
+   struct type *t1 = check_typedef (VALUE_TYPE (v1));
+   struct type *t2 = check_typedef (VALUE_TYPE (v2));
 
-   l1 = TYPE_LENGTH(VALUE_TYPE(v1));
-   l2 = TYPE_LENGTH(VALUE_TYPE(v2));
+   int l1 = TYPE_LENGTH (t1);
+   int l2 = TYPE_LENGTH (t2);
 
    switch(current_language->la_language)
    {
    case language_c:
    case language_cplus:
-      if (TYPE_CODE(VALUE_TYPE(v1))==TYPE_CODE_FLT)
-        return TYPE_CODE(VALUE_TYPE(v2)) == TYPE_CODE_FLT && l2 > l1 ?
+      if (TYPE_CODE (t1)==TYPE_CODE_FLT)
+        return TYPE_CODE(t2) == TYPE_CODE_FLT && l2 > l1 ?
            VALUE_TYPE(v2) : VALUE_TYPE(v1);
-      else if (TYPE_CODE(VALUE_TYPE(v2))==TYPE_CODE_FLT)
-        return TYPE_CODE(VALUE_TYPE(v1)) == TYPE_CODE_FLT && l1 > l2 ?
+      else if (TYPE_CODE(t2)==TYPE_CODE_FLT)
+        return TYPE_CODE(t1)) == TYPE_CODE_FLT && l1 > l2 ?
            VALUE_TYPE(v1) : VALUE_TYPE(v2);
-      else if (TYPE_UNSIGNED(VALUE_TYPE(v1)) && l1 > l2)
+      else if (TYPE_UNSIGNED(t1) && l1 > l2)
         return VALUE_TYPE(v1);
-      else if (TYPE_UNSIGNED(VALUE_TYPE(v2)) && l2 > l1)
+      else if (TYPE_UNSIGNED(t2) && l2 > l1)
         return VALUE_TYPE(v2);
       else  /* Both are signed.  Result is the longer type */
         return l1 > l2 ? VALUE_TYPE(v1) : VALUE_TYPE(v2);
@@ -543,6 +587,7 @@ local_decimal_format_custom(pre)
    return form;
 }
 \f
+#if 0
 /* This page contains functions that are used in type/range checking.
    They all return zero if the type/range check fails.
 
@@ -564,6 +609,7 @@ int
 simple_type(type)
     struct type *type;
 {
+  CHECK_TYPEDEF (type);
   switch (TYPE_CODE (type)) {
   case TYPE_CODE_INT:
   case TYPE_CODE_CHAR:
@@ -586,6 +632,7 @@ int
 ordered_type (type)
    struct type *type;
 {
+  CHECK_TYPEDEF (type);
   switch (TYPE_CODE (type)) {
   case TYPE_CODE_INT:
   case TYPE_CODE_CHAR:
@@ -604,6 +651,7 @@ int
 same_type (arg1, arg2)
    struct type *arg1, *arg2;
 {
+  CHECK_TYPEDEF (type);
    if (structured_type(arg1) ? !structured_type(arg2) : structured_type(arg2))
       /* One is structured and one isn't */
       return 0;
@@ -622,6 +670,7 @@ int
 integral_type (type)
    struct type *type;
 {
+  CHECK_TYPEDEF (type);
    switch(current_language->la_language)
    {
    case language_c:
@@ -642,6 +691,7 @@ int
 numeric_type (type)
    struct type *type;
 {
+  CHECK_TYPEDEF (type);
   switch (TYPE_CODE (type)) {
   case TYPE_CODE_INT:
   case TYPE_CODE_FLT:
@@ -657,7 +707,8 @@ int
 character_type (type)
    struct type *type;
 {
-   switch(current_language->la_language)
+  CHECK_TYPEDEF (type);
+  switch(current_language->la_language)
    {
    case language_chill:
    case language_m2:
@@ -678,7 +729,8 @@ int
 string_type (type)
    struct type *type;
 {
-   switch(current_language->la_language)
+  CHECK_TYPEDEF (type);
+  switch(current_language->la_language)
    {
    case language_chill:
    case language_m2:
@@ -698,6 +750,7 @@ int
 boolean_type (type)
    struct type *type;
 {
+  CHECK_TYPEDEF (type);
   if (TYPE_CODE (type) == TYPE_CODE_BOOL)
     return 1;
   switch(current_language->la_language)
@@ -719,7 +772,8 @@ int
 float_type (type)
    struct type *type;
 {
-   return TYPE_CODE(type) == TYPE_CODE_FLT;
+  CHECK_TYPEDEF (type);
+  return TYPE_CODE(type) == TYPE_CODE_FLT;
 }
 
 /* Returns non-zero if the value is a pointer type */
@@ -736,6 +790,7 @@ int
 structured_type(type)
    struct type *type;
 {
+  CHECK_TYPEDEF (type);
    switch(current_language->la_language)
    {
    case language_c:
@@ -753,6 +808,39 @@ structured_type(type)
       return (0);
    }
 }
+#endif
+\f
+struct type *
+lang_bool_type ()
+{
+  struct symbol *sym;
+  struct type *type;
+  switch(current_language->la_language)
+    {
+    case language_chill:
+      return builtin_type_chill_bool;
+    case language_fortran:
+      sym = lookup_symbol ("logical", NULL, VAR_NAMESPACE, 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:
+      sym = lookup_symbol ("bool", NULL, VAR_NAMESPACE, NULL, NULL);
+      if (sym)
+       {
+         type = SYMBOL_TYPE (sym);
+         if (type && TYPE_CODE (type) == TYPE_CODE_BOOL)
+           return type;
+       }
+      return builtin_type_bool;
+    default:
+      return builtin_type_int;
+    }
+}
 \f
 /* This page contains functions that return info about
    (struct value) values used in GDB. */
@@ -977,42 +1065,58 @@ op_error (fmt,op,fatal)
    by the value of warning_pre_print and we do not return to the top level. */
 
 void
+#ifdef ANSI_PROTOTYPES
+type_error (char *string, ...)
+#else
 type_error (va_alist)
      va_dcl
+#endif
 {
    va_list args;
+#ifdef ANSI_PROTOTYPES
+   va_start (args, string);
+#else
    char *string;
+   va_start (args);
+   string = va_arg (args, char *);
+#endif
 
    if (type_check == type_check_warn)
-     fprintf_unfiltered (gdb_stderr, warning_pre_print);
+     fprintf_filtered (gdb_stderr, warning_pre_print);
    else
      error_begin ();
 
-   va_start (args);
-   string = va_arg (args, char *);
-   vfprintf_unfiltered (gdb_stderr, string, args);
-   fprintf_unfiltered (gdb_stderr, "\n");
+   vfprintf_filtered (gdb_stderr, string, args);
+   fprintf_filtered (gdb_stderr, "\n");
    va_end (args);
    if (type_check == type_check_on)
      return_to_top_level (RETURN_ERROR);
 }
 
 void
+#ifdef ANSI_PROTOTYPES
+range_error (char *string, ...)
+#else
 range_error (va_alist)
      va_dcl
+#endif
 {
    va_list args;
+#ifdef ANSI_PROTOTYPES
+   va_start (args, string);
+#else
    char *string;
+   va_start (args);
+   string = va_arg (args, char *);
+#endif
 
    if (range_check == range_check_warn)
-     fprintf_unfiltered (gdb_stderr, warning_pre_print);
+     fprintf_filtered (gdb_stderr, warning_pre_print);
    else
      error_begin ();
 
-   va_start (args);
-   string = va_arg (args, char *);
-   vfprintf_unfiltered (gdb_stderr, string, args);
-   fprintf_unfiltered (gdb_stderr, "\n");
+   vfprintf_filtered (gdb_stderr, string, args);
+   fprintf_filtered (gdb_stderr, "\n");
    va_end (args);
    if (range_check == range_check_on)
      return_to_top_level (RETURN_ERROR);
@@ -1021,6 +1125,21 @@ range_error (va_alist)
 \f
 /* This page contains miscellaneous functions */
 
+/* Return the language enum for a given language string. */
+
+enum language
+language_enum (str)
+     char *str;
+{
+  int i;
+
+  for (i = 0; i < languages_size; i++) 
+    if (STREQ (languages[i]->la_name, str))
+      return languages[i]->la_language;
+
+  return language_unknown;
+}
+
 /* Return the language struct for a given language enum. */
 
 const struct language_defn *
@@ -1113,6 +1232,15 @@ unk_lang_error (msg)
   error ("Attempted to parse an expression with unknown language");
 }
 
+static void
+unk_lang_emit_char (c, stream, quoter)
+     register int c;
+     GDB_FILE *stream;
+     int quoter;
+{
+  error ("internal error - unimplemented function unk_lang_emit_char called.");
+}
+
 static void
 unk_lang_printchar (c, stream)
      register int c;
@@ -1122,10 +1250,11 @@ unk_lang_printchar (c, stream)
 }
 
 static void
-unk_lang_printstr (stream, string, length, force_ellipses)
+unk_lang_printstr (stream, string, length, width, force_ellipses)
      GDB_FILE *stream;
      char *string;
      unsigned int length;
+     int width;
      int force_ellipses;
 {
   error ("internal error - unimplemented function unk_lang_printstr called.");
@@ -1139,7 +1268,7 @@ unk_lang_create_fundamental_type (objfile, typeid)
   error ("internal error - unimplemented function unk_lang_create_fundamental_type called.");
 }
 
-void
+static void
 unk_lang_print_type (type, varstring, stream, show, level)
      struct type *type;
      char *varstring;
@@ -1150,11 +1279,12 @@ unk_lang_print_type (type, varstring, stream, show, level)
   error ("internal error - unimplemented function unk_lang_print_type called.");
 }
 
-int
-unk_lang_val_print (type, valaddr, address, stream, format, deref_ref,
+static int
+unk_lang_val_print (type, valaddr,  embedded_offset, address, stream, format, deref_ref,
                    recurse, pretty)
      struct type *type;
      char *valaddr;
+     int embedded_offset;
      CORE_ADDR address;
      GDB_FILE *stream;
      int format;
@@ -1165,7 +1295,17 @@ unk_lang_val_print (type, valaddr, address, stream, format, deref_ref,
   error ("internal error - unimplemented function unk_lang_val_print called.");
 }
 
-static struct type ** const (unknown_builtin_types[]) = { 0 };
+static int
+unk_lang_value_print (val, stream, format, pretty)
+     value_ptr val;
+     GDB_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[]) = { 0 };
 static const struct op_print unk_op_print_tab[] = {
     {NULL, OP_NULL, PREC_NULL, 0}
 };
@@ -1178,17 +1318,22 @@ const struct language_defn unknown_language_defn = {
   type_check_off,
   unk_lang_parser,
   unk_lang_error,
+  evaluate_subexp_standard,
   unk_lang_printchar,          /* Print character constant */
   unk_lang_printstr,
+  unk_lang_emit_char,
   unk_lang_create_fundamental_type,
   unk_lang_print_type,         /* Print a type using appropriate syntax */
   unk_lang_val_print,          /* Print a value using appropriate syntax */
-  &builtin_type_error,         /* longest floating point type */
+  unk_lang_value_print,                /* Print a top-level value */
   {"",      "",    "",   ""},  /* Binary format info */
   {"0%lo",   "0",   "o",  ""}, /* Octal format info */
   {"%ld",    "",    "d",  ""}, /* Decimal format info */
   {"0x%lx",  "0x",  "x",  ""}, /* Hex format info */
   unk_op_print_tab,            /* expression operators for printing */
+  1,                           /* c-style arrays */
+  0,                           /* String lower bound */
+  &builtin_type_char,          /* Type of string elements */ 
   LANG_MAGIC
 };
 
@@ -1201,17 +1346,22 @@ const struct language_defn auto_language_defn = {
   type_check_off,
   unk_lang_parser,
   unk_lang_error,
+  evaluate_subexp_standard,
   unk_lang_printchar,          /* Print character constant */
   unk_lang_printstr,
+  unk_lang_emit_char,
   unk_lang_create_fundamental_type,
   unk_lang_print_type,         /* Print a type using appropriate syntax */
   unk_lang_val_print,          /* Print a value using appropriate syntax */
-  &builtin_type_error,         /* longest floating point type */
+  unk_lang_value_print,                /* Print a top-level value */
   {"",      "",    "",   ""},  /* Binary format info */
   {"0%lo",   "0",   "o",  ""}, /* Octal format info */
   {"%ld",    "",    "d",  ""}, /* Decimal format info */
   {"0x%lx",  "0x",  "x",  ""}, /* Hex format info */
   unk_op_print_tab,            /* expression operators for printing */
+  1,                           /* c-style arrays */
+  0,                           /* String lower bound */
+  &builtin_type_char,          /* Type of string elements */ 
   LANG_MAGIC
 };
 
@@ -1223,17 +1373,22 @@ const struct language_defn local_language_defn = {
   type_check_off,
   unk_lang_parser,
   unk_lang_error,
+  evaluate_subexp_standard,
   unk_lang_printchar,          /* Print character constant */
   unk_lang_printstr,
+  unk_lang_emit_char,
   unk_lang_create_fundamental_type,
   unk_lang_print_type,         /* Print a type using appropriate syntax */
   unk_lang_val_print,          /* Print a value using appropriate syntax */
-  &builtin_type_error,         /* longest floating point type */
+  unk_lang_value_print,                /* Print a top-level value */
   {"",      "",    "",   ""},  /* Binary format info */
   {"0%lo",   "0",   "o",  ""}, /* Octal format info */
   {"%ld",    "",    "d",  ""}, /* Decimal format info */
   {"0x%lx",  "0x",  "x",  ""}, /* Hex format info */
   unk_op_print_tab,            /* expression operators for printing */
+  1,                           /* c-style arrays */
+  0,                           /* String lower bound */
+  &builtin_type_char,          /* Type of string elements */ 
   LANG_MAGIC
 };
 \f
This page took 0.044557 seconds and 4 git commands to generate.