1 /*
2 
3     MPDM - Minimum Profit Data Manager
4 
5     ttcdt <dev@triptico.com> et al.
6 
7     This software is released into the public domain.
8     NO WARRANTY. See file LICENSE for details.
9 
10 */
11 
12 #ifndef MPDM_H_
13 #define MPDM_H_
14 
15 #ifdef __cplusplus
16 extern "C" {
17 #endif
18 
19 typedef enum {
20     MPDM_TYPE_NULL,
21     MPDM_TYPE_STRING,
22     MPDM_TYPE_ARRAY,
23     MPDM_TYPE_OBJECT,
24     MPDM_TYPE_FILE,
25     MPDM_TYPE_MBS,
26     MPDM_TYPE_REGEX,
27     MPDM_TYPE_MUTEX,
28     MPDM_TYPE_SEMAPHORE,
29     MPDM_TYPE_THREAD,
30     MPDM_TYPE_FUNCTION,
31     MPDM_TYPE_PROGRAM,
32     MPDM_TYPE_INTEGER,
33     MPDM_TYPE_REAL
34 } mpdm_type_t;
35 
36 /* mpdm values */
37 typedef struct mpdm_val *mpdm_t;
38 
39 /* a value */
40 struct mpdm_val {
41     mpdm_type_t type;   /* value type */
42     int ref;            /* reference count */
43     int size;           /* data size */
44     const void *data;   /* the real data */
45 };
46 
47 /* function typedefs */
48 typedef mpdm_t mpdm_func1_t(mpdm_t);
49 typedef mpdm_t mpdm_func2_t(mpdm_t, mpdm_t);
50 typedef mpdm_t mpdm_func3_t(mpdm_t, mpdm_t, mpdm_t);
51 
52 /* value type testing macros */
53 
54 #define MPDM_CAN_EXEC(v)    (mpdm_type(v) == MPDM_TYPE_FUNCTION || \
55                              mpdm_type(v) == MPDM_TYPE_PROGRAM  || \
56                              mpdm_type(v) == MPDM_TYPE_FILE)
57 
58 #define MPDM_CAN_GET(v)     (mpdm_type(v) == MPDM_TYPE_FUNCTION || \
59                              mpdm_type(v) == MPDM_TYPE_PROGRAM || \
60                              mpdm_type(v) == MPDM_TYPE_ARRAY || \
61                              mpdm_type(v) == MPDM_TYPE_OBJECT)
62 
63 /* value creation utility macros */
64 
65 #define MPDM_A(n)       mpdm_new_a(n)
66 #define MPDM_O()        mpdm_new_o()
67 #define MPDM_S(s)       mpdm_new_wcs(s, -1, 1)
68 #define MPDM_NS(s,n)    mpdm_new_wcs(s, n, 1)
69 #define MPDM_ENS(s,n)   mpdm_new_wcs(s, n, 0)
70 #define MPDM_C(t,p,s)   mpdm_new_copy(t, p, s)
71 
72 #define MPDM_I(i)       mpdm_new_i((i))
73 #define MPDM_R(r)       mpdm_new_r((r))
74 #define MPDM_MBS(s)     mpdm_new_mbstowcs(s, -1)
75 #define MPDM_NMBS(s,n)  mpdm_new_mbstowcs(s, n)
76 #define MPDM_2MBS(s)    mpdm_new_wcstombs(s)
77 
78 #define MPDM_X(f)       mpdm_new_x(MPDM_TYPE_FUNCTION, (const void *)f, NULL)
79 #define MPDM_X2(f,a)    mpdm_new_x(MPDM_TYPE_PROGRAM, (const void *)f, a)
80 
81 #define MPDM_F(f)       mpdm_new_f(f)
82 
83 extern mpdm_func1_t *mpdm_destroy;
84 
85 /* virtual call information for types */
86 struct mpdm_type_vc {
87     wchar_t *name;
88     mpdm_t (*destroy)(mpdm_t);
89     int (*is_true)(mpdm_t);
90     int (*count)(mpdm_t);
91     mpdm_t (*get_i)(mpdm_t, int);
92     mpdm_t (*get)(mpdm_t, mpdm_t);
93     wchar_t *(*string)(mpdm_t);
94     mpdm_t (*del_i)(mpdm_t, int);
95     mpdm_t (*del)(mpdm_t, mpdm_t);
96     mpdm_t (*set_i)(mpdm_t, mpdm_t, int);
97     mpdm_t (*set)(mpdm_t, mpdm_t, mpdm_t);
98     mpdm_t (*exec)(mpdm_t, mpdm_t, mpdm_t);
99     int (*iterator)(mpdm_t, int *, mpdm_t *, mpdm_t *);
100     mpdm_t (*map)(mpdm_t, mpdm_t, mpdm_t);
101 };
102 
103 mpdm_t vc_default_destroy(mpdm_t v);
104 int vc_default_is_true(mpdm_t v);
105 int vc_default_count(mpdm_t v);
106 mpdm_t vc_default_get_i(mpdm_t v, int i);
107 mpdm_t vc_default_get(mpdm_t v, mpdm_t i);
108 wchar_t *vc_default_string(mpdm_t v);
109 mpdm_t vc_default_del_i(mpdm_t v, int i);
110 mpdm_t vc_default_del(mpdm_t v, mpdm_t i);
111 mpdm_t vc_default_set_i(mpdm_t v, mpdm_t e, int i);
112 mpdm_t vc_default_set(mpdm_t v, mpdm_t e, mpdm_t i);
113 mpdm_t vc_default_exec(mpdm_t c, mpdm_t args, mpdm_t ctxt);
114 int vc_default_iterator(mpdm_t set, int *context, mpdm_t *v, mpdm_t *i);
115 mpdm_t vc_default_map(mpdm_t set, mpdm_t filter, mpdm_t ctxt);
116 
117 struct mpdm_type_vc *mpdm_type_vc_by_t(mpdm_type_t t);
118 struct mpdm_type_vc *mpdm_type_vc(mpdm_t);
119 mpdm_t mpdm_real_destroy(mpdm_t v);
120 mpdm_t mpdm_new(mpdm_type_t type, const void *data, int size);
121 mpdm_type_t mpdm_type(mpdm_t v);
122 wchar_t *mpdm_type_wcs(mpdm_t v);
123 mpdm_t mpdm_ref(mpdm_t v);
124 mpdm_t mpdm_unref(mpdm_t v);
125 mpdm_t mpdm_unrefnd(mpdm_t v);
126 int mpdm_size(const mpdm_t v);
127 mpdm_t mpdm_root(void);
128 mpdm_t mpdm_void(mpdm_t v);
129 int mpdm_is_null(mpdm_t v);
130 mpdm_t mpdm_store(mpdm_t *v, mpdm_t w);
131 mpdm_t mpdm_new_copy(mpdm_type_t type, void *ptr, int size);
132 int mpdm_wrap_pointers(mpdm_t v, int offset, int *del);
133 int mpdm_startup(void);
134 void mpdm_shutdown(void);
135 
136 extern wchar_t * (*mpdm_dump_1) (const mpdm_t v, int l, wchar_t *ptr, int *size);
137 wchar_t *mpdm_dumper_wcs(mpdm_t v, int *size);
138 mpdm_t mpdm_dumper(const mpdm_t v);
139 void mpdm_dump(const mpdm_t v);
140 
141 mpdm_t mpdm_new_a(int size);
142 mpdm_t mpdm_expand(mpdm_t a, int index, int num);
143 mpdm_t mpdm_collapse(mpdm_t a, int index, int num);
144 mpdm_t mpdm_set_i(mpdm_t a, mpdm_t e, int index);
145 mpdm_t mpdm_ins(mpdm_t a, mpdm_t e, int index);
146 mpdm_t mpdm_del_i(mpdm_t a, int index);
147 mpdm_t mpdm_shift(mpdm_t a);
148 mpdm_t mpdm_push(mpdm_t a, mpdm_t e);
149 mpdm_t mpdm_pop(mpdm_t a);
150 mpdm_t mpdm_queue(mpdm_t a, mpdm_t e, int size);
151 mpdm_t mpdm_clone(const mpdm_t v);
152 int mpdm_seek_wcs(const mpdm_t a, const wchar_t *v, int step);
153 int mpdm_seek(const mpdm_t a, const mpdm_t v, int step);
154 int mpdm_bseek_wcs(const mpdm_t a, const wchar_t *v, int step, int *pos);
155 int mpdm_bseek(const mpdm_t a, const mpdm_t v, int step, int *pos);
156 mpdm_t mpdm_sort(mpdm_t a, int step);
157 mpdm_t mpdm_sort_cb(mpdm_t a, int step, mpdm_t asort_cb);
158 mpdm_t mpdm_split_wcs(const mpdm_t v, const wchar_t *s);
159 mpdm_t mpdm_split(const mpdm_t a, const mpdm_t s);
160 mpdm_t mpdm_join_wcs(const mpdm_t a, const wchar_t *s);
161 mpdm_t mpdm_reverse(const mpdm_t a);
162 
163 void *mpdm_poke_2(void *dst, int *dsize, int *offset, const void *org, int osize, int esize);
164 void *mpdm_poke(void *dst, int *dsize, const void *org, int osize, int esize);
165 wchar_t *mpdm_pokewsn(wchar_t *dst, int *dsize, const wchar_t *str, int slen);
166 wchar_t *mpdm_pokews(wchar_t *dst, int *dsize, const wchar_t *str);
167 wchar_t *mpdm_pokev(wchar_t *dst, int *dsize, const mpdm_t v);
168 wchar_t *mpdm_mbstowcs(const char *str, int *s, int l);
169 char *mpdm_wcstombs(const wchar_t * str, int *s);
170 mpdm_t mpdm_new_wcs(const wchar_t *str, int size, int cpy);
171 mpdm_t mpdm_new_mbstowcs(const char *str, int l);
172 mpdm_t mpdm_new_wcstombs(const wchar_t *str);
173 mpdm_t mpdm_new_i(int ival);
174 mpdm_t mpdm_new_r(double rval);
175 wchar_t *mpdm_string(const mpdm_t v);
176 int mpdm_cmp_wcs(const mpdm_t v1, const wchar_t *v2);
177 mpdm_t mpdm_strcat_wcsn(const mpdm_t s1, const wchar_t *s2, int size);
178 mpdm_t mpdm_strcat_wcs(const mpdm_t s1, const wchar_t *s2);
179 mpdm_t mpdm_strcat(const mpdm_t s1, const mpdm_t s2);
180 int mpdm_ival_mbs(char *str);
181 int mpdm_ival(mpdm_t v);
182 double mpdm_rval_mbs(char *str);
183 double mpdm_rval(mpdm_t v);
184 mpdm_t mpdm_gettext(const mpdm_t str);
185 int mpdm_gettext_domain(const mpdm_t dom, const mpdm_t data);
186 int mpdm_wcwidth(wchar_t c);
187 mpdm_t mpdm_fmt(const mpdm_t fmt, const mpdm_t arg);
188 mpdm_t mpdm_sprintf(const mpdm_t fmt, const mpdm_t args);
189 mpdm_t mpdm_ulc(const mpdm_t s, int u);
190 mpdm_t mpdm_sscanf(const mpdm_t str, const mpdm_t fmt, int offset);
191 mpdm_t mpdm_tr(mpdm_t str, mpdm_t s1, mpdm_t s2);
192 mpdm_t mpdm_escape(mpdm_t v, wchar_t low, wchar_t high, mpdm_t f);
193 int mpdm_utf8_to_wc(wchar_t *w, int *s, char c);
194 mpdm_t mpdm_chomp(mpdm_t s);
195 
196 mpdm_t mpdm_new_o(void);
197 mpdm_t mpdm_get_wcs(const mpdm_t o, const wchar_t *i);
198 int mpdm_exists(const mpdm_t h, const mpdm_t i);
199 mpdm_t mpdm_set_wcs(mpdm_t o, mpdm_t v, const wchar_t *i);
200 
201 wchar_t *mpdm_read_mbs(FILE *f, int *s);
202 int mpdm_write_wcs(FILE * f, const wchar_t * str);
203 mpdm_t mpdm_open(mpdm_t filename, mpdm_t mode);
204 mpdm_t mpdm_read(const mpdm_t fd);
205 wchar_t *mpdm_eol(mpdm_t fd);
206 mpdm_t mpdm_getchar(const mpdm_t fd);
207 int mpdm_putchar(const mpdm_t fd, const mpdm_t c);
208 int mpdm_write(const mpdm_t fd, const mpdm_t v);
209 int mpdm_fseek(const mpdm_t fd, long offset, int whence);
210 long mpdm_ftell(const mpdm_t fd);
211 int mpdm_feof(const mpdm_t fd);
212 int mpdm_flock(mpdm_t fd, int operation);
213 FILE * mpdm_get_filehandle(const mpdm_t fd);
214 int mpdm_encoding(mpdm_t charset);
215 int mpdm_unlink(const mpdm_t filename);
216 int mpdm_rename(const mpdm_t o, const mpdm_t n);
217 mpdm_t mpdm_stat(const mpdm_t filename);
218 int mpdm_chmod(const mpdm_t filename, mpdm_t perms);
219 int mpdm_chdir(const mpdm_t dir);
220 mpdm_t mpdm_getcwd(void);
221 int mpdm_chown(const mpdm_t filename, mpdm_t uid, mpdm_t gid);
222 mpdm_t mpdm_glob(mpdm_t spec, mpdm_t base);
223 mpdm_t mpdm_popen(const mpdm_t prg, const mpdm_t mode);
224 mpdm_t mpdm_popen2(const mpdm_t prg);
225 int mpdm_pclose(mpdm_t fd);
226 mpdm_t mpdm_home_dir(void);
227 mpdm_t mpdm_app_dir(void);
228 
229 mpdm_t mpdm_connect(mpdm_t host, mpdm_t serv);
230 mpdm_t mpdm_server(mpdm_t addr, mpdm_t serv);
231 mpdm_t mpdm_accept(mpdm_t sock);
232 
233 mpdm_t mpdm_new_f(FILE * f);
234 int mpdm_close(mpdm_t fd);
235 
236 extern int mpdm_regex_offset;
237 extern int mpdm_regex_size;
238 extern int mpdm_sregex_count;
239 
240 mpdm_t mpdm_regcomp(mpdm_t r);
241 mpdm_t mpdm_regex(const mpdm_t v, const mpdm_t r, int offset);
242 mpdm_t mpdm_sregex(const mpdm_t v, const mpdm_t r, const mpdm_t s, int offset);
243 
244 void mpdm_sleep(int msecs);
245 double mpdm_time(void);
246 mpdm_t mpdm_random(mpdm_t v);
247 mpdm_t mpdm_new_mutex(void);
248 void mpdm_mutex_lock(mpdm_t mutex);
249 void mpdm_mutex_unlock(mpdm_t mutex);
250 mpdm_t mpdm_new_semaphore(int init_value);
251 void mpdm_semaphore_wait(mpdm_t sem);
252 void mpdm_semaphore_post(mpdm_t sem);
253 mpdm_t mpdm_exec_thread(mpdm_t c, mpdm_t args, mpdm_t ctxt);
254 unsigned char *mpdm_gzip_inflate(unsigned char *cbuf, size_t cz, size_t *dz);
255 unsigned char *mpdm_read_tar_mem(const char *fn, const char *tar,
256                                  const char *tar_e, size_t *z);
257 unsigned char *mpdm_read_tar_file(const char *fn, FILE *f, size_t *z);
258 unsigned char *mpdm_read_zip_mem(const char *fn, const char *zip,
259                                  const char *zip_e, size_t *z);
260 unsigned char *mpdm_read_zip_file(const char *fn, FILE *f, size_t *z);
261 unsigned char *mpdm_read_arch_mem(const char *fn, const char *arch,
262                                   const char *arch_e, size_t *z);
263 mpdm_t mpdm_read_arch_mem_s(mpdm_t fn, const char *arch, const char *arch_e);
264 unsigned char *mpdm_read_arch_file(const char *fn, FILE *f, size_t *z);
265 mpdm_t mpdm_read_arch_file_s(mpdm_t fn, mpdm_t fd);
266 mpdm_t mpdm_md5(mpdm_t v);
267 
268 int mpdm_is_true(mpdm_t v);
269 mpdm_t mpdm_bool(int b);
270 mpdm_t mpdm_new_x(mpdm_type_t type, const void *f, mpdm_t a);
271 int mpdm_count(mpdm_t v);
272 mpdm_t mpdm_get_i(const mpdm_t a, int index);
273 mpdm_t mpdm_get(mpdm_t set, mpdm_t i);
274 mpdm_t mpdm_del(mpdm_t set, mpdm_t i);
275 mpdm_t mpdm_set(mpdm_t set, mpdm_t v, mpdm_t i);
276 mpdm_t mpdm_exec(mpdm_t c, mpdm_t args, mpdm_t ctxt);
277 mpdm_t mpdm_exec_1(mpdm_t c, mpdm_t a1, mpdm_t ctxt);
278 mpdm_t mpdm_exec_2(mpdm_t c, mpdm_t a1, mpdm_t a2, mpdm_t ctxt);
279 mpdm_t mpdm_exec_3(mpdm_t c, mpdm_t a1, mpdm_t a2, mpdm_t a3, mpdm_t ctxt);
280 int mpdm_iterator(mpdm_t set, int *context, mpdm_t *v, mpdm_t *i);
281 mpdm_t mpdm_map(mpdm_t set, mpdm_t filter, mpdm_t ctxt);
282 mpdm_t mpdm_omap(mpdm_t set, mpdm_t filter, mpdm_t ctxt);
283 mpdm_t mpdm_grep(mpdm_t set, mpdm_t filter, mpdm_t ctxt);
284 mpdm_t mpdm_join(const mpdm_t a, const mpdm_t s);
285 mpdm_t mpdm_splice(const mpdm_t v, const mpdm_t i, int offset, int del, mpdm_t *n, mpdm_t *d);
286 int mpdm_cmp(const mpdm_t v1, const mpdm_t v2);
287 mpdm_t mpdm_multiply(mpdm_t v, mpdm_t i);
288 mpdm_t mpdm_substract(mpdm_t m, mpdm_t s);
289 
290 mpdm_t mpdm_delayed_destroy(mpdm_t v);
291 
292 
293 #ifdef MPDM_OLD_COMPAT
294 
295 /* old compatibility layer */
296 
297 mpdm_t mpdm_aset(mpdm_t a, mpdm_t e, int index);
298 mpdm_t mpdm_aget(const mpdm_t a, int index);
299 mpdm_t mpdm_adel(mpdm_t a, int index);
300 
301 #define MPDM_H(n)       MPDM_O()
302 
303 int mpdm_hsize(const mpdm_t h);
304 mpdm_t mpdm_hget_s(const mpdm_t h, const wchar_t *k);
305 mpdm_t mpdm_hget(const mpdm_t h, const mpdm_t k);
306 mpdm_t mpdm_hset(mpdm_t h, mpdm_t k, mpdm_t v);
307 mpdm_t mpdm_hset_s(mpdm_t h, const wchar_t *k, mpdm_t v);
308 mpdm_t mpdm_hdel(mpdm_t h, const mpdm_t k);
309 mpdm_t mpdm_keys(const mpdm_t h);
310 
311 #endif
312 
313 #ifdef __cplusplus
314 }
315 #endif
316 
317 #endif /* MPDM_H_ */
318