/* @(#)rpc←parse.h 1.1 90/10/29 (C) 1987 SMI */

/*
 * rpc←parse.h, Definitions for the RPCL parser 
 * Copyright (C) 1987, Sun Microsystems, Inc. 
 */

enum defkind {
	DEF←CONST,
	DEF←STRUCT,
	DEF←UNION,
	DEF←ENUM,
	DEF←TYPEDEF,
	DEF←PROGRAM
};
typedef enum defkind defkind;

typedef char *const←def;

enum relation {
	REL←VECTOR,	/* fixed length array */
	REL←ARRAY,	/* variable length array */
	REL←POINTER,	/* pointer */
	REL←ALIAS,	/* simple */
};
typedef enum relation relation;

struct typedef←def {
	char *old←prefix;
	char *old←type;
	relation rel;
	char *array←max;
};
typedef struct typedef←def typedef←def;

struct enumval←list {
	char *name;
	char *assignment;
	struct enumval←list *next;
};
typedef struct enumval←list enumval←list;

struct enum←def {
	enumval←list *vals;
};
typedef struct enum←def enum←def;

struct declaration {
	char *prefix;
	char *type;
	char *name;
	relation rel;
	char *array←max;
};
typedef struct declaration declaration;

struct decl←list {
	declaration decl;
	struct decl←list *next;
};
typedef struct decl←list decl←list;

struct struct←def {
	decl←list *decls;
};
typedef struct struct←def struct←def;

struct case←list {
	char *case←name;
	declaration case←decl;
	struct case←list *next;
};
typedef struct case←list case←list;

struct union←def {
	declaration enum←decl;
	case←list *cases;
	declaration *default←decl;
};
typedef struct union←def union←def;

struct proc←list {
	char *proc←name;
	char *proc←num;
	char *arg←type;
	char *arg←prefix;
	char *res←type;
	char *res←prefix;
	struct proc←list *next;
};
typedef struct proc←list proc←list;

struct version←list {
	char *vers←name;
	char *vers←num;
	proc←list *procs;
	struct version←list *next;
};
typedef struct version←list version←list;

struct program←def {
	char *prog←num;
	version←list *versions;
};
typedef struct program←def program←def;

struct definition {
	char *def←name;
	defkind def←kind;
	union {
		const←def co;
		struct←def st;
		union←def un;
		enum←def en;
		typedef←def ty;
		program←def pr;
	} def;
};
typedef struct definition definition;

definition *get←definition();