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