Sample extension module: InterSLIP control API.
diff --git a/Mac/Demo/interslip/interslipmodule.c b/Mac/Demo/interslip/interslipmodule.c
new file mode 100644
index 0000000..dc2c7a8
--- /dev/null
+++ b/Mac/Demo/interslip/interslipmodule.c
@@ -0,0 +1,225 @@
+/***********************************************************
+Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
+The Netherlands.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Stichting Mathematisch
+Centrum or CWI not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior permission.
+
+STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
+THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
+FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
+#include "Python.h"
+#include "InterslipLib.h"
+#include "macglue.h"
+
+static PyObject *ErrorObject;
+
+/* ----------------------------------------------------- */
+
+static char pyis_open__doc__[] =
+"Load the interslip driver (optional)"
+;
+
+static PyObject *
+pyis_open(self, args)
+	PyObject *self;	/* Not used */
+	PyObject *args;
+{
+	OSErr err;
+
+	if (!PyArg_ParseTuple(args, ""))
+		return NULL;
+	err = is_open();
+	if ( err ) {
+		PyErr_Mac(ErrorObject, err);
+		return NULL;
+	}
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+static char pyis_connect__doc__[] =
+"Tell the driver to start a connect"
+;
+
+static PyObject *
+pyis_connect(self, args)
+	PyObject *self;	/* Not used */
+	PyObject *args;
+{
+	OSErr err;
+
+	if (!PyArg_ParseTuple(args, ""))
+		return NULL;
+	err = is_connect();
+	if ( err ) {
+		PyErr_Mac(ErrorObject, err);
+		return NULL;
+	}
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+static char pyis_disconnect__doc__[] =
+"Tell the interslip driver to start a disconnect"
+;
+
+static PyObject *
+pyis_disconnect(self, args)
+	PyObject *self;	/* Not used */
+	PyObject *args;
+{
+	OSErr err;
+
+	if (!PyArg_ParseTuple(args, ""))
+		return NULL;
+	err = is_disconnect();
+	if ( err ) {
+		PyErr_Mac(ErrorObject, err);
+		return NULL;
+	}
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+static char pyis_status__doc__[] =
+"Return (numeric_status, message_seqnum, message_string) status tuple"
+;
+
+static PyObject *
+pyis_status(self, args)
+	PyObject *self;	/* Not used */
+	PyObject *args;
+{
+	long status, seqnum;
+	StringPtr message;
+	OSErr err;
+
+	if (!PyArg_ParseTuple(args, ""))
+		return NULL;
+	err = is_status(&status, &seqnum, &message);
+	if ( err ) {
+		PyErr_Mac(ErrorObject, err);
+		return NULL;
+	}
+	return Py_BuildValue("iiO&", (int)status, (int)seqnum, PyMac_BuildStr255, message);
+}
+
+static char pyis_getconfig__doc__[] =
+"Return configuration data (ibaud, obaud, flags, idrvname, odrvname, cfgname)"
+;
+
+static PyObject *
+pyis_getconfig(self, args)
+	PyObject *self;	/* Not used */
+	PyObject *args;
+{
+	long baudrate, flags;
+	Str255 idrvname, odrvname, cfgname;
+	OSErr err;
+	int ibaud, obaud;
+
+	if (!PyArg_ParseTuple(args, ""))
+		return NULL;
+	err = is_getconfig(&baudrate, &flags, idrvname, odrvname, cfgname);
+	if ( err ) {
+		PyErr_Mac(ErrorObject, err);
+		return NULL;
+	}
+	ibaud = (baudrate >> 16) & 0xffff;
+	obaud = baudrate & 0xffff;
+	return Py_BuildValue("iiiO&O&O&", ibaud, obaud, (int)flags, PyMac_BuildStr255, idrvname,
+			PyMac_BuildStr255, odrvname, PyMac_BuildStr255, cfgname);
+}
+
+static char pyis_setconfig__doc__[] =
+"Set configuration data (ibaud, obaud, flags, idrvname, odrvname, cfgname)"
+;
+
+static PyObject *
+pyis_setconfig(self, args)
+	PyObject *self;	/* Not used */
+	PyObject *args;
+{
+	long baudrate;
+	int flags;
+	Str255 idrvname, odrvname, cfgname;
+	OSErr err;
+	int ibaud, obaud;
+
+	if (!PyArg_ParseTuple(args, "iiiO&O&O&", &ibaud, &obaud, &flags, PyMac_GetStr255, idrvname,
+			PyMac_GetStr255, odrvname, PyMac_GetStr255, cfgname))
+		return NULL;
+	baudrate = (ibaud << 16) | obaud;
+	err = is_setconfig(baudrate, (long)flags, idrvname, odrvname, cfgname);
+	if ( err ) {
+		PyErr_Mac(ErrorObject, err);
+		return NULL;
+	}
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* List of methods defined in the module */
+
+static struct PyMethodDef pyis_methods[] = {
+	{"open",	pyis_open,	1,	pyis_open__doc__},
+ {"connect",	pyis_connect,	1,	pyis_connect__doc__},
+ {"disconnect",	pyis_disconnect,	1,	pyis_disconnect__doc__},
+ {"status",	pyis_status,	1,	pyis_status__doc__},
+ {"getconfig",	pyis_getconfig,	1,	pyis_getconfig__doc__},
+ {"setconfig",	pyis_setconfig,	1,	pyis_setconfig__doc__},
+ 
+	{NULL,		NULL}		/* sentinel */
+};
+
+
+/* Initialization function for the module (*must* be called initinterslip) */
+
+static char interslip_module_documentation[] = 
+""
+;
+
+void
+initinterslip()
+{
+	PyObject *m, *d;
+
+	/* Create the module and add the functions */
+	m = Py_InitModule4("interslip", pyis_methods,
+		interslip_module_documentation,
+		(PyObject*)NULL,PYTHON_API_VERSION);
+
+	/* Add some symbolic constants to the module */
+	d = PyModule_GetDict(m);
+	ErrorObject = PyString_FromString("interslip.error");
+	PyDict_SetItemString(d, "error", ErrorObject);
+
+	/* XXXX Add constants here */
+
+	PyDict_SetItemString(d, "IDLE", PyInt_FromLong(IS_IDLE));
+	PyDict_SetItemString(d, "WMODEM", PyInt_FromLong(IS_WMODEM));
+	PyDict_SetItemString(d, "DIAL", PyInt_FromLong(IS_DIAL));
+	PyDict_SetItemString(d, "LOGIN", PyInt_FromLong(IS_LOGIN));
+	PyDict_SetItemString(d, "RUN", PyInt_FromLong(IS_RUN));
+	PyDict_SetItemString(d, "DISC", PyInt_FromLong(IS_DISC));
+	
+	/* Check for errors */
+	if (PyErr_Occurred())
+		Py_FatalError("can't initialize module interslip");
+}
+