73450dc6a7bed28534a7cf6305caba345a6534e7
[chise/concord.git] / cos-i.h
1 /* Internal definitions of CONCORD Object System
2
3    Copyright (C) 2013 MORIOKA Tomohiko
4    This file is part of the CONCORD Library.
5
6    The CONCORD Library is free software; you can redistribute it and/or
7    modify it under the terms of the GNU Lesser General Public
8    License as published by the Free Software Foundation; either
9    version 2.1 of the License, or (at your option) any later version.
10
11    The CONCORD Library is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
15
16    You should have received a copy of the GNU Lesser General Public
17    License along with the CONCORD Library; if not, write to the Free
18    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19    02111-1307 USA.  */
20
21 #ifndef _COS_I_H
22 #define _COS_I_H
23
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27 #if 0
28 }
29 #endif
30
31 #include "sysdep.h"
32 #include "concord.h"
33 #include "cos.h"
34
35 #ifndef SIZEOF_COS_INT
36 # define SIZEOF_COS_INT SIZEOF_VOID_P
37 #endif
38
39 #ifndef SIZEOF_INT
40 # define SIZEOF_INT (sizeof (int))
41 #endif
42
43 #ifndef SIZEOF_LONG
44 # define SIZEOF_LONG (sizeof (long))
45 #endif
46
47 #ifndef SIZEOF_LONG_LONG
48 # define SIZEOF_LONG_LONG (sizeof (long long))
49 #endif
50
51 #ifndef COS_INT
52 # if SIZEOF_COS_INT == SIZEOF_LONG
53 #  define COS_INT long
54 # elif SIZEOF_COS_INT == SIZEOF_INT
55 #  define COS_INT int
56 # elif SIZEOF_COS_INT == SIZEOF_LONG_LONG
57 #  define COS_INT long long
58 # else
59 #  error Unable to determine suitable type for COS_INT
60 # endif
61 #endif
62
63 #ifndef COS_UINT
64 # define COS_UINT unsigned COS_INT
65 #endif
66
67 #define BITS_PER_COS_INT (SIZEOF_COS_INT * BITS_PER_CHAR)
68
69
70 enum COS_Type {
71   COS_Type_Entity,
72   COS_Type_Int_Even,
73   COS_Type_Char,
74   COS_Type_Int_Odd
75 };
76
77 #define COS_POINTER_TYPE_P(type) ((type) == COS_Type_Entity)
78
79 #define COS_TYPE_BITS  2
80 #define COS_INT_TYPE_BITS  1
81
82 #define COS_INT_VAL_BITS (BITS_PER_COS_INT - COS_INT_TYPE_BITS)
83 #define COS_VAL_BITS (BITS_PER_COS_INT - COS_TYPE_BITS)
84 #define COS_INT_MAX ((COS_INT) ((1UL << (COS_INT_VAL_BITS - 1)) -1UL))
85 #define COS_INT_MIN (-(COS_INT_MAX) - 1)
86
87
88 typedef struct COS_Object_Header
89 {
90   unsigned char prefix;
91   unsigned char type;
92   COS_INT       reference_count;
93 } COS_Object_Header;
94
95 #define COS_OBJECT_PREFIX_OBJECT          0
96
97 enum COS_Object_Type {
98   COS_Object_Type_NULL,
99   COS_Object_Type_C_String,
100   COS_Object_Type_int,
101   COS_Object_Type_char,
102   COS_Object_Type_String,
103   COS_Object_Type_Symbol,
104   COS_Object_Type_Cons,
105   COS_Object_Type_Container,
106   COS_Object_Type_Sexp,
107   COS_Object_Type_Binary,
108   COS_Object_Type_DS,
109   COS_Object_Type_Genre,
110   COS_Object_Type_Feature,
111   COS_Object_Type_Feature_INDEX,
112   COS_Object_Type_DB_Object
113 };
114
115 #define COS_FAT_OBJECT_TYPE_MIN COS_Object_Type_String
116 #define COS_OBJECT_TYPE_MAX COS_Object_Type_DB_Object
117
118 extern int (*COS_Object_release_function_table[]) (COS_Object);
119
120 struct COS_Object_ent
121 {
122   COS_Object_Header header;
123 };
124
125 COS_Object cos_allocate_object_0 (enum COS_Object_Type type,
126                                   size_t size);
127
128 #define COS_ALLOCATE_OBJECT(type) \
129   ((COS_##type)cos_allocate_object_0(COS_Object_Type_##type, \
130                                      sizeof(COS_##type##_ent)))
131
132 #define COS_OBJECT_INT_P(obj) \
133   ((COS_UINT)(obj) & 1)
134
135 #define COS_OBJECT_CHAR_P(obj) \
136   ((COS_UINT)(obj) & 2)
137
138 #define COS_OBJECT_C_STRING_P(obj) \
139   ((obj != NULL) \
140    && (((unsigned char *)obj)[0] != COS_OBJECT_PREFIX_OBJECT))
141
142 #define COS_OBJECT_P(obj) \
143   ((obj != NULL) \
144    && (!COS_OBJECT_INT_P (obj)) \
145    && (!COS_OBJECT_CHAR_P (obj)) \
146    && (((unsigned char *)obj)[0] == COS_OBJECT_PREFIX_OBJECT))
147
148 #define COS_OBJECT_TYPE_P(obj, TYPE) \
149   (COS_OBJECT_P (obj) \
150    && (((COS_Object)obj)->header.type == COS_Object_Type_##TYPE))
151
152 #define COS_OBJECT_STRING_P(obj) \
153   COS_OBJECT_TYPE_P (obj, String)
154
155 #define COS_OBJECT_SYMBOL_P(obj) \
156   COS_OBJECT_TYPE_P (obj, Symbol)
157
158 #define COS_OBJECT_CONS_P(obj) \
159   COS_OBJECT_TYPE_P (obj, Cons)
160
161 #define COS_OBJECT_DS_P(obj) \
162   COS_OBJECT_TYPE_P (obj, DS)
163
164 #define COS_OBJECT_GENRE_P(obj) \
165   COS_OBJECT_TYPE_P (obj, Genre)
166
167 #define COS_OBJECT_FEATURE_P(obj) \
168   COS_OBJECT_TYPE_P (obj, Feature)
169
170 #define COS_OBJECT_FEATURE_INDEX_P(obj) \
171   COS_OBJECT_TYPE_P (obj, Feature_INDEX)
172
173
174 struct COS_String_ent
175 {
176   COS_Object_Header header;
177
178   size_t size;
179   unsigned char* data;
180 };
181
182 int cos_release_string (COS_Object obj);
183
184
185 struct COS_Symbol_ent
186 {
187   COS_Object_Header header;
188
189   COS_String name;
190   COS_object value;
191 };
192
193 COS_Symbol cos_make_symbol (COS_String string);
194
195 int cos_release_symbol (COS_Object obj);
196
197
198 typedef struct COS_Symbol_Table_ent COS_Symbol_Table_ent;
199 typedef COS_Symbol_Table_ent* COS_Symbol_Table;
200
201 struct COS_Symbol_Table_ent
202 {
203   size_t size;
204   COS_Symbol* data;
205 };
206
207 COS_Symbol_Table cos_make_symbol_table (void);
208
209 int cos_symbol_table_grow (COS_Symbol_Table table);
210
211 void cos_destroy_symbol_table (COS_Symbol_Table table);
212
213 int cos_symbol_table_set (COS_Symbol_Table table, COS_Symbol symbol);
214
215 COS_Symbol
216 cos_symbol_table_intern (COS_Symbol_Table table, COS_object name);
217
218
219 struct COS_Cons_ent
220 {
221   COS_Object_Header header;
222
223   COS_object car;
224   COS_object cdr;
225 };
226
227 #define COS_CAR(obj) \
228   (((COS_Cons)(obj))->car)
229 #define COS_CDR(obj) \
230   (((COS_Cons)(obj))->cdr)
231
232 int cos_release_cons (COS_Object obj);
233
234
235 struct COS_Container_ent
236 {
237   COS_Object_Header header;
238
239   COS_Object type;
240   size_t size;
241   size_t len;
242   size_t offset;
243   COS_Object* data;
244 };
245
246 int cos_release_container (COS_Object obj);
247
248
249 struct COS_Sexp_ent
250 {
251   COS_Object_Header header;
252
253   size_t len;
254   char* data;
255 };
256
257 int cos_release_sexp (COS_Object obj);
258
259
260 struct COS_Binary_ent
261 {
262   COS_Object_Header header;
263
264   size_t len;
265   unsigned char* data;
266 };
267
268 int cos_release_binary (COS_Object obj);
269
270
271 int cos_release_ds (COS_Object obj);
272
273
274 int cos_release_genre (COS_Object obj);
275
276 int concord_close_genre (COS_Genre genre);
277
278
279 int cos_release_feature (COS_Object obj);
280
281 int concord_close_feature (COS_Feature feature);
282
283
284 int cos_release_index (COS_Object obj);
285
286 int concord_close_index (COS_Feature_INDEX table);
287
288
289 struct COS_DB_Object_ent
290 {
291   COS_Object_Header header;
292
293   COS_Feature feature;
294   COS_Object id;
295 };
296
297 int cos_release_db_object (COS_Object obj);
298
299 #if 0
300 {
301 #endif
302 #ifdef __cplusplus
303 }
304 #endif
305
306 #endif /* !_COS_I_H */