summaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/src/Modules/_csv.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/tools/python3/src/Modules/_csv.c')
-rw-r--r--contrib/tools/python3/src/Modules/_csv.c34
1 files changed, 23 insertions, 11 deletions
diff --git a/contrib/tools/python3/src/Modules/_csv.c b/contrib/tools/python3/src/Modules/_csv.c
index 407d6f03540..91cb63628a1 100644
--- a/contrib/tools/python3/src/Modules/_csv.c
+++ b/contrib/tools/python3/src/Modules/_csv.c
@@ -82,7 +82,8 @@ typedef enum {
} ParserState;
typedef enum {
- QUOTE_MINIMAL, QUOTE_ALL, QUOTE_NONNUMERIC, QUOTE_NONE
+ QUOTE_MINIMAL, QUOTE_ALL, QUOTE_NONNUMERIC, QUOTE_NONE,
+ QUOTE_STRINGS, QUOTE_NOTNULL
} QuoteStyle;
typedef struct {
@@ -95,6 +96,8 @@ static const StyleDesc quote_styles[] = {
{ QUOTE_ALL, "QUOTE_ALL" },
{ QUOTE_NONNUMERIC, "QUOTE_NONNUMERIC" },
{ QUOTE_NONE, "QUOTE_NONE" },
+ { QUOTE_STRINGS, "QUOTE_STRINGS" },
+ { QUOTE_NOTNULL, "QUOTE_NOTNULL" },
{ 0 }
};
@@ -176,8 +179,7 @@ get_char_or_None(Py_UCS4 c)
static PyObject *
Dialect_get_lineterminator(DialectObj *self, void *Py_UNUSED(ignored))
{
- Py_XINCREF(self->lineterminator);
- return self->lineterminator;
+ return Py_XNewRef(self->lineterminator);
}
static PyObject *
@@ -316,8 +318,7 @@ _set_str(const char *name, PyObject **target, PyObject *src, const char *dflt)
else {
if (PyUnicode_READY(src) == -1)
return -1;
- Py_INCREF(src);
- Py_XSETREF(*target, src);
+ Py_XSETREF(*target, Py_NewRef(src));
}
}
return 0;
@@ -514,8 +515,7 @@ dialect_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
goto err;
}
- ret = (PyObject *)self;
- Py_INCREF(self);
+ ret = Py_NewRef(self);
err:
Py_CLEAR(self);
Py_CLEAR(dialect);
@@ -869,7 +869,7 @@ Reader_iternext(ReaderObj *self)
PyObject *fields = NULL;
Py_UCS4 c;
Py_ssize_t pos, linelen;
- unsigned int kind;
+ int kind;
const void *data;
PyObject *lineobj;
@@ -1067,7 +1067,7 @@ join_reset(WriterObj *self)
* record length.
*/
static Py_ssize_t
-join_append_data(WriterObj *self, unsigned int field_kind, const void *field_data,
+join_append_data(WriterObj *self, int field_kind, const void *field_data,
Py_ssize_t field_len, int *quoted,
int copy_phase)
{
@@ -1180,7 +1180,7 @@ join_check_rec_size(WriterObj *self, Py_ssize_t rec_len)
static int
join_append(WriterObj *self, PyObject *field, int quoted)
{
- unsigned int field_kind = -1;
+ int field_kind = -1;
const void *field_data = NULL;
Py_ssize_t field_len = 0;
Py_ssize_t rec_len;
@@ -1212,7 +1212,7 @@ static int
join_append_lineterminator(WriterObj *self)
{
Py_ssize_t terminator_len, i;
- unsigned int term_kind;
+ int term_kind;
const void *term_data;
terminator_len = PyUnicode_GET_LENGTH(self->dialect->lineterminator);
@@ -1268,6 +1268,12 @@ csv_writerow(WriterObj *self, PyObject *seq)
case QUOTE_ALL:
quoted = 1;
break;
+ case QUOTE_STRINGS:
+ quoted = PyUnicode_Check(field);
+ break;
+ case QUOTE_NOTNULL:
+ quoted = field != Py_None;
+ break;
default:
quoted = 0;
break;
@@ -1663,6 +1669,11 @@ PyDoc_STRVAR(csv_module_doc,
" csv.QUOTE_NONNUMERIC means that quotes are always placed around\n"
" fields which do not parse as integers or floating point\n"
" numbers.\n"
+" csv.QUOTE_STRINGS means that quotes are always placed around\n"
+" fields which are strings. Note that the Python value None\n"
+" is not a string.\n"
+" csv.QUOTE_NOTNULL means that quotes are only placed around fields\n"
+" that are not the Python value None.\n"
" csv.QUOTE_NONE means that quotes are never placed around fields.\n"
" * escapechar - specifies a one-character string used to escape\n"
" the delimiter when quoting is set to QUOTE_NONE.\n"
@@ -1788,6 +1799,7 @@ csv_exec(PyObject *module) {
static PyModuleDef_Slot csv_slots[] = {
{Py_mod_exec, csv_exec},
+ {Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED},
{0, NULL}
};