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_
extern int mdebug_hook ();
+#if ENABLE_NLS
+#include <libintl.h>
+#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) \
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) \
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)
#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)
#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. */
/**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);
mdebug__unregister_object (&array, object); \
else
-extern void mdebug__report_object (char *name, M17NObjectArray *array);
-
\f
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 Ãæ¤Îʸ»ú¿ô */
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 { \
} 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)