Exposing more of the API from libasm

This commit is contained in:
Pierre Pronchery 2013-02-11 13:50:31 +01:00
parent 0bd5a62bad
commit 960d533ea5
2 changed files with 200 additions and 0 deletions

View File

@ -30,12 +30,49 @@ static char const _libasm_asm_name[] = "libasm::Asm";
static PyObject * _libasm_asm_new(PyObject * self, PyObject * args);
static void _libasm_asm_delete(PyObject * self);
/* accessors */
static PyObject * _libasm_asm_get_arch(PyObject * self, PyObject * args);
static PyObject * _libasm_asm_get_format(PyObject * self, PyObject * args);
static PyObject * _libasm_asm_set_arch(PyObject * self, PyObject * args);
static PyObject * _libasm_asm_set_format(PyObject * self, PyObject * args);
/* useful */
/* detection */
static PyObject * _libasm_asm_guess_arch(PyObject * self, PyObject * args);
static PyObject * _libasm_asm_guess_format(PyObject * self, PyObject * args);
/* common */
static PyObject * _libasm_asm_close(PyObject * self, PyObject * args);
/* assemble */
static PyObject * _libasm_asm_open_assemble(PyObject * self, PyObject * args);
static PyObject * _libasm_asm_instruction(PyObject * self, PyObject * args);
/* variables */
static PyMethodDef _libasm_methods[] =
{
{ "asm_new", _libasm_asm_new, METH_VARARGS,
"Instantiates an Asm object." },
{ "asm_get_arch", _libasm_asm_get_arch, METH_VARARGS,
"Obtain the current architecture in use." },
{ "asm_get_format", _libasm_asm_get_format, METH_VARARGS,
"Obtain the current format in use." },
{ "asm_set_arch", _libasm_asm_set_arch, METH_VARARGS,
"Set the current architecture in use." },
{ "asm_set_format", _libasm_asm_set_format, METH_VARARGS,
"Set the current format in use." },
{ "asm_guess_arch", _libasm_asm_guess_arch, METH_VARARGS,
"Guess the current architecture." },
{ "asm_guess_format", _libasm_asm_guess_format, METH_VARARGS,
"Guess the current format." },
{ "asm_close", _libasm_asm_close, METH_VARARGS,
"Close the file currently opened." },
{ "asm_open_assemble", _libasm_asm_open_assemble, METH_VARARGS,
"Open a file to write instructions." },
{ "asm_instruction", _libasm_asm_instruction, METH_VARARGS,
"Process an assembly instruction." },
{ NULL, NULL, 0, NULL }
};
@ -79,3 +116,139 @@ static void _libasm_asm_delete(PyObject * self)
return;
asm_delete(a);
}
/* accessors */
/* libasm_asm_get_arch */
static PyObject * _libasm_asm_get_arch(PyObject * self, PyObject * args)
{
Asm * a;
char const * ret;
if((a = PyCapsule_GetPointer(self, _libasm_asm_name)) == NULL
|| !PyArg_ParseTuple(args, "")
|| (ret = asm_get_arch(a)) == NULL)
return NULL;
return Py_BuildValue("s", ret);
}
/* libasm_asm_get_format */
static PyObject * _libasm_asm_get_format(PyObject * self, PyObject * args)
{
Asm * a;
char const * ret;
if((a = PyCapsule_GetPointer(self, _libasm_asm_name)) == NULL
|| !PyArg_ParseTuple(args, "")
|| (ret = asm_get_format(a)) == NULL)
return NULL;
return Py_BuildValue("s", ret);
}
/* libasm_asm_set_arch */
static PyObject * _libasm_asm_set_arch(PyObject * self, PyObject * args)
{
Asm * a;
char const * arch;
int ret;
if((a = PyCapsule_GetPointer(self, _libasm_asm_name)) == NULL
|| !PyArg_ParseTuple(args, "s", &arch))
return NULL;
ret = asm_set_arch(a, arch);
return Py_BuildValue("i", ret);
}
/* libasm_asm_set_format */
static PyObject * _libasm_asm_set_format(PyObject * self, PyObject * args)
{
Asm * a;
char const * format;
int ret;
if((a = PyCapsule_GetPointer(self, _libasm_asm_name)) == NULL
|| !PyArg_ParseTuple(args, "s", &format))
return NULL;
ret = asm_set_format(a, format);
return Py_BuildValue("i", ret);
}
/* useful */
/* detection */
/* libasm_asm_guess_arch */
static PyObject * _libasm_asm_guess_arch(PyObject * self, PyObject * args)
{
Asm * a;
int ret;
if((a = PyCapsule_GetPointer(self, _libasm_asm_name)) == NULL
|| !PyArg_ParseTuple(args, ""))
return NULL;
ret = asm_guess_arch(a);
return Py_BuildValue("i", ret);
}
/* libasm_guess_format */
static PyObject * _libasm_asm_guess_format(PyObject * self, PyObject * args)
{
Asm * a;
int ret;
if((a = PyCapsule_GetPointer(self, _libasm_asm_name)) == NULL
|| !PyArg_ParseTuple(args, ""))
return NULL;
ret = asm_guess_format(a);
return Py_BuildValue("i", ret);
}
/* common */
/* libasm_asm_close */
static PyObject * _libasm_asm_close(PyObject * self, PyObject * args)
{
Asm * a;
int ret;
if((a = PyCapsule_GetPointer(self, _libasm_asm_name)) == NULL
|| !PyArg_ParseTuple(args, ""))
return NULL;
ret = asm_close(a);
return Py_BuildValue("i", ret);
}
/* assemble */
/* libasm_asm_open_assemble */
static PyObject * _libasm_asm_open_assemble(PyObject * self, PyObject * args)
{
Asm * a;
char const * outfile;
int ret;
if((a = PyCapsule_GetPointer(self, _libasm_asm_name)) == NULL
|| !PyArg_ParseTuple(args, "s", &outfile))
return NULL;
ret = asm_open_assemble(a, outfile);
return Py_BuildValue("i", ret);
}
/* libasm_asm_instruction */
static PyObject * _libasm_asm_instruction(PyObject * self, PyObject * args)
{
Asm * a;
char const * name;
int ret;
if((a = PyCapsule_GetPointer(self, _libasm_asm_name)) == NULL
/* FIXME really parse the arguments */
|| !PyArg_ParseTuple(args, "s", &name))
return NULL;
ret = asm_instruction(a, name, 0);
return Py_BuildValue("i", ret);
}

View File

@ -23,3 +23,30 @@ import _libasm
class Asm:
def __init__(self, arch, format):
self.asm = _libasm.asm_new(arch, format)
def get_arch(self):
return _libasm.asm_get_arch(self.asm)
def get_format(self):
return _libasm.asm_get_format(self.asm)
def set_arch(self, arch):
return _libasm.asm_set_arch(self.asm, arch)
def set_format(self, format):
return _libasm.asm_set_format(self.asm, format)
def guess_arch(self):
return _libasm.asm_guess_arch(self.asm)
def guess_format(self):
return _libasm.asm_guess_format(self.asm)
def close(self):
return _libasm.asm_close(self.asm)
def open_assemble(self, outfile):
return _libasm.asm_open_assemble(self.asm, outfile)
def instruction(self, name):
return _libasm.asm_instruction(self.asm, name)