@@@ lbuf needs test
[mLib-python] / defs.pxi
index f452b28..86cd72e 100644 (file)
--- a/defs.pxi
+++ b/defs.pxi
@@ -1,31 +1,30 @@
-# -*-pyrex-*-
-#
-# $Id$
-#
-# Basic definitions, used all over
-#
-# (c) 2005 Straylight/Edgeware
-#
-
-#----- Licensing notice -----------------------------------------------------
-#
-# This file is part of the Python interface to mLib.
-#
-# mLib/Python is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-# 
-# mLib/Python is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-# 
-# You should have received a copy of the GNU General Public License
-# along with mLib/Python; if not, write to the Free Software Foundation,
-# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-#----- C library ------------------------------------------------------------
+### -*-pyrex-*-
+###
+### Basic definitions, used all over
+###
+### (c) 2005 Straylight/Edgeware
+###
+
+###----- Licensing notice ---------------------------------------------------
+###
+### This file is part of the Python interface to mLib.
+###
+### mLib/Python is free software; you can redistribute it and/or modify
+### it under the terms of the GNU General Public License as published by
+### the Free Software Foundation; either version 2 of the License, or
+### (at your option) any later version.
+###
+### mLib/Python is distributed in the hope that it will be useful,
+### but WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+### GNU General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with mLib/Python; if not, write to the Free Software Foundation,
+### Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+###--------------------------------------------------------------------------
+### C library.
 
 cdef extern from 'errno.h':
   int errno
@@ -44,7 +43,8 @@ cdef extern from 'string.h':
   char *strerror(int err)
   size_t strlen(char *p)
 
-#----- Unix interface -------------------------------------------------------
+###--------------------------------------------------------------------------
+### Unix interface.
 
 cdef extern from 'sys/types.h':
   pass
@@ -54,6 +54,7 @@ cdef extern from 'sys/time.h':
     int tv_usec
 
 cdef extern from 'sys/socket.h':
+  ctypedef int socklen_t
   struct sockaddr:
     int sa_family
   enum:
@@ -84,7 +85,8 @@ cdef extern from 'netdb.h':
     char *h_addr
   int h_errno
 
-#----- Python ---------------------------------------------------------------
+###--------------------------------------------------------------------------
+### Python.
 
 cdef extern from 'Python.h':
 
@@ -93,19 +95,26 @@ cdef extern from 'Python.h':
   ctypedef struct PyTypeObject:
     pass
 
-  object PyString_FromStringAndSize(char *p, int len)
-  int PyString_AsStringAndSize(obj, char **p, int *len) except -1
-  int PyObject_AsReadBuffer(obj, void **buf, int *len) except -1
-  int PyObject_TypeCheck(obj, ty)
+  int PyObject_AsReadBuffer(obj, void **buf, Py_ssize_t *len) except -1
+  IF PYVERSION >= (3,):
+    object PyUnicode_DecodeUTF8Stateful(const char *s, Py_ssize_t sz,
+                                        const char *errors,
+                                        Py_ssize_t *used_out)
+
   object PyInt_FromLong(long i)
   object PyLong_FromUnsignedLong(unsigned long i)
-  char *PyString_AS_STRING(string)
-  int _PyString_Resize(PyObject **string, int size) except -1
+
+  void PyErr_Clear()
 
   void Py_INCREF(PyObject *obj)
   void Py_DECREF(PyObject *obj)
 
-#----- mLib basic stuff -----------------------------------------------------
+  PyTypeObject *Py_TYPE(PyObject *obj)
+  Py_ssize_t Py_SIZE(PyObject *obj)
+  Py_ssize_t Py_REFCNT(PyObject *obj)
+
+###--------------------------------------------------------------------------
+### mLib basic stuff.
 
 cdef extern from 'mLib/alloc.h':
   char *xstrdup(char *p)
@@ -122,12 +131,14 @@ cdef extern from 'mLib/dstr.h':
   void DCREATE(dstr *d)
   void dstr_destroy(dstr *d)
 
-#----- CRC32 ----------------------------------------------------------------
+###--------------------------------------------------------------------------
+### CRC32.
 
 cdef extern from 'mLib/crc32.h':
-  uint32 c_crc32 "crc32" (uint32 a, void *p, int sz)
+  uint32 _crc32 "crc32" (uint32 a, void *p, int sz)
 
-#----- Universal hashing ----------------------------------------------------
+###--------------------------------------------------------------------------
+### Universal hashing.
 
 cdef extern from 'mLib/unihash.h':
   ctypedef struct unihash_info:
@@ -137,7 +148,8 @@ cdef extern from 'mLib/unihash.h':
   uint32 unihash_hash(unihash_info *i, uint32 a, void *p, int sz)
   unihash_info unihash_global
 
-#----- Symbol tables --------------------------------------------------------
+###--------------------------------------------------------------------------
+### Symbol tables.
 
 cdef extern from 'mLib/sym.h':
   ctypedef struct sym_table:
@@ -155,7 +167,8 @@ cdef extern from 'mLib/sym.h':
   void sym_mkiter(sym_iter *i, sym_table *t)
   void *sym_next(sym_iter *i)
 
-#----- String utilities -----------------------------------------------------
+###--------------------------------------------------------------------------
+### String utilities.
 
 cdef extern from 'mLib/str.h':
   enum:
@@ -163,13 +176,47 @@ cdef extern from 'mLib/str.h':
     STRF_PREFIX
   char *str_qword(char **pp, unsigned f)
   size_t str_qsplit(char *p, char **v, size_t c, char **rest, unsigned f)
-  int str_matchx(char *p, char *s, unsigned f)
+  bint str_matchx(char *p, char *s, unsigned f)
   void str_sanitize(char *d, char *p, size_t sz)
 
 cdef extern from 'mLib/versioncmp.h':
-  int _versioncmp "versioncmp"(char *va, char *vb)
+  int _versioncmp "versioncmp" (char *va, char *vb)
+
+###--------------------------------------------------------------------------
+### Binary encoding functions.
+
+cdef extern from 'mLib/codec.h':
+  ctypedef struct codec
+  ctypedef struct codec_class:
+    char *name
+    codec *(*encoder)(unsigned f, char *ind, unsigned max)
+    codec *(*decoder)(unsigned f)
+  ctypedef struct codec_ops:
+    codec_class *c
+    int (*code)(codec *c, const void *p, size_t, dstr *d)
+    void (*destroy)(codec *c)
+  ctypedef struct codec:
+    codec_ops *ops
+  enum:
+    _CDCF_LOWERC "CDCF_LOWERC"
+    _CDCF_IGNCASE "CDCF_IGNCASE"
+    _CDCF_NOEQPAD "CDCF_NOEQPAD"
+    _CDCF_IGNEQPAD "CDCF_IGNEQPAD"
+    _CDCF_IGNEQMID "CDCF_IGNEQMID"
+    _CDCF_IGNZPAD "CDCF_IGNZPAD"
+    _CDCF_IGNNEWL "CDCF_IGNNEWL"
+    _CDCF_IGNSPC "CDCF_IGNSPC"
+    _CDCF_IGNINVCH "CDCF_IGNINVCH"
+    _CDCF_IGNJUNK "CDCF_IGNJUNK"
+  enum:
+    _CDCERR_OK "CDCERR_OK"
+    _CDCERR_INVCH "CDCERR_INVCH"
+    _CDCERR_INVEQPAD "CDCERR_INVEQPAD"
+    _CDCERR_INVZPAD "CDCERR_INVZPAD"
+  char *_codec_strerror "codec_strerror" (int err)
 
-#----- Form-urlencoding functions -------------------------------------------
+###--------------------------------------------------------------------------
+### Form-urlencoding functions.
 
 cdef extern from 'mLib/url.h':
   struct url_ectx:
@@ -186,12 +233,12 @@ cdef extern from 'mLib/url.h':
   void url_initdec(url_dctx *ctx, char *p)
   int url_dec(url_dctx *ctx, dstr *n, dstr *v)
 
-#----- Atom stuff -----------------------------------------------------------
-
-# --- Atoms ---
-#
-# Partly written in `real' C.
+###--------------------------------------------------------------------------
+### Atom stuff.
 
+## Atoms.
+##
+## Partly written in `real' C.
 cdef extern from 'atom.h':
   ctypedef struct atom:
     pass
@@ -203,13 +250,12 @@ cdef extern from 'atom.h':
   void atom_mkiter(atom_iter *i, atom_table *t)
   atom *atom_next(atom_iter *)
   void atom_pysetup()
-  atom_pywrap(atom *a)
-  atom_pyintern(obj)
-  atom *ATOM_A(obj)
+  object atom_pywrap(atom *a)
+  object atom_pyintern(object obj)
+  atom *ATOM_A(object obj)
   PyTypeObject atom_pytype
 
-# --- Association tables ---
-
+## Association tables.
 cdef extern from 'mLib/assoc.h':
   ctypedef struct assoc_table:
     pass
@@ -225,20 +271,24 @@ cdef extern from 'mLib/assoc.h':
   void assoc_mkiter(assoc_iter *i, assoc_table *t)
   void *assoc_next(assoc_iter *i)
 
-#----- Double-ended arrays --------------------------------------------------
+###--------------------------------------------------------------------------
+### Double-ended arrays.
 
 cdef extern from 'array.h':
   void da_pysetup()
   PyTypeObject da_pytype
   PyTypeObject daiter_pytype
 
-#----- Line buffer ----------------------------------------------------------
+###--------------------------------------------------------------------------
+### Line buffer.
 
 cdef extern from 'mLib/lbuf.h':
   cdef struct lbuf:
-    int f
-    int delim
+    unsigned f
+    unsigned delim
+    size_t len
     size_t sz
+    char *buf
   enum:
     LBUF_ENABLE
     _LBUF_CRLF "LBUF_CRLF"
@@ -253,7 +303,8 @@ cdef extern from 'mLib/lbuf.h':
                  void (*func)(char *s, size_t len, void *arg), void *arg)
   void lbuf_destroy(lbuf *b)
 
-#----- Packet buffer --------------------------------------------------------
+###--------------------------------------------------------------------------
+### Packet buffer.
 
 cdef extern from 'mLib/pkbuf.h':
   ctypedef struct pkbuf:
@@ -271,10 +322,10 @@ cdef extern from 'mLib/pkbuf.h':
                   void *arg)
   void pkbuf_destroy(pkbuf *b)
 
-#----- Select stuff ---------------------------------------------------------
-
-# --- Basics ---
+###--------------------------------------------------------------------------
+### Select stuff.
 
+## Basics.
 cdef extern from 'mLib/sel.h':
   ctypedef struct sel_state:
     pass
@@ -299,8 +350,7 @@ cdef extern from 'mLib/sel.h':
   void sel_rmtimer(sel_timer *t)
   int sel_select(sel_state *s) except *
 
-# --- Non-blocking connection ---
-
+### Non-blocking connection.
 cdef extern from 'mLib/conn.h':
   ctypedef struct conn:
     pass
@@ -308,8 +358,7 @@ cdef extern from 'mLib/conn.h':
               void (*func)(int fd, void *arg), void *arg)
   void conn_kill(conn *c)
 
-# --- Background name resolver ---
-
+## Background name resolver.
 cdef extern from 'mLib/bres.h':
   ctypedef struct bres_client:
     pass
@@ -321,8 +370,7 @@ cdef extern from 'mLib/bres.h':
   void bres_exec(char *null)
   void bres_init(sel_state *s)
 
-# --- In-band signal handling ---
-
+## In-band signal handling.
 cdef extern from 'mLib/sig.h':
   ctypedef struct sig:
     pass
@@ -330,8 +378,7 @@ cdef extern from 'mLib/sig.h':
   void sig_remove(sig *s)
   void sig_init(sel_state *s)
 
-# --- Line buffer ---
-
+## Line buffer.
 cdef extern from 'mLib/selbuf.h':
   ctypedef struct selbuf:
     sel_file reader
@@ -343,8 +390,7 @@ cdef extern from 'mLib/selbuf.h':
                    void (*func)(char *s, size_t len, void *arg), void *arg)
   void selbuf_destroy(selbuf *b)
 
-# --- Packet buffer ---
-
+## Packet buffer.
 cdef extern from 'mLib/selpk.h':
   ctypedef struct selpk:
     sel_file reader
@@ -358,8 +404,7 @@ cdef extern from 'mLib/selpk.h':
                   void *arg)
   void selpk_destroy(selpk *b)
 
-# --- Ident client ---
-
+## Ident client.
 cdef extern from 'mLib/ident.h':
   ctypedef struct ident_request:
     pass
@@ -384,7 +429,8 @@ cdef extern from 'mLib/ident.h':
              void *arg)
   void ident_abort(ident_request *rq)
 
-#----- Error reporting ------------------------------------------------------
+###--------------------------------------------------------------------------
+### Error reporting.
 
 cdef extern from 'mLib/quis.h':
   void _ego "ego"(char *prog)
@@ -393,17 +439,19 @@ cdef extern from 'mLib/quis.h':
 cdef extern from 'mLib/report.h':
   void _moan "moan"(char *f, char *msg)
 
-#----- File comparison ------------------------------------------------------
+###--------------------------------------------------------------------------
+### File comparison.
 
 cdef extern from 'mLib/fwatch.h':
   ctypedef struct fwatch:
     pass
   void fwatch_init(fwatch *f, char *name)
   void fwatch_initfd(fwatch *f, int fd)
-  int fwatch_update(fwatch *f, char *name)
-  int fwatch_updatefd(fwatch *f, int fd)
+  bint fwatch_update(fwatch *f, char *name)
+  bint fwatch_updatefd(fwatch *f, int fd)
 
-#----- File descriptor hacking ----------------------------------------------
+###--------------------------------------------------------------------------
+### File descriptor hacking.
 
 cdef extern from 'mLib/fdflags.h':
   int _fdflags "fdflags"(int fd,
@@ -414,15 +462,31 @@ cdef extern from 'mLib/fdpass.h':
   int fdpass_send(int sock, int fd, void *p, size_t sz)
   int fdpass_recv(int sock, int *fd, void *p, size_t sz)
 
-#----- Daemon utilities -----------------------------------------------------
+cdef extern from 'mLib/mdup.h':
+  ctypedef struct mdup_fd:
+    int cur
+    int want
+  int _mdup "mdup"(mdup_fd *v, size_t n)
+
+###--------------------------------------------------------------------------
+### Daemon utilities.
 
 cdef extern from 'mLib/daemonize.h':
   int _daemonize "daemonize"()
   void _detachtty "detachtty"()
 
-#----- Internal utilities ---------------------------------------------------
+###--------------------------------------------------------------------------
+### Internal utilities.
 
 cdef extern from 'grim.h':
   int PSIZEOF(void *x)
-
-#----- That's all, folks ----------------------------------------------------
+  object BIN_FROMSTRLEN(const void *p, Py_ssize_t sz)
+  void *BIN_PTR(object bin)
+  void BIN_SETLEN(object bin, Py_ssize_t sz)
+  int TEXT_CHECK(object p)
+  char *TEXT_PTR(str s)
+  void TEXT_PTRLEN(str s, const char **p, Py_ssize_t *sz)
+  str TEXT_FROMSTR(const char *p)
+  str TEXT_FROMSTRLEN(const char *p, Py_ssize_t sz)
+
+###----- That's all, folks --------------------------------------------------