@@@ cython and python 3 wip
[mLib-python] / defs.pxi
1 ### -*-pyrex-*-
2 ###
3 ### Basic definitions, used all over
4 ###
5 ### (c) 2005 Straylight/Edgeware
6 ###
7
8 ###----- Licensing notice ---------------------------------------------------
9 ###
10 ### This file is part of the Python interface to mLib.
11 ###
12 ### mLib/Python is free software; you can redistribute it and/or modify
13 ### it under the terms of the GNU General Public License as published by
14 ### the Free Software Foundation; either version 2 of the License, or
15 ### (at your option) any later version.
16 ###
17 ### mLib/Python is distributed in the hope that it will be useful,
18 ### but WITHOUT ANY WARRANTY; without even the implied warranty of
19 ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 ### GNU General Public License for more details.
21 ###
22 ### You should have received a copy of the GNU General Public License
23 ### along with mLib/Python; if not, write to the Free Software Foundation,
24 ### Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
25
26 ###--------------------------------------------------------------------------
27 ### C library.
28
29 cdef extern from 'errno.h':
30 int errno
31 enum:
32 EINTR
33 EAGAIN
34 cdef extern from 'limits.h':
35 enum:
36 LONG_MAX
37 cdef extern from 'math.h':
38 double modf(double x, double *i)
39 cdef extern from 'stddef.h':
40 ctypedef int size_t
41 cdef extern from 'string.h':
42 void memcpy(void *p, void *q, size_t n)
43 char *strerror(int err)
44 size_t strlen(char *p)
45
46 ###--------------------------------------------------------------------------
47 ### Unix interface.
48
49 cdef extern from 'sys/types.h':
50 pass
51 cdef extern from 'sys/time.h':
52 struct timeval:
53 int tv_sec
54 int tv_usec
55
56 cdef extern from 'sys/socket.h':
57 ctypedef int socklen_t
58 struct sockaddr:
59 int sa_family
60 enum:
61 AF_INET
62 int getsockname(int fd, sockaddr *pa, size_t *psz)
63 int getpeername(int fd, sockaddr *pa, size_t *psz)
64 cdef extern from 'arpa/inet.h':
65 struct in_addr:
66 int s_addr
67 int inet_aton(char *rp, in_addr *ia)
68 char *inet_ntoa(in_addr ia)
69 cdef extern from 'netinet/in.h':
70 struct sockaddr_in:
71 int sin_family
72 in_addr sin_addr
73 int sin_port
74 int htons(int x)
75 int htonl(int x)
76 int ntohs(int x)
77 int ntohl(int x)
78 cdef extern from 'netdb.h':
79 struct hostent:
80 char *h_name
81 char **h_aliases
82 int h_addrtype
83 int h_length
84 char **h_addr_list
85 char *h_addr
86 int h_errno
87
88 ###--------------------------------------------------------------------------
89 ### Python.
90
91 cdef extern from 'Python.h':
92
93 ctypedef struct PyObject:
94 pass
95 ctypedef struct PyTypeObject:
96 pass
97
98 int PyObject_AsReadBuffer(obj, void **buf, Py_ssize_t *len) except -1
99 object PyInt_FromLong(long i)
100 object PyLong_FromUnsignedLong(unsigned long i)
101 void PyErr_Clear()
102
103 void Py_INCREF(PyObject *obj)
104 void Py_DECREF(PyObject *obj)
105
106 PyTypeObject *Py_TYPE(PyObject *obj)
107 Py_ssize_t Py_SIZE(PyObject *obj)
108 Py_ssize_t Py_REFCNT(PyObject *obj)
109
110 ###--------------------------------------------------------------------------
111 ### mLib basic stuff.
112
113 cdef extern from 'mLib/alloc.h':
114 char *xstrdup(char *p)
115 void *xmalloc(size_t sz)
116 void xfree(void *p)
117
118 cdef extern from 'mLib/bits.h':
119 ctypedef int uint32
120
121 cdef extern from 'mLib/dstr.h':
122 ctypedef struct dstr:
123 char *buf
124 int len
125 void DCREATE(dstr *d)
126 void dstr_destroy(dstr *d)
127
128 ###--------------------------------------------------------------------------
129 ### CRC32.
130
131 cdef extern from 'mLib/crc32.h':
132 uint32 _crc32 "crc32" (uint32 a, void *p, int sz)
133
134 ###--------------------------------------------------------------------------
135 ### Universal hashing.
136
137 cdef extern from 'mLib/unihash.h':
138 ctypedef struct unihash_info:
139 pass
140 void unihash_setkey(unihash_info *i, uint32 k)
141 uint32 UNIHASH_INIT(unihash_info *i)
142 uint32 unihash_hash(unihash_info *i, uint32 a, void *p, int sz)
143 unihash_info unihash_global
144
145 ###--------------------------------------------------------------------------
146 ### Symbol tables.
147
148 cdef extern from 'mLib/sym.h':
149 ctypedef struct sym_table:
150 pass
151 ctypedef struct sym_base:
152 pass
153 ctypedef struct sym_iter:
154 pass
155 void sym_create(sym_table *t)
156 void sym_destroy(sym_table *t)
157 void *sym_find(sym_table *t, char *n, long l, int sz, unsigned *f)
158 void sym_remove(sym_table *t, void *b)
159 char *SYM_NAME(void *b)
160 int SYM_LEN(void *b)
161 void sym_mkiter(sym_iter *i, sym_table *t)
162 void *sym_next(sym_iter *i)
163
164 ###--------------------------------------------------------------------------
165 ### String utilities.
166
167 cdef extern from 'mLib/str.h':
168 enum:
169 STRF_QUOTE
170 STRF_PREFIX
171 char *str_qword(char **pp, unsigned f)
172 size_t str_qsplit(char *p, char **v, size_t c, char **rest, unsigned f)
173 bint str_matchx(char *p, char *s, unsigned f)
174 void str_sanitize(char *d, char *p, size_t sz)
175
176 cdef extern from 'mLib/versioncmp.h':
177 int _versioncmp "versioncmp" (char *va, char *vb)
178
179 ###--------------------------------------------------------------------------
180 ### Binary encoding functions.
181
182 cdef extern from 'mLib/codec.h':
183 ctypedef struct codec
184 ctypedef struct codec_class:
185 char *name
186 codec *(*encoder)(unsigned f, char *ind, unsigned max)
187 codec *(*decoder)(unsigned f)
188 ctypedef struct codec_ops:
189 codec_class *c
190 int (*code)(codec *c, const void *p, size_t, dstr *d)
191 void (*destroy)(codec *c)
192 ctypedef struct codec:
193 codec_ops *ops
194 enum:
195 _CDCF_LOWERC "CDCF_LOWERC"
196 _CDCF_IGNCASE "CDCF_IGNCASE"
197 _CDCF_NOEQPAD "CDCF_NOEQPAD"
198 _CDCF_IGNEQPAD "CDCF_IGNEQPAD"
199 _CDCF_IGNEQMID "CDCF_IGNEQMID"
200 _CDCF_IGNZPAD "CDCF_IGNZPAD"
201 _CDCF_IGNNEWL "CDCF_IGNNEWL"
202 _CDCF_IGNSPC "CDCF_IGNSPC"
203 _CDCF_IGNINVCH "CDCF_IGNINVCH"
204 _CDCF_IGNJUNK "CDCF_IGNJUNK"
205 enum:
206 _CDCERR_OK "CDCERR_OK"
207 _CDCERR_INVCH "CDCERR_INVCH"
208 _CDCERR_INVEQPAD "CDCERR_INVEQPAD"
209 _CDCERR_INVZPAD "CDCERR_INVZPAD"
210 char *_codec_strerror "codec_strerror" (int err)
211
212 ###--------------------------------------------------------------------------
213 ### Form-urlencoding functions.
214
215 cdef extern from 'mLib/url.h':
216 struct url_ectx:
217 unsigned f
218 struct url_dctx:
219 char *p
220 unsigned f
221 enum:
222 URLF_STRICT
223 URLF_LAX
224 URLF_SEMI
225 void url_initenc(url_ectx *ctx)
226 void url_enc(url_ectx *ctx, dstr *d, char *name, char *value)
227 void url_initdec(url_dctx *ctx, char *p)
228 int url_dec(url_dctx *ctx, dstr *n, dstr *v)
229
230 ###--------------------------------------------------------------------------
231 ### Atom stuff.
232
233 ## Atoms.
234 ##
235 ## Partly written in `real' C.
236 cdef extern from 'atom.h':
237 ctypedef struct atom:
238 pass
239 ctypedef struct atom_iter:
240 pass
241 ctypedef struct atom_table:
242 pass
243 atom_table *ATOM_GLOBAL
244 void atom_mkiter(atom_iter *i, atom_table *t)
245 atom *atom_next(atom_iter *)
246 void atom_pysetup()
247 object atom_pywrap(atom *a)
248 object atom_pyintern(object obj)
249 atom *ATOM_A(object obj)
250 PyTypeObject atom_pytype
251
252 ## Association tables.
253 cdef extern from 'mLib/assoc.h':
254 ctypedef struct assoc_table:
255 pass
256 ctypedef struct assoc_base:
257 pass
258 ctypedef struct assoc_iter:
259 pass
260 void assoc_create(assoc_table *t)
261 void assoc_destroy(assoc_table *t)
262 void *assoc_find(assoc_table *t, atom *a, int sz, unsigned *f)
263 void assoc_remove(assoc_table *t, void *b)
264 atom *ASSOC_ATOM(void *b)
265 void assoc_mkiter(assoc_iter *i, assoc_table *t)
266 void *assoc_next(assoc_iter *i)
267
268 ###--------------------------------------------------------------------------
269 ### Double-ended arrays.
270
271 cdef extern from 'array.h':
272 void da_pysetup()
273 PyTypeObject da_pytype
274 PyTypeObject daiter_pytype
275
276 ###--------------------------------------------------------------------------
277 ### Line buffer.
278
279 cdef extern from 'mLib/lbuf.h':
280 cdef struct lbuf:
281 int f
282 int delim
283 size_t sz
284 enum:
285 LBUF_ENABLE
286 _LBUF_CRLF "LBUF_CRLF"
287 _LBUF_STRICTCRLF "LBUF_STRICTCRLF"
288 void lbuf_flush(lbuf *b, char *p, size_t len)
289 void lbuf_close(lbuf *b)
290 size_t lbuf_free(lbuf *b, char **p)
291 void lbuf_setsize(lbuf *b, size_t sz)
292 void lbuf_enable(lbuf *b)
293 void lbuf_disable(lbuf *b)
294 void lbuf_init(lbuf *b,
295 void (*func)(char *s, size_t len, void *arg), void *arg)
296 void lbuf_destroy(lbuf *b)
297
298 ###--------------------------------------------------------------------------
299 ### Packet buffer.
300
301 cdef extern from 'mLib/pkbuf.h':
302 ctypedef struct pkbuf:
303 int f
304 int want
305 enum:
306 PKBUF_ENABLE
307 void pkbuf_flush(pkbuf *pk, unsigned char *p, size_t len)
308 void pkbuf_close(pkbuf *pk)
309 size_t pkbuf_free(pkbuf *pk, unsigned char **p)
310 void pkbuf_want(pkbuf *pk, size_t sz)
311 void pkbuf_init(pkbuf *b,
312 void (*func)(unsigned char *s, size_t len,
313 pkbuf *pk, size_t *keep, void *arg),
314 void *arg)
315 void pkbuf_destroy(pkbuf *b)
316
317 ###--------------------------------------------------------------------------
318 ### Select stuff.
319
320 ## Basics.
321 cdef extern from 'mLib/sel.h':
322 ctypedef struct sel_state:
323 pass
324 ctypedef struct sel_file:
325 int fd
326 ctypedef struct sel_timer:
327 pass
328 enum:
329 _SEL_READ "SEL_READ"
330 _SEL_WRITE "SEL_WRITE"
331 _SEL_EXC "SEL_EXC"
332 void sel_init(sel_state *s)
333 void sel_initfile(sel_state *s, sel_file *f, int fd, unsigned mode,
334 void (*func)(int fd, unsigned mode, void *arg),
335 void *arg)
336 void sel_force(sel_file *f)
337 void sel_addfile(sel_file *f)
338 void sel_rmfile(sel_file *f)
339 void sel_addtimer(sel_state *s, sel_timer *t, timeval *tv,
340 void (*func)(timeval *tv, void *arg),
341 void *arg)
342 void sel_rmtimer(sel_timer *t)
343 int sel_select(sel_state *s) except *
344
345 ### Non-blocking connection.
346 cdef extern from 'mLib/conn.h':
347 ctypedef struct conn:
348 pass
349 int conn_fd(conn *c, sel_state *s, int fd,
350 void (*func)(int fd, void *arg), void *arg)
351 void conn_kill(conn *c)
352
353 ## Background name resolver.
354 cdef extern from 'mLib/bres.h':
355 ctypedef struct bres_client:
356 pass
357 void bres_byname(bres_client *r, char *name,
358 void (*func)(hostent *h, void *arg), void *arg)
359 void bres_byaddr(bres_client *r, in_addr addr,
360 void (*func)(hostent *h, void *arg), void *arg)
361 void bres_abort(bres_client *r)
362 void bres_exec(char *null)
363 void bres_init(sel_state *s)
364
365 ## In-band signal handling.
366 cdef extern from 'mLib/sig.h':
367 ctypedef struct sig:
368 pass
369 void sig_add(sig *s, int n, void (*func)(int n, void *arg), void *arg)
370 void sig_remove(sig *s)
371 void sig_init(sel_state *s)
372
373 ## Line buffer.
374 cdef extern from 'mLib/selbuf.h':
375 ctypedef struct selbuf:
376 sel_file reader
377 lbuf b
378 void selbuf_enable(selbuf *b)
379 void selbuf_disable(selbuf *b)
380 void selbuf_setsize(selbuf *b, size_t sz)
381 void selbuf_init(selbuf *b, sel_state *s, int fd,
382 void (*func)(char *s, size_t len, void *arg), void *arg)
383 void selbuf_destroy(selbuf *b)
384
385 ## Packet buffer.
386 cdef extern from 'mLib/selpk.h':
387 ctypedef struct selpk:
388 sel_file reader
389 pkbuf pk
390 void selpk_enable(selpk *b)
391 void selpk_disable(selpk *b)
392 void selpk_want(selpk *b, size_t sz)
393 void selpk_init(selpk *b, sel_state *s, int fd,
394 void (*func)(unsigned char *p, size_t n,
395 pkbuf *pk, size_t *keep, void *arg),
396 void *arg)
397 void selpk_destroy(selpk *b)
398
399 ## Ident client.
400 cdef extern from 'mLib/ident.h':
401 ctypedef struct ident_request:
402 pass
403 enum:
404 IDENT_USERID
405 IDENT_ERROR
406 IDENT_BAD
407 struct ident_userid:
408 char *os
409 char *user
410 union ident_u:
411 ident_userid userid
412 char *error
413 ctypedef struct ident_reply:
414 int sport
415 int dport
416 int type
417 ident_u u
418 void ident(ident_request *rq, sel_state *s,
419 sockaddr_in *local, sockaddr_in *remote,
420 void (*func)(ident_reply *r, void *arg),
421 void *arg)
422 void ident_abort(ident_request *rq)
423
424 ###--------------------------------------------------------------------------
425 ### Error reporting.
426
427 cdef extern from 'mLib/quis.h':
428 void _ego "ego"(char *prog)
429 char *_quis "quis"()
430
431 cdef extern from 'mLib/report.h':
432 void _moan "moan"(char *f, char *msg)
433
434 ###--------------------------------------------------------------------------
435 ### File comparison.
436
437 cdef extern from 'mLib/fwatch.h':
438 ctypedef struct fwatch:
439 pass
440 void fwatch_init(fwatch *f, char *name)
441 void fwatch_initfd(fwatch *f, int fd)
442 bint fwatch_update(fwatch *f, char *name)
443 bint fwatch_updatefd(fwatch *f, int fd)
444
445 ###--------------------------------------------------------------------------
446 ### File descriptor hacking.
447
448 cdef extern from 'mLib/fdflags.h':
449 int _fdflags "fdflags"(int fd,
450 unsigned fbic, unsigned fxor,
451 unsigned fdbic, unsigned fdxor)
452
453 cdef extern from 'mLib/fdpass.h':
454 int fdpass_send(int sock, int fd, void *p, size_t sz)
455 int fdpass_recv(int sock, int *fd, void *p, size_t sz)
456
457 cdef extern from 'mLib/mdup.h':
458 ctypedef struct mdup_fd:
459 int cur
460 int want
461 int _mdup "mdup"(mdup_fd *v, size_t n)
462
463 ###--------------------------------------------------------------------------
464 ### Daemon utilities.
465
466 cdef extern from 'mLib/daemonize.h':
467 int _daemonize "daemonize"()
468 void _detachtty "detachtty"()
469
470 ###--------------------------------------------------------------------------
471 ### Internal utilities.
472
473 cdef extern from 'grim.h':
474 int PSIZEOF(void *x)
475 object BIN_FROMSTRLEN(const void *p, Py_ssize_t sz)
476 void *BIN_PTR(object bin)
477 void BIN_SETLEN(object bin, Py_ssize_t sz)
478 int TEXT_CHECK(object p)
479 char *TEXT_PTR(str s)
480 void TEXT_PTRLEN(str s, const char **p, Py_ssize_t *sz)
481 str TEXT_FROMSTR(const char *p)
482 str TEXT_FROMSTRLEN(const char *p, Py_ssize_t sz)
483
484 ###----- That's all, folks --------------------------------------------------