OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gdb-6.8/] [gdb/] [language.c] - Diff between revs 827 and 840

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 827 Rev 840
/* Multiple source language support for GDB.
/* Multiple source language support for GDB.
 
 
   Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
   Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
   2002, 2003, 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
   2002, 2003, 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
 
 
   Contributed by the Department of Computer Science at the State University
   Contributed by the Department of Computer Science at the State University
   of New York at Buffalo.
   of New York at Buffalo.
 
 
   This file is part of GDB.
   This file is part of GDB.
 
 
   This program is free software; you can redistribute it and/or modify
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.
   (at your option) any later version.
 
 
   This program is distributed in the hope that it will be useful,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   GNU General Public License for more details.
 
 
   You should have received a copy of the GNU General Public License
   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 
/* This file contains functions that return things that are specific
/* This file contains functions that return things that are specific
   to languages.  Each function should examine current_language if necessary,
   to languages.  Each function should examine current_language if necessary,
   and return the appropriate result. */
   and return the appropriate result. */
 
 
/* FIXME:  Most of these would be better organized as macros which
/* FIXME:  Most of these would be better organized as macros which
   return data out of a "language-specific" struct pointer that is set
   return data out of a "language-specific" struct pointer that is set
   whenever the working language changes.  That would be a lot faster.  */
   whenever the working language changes.  That would be a lot faster.  */
 
 
#include "defs.h"
#include "defs.h"
#include <ctype.h>
#include <ctype.h>
#include "gdb_string.h"
#include "gdb_string.h"
 
 
#include "symtab.h"
#include "symtab.h"
#include "gdbtypes.h"
#include "gdbtypes.h"
#include "value.h"
#include "value.h"
#include "gdbcmd.h"
#include "gdbcmd.h"
#include "expression.h"
#include "expression.h"
#include "language.h"
#include "language.h"
#include "target.h"
#include "target.h"
#include "parser-defs.h"
#include "parser-defs.h"
#include "jv-lang.h"
#include "jv-lang.h"
#include "demangle.h"
#include "demangle.h"
#include "symfile.h"
#include "symfile.h"
 
 
extern void _initialize_language (void);
extern void _initialize_language (void);
 
 
static void set_case_str (void);
static void set_case_str (void);
 
 
static void set_range_str (void);
static void set_range_str (void);
 
 
static void set_type_str (void);
static void set_type_str (void);
 
 
static void set_lang_str (void);
static void set_lang_str (void);
 
 
static void unk_lang_error (char *);
static void unk_lang_error (char *);
 
 
static int unk_lang_parser (void);
static int unk_lang_parser (void);
 
 
static void show_check (char *, int);
static void show_check (char *, int);
 
 
static void set_check (char *, int);
static void set_check (char *, int);
 
 
static void set_type_range_case (void);
static void set_type_range_case (void);
 
 
static void unk_lang_emit_char (int c, struct ui_file *stream, int quoter);
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_printchar (int c, struct ui_file *stream);
 
 
static void unk_lang_print_type (struct type *, char *, struct ui_file *,
static void unk_lang_print_type (struct type *, char *, struct ui_file *,
                                 int, int);
                                 int, int);
 
 
static int unk_lang_value_print (struct value *, struct ui_file *, 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 (struct frame_info *, CORE_ADDR pc);
static CORE_ADDR unk_lang_trampoline (struct frame_info *, CORE_ADDR pc);
 
 
/* Forward declaration */
/* Forward declaration */
extern const struct language_defn unknown_language_defn;
extern const struct language_defn unknown_language_defn;
 
 
/* The current (default at startup) state of type and range checking.
/* The current (default at startup) state of type and range checking.
   (If the modes are set to "auto", though, these are changed based
   (If the modes are set to "auto", though, these are changed based
   on the default language at startup, and then again based on the
   on the default language at startup, and then again based on the
   language of the first source file.  */
   language of the first source file.  */
 
 
enum range_mode range_mode = range_mode_auto;
enum range_mode range_mode = range_mode_auto;
enum range_check range_check = range_check_off;
enum range_check range_check = range_check_off;
enum type_mode type_mode = type_mode_auto;
enum type_mode type_mode = type_mode_auto;
enum type_check type_check = type_check_off;
enum type_check type_check = type_check_off;
enum case_mode case_mode = case_mode_auto;
enum case_mode case_mode = case_mode_auto;
enum case_sensitivity case_sensitivity = case_sensitive_on;
enum case_sensitivity case_sensitivity = case_sensitive_on;
 
 
/* The current language and language_mode (see language.h) */
/* The current language and language_mode (see language.h) */
 
 
const struct language_defn *current_language = &unknown_language_defn;
const struct language_defn *current_language = &unknown_language_defn;
enum language_mode language_mode = language_mode_auto;
enum language_mode language_mode = language_mode_auto;
 
 
/* The language that the user expects to be typing in (the language
/* The language that the user expects to be typing in (the language
   of main(), or the last language we notified them about, or C).  */
   of main(), or the last language we notified them about, or C).  */
 
 
const struct language_defn *expected_language;
const struct language_defn *expected_language;
 
 
/* The list of supported languages.  The list itself is malloc'd.  */
/* The list of supported languages.  The list itself is malloc'd.  */
 
 
static const struct language_defn **languages;
static const struct language_defn **languages;
static unsigned languages_size;
static unsigned languages_size;
static unsigned languages_allocsize;
static unsigned languages_allocsize;
#define DEFAULT_ALLOCSIZE 4
#define DEFAULT_ALLOCSIZE 4
 
 
/* The "set language/type/range" commands all put stuff in these
/* The "set language/type/range" commands all put stuff in these
   buffers.  This is to make them work as set/show commands.  The
   buffers.  This is to make them work as set/show commands.  The
   user's string is copied here, then the set_* commands look at
   user's string is copied here, then the set_* commands look at
   them and update them to something that looks nice when it is
   them and update them to something that looks nice when it is
   printed out. */
   printed out. */
 
 
static char *language;
static char *language;
static char *type;
static char *type;
static char *range;
static char *range;
static char *case_sensitive;
static char *case_sensitive;
 
 
/* Warning issued when current_language and the language of the current
/* Warning issued when current_language and the language of the current
   frame do not match. */
   frame do not match. */
char lang_frame_mismatch_warn[] =
char lang_frame_mismatch_warn[] =
"Warning: the current language does not match this frame.";
"Warning: the current language does not match this frame.";


/* This page contains the functions corresponding to GDB commands
/* This page contains the functions corresponding to GDB commands
   and their helpers. */
   and their helpers. */
 
 
/* Show command.  Display a warning if the language set
/* Show command.  Display a warning if the language set
   does not match the frame. */
   does not match the frame. */
static void
static void
show_language_command (struct ui_file *file, int from_tty,
show_language_command (struct ui_file *file, int from_tty,
                       struct cmd_list_element *c, const char *value)
                       struct cmd_list_element *c, const char *value)
{
{
  enum language flang;          /* The language of the current frame */
  enum language flang;          /* The language of the current frame */
 
 
  deprecated_show_value_hack (file, from_tty, c, value);
  deprecated_show_value_hack (file, from_tty, c, value);
  flang = get_frame_language ();
  flang = get_frame_language ();
  if (flang != language_unknown &&
  if (flang != language_unknown &&
      language_mode == language_mode_manual &&
      language_mode == language_mode_manual &&
      current_language->la_language != flang)
      current_language->la_language != flang)
    printf_filtered ("%s\n", lang_frame_mismatch_warn);
    printf_filtered ("%s\n", lang_frame_mismatch_warn);
}
}
 
 
/* Set command.  Change the current working language. */
/* Set command.  Change the current working language. */
static void
static void
set_language_command (char *ignore, int from_tty, struct cmd_list_element *c)
set_language_command (char *ignore, int from_tty, struct cmd_list_element *c)
{
{
  int i;
  int i;
  enum language flang;
  enum language flang;
  char *err_lang;
  char *err_lang;
 
 
  if (!language || !language[0])
  if (!language || !language[0])
    {
    {
      printf_unfiltered (_("\
      printf_unfiltered (_("\
The currently understood settings are:\n\n\
The currently understood settings are:\n\n\
local or auto    Automatic setting based on source file\n"));
local or auto    Automatic setting based on source file\n"));
 
 
      for (i = 0; i < languages_size; ++i)
      for (i = 0; i < languages_size; ++i)
        {
        {
          /* Already dealt with these above.  */
          /* Already dealt with these above.  */
          if (languages[i]->la_language == language_unknown
          if (languages[i]->la_language == language_unknown
              || languages[i]->la_language == language_auto)
              || languages[i]->la_language == language_auto)
            continue;
            continue;
 
 
          /* FIXME: i18n: for now assume that the human-readable name
          /* FIXME: i18n: for now assume that the human-readable name
             is just a capitalization of the internal name.  */
             is just a capitalization of the internal name.  */
          printf_unfiltered ("%-16s Use the %c%s language\n",
          printf_unfiltered ("%-16s Use the %c%s language\n",
                             languages[i]->la_name,
                             languages[i]->la_name,
          /* Capitalize first letter of language
          /* Capitalize first letter of language
             name.  */
             name.  */
                             toupper (languages[i]->la_name[0]),
                             toupper (languages[i]->la_name[0]),
                             languages[i]->la_name + 1);
                             languages[i]->la_name + 1);
        }
        }
      /* Restore the silly string. */
      /* Restore the silly string. */
      set_language (current_language->la_language);
      set_language (current_language->la_language);
      return;
      return;
    }
    }
 
 
  /* Search the list of languages for a match.  */
  /* Search the list of languages for a match.  */
  for (i = 0; i < languages_size; i++)
  for (i = 0; i < languages_size; i++)
    {
    {
      if (strcmp (languages[i]->la_name, language) == 0)
      if (strcmp (languages[i]->la_name, language) == 0)
        {
        {
          /* Found it!  Go into manual mode, and use this language.  */
          /* Found it!  Go into manual mode, and use this language.  */
          if (languages[i]->la_language == language_auto)
          if (languages[i]->la_language == language_auto)
            {
            {
              /* Enter auto mode.  Set to the current frame's language, if
              /* Enter auto mode.  Set to the current frame's language, if
                 known, or fallback to the initial language.  */
                 known, or fallback to the initial language.  */
              language_mode = language_mode_auto;
              language_mode = language_mode_auto;
              flang = get_frame_language ();
              flang = get_frame_language ();
              if (flang != language_unknown)
              if (flang != language_unknown)
                set_language (flang);
                set_language (flang);
              else
              else
                set_initial_language ();
                set_initial_language ();
              expected_language = current_language;
              expected_language = current_language;
              return;
              return;
            }
            }
          else
          else
            {
            {
              /* Enter manual mode.  Set the specified language.  */
              /* Enter manual mode.  Set the specified language.  */
              language_mode = language_mode_manual;
              language_mode = language_mode_manual;
              current_language = languages[i];
              current_language = languages[i];
              set_type_range_case ();
              set_type_range_case ();
              set_lang_str ();
              set_lang_str ();
              expected_language = current_language;
              expected_language = current_language;
              return;
              return;
            }
            }
        }
        }
    }
    }
 
 
  /* Reset the language (esp. the global string "language") to the
  /* Reset the language (esp. the global string "language") to the
     correct values. */
     correct values. */
  err_lang = savestring (language, strlen (language));
  err_lang = savestring (language, strlen (language));
  make_cleanup (xfree, err_lang);       /* Free it after error */
  make_cleanup (xfree, err_lang);       /* Free it after error */
  set_language (current_language->la_language);
  set_language (current_language->la_language);
  error (_("Unknown language `%s'."), err_lang);
  error (_("Unknown language `%s'."), err_lang);
}
}
 
 
/* Show command.  Display a warning if the type setting does
/* Show command.  Display a warning if the type setting does
   not match the current language. */
   not match the current language. */
static void
static void
show_type_command (struct ui_file *file, int from_tty,
show_type_command (struct ui_file *file, int from_tty,
                   struct cmd_list_element *c, const char *value)
                   struct cmd_list_element *c, const char *value)
{
{
  deprecated_show_value_hack (file, from_tty, c, value);
  deprecated_show_value_hack (file, from_tty, c, value);
  if (type_check != current_language->la_type_check)
  if (type_check != current_language->la_type_check)
    printf_unfiltered (
    printf_unfiltered (
                        "Warning: the current type check setting does not match the language.\n");
                        "Warning: the current type check setting does not match the language.\n");
}
}
 
 
/* Set command.  Change the setting for type checking. */
/* Set command.  Change the setting for type checking. */
static void
static void
set_type_command (char *ignore, int from_tty, struct cmd_list_element *c)
set_type_command (char *ignore, int from_tty, struct cmd_list_element *c)
{
{
  if (strcmp (type, "on") == 0)
  if (strcmp (type, "on") == 0)
    {
    {
      type_check = type_check_on;
      type_check = type_check_on;
      type_mode = type_mode_manual;
      type_mode = type_mode_manual;
    }
    }
  else if (strcmp (type, "warn") == 0)
  else if (strcmp (type, "warn") == 0)
    {
    {
      type_check = type_check_warn;
      type_check = type_check_warn;
      type_mode = type_mode_manual;
      type_mode = type_mode_manual;
    }
    }
  else if (strcmp (type, "off") == 0)
  else if (strcmp (type, "off") == 0)
    {
    {
      type_check = type_check_off;
      type_check = type_check_off;
      type_mode = type_mode_manual;
      type_mode = type_mode_manual;
    }
    }
  else if (strcmp (type, "auto") == 0)
  else if (strcmp (type, "auto") == 0)
    {
    {
      type_mode = type_mode_auto;
      type_mode = type_mode_auto;
      set_type_range_case ();
      set_type_range_case ();
      /* Avoid hitting the set_type_str call below.  We
      /* Avoid hitting the set_type_str call below.  We
         did it in set_type_range_case. */
         did it in set_type_range_case. */
      return;
      return;
    }
    }
  else
  else
    {
    {
      warning (_("Unrecognized type check setting: \"%s\""), type);
      warning (_("Unrecognized type check setting: \"%s\""), type);
    }
    }
  set_type_str ();
  set_type_str ();
  show_type_command (NULL, from_tty, NULL, NULL);
  show_type_command (NULL, from_tty, NULL, NULL);
}
}
 
 
/* Show command.  Display a warning if the range setting does
/* Show command.  Display a warning if the range setting does
   not match the current language. */
   not match the current language. */
static void
static void
show_range_command (struct ui_file *file, int from_tty,
show_range_command (struct ui_file *file, int from_tty,
                    struct cmd_list_element *c, const char *value)
                    struct cmd_list_element *c, const char *value)
{
{
  deprecated_show_value_hack (file, from_tty, c, value);
  deprecated_show_value_hack (file, from_tty, c, value);
  if (range_check != current_language->la_range_check)
  if (range_check != current_language->la_range_check)
    printf_unfiltered (
    printf_unfiltered (
                        "Warning: the current range check setting does not match the language.\n");
                        "Warning: the current range check setting does not match the language.\n");
}
}
 
 
/* Set command.  Change the setting for range checking. */
/* Set command.  Change the setting for range checking. */
static void
static void
set_range_command (char *ignore, int from_tty, struct cmd_list_element *c)
set_range_command (char *ignore, int from_tty, struct cmd_list_element *c)
{
{
  if (strcmp (range, "on") == 0)
  if (strcmp (range, "on") == 0)
    {
    {
      range_check = range_check_on;
      range_check = range_check_on;
      range_mode = range_mode_manual;
      range_mode = range_mode_manual;
    }
    }
  else if (strcmp (range, "warn") == 0)
  else if (strcmp (range, "warn") == 0)
    {
    {
      range_check = range_check_warn;
      range_check = range_check_warn;
      range_mode = range_mode_manual;
      range_mode = range_mode_manual;
    }
    }
  else if (strcmp (range, "off") == 0)
  else if (strcmp (range, "off") == 0)
    {
    {
      range_check = range_check_off;
      range_check = range_check_off;
      range_mode = range_mode_manual;
      range_mode = range_mode_manual;
    }
    }
  else if (strcmp (range, "auto") == 0)
  else if (strcmp (range, "auto") == 0)
    {
    {
      range_mode = range_mode_auto;
      range_mode = range_mode_auto;
      set_type_range_case ();
      set_type_range_case ();
      /* Avoid hitting the set_range_str call below.  We
      /* Avoid hitting the set_range_str call below.  We
         did it in set_type_range_case. */
         did it in set_type_range_case. */
      return;
      return;
    }
    }
  else
  else
    {
    {
      warning (_("Unrecognized range check setting: \"%s\""), range);
      warning (_("Unrecognized range check setting: \"%s\""), range);
    }
    }
  set_range_str ();
  set_range_str ();
  show_range_command (NULL, from_tty, NULL, NULL);
  show_range_command (NULL, from_tty, NULL, NULL);
}
}
 
 
/* Show command.  Display a warning if the case sensitivity setting does
/* Show command.  Display a warning if the case sensitivity setting does
   not match the current language. */
   not match the current language. */
static void
static void
show_case_command (struct ui_file *file, int from_tty,
show_case_command (struct ui_file *file, int from_tty,
                   struct cmd_list_element *c, const char *value)
                   struct cmd_list_element *c, const char *value)
{
{
  deprecated_show_value_hack (file, from_tty, c, value);
  deprecated_show_value_hack (file, from_tty, c, value);
  if (case_sensitivity != current_language->la_case_sensitivity)
  if (case_sensitivity != current_language->la_case_sensitivity)
    printf_unfiltered(
    printf_unfiltered(
"Warning: the current case sensitivity setting does not match the language.\n");
"Warning: the current case sensitivity setting does not match the language.\n");
}
}
 
 
/* Set command.  Change the setting for case sensitivity.  */
/* Set command.  Change the setting for case sensitivity.  */
 
 
static void
static void
set_case_command (char *ignore, int from_tty, struct cmd_list_element *c)
set_case_command (char *ignore, int from_tty, struct cmd_list_element *c)
{
{
   if (strcmp (case_sensitive, "on") == 0)
   if (strcmp (case_sensitive, "on") == 0)
     {
     {
       case_sensitivity = case_sensitive_on;
       case_sensitivity = case_sensitive_on;
       case_mode = case_mode_manual;
       case_mode = case_mode_manual;
     }
     }
   else if (strcmp (case_sensitive, "off") == 0)
   else if (strcmp (case_sensitive, "off") == 0)
     {
     {
       case_sensitivity = case_sensitive_off;
       case_sensitivity = case_sensitive_off;
       case_mode = case_mode_manual;
       case_mode = case_mode_manual;
     }
     }
   else if (strcmp (case_sensitive, "auto") == 0)
   else if (strcmp (case_sensitive, "auto") == 0)
     {
     {
       case_mode = case_mode_auto;
       case_mode = case_mode_auto;
       set_type_range_case ();
       set_type_range_case ();
       /* Avoid hitting the set_case_str call below.  We did it in
       /* Avoid hitting the set_case_str call below.  We did it in
          set_type_range_case.  */
          set_type_range_case.  */
       return;
       return;
     }
     }
   else
   else
     {
     {
       warning (_("Unrecognized case-sensitive setting: \"%s\""),
       warning (_("Unrecognized case-sensitive setting: \"%s\""),
                case_sensitive);
                case_sensitive);
     }
     }
   set_case_str();
   set_case_str();
   show_case_command (NULL, from_tty, NULL, NULL);
   show_case_command (NULL, from_tty, NULL, NULL);
}
}
 
 
/* Set the status of range and type checking and case sensitivity based on
/* Set the status of range and type checking and case sensitivity based on
   the current modes and the current language.
   the current modes and the current language.
   If SHOW is non-zero, then print out the current language,
   If SHOW is non-zero, then print out the current language,
   type and range checking status. */
   type and range checking status. */
static void
static void
set_type_range_case (void)
set_type_range_case (void)
{
{
 
 
  if (range_mode == range_mode_auto)
  if (range_mode == range_mode_auto)
    range_check = current_language->la_range_check;
    range_check = current_language->la_range_check;
 
 
  if (type_mode == type_mode_auto)
  if (type_mode == type_mode_auto)
    type_check = current_language->la_type_check;
    type_check = current_language->la_type_check;
 
 
  if (case_mode == case_mode_auto)
  if (case_mode == case_mode_auto)
    case_sensitivity = current_language->la_case_sensitivity;
    case_sensitivity = current_language->la_case_sensitivity;
 
 
  set_type_str ();
  set_type_str ();
  set_range_str ();
  set_range_str ();
  set_case_str ();
  set_case_str ();
}
}
 
 
/* Set current language to (enum language) LANG.  Returns previous language. */
/* Set current language to (enum language) LANG.  Returns previous language. */
 
 
enum language
enum language
set_language (enum language lang)
set_language (enum language lang)
{
{
  int i;
  int i;
  enum language prev_language;
  enum language prev_language;
 
 
  prev_language = current_language->la_language;
  prev_language = current_language->la_language;
 
 
  for (i = 0; i < languages_size; i++)
  for (i = 0; i < languages_size; i++)
    {
    {
      if (languages[i]->la_language == lang)
      if (languages[i]->la_language == lang)
        {
        {
          current_language = languages[i];
          current_language = languages[i];
          set_type_range_case ();
          set_type_range_case ();
          set_lang_str ();
          set_lang_str ();
          break;
          break;
        }
        }
    }
    }
 
 
  return prev_language;
  return prev_language;
}
}


/* This page contains functions that update the global vars
/* This page contains functions that update the global vars
   language, type and range. */
   language, type and range. */
static void
static void
set_lang_str (void)
set_lang_str (void)
{
{
  char *prefix = "";
  char *prefix = "";
 
 
  if (language)
  if (language)
    xfree (language);
    xfree (language);
  if (language_mode == language_mode_auto)
  if (language_mode == language_mode_auto)
    prefix = "auto; currently ";
    prefix = "auto; currently ";
 
 
  language = concat (prefix, current_language->la_name, (char *)NULL);
  language = concat (prefix, current_language->la_name, (char *)NULL);
}
}
 
 
static void
static void
set_type_str (void)
set_type_str (void)
{
{
  char *tmp = NULL, *prefix = "";
  char *tmp = NULL, *prefix = "";
 
 
  if (type)
  if (type)
    xfree (type);
    xfree (type);
  if (type_mode == type_mode_auto)
  if (type_mode == type_mode_auto)
    prefix = "auto; currently ";
    prefix = "auto; currently ";
 
 
  switch (type_check)
  switch (type_check)
    {
    {
    case type_check_on:
    case type_check_on:
      tmp = "on";
      tmp = "on";
      break;
      break;
    case type_check_off:
    case type_check_off:
      tmp = "off";
      tmp = "off";
      break;
      break;
    case type_check_warn:
    case type_check_warn:
      tmp = "warn";
      tmp = "warn";
      break;
      break;
    default:
    default:
      error (_("Unrecognized type check setting."));
      error (_("Unrecognized type check setting."));
    }
    }
 
 
  type = concat (prefix, tmp, (char *)NULL);
  type = concat (prefix, tmp, (char *)NULL);
}
}
 
 
static void
static void
set_range_str (void)
set_range_str (void)
{
{
  char *tmp, *pref = "";
  char *tmp, *pref = "";
 
 
  if (range_mode == range_mode_auto)
  if (range_mode == range_mode_auto)
    pref = "auto; currently ";
    pref = "auto; currently ";
 
 
  switch (range_check)
  switch (range_check)
    {
    {
    case range_check_on:
    case range_check_on:
      tmp = "on";
      tmp = "on";
      break;
      break;
    case range_check_off:
    case range_check_off:
      tmp = "off";
      tmp = "off";
      break;
      break;
    case range_check_warn:
    case range_check_warn:
      tmp = "warn";
      tmp = "warn";
      break;
      break;
    default:
    default:
      error (_("Unrecognized range check setting."));
      error (_("Unrecognized range check setting."));
    }
    }
 
 
  if (range)
  if (range)
    xfree (range);
    xfree (range);
  range = concat (pref, tmp, (char *)NULL);
  range = concat (pref, tmp, (char *)NULL);
}
}
 
 
static void
static void
set_case_str (void)
set_case_str (void)
{
{
   char *tmp = NULL, *prefix = "";
   char *tmp = NULL, *prefix = "";
 
 
   if (case_mode==case_mode_auto)
   if (case_mode==case_mode_auto)
      prefix = "auto; currently ";
      prefix = "auto; currently ";
 
 
   switch (case_sensitivity)
   switch (case_sensitivity)
   {
   {
   case case_sensitive_on:
   case case_sensitive_on:
     tmp = "on";
     tmp = "on";
     break;
     break;
   case case_sensitive_off:
   case case_sensitive_off:
     tmp = "off";
     tmp = "off";
     break;
     break;
   default:
   default:
     error (_("Unrecognized case-sensitive setting."));
     error (_("Unrecognized case-sensitive setting."));
   }
   }
 
 
   xfree (case_sensitive);
   xfree (case_sensitive);
   case_sensitive = concat (prefix, tmp, (char *)NULL);
   case_sensitive = concat (prefix, tmp, (char *)NULL);
}
}
 
 
/* Print out the current language settings: language, range and
/* Print out the current language settings: language, range and
   type checking.  If QUIETLY, print only what has changed.  */
   type checking.  If QUIETLY, print only what has changed.  */
 
 
void
void
language_info (int quietly)
language_info (int quietly)
{
{
  if (quietly && expected_language == current_language)
  if (quietly && expected_language == current_language)
    return;
    return;
 
 
  expected_language = current_language;
  expected_language = current_language;
  printf_unfiltered (_("Current language:  %s\n"), language);
  printf_unfiltered (_("Current language:  %s\n"), language);
  show_language_command (NULL, 1, NULL, NULL);
  show_language_command (NULL, 1, NULL, NULL);
 
 
  if (!quietly)
  if (!quietly)
    {
    {
      printf_unfiltered (_("Type checking:     %s\n"), type);
      printf_unfiltered (_("Type checking:     %s\n"), type);
      show_type_command (NULL, 1, NULL, NULL);
      show_type_command (NULL, 1, NULL, NULL);
      printf_unfiltered (_("Range checking:    %s\n"), range);
      printf_unfiltered (_("Range checking:    %s\n"), range);
      show_range_command (NULL, 1, NULL, NULL);
      show_range_command (NULL, 1, NULL, NULL);
      printf_unfiltered (_("Case sensitivity:  %s\n"), case_sensitive);
      printf_unfiltered (_("Case sensitivity:  %s\n"), case_sensitive);
      show_case_command (NULL, 1, NULL, NULL);
      show_case_command (NULL, 1, NULL, NULL);
    }
    }
}
}


/* Return the result of a binary operation. */
/* Return the result of a binary operation. */
 
 
#if 0                           /* Currently unused */
#if 0                           /* Currently unused */
 
 
struct type *
struct type *
binop_result_type (struct value *v1, struct value *v2)
binop_result_type (struct value *v1, struct value *v2)
{
{
  int size, uns;
  int size, uns;
  struct type *t1 = check_typedef (VALUE_TYPE (v1));
  struct type *t1 = check_typedef (VALUE_TYPE (v1));
  struct type *t2 = check_typedef (VALUE_TYPE (v2));
  struct type *t2 = check_typedef (VALUE_TYPE (v2));
 
 
  int l1 = TYPE_LENGTH (t1);
  int l1 = TYPE_LENGTH (t1);
  int l2 = TYPE_LENGTH (t2);
  int l2 = TYPE_LENGTH (t2);
 
 
  switch (current_language->la_language)
  switch (current_language->la_language)
    {
    {
    case language_c:
    case language_c:
    case language_cplus:
    case language_cplus:
    case language_objc:
    case language_objc:
      if (TYPE_CODE (t1) == TYPE_CODE_FLT)
      if (TYPE_CODE (t1) == TYPE_CODE_FLT)
        return TYPE_CODE (t2) == TYPE_CODE_FLT && l2 > l1 ?
        return TYPE_CODE (t2) == TYPE_CODE_FLT && l2 > l1 ?
          VALUE_TYPE (v2) : VALUE_TYPE (v1);
          VALUE_TYPE (v2) : VALUE_TYPE (v1);
      else if (TYPE_CODE (t2) == TYPE_CODE_FLT)
      else if (TYPE_CODE (t2) == TYPE_CODE_FLT)
        return TYPE_CODE (t1) == TYPE_CODE_FLT && l1 > l2 ?
        return TYPE_CODE (t1) == TYPE_CODE_FLT && l1 > l2 ?
          VALUE_TYPE (v1) : VALUE_TYPE (v2);
          VALUE_TYPE (v1) : VALUE_TYPE (v2);
      else if (TYPE_UNSIGNED (t1) && l1 > l2)
      else if (TYPE_UNSIGNED (t1) && l1 > l2)
        return VALUE_TYPE (v1);
        return VALUE_TYPE (v1);
      else if (TYPE_UNSIGNED (t2) && l2 > l1)
      else if (TYPE_UNSIGNED (t2) && l2 > l1)
        return VALUE_TYPE (v2);
        return VALUE_TYPE (v2);
      else                      /* Both are signed.  Result is the longer type */
      else                      /* Both are signed.  Result is the longer type */
        return l1 > l2 ? VALUE_TYPE (v1) : VALUE_TYPE (v2);
        return l1 > l2 ? VALUE_TYPE (v1) : VALUE_TYPE (v2);
      break;
      break;
    case language_m2:
    case language_m2:
      /* If we are doing type-checking, l1 should equal l2, so this is
      /* If we are doing type-checking, l1 should equal l2, so this is
         not needed. */
         not needed. */
      return l1 > l2 ? VALUE_TYPE (v1) : VALUE_TYPE (v2);
      return l1 > l2 ? VALUE_TYPE (v1) : VALUE_TYPE (v2);
      break;
      break;
    }
    }
  internal_error (__FILE__, __LINE__, _("failed internal consistency check"));
  internal_error (__FILE__, __LINE__, _("failed internal consistency check"));
  return (struct type *) 0;      /* For lint */
  return (struct type *) 0;      /* For lint */
}
}
 
 
#endif /* 0 */
#endif /* 0 */
#if 0
#if 0
/* This page contains functions that are used in type/range checking.
/* This page contains functions that are used in type/range checking.
   They all return zero if the type/range check fails.
   They all return zero if the type/range check fails.
 
 
   It is hoped that these will make extending GDB to parse different
   It is hoped that these will make extending GDB to parse different
   languages a little easier.  These are primarily used in eval.c when
   languages a little easier.  These are primarily used in eval.c when
   evaluating expressions and making sure that their types are correct.
   evaluating expressions and making sure that their types are correct.
   Instead of having a mess of conjucted/disjuncted expressions in an "if",
   Instead of having a mess of conjucted/disjuncted expressions in an "if",
   the ideas of type can be wrapped up in the following functions.
   the ideas of type can be wrapped up in the following functions.
 
 
   Note that some of them are not currently dependent upon which language
   Note that some of them are not currently dependent upon which language
   is currently being parsed.  For example, floats are the same in
   is currently being parsed.  For example, floats are the same in
   C and Modula-2 (ie. the only floating point type has TYPE_CODE of
   C and Modula-2 (ie. the only floating point type has TYPE_CODE of
   TYPE_CODE_FLT), while booleans are different. */
   TYPE_CODE_FLT), while booleans are different. */
 
 
/* Returns non-zero if its argument is a simple type.  This is the same for
/* Returns non-zero if its argument is a simple type.  This is the same for
   both Modula-2 and for C.  In the C case, TYPE_CODE_CHAR will never occur,
   both Modula-2 and for C.  In the C case, TYPE_CODE_CHAR will never occur,
   and thus will never cause the failure of the test. */
   and thus will never cause the failure of the test. */
int
int
simple_type (struct type *type)
simple_type (struct type *type)
{
{
  CHECK_TYPEDEF (type);
  CHECK_TYPEDEF (type);
  switch (TYPE_CODE (type))
  switch (TYPE_CODE (type))
    {
    {
    case TYPE_CODE_INT:
    case TYPE_CODE_INT:
    case TYPE_CODE_CHAR:
    case TYPE_CODE_CHAR:
    case TYPE_CODE_ENUM:
    case TYPE_CODE_ENUM:
    case TYPE_CODE_FLT:
    case TYPE_CODE_FLT:
    case TYPE_CODE_RANGE:
    case TYPE_CODE_RANGE:
    case TYPE_CODE_BOOL:
    case TYPE_CODE_BOOL:
      return 1;
      return 1;
 
 
    default:
    default:
      return 0;
      return 0;
    }
    }
}
}
 
 
/* 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
   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
   properties of "greater than", "less than", etc, or for which the
   operations "increment" or "decrement" make sense. */
   operations "increment" or "decrement" make sense. */
int
int
ordered_type (struct type *type)
ordered_type (struct type *type)
{
{
  CHECK_TYPEDEF (type);
  CHECK_TYPEDEF (type);
  switch (TYPE_CODE (type))
  switch (TYPE_CODE (type))
    {
    {
    case TYPE_CODE_INT:
    case TYPE_CODE_INT:
    case TYPE_CODE_CHAR:
    case TYPE_CODE_CHAR:
    case TYPE_CODE_ENUM:
    case TYPE_CODE_ENUM:
    case TYPE_CODE_FLT:
    case TYPE_CODE_FLT:
    case TYPE_CODE_RANGE:
    case TYPE_CODE_RANGE:
      return 1;
      return 1;
 
 
    default:
    default:
      return 0;
      return 0;
    }
    }
}
}
 
 
/* Returns non-zero if the two types are the same */
/* Returns non-zero if the two types are the same */
int
int
same_type (struct type *arg1, struct type *arg2)
same_type (struct type *arg1, struct type *arg2)
{
{
  CHECK_TYPEDEF (type);
  CHECK_TYPEDEF (type);
  if (structured_type (arg1) ? !structured_type (arg2) : structured_type (arg2))
  if (structured_type (arg1) ? !structured_type (arg2) : structured_type (arg2))
    /* One is structured and one isn't */
    /* One is structured and one isn't */
    return 0;
    return 0;
  else if (structured_type (arg1) && structured_type (arg2))
  else if (structured_type (arg1) && structured_type (arg2))
    return arg1 == arg2;
    return arg1 == arg2;
  else if (numeric_type (arg1) && numeric_type (arg2))
  else if (numeric_type (arg1) && numeric_type (arg2))
    return (TYPE_CODE (arg2) == TYPE_CODE (arg1)) &&
    return (TYPE_CODE (arg2) == TYPE_CODE (arg1)) &&
      (TYPE_UNSIGNED (arg1) == TYPE_UNSIGNED (arg2))
      (TYPE_UNSIGNED (arg1) == TYPE_UNSIGNED (arg2))
      ? 1 : 0;
      ? 1 : 0;
  else
  else
    return arg1 == arg2;
    return arg1 == arg2;
}
}
 
 
/* Returns non-zero if the type is integral */
/* Returns non-zero if the type is integral */
int
int
integral_type (struct type *type)
integral_type (struct type *type)
{
{
  CHECK_TYPEDEF (type);
  CHECK_TYPEDEF (type);
  switch (current_language->la_language)
  switch (current_language->la_language)
    {
    {
    case language_c:
    case language_c:
    case language_cplus:
    case language_cplus:
    case language_objc:
    case language_objc:
      return (TYPE_CODE (type) != TYPE_CODE_INT) &&
      return (TYPE_CODE (type) != TYPE_CODE_INT) &&
        (TYPE_CODE (type) != TYPE_CODE_ENUM) ? 0 : 1;
        (TYPE_CODE (type) != TYPE_CODE_ENUM) ? 0 : 1;
    case language_m2:
    case language_m2:
    case language_pascal:
    case language_pascal:
      return TYPE_CODE (type) != TYPE_CODE_INT ? 0 : 1;
      return TYPE_CODE (type) != TYPE_CODE_INT ? 0 : 1;
    default:
    default:
      error (_("Language not supported."));
      error (_("Language not supported."));
    }
    }
}
}
 
 
/* Returns non-zero if the value is numeric */
/* Returns non-zero if the value is numeric */
int
int
numeric_type (struct type *type)
numeric_type (struct type *type)
{
{
  CHECK_TYPEDEF (type);
  CHECK_TYPEDEF (type);
  switch (TYPE_CODE (type))
  switch (TYPE_CODE (type))
    {
    {
    case TYPE_CODE_INT:
    case TYPE_CODE_INT:
    case TYPE_CODE_FLT:
    case TYPE_CODE_FLT:
      return 1;
      return 1;
 
 
    default:
    default:
      return 0;
      return 0;
    }
    }
}
}
 
 
/* Returns non-zero if the value is a character type */
/* Returns non-zero if the value is a character type */
int
int
character_type (struct type *type)
character_type (struct type *type)
{
{
  CHECK_TYPEDEF (type);
  CHECK_TYPEDEF (type);
  switch (current_language->la_language)
  switch (current_language->la_language)
    {
    {
    case language_m2:
    case language_m2:
    case language_pascal:
    case language_pascal:
      return TYPE_CODE (type) != TYPE_CODE_CHAR ? 0 : 1;
      return TYPE_CODE (type) != TYPE_CODE_CHAR ? 0 : 1;
 
 
    case language_c:
    case language_c:
    case language_cplus:
    case language_cplus:
    case language_objc:
    case language_objc:
      return (TYPE_CODE (type) == TYPE_CODE_INT) &&
      return (TYPE_CODE (type) == TYPE_CODE_INT) &&
        TYPE_LENGTH (type) == sizeof (char)
        TYPE_LENGTH (type) == sizeof (char)
      ? 1 : 0;
      ? 1 : 0;
    default:
    default:
      return (0);
      return (0);
    }
    }
}
}
 
 
/* Returns non-zero if the value is a string type */
/* Returns non-zero if the value is a string type */
int
int
string_type (struct type *type)
string_type (struct type *type)
{
{
  CHECK_TYPEDEF (type);
  CHECK_TYPEDEF (type);
  switch (current_language->la_language)
  switch (current_language->la_language)
    {
    {
    case language_m2:
    case language_m2:
    case language_pascal:
    case language_pascal:
      return TYPE_CODE (type) != TYPE_CODE_STRING ? 0 : 1;
      return TYPE_CODE (type) != TYPE_CODE_STRING ? 0 : 1;
 
 
    case language_c:
    case language_c:
    case language_cplus:
    case language_cplus:
    case language_objc:
    case language_objc:
      /* C does not have distinct string type. */
      /* C does not have distinct string type. */
      return (0);
      return (0);
    default:
    default:
      return (0);
      return (0);
    }
    }
}
}
 
 
/* Returns non-zero if the value is a boolean type */
/* Returns non-zero if the value is a boolean type */
int
int
boolean_type (struct type *type)
boolean_type (struct type *type)
{
{
  CHECK_TYPEDEF (type);
  CHECK_TYPEDEF (type);
  if (TYPE_CODE (type) == TYPE_CODE_BOOL)
  if (TYPE_CODE (type) == TYPE_CODE_BOOL)
    return 1;
    return 1;
  switch (current_language->la_language)
  switch (current_language->la_language)
    {
    {
    case language_c:
    case language_c:
    case language_cplus:
    case language_cplus:
    case language_objc:
    case language_objc:
      /* Might be more cleanly handled by having a
      /* Might be more cleanly handled by having a
         TYPE_CODE_INT_NOT_BOOL for (the deleted) CHILL and such
         TYPE_CODE_INT_NOT_BOOL for (the deleted) CHILL and such
         languages, or a TYPE_CODE_INT_OR_BOOL for C.  */
         languages, or a TYPE_CODE_INT_OR_BOOL for C.  */
      if (TYPE_CODE (type) == TYPE_CODE_INT)
      if (TYPE_CODE (type) == TYPE_CODE_INT)
        return 1;
        return 1;
    default:
    default:
      break;
      break;
    }
    }
  return 0;
  return 0;
}
}
 
 
/* Returns non-zero if the value is a floating-point type */
/* Returns non-zero if the value is a floating-point type */
int
int
float_type (struct type *type)
float_type (struct type *type)
{
{
  CHECK_TYPEDEF (type);
  CHECK_TYPEDEF (type);
  return TYPE_CODE (type) == TYPE_CODE_FLT;
  return TYPE_CODE (type) == TYPE_CODE_FLT;
}
}
 
 
/* Returns non-zero if the value is a pointer type */
/* Returns non-zero if the value is a pointer type */
int
int
pointer_type (struct type *type)
pointer_type (struct type *type)
{
{
  return TYPE_CODE (type) == TYPE_CODE_PTR ||
  return TYPE_CODE (type) == TYPE_CODE_PTR ||
    TYPE_CODE (type) == TYPE_CODE_REF;
    TYPE_CODE (type) == TYPE_CODE_REF;
}
}
 
 
/* Returns non-zero if the value is a structured type */
/* Returns non-zero if the value is a structured type */
int
int
structured_type (struct type *type)
structured_type (struct type *type)
{
{
  CHECK_TYPEDEF (type);
  CHECK_TYPEDEF (type);
  switch (current_language->la_language)
  switch (current_language->la_language)
    {
    {
    case language_c:
    case language_c:
    case language_cplus:
    case language_cplus:
    case language_objc:
    case language_objc:
      return (TYPE_CODE (type) == TYPE_CODE_STRUCT) ||
      return (TYPE_CODE (type) == TYPE_CODE_STRUCT) ||
        (TYPE_CODE (type) == TYPE_CODE_UNION) ||
        (TYPE_CODE (type) == TYPE_CODE_UNION) ||
        (TYPE_CODE (type) == TYPE_CODE_ARRAY);
        (TYPE_CODE (type) == TYPE_CODE_ARRAY);
   case language_pascal:
   case language_pascal:
      return (TYPE_CODE(type) == TYPE_CODE_STRUCT) ||
      return (TYPE_CODE(type) == TYPE_CODE_STRUCT) ||
         (TYPE_CODE(type) == TYPE_CODE_UNION) ||
         (TYPE_CODE(type) == TYPE_CODE_UNION) ||
         (TYPE_CODE(type) == TYPE_CODE_SET) ||
         (TYPE_CODE(type) == TYPE_CODE_SET) ||
            (TYPE_CODE(type) == TYPE_CODE_ARRAY);
            (TYPE_CODE(type) == TYPE_CODE_ARRAY);
    case language_m2:
    case language_m2:
      return (TYPE_CODE (type) == TYPE_CODE_STRUCT) ||
      return (TYPE_CODE (type) == TYPE_CODE_STRUCT) ||
        (TYPE_CODE (type) == TYPE_CODE_SET) ||
        (TYPE_CODE (type) == TYPE_CODE_SET) ||
        (TYPE_CODE (type) == TYPE_CODE_ARRAY);
        (TYPE_CODE (type) == TYPE_CODE_ARRAY);
    default:
    default:
      return (0);
      return (0);
    }
    }
}
}
#endif
#endif


struct type *
struct type *
lang_bool_type (void)
lang_bool_type (void)
{
{
  struct symbol *sym;
  struct symbol *sym;
  struct type *type;
  struct type *type;
  switch (current_language->la_language)
  switch (current_language->la_language)
    {
    {
    case language_fortran:
    case language_fortran:
      sym = lookup_symbol ("logical", NULL, VAR_DOMAIN, NULL, NULL);
      sym = lookup_symbol ("logical", NULL, VAR_DOMAIN, NULL, NULL);
      if (sym)
      if (sym)
        {
        {
          type = SYMBOL_TYPE (sym);
          type = SYMBOL_TYPE (sym);
          if (type && TYPE_CODE (type) == TYPE_CODE_BOOL)
          if (type && TYPE_CODE (type) == TYPE_CODE_BOOL)
            return type;
            return type;
        }
        }
      return builtin_type_f_logical_s2;
      return builtin_type_f_logical_s2;
    case language_cplus:
    case language_cplus:
    case language_pascal:
    case language_pascal:
    case language_ada:
    case language_ada:
      if (current_language->la_language==language_cplus)
      if (current_language->la_language==language_cplus)
        {sym = lookup_symbol ("bool", NULL, VAR_DOMAIN, NULL, NULL);}
        {sym = lookup_symbol ("bool", NULL, VAR_DOMAIN, NULL, NULL);}
      else
      else
        {sym = lookup_symbol ("boolean", NULL, VAR_DOMAIN, NULL, NULL);}
        {sym = lookup_symbol ("boolean", NULL, VAR_DOMAIN, NULL, NULL);}
      if (sym)
      if (sym)
        {
        {
          type = SYMBOL_TYPE (sym);
          type = SYMBOL_TYPE (sym);
          if (type && TYPE_CODE (type) == TYPE_CODE_BOOL)
          if (type && TYPE_CODE (type) == TYPE_CODE_BOOL)
            return type;
            return type;
        }
        }
      return builtin_type_bool;
      return builtin_type_bool;
    case language_java:
    case language_java:
      sym = lookup_symbol ("boolean", NULL, VAR_DOMAIN, NULL, NULL);
      sym = lookup_symbol ("boolean", NULL, VAR_DOMAIN, NULL, NULL);
      if (sym)
      if (sym)
        {
        {
          type = SYMBOL_TYPE (sym);
          type = SYMBOL_TYPE (sym);
          if (type && TYPE_CODE (type) == TYPE_CODE_BOOL)
          if (type && TYPE_CODE (type) == TYPE_CODE_BOOL)
            return type;
            return type;
        }
        }
      return java_boolean_type;
      return java_boolean_type;
 
 
    default:
    default:
      return builtin_type_int;
      return builtin_type_int;
    }
    }
}
}


/* This page contains functions that return info about
/* This page contains functions that return info about
   (struct value) values used in GDB. */
   (struct value) values used in GDB. */
 
 
/* Returns non-zero if the value VAL represents a true value. */
/* Returns non-zero if the value VAL represents a true value. */
int
int
value_true (struct value *val)
value_true (struct value *val)
{
{
  /* It is possible that we should have some sort of error if a non-boolean
  /* 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
     value is used in this context.  Possibly dependent on some kind of
     "boolean-checking" option like range checking.  But it should probably
     "boolean-checking" option like range checking.  But it should probably
     not depend on the language except insofar as is necessary to identify
     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
     a "boolean" value (i.e. in C using a float, pointer, etc., as a boolean
     should be an error, probably).  */
     should be an error, probably).  */
  return !value_logical_not (val);
  return !value_logical_not (val);
}
}


/* This page contains functions for the printing out of
/* This page contains functions for the printing out of
   error messages that occur during type- and range-
   error messages that occur during type- and range-
   checking. */
   checking. */
 
 
/* These are called when a language fails a type- or range-check.  The
/* These are called when a language fails a type- or range-check.  The
   first argument should be a printf()-style format string, and the
   first argument should be a printf()-style format string, and the
   rest of the arguments should be its arguments.  If
   rest of the arguments should be its arguments.  If
   [type|range]_check is [type|range]_check_on, an error is printed;
   [type|range]_check is [type|range]_check_on, an error is printed;
   if [type|range]_check_warn, a warning; otherwise just the
   if [type|range]_check_warn, a warning; otherwise just the
   message. */
   message. */
 
 
void
void
type_error (const char *string,...)
type_error (const char *string,...)
{
{
  va_list args;
  va_list args;
  va_start (args, string);
  va_start (args, string);
 
 
  switch (type_check)
  switch (type_check)
    {
    {
    case type_check_warn:
    case type_check_warn:
      vwarning (string, args);
      vwarning (string, args);
      break;
      break;
    case type_check_on:
    case type_check_on:
      verror (string, args);
      verror (string, args);
      break;
      break;
    case type_check_off:
    case type_check_off:
      /* FIXME: cagney/2002-01-30: Should this function print anything
      /* FIXME: cagney/2002-01-30: Should this function print anything
         when type error is off?  */
         when type error is off?  */
      vfprintf_filtered (gdb_stderr, string, args);
      vfprintf_filtered (gdb_stderr, string, args);
      fprintf_filtered (gdb_stderr, "\n");
      fprintf_filtered (gdb_stderr, "\n");
      break;
      break;
    default:
    default:
      internal_error (__FILE__, __LINE__, _("bad switch"));
      internal_error (__FILE__, __LINE__, _("bad switch"));
    }
    }
  va_end (args);
  va_end (args);
}
}
 
 
void
void
range_error (const char *string,...)
range_error (const char *string,...)
{
{
  va_list args;
  va_list args;
  va_start (args, string);
  va_start (args, string);
 
 
  switch (range_check)
  switch (range_check)
    {
    {
    case range_check_warn:
    case range_check_warn:
      vwarning (string, args);
      vwarning (string, args);
      break;
      break;
    case range_check_on:
    case range_check_on:
      verror (string, args);
      verror (string, args);
      break;
      break;
    case range_check_off:
    case range_check_off:
      /* FIXME: cagney/2002-01-30: Should this function print anything
      /* FIXME: cagney/2002-01-30: Should this function print anything
         when range error is off?  */
         when range error is off?  */
      vfprintf_filtered (gdb_stderr, string, args);
      vfprintf_filtered (gdb_stderr, string, args);
      fprintf_filtered (gdb_stderr, "\n");
      fprintf_filtered (gdb_stderr, "\n");
      break;
      break;
    default:
    default:
      internal_error (__FILE__, __LINE__, _("bad switch"));
      internal_error (__FILE__, __LINE__, _("bad switch"));
    }
    }
  va_end (args);
  va_end (args);
}
}


 
 
/* This page contains miscellaneous functions */
/* This page contains miscellaneous functions */
 
 
/* Return the language enum for a given language string. */
/* Return the language enum for a given language string. */
 
 
enum language
enum language
language_enum (char *str)
language_enum (char *str)
{
{
  int i;
  int i;
 
 
  for (i = 0; i < languages_size; i++)
  for (i = 0; i < languages_size; i++)
    if (strcmp (languages[i]->la_name, str) == 0)
    if (strcmp (languages[i]->la_name, str) == 0)
      return languages[i]->la_language;
      return languages[i]->la_language;
 
 
  return language_unknown;
  return language_unknown;
}
}
 
 
/* Return the language struct for a given language enum. */
/* Return the language struct for a given language enum. */
 
 
const struct language_defn *
const struct language_defn *
language_def (enum language lang)
language_def (enum language lang)
{
{
  int i;
  int i;
 
 
  for (i = 0; i < languages_size; i++)
  for (i = 0; i < languages_size; i++)
    {
    {
      if (languages[i]->la_language == lang)
      if (languages[i]->la_language == lang)
        {
        {
          return languages[i];
          return languages[i];
        }
        }
    }
    }
  return NULL;
  return NULL;
}
}
 
 
/* Return the language as a string */
/* Return the language as a string */
char *
char *
language_str (enum language lang)
language_str (enum language lang)
{
{
  int i;
  int i;
 
 
  for (i = 0; i < languages_size; i++)
  for (i = 0; i < languages_size; i++)
    {
    {
      if (languages[i]->la_language == lang)
      if (languages[i]->la_language == lang)
        {
        {
          return languages[i]->la_name;
          return languages[i]->la_name;
        }
        }
    }
    }
  return "Unknown";
  return "Unknown";
}
}
 
 
static void
static void
set_check (char *ignore, int from_tty)
set_check (char *ignore, int from_tty)
{
{
  printf_unfiltered (
  printf_unfiltered (
     "\"set check\" must be followed by the name of a check subcommand.\n");
     "\"set check\" must be followed by the name of a check subcommand.\n");
  help_list (setchecklist, "set check ", -1, gdb_stdout);
  help_list (setchecklist, "set check ", -1, gdb_stdout);
}
}
 
 
static void
static void
show_check (char *ignore, int from_tty)
show_check (char *ignore, int from_tty)
{
{
  cmd_show_list (showchecklist, from_tty, "");
  cmd_show_list (showchecklist, from_tty, "");
}
}


/* Add a language to the set of known languages.  */
/* Add a language to the set of known languages.  */
 
 
void
void
add_language (const struct language_defn *lang)
add_language (const struct language_defn *lang)
{
{
  if (lang->la_magic != LANG_MAGIC)
  if (lang->la_magic != LANG_MAGIC)
    {
    {
      fprintf_unfiltered (gdb_stderr, "Magic number of %s language struct wrong\n",
      fprintf_unfiltered (gdb_stderr, "Magic number of %s language struct wrong\n",
                          lang->la_name);
                          lang->la_name);
      internal_error (__FILE__, __LINE__, _("failed internal consistency check"));
      internal_error (__FILE__, __LINE__, _("failed internal consistency check"));
    }
    }
 
 
  if (!languages)
  if (!languages)
    {
    {
      languages_allocsize = DEFAULT_ALLOCSIZE;
      languages_allocsize = DEFAULT_ALLOCSIZE;
      languages = (const struct language_defn **) xmalloc
      languages = (const struct language_defn **) xmalloc
        (languages_allocsize * sizeof (*languages));
        (languages_allocsize * sizeof (*languages));
    }
    }
  if (languages_size >= languages_allocsize)
  if (languages_size >= languages_allocsize)
    {
    {
      languages_allocsize *= 2;
      languages_allocsize *= 2;
      languages = (const struct language_defn **) xrealloc ((char *) languages,
      languages = (const struct language_defn **) xrealloc ((char *) languages,
                                 languages_allocsize * sizeof (*languages));
                                 languages_allocsize * sizeof (*languages));
    }
    }
  languages[languages_size++] = lang;
  languages[languages_size++] = lang;
}
}
 
 
/* Iterate through all registered languages looking for and calling
/* Iterate through all registered languages looking for and calling
   any non-NULL struct language_defn.skip_trampoline() functions.
   any non-NULL struct language_defn.skip_trampoline() functions.
   Return the result from the first that returns non-zero, or 0 if all
   Return the result from the first that returns non-zero, or 0 if all
   `fail'.  */
   `fail'.  */
CORE_ADDR
CORE_ADDR
skip_language_trampoline (struct frame_info *frame, CORE_ADDR pc)
skip_language_trampoline (struct frame_info *frame, CORE_ADDR pc)
{
{
  int i;
  int i;
 
 
  for (i = 0; i < languages_size; i++)
  for (i = 0; i < languages_size; i++)
    {
    {
      if (languages[i]->skip_trampoline)
      if (languages[i]->skip_trampoline)
        {
        {
          CORE_ADDR real_pc = (languages[i]->skip_trampoline) (frame, pc);
          CORE_ADDR real_pc = (languages[i]->skip_trampoline) (frame, pc);
          if (real_pc)
          if (real_pc)
            return real_pc;
            return real_pc;
        }
        }
    }
    }
 
 
  return 0;
  return 0;
}
}
 
 
/* Return demangled language symbol, or NULL.
/* Return demangled language symbol, or NULL.
   FIXME: Options are only useful for certain languages and ignored
   FIXME: Options are only useful for certain languages and ignored
   by others, so it would be better to remove them here and have a
   by others, so it would be better to remove them here and have a
   more flexible demangler for the languages that need it.
   more flexible demangler for the languages that need it.
   FIXME: Sometimes the demangler is invoked when we don't know the
   FIXME: Sometimes the demangler is invoked when we don't know the
   language, so we can't use this everywhere.  */
   language, so we can't use this everywhere.  */
char *
char *
language_demangle (const struct language_defn *current_language,
language_demangle (const struct language_defn *current_language,
                                const char *mangled, int options)
                                const char *mangled, int options)
{
{
  if (current_language != NULL && current_language->la_demangle)
  if (current_language != NULL && current_language->la_demangle)
    return current_language->la_demangle (mangled, options);
    return current_language->la_demangle (mangled, options);
  return NULL;
  return NULL;
}
}
 
 
/* Return class name from physname or NULL.  */
/* Return class name from physname or NULL.  */
char *
char *
language_class_name_from_physname (const struct language_defn *current_language,
language_class_name_from_physname (const struct language_defn *current_language,
                                   const char *physname)
                                   const char *physname)
{
{
  if (current_language != NULL && current_language->la_class_name_from_physname)
  if (current_language != NULL && current_language->la_class_name_from_physname)
    return current_language->la_class_name_from_physname (physname);
    return current_language->la_class_name_from_physname (physname);
  return NULL;
  return NULL;
}
}
 
 
/* Return non-zero if TYPE should be passed (and returned) by
/* Return non-zero if TYPE should be passed (and returned) by
   reference at the language level.  */
   reference at the language level.  */
int
int
language_pass_by_reference (struct type *type)
language_pass_by_reference (struct type *type)
{
{
  return current_language->la_pass_by_reference (type);
  return current_language->la_pass_by_reference (type);
}
}
 
 
/* Return zero; by default, types are passed by value at the language
/* Return zero; by default, types are passed by value at the language
   level.  The target ABI may pass or return some structs by reference
   level.  The target ABI may pass or return some structs by reference
   independent of this.  */
   independent of this.  */
int
int
default_pass_by_reference (struct type *type)
default_pass_by_reference (struct type *type)
{
{
  return 0;
  return 0;
}
}
 
 
/* Return the default string containing the list of characters
/* Return the default string containing the list of characters
   delimiting words.  This is a reasonable default value that
   delimiting words.  This is a reasonable default value that
   most languages should be able to use.  */
   most languages should be able to use.  */
 
 
char *
char *
default_word_break_characters (void)
default_word_break_characters (void)
{
{
  return " \t\n!@#$%^&*()+=|~`}{[]\"';:?/>.<,-";
  return " \t\n!@#$%^&*()+=|~`}{[]\"';:?/>.<,-";
}
}
 
 
/* Print the index of array elements using the C99 syntax.  */
/* Print the index of array elements using the C99 syntax.  */
 
 
void
void
default_print_array_index (struct value *index_value, struct ui_file *stream,
default_print_array_index (struct value *index_value, struct ui_file *stream,
                           int format, enum val_prettyprint pretty)
                           int format, enum val_prettyprint pretty)
{
{
  fprintf_filtered (stream, "[");
  fprintf_filtered (stream, "[");
  LA_VALUE_PRINT (index_value, stream, format, pretty);
  LA_VALUE_PRINT (index_value, stream, format, pretty);
  fprintf_filtered (stream, "] = ");
  fprintf_filtered (stream, "] = ");
}
}
 
 
/* Define the language that is no language.  */
/* Define the language that is no language.  */
 
 
static int
static int
unk_lang_parser (void)
unk_lang_parser (void)
{
{
  return 1;
  return 1;
}
}
 
 
static void
static void
unk_lang_error (char *msg)
unk_lang_error (char *msg)
{
{
  error (_("Attempted to parse an expression with unknown language"));
  error (_("Attempted to parse an expression with unknown language"));
}
}
 
 
static void
static void
unk_lang_emit_char (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."));
  error (_("internal error - unimplemented function unk_lang_emit_char called."));
}
}
 
 
static void
static void
unk_lang_printchar (int c, struct ui_file *stream)
unk_lang_printchar (int c, struct ui_file *stream)
{
{
  error (_("internal error - unimplemented function unk_lang_printchar called."));
  error (_("internal error - unimplemented function unk_lang_printchar called."));
}
}
 
 
static void
static void
unk_lang_printstr (struct ui_file *stream, const gdb_byte *string,
unk_lang_printstr (struct ui_file *stream, const gdb_byte *string,
                   unsigned int length, int width, int force_ellipses)
                   unsigned int length, int width, int force_ellipses)
{
{
  error (_("internal error - unimplemented function unk_lang_printstr called."));
  error (_("internal error - unimplemented function unk_lang_printstr called."));
}
}
 
 
static void
static void
unk_lang_print_type (struct type *type, char *varstring, struct ui_file *stream,
unk_lang_print_type (struct type *type, char *varstring, struct ui_file *stream,
                     int show, int level)
                     int show, int level)
{
{
  error (_("internal error - unimplemented function unk_lang_print_type called."));
  error (_("internal error - unimplemented function unk_lang_print_type called."));
}
}
 
 
static int
static int
unk_lang_val_print (struct type *type, const gdb_byte *valaddr,
unk_lang_val_print (struct type *type, const gdb_byte *valaddr,
                    int embedded_offset, CORE_ADDR address,
                    int embedded_offset, CORE_ADDR address,
                    struct ui_file *stream, int format,
                    struct ui_file *stream, int format,
                    int deref_ref, int recurse, enum val_prettyprint pretty)
                    int deref_ref, int recurse, enum val_prettyprint pretty)
{
{
  error (_("internal error - unimplemented function unk_lang_val_print called."));
  error (_("internal error - unimplemented function unk_lang_val_print called."));
}
}
 
 
static int
static int
unk_lang_value_print (struct value *val, struct ui_file *stream, int format,
unk_lang_value_print (struct value *val, struct ui_file *stream, int format,
                      enum val_prettyprint pretty)
                      enum val_prettyprint pretty)
{
{
  error (_("internal error - unimplemented function unk_lang_value_print called."));
  error (_("internal error - unimplemented function unk_lang_value_print called."));
}
}
 
 
static CORE_ADDR unk_lang_trampoline (struct frame_info *frame, CORE_ADDR pc)
static CORE_ADDR unk_lang_trampoline (struct frame_info *frame, CORE_ADDR pc)
{
{
  return 0;
  return 0;
}
}
 
 
/* Unknown languages just use the cplus demangler.  */
/* Unknown languages just use the cplus demangler.  */
static char *unk_lang_demangle (const char *mangled, int options)
static char *unk_lang_demangle (const char *mangled, int options)
{
{
  return cplus_demangle (mangled, options);
  return cplus_demangle (mangled, options);
}
}
 
 
static char *unk_lang_class_name (const char *mangled)
static char *unk_lang_class_name (const char *mangled)
{
{
  return NULL;
  return NULL;
}
}
 
 
static const struct op_print unk_op_print_tab[] =
static const struct op_print unk_op_print_tab[] =
{
{
  {NULL, OP_NULL, PREC_NULL, 0}
  {NULL, OP_NULL, PREC_NULL, 0}
};
};
 
 
static void
static void
unknown_language_arch_info (struct gdbarch *gdbarch,
unknown_language_arch_info (struct gdbarch *gdbarch,
                            struct language_arch_info *lai)
                            struct language_arch_info *lai)
{
{
  lai->string_char_type = builtin_type (gdbarch)->builtin_char;
  lai->string_char_type = builtin_type (gdbarch)->builtin_char;
  lai->primitive_type_vector = GDBARCH_OBSTACK_CALLOC (gdbarch, 1,
  lai->primitive_type_vector = GDBARCH_OBSTACK_CALLOC (gdbarch, 1,
                                                       struct type *);
                                                       struct type *);
}
}
 
 
const struct language_defn unknown_language_defn =
const struct language_defn unknown_language_defn =
{
{
  "unknown",
  "unknown",
  language_unknown,
  language_unknown,
  range_check_off,
  range_check_off,
  type_check_off,
  type_check_off,
  array_row_major,
  array_row_major,
  case_sensitive_on,
  case_sensitive_on,
  &exp_descriptor_standard,
  &exp_descriptor_standard,
  unk_lang_parser,
  unk_lang_parser,
  unk_lang_error,
  unk_lang_error,
  null_post_parser,
  null_post_parser,
  unk_lang_printchar,           /* Print character constant */
  unk_lang_printchar,           /* Print character constant */
  unk_lang_printstr,
  unk_lang_printstr,
  unk_lang_emit_char,
  unk_lang_emit_char,
  unk_lang_print_type,          /* Print a type using appropriate syntax */
  unk_lang_print_type,          /* Print a type using appropriate syntax */
  unk_lang_val_print,           /* Print a value using appropriate syntax */
  unk_lang_val_print,           /* Print a value using appropriate syntax */
  unk_lang_value_print,         /* Print a top-level value */
  unk_lang_value_print,         /* Print a top-level value */
  unk_lang_trampoline,          /* Language specific skip_trampoline */
  unk_lang_trampoline,          /* Language specific skip_trampoline */
  value_of_this,                /* value_of_this */
  value_of_this,                /* value_of_this */
  basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
  basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
  basic_lookup_transparent_type,/* lookup_transparent_type */
  basic_lookup_transparent_type,/* lookup_transparent_type */
  unk_lang_demangle,            /* Language specific symbol demangler */
  unk_lang_demangle,            /* Language specific symbol demangler */
  unk_lang_class_name,          /* Language specific class_name_from_physname */
  unk_lang_class_name,          /* Language specific class_name_from_physname */
  unk_op_print_tab,             /* expression operators for printing */
  unk_op_print_tab,             /* expression operators for printing */
  1,                            /* c-style arrays */
  1,                            /* c-style arrays */
  0,                             /* String lower bound */
  0,                             /* String lower bound */
  default_word_break_characters,
  default_word_break_characters,
  default_make_symbol_completion_list,
  default_make_symbol_completion_list,
  unknown_language_arch_info,   /* la_language_arch_info.  */
  unknown_language_arch_info,   /* la_language_arch_info.  */
  default_print_array_index,
  default_print_array_index,
  default_pass_by_reference,
  default_pass_by_reference,
  LANG_MAGIC
  LANG_MAGIC
};
};
 
 
/* These two structs define fake entries for the "local" and "auto" options. */
/* These two structs define fake entries for the "local" and "auto" options. */
const struct language_defn auto_language_defn =
const struct language_defn auto_language_defn =
{
{
  "auto",
  "auto",
  language_auto,
  language_auto,
  range_check_off,
  range_check_off,
  type_check_off,
  type_check_off,
  array_row_major,
  array_row_major,
  case_sensitive_on,
  case_sensitive_on,
  &exp_descriptor_standard,
  &exp_descriptor_standard,
  unk_lang_parser,
  unk_lang_parser,
  unk_lang_error,
  unk_lang_error,
  null_post_parser,
  null_post_parser,
  unk_lang_printchar,           /* Print character constant */
  unk_lang_printchar,           /* Print character constant */
  unk_lang_printstr,
  unk_lang_printstr,
  unk_lang_emit_char,
  unk_lang_emit_char,
  unk_lang_print_type,          /* Print a type using appropriate syntax */
  unk_lang_print_type,          /* Print a type using appropriate syntax */
  unk_lang_val_print,           /* Print a value using appropriate syntax */
  unk_lang_val_print,           /* Print a value using appropriate syntax */
  unk_lang_value_print,         /* Print a top-level value */
  unk_lang_value_print,         /* Print a top-level value */
  unk_lang_trampoline,          /* Language specific skip_trampoline */
  unk_lang_trampoline,          /* Language specific skip_trampoline */
  value_of_this,                /* value_of_this */
  value_of_this,                /* value_of_this */
  basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
  basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
  basic_lookup_transparent_type,/* lookup_transparent_type */
  basic_lookup_transparent_type,/* lookup_transparent_type */
  unk_lang_demangle,            /* Language specific symbol demangler */
  unk_lang_demangle,            /* Language specific symbol demangler */
  unk_lang_class_name,          /* Language specific class_name_from_physname */
  unk_lang_class_name,          /* Language specific class_name_from_physname */
  unk_op_print_tab,             /* expression operators for printing */
  unk_op_print_tab,             /* expression operators for printing */
  1,                            /* c-style arrays */
  1,                            /* c-style arrays */
  0,                             /* String lower bound */
  0,                             /* String lower bound */
  default_word_break_characters,
  default_word_break_characters,
  default_make_symbol_completion_list,
  default_make_symbol_completion_list,
  unknown_language_arch_info,   /* la_language_arch_info.  */
  unknown_language_arch_info,   /* la_language_arch_info.  */
  default_print_array_index,
  default_print_array_index,
  default_pass_by_reference,
  default_pass_by_reference,
  LANG_MAGIC
  LANG_MAGIC
};
};
 
 
const struct language_defn local_language_defn =
const struct language_defn local_language_defn =
{
{
  "local",
  "local",
  language_auto,
  language_auto,
  range_check_off,
  range_check_off,
  type_check_off,
  type_check_off,
  case_sensitive_on,
  case_sensitive_on,
  array_row_major,
  array_row_major,
  &exp_descriptor_standard,
  &exp_descriptor_standard,
  unk_lang_parser,
  unk_lang_parser,
  unk_lang_error,
  unk_lang_error,
  null_post_parser,
  null_post_parser,
  unk_lang_printchar,           /* Print character constant */
  unk_lang_printchar,           /* Print character constant */
  unk_lang_printstr,
  unk_lang_printstr,
  unk_lang_emit_char,
  unk_lang_emit_char,
  unk_lang_print_type,          /* Print a type using appropriate syntax */
  unk_lang_print_type,          /* Print a type using appropriate syntax */
  unk_lang_val_print,           /* Print a value using appropriate syntax */
  unk_lang_val_print,           /* Print a value using appropriate syntax */
  unk_lang_value_print,         /* Print a top-level value */
  unk_lang_value_print,         /* Print a top-level value */
  unk_lang_trampoline,          /* Language specific skip_trampoline */
  unk_lang_trampoline,          /* Language specific skip_trampoline */
  value_of_this,                /* value_of_this */
  value_of_this,                /* value_of_this */
  basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
  basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
  basic_lookup_transparent_type,/* lookup_transparent_type */
  basic_lookup_transparent_type,/* lookup_transparent_type */
  unk_lang_demangle,            /* Language specific symbol demangler */
  unk_lang_demangle,            /* Language specific symbol demangler */
  unk_lang_class_name,          /* Language specific class_name_from_physname */
  unk_lang_class_name,          /* Language specific class_name_from_physname */
  unk_op_print_tab,             /* expression operators for printing */
  unk_op_print_tab,             /* expression operators for printing */
  1,                            /* c-style arrays */
  1,                            /* c-style arrays */
  0,                             /* String lower bound */
  0,                             /* String lower bound */
  default_word_break_characters,
  default_word_break_characters,
  default_make_symbol_completion_list,
  default_make_symbol_completion_list,
  unknown_language_arch_info,   /* la_language_arch_info.  */
  unknown_language_arch_info,   /* la_language_arch_info.  */
  default_print_array_index,
  default_print_array_index,
  default_pass_by_reference,
  default_pass_by_reference,
  LANG_MAGIC
  LANG_MAGIC
};
};


/* Per-architecture language information.  */
/* Per-architecture language information.  */
 
 
static struct gdbarch_data *language_gdbarch_data;
static struct gdbarch_data *language_gdbarch_data;
 
 
struct language_gdbarch
struct language_gdbarch
{
{
  /* A vector of per-language per-architecture info.  Indexed by "enum
  /* A vector of per-language per-architecture info.  Indexed by "enum
     language".  */
     language".  */
  struct language_arch_info arch_info[nr_languages];
  struct language_arch_info arch_info[nr_languages];
};
};
 
 
static void *
static void *
language_gdbarch_post_init (struct gdbarch *gdbarch)
language_gdbarch_post_init (struct gdbarch *gdbarch)
{
{
  struct language_gdbarch *l;
  struct language_gdbarch *l;
  int i;
  int i;
 
 
  l = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct language_gdbarch);
  l = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct language_gdbarch);
  for (i = 0; i < languages_size; i++)
  for (i = 0; i < languages_size; i++)
    {
    {
      if (languages[i] != NULL
      if (languages[i] != NULL
          && languages[i]->la_language_arch_info != NULL)
          && languages[i]->la_language_arch_info != NULL)
        languages[i]->la_language_arch_info
        languages[i]->la_language_arch_info
          (gdbarch, l->arch_info + languages[i]->la_language);
          (gdbarch, l->arch_info + languages[i]->la_language);
    }
    }
  return l;
  return l;
}
}
 
 
struct type *
struct type *
language_string_char_type (const struct language_defn *la,
language_string_char_type (const struct language_defn *la,
                           struct gdbarch *gdbarch)
                           struct gdbarch *gdbarch)
{
{
  struct language_gdbarch *ld = gdbarch_data (gdbarch,
  struct language_gdbarch *ld = gdbarch_data (gdbarch,
                                              language_gdbarch_data);
                                              language_gdbarch_data);
  return ld->arch_info[la->la_language].string_char_type;
  return ld->arch_info[la->la_language].string_char_type;
}
}
 
 
struct type *
struct type *
language_lookup_primitive_type_by_name (const struct language_defn *la,
language_lookup_primitive_type_by_name (const struct language_defn *la,
                                        struct gdbarch *gdbarch,
                                        struct gdbarch *gdbarch,
                                        const char *name)
                                        const char *name)
{
{
  struct language_gdbarch *ld = gdbarch_data (gdbarch,
  struct language_gdbarch *ld = gdbarch_data (gdbarch,
                                              language_gdbarch_data);
                                              language_gdbarch_data);
  struct type *const *p;
  struct type *const *p;
  for (p = ld->arch_info[la->la_language].primitive_type_vector;
  for (p = ld->arch_info[la->la_language].primitive_type_vector;
       (*p) != NULL;
       (*p) != NULL;
       p++)
       p++)
    {
    {
      if (strcmp (TYPE_NAME (*p), name) == 0)
      if (strcmp (TYPE_NAME (*p), name) == 0)
        return (*p);
        return (*p);
    }
    }
  return (NULL);
  return (NULL);
}
}
 
 
/* Initialize the language routines */
/* Initialize the language routines */
 
 
void
void
_initialize_language (void)
_initialize_language (void)
{
{
  struct cmd_list_element *set, *show;
  struct cmd_list_element *set, *show;
 
 
  language_gdbarch_data
  language_gdbarch_data
    = gdbarch_data_register_post_init (language_gdbarch_post_init);
    = gdbarch_data_register_post_init (language_gdbarch_post_init);
 
 
  /* GDB commands for language specific stuff */
  /* GDB commands for language specific stuff */
 
 
  /* FIXME: cagney/2005-02-20: This should be implemented using an
  /* FIXME: cagney/2005-02-20: This should be implemented using an
     enum.  */
     enum.  */
  add_setshow_string_noescape_cmd ("language", class_support, &language, _("\
  add_setshow_string_noescape_cmd ("language", class_support, &language, _("\
Set the current source language."), _("\
Set the current source language."), _("\
Show the current source language."), NULL,
Show the current source language."), NULL,
                                   set_language_command,
                                   set_language_command,
                                   show_language_command,
                                   show_language_command,
                                   &setlist, &showlist);
                                   &setlist, &showlist);
 
 
  add_prefix_cmd ("check", no_class, set_check,
  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);
                  &setchecklist, "set check ", 0, &setlist);
  add_alias_cmd ("c", "check", no_class, 1, &setlist);
  add_alias_cmd ("c", "check", no_class, 1, &setlist);
  add_alias_cmd ("ch", "check", no_class, 1, &setlist);
  add_alias_cmd ("ch", "check", no_class, 1, &setlist);
 
 
  add_prefix_cmd ("check", no_class, show_check,
  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);
                  &showchecklist, "show check ", 0, &showlist);
  add_alias_cmd ("c", "check", no_class, 1, &showlist);
  add_alias_cmd ("c", "check", no_class, 1, &showlist);
  add_alias_cmd ("ch", "check", no_class, 1, &showlist);
  add_alias_cmd ("ch", "check", no_class, 1, &showlist);
 
 
  /* FIXME: cagney/2005-02-20: This should be implemented using an
  /* FIXME: cagney/2005-02-20: This should be implemented using an
     enum.  */
     enum.  */
  add_setshow_string_noescape_cmd ("type", class_support, &type, _("\
  add_setshow_string_noescape_cmd ("type", class_support, &type, _("\
Set type checking.  (on/warn/off/auto)"), _("\
Set type checking.  (on/warn/off/auto)"), _("\
Show type checking.  (on/warn/off/auto)"), NULL,
Show type checking.  (on/warn/off/auto)"), NULL,
                                   set_type_command,
                                   set_type_command,
                                   show_type_command,
                                   show_type_command,
                                   &setchecklist, &showchecklist);
                                   &setchecklist, &showchecklist);
 
 
  /* FIXME: cagney/2005-02-20: This should be implemented using an
  /* FIXME: cagney/2005-02-20: This should be implemented using an
     enum.  */
     enum.  */
  add_setshow_string_noescape_cmd ("range", class_support, &range, _("\
  add_setshow_string_noescape_cmd ("range", class_support, &range, _("\
Set range checking.  (on/warn/off/auto)"), _("\
Set range checking.  (on/warn/off/auto)"), _("\
Show range checking.  (on/warn/off/auto)"), NULL,
Show range checking.  (on/warn/off/auto)"), NULL,
                                   set_range_command,
                                   set_range_command,
                                   show_range_command,
                                   show_range_command,
                                   &setchecklist, &showchecklist);
                                   &setchecklist, &showchecklist);
 
 
  /* FIXME: cagney/2005-02-20: This should be implemented using an
  /* FIXME: cagney/2005-02-20: This should be implemented using an
     enum.  */
     enum.  */
  add_setshow_string_noescape_cmd ("case-sensitive", class_support,
  add_setshow_string_noescape_cmd ("case-sensitive", class_support,
                                   &case_sensitive, _("\
                                   &case_sensitive, _("\
Set case sensitivity in name search.  (on/off/auto)"), _("\
Set case sensitivity in name search.  (on/off/auto)"), _("\
Show case sensitivity in name search.  (on/off/auto)"), _("\
Show case sensitivity in name search.  (on/off/auto)"), _("\
For Fortran the default is off; for other languages the default is on."),
For Fortran the default is off; for other languages the default is on."),
                                   set_case_command,
                                   set_case_command,
                                   show_case_command,
                                   show_case_command,
                                   &setlist, &showlist);
                                   &setlist, &showlist);
 
 
  add_language (&unknown_language_defn);
  add_language (&unknown_language_defn);
  add_language (&local_language_defn);
  add_language (&local_language_defn);
  add_language (&auto_language_defn);
  add_language (&auto_language_defn);
 
 
  language = savestring ("auto", strlen ("auto"));
  language = savestring ("auto", strlen ("auto"));
  type = savestring ("auto", strlen ("auto"));
  type = savestring ("auto", strlen ("auto"));
  range = savestring ("auto", strlen ("auto"));
  range = savestring ("auto", strlen ("auto"));
  case_sensitive = savestring ("auto",strlen ("auto"));
  case_sensitive = savestring ("auto",strlen ("auto"));
 
 
  /* Have the above take effect */
  /* Have the above take effect */
  set_language (language_auto);
  set_language (language_auto);
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.