| #include "Python.h" |
| #include "pycore_pyerrors.h" |
| #include "clinic/_suggestions.c.h" |
| |
| /*[clinic input] |
| module _suggestions |
| [clinic start generated code]*/ |
| /*[clinic end generated code: output=da39a3ee5e6b4b0d input=e58d81fafad5637b]*/ |
| |
| /*[clinic input] |
| _suggestions._generate_suggestions |
| candidates: object |
| item: unicode |
| / |
| Returns the candidate in candidates that's closest to item |
| [clinic start generated code]*/ |
| |
| static PyObject * |
| _suggestions__generate_suggestions_impl(PyObject *module, |
| PyObject *candidates, PyObject *item) |
| /*[clinic end generated code: output=79be7b653ae5e7ca input=ba2a8dddc654e33a]*/ |
| { |
| // Check if dir is a list |
| if (!PyList_Check(candidates)) { |
| PyErr_SetString(PyExc_TypeError, "candidates must be a list"); |
| return NULL; |
| } |
| |
| // Check if all elements in the list are Unicode |
| Py_ssize_t size = PyList_Size(candidates); |
| for (Py_ssize_t i = 0; i < size; ++i) { |
| PyObject *elem = PyList_GetItem(candidates, i); |
| if (!PyUnicode_Check(elem)) { |
| PyErr_SetString(PyExc_TypeError, "all elements in 'candidates' must be strings"); |
| return NULL; |
| } |
| } |
| |
| PyObject* result = _Py_CalculateSuggestions(candidates, item); |
| if (!result && !PyErr_Occurred()) { |
| Py_RETURN_NONE; |
| } |
| return result; |
| } |
| |
| |
| static PyMethodDef module_methods[] = { |
| _SUGGESTIONS__GENERATE_SUGGESTIONS_METHODDEF |
| {NULL, NULL, 0, NULL} // Sentinel |
| }; |
| |
| static PyModuleDef_Slot module_slots[] = { |
| {Py_mod_multiple_interpreters, Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED}, |
| {Py_mod_gil, Py_MOD_GIL_NOT_USED}, |
| {0, NULL}, |
| }; |
| |
| static struct PyModuleDef suggestions_module = { |
| PyModuleDef_HEAD_INIT, |
| "_suggestions", |
| NULL, |
| 0, |
| module_methods, |
| module_slots, |
| }; |
| |
| PyMODINIT_FUNC PyInit__suggestions(void) { |
| return PyModuleDef_Init(&suggestions_module); |
| } |