diff --git a/src/include/espeak-ng/espeak_ng.h b/src/include/espeak-ng/espeak_ng.h index f6830eb8..252689d4 100644 --- a/src/include/espeak-ng/espeak_ng.h +++ b/src/include/espeak-ng/espeak_ng.h @@ -46,6 +46,9 @@ typedef enum { #define espeakINITIALIZE_PATH_ONLY 0x4000 +ESPEAK_NG_API void +espeak_ng_InitializePath(const char *path); + ESPEAK_NG_API espeak_ng_STATUS espeak_ng_CompileDictionary(const char *dsource, const char *dict_name, diff --git a/src/libespeak-ng/speak_lib.c b/src/libespeak-ng/speak_lib.c index 1103a93a..3e0d80d6 100644 --- a/src/libespeak-ng/speak_lib.c +++ b/src/libespeak-ng/speak_lib.c @@ -258,8 +258,14 @@ void Free(void *ptr) free(ptr); } -static void init_path(const char *path) +#pragma GCC visibility push(default) +ESPEAK_NG_API void espeak_ng_InitializePath(const char *path) { + if (path != NULL) { + sprintf(path_home, "%s/espeak-data", path); + return; + } + #ifdef PLATFORM_WINDOWS HKEY RegKey; unsigned long size; @@ -267,11 +273,6 @@ static void init_path(const char *path) char *env; unsigned char buf[sizeof(path_home)-13]; - if (path != NULL) { - sprintf(path_home, "%s/espeak-data", path); - return; - } - if ((env = getenv("ESPEAK_DATA_PATH")) != NULL) { sprintf(path_home, "%s/espeak-data", env); if (GetFileLength(path_home) == -2) @@ -285,14 +286,11 @@ static void init_path(const char *path) RegQueryValueExA(RegKey, "path", 0, &var_type, buf, &size); sprintf(path_home, "%s\\espeak-data", buf); +#elif defined(PLATFORM_DOS) + strcpy(path_home, PATH_ESPEAK_DATA); #else char *env; - if (path != NULL) { - snprintf(path_home, sizeof(path_home), "%s/espeak-data", path); - return; - } - // check for environment variable if ((env = getenv("ESPEAK_DATA_PATH")) != NULL) { snprintf(path_home, sizeof(path_home), "%s/espeak-data", env); @@ -305,6 +303,7 @@ static void init_path(const char *path) strcpy(path_home, PATH_ESPEAK_DATA); #endif } +#pragma GCC visibility pop static int initialise(int control) { @@ -613,7 +612,7 @@ ESPEAK_API int espeak_Initialize(espeak_AUDIO_OUTPUT output_type, int buf_length setlocale(LC_CTYPE, ""); } - init_path(path); + espeak_ng_InitializePath(path); if (options & espeakINITIALIZE_PATH_ONLY) return 0; diff --git a/src/speak-ng.c b/src/speak-ng.c index 314d57e0..1787ec26 100644 --- a/src/speak-ng.c +++ b/src/speak-ng.c @@ -284,62 +284,6 @@ static int WavegenFile(void) return finished; } -static void init_path(char *argv0, char *path_specified) -{ - (void)argv0; // unused (except with PLATFORM_WINDOWS) - - if (path_specified) { - sprintf(path_home, "%s/espeak-data", path_specified); - return; - } - -#ifdef PLATFORM_WINDOWS - HKEY RegKey; - unsigned long size; - unsigned long var_type; - char *p; - char *env; - unsigned char buf[sizeof(path_home)-12]; - - if (((env = getenv("ESPEAK_DATA_PATH")) != NULL) && ((strlen(env)+12) < sizeof(path_home))) { - sprintf(path_home, "%s\\espeak-data", env); - if (GetFileLength(path_home) == -2) - return; // an espeak-data directory exists in the directory specified by environment variable - } - - strcpy(path_home, argv0); - if ((p = strrchr(path_home, '\\')) != NULL) { - strcpy(&p[1], "espeak-data"); - if (GetFileLength(path_home) == -2) - return; // an espeak-data directory exists in the same directory as the espeak program - } - - // otherwise, look in the Windows Registry - buf[0] = 0; - RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Speech\\Voices\\Tokens\\eSpeak", 0, KEY_READ, &RegKey); - size = sizeof(buf); - var_type = REG_SZ; - RegQueryValueEx(RegKey, "path", 0, &var_type, buf, &size); - - sprintf(path_home, "%s\\espeak-data", buf); -#else -#ifdef PLATFORM_DOS - strcpy(path_home, PATH_ESPEAK_DATA); -#else - char *env; - if ((env = getenv("ESPEAK_DATA_PATH")) != NULL) { - snprintf(path_home, sizeof(path_home), "%s/espeak-data", env); - if (GetFileLength(path_home) == -2) - return; // an espeak-data directory exists - } - - snprintf(path_home, sizeof(path_home), "%s/espeak-data", getenv("HOME")); - if (access(path_home, R_OK) != 0) - strcpy(path_home, PATH_ESPEAK_DATA); -#endif -#endif -} - static int initialise(void) { int param; @@ -513,7 +457,7 @@ int main(int argc, char **argv) option_multibyte = value; break; case 'h': - init_path(argv[0], data_path); + espeak_ng_InitializePath(data_path); printf("\nspeak text-to-speech: %s Data at: %s\n%s", version_string, path_home, help_text); exit(0); case 'k': @@ -585,7 +529,7 @@ int main(int argc, char **argv) } break; case 0x104: // --voices - init_path(argv[0], data_path); + espeak_ng_InitializePath(data_path); DisplayVoices(stdout, optarg2); exit(0); case 0x106: // -- split @@ -627,7 +571,7 @@ int main(int argc, char **argv) } break; case 0x10b: // --version - init_path(argv[0], data_path); + espeak_ng_InitializePath(data_path); printf("speak text-to-speech: %s Data at: %s\n", version_string, path_home); exit(0); case 0x10c: // --sep @@ -662,7 +606,7 @@ int main(int argc, char **argv) } } - init_path(argv[0], data_path); + espeak_ng_InitializePath(data_path); initialise(); if (voicename[0] == 0)