Skip to content

Commit d7365e6

Browse files
gh-132162: Add tests for Py_UniversalNewlineFgets() (#132164)
1 parent 06a26fd commit d7365e6

File tree

3 files changed

+98
-2
lines changed

3 files changed

+98
-2
lines changed

Lib/test/test_capi/test_file.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,28 @@ def test_py_fopen(self):
294294
# CRASHES py_fopen(NULL, 'rb')
295295
# CRASHES py_fopen(__file__, NULL)
296296

297-
# TODO: Test Py_UniversalNewlineFgets()
297+
def test_py_universalnewlinefgets(self):
298+
py_universalnewlinefgets = _testcapi.py_universalnewlinefgets
299+
filename = os_helper.TESTFN
300+
self.addCleanup(os_helper.unlink, filename)
301+
302+
with open(filename, "wb") as fp:
303+
fp.write(b"line1\nline2")
304+
305+
line = py_universalnewlinefgets(filename, 1000)
306+
self.assertEqual(line, b"line1\n")
307+
308+
with open(filename, "wb") as fp:
309+
fp.write(b"line2\r\nline3")
310+
311+
line = py_universalnewlinefgets(filename, 1000)
312+
self.assertEqual(line, b"line2\n")
313+
314+
with open(filename, "wb") as fp:
315+
fp.write(b"line3\rline4")
316+
317+
line = py_universalnewlinefgets(filename, 1000)
318+
self.assertEqual(line, b"line3\n")
298319

299320
# PyFile_SetOpenCodeHook() and PyFile_OpenCode() are tested by
300321
# test_embed.test_open_code_hook()

Modules/_testcapi/clinic/file.c.h

Lines changed: 35 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Modules/_testcapi/file.c

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,50 @@ _testcapi_py_fopen_impl(PyObject *module, PyObject *path, const char *mode,
5757
}
5858

5959

60+
/*[clinic input]
61+
_testcapi.py_universalnewlinefgets
62+
63+
file: object
64+
size: int
65+
/
66+
67+
Read a line from a file using Py_UniversalNewlineFgets.
68+
[clinic start generated code]*/
69+
70+
static PyObject *
71+
_testcapi_py_universalnewlinefgets_impl(PyObject *module, PyObject *file,
72+
int size)
73+
/*[clinic end generated code: output=2ce1bc76c9dc871c input=02c236049d18569a]*/
74+
{
75+
FILE *fp = Py_fopen(file, "rb");
76+
if (fp == NULL) {
77+
return NULL;
78+
}
79+
80+
char *buf = (char *)PyMem_Malloc(size);
81+
if (buf == NULL) {
82+
Py_fclose(fp);
83+
return PyErr_NoMemory();
84+
}
85+
86+
char *result = Py_UniversalNewlineFgets(buf, size, fp, NULL);
87+
if (result == NULL) {
88+
PyMem_Free(buf);
89+
Py_fclose(fp);
90+
Py_RETURN_NONE;
91+
}
92+
93+
PyObject *line = PyBytes_FromString(result);
94+
PyMem_Free(buf);
95+
Py_fclose(fp);
96+
97+
return line;
98+
}
99+
60100
static PyMethodDef test_methods[] = {
61101
_TESTCAPI_PYFILE_NEWSTDPRINTER_METHODDEF
62102
_TESTCAPI_PY_FOPEN_METHODDEF
103+
_TESTCAPI_PY_UNIVERSALNEWLINEFGETS_METHODDEF
63104
{NULL},
64105
};
65106

0 commit comments

Comments
 (0)