Skip to content

Commit e139442

Browse files
artemmukhinFidget-Spinner
authored andcommitted
pythonGH-94808: Cover PyOS_mystrnicmp and PyOS_mystricmp (pythongh-102469)
1 parent e030c18 commit e139442

File tree

6 files changed

+69
-1
lines changed

6 files changed

+69
-1
lines changed

Modules/Setup.stdlib.in

+1-1
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@
169169
@MODULE__XXTESTFUZZ_TRUE@_xxtestfuzz _xxtestfuzz/_xxtestfuzz.c _xxtestfuzz/fuzzer.c
170170
@MODULE__TESTBUFFER_TRUE@_testbuffer _testbuffer.c
171171
@MODULE__TESTINTERNALCAPI_TRUE@_testinternalcapi _testinternalcapi.c
172-
@MODULE__TESTCAPI_TRUE@_testcapi _testcapimodule.c _testcapi/vectorcall.c _testcapi/vectorcall_limited.c _testcapi/heaptype.c _testcapi/unicode.c _testcapi/getargs.c _testcapi/pytime.c _testcapi/datetime.c _testcapi/docstring.c _testcapi/mem.c _testcapi/watchers.c _testcapi/long.c _testcapi/float.c _testcapi/structmember.c _testcapi/exceptions.c _testcapi/code.c
172+
@MODULE__TESTCAPI_TRUE@_testcapi _testcapimodule.c _testcapi/vectorcall.c _testcapi/vectorcall_limited.c _testcapi/heaptype.c _testcapi/unicode.c _testcapi/getargs.c _testcapi/pytime.c _testcapi/datetime.c _testcapi/docstring.c _testcapi/mem.c _testcapi/watchers.c _testcapi/long.c _testcapi/float.c _testcapi/structmember.c _testcapi/exceptions.c _testcapi/code.c _testcapi/pyos.c
173173
@MODULE__TESTCLINIC_TRUE@_testclinic _testclinic.c
174174

175175
# Some testing modules MUST be built as shared libraries.

Modules/_testcapi/parts.h

+1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ int _PyTestCapi_Init_Float(PyObject *module);
3838
int _PyTestCapi_Init_Structmember(PyObject *module);
3939
int _PyTestCapi_Init_Exceptions(PyObject *module);
4040
int _PyTestCapi_Init_Code(PyObject *module);
41+
int _PyTestCapi_Init_PyOS(PyObject *module);
4142

4243
#ifdef LIMITED_API_AVAILABLE
4344
int _PyTestCapi_Init_VectorcallLimited(PyObject *module);

Modules/_testcapi/pyos.c

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
#include "parts.h"
2+
3+
4+
static PyObject *
5+
test_PyOS_mystrnicmp(PyObject *self, PyObject *Py_UNUSED(ignored))
6+
{
7+
assert(PyOS_mystrnicmp("", "", 0) == 0);
8+
assert(PyOS_mystrnicmp("", "", 1) == 0);
9+
10+
assert(PyOS_mystrnicmp("insert", "ins", 3) == 0);
11+
assert(PyOS_mystrnicmp("ins", "insert", 3) == 0);
12+
assert(PyOS_mystrnicmp("insect", "insert", 3) == 0);
13+
14+
assert(PyOS_mystrnicmp("insert", "insert", 6) == 0);
15+
assert(PyOS_mystrnicmp("Insert", "insert", 6) == 0);
16+
assert(PyOS_mystrnicmp("INSERT", "insert", 6) == 0);
17+
assert(PyOS_mystrnicmp("insert", "insert", 10) == 0);
18+
19+
assert(PyOS_mystrnicmp("invert", "insert", 6) == ('v' - 's'));
20+
assert(PyOS_mystrnicmp("insert", "invert", 6) == ('s' - 'v'));
21+
assert(PyOS_mystrnicmp("insert", "ins\0rt", 6) == 'e');
22+
23+
// GH-21845
24+
assert(PyOS_mystrnicmp("insert\0a", "insert\0b", 8) == 0);
25+
26+
Py_RETURN_NONE;
27+
}
28+
29+
static PyObject *
30+
test_PyOS_mystricmp(PyObject *self, PyObject *Py_UNUSED(ignored))
31+
{
32+
assert(PyOS_mystricmp("", "") == 0);
33+
assert(PyOS_mystricmp("insert", "insert") == 0);
34+
assert(PyOS_mystricmp("Insert", "insert") == 0);
35+
assert(PyOS_mystricmp("INSERT", "insert") == 0);
36+
assert(PyOS_mystricmp("insert", "ins") == 'e');
37+
assert(PyOS_mystricmp("ins", "insert") == -'e');
38+
39+
// GH-21845
40+
assert(PyOS_mystricmp("insert", "ins\0rt") == 'e');
41+
assert(PyOS_mystricmp("invert", "insert") == ('v' - 's'));
42+
43+
Py_RETURN_NONE;
44+
}
45+
46+
static PyMethodDef test_methods[] = {
47+
{"test_PyOS_mystrnicmp", test_PyOS_mystrnicmp, METH_NOARGS, NULL},
48+
{"test_PyOS_mystricmp", test_PyOS_mystricmp, METH_NOARGS, NULL},
49+
{NULL},
50+
};
51+
52+
int
53+
_PyTestCapi_Init_PyOS(PyObject *mod)
54+
{
55+
if (PyModule_AddFunctions(mod, test_methods) < 0) {
56+
return -1;
57+
}
58+
59+
return 0;
60+
}

Modules/_testcapimodule.c

+3
Original file line numberDiff line numberDiff line change
@@ -4154,6 +4154,9 @@ PyInit__testcapi(void)
41544154
if (_PyTestCapi_Init_Code(m) < 0) {
41554155
return NULL;
41564156
}
4157+
if (_PyTestCapi_Init_PyOS(m) < 0) {
4158+
return NULL;
4159+
}
41574160

41584161
#ifndef LIMITED_API_AVAILABLE
41594162
PyModule_AddObjectRef(m, "LIMITED_API_AVAILABLE", Py_False);

PCbuild/_testcapi.vcxproj

+1
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@
109109
<ClCompile Include="..\Modules\_testcapi\structmember.c" />
110110
<ClCompile Include="..\Modules\_testcapi\exceptions.c" />
111111
<ClCompile Include="..\Modules\_testcapi\code.c" />
112+
<ClCompile Include="..\Modules\_testcapi\pyos.c" />
112113
</ItemGroup>
113114
<ItemGroup>
114115
<ResourceCompile Include="..\PC\python_nt.rc" />

PCbuild/_testcapi.vcxproj.filters

+3
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@
5757
<ClCompile Include="..\Modules\_testcapi\code.c">
5858
<Filter>Source Files</Filter>
5959
</ClCompile>
60+
<ClCompile Include="..\Modules\_testcapi\pyos.c">
61+
<Filter>Source Files</Filter>
62+
</ClCompile>
6063
</ItemGroup>
6164
<ItemGroup>
6265
<ResourceCompile Include="..\PC\python_nt.rc">

0 commit comments

Comments
 (0)