/*
 * C compiler
 * ==========
 *
 * Copyright 1989, 1990, 1991 Christoph van Wuellen.
 * Credits to Matthew Brandt.
 * All commercial rights reserved.
 *
 * This compiler may be redistributed as long there is no
 * commercial interest. The compiler must not be redistributed
 * without its full sources. This notice must stay intact.
 *
 * History:
 *
 * 1989   starting an 68000 C compiler, starting with material
 *        originally by M. Brandt
 * 1990   68000 C compiler further bug fixes
 *        started i386 port (December)
 * 1991   i386 port finished (January)
 *        further corrections in the front end and in the 68000
 *        code generator.
 *        The next port will be a SPARC port
 */
#ifdef CPU_DEFINED

#ifndef _OUT_H
#define _OUT_H

#define	MAX_WIDTH	60		/* line length of assembler line */

#ifndef _CODE_DEFINED
#define _CODE_DEFINED
typedef struct ocode	CODE;
#endif

#if defined(__STDC__) || defined(__cplusplus)
#define P_(s) s
#else
#define P_(s) ()
#endif

#ifdef MULTIPLE_ASSEMBLERS
/*
 * Support multiple assembler output types
 */

struct funcs {
	void (*Put_code)	P_((const CODE *));
	void (*Put_name)	P_((SYM *));
	void (*Put_label)	P_((LABEL));
	void (*Put_byte)	P_((int));
	void (*Put_char)	P_((int));
	void (*Put_word)	P_((int));
	void (*Put_long)	P_((long));
	void (*Put_pointer)	P_((const EXPR *));
#ifndef RELOC_BUG
	void (*Put_short)	P_((const EXPR *));
#endif /* RELOC_BUG */
	void (*Put_storage)	P_((SYM *));
	void (*Put_literals)	P_((void));
	void (*Put_finish)	P_((void));
	void (*Put_start)	P_((void));
	void (*Put_reference)	P_((SYM *));
	void (*Put_cseg)	P_((SIZE));
	void (*Put_dseg)	P_((SIZE));
	void (*Put_kseg)	P_((SIZE));
#ifdef FLOAT_SUPPORT
	void (*Put_float)	P_((RVAL *));
	void (*Put_double)	P_((RVAL *));
	void (*Put_longdouble)	P_((RVAL *));
#endif /* FLOAT_SUPPORT */
	};

#define	put_code(ip)		(Funcs->Put_code)(ip)
#define	put_name(s)		(Funcs->Put_name)(s)
#define	put_label(lab)		(Funcs->Put_label)(lab)
#define	put_byte(val)		(Funcs->Put_byte)(val)
#define	put_char(val)		(Funcs->Put_char)(val)
#define	put_word(val)		(Funcs->Put_word)(val)
#define	put_long(val)		(Funcs->Put_long)(val)
#define	put_pointer(node)	(Funcs->Put_pointer)(node)
#define	put_short(node)		(Funcs->Put_short)(node)
#define	put_storage(sp)		(Funcs->Put_storage)(sp)
#define	put_literals()		(Funcs->Put_literals)()
#define	put_finish()		(Funcs->Put_finish)()
#define	put_start()		(Funcs->Put_start)()
#define	put_reference(s)	(Funcs->Put_reference)(s)
#define	put_cseg(align)		(Funcs->Put_cseg)(align)
#define	put_dseg(align)		(Funcs->Put_dseg)(align)
#define	put_kseg(align)		(Funcs->Put_kseg)(align)
#ifdef FLOAT_SUPPORT
#define	put_float(val)		(Funcs->Put_float)(val)
#define put_double(val)		(Funcs->Put_double)(val)
#define put_longdouble(val)	(Funcs->Put_longdouble)(val)
#endif /* FLOAT_SUPPORT */

#else

extern	void	put_code	P_((const CODE *));
extern	void	put_name	P_((SYM *));
extern	void	put_label	P_((LABEL));
extern	void	put_byte	P_((int));
extern	void	put_char	P_((int));
extern	void	put_word	P_((int));
#ifdef FLOAT_SUPPORT
extern	void	put_float	P_((RVAL *));
extern	void	put_double	P_((RVAL *));
extern	void	put_longdouble	P_((RVAL *));
#endif /* FLOAT_SUPPORT */
void put_long P_((IVAL));
void put_pointer P_((const EXPR *));
void put_storage P_((SYM *));
void put_literals P_((void));
void put_finish P_((void));
void put_start P_((void));
void put_reference P_((SYM *));
void put_cseg P_((SIZE));
void put_dseg P_((SIZE));
void put_kseg P_((SIZE));
#ifndef RELOC_BUG
void put_short P_((const EXPR *));
#endif /* RELOC_BUG */

#undef P_

#endif /* MULTIPLE_ASSEMBLERS */

#endif /* _OUT_H */
#endif /* CPU_DEFINED */
