(MFATAL, USE_SAFE_ALLOCA, SAFE_ALLOCA, SAFE_FREE):
authorhanda <handa>
Wed, 17 Aug 2005 11:32:45 +0000 (11:32 +0000)
committerhanda <handa>
Wed, 17 Aug 2005 11:32:45 +0000 (11:32 +0000)
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.

src/internal.h

index f518924..8bb2318 100644 (file)
@@ -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)
+
 \f
 /** 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);
-
 \f
 
 struct MTextPlist;