bpo-45479: Futher simplify Py_UniversalNewlineFgets. (GH-28967)

Thank you to Eryk Sun for the suggestions in https://github.com/python/cpython/pull/28965#discussion_r729527143.
This commit is contained in:
Benjamin Peterson 2021-10-14 23:10:52 -07:00 committed by GitHub
parent 160c38df7f
commit 9ce9cfe595
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -248,7 +248,6 @@ Py_UniversalNewlineFgets(char *buf, int n, FILE *stream, PyObject *fobj)
{
char *p = buf;
int c;
int skipnextlf = 0;
if (fobj) {
errno = ENXIO; /* What can you do... */
@ -256,34 +255,21 @@ Py_UniversalNewlineFgets(char *buf, int n, FILE *stream, PyObject *fobj)
}
FLOCKFILE(stream);
while (--n > 0 && (c = GETC(stream)) != EOF ) {
if (skipnextlf) {
skipnextlf = 0;
if (c == '\n') {
/* Seeing a \n here with skipnextlf true
** means we saw a \r before.
*/
c = GETC(stream);
if (c == EOF) break;
if (c == '\r') {
// A \r is translated into a \n, and we skip an adjacent \n, if any.
c = GETC(stream);
if (c != '\n') {
ungetc(c, stream);
c = '\n';
}
}
if (c == '\r') {
/* A \r is translated into a \n, and we skip
** an adjacent \n, if any. We don't set the
** newlinetypes flag until we've seen the next char.
*/
skipnextlf = 1;
c = '\n';
}
*p++ = c;
if (c == '\n') break;
if (c == '\n') {
break;
}
}
FUNLOCKFILE(stream);
*p = '\0';
if (skipnextlf) {
int c = GETC(stream);
if (c != '\n')
ungetc(c, stream);
}
if (p == buf)
return NULL;
return buf;