Skip to content

Commit c8cd3ac

Browse files
committed
gh-132162: tests for py_universalnewlinefgets
1 parent 2433cc7 commit c8cd3ac

File tree

3 files changed

+101
-2
lines changed

3 files changed

+101
-2
lines changed

Diff for: Lib/test/test_capi/test_file.py

+25-1
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,31 @@ 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+
with open(filename, "rb") as fp:
306+
line = py_universalnewlinefgets(fp, 1000)
307+
self.assertEqual(line, b"line1\n")
308+
309+
with open(filename, "wb") as fp:
310+
fp.write(b"line2\r\nline3")
311+
312+
with open(filename, "rb") as fp:
313+
line = py_universalnewlinefgets(fp, 1000)
314+
self.assertEqual(line, b"line2\n")
315+
316+
with open(filename, "wb") as fp:
317+
fp.write(b"line3\rline4")
318+
319+
with open(filename, "rb") as fp:
320+
line = py_universalnewlinefgets(fp, 1000)
321+
self.assertEqual(line, b"line3\n")
298322

299323
# PyFile_SetOpenCodeHook() and PyFile_OpenCode() are tested by
300324
# test_embed.test_open_code_hook()

Diff for: Modules/_testcapi/clinic/file.c.h

+35-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: Modules/_testcapi/file.c

+41
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+
int fd = PyObject_AsFileDescriptor(file);
76+
if (fd == -1) {
77+
return NULL;
78+
}
79+
FILE *fp = fdopen(fd, "rb");
80+
if (fp == NULL) {
81+
PyErr_SetFromErrno(PyExc_OSError);
82+
}
83+
84+
char *buf = (char *)PyMem_Malloc(size);
85+
if (buf == NULL) {
86+
return PyErr_NoMemory();
87+
}
88+
89+
char *result = Py_UniversalNewlineFgets(buf, size, fp, NULL);
90+
if (result == NULL) {
91+
PyMem_Free(buf);
92+
Py_RETURN_NONE;
93+
}
94+
95+
PyObject *line = PyBytes_FromString(result);
96+
PyMem_Free(buf);
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)