/* C language support definitions for GDB, the GNU debugger.
   Copyright 1992, 1996 Free Software Foundation, 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 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.  */


#if !defined (C_LANG_H)
#define C_LANG_H 1

#include "value.h"


extern int
c_parse PARAMS ((void));	/* Defined in c-exp.y */

extern void
c_error PARAMS ((char *));	/* Defined in c-exp.y */

extern void			/* Defined in c-typeprint.c */
c_print_type PARAMS ((struct type *, char *, GDB_FILE *, int, int));

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

extern int
c_value_print PARAMS ((struct value *, GDB_FILE *, int, enum val_prettyprint));

/* These are in c-lang.c: */

extern void c_printchar PARAMS ((int, GDB_FILE *));

extern void c_printstr PARAMS ((GDB_FILE * stream, char *string,
				unsigned int length, int width,
				int force_ellipses));

extern struct type *c_create_fundamental_type PARAMS ((struct objfile *, int));

extern struct type **CONST_PTR (c_builtin_types[]);

/* These are in c-typeprint.c: */

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

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

/* These are in cp-valprint.c */

extern int vtblprint;		/* Controls printing of vtbl's */

extern int static_field_print;

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

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

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

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

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


#endif /* !defined (C_LANG_H) */
