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