Skip to content

Commit 41c11df

Browse files
committed
macros
1 parent 50cce09 commit 41c11df

1 file changed

Lines changed: 35 additions & 60 deletions

File tree

Modules/_csv.c

Lines changed: 35 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -967,6 +967,30 @@ Reader_iternext(PyObject *op)
967967
DialectObj *dialect;
968968
Py_UCS4 c;
969969

970+
#define FIND_AND_UPDATE_CHUNK_END(c) \
971+
do \
972+
{ \
973+
p = PyUnicode_FindChar(lineobj, (c), pos, linelen, 1); \
974+
if (p == -2) { \
975+
Py_DECREF(lineobj); \
976+
goto err; \
977+
} \
978+
if (p >= 0 && p < chunk_end) { \
979+
chunk_end = p; \
980+
} \
981+
} while (0)
982+
983+
#define PROCESS_CHAR_AND_ADVANCE() \
984+
do \
985+
{ \
986+
c = PyUnicode_READ_CHAR(lineobj, pos); \
987+
if (parse_process_char(self, module_state, c) < 0) { \
988+
Py_DECREF(lineobj); \
989+
goto err; \
990+
} \
991+
pos++; \
992+
} while (0)
993+
970994
_csvstate *module_state = _csv_state_from_type(Py_TYPE(self),
971995
"Reader.__next__");
972996
if (module_state == NULL) {
@@ -1012,36 +1036,12 @@ Reader_iternext(PyObject *op)
10121036
case IN_FIELD:
10131037
chunk_end = linelen;
10141038

1015-
p = PyUnicode_FindChar(lineobj, dialect->delimiter, pos, linelen, 1);
1016-
if (p >= 0 && p < chunk_end) {
1017-
chunk_end = p;
1018-
} else if (p == -2) {
1019-
Py_DECREF(lineobj);
1020-
goto err;
1021-
}
1039+
FIND_AND_UPDATE_CHUNK_END(dialect->delimiter);
10221040
if (dialect->escapechar != NOT_SET) {
1023-
p = PyUnicode_FindChar(lineobj, dialect->escapechar, pos, linelen, 1);
1024-
if (p >= 0 && p < chunk_end) {
1025-
chunk_end = p;
1026-
} else if (p == -2) {
1027-
Py_DECREF(lineobj);
1028-
goto err;
1029-
}
1030-
}
1031-
p = PyUnicode_FindChar(lineobj, '\n', pos, linelen, 1);
1032-
if (p >= 0 && p < chunk_end) {
1033-
chunk_end = p;
1034-
} else if (p == -2) {
1035-
Py_DECREF(lineobj);
1036-
goto err;
1037-
}
1038-
p = PyUnicode_FindChar(lineobj, '\r', pos, linelen, 1);
1039-
if (p >= 0 && p < chunk_end) {
1040-
chunk_end = p;
1041-
} else if (p == -2) {
1042-
Py_DECREF(lineobj);
1043-
goto err;
1041+
FIND_AND_UPDATE_CHUNK_END(dialect->escapechar);
10441042
}
1043+
FIND_AND_UPDATE_CHUNK_END('\n');
1044+
FIND_AND_UPDATE_CHUNK_END('\r');
10451045

10461046
if (chunk_end > pos) {
10471047
if (parse_add_substring(self, module_state, lineobj, pos, chunk_end) < 0) {
@@ -1052,32 +1052,15 @@ Reader_iternext(PyObject *op)
10521052
pos = chunk_end;
10531053

10541054
if (pos < linelen) {
1055-
c = PyUnicode_READ_CHAR(lineobj, pos);
1056-
if (parse_process_char(self, module_state, c) < 0) {
1057-
Py_DECREF(lineobj);
1058-
goto err;
1059-
}
1060-
pos++;
1055+
PROCESS_CHAR_AND_ADVANCE();
10611056
}
10621057
break;
10631058
case IN_QUOTED_FIELD:
10641059
chunk_end = linelen;
10651060

1066-
p = PyUnicode_FindChar(lineobj, dialect->quotechar, pos, linelen, 1);
1067-
if (p >= 0 && p < chunk_end) {
1068-
chunk_end = p;
1069-
} else if (p == -2) {
1070-
Py_DECREF(lineobj);
1071-
goto err;
1072-
}
1061+
FIND_AND_UPDATE_CHUNK_END(dialect->quotechar);
10731062
if (dialect->escapechar != NOT_SET) {
1074-
p = PyUnicode_FindChar(lineobj, dialect->escapechar, pos, linelen, 1);
1075-
if (p >= 0 && p < chunk_end) {
1076-
chunk_end = p;
1077-
} else if (p == -2) {
1078-
Py_DECREF(lineobj);
1079-
goto err;
1080-
}
1063+
FIND_AND_UPDATE_CHUNK_END(dialect->escapechar);
10811064
}
10821065

10831066
if (chunk_end > pos) {
@@ -1089,21 +1072,11 @@ Reader_iternext(PyObject *op)
10891072
pos = chunk_end;
10901073

10911074
if (pos < linelen) {
1092-
c = PyUnicode_READ_CHAR(lineobj, pos);
1093-
if (parse_process_char(self, module_state, c) < 0) {
1094-
Py_DECREF(lineobj);
1095-
goto err;
1096-
}
1097-
pos++;
1075+
PROCESS_CHAR_AND_ADVANCE();
10981076
}
10991077
break;
11001078
default:
1101-
c = PyUnicode_READ_CHAR(lineobj, pos);
1102-
if (parse_process_char(self, module_state, c) < 0) {
1103-
Py_DECREF(lineobj);
1104-
goto err;
1105-
}
1106-
pos++;
1079+
PROCESS_CHAR_AND_ADVANCE();
11071080
break;
11081081
}
11091082
}
@@ -1116,6 +1089,8 @@ Reader_iternext(PyObject *op)
11161089
self->fields = NULL;
11171090
err:
11181091
return fields;
1092+
#undef PROCESS_CHAR_AND_ADVANCE
1093+
#undef FIND_AND_UPDATE_CHUNK_END
11191094
}
11201095

11211096
static void

0 commit comments

Comments
 (0)