Disembl binaries and its dependancies e.g. minimized BioPython distribution and sovgo...
[jabaws.git] / binaries / src / disembl / biopython-1.50 / Bio / cstringfnsmodule.c
diff --git a/binaries/src/disembl/biopython-1.50/Bio/cstringfnsmodule.c b/binaries/src/disembl/biopython-1.50/Bio/cstringfnsmodule.c
new file mode 100644 (file)
index 0000000..af098fd
--- /dev/null
@@ -0,0 +1,122 @@
+/* Copyright 2000 by Jeffrey Chang.  All rights reserved.
+ * This code is part of the Biopython distribution and governed by its
+ * license.  Please see the LICENSE file that should have been included
+ * as part of this package.
+ *
+ * cstringfnsmodule.c
+ * Created 7 Jun 2000
+ */
+
+#include "Python.h"
+#include <string.h>  /* memset */
+
+
+/* Functions in this module. */
+
+static char cstringfns_splitany__doc__[] = 
+"splitany(str [,sep [,maxsplit [,negate]]]) -> list of strings\n\
+\n\
+Split a string.  Similar to string.split, except that this considers\n\
+any one of the characters in sep to be a delimiter.  If negate is\n\
+true, then everything but sep will be a separator.\n\
+\n\
+";
+
+static PyObject *cstringfns_splitany(
+     PyObject *self, PyObject *args, PyObject *keywds)
+{
+    int i, prev;
+    int nsplit, maxsplit=0;
+    /*int negate=0;*/
+    PyObject *py_negate=NULL;
+    PyObject *strlist, *newstr;
+    unsigned char *str, 
+       *sep=" \011\012\013\014\015";  /* whitespace */
+    char tosplit[256];
+    static char *kwlist[] = {"str", "sep", "maxsplit", "negate", NULL};
+
+    if(!PyArg_ParseTupleAndKeywords(args, keywds, "s|siO", kwlist, 
+                                   &str, &sep, &maxsplit, &py_negate))
+       return NULL;
+    if(maxsplit < 0)
+       maxsplit = 1;
+    /* negate = (py_negate && PyObject_IsTrue(py_negate));*/
+    /* XXX NO MORE NEGATE */
+
+    /* Set the tosplit array to 1 for characters to split on. */
+    memset(tosplit, 0, 256);
+    while(*sep) {
+       tosplit[(unsigned char)*sep++] = 1;
+       }
+    if(py_negate && PyObject_IsTrue(py_negate)) {
+       for(i=0; i<256; i++)
+           tosplit[i] = !tosplit[i];
+    }
+
+    /* Create a new list to store the variables. */
+    if(!(strlist = PyList_New(0))) {
+       PyErr_SetString(PyExc_SystemError, "I could not create a new list");
+       return NULL;
+    }
+
+    prev = 0;
+    nsplit = 0;
+    for(i=0; str[i] && (maxsplit == 0 || nsplit < maxsplit); i++) {
+       /*if(!(tosplit[(int)str[i]] == !negate))
+         continue; */
+       if(!tosplit[(int)str[i]])
+           continue;
+
+       /* Split the string here. */
+       if(!(newstr = PyString_FromStringAndSize(&str[prev], i-prev))) {
+           PyErr_SetString(PyExc_SystemError, 
+                           "I could not create a new string");
+           break;
+       }
+       if(PyList_Append(strlist, newstr) == -1) {
+           Py_DECREF(newstr);
+           break;
+       }
+       Py_DECREF(newstr);
+       prev = i+1;
+       nsplit++;
+    }
+    if(!PyErr_Occurred()) {
+       i = strlen(str);
+       /* Add the last one. */
+       if(!(newstr = PyString_FromStringAndSize(&str[prev], i-prev))) {
+           PyErr_SetString(PyExc_SystemError, 
+                           "I could not create a new string");
+       } else {
+           PyList_Append(strlist, newstr);
+           Py_DECREF(newstr);
+       }
+    } else {
+       Py_DECREF(strlist);
+       return NULL;
+    }
+
+
+    return strlist;
+}
+
+
+
+/* Module definition stuff */
+
+static PyMethodDef cstringfnsMethods[] = {
+  {"splitany", (PyCFunction)cstringfns_splitany, METH_VARARGS|METH_KEYWORDS, 
+   cstringfns_splitany__doc__},
+  {NULL, NULL}
+};
+
+static char cstringfns__doc__[] =
+"This provides helper functions for the stringfns module.\n\
+You should never import this module on its own.\n\
+\n\
+";
+
+void initcstringfns(void)
+{
+  (void) Py_InitModule3("cstringfns", cstringfnsMethods, cstringfns__doc__);
+}