File: misc.cc

package info (click to toggle)
pyelemental 1.2.0-2
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 344 kB
  • ctags: 244
  • sloc: cpp: 1,847; xml: 613; python: 46; makefile: 28; sh: 11
file content (96 lines) | stat: -rw-r--r-- 2,437 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/*
 * This file is part of pyElemental, a periodic table Python module with
 * detailed information on elements.
 *
 * Copyright (C) 2006-2007 Kevin Daughtridge <kevin@kdau.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program 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 General Public License
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
 */

#include "misc.hh"


bool
X_PyType_AddIntConstant (PyTypeObject* type, const char* name, long value)
{
	return PyDict_SetItemString (X_PYOBJECT (type->tp_dict),
		name, PyInt_FromLong (value)) == 0;
}


bool
X_PyObject_CheckAttr (PyObject* attr, PyTypeObject* attrtype,
	const char* attrname, PyTypeObject* type)
{
	if (attr == NULL)
	{
		PyErr_Format (PyExc_TypeError, "cannot delete a %s %s",
			type->tp_name, attrname);
		return false;
	}
	else if (!PyObject_TypeCheck (attr, attrtype))
	{
		PyErr_Format (PyExc_TypeError, "A %s %s must be a(n) %s.",
			type->tp_name, attrname, attrtype->tp_name);
		return false;
	}
	else
		return true;
}


bool
X_PySequence_CheckItems (PyObject* seq, PyTypeObject* type)
{
	if (!PySequence_Check (seq)) return false;
	int size = PySequence_Size (seq);
	if (size < 0) return false;
	
	for (int i = 0; i < size; ++i)
	{
		PyObject *item = PySequence_GetItem (seq, i);
		if (item == NULL) return false;
		bool item_valid = PyObject_TypeCheck (item, type);
		Py_DECREF (item);
		if (!item_valid) return false;
	}
	
	return true;
}


PyObject*
X_PyString_FromCxxString (const std::string& source)
{
	return PyString_FromString (source.data ());
}


PyObject*
X_PyUnicode_FromUstring (const Glib::ustring& source)
{
	return PyUnicode_DecodeUTF8 (source.data (), source.raw ().size (), NULL);
}


Glib::ustring
X_PyUnicode_AsUstring (PyObject* self)
{
	if (self == NULL) return Glib::ustring ();
	PyObject *str = PyUnicode_AsUTF8String (self);
	if (str == NULL) return Glib::ustring ();
	Glib::ustring result = PyString_AsString (str);
	Py_DECREF (str);
	return result;
}