From 9ce9cfe595d64e3081e69de7296042cc54bccf18 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Thu, 14 Oct 2021 23:10:52 -0700 Subject: [PATCH] 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. --- Objects/fileobject.c | 32 +++++++++----------------------- 1 file changed, 9 insertions(+), 23 deletions(-) diff --git a/Objects/fileobject.c b/Objects/fileobject.c index 8eb62490c45..8ca56a802b9 100644 --- a/Objects/fileobject.c +++ b/Objects/fileobject.c @@ -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;