diff --git a/src/espeak-ng.c b/src/espeak-ng.c index ca58f976..0ce2b0ec 100644 --- a/src/espeak-ng.c +++ b/src/espeak-ng.c @@ -636,8 +636,14 @@ int main(int argc, char **argv) if (flag_compile) { // This must be done after the voice is set - return (espeak_ng_CompileDictionary("", NULL, stderr, flag_compile & 0x1) == ENS_OK) - ? EXIT_SUCCESS : EXIT_FAILURE; + espeak_ng_ERROR_CONTEXT context = NULL; + espeak_ng_STATUS result = espeak_ng_CompileDictionary("", NULL, stderr, flag_compile & 0x1, &context); + if (result != ENS_OK) { + espeak_ng_PrintStatusCodeMessage(result, stderr, context); + espeak_ng_ClearErrorContext(&context); + return EXIT_FAILURE; + } + return EXIT_SUCCESS; } // set any non-default values of parameters. This must be done after espeak_Initialize() diff --git a/src/include/espeak-ng/espeak_ng.h b/src/include/espeak-ng/espeak_ng.h index 2720acc9..95cc13f8 100644 --- a/src/include/espeak-ng/espeak_ng.h +++ b/src/include/espeak-ng/espeak_ng.h @@ -138,7 +138,8 @@ ESPEAK_NG_API espeak_ng_STATUS espeak_ng_CompileDictionary(const char *dsource, const char *dict_name, FILE *log, - int flags); + int flags, + espeak_ng_ERROR_CONTEXT *context); ESPEAK_NG_API espeak_ng_STATUS espeak_ng_CompileMbrolaVoice(const char *path, diff --git a/src/libespeak-ng/compiledict.c b/src/libespeak-ng/compiledict.c index b6a0971c..b37eaa92 100644 --- a/src/libespeak-ng/compiledict.c +++ b/src/libespeak-ng/compiledict.c @@ -1514,7 +1514,7 @@ static int compile_dictrules(FILE *f_in, FILE *f_out, char *fname_temp) } #pragma GCC visibility push(default) -ESPEAK_NG_API espeak_ng_STATUS espeak_ng_CompileDictionary(const char *dsource, const char *dict_name, FILE *log, int flags) +ESPEAK_NG_API espeak_ng_STATUS espeak_ng_CompileDictionary(const char *dsource, const char *dict_name, FILE *log, int flags, espeak_ng_ERROR_CONTEXT *context) { if (!log) log = stderr; if (!dict_name) dict_name = dictionary_name; @@ -1549,15 +1549,15 @@ ESPEAK_NG_API espeak_ng_STATUS espeak_ng_CompileDictionary(const char *dsource, sprintf(fname_in, "%srules.txt", path); if ((f_in = fopen(fname_in, "r")) == NULL) { sprintf(fname_in, "%srules", path); - if ((f_in = fopen_log(fname_in, "r")) == NULL) - return errno; + if ((f_in = fopen(fname_in, "r")) == NULL) + return create_file_error_context(context, errno, fname_in); } sprintf(fname_out, "%s%c%s_dict", path_home, PATHSEP, dict_name); - if ((f_out = fopen_log(fname_out, "wb+")) == NULL) { + if ((f_out = fopen(fname_out, "wb+")) == NULL) { int error = errno; fclose(f_in); - return error; + return create_file_error_context(context, errno, fname_out); } sprintf(fname_temp, "%s%ctemp", path_home, PATHSEP); diff --git a/src/libespeak-ng/espeak_api.c b/src/libespeak-ng/espeak_api.c index 790a1acb..c6ce7b39 100644 --- a/src/libespeak-ng/espeak_api.c +++ b/src/libespeak-ng/espeak_api.c @@ -149,7 +149,12 @@ ESPEAK_API espeak_ERROR espeak_Terminate(void) ESPEAK_API void espeak_CompileDictionary(const char *path, FILE *log, int flags) { - espeak_ng_CompileDictionary(path, dictionary_name, log, flags); + espeak_ng_ERROR_CONTEXT context = NULL; + espeak_ng_STATUS result = espeak_ng_CompileDictionary(path, dictionary_name, log, flags, &context); + if (result != ENS_OK) { + espeak_ng_PrintStatusCodeMessage(result, stderr, context); + espeak_ng_ClearErrorContext(&context); + } } #pragma GCC visibility pop diff --git a/src/speak-ng.c b/src/speak-ng.c index dbadc878..b3ab8a8b 100644 --- a/src/speak-ng.c +++ b/src/speak-ng.c @@ -596,17 +596,23 @@ int main(int argc, char **argv) } if (flag_compile) { + espeak_ng_ERROR_CONTEXT context = NULL; #if defined(PLATFORM_DOS) || defined(PLATFORM_WINDOWS) char path_dsource[sizeof(path_home)+20]; strcpy(path_dsource, path_home); path_dsource[strlen(path_home)-11] = 0; // remove "espeak-data" from the end strcat(path_dsource, "dictsource\\"); - espeak_ng_STATUS status = espeak_ng_CompileDictionary(path_dsource, dictionary_name, NULL, flag_compile & 0x1); + espeak_ng_STATUS status = espeak_ng_CompileDictionary(path_dsource, dictionary_name, NULL, flag_compile & 0x1, &context); #else - espeak_ng_STATUS status = espeak_ng_CompileDictionary(NULL, dictionary_name, NULL, flag_compile & 0x1); + espeak_ng_STATUS status = espeak_ng_CompileDictionary(NULL, dictionary_name, NULL, flag_compile & 0x1, &context); #endif - return (status == ENS_OK) ? EXIT_SUCCESS : EXIT_FAILURE; + if (status != ENS_OK) { + espeak_ng_PrintStatusCodeMessage(status, stderr, context); + espeak_ng_ClearErrorContext(&context); + return EXIT_FAILURE; + } + return EXIT_SUCCESS; } SetParameter(espeakRATE, speed, 0);