7 # (c) 2005 Straylight/Edgeware
10 #----- Licensing notice -----------------------------------------------------
12 # This file is part of the Python interface to mLib.
14 # mLib/Python is free software; you can redistribute it and/or modify
15 # it under the terms of the GNU General Public License as published by
16 # the Free Software Foundation; either version 2 of the License, or
17 # (at your option) any later version.
19 # mLib/Python is distributed in the hope that it will be useful,
20 # but WITHOUT ANY WARRANTY; without even the implied warranty of
21 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 # GNU General Public License for more details.
24 # You should have received a copy of the GNU General Public License
25 # along with mLib/Python; if not, write to the Free Software Foundation,
26 # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
28 cdef extern from 'atom.h':
31 ctypedef struct atom_iter:
33 ctypedef struct atom_table:
35 atom_table *ATOM_GLOBAL
36 void atom_mkiter(atom_iter *i, atom_table *t)
37 atom *atom_next(atom_iter *)
43 cdef extern from 'mLib/assoc.h':
44 ctypedef struct assoc_table:
46 ctypedef struct assoc_base:
48 ctypedef struct assoc_iter:
50 void assoc_create(assoc_table *t)
51 void assoc_destroy(assoc_table *t)
52 void *assoc_find(assoc_table *t, atom *a, int sz, unsigned *f)
53 void assoc_remove(assoc_table *t, void *b)
54 atom *ASSOC_ATOM(void *b)
55 void assoc_mkiter(assoc_iter *i, assoc_table *t)
56 void *assoc_next(assoc_iter *i)
58 cdef extern from 'grim.h':
61 cdef extern from 'Python.h':
62 int PyObject_AsReadBuffer(obj, void **buf, int *len) except -1
63 PyString_FromStringAndSize(char *p, int n)
64 ctypedef struct PyObject:
66 void Py_INCREF(PyObject *obj)
67 void Py_DECREF(PyObject *obj)
72 atom_mkiter(&me._i, ATOM_GLOBAL)
89 cdef entry *_find(assoc_table *t, object key, unsigned *f) except ?NULL:
94 a = ATOM_A(atom_pyintern(key))
97 e = <entry *>assoc_find(t, a, PSIZEOF(e), f)
101 e = <entry *>assoc_find(t, a, 0, NULL)
105 return atom_pywrap(ASSOC_ATOM(<void *>e))
107 cdef _eget(entry *e):
111 cdef void _eset(entry *e, v):
117 cdef void _edel(assoc_table *t, entry *e):
120 assoc_remove(t, <void *>e)
124 def __new__(me, *hunoz, **hukairz):
126 def __init__(me, stuff = None, **kw):
127 me.update(stuff, **kw)
128 def __getitem__(me, key):
130 e = _find(&me._t, key, NULL)
134 def __setitem__(me, key, value):
136 _eset(_find(&me._t, key, &f), value)
137 def __delitem__(me, key):
140 e = _find(&me._t, key, &f)
144 def get(me, key, default = None):
146 e = _find(&me._t, key, NULL)
150 def setdefault(me, key, default = None):
153 e = _find(&me._t, key, &f)
159 def pop(me, key, default = None):
161 e = _find(&me._t, key, NULL)
170 assoc_mkiter(&i, &me._t)
171 e = <entry *>assoc_next(&i)
173 raise ValueError, 'popitem(): table is empty'
174 return _key(e), _eget(e)
179 assoc_mkiter(&i, &me._t)
181 e = <entry *>assoc_next(&i)
190 assoc_mkiter(&i, &me._t)
192 e = <entry *>assoc_next(&i)
201 assoc_mkiter(&i, &me._t)
203 e = <entry *>assoc_next(&i)
206 l.append((_key(e), _eget(e)))
211 assoc_mkiter(&i, &me._t)
213 e = <entry *>assoc_next(&i)
221 assoc_mkiter(&i, &me._t)
223 e = <entry *>assoc_next(&i)
227 assoc_destroy(&me._t)
236 def update(me, stuff = None, **kw):
239 elif hasattr(stuff, 'keys'):
245 for k, v in kw.iteritems():
252 def __new__(me, Table t):
254 assoc_mkiter(&me._i, &t._t)
259 e = <entry *>assoc_next(&me._i)
264 cdef class ValueIter:
267 def __new__(me, Table t):
269 assoc_mkiter(&me._i, &t._t)
274 e = <entry *>assoc_next(&me._i)
282 def __new__(me, Table t):
284 assoc_mkiter(&me._i, &t._t)
289 e = <entry *>assoc_next(&me._i)
292 return _key(e), _eget(e)
294 Atom = atom_pystartup()
296 #----- That's all, folks ----------------------------------------------------