From: handa Date: Wed, 17 Aug 2005 11:32:45 +0000 (+0000) Subject: (MFATAL, USE_SAFE_ALLOCA, SAFE_ALLOCA, SAFE_FREE): X-Git-Tag: REL-1-3-0~293 X-Git-Url: http://git.chise.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8ff251f5b71d5b1564998087274d4aee57ea5444;p=m17n%2Fm17n-lib.git (MFATAL, USE_SAFE_ALLOCA, SAFE_ALLOCA, SAFE_FREE): New macros. (M17N_OBJECT_UNREF): Change "if ... else ..." structure. (struct _M17NObjectArray): New member name and next. (mdebug__add_object_array): Extern it. (M17N_OBJECT_ADD_ARRAY): New macro. (mdebug__report_object): Don't extern it. --- diff --git a/src/internal.h b/src/internal.h index f518924..8bb2318 100644 --- a/src/internal.h +++ b/src/internal.h @@ -60,6 +60,11 @@ extern int mdebug_hook (); goto warning; \ } while (0) +#define MFATAL(err) \ + do { \ + mdebug_hook (); \ + exit (err); \ + } while (0) #define M_CHECK_CHAR(c, ret) \ if ((c) < 0 || (c) > MCHAR_MAX) \ @@ -149,6 +154,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. */ @@ -324,34 +365,46 @@ typedef struct /**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); \ - (object) = NULL; \ - } \ - } \ +#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); @@ -367,8 +420,6 @@ 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;