]> git.decadent.org.uk Git - ion3.git/blob - libextl/private.h
[svn-inject] Installing original source of ion3
[ion3.git] / libextl / private.h
1 /*
2  * libextl/private.h
3  *
4  * Copyright (c) Tuomo Valkonen 2004-2005.
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  */
11
12 #ifndef LIBEXTL_PRIVATE_H
13 #define LIBEXTL_PRIVATE_H
14
15 #include <libtu/types.h>
16 #include <libtu/misc.h>
17 #include <libtu/locale.h>
18 #include <libtu/output.h>
19 #include <libtu/debug.h>
20 #include <libtu/objp.h>
21
22 #include "types.h"
23
24 /*
25  * String routines
26  */
27
28 #define extl_scopy(S) scopy(S)
29 #define extl_scopyn(S, N) scopyn(S, N)
30 #define extl_scat3(S1, S2, S3) scat3(S1, S2, S3)
31 #define extl_asprintf libtu_asprintf
32
33 /*
34  * Error display
35  */
36
37 #if 1
38 #include <libtu/errorlog.h>
39 #define EXTL_LOG_ERRORS
40 /* This part has not been abstracted away from libtu dependence. */
41 #endif
42
43 #define extl_warn warn
44 #define extl_warn_err_obj(NM) warn_err_obj(NM)
45
46 /*#define extl_warn(FMT, ...)
47     ({fprintf(stderr, FMT, __VA_ARGS__); fputc('\n', stderr);})*/
48 /*#define extl_warn_obj_err(O) perror(O) */
49
50 /* 
51  * Level2 type checking
52  */
53
54 /* Always returns FALSE. */
55 extern bool extl_obj_error(int ndx, const char *got, const char *wanted);
56
57 #define EXTL_CHKO1(IN, NDX, TYPE)                          \
58     (OBJ_IS(IN[NDX].o, TYPE)                               \
59      ? TRUE                                                \
60      : extl_obj_error(NDX, OBJ_TYPESTR(IN[NDX].o), #TYPE))
61
62 #define EXTL_CHKO(IN, NDX, TYPE)                           \
63     (IN[NDX].o==NULL || OBJ_IS(IN[NDX].o, TYPE)            \
64      ? TRUE                                                \
65      : extl_obj_error(NDX, OBJ_TYPESTR(IN[NDX].o), #TYPE))
66
67 #define EXTL_DEFCLASS(C) INTRCLASS(C)
68
69
70 /*
71  * Objects.
72  */
73
74 typedef Watch ExtlProxy;
75
76 #define EXTL_OBJ_CACHED(OBJ) ((OBJ)->flags&OBJ_EXTL_CACHED)
77 #define EXTL_OBJ_OWNED(OBJ) ((OBJ)->flags&OBJ_EXTL_OWNED)
78 #define EXTL_OBJ_TYPENAME(OBJ) OBJ_TYPESTR(OBJ)
79 #define EXTL_OBJ_IS(OBJ, NAME) obj_is_str(OBJ, NAME)
80
81 #define EXTL_PROXY_OBJ(PROXY) ((PROXY)->obj)
82
83 #define EXTL_BEGIN_PROXY_OBJ(PROXY, OBJ)       \
84     watch_init(PROXY);                         \
85     watch_setup(PROXY, OBJ, obj_dest_handler); \
86     (OBJ)->flags|=OBJ_EXTL_CACHED;
87
88 #define EXTL_END_PROXY_OBJ(PROXY, OBJ) \
89     assert((PROXY)->obj==OBJ);         \
90     watch_reset(PROXY);                \
91     (OBJ)->flags&=~OBJ_EXTL_CACHED;
92
93 #define EXTL_DESTROY_OWNED_OBJ(OBJ) destroy_obj(OBJ)
94
95 extern void extl_uncache(Obj *obj);
96
97 static void obj_dest_handler(Watch *watch, Obj *obj)
98 {
99     extl_uncache(obj);
100     obj->flags&=~OBJ_EXTL_CACHED;
101 }
102
103
104 /* 
105  * Miscellaneous.
106  */
107
108 /* Translate string X to locale. */
109 /*#define TR(X) X */
110
111 /* Debugging. */
112 /*#define D(X) */
113
114
115 #endif /* LIBEXTL_PRIVATE_H */