/* %Z%%M% %I% %E% */

/*
 * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995 by Wayne C. Gramlich.
 * All rights reserved.
 *
 * Permission to use, copy, modify, distribute, and sell this software
 * for any purpose is hereby granted without fee provided that the above
 * copyright notice and this permission are retained.  The author makes
 * no representations about the suitability of this software for any purpose.
 * It is provided "as is" without express or implied warranty.
 */

/* This file contains declarations for routines to manipulate types: */

#ifndef TYPE_EXPORTS_H
#define TYPE_EXPORTS_H

#ifndef CALL_TYPES_H
#include "call_types.h"
#endif

#ifndef GEN_TYPES_H
#include "gen_types.h"
#endif

#ifndef HEAP_TYPES_H
#include "heap_types.h"
#endif

#ifndef MODULE_TYPES_H
#include "module_types.h"
#endif

#ifndef MSG_TYPES_H
#include "msg_types.h"
#endif

#ifndef OBJECT_TYPES_H
#include "object_types.h"
#endif

#ifndef PARSER_TYPES_H
#include "parser_types.h"
#endif

#ifndef ROUTINE_TYPES_H
#include "routine_types.h"
#endif

#ifndef STR_TYPES_H
#include "str_types.h"
#endif

#ifndef TABLE_TYPES_H
#include "table_types.h"
#endif

#ifndef TYPE_TYPES_H
#include "type_types.h"
#endif

#ifndef UNIX_STDIO_H
#include "unix_stdio.h"
#endif

#ifndef VECTOR_TYPES_H
#include "vector_types.h"
#endif

/* Type_def routines: */
extern Type_def		type_def_create(Str, int, Type_tables, Heap);
extern void		type_def_initial_object_gen(Type_def, Gen);
extern Type_def		type_def_parse(Vec(Routine), Module, Parser);
extern void		type_def_print(Type_def, Stdio);
extern void		type_def_routines_gen(Type_def, Gen);
extern void		type_def_structure_needed(Type_def);

/* Type_def_table routines: */
extern Type_def_table	type_def_table_create(Heap);
extern int		type_def_table_insert(Type_def_table, Type_def);
extern Type_def		type_def_table_lookup(Type_def_table, Str);

/* Type_defs routines: */
extern void		type_defs_convert(Type_defs, Convert);
extern void		type_defs_dump(Type_defs, Stdio);
extern void		type_defs_enumeration_gen(Type_defs, Gen);
extern void		type_defs_external_gen(Type_defs, Gen);
extern void		type_defs_initialization_gen(Type_defs, Gen);
extern void		type_defs_insert(Type_defs, Type_tables,
					 Object_table, Msg, Heap);
extern Type_defs	type_defs_read(Stdio, Heap, Type_tables, int);
extern void		type_defs_routines_gen(Type_defs, Gen);
extern void		type_defs_structure_gen(Type_defs, Gen);
extern void		type_defs_typedef_gen(Type_defs, Gen);
extern void		type_defs_write(Type_defs, Stdio, Type_tables);

/* Type_need routines: */
extern Type_need	type_need_create(Type_ref, Str, Type_proto,
					 Type_tables);
extern void		type_need_print(Type_need, int, Stdio);

extern Type_need_table	type_need_table_create(Type_ref_table, Heap);
extern void		type_need_table_dump(Type_need_table, Stdio);

/* Type_needs routines: */
extern Type_needs	type_needs_append(Type_needs, Type_need, Type_tables);
extern Type_needs	type_needs_empty_create(Type_tables);
extern int		type_needs_is_empty(Type_needs);
extern Type_needs	type_needs_parse(Parser);

/* Type_proto routines: */
extern Type_proto	type_proto_create(Type_proto_kind, Type_refs,
					  Type_refs, Type_refs,
					  Type_refs, Type_signals,
					  Type_needs, int, Type_tables);
extern Type_proto	type_proto_from_type_ref(Type_ref, Type_tables);
extern int		type_proto_is_parameter(Type_proto, Type_ref);
extern int		type_proto_is_parameterized(Type_proto);
extern void		type_proto_needed(Type_proto, Type_tables);
extern void		type_proto_print(Type_proto, int, Stdio);
extern Type_proto	type_proto_read(Stdio, Heap, Type_tables);
extern Type_proto	type_proto_replace(Type_proto, Type_refs,
					   Type_refs, Type_tables);
extern void		type_proto_write(Type_proto, Stdio, Type_tables);

extern Type_proto_table	type_proto_table_create(Type_ref_table, Heap);
extern void		type_proto_table_dump(Type_proto_table, Stdio);
extern void		type_proto_table_gen(Type_proto_table, Gen);

/* Type_ref routines: */
extern int		type_ref_contains_parameter(Type_ref);
extern Type_ref		type_ref_create(Str, Type_tables);
extern int		type_ref_equal(Type_ref, Type_ref);
extern void		type_ref_gen(Type_ref, Gen);
extern int		type_ref_hash(Type_ref);
extern void		type_ref_mangle(Type_ref, Stdio);
extern int		type_ref_is_parameter(Type_ref);
extern int		type_ref_is_parameterized(Type_ref);
extern int		type_ref_is_routine(Type_ref);
extern Type_ref		type_ref_parameters_create(Str, Type_refs, Type_tables);
extern Type_ref		type_ref_parse(Parser);
extern void		type_ref_print(Type_ref, Stdio);
extern Type_ref		type_ref_read(Stdio, Heap, Type_tables);
extern Type_ref		type_ref_replace(Type_ref, Type_refs,
					 Type_refs, Type_tables);
extern Str		type_ref_string(Type_ref, Heap);
extern void		type_ref_write(Type_ref, Stdio, Type_tables);

/* Type_refs routines: */
extern Type_refs	type_refs_append(Type_refs, Type_ref, Type_tables);
extern int		type_refs_compare(Type_refs, Type_refs, int);
extern Type_refs	type_refs_concat(Type_refs, Type_refs, Type_tables);
extern Type_refs	type_refs_empty_create(Type_tables);
extern int		type_refs_equal(Type_refs, Type_refs);
extern Type_ref		type_refs_fetch(Type_refs, int);
extern void		type_refs_gen(Type_refs, Gen);
extern int		type_refs_hash(Type_refs);
extern int		type_refs_is_empty(Type_refs);
extern void		type_refs_keyword_print(Type_refs, Stdio, Str, int);
extern Type_refs	type_refs_lop(Type_refs, Type_tables);
extern void		type_refs_mangle(Type_refs, int, Stdio);
extern void		type_refs_multiple_gen(Type_tables, Gen);
extern void		type_refs_multiple_needed(Type_refs, Type_tables);
extern Str		type_refs_multiple_string(Type_refs, Heap);
extern void		type_refs_needed(Type_refs, Type_tables);
extern Type_refs	type_refs_parse(Parser);
extern void		type_refs_print(Type_refs, Stdio);
extern Type_refs	type_refs_read(Stdio, Heap, Type_tables);
extern Type_refs	type_refs_replace(Type_refs, Type_refs,
					  Type_refs, Type_tables);
extern int		type_refs_size(Type_refs);
extern void		type_refs_write(Type_refs, Stdio, Type_tables);

/* Type_signal routines: */
extern Type_signal	type_signal_create(Str, Type_refs, Type_tables);

extern Type_signal_table type_signal_table_create(Type_ref_table, Heap);
extern void		type_signal_table_dump(Type_signal_table, Stdio);

/* Type_signals routines: */
extern Type_signals	type_signals_append(Type_signals, Type_signal,
					    Type_tables);
extern Type_signals	type_signals_empty_create(Type_tables);

/* Type_tables routines: */
extern Type_tables	type_tables_create(Heap);
extern void		type_tables_dump(Type_tables, Stdio);

/* Other routines: */
extern Str		type_translate(Str, Heap);
extern Vec(Routine_type) routine_types_list_parse(Parser);
extern void		type_init_gen(Type_ref, Gen);

#endif /* TYPE_EXPORTS_H */

