X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Finternal.h;h=53ba6a5884d8b46bc5ef05c9895390c5b2f06358;hb=5ebe292a39145a079d6045b334b0bb5692e471b8;hp=53eef54b0b907bee2c39a908d12492f310143a5e;hpb=de38fd8b2d1b30976210efa1177b4a2c4ccaeb3d;p=m17n%2Fm17n-lib.git diff --git a/src/internal.h b/src/internal.h index 53eef54..53ba6a5 100644 --- a/src/internal.h +++ b/src/internal.h @@ -17,7 +17,7 @@ You should have received a copy of the GNU Lesser General Public License along with the m17n library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 02111-1307, USA. */ #ifndef _M17N_INTERNAL_H_ @@ -35,6 +35,13 @@ extern int m17n__gui_initialized; extern int mdebug_hook (); +#if ENABLE_NLS +#include +#define _(String) dgettext ("m17n-lib", String) +#else +#define _(String) (String) +#endif + /** Return with code RET while setting merror_code to ERR. */ #define MERROR(err, ret) \ @@ -60,6 +67,13 @@ extern int mdebug_hook (); goto warning; \ } while (0) +#define MFATAL(err) \ + do { \ + mdebug_hook (); \ + exit (err); \ + } while (0) + +#define MFAILP(cond) ((cond) ? 0 : mdebug_hook ()) #define M_CHECK_CHAR(c, ret) \ if ((c) < 0 || (c) > MCHAR_MAX) \ @@ -86,11 +100,10 @@ extern int mdebug_hook (); be one of enum MErrorCode. If the allocation fails, the macro MEMORY_FULL () is called with argument ERR. */ -#define MTABLE_MALLOC(p, size, err) \ - do { \ - int bytes = sizeof (*(p)) * (size); \ - if (! ((p) = (void *) malloc (bytes))) \ - MEMORY_FULL (err); \ +#define MTABLE_MALLOC(p, size, err) \ + do { \ + if (! ((p) = (void *) malloc (sizeof (*(p)) * (size)))) \ + MEMORY_FULL (err); \ } while (0) @@ -126,10 +139,10 @@ extern int mdebug_hook (); #define MTABLE_ALLOCA(p, size, err) \ do { \ - int bytes = sizeof (*(p)) * (size); \ - if (! ((p) = (void *) alloca (bytes))) \ + int allocasize = sizeof (*(p)) * (size); \ + if (! ((p) = (void *) alloca (allocasize))) \ MEMORY_FULL (err); \ - memset ((p), 0, bytes); \ + memset ((p), 0, allocasize); \ } while (0) @@ -149,6 +162,42 @@ extern int mdebug_hook (); #define MSTRUCT_CALLOC(p, err) MTABLE_CALLOC ((p), 1, (err)) +#define USE_SAFE_ALLOCA \ + int sa_must_free = 0, sa_size = 0 + +/* P must be the same in all calls to SAFE_ALLOCA and SAFE_FREE in a + function. */ + +#define SAFE_ALLOCA(P, SIZE) \ + do { \ + if (sa_size < (SIZE)) \ + { \ + if (sa_must_free) \ + (P) = realloc ((P), (SIZE)); \ + else \ + { \ + (P) = alloca ((SIZE)); \ + if (! (P)) \ + { \ + (P) = malloc (SIZE); \ + sa_must_free = 1; \ + } \ + } \ + if (! (P)) \ + MEMORY_FULL (1); \ + sa_size = (SIZE); \ + } \ + } while (0) + +#define SAFE_FREE(P) \ + do { \ + if (sa_must_free && sa_size > 0) \ + { \ + free ((P)); \ + sa_must_free = sa_size = 0; \ + } \ + } while (0) + /** Extendable array. */ @@ -245,19 +294,23 @@ typedef struct typedef struct { /**en Reference count of the object. */ + /**ja ¥ª¥Ö¥¸¥§¥¯¥È¤Î»²¾È¿ô. */ unsigned ref_count : 16; unsigned ref_count_extended : 1; /**en A flag bit used for various perpose. */ + /**ja ¤µ¤Þ¤¶¤Þ¤ÊÌÜŪ¤ËÍѤ¤¤é¤ì¤ë¥Õ¥é¥°¥Ó¥Ã¥È. */ unsigned flag : 15; union { /**en If is zero, a function to free the object. */ + /**ja ¤¬ 0 ¤Ê¤é¤Ð¥ª¥Ö¥¸¥§¥¯¥È¤ò²òÊü¤¹¤ë´Ø¿ô. */ void (*freer) (void *); /**en If is nonzero, a pointer to the struct M17NObjectRecord. */ + /**ja ¤¬ 0 ¤Ç¤Ê¤±¤ì¤Ð¹½Â¤ÂÎ M17NObjectRecord ¤Ø¤Î¥Ý¥¤¥ó¥¿. */ M17NObjectRecord *record; } u; } M17NObject; @@ -275,6 +328,7 @@ typedef struct /**en Increment the reference count of OBJECT if the count is not 0. */ +/**ja OBJECT ¤Î»²¾È¿ô¤¬ 0 ¤Ç¤Ê¤±¤ì¤Ð 1 Áý¤ä¤¹. */ #define M17N_OBJECT_REF(object) \ do { \ @@ -315,35 +369,50 @@ typedef struct /**en Decrement the reference count of OBJECT if the count is greater - than 0. In that case, if the count becomes 0, free OBJECT. */ + than 0. In that case, if the count becomes 0, free OBJECT. */ +/**ja OBJECT ¤Î»²¾È¿ô¤¬ 0 ¤è¤êÂ礭¤±¤ì¤Ð 1 ¸º¤é¤¹¡£¸º¤é¤·¤Æ 0 ¤Ë¤Ê¤ì¤Ð + OBJECT ¤ò²òÊü¤¹¤ë. */ -#define M17N_OBJECT_UNREF(object) \ - do { \ - if (object) \ - { \ - if (((M17NObject *) (object))->ref_count_extended) \ - m17n_object_unref (object); \ - else if (((M17NObject *) (object))->ref_count == 0) \ - break; \ - else if (((M17NObject *) (object))->ref_count > 1) \ - ((M17NObject *) (object))->ref_count--; \ - else \ - { \ - if (((M17NObject *) (object))->u.freer) \ - (((M17NObject *) (object))->u.freer) (object); \ - else \ - free (object); \ - } \ - } \ +#define M17N_OBJECT_UNREF(object) \ + do { \ + if (object) \ + { \ + if (((M17NObject *) (object))->ref_count_extended) \ + m17n_object_unref (object); \ + else if (((M17NObject *) (object))->ref_count == 0) \ + break; \ + else \ + { \ + ((M17NObject *) (object))->ref_count--; \ + if (((M17NObject *) (object))->ref_count == 0) \ + { \ + if (((M17NObject *) (object))->u.freer) \ + (((M17NObject *) (object))->u.freer) (object); \ + else \ + free (object); \ + (object) = NULL; \ + } \ + } \ + } \ } while (0) +typedef struct _M17NObjectArray M17NObjectArray; -typedef struct +struct _M17NObjectArray { + char *name; int count; int size, inc, used; void **objects; -} M17NObjectArray; + M17NObjectArray *next; +}; + +extern void mdebug__add_object_array (M17NObjectArray *array, char *name); + +#define M17N_OBJECT_ADD_ARRAY(array, name) \ + if (mdebug__flag & MDEBUG_FINI) \ + mdebug__add_object_array (&array, name); \ + else extern void mdebug__register_object (M17NObjectArray *array, void *object); @@ -359,17 +428,23 @@ extern void mdebug__unregister_object (M17NObjectArray *array, void *object); mdebug__unregister_object (&array, object); \ else -extern void mdebug__report_object (char *name, M17NObjectArray *array); - struct MTextPlist; +enum MTextCoverage + { + MTEXT_COVERAGE_ASCII, + MTEXT_COVERAGE_UNICODE, + MTEXT_COVERAGE_FULL + }; + struct MText { M17NObject control; - enum MTextFormat format; + unsigned format : 16; + unsigned coverage : 16; /**en Number of characters in the M-text */ /**ja M-text Ãæ¤Îʸ»ú¿ô */ @@ -471,50 +546,53 @@ enum MDebugMaskBit MDEBUG_FONT_FLT = 0x0200, MDEBUG_FONT_OTF = 0x0400, MDEBUG_INPUT = 0x0800, + MDEBUG_ALL = 0xFFFF, MDEBUG_MAX }; extern int mdebug__flag; +extern FILE *mdebug__output; extern void mdebug__push_time (); extern void mdebug__pop_time (); extern void mdebug__print_time (); -#define MDEBUG_PRINT(msg) \ +#define MDEBUG_PRINT0(FPRINTF) \ do { \ if (mdebug__flag & mdebug_mask) \ - fprintf (stderr, (msg)); \ + { \ + FPRINTF; \ + fflush (mdebug__output); \ + } \ } while (0) -#define MDEBUG_PRINT1(fmt, arg) \ - do { \ - if (mdebug__flag & mdebug_mask) \ - fprintf (stderr, (fmt), (arg)); \ - } while (0) +#define MDEBUG_PRINT(msg) \ + MDEBUG_PRINT0 (fprintf (mdebug__output, "%s", (msg))) -#define MDEBUG_PRINT2(fmt, arg1, arg2) \ - do { \ - if (mdebug__flag & mdebug_mask) \ - fprintf (stderr, (fmt), (arg1), (arg2)); \ - } while (0) +#define MDEBUG_PRINT1(fmt, arg) \ + MDEBUG_PRINT0 (fprintf (mdebug__output, (fmt), (arg))) -#define MDEBUG_PRINT3(fmt, arg1, arg2, arg3) \ - do { \ - if (mdebug__flag & mdebug_mask) \ - fprintf (stderr, (fmt), (arg1), (arg2), (arg3)); \ - } while (0) +#define MDEBUG_PRINT2(fmt, arg1, arg2) \ + MDEBUG_PRINT0 (fprintf (mdebug__output, (fmt), (arg1), (arg2))) -#define MDEBUG_PRINT4(fmt, arg1, arg2, arg3, arg4) \ - do { \ - if (mdebug__flag & mdebug_mask) \ - fprintf (stderr, (fmt), (arg1), (arg2), (arg3), (arg4)); \ - } while (0) +#define MDEBUG_PRINT3(fmt, arg1, arg2, arg3) \ + MDEBUG_PRINT0 (fprintf (mdebug__output, (fmt), (arg1), (arg2), (arg3))) -#define MDEBUG_PRINT5(fmt, arg1, arg2, arg3, arg4, arg5) \ - do { \ - if (mdebug__flag & mdebug_mask) \ - fprintf (stderr, (fmt), (arg1), (arg2), (arg3), (arg4), (arg5)); \ - } while (0) +#define MDEBUG_PRINT4(fmt, arg1, arg2, arg3, arg4) \ + MDEBUG_PRINT0 (fprintf (mdebug__output, (fmt), (arg1), (arg2), (arg3), (arg4))) +#define MDEBUG_PRINT5(fmt, arg1, arg2, arg3, arg4, arg5) \ + MDEBUG_PRINT0 (fprintf (mdebug__output, (fmt), (arg1), (arg2), (arg3), (arg4), (arg5))) + +#define MDEBUG_DUMP(prefix, postfix, call) \ + do { \ + if (mdebug__flag & mdebug_mask) \ + { \ + fprintf (mdebug__output, "%s", prefix); \ + call; \ + fprintf (mdebug__output, "%s", postfix); \ + fflush (mdebug__output); \ + } \ + } while (0) #define MDEBUG_PUSH_TIME() \ do { \ @@ -530,15 +608,15 @@ extern void mdebug__print_time (); } while (0) -#define MDEBUG_PRINT_TIME(tag, ARG_LIST) \ - do { \ - if (mdebug__flag & mdebug_mask) \ - { \ - fprintf (stderr, " [%s] ", tag); \ - mdebug__print_time (); \ - fprintf ARG_LIST; \ - fprintf (stderr, "\n"); \ - } \ +#define MDEBUG_PRINT_TIME(tag, ARG_LIST) \ + do { \ + if (mdebug__flag & mdebug_mask) \ + { \ + fprintf (mdebug__output, " [%s] ", tag); \ + mdebug__print_time (); \ + fprintf ARG_LIST; \ + fprintf (mdebug__output, "\n"); \ + } \ } while (0)