5 # Symbol table, using universal hashing
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 'mLib/sym.h':
29 ctypedef struct sym_table:
31 ctypedef struct sym_base:
33 ctypedef struct sym_iter:
35 void sym_create(sym_table *t)
36 void sym_destroy(sym_table *t)
37 void *sym_find(sym_table *t, char *n, long l, int sz, unsigned *f)
38 void sym_remove(sym_table *t, void *b)
39 char *SYM_NAME(void *b)
41 void sym_mkiter(sym_iter *i, sym_table *t)
42 void *sym_next(sym_iter *i)
44 cdef extern from 'grim.h':
47 cdef extern from 'Python.h':
48 int PyObject_AsReadBuffer(obj, void **buf, int *len) except -1
49 PyString_FromStringAndSize(char *p, int n)
50 ctypedef struct PyObject:
52 void Py_INCREF(PyObject *obj)
53 void Py_DECREF(PyObject *obj)
59 cdef entry *_find(sym_table *t, object k, unsigned *f) except ?NULL:
63 PyObject_AsReadBuffer(key, &p, &n)
66 e = <entry *>sym_find(t, <char *>p, n, PSIZEOF(e), f)
70 e = <entry *>sym_find(t, <char *>p, n, 0, NULL)
77 cdef void _eset(entry *e, v):
83 cdef void _edel(sym_table *t, entry *e):
86 sym_remove(t, <void *>e)
89 return PyString_FromStringAndSize(SYM_NAME(<void *>e), SYM_LEN(<void *>e))
93 def __new__(me, *hunoz, **hukairz):
95 def __init__(me, stuff = None, **kw):
97 def __getitem__(me, key):
99 e = _find(&me._t, key, NULL)
103 def __setitem__(me, key, value):
105 _eset(_find(&me._t, key, &f), value)
106 def __delitem__(me, key):
109 e = _find(&me._t, key, &f)
113 def get(me, key, default = None):
115 e = _find(&me._t, key, NULL)
119 def setdefault(me, key, default = None):
122 e = _find(&me._t, key, &f)
128 def pop(me, key, default = None):
130 e = _find(&me._t, key, NULL)
139 sym_mkiter(&i, &me._t)
140 e = <entry *>sym_next(&i)
142 raise ValueError, 'popitem(): table is empty'
143 return _key(e), _eget(e)
148 sym_mkiter(&i, &me._t)
150 e = <entry *>sym_next(&i)
159 sym_mkiter(&i, &me._t)
161 e = <entry *>sym_next(&i)
170 sym_mkiter(&i, &me._t)
172 e = <entry *>sym_next(&i)
175 l.append((_key(e), _eget(e)))
180 sym_mkiter(&i, &me._t)
182 e = <entry *>sym_next(&i)
190 sym_mkiter(&i, &me._t)
192 e = <entry *>sym_next(&i)
205 def update(me, stuff = None, **kw):
209 elif hasattr(stuff, 'itemiter'):
210 for k, v in stuff.itemiter:
211 _eset(_find(&me._t, k, &f), v)
212 elif hasattr(stuff, 'keys'):
213 for k in stuff.keys():
214 _eset(_find(&me._t, k, &f), stuff[k])
217 _eset(_find(&me._t, k, &f), v)
218 for k, v in kw.iteritems():
219 _eset(_find(&me._t, k, &f), v)
225 def __new__(me, Table t):
227 sym_mkiter(&me._i, &t._t)
232 e = <entry *>sym_next(&me._i)
237 cdef class ValueIter:
240 def __new__(me, Table t):
242 sym_mkiter(&me._i, &t._t)
247 e = <entry *>sym_next(&me._i)
255 def __new__(me, Table t):
257 sym_mkiter(&me._i, &t._t)
262 e = <entry *>sym_next(&me._i)
265 return _key(e), _eget(e)
267 #----- That's all, folks ----------------------------------------------------