/* Interface to functions for deciding which macros are currently in scope.
   Copyright (C) 2002, 2007, 2008 Free Software Foundation, Inc.
   Contributed by Red Hat, Inc.

   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 3 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, see <http://www.gnu.org/licenses/>.  */

#ifndef MACROSCOPE_H
#define MACROSCOPE_H

#include "macrotab.h"
#include "symtab.h"


/* The table of macros defined by the user.  */
extern struct macro_table *macro_user_macros;

/* All the information we need to decide which macro definitions are
   in scope: a source file (either a main source file or an
   #inclusion), and a line number in that file.  */
struct macro_scope {
  struct macro_source_file *file;
  int line;
};


/* Return a `struct macro_scope' object corresponding to the symtab
   and line given in SAL.  If we have no macro information for that
   location, or if SAL's pc is zero, return zero.  */
struct macro_scope *sal_macro_scope (struct symtab_and_line sal);


/* Return a `struct macro_scope' object representing just the
   user-defined macros.  The result is allocated using xmalloc; the
   caller is responsible for freeing it.  */
struct macro_scope *user_macro_scope (void);

/* Return a `struct macro_scope' object describing the scope the `macro
   expand' and `macro expand-once' commands should use for looking up
   macros.  If we have a selected frame, this is the source location of
   its PC; otherwise, this is the last listing position.

   If we have no macro information for the current location, return
   the user macro scope.

   The object returned is allocated using xmalloc; the caller is
   responsible for freeing it.  */
struct macro_scope *default_macro_scope (void);


/* Look up the definition of the macro named NAME in scope at the source
   location given by BATON, which must be a pointer to a `struct
   macro_scope' structure.  This function is suitable for use as
   a macro_lookup_ftype function.  */
struct macro_definition *standard_macro_lookup (const char *name, void *baton);


#endif /* MACROSCOPE_H */
