PR binutils/1437
[deliverable/binutils-gdb.git] / gdb / parse.c
index 4af6d7c7bf005991c0f463beafc5418ca02ee045..f6b0c4f8eddf52ed3867d4692c2d8c171e255436 100644 (file)
@@ -1,6 +1,8 @@
 /* Parse expressions for GDB.
-   Copyright 1986, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
-   1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+
+   Copyright 1986, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
+   1997, 1998, 1999, 2000, 2001, 2004, 2005 Free Software Foundation, Inc.
+
    Modified from expread.y by the Department of Computer Science at the
    State University of New York at Buffalo, 1991.
 
@@ -41,6 +43,7 @@
 #include "value.h"
 #include "command.h"
 #include "language.h"
+#include "f-lang.h"
 #include "parser-defs.h"
 #include "gdbcmd.h"
 #include "symfile.h"           /* for overlay functions */
@@ -61,21 +64,6 @@ const struct exp_descriptor exp_descriptor_standard =
     dump_subexp_body_standard,
     evaluate_subexp_standard
   };
-\f
-/* Symbols which architectures can redefine.  */
-
-/* Some systems have routines whose names start with `$'.  Giving this
-   macro a non-zero value tells GDB's expression parser to check for
-   such routines when parsing tokens that begin with `$'.
-
-   On HP-UX, certain system routines (millicode) have names beginning
-   with `$' or `$$'.  For example, `$$dyncall' is a millicode routine
-   that handles inter-space procedure calls on PA-RISC.  */
-#ifndef SYMBOLS_CAN_START_WITH_DOLLAR
-#define SYMBOLS_CAN_START_WITH_DOLLAR (0)
-#endif
-
-
 \f
 /* Global variables declared in parser-defs.h (and commented there).  */
 struct expression *expout;
@@ -89,11 +77,26 @@ union type_stack_elt *type_stack;
 int type_stack_depth, type_stack_size;
 char *lexptr;
 char *prev_lexptr;
-char *namecopy;
 int paren_depth;
 int comma_terminates;
+
+/* A temporary buffer for identifiers, so we can null-terminate them.
+
+   We allocate this with xrealloc.  parse_exp_1 used to allocate with
+   alloca, using the size of the whole expression as a conservative
+   estimate of the space needed.  However, macro expansion can
+   introduce names longer than the original expression; there's no
+   practical way to know beforehand how large that might be.  */
+char *namecopy;
+size_t namecopy_size;
 \f
 static int expressiondebug = 0;
+static void
+show_expressiondebug (struct ui_file *file, int from_tty,
+                     struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("Expression debugging is %s.\n"), value);
+}
 
 static void free_funcalls (void *ignore);
 
@@ -435,6 +438,9 @@ write_exp_msymbol (struct minimal_symbol *msymbol,
 void
 write_dollar_variable (struct stoken str)
 {
+  struct symbol *sym = NULL;
+  struct minimal_symbol *msym = NULL;
+
   /* Handle the tokens $digits; also $ (short for $0) and $$ (short for $$1)
      and $$digits (equivalent to $<-digits> if you could type that). */
 
@@ -472,36 +478,26 @@ write_dollar_variable (struct stoken str)
   if (i >= 0)
     goto handle_register;
 
-  if (SYMBOLS_CAN_START_WITH_DOLLAR)
-    {
-      struct symbol *sym = NULL;
-      struct minimal_symbol *msym = NULL;
-
-      /* On HP-UX, certain system routines (millicode) have names beginning
-        with $ or $$, e.g. $$dyncall, which handles inter-space procedure
-        calls on PA-RISC. Check for those, first. */
+  /* On some systems, such as HP-UX and hppa-linux, certain system routines 
+     have names beginning with $ or $$.  Check for those, first. */
 
-      /* This code is not enabled on non HP-UX systems, since worst case 
-        symbol table lookup performance is awful, to put it mildly. */
-
-      sym = lookup_symbol (copy_name (str), (struct block *) NULL,
-                          VAR_DOMAIN, (int *) NULL, (struct symtab **) NULL);
-      if (sym)
-       {
-         write_exp_elt_opcode (OP_VAR_VALUE);
-         write_exp_elt_block (block_found);    /* set by lookup_symbol */
-         write_exp_elt_sym (sym);
-         write_exp_elt_opcode (OP_VAR_VALUE);
-         return;
-       }
-      msym = lookup_minimal_symbol (copy_name (str), NULL, NULL);
-      if (msym)
-       {
-         write_exp_msymbol (msym,
-                            lookup_function_type (builtin_type_int),
-                            builtin_type_int);
-         return;
-       }
+  sym = lookup_symbol (copy_name (str), (struct block *) NULL,
+                      VAR_DOMAIN, (int *) NULL, (struct symtab **) NULL);
+  if (sym)
+    {
+      write_exp_elt_opcode (OP_VAR_VALUE);
+      write_exp_elt_block (block_found);       /* set by lookup_symbol */
+      write_exp_elt_sym (sym);
+      write_exp_elt_opcode (OP_VAR_VALUE);
+      return;
+    }
+  msym = lookup_minimal_symbol (copy_name (str), NULL, NULL);
+  if (msym)
+    {
+      write_exp_msymbol (msym,
+                        lookup_function_type (builtin_type_int),
+                        builtin_type_int);
+      return;
     }
 
   /* Any other names starting in $ are debugger internal variables.  */
@@ -772,8 +768,16 @@ find_template_name_end (char *p)
 char *
 copy_name (struct stoken token)
 {
+  /* Make sure there's enough space for the token.  */
+  if (namecopy_size < token.length + 1)
+    {
+      namecopy_size = token.length + 1;
+      namecopy = xrealloc (namecopy, token.length + 1);
+    }
+      
   memcpy (namecopy, token.ptr, token.length);
   namecopy[token.length] = 0;
+
   return namecopy;
 }
 \f
@@ -834,10 +838,11 @@ operator_length_standard (struct expression *expr, int endpos,
 {
   int oplen = 1;
   int args = 0;
+  enum f90_range_type range_type;
   int i;
 
   if (endpos < 1)
-    error ("?error in operator_length_standard");
+    error (_("?error in operator_length_standard"));
 
   i = (int) expr->elts[endpos - 1].opcode;
 
@@ -954,6 +959,26 @@ operator_length_standard (struct expression *expr, int endpos,
       oplen = 2;
       break;
 
+    case OP_F90_RANGE:
+      oplen = 3;
+
+      range_type = longest_to_int (expr->elts[endpos - 2].longconst);
+      switch (range_type)
+       {
+       case LOW_BOUND_DEFAULT:
+       case HIGH_BOUND_DEFAULT:
+         args = 1;
+         break;
+       case BOTH_BOUND_DEFAULT:
+         args = 0;
+         break;
+       case NONE_BOUND_DEFAULT:
+         args = 2;
+         break;
+       }
+
+      break;
+
     default:
       args = 1 + (i < (int) BINOP_END);
     }
@@ -1045,7 +1070,7 @@ parse_exp_in_context (char **stringptr, struct block *block, int comma,
   comma_terminates = comma;
 
   if (lexptr == 0 || *lexptr == 0)
-    error_no_arg ("expression to compute");
+    error_no_arg (_("expression to compute"));
 
   old_chain = make_cleanup (free_funcalls, 0 /*ignore*/);
   funcall_chain = 0;
@@ -1058,7 +1083,6 @@ parse_exp_in_context (char **stringptr, struct block *block, int comma,
   else
     expression_context_block = get_selected_block (&expression_context_pc);
 
-  namecopy = (char *) alloca (strlen (lexptr) + 1);
   expout_size = 10;
   expout_ptr = 0;
   expout = (struct expression *)
@@ -1107,7 +1131,7 @@ parse_expression (char *string)
   struct expression *exp;
   exp = parse_exp_1 (&string, 0, 0);
   if (*string)
-    error ("Junk after end of expression.");
+    error (_("Junk after end of expression."));
   return exp;
 }
 
@@ -1121,13 +1145,12 @@ parse_expression_in_context (char *string, int void_context_p)
   struct expression *exp;
   exp = parse_exp_in_context (&string, 0, 0, void_context_p);
   if (*string != '\000')
-    error ("Junk after end of expression.");
+    error (_("Junk after end of expression."));
   return exp;
 }
 
 /* A post-parser that does nothing */
 
-/* ARGSUSED */
 void
 null_post_parser (struct expression **exp, int void_context_p)
 {
@@ -1333,11 +1356,12 @@ _initialize_parse (void)
   DEPRECATED_REGISTER_GDBARCH_SWAP (msym_unknown_symbol_type);
   deprecated_register_gdbarch_swap (NULL, 0, build_parse);
 
-  add_show_from_set (
-           add_set_cmd ("expression", class_maintenance, var_zinteger,
-                        (char *) &expressiondebug,
-                        "Set expression debugging.\n\
-When non-zero, the internal representation of expressions will be printed.",
-                        &setdebuglist),
-                     &showdebuglist);
+  add_setshow_zinteger_cmd ("expression", class_maintenance,
+                           &expressiondebug, _("\
+Set expression debugging."), _("\
+Show expression debugging."), _("\
+When non-zero, the internal representation of expressions will be printed."),
+                           NULL,
+                           show_expressiondebug,
+                           &setdebuglist, &showdebuglist);
 }
This page took 0.028186 seconds and 4 git commands to generate.