New files.
[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_Container,
105   COS_Object_Type_Sexp,
106   COS_Object_Type_Binary,
107   COS_Object_Type_DS,
108   COS_Object_Type_Genre,
109   COS_Object_Type_Feature,
110   COS_Object_Type_Feature_INDEX,
111   COS_Object_Type_DB_Object
112 };
113
114 #define COS_FAT_OBJECT_TYPE_MIN COS_Object_Type_String
115 #define COS_OBJECT_TYPE_MAX COS_Object_Type_DB_Object
116
117 extern int (*COS_Object_release_function_table[]) (COS_Object);
118
119 struct COS_Object_ent
120 {
121   COS_Object_Header header;
122 };
123
124 COS_Object cos_allocate_object_0 (enum COS_Object_Type type,
125                                   size_t size);
126
127 #define COS_ALLOCATE_OBJECT(type) \
128   ((COS_##type)cos_allocate_object_0(COS_Object_Type_##type, \
129                                      sizeof(COS_##type##_ent)))
130
131 #define COS_OBJECT_INT_P(obj) \
132   ((COS_UINT)(obj) & 1)
133
134 #define COS_OBJECT_CHAR_P(obj) \
135   ((COS_UINT)(obj) & 2)
136
137 #define COS_OBJECT_C_STRING_P(obj) \
138   ((obj != NULL) \
139    && (((unsigned char *)obj)[0] != COS_OBJECT_PREFIX_OBJECT))
140
141 #define COS_OBJECT_P(obj) \
142   ((obj != NULL) \
143    && (!COS_OBJECT_INT_P (obj)) \
144    && (!COS_OBJECT_CHAR_P (obj)) \
145    && (((unsigned char *)obj)[0] == COS_OBJECT_PREFIX_OBJECT))
146
147 #define COS_OBJECT_TYPE_P(obj, TYPE) \
148   (COS_OBJECT_P (obj) \
149    && (((COS_Object)obj)->header.type == COS_Object_Type_##TYPE))
150
151 #define COS_OBJECT_STRING_P(obj) \
152   COS_OBJECT_TYPE_P (obj, String)
153
154 #define COS_OBJECT_SYMBOL_P(obj) \
155   COS_OBJECT_TYPE_P (obj, Symbol)
156
157 #define COS_OBJECT_DS_P(obj) \
158   COS_OBJECT_TYPE_P (obj, DS)
159
160 #define COS_OBJECT_GENRE_P(obj) \
161   COS_OBJECT_TYPE_P (obj, Genre)
162
163 #define COS_OBJECT_FEATURE_P(obj) \
164   COS_OBJECT_TYPE_P (obj, Feature)
165
166 #define COS_OBJECT_FEATURE_INDEX_P(obj) \
167   COS_OBJECT_TYPE_P (obj, Feature_INDEX)
168
169
170 struct COS_String_ent
171 {
172   COS_Object_Header header;
173
174   size_t size;
175   unsigned char* data;
176 };
177
178 int cos_release_string (COS_Object obj);
179
180
181 struct COS_Symbol_ent
182 {
183   COS_Object_Header header;
184
185   COS_String name;
186   COS_object value;
187 };
188
189 COS_Symbol cos_make_symbol (COS_String string);
190
191 int cos_release_symbol (COS_Object obj);
192
193
194 typedef struct COS_Symbol_Table_ent COS_Symbol_Table_ent;
195 typedef COS_Symbol_Table_ent* COS_Symbol_Table;
196
197 struct COS_Symbol_Table_ent
198 {
199   size_t size;
200   COS_Symbol* data;
201 };
202
203 COS_Symbol_Table cos_make_symbol_table (void);
204
205 int cos_symbol_table_grow (COS_Symbol_Table table);
206
207 void cos_destroy_symbol_table (COS_Symbol_Table table);
208
209 int cos_symbol_table_set (COS_Symbol_Table table, COS_Symbol symbol);
210
211 COS_Symbol
212 cos_symbol_table_intern (COS_Symbol_Table table, COS_object name);
213
214
215 struct COS_Container_ent
216 {
217   COS_Object_Header header;
218
219   COS_Object type;
220   size_t size;
221   size_t len;
222   size_t offset;
223   COS_Object* data;
224 };
225
226 int cos_release_container (COS_Object obj);
227
228
229 struct COS_Sexp_ent
230 {
231   COS_Object_Header header;
232
233   size_t len;
234   char* data;
235 };
236
237 int cos_release_sexp (COS_Object obj);
238
239
240 struct COS_Binary_ent
241 {
242   COS_Object_Header header;
243
244   size_t len;
245   unsigned char* data;
246 };
247
248 int cos_release_binary (COS_Object obj);
249
250
251 int cos_release_ds (COS_Object obj);
252
253
254 int cos_release_genre (COS_Object obj);
255
256 int concord_close_genre (COS_Genre genre);
257
258
259 int cos_release_feature (COS_Object obj);
260
261 int concord_close_feature (COS_Feature feature);
262
263
264 int cos_release_index (COS_Object obj);
265
266 int concord_close_index (COS_Feature_INDEX table);
267
268
269 struct COS_DB_Object_ent
270 {
271   COS_Object_Header header;
272
273   COS_Feature feature;
274   COS_Object id;
275 };
276
277 int cos_release_db_object (COS_Object obj);
278
279 #if 0
280 {
281 #endif
282 #ifdef __cplusplus
283 }
284 #endif
285
286 #endif /* !_COS_I_H */