File: class/Workbook/Exercises/Lab11/environ.c
/*
* A C extension module for Python, called "environ".
* Wrap the C library's getenv/putenv routines for use in
* Python programs. Inspired by an idea from Andy Bensky.
*/
#include <Python.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
static PyObject * /* returns object */
wrap_getenv(PyObject *self, PyObject *args) /* self not used */
{ /* args from python */
char *varName, *varValue;
PyObject *returnObj = NULL; /* null=exception */
if (PyArg_Parse(args, "s", &varName)) /* Python -> C */
if ((varValue = getenv(varName)) != NULL) /* call C getenv */
returnObj = Py_BuildValue("s", varValue); /* C -> Python */
else
PyErr_SetString(PyExc_SystemError, "Error calling getenv");
else
PyErr_SetString(PyExc_TypeError, "Usage: getenv(varName)");
return returnObj;
}
static PyObject *
wrap_putenv(PyObject *self, PyObject *args)
{
char *varName, *varValue, *varAssign;
PyObject *returnObj = NULL;
if (PyArg_Parse(args, "(ss)", &varName, &varValue))
{
varAssign = malloc(strlen(varName) + strlen(varValue) + 2);
sprintf(varAssign, "%s=%s", varName, varValue);
if (putenv(varAssign) == 0) {
Py_INCREF(Py_None); /* success */
returnObj = Py_None; /* reference None */
}
else
PyErr_SetString(PyExc_SystemError, "Error calling putenv");
}
else
PyErr_SetString(PyExc_TypeError, "Usage: putenv(varName, varValue)");
return returnObj;
}
static struct PyMethodDef environ_methods[] = {
{"getenv", wrap_getenv},
{"putenv", wrap_putenv}, /* name, address */
{NULL, NULL}
};
void initenviron() /* on first import */
{
(void) Py_InitModule("environ", environ_methods);
}