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) \
69 #define M_CHECK_CHAR(c, ret) \
70 if ((c) < 0 || (c) > MCHAR_MAX) \
71 MERROR (MERROR_CHAR, (ret)); \
75 /** Memory allocation stuffs. */
77 /* Call a handler function for memory full situation with argument
78 ERR. ERR must be one of enum MErrorCode. By default, the
79 handler function just calls exit () with argument ERR. */
81 #define MEMORY_FULL(err) \
83 (*m17n_memory_full_handler) (err); \
88 /** The macro MTABLE_MALLOC () allocates memory (by malloc) for an
89 array of SIZE objects. The size of each object is determined by
90 the type of P. Then, it sets P to the allocated memory. ERR must
91 be one of enum MErrorCode. If the allocation fails, the macro
92 MEMORY_FULL () is called with argument ERR. */
94 #define MTABLE_MALLOC(p, size, err) \
96 int bytes = sizeof (*(p)) * (size); \
97 if (! ((p) = (void *) malloc (bytes))) \
102 /** The macro MTABLE_CALLOC() is like the macro MTABLE_MALLOC but use
103 calloc instead of malloc, thus the allocated memory are zero
106 #define MTABLE_CALLOC(p, size, err) \
108 if (! ((p) = (void *) calloc (sizeof (*(p)), size))) \
113 /** The macro MTABLE_REALLOC () changes the size of memory block
114 pointed to by P to a size suitable for an array of SIZE objects.
115 The size of each object is determined by the type of P. ERR must
116 be one of enum MErrorCode. If the allocation fails, the macro
117 MEMORY_FULL () is called with argument ERR. */
119 #define MTABLE_REALLOC(p, size, err) \
121 if (! ((p) = (void *) realloc ((p), sizeof (*(p)) * (size)))) \
126 /** The macro MTABLE_ALLOCA () allocates memory (by alloca) for an
127 array of SIZE objects. The size of each object is determined by
128 the type of P. Then, it sets P to the allocated memory. ERR must
129 be one of enum MErrorCode. If the allocation fails, the macro
130 MEMORY_FULL () is called with argument ERR. */
132 #define MTABLE_ALLOCA(p, size, err) \
134 int bytes = sizeof (*(p)) * (size); \
135 if (! ((p) = (void *) alloca (bytes))) \
137 memset ((p), 0, bytes); \
141 /** short description of MSTRUCT_MALLOC */
142 /** The macro MSTRUCT_MALLOC () allocates memory (by malloc) for an
143 object whose size is determined by the type of P, and sets P to
144 the allocated memory. ERR must be one of enum MErrorCode. If
145 the allocation fails, the macro MEMORY_FULL () is called with
148 #define MSTRUCT_MALLOC(p, err) \
150 if (! ((p) = (void *) malloc (sizeof (*(p))))) \
155 #define MSTRUCT_CALLOC(p, err) MTABLE_CALLOC ((p), 1, (err))
157 #define USE_SAFE_ALLOCA \
158 int sa_must_free = 0, sa_size = 0
160 /* P must be the same in all calls to SAFE_ALLOCA and SAFE_FREE in a
163 #define SAFE_ALLOCA(P, SIZE) \
165 if (sa_size < (SIZE)) \
168 (P) = realloc ((P), (SIZE)); \
171 (P) = alloca ((SIZE)); \
174 (P) = malloc (SIZE); \
184 #define SAFE_FREE(P) \
186 if (sa_must_free && sa_size > 0) \
189 sa_must_free = sa_size = 0; \
194 /** Extendable array. */
196 #define MLIST_RESET(list) \
200 #define MLIST_INIT1(list, mem, increment) \
202 (list)->size = (list)->used = 0; \
203 (list)->inc = (increment); \
204 (list)->mem = NULL; \
208 #define MLIST_APPEND1(list, mem, elt, err) \
210 if ((list)->inc <= 0) \
212 if ((list)->size == (list)->used) \
214 (list)->size += (list)->inc; \
215 MTABLE_REALLOC ((list)->mem, (list)->size, (err)); \
217 (list)->mem[(list)->used++] = (elt); \
221 #define MLIST_PREPEND1(list, mem, elt, err) \
223 if ((list)->inc <= 0) \
225 if ((list)->size == (list)->used) \
227 (list)->size += (list)->inc; \
228 MTABLE_REALLOC ((list)->mem, (list)->size, (err)); \
230 memmove ((list)->mem + 1, (list)->mem, \
231 sizeof *((list)->mem) * ((list)->used)); \
232 (list)->mem[0] = (elt); \
237 #define MLIST_INSERT1(list, mem, idx, len, err) \
239 while ((list)->used + (len) > (list)->size) \
241 (list)->size += (list)->inc; \
242 MTABLE_REALLOC ((list)->mem, (list)->size, (err)); \
244 memmove ((list)->mem + ((idx) + (len)), (list)->mem + (idx), \
245 (sizeof *((list)->mem)) * ((list)->used - (idx))); \
246 (list)->used += (len); \
250 #define MLIST_DELETE1(list, mem, idx, len) \
252 memmove ((list)->mem + (idx), (list)->mem + (idx) + (len), \
253 (sizeof *((list)->mem)) * ((list)->used - (idx) - (len))); \
254 (list)->used -= (len); \
258 #define MLIST_COPY1(list0, list1, mem, err) \
260 (list0)->size = (list0)->used = (list1)->used; \
262 MTABLE_MALLOC ((list0)->mem, (list0)->used, (err)); \
263 memcpy ((list0)->mem, (list1)->mem, \
264 (sizeof (list0)->mem) * (list0)->used); \
268 #define MLIST_FREE1(list, mem) \
271 free ((list)->mem); \
272 (list)->mem = NULL; \
273 (list)->size = (list)->used = 0; \
281 void (*freer) (void *);
288 /**en Reference count of the object. */
289 /**ja ¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô. */
290 unsigned ref_count : 16;
292 unsigned ref_count_extended : 1;
294 /**en A flag bit used for various perpose. */
295 /**ja ¤µ¤Þ¤¶¤Þ¤ÊÌÜŪ¤ËÍѤ¤¤é¤ì¤ë¥Õ¥é¥°¥Ó¥Ã¥È. */
299 /**en If <ref_count_extended> is zero, a function to free the
301 /**ja <ref_count_extended> ¤¬ 0 ¤Ê¤é¤Ð¥ª¥Ö¥¸¥§¥¯¥È¤ò²òÊü¤¹¤ë´Ø¿ô. */
302 void (*freer) (void *);
303 /**en If <ref_count_extended> is nonzero, a pointer to the
304 struct M17NObjectRecord. */
305 /**ja <ref_count_extended> ¤¬ 0 ¤Ç¤Ê¤±¤ì¤Ð¹½Â¤ÂÎ M17NObjectRecord ¤Ø¤Î¥Ý¥¤¥ó¥¿. */
306 M17NObjectRecord *record;
311 /** Allocate a managed object OBJECT which has freer FREE_FUNC. */
313 #define M17N_OBJECT(object, free_func, err) \
315 MSTRUCT_CALLOC ((object), (err)); \
316 ((M17NObject *) (object))->ref_count = 1; \
317 ((M17NObject *) (object))->u.freer = free_func; \
321 /**en Increment the reference count of OBJECT if the count is not
323 /**ja OBJECT ¤Î»²¾È¿ô¤¬ 0 ¤Ç¤Ê¤±¤ì¤Ð 1 Áý¤ä¤¹. */
325 #define M17N_OBJECT_REF(object) \
327 if (((M17NObject *) (object))->ref_count_extended) \
328 m17n_object_ref (object); \
329 else if (((M17NObject *) (object))->ref_count > 0) \
331 ((M17NObject *) (object))->ref_count++; \
332 if (! ((M17NObject *) (object))->ref_count) \
334 ((M17NObject *) (object))->ref_count--; \
335 m17n_object_ref (object); \
341 #define M17N_OBJECT_REF_NTIMES(object, n) \
345 if (((M17NObject *) (object))->ref_count_extended) \
346 for (i = 0; i < n; i++) \
347 m17n_object_ref (object); \
348 else if (((M17NObject *) (object))->ref_count > 0) \
350 int orig_ref_count = ((M17NObject *) (object))->ref_count; \
352 for (i = 0; i < n; i++) \
353 if (! ++((M17NObject *) (object))->ref_count) \
355 ((M17NObject *) (object))->ref_count = orig_ref_count; \
356 for (i = 0; i < n; i++) \
357 m17n_object_ref (object); \
363 /**en Decrement the reference count of OBJECT if the count is greater
364 than 0. In that case, if the count becomes 0, free OBJECT. */
365 /**ja OBJECT ¤Î»²¾È¿ô¤¬ 0 ¤è¤êÂ礤±¤ì¤Ð 1 ¸º¤é¤¹¡£¸º¤é¤·¤Æ 0 ¤Ë¤Ê¤ì¤Ð
366 OBJECT ¤ò²òÊü¤¹¤ë. */
368 #define M17N_OBJECT_UNREF(object) \
372 if (((M17NObject *) (object))->ref_count_extended) \
373 m17n_object_unref (object); \
374 else if (((M17NObject *) (object))->ref_count == 0) \
378 ((M17NObject *) (object))->ref_count--; \
379 if (((M17NObject *) (object))->ref_count == 0) \
381 if (((M17NObject *) (object))->u.freer) \
382 (((M17NObject *) (object))->u.freer) (object); \
391 typedef struct _M17NObjectArray M17NObjectArray;
393 struct _M17NObjectArray
399 M17NObjectArray *next;
402 extern void mdebug__add_object_array (M17NObjectArray *array, char *name);
404 #define M17N_OBJECT_ADD_ARRAY(array, name) \
405 if (mdebug__flag & MDEBUG_FINI) \
406 mdebug__add_object_array (&array, name); \
409 extern void mdebug__register_object (M17NObjectArray *array, void *object);
411 #define M17N_OBJECT_REGISTER(array, object) \
412 if (mdebug__flag & MDEBUG_FINI) \
413 mdebug__register_object (&array, object); \
416 extern void mdebug__unregister_object (M17NObjectArray *array, void *object);
418 #define M17N_OBJECT_UNREGISTER(array, object) \
419 if (mdebug__flag & MDEBUG_FINI) \
420 mdebug__unregister_object (&array, object); \
431 enum MTextFormat format;
433 /**en Number of characters in the M-text */
434 /**ja M-text Ãæ¤Îʸ»ú¿ô */
437 /**en Number of bytes used to represent the characters in the M-text. */
438 /**ja M-text Ãæ¤Îʸ»ú¤òɽ¤ï¤¹¤¿¤á¤ËÍѤ¤¤é¤ì¤ë¥Ð¥¤¥È¿ô */
441 /**en Character sequence of the M-text. */
442 /**ja M-text Ãæ¤Îʸ»úÎó */
445 /**en Number of bytes allocated for the @c data member. */
446 /**ja ¥á¥ó¥Ð @c data ¤Ë³ä¤êÅö¤Æ¤é¤ì¤¿¥Ð¥¤¥È¿ô */
449 /**en Pointer to the property list of the M-text. */
450 /**ja M-text ¤Î¥×¥í¥Ñ¥Æ¥£¥ê¥¹¥È¤Ø¤Î¥Ý¥¤¥ó¥¿ */
451 struct MTextPlist *plist;
453 /**en Caches of the character position and the corresponding byte position. */
454 /**ja ʸ»ú°ÌÃÖ¤ª¤è¤ÓÂбþ¤¹¤ë¥Ð¥¤¥È°ÌÃ֤Υ¥ã¥Ã¥·¥å */
455 int cache_char_pos, cache_byte_pos;
458 /** short description of M_CHECK_POS */
459 /** longer description of M_CHECK_POS */
461 #define M_CHECK_POS(mt, pos, ret) \
463 if ((pos) < 0 || (pos) >= (mt)->nchars) \
464 MERROR (MERROR_RANGE, (ret)); \
468 /** short description of M_CHECK_POS_X */
469 /** longer description of M_CHECK_POS_X */
471 #define M_CHECK_POS_X(mt, pos, ret) \
473 if ((pos) < 0 || (pos) > (mt)->nchars) \
474 MERROR (MERROR_RANGE, (ret)); \
478 /** short description of M_CHECK_RANGE */
479 /** longer description of M_CHECK_RANGE */
481 #define M_CHECK_RANGE(mt, from, to, ret, ret2) \
483 if ((from) < 0 || (to) < (from) || (to) > (mt)->nchars) \
484 MERROR (MERROR_RANGE, (ret)); \
485 if ((from) == (to)) \
489 #define M_CHECK_RANGE_X(mt, from, to, ret) \
491 if ((from) < 0 || (to) < (from) || (to) > (mt)->nchars) \
492 MERROR (MERROR_RANGE, (ret)); \
496 #define M_CHECK_POS_NCHARS(mt, pos, nchars, ret, ret2) \
498 int to = (pos) + (nchars); \
500 M_CHECK_RANGE ((mt), (pos), (to), (ret), (ret2)); \
504 #define MTEXT_READ_ONLY_P(mt) ((mt)->allocated < 0)
506 #define M_CHECK_READONLY(mt, ret) \
508 if ((mt)->allocated < 0) \
509 MERROR (MERROR_MTEXT, (ret)); \
512 #define mtext_nchars(mt) ((mt)->nchars)
514 #define mtext_nbytes(mt) ((mt)->nbytes)
516 #define mtext_allocated(mt) ((mt)->allocated)
518 #define mtext_reset(mt) (mtext_del ((mt), 0, (mt)->nchars))
526 MDEBUG_CHARSET = 0x04,
527 MDEBUG_CODING = 0x08,
528 MDEBUG_DATABASE = 0x10,
529 MDEBUG_FONT = 0x0100,
530 MDEBUG_FONT_FLT = 0x0200,
531 MDEBUG_FONT_OTF = 0x0400,
532 MDEBUG_INPUT = 0x0800,
536 extern int mdebug__flag;
537 extern void mdebug__push_time ();
538 extern void mdebug__pop_time ();
539 extern void mdebug__print_time ();
541 #define MDEBUG_PRINT(msg) \
543 if (mdebug__flag & mdebug_mask) \
544 fprintf (stderr, (msg)); \
547 #define MDEBUG_PRINT1(fmt, arg) \
549 if (mdebug__flag & mdebug_mask) \
550 fprintf (stderr, (fmt), (arg)); \
553 #define MDEBUG_PRINT2(fmt, arg1, arg2) \
555 if (mdebug__flag & mdebug_mask) \
556 fprintf (stderr, (fmt), (arg1), (arg2)); \
559 #define MDEBUG_PRINT3(fmt, arg1, arg2, arg3) \
561 if (mdebug__flag & mdebug_mask) \
562 fprintf (stderr, (fmt), (arg1), (arg2), (arg3)); \
565 #define MDEBUG_PRINT4(fmt, arg1, arg2, arg3, arg4) \
567 if (mdebug__flag & mdebug_mask) \
568 fprintf (stderr, (fmt), (arg1), (arg2), (arg3), (arg4)); \
571 #define MDEBUG_PRINT5(fmt, arg1, arg2, arg3, arg4, arg5) \
573 if (mdebug__flag & mdebug_mask) \
574 fprintf (stderr, (fmt), (arg1), (arg2), (arg3), (arg4), (arg5)); \
578 #define MDEBUG_PUSH_TIME() \
580 if (mdebug__flag & mdebug_mask) \
581 mdebug__push_time (); \
585 #define MDEBUG_POP_TIME() \
587 if (mdebug__flag & mdebug_mask) \
588 mdebug__pop_time (); \
592 #define MDEBUG_PRINT_TIME(tag, ARG_LIST) \
594 if (mdebug__flag & mdebug_mask) \
596 fprintf (stderr, " [%s] ", tag); \
597 mdebug__print_time (); \
599 fprintf (stderr, "\n"); \
604 #define SWAP_16(c) (((c) >> 8) | (((c) & 0xFF) << 8))
607 (((c) >> 24) | (((c) >> 8) & 0xFF00) \
608 | (((c) & 0xFF00) << 8) | (((c) & 0xFF) << 24))
611 extern void *(*mdatabase__finder) (MSymbol tag1, MSymbol tag2,
612 MSymbol tag3, MSymbol tag4);
613 extern void *(*mdatabase__loader) (void *);
615 /* Initialize/finalize function. */
617 extern int msymbol__init ();
618 extern void msymbol__fini ();
620 extern int mplist__init ();
621 extern void mplist__fini ();
623 extern int mtext__init ();
624 extern void mtext__fini ();
626 extern int mtext__prop_init ();
627 extern void mtext__prop_fini ();
629 extern int mchartable__init ();
630 extern void mchartable__fini ();
632 extern int mcharset__init ();
633 extern void mcharset__fini ();
635 extern int mcoding__init ();
636 extern void mcoding__fini ();
638 extern int mdatabase__init (void);
639 extern void mdatabase__fini (void);
641 extern int mchar__init ();
642 extern void mchar__fini ();
644 extern int mlang__init ();
645 extern void mlang__fini ();
647 extern int mlocale__init ();
648 extern void mlocale__fini ();
650 extern int minput__init ();
651 extern void minput__fini ();
653 #endif /* _M17N_INTERNAL_H_ */