/* @(#)request_space.h	1.2	2/10/93 */
/*******************************************************************************

This code was written and designed by 
Andrew Gene HALL of I.N. Services Pty. Ltd., Scarborough WA, Australia,
for the 
University of Western Australia, Crawley WA, Australia.

*******************************************************************************/
#ifndef REQUEST_SPACE_H
#define REQUEST_SPACE_H

typedef
enum {
RE_STRING,
UNARY_FN, COMPLEMENT, ASSUME_TRUE,
BINARY_FN, UNION, INTERSECTION,
COMPARISON_FN, EQUAL_STRINGS, NOT_EQUAL_STRINGS, SUB_STRING, NOT_SUB_STRING,
ASCII_LESS, ASCII_LESS_OR_EQUAL, ASCII_GREATER, ASCII_GREATER_OR_EQUAL, 
REAL_EQUAL, REAL_NOT_EQUAL, REAL_LESS, REAL_LESS_OR_EQUAL, REAL_GREATER,
REAL_GREATER_OR_EQUAL,
SCOPE, SCOPE_DATA_ITEM, SCOPE_LOOP_PACKET, SCOPE_LOOP_STRUCTURE,
SCOPE_SAVE_FRAME, SCOPE_DATA_BLOCK, SCOPE_FILE,
CONDITIONAL, BRANCHING 
}					Request_Domain;

typedef struct conditional_request	Conditional_Request;
struct conditional_request {
   Request_Domain	tag;
   union {
     char		*re_string;
     struct {
        Request_Domain		function;
        Conditional_Request	*right;
     } unary_fn;
     struct {
        Request_Domain		function;
        Conditional_Request	*left;
        Conditional_Request	*right;
     } binary_fn;
     struct {
        Request_Domain		function;
        Conditional_Request	*left;
        Data_Item		*right;
     } comparison_fn;
   } cond;
};

typedef struct branching_request	Branching_Request;
typedef struct scope_request		Scope_Request;
typedef
struct {
   Request_Domain	tag;
   union {
      Conditional_Request	*conditional;
      Branching_Request		*branching;
      Scope_Request		*scope;
   } request;
}					Request;

typedef struct request_seq 		Request_Seq;
struct request_seq {
   Request	*req;
   Request_Seq	*next;
};

struct branching_request {
   Conditional_Request	*condition;
   Request_Seq		*true_branch;
   Request_Seq		*false_branch;
   Request_Seq		*unknown_branch;
};

struct scope_request {
   Request_Domain	scope;
   Request_Seq		*reqs;
};

#endif

