static PyObject * csv_get_dialect(PyObject *module, PyObject *name_obj) { return get_dialect_from_registry(name_obj); }
static PyObject * dialect_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) { DialectObj *self; PyObject *ret = NULL; PyObject *dialect = NULL; PyObject *delimiter = NULL; PyObject *doublequote = NULL; PyObject *escapechar = NULL; PyObject *lineterminator = NULL; PyObject *quotechar = NULL; PyObject *quoting = NULL; PyObject *skipinitialspace = NULL; PyObject *strict = NULL; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|OOOOOOOOO", dialect_kws, &dialect, &delimiter, &doublequote, &escapechar, &lineterminator, "echar, "ing, &skipinitialspace, &strict)) return NULL; if (dialect != NULL) { if (IS_BASESTRING(dialect)) { dialect = get_dialect_from_registry(dialect); if (dialect == NULL) return NULL; } else Py_INCREF(dialect); /* Can we reuse this instance? */ if (PyObject_TypeCheck(dialect, &Dialect_Type) && delimiter == 0 && doublequote == 0 && escapechar == 0 && lineterminator == 0 && quotechar == 0 && quoting == 0 && skipinitialspace == 0 && strict == 0) return dialect; } self = (DialectObj *)type->tp_alloc(type, 0); if (self == NULL) { Py_XDECREF(dialect); return NULL; } self->lineterminator = NULL; Py_XINCREF(delimiter); Py_XINCREF(doublequote); Py_XINCREF(escapechar); Py_XINCREF(lineterminator); Py_XINCREF(quotechar); Py_XINCREF(quoting); Py_XINCREF(skipinitialspace); Py_XINCREF(strict); if (dialect != NULL) { #define DIALECT_GETATTR(v, n) \ if (v == NULL) \ v = PyObject_GetAttrString(dialect, n) DIALECT_GETATTR(delimiter, "delimiter"); DIALECT_GETATTR(doublequote, "doublequote"); DIALECT_GETATTR(escapechar, "escapechar"); DIALECT_GETATTR(lineterminator, "lineterminator"); DIALECT_GETATTR(quotechar, "quotechar"); DIALECT_GETATTR(quoting, "quoting"); DIALECT_GETATTR(skipinitialspace, "skipinitialspace"); DIALECT_GETATTR(strict, "strict"); PyErr_Clear(); } /* check types and convert to C values */ #define DIASET(meth, name, target, src, dflt) \ if (meth(name, target, src, dflt)) \ goto err DIASET(_set_char, "delimiter", &self->delimiter, delimiter, ','); DIASET(_set_bool, "doublequote", &self->doublequote, doublequote, 1); DIASET(_set_char, "escapechar", &self->escapechar, escapechar, 0); DIASET(_set_str, "lineterminator", &self->lineterminator, lineterminator, "\r\n"); DIASET(_set_char, "quotechar", &self->quotechar, quotechar, '"'); DIASET(_set_int, "quoting", &self->quoting, quoting, QUOTE_MINIMAL); DIASET(_set_bool, "skipinitialspace", &self->skipinitialspace, skipinitialspace, 0); DIASET(_set_bool, "strict", &self->strict, strict, 0); /* validate options */ if (dialect_check_quoting(self->quoting)) goto err; if (self->delimiter == 0) { PyErr_SetString(PyExc_TypeError, "\"delimiter\" must be an 1-character string"); goto err; } if (quotechar == Py_None && quoting == NULL) self->quoting = QUOTE_NONE; if (self->quoting != QUOTE_NONE && self->quotechar == 0) { PyErr_SetString(PyExc_TypeError, "quotechar must be set if quoting enabled"); goto err; } if (self->lineterminator == 0) { PyErr_SetString(PyExc_TypeError, "lineterminator must be set"); goto err; } ret = (PyObject *)self; Py_INCREF(self); err: Py_XDECREF(self); Py_XDECREF(dialect); Py_XDECREF(delimiter); Py_XDECREF(doublequote); Py_XDECREF(escapechar); Py_XDECREF(lineterminator); Py_XDECREF(quotechar); Py_XDECREF(quoting); Py_XDECREF(skipinitialspace); Py_XDECREF(strict); return ret; }
static int dialect_init(DialectObj * self, PyObject * args, PyObject * kwargs) { PyObject *dialect = NULL, *name_obj, *value_obj; self->quotechar = '"'; self->delimiter = ','; self->escapechar = '\0'; self->skipinitialspace = 0; Py_XDECREF(self->lineterminator); self->lineterminator = PyString_FromString("\r\n"); if (self->lineterminator == NULL) return -1; self->quoting = QUOTE_MINIMAL; self->doublequote = 1; self->strict = 0; if (!PyArg_UnpackTuple(args, "", 0, 1, &dialect)) return -1; Py_XINCREF(dialect); if (kwargs != NULL) { PyObject * key = PyString_FromString("dialect"); PyObject * d; d = PyDict_GetItem(kwargs, key); if (d) { Py_INCREF(d); Py_XDECREF(dialect); PyDict_DelItem(kwargs, key); dialect = d; } Py_DECREF(key); } if (dialect != NULL) { int i; PyObject * dir_list; /* If dialect is a string, look it up in our registry */ if (PyString_Check(dialect) #ifdef Py_USING_UNICODE || PyUnicode_Check(dialect) #endif ) { PyObject * new_dia; new_dia = get_dialect_from_registry(dialect); Py_DECREF(dialect); if (new_dia == NULL) return -1; dialect = new_dia; } /* A class rather than an instance? Instantiate */ if (PyObject_TypeCheck(dialect, &PyClass_Type)) { PyObject * new_dia; new_dia = PyObject_CallFunction(dialect, ""); Py_DECREF(dialect); if (new_dia == NULL) return -1; dialect = new_dia; } /* Make sure we finally have an instance */ if (!PyInstance_Check(dialect) || (dir_list = PyObject_Dir(dialect)) == NULL) { PyErr_SetString(PyExc_TypeError, "dialect must be an instance"); Py_DECREF(dialect); return -1; } /* And extract the attributes */ for (i = 0; i < PyList_GET_SIZE(dir_list); ++i) { char *s; name_obj = PyList_GET_ITEM(dir_list, i); s = PyString_AsString(name_obj); if (s == NULL) return -1; if (s[0] == '_') continue; value_obj = PyObject_GetAttr(dialect, name_obj); if (value_obj) { if (PyObject_SetAttr((PyObject *)self, name_obj, value_obj)) { Py_DECREF(value_obj); Py_DECREF(dir_list); Py_DECREF(dialect); return -1; } Py_DECREF(value_obj); } } Py_DECREF(dir_list); Py_DECREF(dialect); } if (kwargs != NULL) { int pos = 0; while (PyDict_Next(kwargs, &pos, &name_obj, &value_obj)) { if (PyObject_SetAttr((PyObject *)self, name_obj, value_obj)) return -1; } } return 0; }