@@ -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 ;
11171090err :
11181091 return fields ;
1092+ #undef PROCESS_CHAR_AND_ADVANCE
1093+ #undef FIND_AND_UPDATE_CHUNK_END
11191094}
11201095
11211096static void
0 commit comments