import gdb-1999-05-25 snapshot
[deliverable/binutils-gdb.git] / gdb / language.c
index d96b3b51ea704079d66c61e3f57d2538d7beba09..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,8 +85,31 @@ 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;
   
 /* The current (default at startup) state of type and range checking.
     (If the modes are set to "auto", though, these are changed based
@@ -101,12 +126,17 @@ enum type_check type_check = type_check_off;
 const struct language_defn *current_language = &unknown_language_defn;
 enum language_mode language_mode = language_mode_auto;
 
+/* The language that the user expects to be typing in (the language
+   of main(), or the last language we notified them about, or C).  */
+
+const struct language_defn *expected_language;
+
 /* The list of supported languages.  The list itself is malloc'd.  */
 
 static const struct language_defn **languages;
 static unsigned languages_size;
 static unsigned languages_allocsize;
-#define        DEFAULT_ALLOCSIZE 3
+#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
@@ -138,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. */
@@ -153,21 +183,35 @@ 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("The currently understood settings are:\n\n\
-local or auto    Automatic setting based on source file\n\
-c                Use the C language\n\
-c++              Use the C++ language\n\
-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++) {
-    if (!strcmp (languages[i]->la_name, language)) {
+    if (STREQ (languages[i]->la_name, language)) {
       /* Found it!  Go into manual mode, and use this language.  */
       if (languages[i]->la_language == language_auto) {
        /* Enter auto mode.  Set to the current frame's language, if known.  */
@@ -175,6 +219,7 @@ modula-2         Use the Modula-2 language\n");
        flang = get_frame_language();
        if (flang!=language_unknown)
          set_language(flang);
+       expected_language = current_language;
        return;
       } else {
        /* Enter manual mode.  Set the specified language.  */
@@ -182,6 +227,7 @@ modula-2         Use the Modula-2 language\n");
        current_language = languages[i];
        set_type_range ();
        set_lang_str();
+       expected_language = current_language;
        return;
       }
     }
@@ -203,7 +249,7 @@ show_type_command(ignore, from_tty)
    int from_tty;
 {
    if (type_check != current_language->la_type_check)
-      printf(
+      printf_unfiltered(
 "Warning: the current type check setting does not match the language.\n");
 }
 
@@ -213,22 +259,22 @@ set_type_command(ignore, from_tty)
    char *ignore;
    int from_tty;
 {
-   if (!strcmp(type,"on"))
+   if (STREQ(type,"on"))
    {
       type_check = type_check_on;
       type_mode = type_mode_manual;
    }
-   else if (!strcmp(type,"warn"))
+   else if (STREQ(type,"warn"))
    {
       type_check = type_check_warn;
       type_mode = type_mode_manual;
    }
-   else if (!strcmp(type,"off"))
+   else if (STREQ(type,"off"))
    {
       type_check = type_check_off;
       type_mode = type_mode_manual;
    }
-   else if (!strcmp(type,"auto"))
+   else if (STREQ(type,"auto"))
    {
       type_mode = type_mode_auto;
       set_type_range();
@@ -249,7 +295,7 @@ show_range_command(ignore, from_tty)
 {
 
    if (range_check != current_language->la_range_check)
-      printf(
+      printf_unfiltered(
 "Warning: the current range check setting does not match the language.\n");
 }
 
@@ -259,22 +305,22 @@ set_range_command(ignore, from_tty)
    char *ignore;
    int from_tty;
 {
-   if (!strcmp(range,"on"))
+   if (STREQ(range,"on"))
    {
       range_check = range_check_on;
       range_mode = range_mode_manual;
    }
-   else if (!strcmp(range,"warn"))
+   else if (STREQ(range,"warn"))
    {
       range_check = range_check_warn;
       range_mode = range_mode_manual;
    }
-   else if (!strcmp(range,"off"))
+   else if (STREQ(range,"off"))
    {
       range_check = range_check_off;
       range_mode = range_mode_manual;
    }
-   else if (!strcmp(range,"auto"))
+   else if (STREQ(range,"auto"))
    {
       range_mode = range_mode_auto;
       set_type_range();
@@ -304,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) {
@@ -320,6 +369,8 @@ set_language(lang)
       break;
     }
   }
+
+  return prev_language;
 }
 \f
 /* This page contains functions that update the global vars
@@ -393,17 +444,25 @@ set_range_str()
 
 /* Print out the current language settings: language, range and
    type checking.  If QUIETLY, print only what has changed.  */
+
 void
 language_info (quietly)
      int quietly;
 {
-  /* FIXME:  quietly is ignored at the moment.  */
-   printf("Current Language:  %s\n",language);
-   show_language_command((char *)0, 1);
-   printf("Type checking:     %s\n",type);
-   show_type_command((char *)0, 1);
-   printf("Range checking:    %s\n",range);
-   show_range_command((char *)0, 1);
+  if (quietly && expected_language == current_language)
+    return;
+
+  expected_language = current_language;
+  printf_unfiltered("Current language:  %s\n",language);
+  show_language_command((char *)0, 1);
+
+  if (!quietly)
+    {
+       printf_unfiltered("Type checking:     %s\n",type);
+       show_type_command((char *)0, 1);
+       printf_unfiltered("Range checking:    %s\n",range);
+       show_range_command((char *)0, 1);
+    }
 }
 \f
 /* Return the result of a binary operation. */
@@ -411,27 +470,29 @@ language_info (quietly)
 #if 0  /* Currently unused */
 
 struct type *
-binop_result_type(v1,v2)
-   value v1,v2;
+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);
@@ -441,6 +502,8 @@ binop_result_type(v1,v2)
         not needed. */
       return l1 > l2 ? VALUE_TYPE(v1) : VALUE_TYPE(v2);
       break;
+   case language_chill:
+      error ("Missing Chill support in function binop_result_check.");/*FIXME*/
    }
    abort();
    return (struct type *)0;    /* For lint */
@@ -460,9 +523,11 @@ local_hex_format_custom(pre)
 {
    static char form[50];
 
-   strcpy (form, current_language->la_hex_format_pre);
+   strcpy (form, local_hex_format_prefix ());
+   strcat (form, "%");
    strcat (form, pre);
-   strcat (form, current_language->la_hex_format_suf);
+   strcat (form, local_hex_format_specifier ());
+   strcat (form, local_hex_format_suffix ());
    return form;
 }
 
@@ -470,11 +535,11 @@ local_hex_format_custom(pre)
    string.  Returns a pointer to this string. */
 char *
 local_hex_string (num)
-   int num;
+   unsigned long num;
 {
    static char res[50];
 
-   sprintf (res, current_language->la_hex_format, num);
+   sprintf (res, local_hex_format(), num);
    return res;
 }
 
@@ -482,7 +547,7 @@ local_hex_string (num)
    string.  Returns a pointer to this string. */
 char *
 local_hex_string_custom(num,pre)
-   int num;
+   unsigned long num;
    char *pre;
 {
    static char res[50];
@@ -499,12 +564,30 @@ local_octal_format_custom(pre)
 {
    static char form[50];
 
-   strcpy (form, current_language->la_octal_format_pre);
+   strcpy (form, local_octal_format_prefix ());
+   strcat (form, "%");
    strcat (form, pre);
-   strcat (form, current_language->la_octal_format_suf);
+   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(pre)
+   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;
 }
 \f
+#if 0
 /* This page contains functions that are used in type/range checking.
    They all return zero if the type/range check fails.
 
@@ -526,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:
@@ -540,11 +624,15 @@ simple_type(type)
   }
 }
 
-/* Returns non-zero if its argument is of an ordered type. */
+/* Returns non-zero if its argument is of an ordered type.
+   An ordered type is one in which the elements can be tested for the
+   properties of "greater than", "less than", etc, or for which the
+   operations "increment" or "decrement" make sense. */
 int
 ordered_type (type)
    struct type *type;
 {
+  CHECK_TYPEDEF (type);
   switch (TYPE_CODE (type)) {
   case TYPE_CODE_INT:
   case TYPE_CODE_CHAR:
@@ -563,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;
@@ -581,6 +670,7 @@ int
 integral_type (type)
    struct type *type;
 {
+  CHECK_TYPEDEF (type);
    switch(current_language->la_language)
    {
    case language_c:
@@ -589,6 +679,8 @@ integral_type (type)
         (TYPE_CODE(type) != TYPE_CODE_ENUM) ? 0 : 1;
    case language_m2:
       return TYPE_CODE(type) != TYPE_CODE_INT ? 0 : 1;
+   case language_chill:
+      error ("Missing Chill support in function integral_type.");  /*FIXME*/
    default:
       error ("Language not supported.");
    }
@@ -599,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:
@@ -614,8 +707,10 @@ 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:
       return TYPE_CODE(type) != TYPE_CODE_CHAR ? 0 : 1;
 
@@ -624,25 +719,52 @@ character_type (type)
       return (TYPE_CODE(type) == TYPE_CODE_INT) &&
         TYPE_LENGTH(type) == sizeof(char)
         ? 1 : 0;
+   default:
+      return (0);
    }
-   return (0);
 }
 
-/* Returns non-zero if the value is a boolean type */
+/* Returns non-zero if the value is a string type */
 int
-boolean_type (type)
+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:
-      return TYPE_CODE(type) != TYPE_CODE_BOOL ? 0 : 1;
+      return TYPE_CODE(type) != TYPE_CODE_STRING ? 0 : 1;
 
    case language_c:
    case language_cplus:
-      return TYPE_CODE(type) != TYPE_CODE_INT ? 0 : 1;
+      /* C does not have distinct string type. */
+      return (0);
+   default:
+      return (0);
+   }
+}
+
+/* Returns non-zero if the value is a boolean type */
+int
+boolean_type (type)
+   struct type *type;
+{
+  CHECK_TYPEDEF (type);
+  if (TYPE_CODE (type) == TYPE_CODE_BOOL)
+    return 1;
+  switch(current_language->la_language)
+    {
+    case language_c:
+    case language_cplus:
+      /* Might be more cleanly handled by having a TYPE_CODE_INT_NOT_BOOL
+        for CHILL and such languages, or a TYPE_CODE_INT_OR_BOOL for C.  */
+      if (TYPE_CODE (type) == TYPE_CODE_INT)
+       return 1;
+   default:
+      break;
    }
-   return (0);
+  return 0;
 }
 
 /* Returns non-zero if the value is a floating-point type */
@@ -650,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 */
@@ -667,6 +790,7 @@ int
 structured_type(type)
    struct type *type;
 {
+  CHECK_TYPEDEF (type);
    switch(current_language->la_language)
    {
    case language_c:
@@ -678,8 +802,44 @@ structured_type(type)
       return (TYPE_CODE(type) == TYPE_CODE_STRUCT) ||
         (TYPE_CODE(type) == TYPE_CODE_SET) ||
            (TYPE_CODE(type) == TYPE_CODE_ARRAY);
+   case language_chill:
+      error ("Missing Chill support in function structured_type.");  /*FIXME*/
+   default:
+      return (0);
    }
-   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
@@ -687,43 +847,16 @@ structured_type(type)
 
 /* Returns non-zero if the value VAL represents a true value. */
 int
-value_true(val)
-     value val;
+value_true (val)
+     value_ptr val;
 {
-  int len, i;
-  struct type *type;
-  LONGEST v;
-
-  switch (current_language->la_language) {
-
-  case language_c:
-  case language_cplus:
-    return !value_zerop (val);
-
-  case language_m2:
-    type = VALUE_TYPE(val);
-    if (TYPE_CODE (type) != TYPE_CODE_BOOL)
-      return 0;                /* Not a BOOLEAN at all */
-    /* Search the fields for one that matches the current value. */
-    len = TYPE_NFIELDS (type);
-    v = value_as_long (val);
-    for (i = 0; i < len; i++)
-      {
-       QUIT;
-       if (v == TYPE_FIELD_BITPOS (type, i))
-         break;
-      }
-    if (i >= len)
-      return 0;                /* Not a valid BOOLEAN value */
-    if (!strcmp ("TRUE", TYPE_FIELD_NAME(VALUE_TYPE(val), i)))
-      return 1;                /* BOOLEAN with value TRUE */
-    else
-      return 0;                /* BOOLEAN with value FALSE */
-    break;
-
-  default:
-    error ("Language not supported.");
-  }
+  /* 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
+     "boolean-checking" option like range checking.  But it should probably
+     not depend on the language except insofar as is necessary to identify
+     a "boolean" value (i.e. in C using a float, pointer, etc., as a boolean
+     should be an error, probably).  */
+  return !value_logical_not (val);
 }
 \f
 /* Returns non-zero if the operator OP is defined on
@@ -733,7 +866,7 @@ value_true(val)
 
 void
 binop_type_check(arg1,arg2,op)
-   value arg1,arg2;
+   value_ptr arg1,arg2;
    int op;
 {
    struct type *t1, *t2;
@@ -743,7 +876,7 @@ binop_type_check(arg1,arg2,op)
       return;
 
    t1=VALUE_TYPE(arg1);
-   if (arg2!=(value)NULL)
+   if (arg2 != NULL)
       t2=VALUE_TYPE(arg2);
    else
       t2=NULL;
@@ -755,7 +888,7 @@ binop_type_check(arg1,arg2,op)
       if ((numeric_type(t1) && pointer_type(t2)) ||
         (pointer_type(t1) && numeric_type(t2)))
       {
-        printf("warning:  combining pointer and integer.\n");
+        warning ("combining pointer and integer.\n");
         break;
       }
    case BINOP_MUL:
@@ -767,8 +900,8 @@ binop_type_check(arg1,arg2,op)
         type_op_error ("Arguments to %s must be of the same type.",op);
       break;
 
-   case BINOP_AND:
-   case BINOP_OR:
+   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;
@@ -780,7 +913,7 @@ binop_type_check(arg1,arg2,op)
       else if ((pointer_type(t1) && integral_type(t2)) ||
         (integral_type(t1) && pointer_type(t2)))
       {
-        printf("warning:  combining integer and pointer.\n");
+        warning ("combining integer and pointer.\n");
         break;
       }
       else if (!simple_type(t1) || !simple_type(t2))
@@ -790,6 +923,7 @@ binop_type_check(arg1,arg2,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;
@@ -809,7 +943,7 @@ binop_type_check(arg1,arg2,op)
         type_op_error ("A pointer can only be assigned an integer.",op);
       else if (pointer_type(t1) && integral_type(t2))
       {
-        printf("warning:  combining integer and pointer.");
+        warning ("combining integer and pointer.");
         break;
       }
       else if (!simple_type(t1) || !simple_type(t2))
@@ -818,9 +952,16 @@ binop_type_check(arg1,arg2,op)
         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_ZEROP:
+   case UNOP_LOGICAL_NOT:
       if (!boolean_type(t1))
         type_op_error ("Argument to %s must be of boolean type.",op);
       break;
@@ -834,7 +975,7 @@ binop_type_check(arg1,arg2,op)
    case UNOP_IND:
       if (integral_type(t1))
       {
-        printf("warning:  combining pointer and integer.\n");
+        warning ("combining pointer and integer.\n");
         break;
       }
       else if (!pointer_type(t1))
@@ -881,6 +1022,12 @@ binop_type_check(arg1,arg2,op)
            break;
         }
 #endif
+
+#ifdef _LANG_chill
+       case language_chill:
+        error ("Missing Chill support in function binop_type_check.");/*FIXME*/
+#endif
+
       }
    }
 }
@@ -906,9 +1053,7 @@ op_error (fmt,op,fatal)
       error (fmt,op_string(op));
    else
    {
-      printf("warning:  ");
-      printf(fmt,op_string(op));
-      printf("\n");
+      warning (fmt,op_string(op));
    }
 }
 
@@ -917,53 +1062,100 @@ op_error (fmt,op,fatal)
    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 "warning:  " and we do not return to the top level. */
+   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(stderr,"warning:  ");
+   if (type_check == type_check_warn)
+     fprintf_filtered (gdb_stderr, warning_pre_print);
    else
-      target_terminal_ours();
+     error_begin ();
 
-   va_start (args);
-   string = va_arg (args, char *);
-   vfprintf (stderr, string, args);
-   fprintf (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();
+   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(stderr,"warning:  ");
+   if (range_check == range_check_warn)
+     fprintf_filtered (gdb_stderr, warning_pre_print);
    else
-      target_terminal_ours();
+     error_begin ();
 
-   va_start (args);
-   string = va_arg (args, char *);
-   vfprintf (stderr, string, args);
-   fprintf (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();
+   if (range_check == range_check_on)
+     return_to_top_level (RETURN_ERROR);
 }
 
 \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 *
+language_def(lang)
+   enum language lang;
+{
+  int i;
+
+  for (i = 0; i < languages_size; i++) {
+    if (languages[i]->la_language == lang) {
+      return languages[i];
+    }
+  }
+  return NULL;
+}
+
 /* Return the language as a string */
 char *
 language_str(lang)
@@ -979,22 +1171,19 @@ language_str(lang)
   return "Unknown";
 }
 
-struct cmd_list_element *setchecklist = NULL;
-struct cmd_list_element *showchecklist = NULL;
-
 static void
 set_check (ignore, from_tty)
    char *ignore;
    int from_tty;
 {
-   printf(
+   printf_unfiltered(
 "\"set check\" must be followed by the name of a check subcommand.\n");
-   help_list(setchecklist, "set check ", -1, stdout);
+   help_list(setchecklist, "set check ", -1, gdb_stdout);
 }
 
 static void
-show_check (arg, from_tty)
-   char *arg;
+show_check (ignore, from_tty)
+   char *ignore;
    int from_tty;
 {
    cmd_show_list(showchecklist, from_tty, "");
@@ -1008,7 +1197,7 @@ add_language (lang)
 {
   if (lang->la_magic != LANG_MAGIC)
     {
-      fprintf(stderr, "Magic number of %s language struct wrong\n",
+      fprintf_unfiltered(gdb_stderr, "Magic number of %s language struct wrong\n",
        lang->la_name);
       abort();
     }
@@ -1043,8 +1232,83 @@ unk_lang_error (msg)
   error ("Attempted to parse an expression with unknown language");
 }
 
-static struct type ** const (unknown_builtin_types[]) = { 0 };
-static const struct op_print unk_op_print_tab[] = { 0 };
+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;
+     GDB_FILE *stream;
+{
+  error ("internal error - unimplemented function unk_lang_printchar called.");
+}
+
+static void
+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.");
+}
+
+static struct type *
+unk_lang_create_fundamental_type (objfile, typeid)
+     struct objfile *objfile;
+     int typeid;
+{
+  error ("internal error - unimplemented function unk_lang_create_fundamental_type called.");
+}
+
+static void
+unk_lang_print_type (type, varstring, stream, show, level)
+     struct type *type;
+     char *varstring;
+     GDB_FILE *stream;
+     int show;
+     int level;
+{
+  error ("internal error - unimplemented function unk_lang_print_type called.");
+}
+
+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;
+     int deref_ref;
+     int recurse;
+     enum val_prettyprint pretty;
+{
+  error ("internal error - unimplemented function unk_lang_val_print called.");
+}
+
+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}
+};
 
 const struct language_defn unknown_language_defn = {
   "unknown",
@@ -1054,12 +1318,22 @@ const struct language_defn unknown_language_defn = {
   type_check_off,
   unk_lang_parser,
   unk_lang_error,
-  &builtin_type_error,         /* longest signed   integral type */
-  &builtin_type_error,         /* longest unsigned integral type */
-  &builtin_type_error,         /* longest floating point type */
-  "0x%x", "0x%", "x",          /* Hex   format, prefix, suffix */
-  "0%o",  "0%",  "o",          /* Octal format, prefix, suffix */
+  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 */
+  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
 };
 
@@ -1072,12 +1346,22 @@ const struct language_defn auto_language_defn = {
   type_check_off,
   unk_lang_parser,
   unk_lang_error,
-  &builtin_type_error,         /* longest signed   integral type */
-  &builtin_type_error,         /* longest unsigned integral type */
-  &builtin_type_error,         /* longest floating point type */
-  "0x%x", "0x%", "x",          /* Hex   format, prefix, suffix */
-  "0%o",  "0%",  "o",          /* Octal format, prefix, suffix */
+  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 */
+  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
 };
 
@@ -1089,12 +1373,22 @@ const struct language_defn local_language_defn = {
   type_check_off,
   unk_lang_parser,
   unk_lang_error,
-  &builtin_type_error,         /* longest signed   integral type */
-  &builtin_type_error,         /* longest unsigned integral type */
-  &builtin_type_error,         /* longest floating point type */
-  "0x%x", "0x%", "x",          /* Hex   format, prefix, suffix */
-  "0%o",  "0%",  "o",          /* Octal format, prefix, suffix */
+  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 */
+  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.057444 seconds and 4 git commands to generate.