fixed logging and tag id handling
[swftools.git] / lib / python / tagmap.c
1 /* tagmap.c
2
3    Python wrapper for librfxswf.
4
5    Part of the swftools package.
6
7    Copyright (c) 2003 Matthias Kramm <kramm@quiss.org>
8  
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 2 of the License, or
12    (at your option) any later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software
21    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
22
23 #include <Python.h>
24 #undef HAVE_STAT
25 #include "pyutils.h"
26 #include "tagmap.h"
27
28 typedef struct {
29     PyObject_HEAD
30     PyObject* obj2id;
31     PyObject* id2obj;
32     PyObject* objlist;
33     int currentID;
34 } TagMapObject;
35
36 //----------------------------------------------------------------------------
37 PyObject* tagmap_new()
38 {
39     PyObject* self = (PyObject*)PyObject_New(TagMapObject, &TagMapClass);
40     mylog("+%08x(%d) tagmap_new", (int)self, self->ob_refcnt);
41     TagMapObject*tagmap = (TagMapObject*)self;
42     tagmap->obj2id = PyDict_New();
43     tagmap->id2obj = PyDict_New();
44     tagmap->objlist = PyList_New(0);
45     tagmap->currentID = 0; //IDs start at 1
46     return self;
47 }
48
49 //----------------------------------------------------------------------------
50 int tagmap_obj2id(PyObject* self, PyObject* obj)
51 {
52     mylog(" %08x(%d) tagmap_obj2id %08x", (int)self, self->ob_refcnt, obj);
53     TagMapObject*tagmap = (TagMapObject*)self;
54     PyObject*id = PyDict_GetItem(tagmap->obj2id, obj);
55     if(id == 0)
56         return -1;
57     int _id = PyLong_AsLong(id);
58     Py_DECREF(id);
59     return _id;
60 }
61
62 //----------------------------------------------------------------------------
63 PyObject* tagmap_id2obj(PyObject* self, int _id)
64 {
65     TagMapObject*tagmap = (TagMapObject*)self;
66     PyObject*id = PyLong_FromLong(_id);
67     PyObject*obj = PyDict_GetItem(tagmap->id2obj, id);
68     mylog(" %08x(%d) tagmap_id2obj %d->%08x", (int)self, self->ob_refcnt, _id, obj);
69     Py_DECREF(id);
70     return obj;
71 }
72 //----------------------------------------------------------------------------
73 int tagmap_getFreeID(PyObject*self)
74 {
75     mylog(" %08x(%d) tagmap_getFreeID", (int)self, self->ob_refcnt);
76     TagMapObject*tagmap = (TagMapObject*)self;
77     int last = tagmap->currentID;
78     do {
79         tagmap->currentID++;
80         PyObject*id = PyLong_FromLong(tagmap->currentID);
81         PyObject*test = PyDict_GetItem(tagmap->id2obj,id);
82         Py_DECREF(id);
83         if(test == 0) {
84             PyErr_Clear();
85             mylog(" %08x(%d) tagmap_getFreeID -> %d", (int)self, self->ob_refcnt, tagmap->currentID);
86             return tagmap->currentID;
87         }
88     } while(last != tagmap->currentID);
89     mylog(" %08x(%d) tagmap_getFreeID -> -1", (int)self, self->ob_refcnt);
90     return -1;
91 }
92 //----------------------------------------------------------------------------
93 int tagmap_add(PyObject* self, PyObject* obj)
94 {
95     TagMapObject*tagmap = (TagMapObject*)self;
96     int id = tagmap_obj2id(self, obj);
97     if(id>=0) {
98         mylog(" %08x(%d) tagmap_add %08x->%d (again)", (int)self, self->ob_refcnt, (int)obj, id);
99         return id;
100     }
101     id = tagmap_getFreeID(self);
102     PyList_Append(tagmap->objlist, obj);//Py_INCREF(obj); done by PyList_Append
103     PyObject*id_obj = PyLong_FromLong(id);
104     PyDict_SetItem(tagmap->obj2id, obj, id_obj);//Py_INCREF(id_obj);Py_INCREF(obj); done by PyDict_SetItem
105     PyDict_SetItem(tagmap->id2obj, id_obj, obj);//Py_INCREF(id_obj);Py_INCREF(obj); done by PyDict_SetItem
106     Py_DECREF(id_obj);
107     mylog(" %08x(%d) tagmap_add %08x->%d", (int)self, self->ob_refcnt, (int)obj, id);
108     return id;
109 }
110
111 //----------------------------------------------------------------------------
112 void tagmap_dealloc(PyObject* self)
113 {
114     mylog("-%08x(%d) tagmap_dealloc", (int)self, self->ob_refcnt);
115     TagMapObject*tagmap = (TagMapObject*)self;
116     Py_DECREF(tagmap->obj2id);
117     tagmap->obj2id = 0;
118     Py_DECREF(tagmap->id2obj);
119     tagmap->id2obj = 0;
120     Py_DECREF(tagmap->objlist);
121     tagmap->objlist = 0;
122     PyObject_Del(self);
123 }
124 //----------------------------------------------------------------------------
125 PyObject* tagmap_getObjectList(PyObject* self)
126 {
127     mylog(" %08x(%d) tagmap_getObjectList", (int)self, self->ob_refcnt);
128     TagMapObject*tagmap = (TagMapObject*)self;
129     Py_INCREF(tagmap->objlist);
130     return tagmap->objlist;
131 }
132 //----------------------------------------------------------------------------
133 PyTypeObject TagMapClass = 
134 {
135     PyObject_HEAD_INIT(NULL)
136     0,
137     tp_name: "TagMap",
138     tp_basicsize: sizeof(TagMapObject),
139     tp_itemsize: 0,
140     tp_dealloc: tagmap_dealloc,
141     tp_print: 0,
142     tp_getattr: 0,
143     tp_setattr: 0,
144 };