+++ /dev/null
-/* 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__);
-}