• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include "Python.h"
2 #include "pycore_pyerrors.h"
3 #include "clinic/_suggestions.c.h"
4 
5 /*[clinic input]
6 module _suggestions
7 [clinic start generated code]*/
8 /*[clinic end generated code: output=da39a3ee5e6b4b0d input=e58d81fafad5637b]*/
9 
10 /*[clinic input]
11 _suggestions._generate_suggestions
12     candidates: object
13     item: unicode
14     /
15 Returns the candidate in candidates that's closest to item
16 [clinic start generated code]*/
17 
18 static PyObject *
_suggestions__generate_suggestions_impl(PyObject * module,PyObject * candidates,PyObject * item)19 _suggestions__generate_suggestions_impl(PyObject *module,
20                                         PyObject *candidates, PyObject *item)
21 /*[clinic end generated code: output=79be7b653ae5e7ca input=ba2a8dddc654e33a]*/
22 {
23    // Check if dir is a list
24     if (!PyList_Check(candidates)) {
25         PyErr_SetString(PyExc_TypeError, "candidates must be a list");
26         return NULL;
27     }
28 
29     // Check if all elements in the list are Unicode
30     Py_ssize_t size = PyList_Size(candidates);
31     for (Py_ssize_t i = 0; i < size; ++i) {
32         PyObject *elem = PyList_GetItem(candidates, i);
33         if (!PyUnicode_Check(elem)) {
34             PyErr_SetString(PyExc_TypeError, "all elements in 'candidates' must be strings");
35             return NULL;
36         }
37     }
38 
39     PyObject* result =  _Py_CalculateSuggestions(candidates, item);
40     if (!result && !PyErr_Occurred()) {
41         Py_RETURN_NONE;
42     }
43     return result;
44 }
45 
46 
47 static PyMethodDef module_methods[] = {
48     _SUGGESTIONS__GENERATE_SUGGESTIONS_METHODDEF
49     {NULL, NULL, 0, NULL} // Sentinel
50 };
51 
52 static PyModuleDef_Slot module_slots[] = {
53     {Py_mod_multiple_interpreters, Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED},
54     {Py_mod_gil, Py_MOD_GIL_NOT_USED},
55     {0, NULL},
56 };
57 
58 static struct PyModuleDef suggestions_module = {
59     PyModuleDef_HEAD_INIT,
60     "_suggestions",
61     NULL,
62     0,
63     module_methods,
64     module_slots,
65 };
66 
PyInit__suggestions(void)67 PyMODINIT_FUNC PyInit__suggestions(void) {
68     return PyModuleDef_Init(&suggestions_module);
69 }
70