1 /* internal.h -- common header file for the internal CORE and SHELL APIs.
2 Copyright (C) 2003, 2004
3 National Institute of Advanced Industrial Science and Technology (AIST)
4 Registration Number H15PRO112
6 This file is part of the m17n library.
8 The m17n library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Lesser General Public License
10 as published by the Free Software Foundation; either version 2.1 of
11 the License, or (at your option) any later version.
13 The m17n library is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public
19 License along with the m17n library; if not, write to the Free
20 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
23 #ifndef _M17N_INTERNAL_H_
24 #define _M17N_INTERNAL_H_
27 @brief a documentation for internal.h
29 longer version of internal.h description
32 extern int m17n__core_initialized;
33 extern int m17n__shell_initialized;
34 extern int m17n__gui_initialized;
36 extern int mdebug_hook ();
38 /** Return with code RET while setting merror_code to ERR. */
40 #define MERROR(err, ret) \
42 merror_code = (err); \
48 #define MERROR_GOTO(err, label) \
51 merror_code = (err); \
57 #define MWARNING(err) \
64 #define M_CHECK_CHAR(c, ret) \
65 if ((c) < 0 || (c) > MCHAR_MAX) \
66 MERROR (MERROR_CHAR, (ret)); \
70 /** Memory allocation stuffs. */
72 /* Call a handler function for memory full situation with argument
73 ERR. ERR must be one of enum MErrorCode. By default, the
74 handler function just calls exit () with argument ERR. */
76 #define MEMORY_FULL(err) \
78 (*m17n_memory_full_handler) (err); \
83 /** The macro MTABLE_MALLOC () allocates memory (by malloc) for an
84 array of SIZE objects. The size of each object is determined by
85 the type of P. Then, it sets P to the allocated memory. ERR must
86 be one of enum MErrorCode. If the allocation fails, the macro
87 MEMORY_FULL () is called with argument ERR. */
89 #define MTABLE_MALLOC(p, size, err) \
91 int bytes = sizeof (*(p)) * (size); \
92 if (! ((p) = (void *) malloc (bytes))) \
97 /** The macro MTABLE_CALLOC() is like the macro MTABLE_MALLOC but use
98 calloc instead of malloc, thus the allocated memory are zero
101 #define MTABLE_CALLOC(p, size, err) \
103 if (! ((p) = (void *) calloc (sizeof (*(p)), size))) \
108 /** The macro MTABLE_REALLOC () changes the size of memory block
109 pointed to by P to a size suitable for an array of SIZE objects.
110 The size of each object is determined by the type of P. ERR must
111 be one of enum MErrorCode. If the allocation fails, the macro
112 MEMORY_FULL () is called with argument ERR. */
114 #define MTABLE_REALLOC(p, size, err) \
116 if (! ((p) = (void *) realloc ((p), sizeof (*(p)) * (size)))) \
121 /** The macro MTABLE_ALLOCA () allocates memory (by alloca) for an
122 array of SIZE objects. The size of each object is determined by
123 the type of P. Then, it sets P to the allocated memory. ERR must
124 be one of enum MErrorCode. If the allocation fails, the macro
125 MEMORY_FULL () is called with argument ERR. */
127 #define MTABLE_ALLOCA(p, size, err) \
129 int bytes = sizeof (*(p)) * (size); \
130 if (! ((p) = (void *) alloca (bytes))) \
132 memset ((p), 0, bytes); \
136 /** short description of MSTRUCT_MALLOC */
137 /** The macro MSTRUCT_MALLOC () allocates memory (by malloc) for an
138 object whose size is determined by the type of P, and sets P to
139 the allocated memory. ERR must be one of enum MErrorCode. If
140 the allocation fails, the macro MEMORY_FULL () is called with
143 #define MSTRUCT_MALLOC(p, err) \
145 if (! ((p) = (void *) malloc (sizeof (*(p))))) \
150 #define MSTRUCT_CALLOC(p, err) MTABLE_CALLOC ((p), 1, (err))
153 /** Extendable array. */
155 #define MLIST_RESET(list) \
159 #define MLIST_INIT1(list, mem, increment) \
161 (list)->size = (list)->used = 0; \
162 (list)->inc = (increment); \
163 (list)->mem = NULL; \
167 #define MLIST_APPEND1(list, mem, elt, err) \
169 if ((list)->inc <= 0) \
171 if ((list)->size == (list)->used) \
173 (list)->size += (list)->inc; \
174 MTABLE_REALLOC ((list)->mem, (list)->size, (err)); \
176 (list)->mem[(list)->used++] = (elt); \
180 #define MLIST_PREPEND1(list, mem, elt, err) \
182 if ((list)->inc <= 0) \
184 if ((list)->size == (list)->used) \
186 (list)->size += (list)->inc; \
187 MTABLE_REALLOC ((list)->mem, (list)->size, (err)); \
189 memmove ((list)->mem + 1, (list)->mem, \
190 sizeof *((list)->mem) * ((list)->used)); \
191 (list)->mem[0] = (elt); \
196 #define MLIST_INSERT1(list, mem, idx, len, err) \
198 while ((list)->used + (len) > (list)->size) \
200 (list)->size += (list)->inc; \
201 MTABLE_REALLOC ((list)->mem, (list)->size, (err)); \
203 memmove ((list)->mem + ((idx) + (len)), (list)->mem + (idx), \
204 (sizeof *((list)->mem)) * ((list)->used - (idx))); \
205 (list)->used += (len); \
209 #define MLIST_DELETE1(list, mem, idx, len) \
211 memmove ((list)->mem + (idx), (list)->mem + (idx) + (len), \
212 (sizeof *((list)->mem)) * ((list)->used - (idx) - (len))); \
213 (list)->used -= (len); \
217 #define MLIST_COPY1(list0, list1, mem, err) \
219 (list0)->size = (list0)->used = (list1)->used; \
221 MTABLE_MALLOC ((list0)->mem, (list0)->used, (err)); \
222 memcpy ((list0)->mem, (list1)->mem, \
223 (sizeof (list0)->mem) * (list0)->used); \
227 #define MLIST_FREE1(list, mem) \
230 free ((list)->mem); \
231 (list)->mem = NULL; \
232 (list)->size = (list)->used = 0; \
240 void (*freer) (void *);
247 /**en Reference count of the object. */
248 /**ja ¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô. */
249 unsigned ref_count : 16;
251 unsigned ref_count_extended : 1;
253 /**en A flag bit used for various perpose. */
254 /**ja ¤µ¤Þ¤¶¤Þ¤ÊÌÜŪ¤ËÍѤ¤¤é¤ì¤ë¥Õ¥é¥°¥Ó¥Ã¥È. */
258 /**en If <ref_count_extended> is zero, a function to free the
260 /**ja <ref_count_extended> ¤¬ 0 ¤Ê¤é¤Ð¥ª¥Ö¥¸¥§¥¯¥È¤ò²òÊü¤¹¤ë´Ø¿ô. */
261 void (*freer) (void *);
262 /**en If <ref_count_extended> is nonzero, a pointer to the
263 struct M17NObjectRecord. */
264 /**ja <ref_count_extended> ¤¬ 0 ¤Ç¤Ê¤±¤ì¤Ð¹½Â¤ÂÎ M17NObjectRecord ¤Ø¤Î¥Ý¥¤¥ó¥¿. */
265 M17NObjectRecord *record;
270 /** Allocate a managed object OBJECT which has freer FREE_FUNC. */
272 #define M17N_OBJECT(object, free_func, err) \
274 MSTRUCT_CALLOC ((object), (err)); \
275 ((M17NObject *) (object))->ref_count = 1; \
276 ((M17NObject *) (object))->u.freer = free_func; \
280 /**en Increment the reference count of OBJECT if the count is not
282 /**ja OBJECT ¤Î»²¾È¿ô¤¬ 0 ¤Ç¤Ê¤±¤ì¤Ð 1 Áý¤ä¤¹. */
284 #define M17N_OBJECT_REF(object) \
286 if (((M17NObject *) (object))->ref_count_extended) \
287 m17n_object_ref (object); \
288 else if (((M17NObject *) (object))->ref_count > 0) \
290 ((M17NObject *) (object))->ref_count++; \
291 if (! ((M17NObject *) (object))->ref_count) \
293 ((M17NObject *) (object))->ref_count--; \
294 m17n_object_ref (object); \
300 #define M17N_OBJECT_REF_NTIMES(object, n) \
304 if (((M17NObject *) (object))->ref_count_extended) \
305 for (i = 0; i < n; i++) \
306 m17n_object_ref (object); \
307 else if (((M17NObject *) (object))->ref_count > 0) \
309 int orig_ref_count = ((M17NObject *) (object))->ref_count; \
311 for (i = 0; i < n; i++) \
312 if (! ++((M17NObject *) (object))->ref_count) \
314 ((M17NObject *) (object))->ref_count = orig_ref_count; \
315 for (i = 0; i < n; i++) \
316 m17n_object_ref (object); \
322 /**en Decrement the reference count of OBJECT if the count is greater
323 than 0. In that case, if the count becomes 0, free OBJECT. */
324 /**ja OBJECT ¤Î»²¾È¿ô¤¬ 0 ¤è¤êÂ礤±¤ì¤Ð 1 ¸º¤é¤¹¡£¸º¤é¤·¤Æ 0 ¤Ë¤Ê¤ì¤Ð
325 OBJECT ¤ò²òÊü¤¹¤ë. */
327 #define M17N_OBJECT_UNREF(object) \
331 if (((M17NObject *) (object))->ref_count_extended) \
332 m17n_object_unref (object); \
333 else if (((M17NObject *) (object))->ref_count == 0) \
335 else if (((M17NObject *) (object))->ref_count > 1) \
336 ((M17NObject *) (object))->ref_count--; \
339 if (((M17NObject *) (object))->u.freer) \
340 (((M17NObject *) (object))->u.freer) (object); \
356 extern void mdebug__register_object (M17NObjectArray *array, void *object);
358 #define M17N_OBJECT_REGISTER(array, object) \
359 if (mdebug__flag & MDEBUG_FINI) \
360 mdebug__register_object (&array, object); \
363 extern void mdebug__unregister_object (M17NObjectArray *array, void *object);
365 #define M17N_OBJECT_UNREGISTER(array, object) \
366 if (mdebug__flag & MDEBUG_FINI) \
367 mdebug__unregister_object (&array, object); \
370 extern void mdebug__report_object (char *name, M17NObjectArray *array);
380 enum MTextFormat format;
382 /**en Number of characters in the M-text */
383 /**ja M-text Ãæ¤Îʸ»ú¿ô */
386 /**en Number of bytes used to represent the characters in the M-text. */
387 /**ja M-text Ãæ¤Îʸ»ú¤òɽ¤ï¤¹¤¿¤á¤ËÍѤ¤¤é¤ì¤ë¥Ð¥¤¥È¿ô */
390 /**en Character sequence of the M-text. */
391 /**ja M-text Ãæ¤Îʸ»úÎó */
394 /**en Number of bytes allocated for the @c data member. */
395 /**ja ¥á¥ó¥Ð @c data ¤Ë³ä¤êÅö¤Æ¤é¤ì¤¿¥Ð¥¤¥È¿ô */
398 /**en Pointer to the property list of the M-text. */
399 /**ja M-text ¤Î¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤Ø¤Î¥Ý¥¤¥ó¥¿ */
400 struct MTextPlist *plist;
402 /**en Caches of the character position and the corresponding byte position. */
403 /**ja ʸ»ú°ÌÃÖ¤ª¤è¤ÓÂбþ¤¹¤ë¥Ð¥¤¥È°ÌÃ֤Υ¥ã¥Ã¥·¥å */
404 int cache_char_pos, cache_byte_pos;
407 /** short description of M_CHECK_POS */
408 /** longer description of M_CHECK_POS */
410 #define M_CHECK_POS(mt, pos, ret) \
412 if ((pos) < 0 || (pos) >= (mt)->nchars) \
413 MERROR (MERROR_RANGE, (ret)); \
417 /** short description of M_CHECK_POS_X */
418 /** longer description of M_CHECK_POS_X */
420 #define M_CHECK_POS_X(mt, pos, ret) \
422 if ((pos) < 0 || (pos) > (mt)->nchars) \
423 MERROR (MERROR_RANGE, (ret)); \
427 /** short description of M_CHECK_RANGE */
428 /** longer description of M_CHECK_RANGE */
430 #define M_CHECK_RANGE(mt, from, to, ret, ret2) \
432 if ((from) < 0 || (to) < (from) || (to) > (mt)->nchars) \
433 MERROR (MERROR_RANGE, (ret)); \
434 if ((from) == (to)) \
438 #define M_CHECK_RANGE_X(mt, from, to, ret) \
440 if ((from) < 0 || (to) < (from) || (to) > (mt)->nchars) \
441 MERROR (MERROR_RANGE, (ret)); \
445 #define M_CHECK_POS_NCHARS(mt, pos, nchars, ret, ret2) \
447 int to = (pos) + (nchars); \
449 M_CHECK_RANGE ((mt), (pos), (to), (ret), (ret2)); \
453 #define MTEXT_READ_ONLY_P(mt) ((mt)->allocated < 0)
455 #define M_CHECK_READONLY(mt, ret) \
457 if ((mt)->allocated < 0) \
458 MERROR (MERROR_MTEXT, (ret)); \
461 #define mtext_nchars(mt) ((mt)->nchars)
463 #define mtext_nbytes(mt) ((mt)->nbytes)
465 #define mtext_allocated(mt) ((mt)->allocated)
467 #define mtext_reset(mt) (mtext_del ((mt), 0, (mt)->nchars))
475 MDEBUG_CHARSET = 0x04,
476 MDEBUG_CODING = 0x08,
477 MDEBUG_DATABASE = 0x10,
478 MDEBUG_FONT = 0x0100,
479 MDEBUG_FONT_FLT = 0x0200,
480 MDEBUG_FONT_OTF = 0x0400,
481 MDEBUG_INPUT = 0x0800,
485 extern int mdebug__flag;
486 extern void mdebug__push_time ();
487 extern void mdebug__pop_time ();
488 extern void mdebug__print_time ();
490 #define MDEBUG_PRINT(msg) \
492 if (mdebug__flag & mdebug_mask) \
493 fprintf (stderr, (msg)); \
496 #define MDEBUG_PRINT1(fmt, arg) \
498 if (mdebug__flag & mdebug_mask) \
499 fprintf (stderr, (fmt), (arg)); \
502 #define MDEBUG_PRINT2(fmt, arg1, arg2) \
504 if (mdebug__flag & mdebug_mask) \
505 fprintf (stderr, (fmt), (arg1), (arg2)); \
508 #define MDEBUG_PRINT3(fmt, arg1, arg2, arg3) \
510 if (mdebug__flag & mdebug_mask) \
511 fprintf (stderr, (fmt), (arg1), (arg2), (arg3)); \
514 #define MDEBUG_PRINT4(fmt, arg1, arg2, arg3, arg4) \
516 if (mdebug__flag & mdebug_mask) \
517 fprintf (stderr, (fmt), (arg1), (arg2), (arg3), (arg4)); \
520 #define MDEBUG_PRINT5(fmt, arg1, arg2, arg3, arg4, arg5) \
522 if (mdebug__flag & mdebug_mask) \
523 fprintf (stderr, (fmt), (arg1), (arg2), (arg3), (arg4), (arg5)); \
527 #define MDEBUG_PUSH_TIME() \
529 if (mdebug__flag & mdebug_mask) \
530 mdebug__push_time (); \
534 #define MDEBUG_POP_TIME() \
536 if (mdebug__flag & mdebug_mask) \
537 mdebug__pop_time (); \
541 #define MDEBUG_PRINT_TIME(tag, ARG_LIST) \
543 if (mdebug__flag & mdebug_mask) \
545 fprintf (stderr, " [%s] ", tag); \
546 mdebug__print_time (); \
548 fprintf (stderr, "\n"); \
553 #define SWAP_16(c) (((c) >> 8) | (((c) & 0xFF) << 8))
556 (((c) >> 24) | (((c) >> 8) & 0xFF00) \
557 | (((c) & 0xFF00) << 8) | (((c) & 0xFF) << 24))
560 extern void *(*mdatabase__finder) (MSymbol tag1, MSymbol tag2,
561 MSymbol tag3, MSymbol tag4);
562 extern void *(*mdatabase__loader) (void *);
564 /* Initialize/finalize function. */
566 extern int msymbol__init ();
567 extern void msymbol__fini ();
569 extern int mplist__init ();
570 extern void mplist__fini ();
572 extern int mtext__init ();
573 extern void mtext__fini ();
575 extern int mtext__prop_init ();
576 extern void mtext__prop_fini ();
578 extern int mchartable__init ();
579 extern void mchartable__fini ();
581 extern int mcharset__init ();
582 extern void mcharset__fini ();
584 extern int mcoding__init ();
585 extern void mcoding__fini ();
587 extern int mdatabase__init (void);
588 extern void mdatabase__fini (void);
590 extern int mchar__init ();
591 extern void mchar__fini ();
593 extern int mlang__init ();
594 extern void mlang__fini ();
596 extern int mlocale__init ();
597 extern void mlocale__fini ();
599 extern int minput__init ();
600 extern void minput__fini ();
602 #endif /* _M17N_INTERNAL_H_ */