Create pyextension_utils.c
This commit is contained in:
138
python/pyextension_utils.c
Normal file
138
python/pyextension_utils.c
Normal file
@@ -0,0 +1,138 @@
|
||||
/*
|
||||
pyextension_utils.c : C extension utilities for Python
|
||||
|
||||
Copyright (C) 2014 Simon D. Levy
|
||||
|
||||
This code is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This code 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 Lesser General Public License
|
||||
along with this code. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <Python.h>
|
||||
|
||||
static void raise_argument_exception(const char * classname, const char * methodname, const char * details)
|
||||
{
|
||||
char errmsg[1000];
|
||||
sprintf(errmsg, "Wrong/insufficient arguments passed to %s.%s()%s %s",
|
||||
classname, methodname,
|
||||
details ? ":" : "", details ? details : "");
|
||||
PyErr_SetString(PyExc_TypeError, errmsg);
|
||||
|
||||
}
|
||||
|
||||
PyObject * null_on_raise_argument_exception_with_details(const char * classname, const char * methodname, const char * details)
|
||||
{
|
||||
raise_argument_exception(classname, methodname, details);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PyObject *null_on_raise_argument_exception(const char * classname, const char * methodname)
|
||||
{
|
||||
return null_on_raise_argument_exception_with_details(classname, methodname, NULL);
|
||||
}
|
||||
|
||||
int error_on_raise_argument_exception_with_details(const char * classname, const char * methodname, const char * details)
|
||||
{
|
||||
raise_argument_exception(classname, methodname, details);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int error_on_raise_argument_exception(const char * classname)
|
||||
{
|
||||
return error_on_raise_argument_exception_with_details(classname, "__init__", NULL);
|
||||
}
|
||||
|
||||
int type_is_ready(PyTypeObject * type)
|
||||
{
|
||||
return (PyType_Ready(type) >= 0);
|
||||
}
|
||||
|
||||
|
||||
void add_class(PyObject * module, PyTypeObject * type, const char * classname)
|
||||
{
|
||||
Py_INCREF(type);
|
||||
PyModule_AddObject(module, classname, (PyObject *)type);
|
||||
|
||||
}
|
||||
|
||||
int double_from_tuple(PyObject * tup, int pos, double * val)
|
||||
{
|
||||
PyObject * py_val = PyTuple_GetItem(tup, pos);
|
||||
|
||||
if (py_val)
|
||||
{
|
||||
*val = PyFloat_AsDouble(py_val);
|
||||
return PyErr_Occurred() ? 0 : 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
double_from_obj(
|
||||
PyObject * obj,
|
||||
const char * name,
|
||||
double * val)
|
||||
{
|
||||
PyObject * attr = PyObject_GetAttrString(obj, name);
|
||||
|
||||
if (!attr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
*val = PyFloat_AsDouble(attr);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
int_from_obj(
|
||||
PyObject * obj,
|
||||
const char * name,
|
||||
int * val)
|
||||
{
|
||||
PyObject * attr = PyObject_GetAttrString(obj, name);
|
||||
|
||||
if (!attr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
*val = PyLong_AsLong(attr);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
error_on_check_argument_type(
|
||||
PyObject * obj,
|
||||
PyTypeObject * typ,
|
||||
int pos,
|
||||
const char * typname,
|
||||
const char * classname,
|
||||
const char *methodname)
|
||||
{
|
||||
|
||||
if (!PyObject_TypeCheck(obj, typ))
|
||||
{
|
||||
char details[200];
|
||||
sprintf(details, "argument %d is not of type %s", pos+1, typname);
|
||||
raise_argument_exception(classname, methodname, details);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user