@@ -231,30 +231,60 @@ _set_int(const char *name, int *target, PyObject *src, int dflt)
231
231
}
232
232
233
233
static int
234
- _set_char (const char * name , Py_UCS4 * target , PyObject * src , Py_UCS4 dflt )
234
+ _set_char_or_none (const char * name , Py_UCS4 * target , PyObject * src , Py_UCS4 dflt )
235
235
{
236
- if (src == NULL )
236
+ if (src == NULL ) {
237
237
* target = dflt ;
238
+ }
238
239
else {
239
240
* target = '\0' ;
240
241
if (src != Py_None ) {
241
- Py_ssize_t len ;
242
242
if (!PyUnicode_Check (src )) {
243
243
PyErr_Format (PyExc_TypeError ,
244
- "\"%s\" must be string, not %.200s" , name ,
244
+ "\"%s\" must be string or None , not %.200s" , name ,
245
245
Py_TYPE (src )-> tp_name );
246
246
return -1 ;
247
247
}
248
- len = PyUnicode_GetLength (src );
248
+ Py_ssize_t len = PyUnicode_GetLength (src );
249
249
if (len > 1 ) {
250
250
PyErr_Format (PyExc_TypeError ,
251
251
"\"%s\" must be a 1-character string" ,
252
252
name );
253
253
return -1 ;
254
254
}
255
255
/* PyUnicode_READY() is called in PyUnicode_GetLength() */
256
- if ( len > 0 )
256
+ else {
257
257
* target = PyUnicode_READ_CHAR (src , 0 );
258
+ }
259
+ }
260
+ }
261
+ return 0 ;
262
+ }
263
+
264
+ static int
265
+ _set_char (const char * name , Py_UCS4 * target , PyObject * src , Py_UCS4 dflt )
266
+ {
267
+ if (src == NULL ) {
268
+ * target = dflt ;
269
+ }
270
+ else {
271
+ * target = '\0' ;
272
+ if (!PyUnicode_Check (src )) {
273
+ PyErr_Format (PyExc_TypeError ,
274
+ "\"%s\" must be string, not %.200s" , name ,
275
+ Py_TYPE (src )-> tp_name );
276
+ return -1 ;
277
+ }
278
+ Py_ssize_t len = PyUnicode_GetLength (src );
279
+ if (len > 1 ) {
280
+ PyErr_Format (PyExc_TypeError ,
281
+ "\"%s\" must be a 1-character string" ,
282
+ name );
283
+ return -1 ;
284
+ }
285
+ /* PyUnicode_READY() is called in PyUnicode_GetLength() */
286
+ else {
287
+ * target = PyUnicode_READ_CHAR (src , 0 );
258
288
}
259
289
}
260
290
return 0 ;
@@ -423,9 +453,9 @@ dialect_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
423
453
goto err
424
454
DIASET (_set_char , "delimiter" , & self -> delimiter , delimiter , ',' );
425
455
DIASET (_set_bool , "doublequote" , & self -> doublequote , doublequote , true);
426
- DIASET (_set_char , "escapechar" , & self -> escapechar , escapechar , 0 );
456
+ DIASET (_set_char_or_none , "escapechar" , & self -> escapechar , escapechar , 0 );
427
457
DIASET (_set_str , "lineterminator" , & self -> lineterminator , lineterminator , "\r\n" );
428
- DIASET (_set_char , "quotechar" , & self -> quotechar , quotechar , '"' );
458
+ DIASET (_set_char_or_none , "quotechar" , & self -> quotechar , quotechar , '"' );
429
459
DIASET (_set_int , "quoting" , & self -> quoting , quoting , QUOTE_MINIMAL );
430
460
DIASET (_set_bool , "skipinitialspace" , & self -> skipinitialspace , skipinitialspace , false);
431
461
DIASET (_set_bool , "strict" , & self -> strict , strict , false);
0 commit comments