Implement throwing exceptions.
This commit is contained in:
		
							parent
							
								
									69afdab402
								
							
						
					
					
						commit
						46f52665cb
					
				| @ -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." }, | ||||
|  | ||||
| @ -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; | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user