Treat NULL and empty base the same in mpdm_glob().
[mpdm.git] / mpdm.h
blobbe5261c3c073e1af39b9fd81b45cd59dec02dcb6
1 /*
3 MPDM - Minimum Profit Data Manager
4 Copyright (C) 2003/2007 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
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
28 /* structural flags */
29 #define MPDM_STRING 0x00000001 /* data can be string-compared */
30 #define MPDM_MULTIPLE 0x00000002 /* data is multiple */
31 #define MPDM_FREE 0x00000004 /* free data at destroy */
32 #define MPDM_DELETED 0x00000008 /* value is deleted */
34 #define MPDM_IVAL 0x00000010 /* integer value cached in .ival */
35 #define MPDM_RVAL 0x00000020 /* real value cached in .rval */
37 /* 'informative' flags */
38 #define MPDM_HASH 0x00010000 /* data is a hash */
39 #define MPDM_FILE 0x00020000 /* data is a FILE * */
40 #define MPDM_EXEC 0x00040000 /* data is 'executable' */
42 /* mpdm values */
43 typedef struct mpdm_val *mpdm_t;
45 /* a value */
46 struct mpdm_val {
47 int flags; /* value flags */
48 int ref; /* reference count */
49 int size; /* data size */
50 const void *data; /* the real data */
51 int ival; /* cached integer value */
52 double rval; /* cache real value */
53 mpdm_t prev; /* prev in chain */
54 mpdm_t next; /* next in chain */
58 /* the main control structure */
59 struct mpdm_control {
60 mpdm_t root; /* the root hash */
61 mpdm_t cur; /* current value (circular list) */
62 mpdm_t del; /* list of deleted values */
64 int count; /* total count of values */
65 int low_threshold; /* minimum number of values to start sweeping */
66 int default_sweep; /* default swept values on mpdm_sweep(0) */
67 int memory_usage; /* approximate total memory used */
68 int hash_buckets; /* default hash buckets */
71 extern struct mpdm_control *mpdm;
73 mpdm_t mpdm_new(int flags, const void *data, int size);
74 mpdm_t mpdm_ref(mpdm_t v);
75 mpdm_t mpdm_unref(mpdm_t v);
76 int mpdm_destroy(mpdm_t v);
77 void mpdm_sweep(int count);
79 int mpdm_size(const mpdm_t v);
80 mpdm_t mpdm_clone(const mpdm_t v);
81 mpdm_t mpdm_root(void);
83 mpdm_t mpdm_exec(mpdm_t c, mpdm_t args);
84 mpdm_t mpdm_exec_1(mpdm_t c, mpdm_t a1);
85 mpdm_t mpdm_exec_2(mpdm_t c, mpdm_t a1, mpdm_t a2);
86 mpdm_t mpdm_exec_3(mpdm_t c, mpdm_t a1, mpdm_t a2, mpdm_t a3);
88 mpdm_t mpdm_new_a(int flags, int size);
89 mpdm_t mpdm_aclone(const mpdm_t v);
91 mpdm_t mpdm_expand(mpdm_t a, int offset, int num);
92 mpdm_t mpdm_collapse(mpdm_t a, int offset, int num);
93 mpdm_t mpdm_aset(mpdm_t a, mpdm_t e, int offset);
94 mpdm_t mpdm_aget(const mpdm_t a, int offset);
95 mpdm_t mpdm_ins(mpdm_t a, mpdm_t e, int offset);
96 mpdm_t mpdm_adel(mpdm_t a, int offset);
97 mpdm_t mpdm_shift(mpdm_t a);
98 mpdm_t mpdm_push(mpdm_t a, mpdm_t e);
99 mpdm_t mpdm_pop(mpdm_t a);
100 mpdm_t mpdm_queue(mpdm_t a, mpdm_t e, int size);
101 int mpdm_seek(const mpdm_t a, const mpdm_t k, int step);
102 int mpdm_seek_s(const mpdm_t a, const wchar_t * k, int step);
103 int mpdm_bseek(const mpdm_t a, const mpdm_t k, int step, int *pos);
104 int mpdm_bseek_s(const mpdm_t a, const wchar_t * k, int step, int *pos);
105 mpdm_t mpdm_sort(const mpdm_t a, int step);
106 mpdm_t mpdm_sort_cb(const mpdm_t a, int step, mpdm_t asort_cb);
108 mpdm_t mpdm_split(const mpdm_t s, const mpdm_t a);
109 mpdm_t mpdm_join(const mpdm_t s, const mpdm_t a);
111 void *mpdm_poke(void *dst, int *dsize, const void *org, int osize, int esize);
112 wchar_t *mpdm_pokev(wchar_t * dst, int *dsize, const mpdm_t v);
113 wchar_t *mpdm_mbstowcs(const char *str, int *s, int l);
114 char *mpdm_wcstombs(const wchar_t * str, int *s);
115 mpdm_t mpdm_new_wcs(int flags, const wchar_t * str, int size, int cpy);
116 mpdm_t mpdm_new_mbstowcs(int flags, const char *str, int l);
117 mpdm_t mpdm_new_wcstombs(int flags, const wchar_t * str);
118 mpdm_t mpdm_new_i(int ival);
119 mpdm_t mpdm_new_r(double rval);
120 int mpdm_wcwidth(wchar_t c);
121 mpdm_t mpdm_sprintf(const mpdm_t fmt, const mpdm_t args);
122 mpdm_t mpdm_ulc(const mpdm_t s, int u);
123 wchar_t *mpdm_string(const mpdm_t v);
124 mpdm_t mpdm_splice(const mpdm_t v, const mpdm_t i, int offset, int del);
125 mpdm_t mpdm_strcat(const mpdm_t s1, const mpdm_t s2);
126 int mpdm_cmp(const mpdm_t v1, const mpdm_t v2);
127 int mpdm_ival(mpdm_t v);
128 double mpdm_rval(mpdm_t v);
129 mpdm_t mpdm_set_ival(mpdm_t v, int ival);
130 mpdm_t mpdm_set_rval(mpdm_t v, double rval);
132 mpdm_t mpdm_xnew(mpdm_t(*a1) (mpdm_t, mpdm_t), mpdm_t a2);
134 int mpdm_hsize(const mpdm_t h);
135 mpdm_t mpdm_hget(const mpdm_t h, const mpdm_t k);
136 mpdm_t mpdm_hget_s(const mpdm_t h, const wchar_t * k);
137 int mpdm_exists(const mpdm_t h, const mpdm_t k);
138 mpdm_t mpdm_hset(mpdm_t h, mpdm_t k, mpdm_t v);
139 mpdm_t mpdm_hset_s(mpdm_t h, const wchar_t * k, mpdm_t v);
140 mpdm_t mpdm_hdel(mpdm_t h, const mpdm_t k);
141 mpdm_t mpdm_keys(const mpdm_t h);
143 mpdm_t mpdm_dumper(const mpdm_t v);
144 void mpdm_dump(const mpdm_t v);
145 void mpdm_dump_unref(void);
147 #define MPDM_SGET(r, k) mpdm_sget((r), MPDM_LS((k)))
148 #define MPDM_SSET(r, k, v) mpdm_sset((r), MPDM_LS((k)), (v))
150 mpdm_t mpdm_sget(mpdm_t r, mpdm_t k);
151 mpdm_t mpdm_sset(mpdm_t r, mpdm_t k, mpdm_t v);
153 int mpdm_write_wcs(FILE * f, const wchar_t * str);
154 mpdm_t mpdm_new_f(FILE * f);
155 mpdm_t mpdm_open(const mpdm_t filename, const mpdm_t mode);
156 mpdm_t mpdm_close(mpdm_t fd);
157 mpdm_t mpdm_read(const mpdm_t fd);
158 int mpdm_write(const mpdm_t fd, const mpdm_t v);
159 mpdm_t mpdm_getchar(const mpdm_t fd);
160 mpdm_t mpdm_putchar(const mpdm_t fd, const mpdm_t c);
161 int mpdm_fseek(const mpdm_t fd, long offset, int whence);
162 long mpdm_ftell(const mpdm_t fd);
163 FILE * mpdm_get_filehandle(const mpdm_t fd);
164 int mpdm_encoding(mpdm_t charset);
165 int mpdm_unlink(const mpdm_t filename);
166 mpdm_t mpdm_stat(const mpdm_t filename);
167 int mpdm_chmod(const mpdm_t filename, mpdm_t perms);
168 int mpdm_chown(const mpdm_t filename, mpdm_t uid, mpdm_t gid);
169 mpdm_t mpdm_glob(mpdm_t spec, mpdm_t base);
171 mpdm_t mpdm_popen(const mpdm_t prg, const mpdm_t mode);
172 mpdm_t mpdm_pclose(mpdm_t fd);
174 extern int mpdm_regex_offset;
175 extern int mpdm_regex_size;
176 extern int mpdm_sregex_count;
178 mpdm_t mpdm_regex(mpdm_t r, const mpdm_t v, int offset);
179 mpdm_t mpdm_sregex(mpdm_t r, const mpdm_t v, const mpdm_t s, int offset);
181 mpdm_t mpdm_gettext(const mpdm_t str);
182 int mpdm_gettext_domain(const mpdm_t dom, const mpdm_t data);
184 mpdm_t mpdm_home_dir(void);
185 mpdm_t mpdm_app_dir(void);
187 /* value type testing macros */
189 #define MPDM_IS_ARRAY(v) ((v != NULL) && ((v)->flags) & MPDM_MULTIPLE)
190 #define MPDM_IS_HASH(v) ((v != NULL) && ((v)->flags) & MPDM_HASH)
191 #define MPDM_IS_EXEC(v) ((v != NULL) && ((v)->flags) & MPDM_EXEC)
192 #define MPDM_IS_STRING(v) ((v != NULL) && ((v)->flags) & MPDM_STRING)
194 /* value creation utility macros */
196 #define MPDM_A(n) mpdm_new_a(0,n)
197 #define MPDM_H(n) mpdm_new_a(MPDM_HASH|MPDM_IVAL,n)
198 #define MPDM_LS(s) mpdm_new_wcs(0, s, -1, 0)
199 #define MPDM_S(s) mpdm_new_wcs(0, s, -1, 1)
200 #define MPDM_NS(s,n) mpdm_new_wcs(0, s, n, 1)
201 #define MPDM_ENS(s,n) mpdm_new(MPDM_STRING|MPDM_FREE, s, n)
203 #define MPDM_I(i) mpdm_new_i((i))
204 #define MPDM_R(r) mpdm_new_r((r))
205 #define MPDM_P(p) mpdm_new(0,(void *)p, 0, NULL)
206 #define MPDM_MBS(s) mpdm_new_mbstowcs(0, s, -1)
207 #define MPDM_NMBS(s,n) mpdm_new_mbstowcs(0, s, n)
208 #define MPDM_2MBS(s) mpdm_new_wcstombs(0, s)
210 #define MPDM_X(f) mpdm_new(MPDM_EXEC, (const void *)f, 0)
211 #define MPDM_X2(f,b) mpdm_xnew(f,b)
213 #define MPDM_F(f) mpdm_new_f(f)
215 int mpdm_startup(void);
216 void mpdm_shutdown(void);
218 #ifdef __cplusplus
220 #endif