diff --git a/include/pyliblexmodule.h b/include/pyliblexmodule.h index a96b0da..7f3f48c 100644 --- a/include/pyliblexmodule.h +++ b/include/pyliblexmodule.h @@ -8,6 +8,9 @@ static PyObject* pyliblex_add_definition(PyObject* self, PyObject* args); static PyObject* pyliblex_lex(PyObject* self, PyObject* args); static PyObject* pyliblex_test(PyObject* self, PyObject* args); +static PyObject* invalid_regex_exception; +static PyObject* failed_lex_exception; + static const char module_docstring[] = "A wrapper around a homemade lexing library, liblex."; static PyMethodDef module_methods[] = { {"init", pyliblex_init, METH_VARARGS, "Initialize a liblex library object." }, diff --git a/src/pyliblexmodule.c b/src/pyliblexmodule.c index 0c2525a..43f51b3 100644 --- a/src/pyliblexmodule.c +++ b/src/pyliblexmodule.c @@ -36,8 +36,10 @@ static PyObject* pyliblex_add_definition(PyObject* self, PyObject* args){ eval_config* config = PyCapsule_GetPointer(capsule, NULL); if(config){ liblex_result result = eval_config_add(config, regex, id); - if(result != LIBLEX_SUCCESS){ + if(result == LIBLEX_MALLOC){ return_object = PyErr_NoMemory(); + } else if(result != LIBLEX_SUCCESS){ + PyErr_SetString(invalid_regex_exception, "Unable to construct regex."); } else { Py_INCREF(Py_None); return_object = Py_None; @@ -86,8 +88,10 @@ static PyObject* pyliblex_lex(PyObject* self, PyObject* args){ ll_init(&match_ll); result = eval_all(string, 0, config, &match_ll); - if(result != LIBLEX_SUCCESS){ + if(result == LIBLEX_MALLOC){ return_object = PyErr_NoMemory(); + } if(result != LIBLEX_SUCCESS){ + PyErr_SetString(failed_lex_exception, "Unable to parse text."); } else { int return_code = 0; PyObject* list = PyList_New(0); @@ -115,5 +119,32 @@ static PyObject* pyliblex_test(PyObject* self, PyObject* args) { } PyMODINIT_FUNC PyInit_pyliblex() { - return PyModule_Create(&module_object); + invalid_regex_exception = NULL; + failed_lex_exception = NULL; + PyObject* module = NULL; + int clear_exceptions = 1; + invalid_regex_exception = PyErr_NewException("pyliblex.InvalidRegexException", NULL, NULL); + failed_lex_exception = PyErr_NewException("pyliblex.FailedLexException", NULL, NULL); + + if(invalid_regex_exception && failed_lex_exception){ + module = PyModule_Create(&module_object); + if(module) { + if(!(PyModule_AddObject(module, "InvalidRegexException", invalid_regex_exception) || + PyModule_AddObject(module, "FailedLexException", failed_lex_exception))){ + Py_INCREF(invalid_regex_exception); + Py_INCREF(failed_lex_exception); + clear_exceptions = 0; + } else { + Py_DECREF(module); + module = NULL; + } + } + } + + if(clear_exceptions){ + if(invalid_regex_exception) Py_DECREF(invalid_regex_exception); + if(failed_lex_exception) Py_DECREF(failed_lex_exception); + } + + return module; }