Added extra ranlib on libary files after being copied to the lib tree for OSX only.
[blender-staging.git] / intern / python / testmodule / testmodule.c
1 /**
2  * $Id$
3  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version. The Blender
9  * Foundation also sells licenses for use in proprietary software under
10  * the Blender License.  See http://www.blender.org/BL/ for information
11  * about this.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software Foundation,
20  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21  *
22  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
23  * All rights reserved.
24  *
25  * The Original Code is: all of this file.
26  *
27  * Contributor(s): none yet.
28  *
29  * ***** END GPL/BL DUAL LICENSE BLOCK *****
30  */
31
32 /***********************/
33
34 /* (c) Jan Walter 2000 */
35 /***********************/
36
37 /* CVS */
38 /* $Author$ */
39 /* $Date$ */
40 /* $RCSfile$ */
41 /* $Revision$ */
42
43 #include "Python.h"
44
45 /************************************/
46 /* struct for the class "TestClass" */
47 /************************************/
48
49 typedef struct {
50   PyObject_HEAD
51   PyObject* memberVariable;
52 } testclass;
53
54 staticforward PyTypeObject TestclassType;
55
56 /************************************/
57 /* make instance of class TestClass */
58 /************************************/
59
60 static testclass*
61 newtestclass()
62 {
63   testclass* tc;
64   tc = PyObject_NEW(testclass, &TestclassType);
65   if (tc == NULL)
66     {
67       return NULL;
68     }
69   tc->memberVariable = PyString_FromString("initValue");
70
71   return tc;
72 }
73
74 /*********************************/
75 /* instance methods of TestClass */
76 /*********************************/
77
78 static PyObject*
79 testclass_memberFunction(PyObject* tc, PyObject* args)
80 {
81   PyRun_SimpleString("print \"inside memberFunction() ...\"\n");
82
83   Py_INCREF(Py_None);
84
85   return Py_None;
86 }
87
88 static struct PyMethodDef testclass_methods[] = {
89   { "memberFunction", testclass_memberFunction, METH_VARARGS },
90   { NULL, NULL }
91 };
92
93 /*********************************/
94 /* basic operations on TestClass */
95 /*********************************/
96
97 static PyObject*
98 testclass_dealloc(testclass* tc)
99 {
100   PyMem_DEL(tc);
101 }
102
103 static PyObject*
104 testclass_getattr(testclass* tc, char* name)
105 {
106   if (strcmp(name, "memberVariable") == 0)
107     {
108       return Py_BuildValue("O", tc->memberVariable);
109     }
110   else
111     {
112       return Py_FindMethod(testclass_methods, (PyObject*) tc, name);
113     }  
114 }
115
116 static int
117 testclass_setattr(testclass* tc, char* name, PyObject* attr)
118 {
119   if (strcmp(name, "memberVariable") == 0)
120     {
121       Py_XDECREF(tc->memberVariable);
122       tc->memberVariable = attr;
123       Py_INCREF(attr);
124     }
125   else
126     {
127       PyErr_SetString(PyExc_AttributeError, name);
128
129       return -1;
130     }  
131
132   return 0;
133 }
134
135 /************************************/
136 /* table of functions for TestClass */
137 /************************************/
138
139 static PyTypeObject TestclassType = {
140   PyObject_HEAD_INIT(&PyType_Type)
141   0,                               /* ob_size */
142   "testclass",                     /* tp_name */
143   sizeof(testclass),               /* tp_basicsize */
144   0,                               /* tp_itemsize */
145   (destructor) testclass_dealloc,  /* tp_dealloc */
146   (printfunc) 0,                   /* tp_print */
147   (getattrfunc) testclass_getattr, /* tp_getattr */
148   (setattrfunc) testclass_setattr, /* tp_setattr */
149   (cmpfunc) 0,                     /* tp_compare */
150   (reprfunc) 0,                    /* tp_repr */
151   /* there is more ... */
152 }; /* see Include/object.h */
153
154 /***********************************/
155 /* constructor for class TestClass */
156 /***********************************/
157
158 static PyObject*
159 testclass_new(PyObject* self, PyObject* args)
160 {
161   if (!PyArg_ParseTuple(args, ""))
162     {
163       return NULL;
164     }
165
166   return (PyObject*) newtestclass();
167 }
168
169 /*********************/
170 /* module testmodule */
171 /*********************/
172
173 static struct PyMethodDef testmodule_methods[] = {
174   { "TestClass", testclass_new, METH_VARARGS },
175   { NULL, NULL }
176 };
177
178 void
179 inittestmodule()
180 {
181   (void) Py_InitModule("testmodule", testmodule_methods);
182 }