/* Fortran language support definitions for GDB, the GNU debugger.
   Copyright 1992, 1993, 1994 Free Software Foundation, Inc.
   Contributed by Motorola.  Adapted from the C definitions by Farooq Butt
   (fmbutt@engage.sps.mot.com).

This file is part of GDB.

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
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */

extern int f_parse PARAMS ((void));

extern void f_error PARAMS ((char *));	/* Defined in f-exp.y */

extern void f_print_type PARAMS ((struct type *, char *,
				  GDB_FILE *, int, int));

extern int f_val_print PARAMS ((struct type *, char *, int, 
				CORE_ADDR, GDB_FILE *,
				int, int, int, enum val_prettyprint));

/* Language-specific data structures */ 

struct common_entry
{
  struct symbol *symbol;                    /* The symbol node corresponding
					       to this component */ 
  struct common_entry *next;                /* The next component */ 
};

struct saved_f77_common
{
  char *name;                                /* Name of COMMON */
  char *owning_function;                     /* Name of parent function */ 
  int secnum;                                /* Section # of .bss */ 
  CORE_ADDR offset;                          /* Offset from .bss for 
						this block */
  struct common_entry *entries;              /* List of block's components */
  struct common_entry *end_of_entries;       /* ptr. to end of components */ 
  struct saved_f77_common *next;              /* Next saved COMMON block */ 
};

typedef struct saved_f77_common    SAVED_F77_COMMON, *SAVED_F77_COMMON_PTR;

typedef struct common_entry        COMMON_ENTRY, *COMMON_ENTRY_PTR;

extern SAVED_F77_COMMON_PTR head_common_list;   /* Ptr to 1st saved COMMON  */
extern SAVED_F77_COMMON_PTR tail_common_list;   /* Ptr to last saved COMMON  */
extern SAVED_F77_COMMON_PTR current_common;     /* Ptr to current COMMON */

extern SAVED_F77_COMMON_PTR find_common_for_function PARAMS ((char *, char *));

#define UNINITIALIZED_SECNUM -1 
#define COMMON_NEEDS_PATCHING(blk) ((blk)->secnum == UNINITIALIZED_SECNUM)

#define BLANK_COMMON_NAME_ORIGINAL "#BLNK_COM"  /* XLF assigned  */
#define BLANK_COMMON_NAME_MF77     "__BLNK__"   /* MF77 assigned  */
#define BLANK_COMMON_NAME_LOCAL    "__BLANK"    /* Local GDB */

#define BOUND_FETCH_OK 1
#define BOUND_FETCH_ERROR -999

/* When reasonable array bounds cannot be fetched, such as when 
you ask to 'mt print symbols' and there is no stack frame and 
therefore no way of knowing the bounds of stack-based arrays, 
we have to assign default bounds, these are as good as any... */ 

#define DEFAULT_UPPER_BOUND 999999
#define DEFAULT_LOWER_BOUND -999999

extern char *real_main_name;   /* Name of main function */ 
extern int  real_main_c_value;   /* C_value field of main function */ 

extern int f77_get_dynamic_upperbound PARAMS ((struct type *, int *));

extern int f77_get_dynamic_lowerbound PARAMS ((struct type *, int *));

extern void f77_get_dynamic_array_length PARAMS ((struct type *)); 

extern int calc_f77_array_dims PARAMS ((struct type *));

#define DEFAULT_DOTMAIN_NAME_IN_MF77            ".MAIN_"
#define DEFAULT_MAIN_NAME_IN_MF77               "MAIN_"
#define DEFAULT_DOTMAIN_NAME_IN_XLF_BUGGY       ".main "
#define DEFAULT_DOTMAIN_NAME_IN_XLF             ".main"
