3 MPDM - Minimum Profit Data Manager
4 Copyright (C) 2003/2011 Angel Ortega <angel@triptico.com>
6 This program is free software; you can redistribute it and/or
7 modify it under the terms of the GNU General Public License
8 as published by the Free Software Foundation; either version 2
9 of the License, or (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 http://www.triptico.com
45 MPDM_STRING
= (1<<_MPDM_STRING
), /* data can be string-compared */
46 MPDM_MULTIPLE
= (1<<_MPDM_MULTIPLE
), /* data is multiple */
47 MPDM_FREE
= (1<<_MPDM_FREE
), /* free data at destroy */
48 MPDM_IVAL
= (1<<_MPDM_IVAL
), /* integer value cached in .ival */
49 MPDM_RVAL
= (1<<_MPDM_RVAL
), /* real value cached in .rval */
50 MPDM_HASH
= (1<<_MPDM_HASH
), /* data is a hash */
51 MPDM_FILE
= (1<<_MPDM_FILE
), /* data is a FILE * */
52 MPDM_EXEC
= (1<<_MPDM_EXEC
), /* data is 'executable' */
53 MPDM_REGEX
= (1<<_MPDM_REGEX
), /* data is a compiled regex */
54 MPDM_MUTEX
= (1<<_MPDM_MUTEX
), /* data is a mutex */
55 MPDM_SEMAPHORE
= (1<<_MPDM_SEMAPHORE
), /* data is a semaphore */
56 MPDM_THREAD
= (1<<_MPDM_THREAD
), /* data is a thread handle */
57 MPDM_NONDYN
= (1<<_MPDM_NONDYN
) /* data is non-dynamic (do not free()) */
61 typedef struct mpdm_val
*mpdm_t
;
65 int flags
; /* value flags */
66 int ref
; /* reference count */
67 int size
; /* data size */
68 int ival
; /* cached integer value */
69 double rval
; /* cache real value */
70 const void *data
; /* the real data */
74 /* the main control structure */
76 mpdm_t root
; /* the root hash */
77 int count
; /* total count of values */
78 int hash_buckets
; /* default hash buckets */
81 extern struct mpdm_control
*mpdm
;
83 mpdm_t
mpdm_init(mpdm_t v
, int flags
, const void *data
, int size
);
84 mpdm_t
mpdm_new(int flags
, const void *data
, int size
);
85 mpdm_t
mpdm_ref(mpdm_t v
);
86 mpdm_t
mpdm_unref(mpdm_t v
);
87 mpdm_t
mpdm_unrefnd(mpdm_t v
);
89 int mpdm_size(const mpdm_t v
);
90 mpdm_t
mpdm_clone(const mpdm_t v
);
91 mpdm_t
mpdm_root(void);
93 void mpdm_void(mpdm_t v
);
94 int mpdm_is_null(mpdm_t v
);
96 mpdm_t
mpdm_exec(mpdm_t c
, mpdm_t args
, mpdm_t ctxt
);
97 mpdm_t
mpdm_exec_1(mpdm_t c
, mpdm_t a1
, mpdm_t ctxt
);
98 mpdm_t
mpdm_exec_2(mpdm_t c
, mpdm_t a1
, mpdm_t a2
, mpdm_t ctxt
);
99 mpdm_t
mpdm_exec_3(mpdm_t c
, mpdm_t a1
, mpdm_t a2
, mpdm_t a3
, mpdm_t ctxt
);
101 mpdm_t
mpdm_new_a(int flags
, int size
);
102 mpdm_t
mpdm_aclone(const mpdm_t v
);
104 mpdm_t
mpdm_expand(mpdm_t a
, int offset
, int num
);
105 mpdm_t
mpdm_collapse(mpdm_t a
, int offset
, int num
);
106 mpdm_t
mpdm_aset(mpdm_t a
, mpdm_t e
, int offset
);
107 mpdm_t
mpdm_aget(const mpdm_t a
, int offset
);
108 mpdm_t
mpdm_ins(mpdm_t a
, mpdm_t e
, int offset
);
109 mpdm_t
mpdm_adel(mpdm_t a
, int offset
);
110 mpdm_t
mpdm_shift(mpdm_t a
);
111 mpdm_t
mpdm_push(mpdm_t a
, mpdm_t e
);
112 mpdm_t
mpdm_pop(mpdm_t a
);
113 mpdm_t
mpdm_queue(mpdm_t a
, mpdm_t e
, int size
);
114 int mpdm_seek(const mpdm_t a
, const mpdm_t k
, int step
);
115 int mpdm_seek_s(const mpdm_t a
, const wchar_t * k
, int step
);
116 int mpdm_bseek(const mpdm_t a
, const mpdm_t k
, int step
, int *pos
);
117 int mpdm_bseek_s(const mpdm_t a
, const wchar_t * k
, int step
, int *pos
);
118 mpdm_t
mpdm_sort(mpdm_t a
, int step
);
119 mpdm_t
mpdm_sort_cb(mpdm_t a
, int step
, mpdm_t asort_cb
);
121 mpdm_t
mpdm_split_s(const mpdm_t v
, const wchar_t *s
);
122 mpdm_t
mpdm_split(const mpdm_t a
, const mpdm_t s
);
123 mpdm_t
mpdm_join_s(const mpdm_t a
, const wchar_t *s
);
124 mpdm_t
mpdm_join(const mpdm_t a
, const mpdm_t s
);
126 void *mpdm_poke_o(void *dst
, int *dsize
, int *offset
, const void *org
, int osize
, int esize
);
127 void *mpdm_poke(void *dst
, int *dsize
, const void *org
, int osize
, int esize
);
128 wchar_t *mpdm_pokewsn(wchar_t *dst
, int *dsize
, const wchar_t *str
, int slen
);
129 wchar_t *mpdm_pokews(wchar_t *dst
, int *dsize
, const wchar_t *str
);
130 wchar_t *mpdm_pokev(wchar_t *dst
, int *dsize
, const mpdm_t v
);
131 wchar_t *mpdm_mbstowcs(const char *str
, int *s
, int l
);
132 char *mpdm_wcstombs(const wchar_t * str
, int *s
);
133 mpdm_t
mpdm_new_wcs(int flags
, const wchar_t * str
, int size
, int cpy
);
134 mpdm_t
mpdm_new_mbstowcs(int flags
, const char *str
, int l
);
135 mpdm_t
mpdm_new_wcstombs(int flags
, const wchar_t * str
);
136 mpdm_t
mpdm_new_i(int ival
);
137 mpdm_t
mpdm_new_r(double rval
);
138 int mpdm_wcwidth(wchar_t c
);
139 mpdm_t
mpdm_sprintf(const mpdm_t fmt
, const mpdm_t args
);
140 mpdm_t
mpdm_ulc(const mpdm_t s
, int u
);
141 mpdm_t
mpdm_sscanf(const mpdm_t str
, const mpdm_t fmt
, int offset
);
143 wchar_t *mpdm_string(const mpdm_t v
);
144 wchar_t *mpdm_string2(const mpdm_t v
, wchar_t *wtmp
);
145 mpdm_t
mpdm_splice(const mpdm_t v
, const mpdm_t i
, int offset
, int del
);
146 mpdm_t
mpdm_strcat_sn(const mpdm_t s1
, const wchar_t *s2
, int size
);
147 mpdm_t
mpdm_strcat_s(const mpdm_t s1
, const wchar_t *s2
);
148 mpdm_t
mpdm_strcat(const mpdm_t s1
, const mpdm_t s2
);
149 int mpdm_cmp(const mpdm_t v1
, const mpdm_t v2
);
150 int mpdm_cmp_s(const mpdm_t v1
, const wchar_t *v2
);
151 int mpdm_ival(mpdm_t v
);
152 double mpdm_rval(mpdm_t v
);
153 mpdm_t
mpdm_set_ival(mpdm_t v
, int ival
);
154 mpdm_t
mpdm_set_rval(mpdm_t v
, double rval
);
156 mpdm_t
mpdm_xnew(mpdm_t(*a1
) (mpdm_t
, mpdm_t
, mpdm_t
), mpdm_t a2
);
157 mpdm_t
mpdm_new_copy(int flags
, void *ptr
, int size
);
159 int mpdm_hsize(const mpdm_t h
);
160 mpdm_t
mpdm_hget(const mpdm_t h
, const mpdm_t k
);
161 mpdm_t
mpdm_hget_s(const mpdm_t h
, const wchar_t *k
);
162 int mpdm_exists(const mpdm_t h
, const mpdm_t k
);
163 mpdm_t
mpdm_hset(mpdm_t h
, mpdm_t k
, mpdm_t v
);
164 mpdm_t
mpdm_hset_s(mpdm_t h
, const wchar_t *k
, mpdm_t v
);
165 mpdm_t
mpdm_hdel(mpdm_t h
, const mpdm_t k
);
166 mpdm_t
mpdm_keys(const mpdm_t h
);
167 int mpdm_iterator(mpdm_t h
, int *context
, mpdm_t
*v1
, mpdm_t
*v2
);
169 extern wchar_t * (*mpdm_dump_1
) (const mpdm_t v
, int l
, wchar_t *ptr
, int *size
);
170 mpdm_t
mpdm_dumper(const mpdm_t v
);
171 void mpdm_dump(const mpdm_t v
);
173 #define MPDM_SGET(r, k) mpdm_sget((r), MPDM_LS((k)))
174 #define MPDM_SSET(r, k, v) mpdm_sset((r), MPDM_LS((k)), (v))
176 mpdm_t
mpdm_sget(mpdm_t r
, mpdm_t k
);
177 mpdm_t
mpdm_sget_i(mpdm_t r
, mpdm_t k
, int i
);
178 mpdm_t
mpdm_sset(mpdm_t r
, mpdm_t k
, mpdm_t v
);
180 int mpdm_write_wcs(FILE * f
, const wchar_t * str
);
181 mpdm_t
mpdm_new_f(FILE * f
);
182 mpdm_t
mpdm_open(const mpdm_t filename
, const mpdm_t mode
);
183 mpdm_t
mpdm_close(mpdm_t fd
);
184 mpdm_t
mpdm_read(const mpdm_t fd
);
185 int mpdm_write(const mpdm_t fd
, const mpdm_t v
);
186 mpdm_t
mpdm_getchar(const mpdm_t fd
);
187 int mpdm_putchar(const mpdm_t fd
, const mpdm_t c
);
188 int mpdm_fseek(const mpdm_t fd
, long offset
, int whence
);
189 long mpdm_ftell(const mpdm_t fd
);
190 FILE * mpdm_get_filehandle(const mpdm_t fd
);
191 int mpdm_encoding(mpdm_t charset
);
192 int mpdm_unlink(const mpdm_t filename
);
193 mpdm_t
mpdm_stat(const mpdm_t filename
);
194 int mpdm_chmod(const mpdm_t filename
, mpdm_t perms
);
195 int mpdm_chdir(const mpdm_t dir
);
196 int mpdm_chown(const mpdm_t filename
, mpdm_t uid
, mpdm_t gid
);
197 mpdm_t
mpdm_glob(mpdm_t spec
, mpdm_t base
);
199 mpdm_t
mpdm_popen(const mpdm_t prg
, const mpdm_t mode
);
200 mpdm_t
mpdm_popen2(const mpdm_t prg
);
201 mpdm_t
mpdm_pclose(mpdm_t fd
);
203 extern int mpdm_regex_offset
;
204 extern int mpdm_regex_size
;
205 extern int mpdm_sregex_count
;
207 mpdm_t
mpdm_regex(const mpdm_t v
, const mpdm_t r
, int offset
);
208 mpdm_t
mpdm_sregex(const mpdm_t v
, const mpdm_t r
, const mpdm_t s
, int offset
);
210 mpdm_t
mpdm_gettext(const mpdm_t str
);
211 int mpdm_gettext_domain(const mpdm_t dom
, const mpdm_t data
);
213 mpdm_t
mpdm_home_dir(void);
214 mpdm_t
mpdm_app_dir(void);
216 /* value type testing macros */
218 #define MPDM_IS_ARRAY(v) ((v != NULL) && ((v)->flags) & MPDM_MULTIPLE)
219 #define MPDM_IS_HASH(v) ((v != NULL) && ((v)->flags) & MPDM_HASH)
220 #define MPDM_IS_EXEC(v) ((v != NULL) && ((v)->flags) & MPDM_EXEC)
221 #define MPDM_IS_STRING(v) ((v != NULL) && ((v)->flags) & MPDM_STRING)
223 /* value creation utility macros */
225 #define MPDM_A(n) mpdm_new_a(0,n)
226 #define MPDM_H(n) mpdm_new_a(MPDM_HASH|MPDM_IVAL,n)
227 #define MPDM_LS(s) mpdm_new_wcs(0, s, -1, 0)
228 #define MPDM_S(s) mpdm_new_wcs(0, s, -1, 1)
229 #define MPDM_NS(s,n) mpdm_new_wcs(0, s, n, 1)
230 #define MPDM_ENS(s,n) mpdm_new(MPDM_STRING|MPDM_FREE, s, n)
231 #define MPDM_C(f,p,s) mpdm_new_copy(f,p,s)
233 #define MPDM_I(i) mpdm_new_i((i))
234 #define MPDM_R(r) mpdm_new_r((r))
235 #define MPDM_P(p) mpdm_new(0,(void *)p, 0, NULL)
236 #define MPDM_MBS(s) mpdm_new_mbstowcs(0, s, -1)
237 #define MPDM_NMBS(s,n) mpdm_new_mbstowcs(0, s, n)
238 #define MPDM_2MBS(s) mpdm_new_wcstombs(0, s)
240 #define MPDM_X(f) mpdm_new(MPDM_EXEC, (const void *)f, 0)
241 #define MPDM_X2(f,b) mpdm_xnew(f,b)
243 #define MPDM_F(f) mpdm_new_f(f)
245 int mpdm_startup(void);
246 void mpdm_shutdown(void);
248 void mpdm_sleep(int msecs
);
250 mpdm_t
mpdm_new_mutex(void);
251 void mpdm_mutex_lock(mpdm_t mutex
);
252 void mpdm_mutex_unlock(mpdm_t mutex
);
254 mpdm_t
mpdm_new_semaphore(int init_value
);
255 void mpdm_semaphore_wait(mpdm_t sem
);
256 void mpdm_semaphore_post(mpdm_t sem
);
258 mpdm_t
mpdm_exec_thread(mpdm_t c
, mpdm_t args
, mpdm_t ctxt
);