1 /* $Id$ $Revision$ */
2 /* vim:set shiftwidth=4 ts=8: */
3 
4 /*************************************************************************
5  * Copyright (c) 2011 AT&T Intellectual Property
6  * All rights reserved. This program and the accompanying materials
7  * are made available under the terms of the Eclipse Public License v1.0
8  * which accompanies this distribution, and is available at
9  * http://www.eclipse.org/legal/epl-v10.html
10  *
11  * Contributors: See CVS logs. Details at http://www.graphviz.org/
12  *************************************************************************/
13 
14 #ifdef __cplusplus
15 extern "C" {
16 #endif
17 
18 /* Lefteris Koutsofios - AT&T Labs Research */
19 
20 #ifndef _TBL_H
21 #define _TBL_H
22 #ifdef _WIN32
23 #include "mem.h"
24 #endif
25 
26 
27 
28 #define T_INTEGER 1
29 #define T_REAL    2
30 #define T_STRING  3
31 #define T_CODE    4
32 #define T_TABLE   5
33 #define T_SIZE    6
34 
35 typedef struct Tinteger_t {
36     Mheader_t head;
37     long i;
38 } Tinteger_t;
39 #define T_INTEGERSIZE sizeof (Tinteger_t)
40 typedef struct Treal_t {
41     Mheader_t head;
42     double d;
43 } Treal_t;
44 #define T_REALSIZE sizeof (Treal_t)
45 typedef struct Tstring_t {
46     Mheader_t head;
47     char s[1];
48 } Tstring_t;
49 #define T_STRINGSIZE(l) (l + Tstringoffset)
50 typedef struct Tcode_t {
51     Mheader_t head;
52     Code_t c[1];
53 } Tcode_t;
54 #define T_CODESIZE(l) (l * C_CODESIZE + Tcodeoffset)
55 typedef struct Tkv_t {
56     void *ko;
57     void *vo;
58 } Tkv_t;
59 #define T_KVSIZE sizeof (Tkv_t)
60 typedef struct Tkvlist_t {
61     long i, n;
62     Tkv_t kv[1];
63 } Tkvlist_t;
64 #define T_KVLISTSIZE(l) (l * T_KVSIZE + Tkvoffset)
65 #define T_KVLISTPTRSIZE sizeof (Tkvlist_t *)
66 typedef struct Ttable_t {
67     Mheader_t head;
68     long n, ln;
69     long time;
70     Tkvlist_t **lp;
71 } Ttable_t;
72 #define T_TABLESIZE sizeof (Ttable_t)
73 typedef struct Tkvindex_t {
74     Ttable_t *tp;
75     Tkv_t *kvp;
76     long i, j;
77 } Tkvindex_t;
78 
79 typedef void *Tobj;
80 
81 typedef struct Tonm_t { /* Object aNd Mark */
82     Tobj o;
83     long m;
84 } Tonm_t;
85 
86 #define T_ISSTRING(o)  (M_TYPEOF (o) == T_STRING)
87 #define T_ISTABLE(o)   (M_TYPEOF (o) == T_TABLE)
88 #define T_ISINTEGER(o) (M_TYPEOF (o) == T_INTEGER)
89 #define T_ISREAL(o)    (M_TYPEOF (o) == T_REAL)
90 #define T_ISNUMBER(o)  (M_TYPEOF (o) == T_REAL || M_TYPEOF (o) == T_INTEGER)
91 
92 #define Tgettype(p)    (((Mheader_t *) p)->type)
93 #define Tgettablen(p)  (((Ttable_t *) p)->n)
94 #define Tgettime(p)    (((Ttable_t *) p)->time)
95 #define Tgetstring(p)  (char *) &(((Tstring_t *) p)->s[0])
96 #define Tgetcode(p)    (Code_t *) &(((Tcode_t *) p)->c[0])
97 #define Tgetinteger(p) (((Tinteger_t *) p)->i)
98 #define Tgetreal(p)    (((Treal_t *) p)->d)
99 #define Tgetnumber(p)  (T_ISINTEGER (p) ? Tgetinteger (p) : Tgetreal (p))
100 
101 #define TCgettype(p, off)    ((Tgetcode (p) + off)->ctype)
102 #define TCgetfp(p, off)      ((Tgetcode (p) + off)->u.fp)
103 #define TCgetinteger(p, off) ((Tgetcode (p) + off)->u.i)
104 #define TCgetobject(p, off)  ((Tgetcode (p) + off)->u.o)
105 #define TCgetreal(p, off)    ((Tgetcode (p) + off)->u.d)
106 #define TCgetstring(p, off)  ((char *) &((Tgetcode (p) + off)->u.s))
107 #define TCgetnext(p, off)    ((Tgetcode (p) + off)->next)
108 #define TCgetaddr(p, off)    (Tgetcode (p) + off)
109 
110 extern long Ttime;
111 extern int Tstringoffset, Tcodeoffset, Tkvoffset;
112 extern Tobj Ttrue, Tfalse;
113 
114 void Tinit (void);
115 void Tterm (void);
116 void Tgchelper (void *);
117 void Tfreehelper (void *);
118 Tobj Tinteger (long);
119 Tobj Treal (double);
120 Tobj Tstring (char *);
121 Tobj Tcode (Code_t *, int, int);
122 Tobj Ttable (long);
123 void Tinsi (Tobj, long, Tobj);
124 void Tinsr (Tobj, double, Tobj);
125 void Tinss (Tobj, char *, Tobj);
126 void Tinso (Tobj, Tobj, Tobj);
127 Tobj Tfindi (Tobj, long);
128 Tobj Tfindr (Tobj, double);
129 Tobj Tfinds (Tobj, char *);
130 Tobj Tfindo (Tobj, Tobj);
131 void Tdeli (Tobj, long);
132 void Tdelr (Tobj, double);
133 void Tdels (Tobj, char *);
134 void Tdelo (Tobj, Tobj);
135 Tobj Tcopy (Tobj);
136 void Tgetfirst (Tobj, Tkvindex_t *);
137 void Tgetnext (Tkvindex_t *);
138 #endif /* _TBL_H */
139 
140 #ifdef __cplusplus
141 }
142 #endif
143