/* C language support definitions for GDB, the GNU debugger.
   Copyright 1992, 1996, 2000 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 (void);	/* Defined in c-exp.y */

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

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

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

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

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

extern void c_printchar (int, struct ui_file *);

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

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

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

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

extern void c_type_print_base (struct type *, struct ui_file *, int, int);

extern void c_type_print_varspec_prefix (struct type *, struct ui_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 (char *, struct type *, struct ui_file *,
				   char *);

extern void cp_print_class_method (char *, struct type *, struct ui_file *);

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

extern int cp_is_vtbl_ptr_type (struct type *);

extern int cp_is_vtbl_member (struct type *);


#endif /* !defined (C_LANG_H) */
