1 /*
2    datum.h -- Macros and prototypes for `datum.c'.
3 
4    Copyright (C) 1994-97  K. Scott Hunziker.
5    Copyright (C) 1990-94  The Boeing Company.
6 
7    See the file COPYING for license, warranty, and permission details.
8  */
9 
10 /* $Id: datum.h,v 1.2 1997/02/21 09:53:53 ksh Exp $ */
11 
12 #ifndef  DATUM_H
13 #define  DATUM_H	1
14 
15 #include "algae.h"
16 #include "put.h"
17 
18 typedef enum
19   {
20     D_NULL,
21     D_INT,
22     D_REAL,
23     D_ENTITY,
24     NUM_DATUM
25   }
26 DATUM_TYPE;
27 
28 struct datum
29   {
30     DATUM_TYPE type;
31     union
32       {
33 	int ival;		/* type == D_INT */
34 	double rval;		/* type == D_REAL */
35 	void *ptr;		/* other types */
36       }
37     data;
38   };
39 
40 #define IVAL(p)	(p)->data.ival
41 #define RVAL(p)	(p)->data.rval
42 #define E_PTR(p)  ((ENTITY*)(p)->data.ptr)
43 #define D_PTR(p)  ((DATUM*)(p)->data.ptr)
44 #define PTR(p)		(p)->data.ptr
45 
46 
47 #define TWO_DATUM_(l,r) TWO_TYPES(l,r,NUM_DATUM)
48 #define TEST2DATUM(p)	TWO_DATUM_((p)->type,((p)+1)->type)
49 
50 
51 #define NULL_NULL	TWO_DATUM_(D_NULL,D_NULL)
52 #define NULL_INT	TWO_DATUM_(D_NULL,D_INT)
53 #define NULL_REAL	TWO_DATUM_(D_NULL,D_REAL)
54 #define NULL_ENTITY	TWO_DATUM_(D_NULL,D_ENTITY)
55 #define INT_NULL	TWO_DATUM_(D_INT,D_NULL)
56 #define INT_INT		TWO_DATUM_(D_INT,D_INT)
57 #define INT_REAL	TWO_DATUM_(D_INT,D_REAL)
58 #define INT_ENTITY	TWO_DATUM_(D_INT,D_ENTITY)
59 #define REAL_NULL	TWO_DATUM_(D_REAL,D_NULL)
60 #define REAL_INT	TWO_DATUM_(D_REAL,D_INT)
61 #define REAL_REAL	TWO_DATUM_(D_REAL,D_REAL)
62 #define REAL_ENTITY	TWO_DATUM_(D_REAL,D_ENTITY)
63 #define ENTITY_NULL	TWO_DATUM_(D_ENTITY,D_NULL)
64 #define ENTITY_INT	TWO_DATUM_(D_ENTITY,D_INT)
65 #define ENTITY_REAL	TWO_DATUM_(D_ENTITY,D_REAL)
66 #define ENTITY_ENTITY	TWO_DATUM_(D_ENTITY,D_ENTITY)
67 
68 
69 #define CASE_any_NULL   case  NULL_NULL :\
70 			case  NULL_INT  :\
71 			case  NULL_REAL  :\
72 			case  NULL_ENTITY  :\
73 			case  INT_NULL  :\
74 			case  REAL_NULL  :\
75 			case  ENTITY_NULL
76 
77 #if DEBUG
78 #define delete_datum(p)		DB_delete_datum(p)
79 #else
80 #define delete_datum(p)		do {\
81 				if ( (p)->type == D_ENTITY )\
82 				{ delete_entity(E_PTR(p)) ; }\
83 				(p)->type = D_NULL ; } while(0)
84 #endif
85 
86 
87 #define  datum_assign(to,from)  do{ delete_datum(to) ;\
88 				    copy_datum(to,from) ; }while(0)
89 
90 #define  assign_datum(t,f)	datum_assign(t,f)
91 
92 extern DATUM *vociferant;
93 
94 DATUM *PROTO (new_DATUM, (void));
95 DATUM *PROTO (new_INT, (int));
96 DATUM *PROTO (new_REAL, (double));
97 DATUM *PROTO (copy_datum, (DATUM *, DATUM *));
98 void PROTO (DB_delete_datum, (DATUM *));
99 int PROTO (datum_test, (DATUM * dp));
100 int PROTO (datum_to_int, (DATUM * dp));
101 extern int PROTO (put_datum, (DATUM * d, FILE * stream, struct ent_node *));
102 extern DATUM *PROTO (get_datum, (FILE * stream));
103 extern void PROTO (datum_print, (DATUM * p));
104 extern DATUM_TYPE PROTO (cast2_datum, (DATUM * p));
105 extern DATUM_TYPE PROTO (cast2_to_entity, (DATUM * p));
106 extern int PROTO (cast1_to_entity, (DATUM * dp));
107 
108 #endif /* DATUM_H */
109