int main (int argc, char *argv[]) { ProgramExitStatus exitStatus = PROG_EXIT_SUCCESS; { static const OptionsDescriptor descriptor = { OPTION_TABLE(programOptions), .applicationName = "ktbtest", .argumentsSummary = "key-table" }; PROCESS_OPTIONS(descriptor, argc, argv); } { char **const paths[] = { &opt_driversDirectory, &opt_tablesDirectory, NULL }; fixInstallPaths(paths); } if (argc) { const char *keyTableName = (argc--, *argv++); char *keyTablePath = makeKeyTablePath(opt_tablesDirectory, keyTableName); if (keyTablePath) { KEY_NAME_TABLES_REFERENCE keyNameTables; { const char *file = locatePathName(keyTablePath); size_t length = strrchr(file, '.') - file; char name[length + 1]; memcpy(name, file, length); name[length] = 0; keyNameTables = getKeyNameTables(name); } if (keyNameTables) { if (opt_listKeyNames) if (!listKeyNames(keyNameTables, listLine, NULL)) exitStatus = PROG_EXIT_FATAL; if (exitStatus == PROG_EXIT_SUCCESS) { KeyTable *keyTable = compileKeyTable(keyTablePath, keyNameTables); if (keyTable) { if (opt_listKeyTable) if (!listKeyTable(keyTable, listLine, NULL)) exitStatus = PROG_EXIT_FATAL; destroyKeyTable(keyTable); } else { exitStatus = PROG_EXIT_FATAL; } } } else { exitStatus = PROG_EXIT_FATAL; } free(keyTablePath); } else { exitStatus = PROG_EXIT_FATAL; } } else { logMessage(LOG_ERR, "missing key table name"); exitStatus = PROG_EXIT_SYNTAX; } return exitStatus; }
void fixInstallPath (char **path) { char **const paths[] = {path, NULL}; fixInstallPaths(paths); }
int main (int argc, char *argv[]) { ProgramExitStatus exitStatus; const char *driver = NULL; void *object; float speechRate; float speechVolume; { static const OptionsDescriptor descriptor = { OPTION_TABLE(programOptions), .applicationName = "spktest", .argumentsSummary = "[driver [parameter=value ...]]" }; PROCESS_OPTIONS(descriptor, argc, argv); } { char **const paths[] = { &opt_driversDirectory, &opt_dataDirectory, NULL }; fixInstallPaths(paths); } speechRate = 1.0; if (opt_speechRate && *opt_speechRate) { static const float minimum = 0.1; static const float maximum = 10.0; if (!validateFloat(&speechRate, opt_speechRate, &minimum, &maximum)) { logMessage(LOG_ERR, "%s: %s", "invalid rate multiplier", opt_speechRate); return PROG_EXIT_SYNTAX; } } speechVolume = 1.0; if (opt_speechVolume && *opt_speechVolume) { static const float minimum = 0.0; static const float maximum = 2.0; if (!validateFloat(&speechVolume, opt_speechVolume, &minimum, &maximum)) { logMessage(LOG_ERR, "%s: %s", "invalid volume multiplier", opt_speechVolume); return PROG_EXIT_SYNTAX; } } if (argc) { driver = *argv++; --argc; } if ((speech = loadSpeechDriver(driver, &object, opt_driversDirectory))) { const char *const *parameterNames = speech->parameters; char **parameterSettings; if (!parameterNames) { static const char *const noNames[] = {NULL}; parameterNames = noNames; } { const char *const *name = parameterNames; unsigned int count; char **setting; while (*name) ++name; count = name - parameterNames; if (!(parameterSettings = malloc((count + 1) * sizeof(*parameterSettings)))) { logMallocError(); return PROG_EXIT_FATAL; } setting = parameterSettings; while (count--) *setting++ = ""; *setting = NULL; } while (argc) { char *assignment = *argv++; int ok = 0; char *delimiter = strchr(assignment, '='); if (!delimiter) { logMessage(LOG_ERR, "missing speech driver parameter value: %s", assignment); } else if (delimiter == assignment) { logMessage(LOG_ERR, "missing speech driver parameter name: %s", assignment); } else { size_t nameLength = delimiter - assignment; const char *const *name = parameterNames; while (*name) { if (strncasecmp(assignment, *name, nameLength) == 0) { parameterSettings[name - parameterNames] = delimiter + 1; ok = 1; break; } ++name; } if (!ok) logMessage(LOG_ERR, "invalid speech driver parameter: %s", assignment); } if (!ok) return PROG_EXIT_SYNTAX; --argc; } initializeSpeechSynthesizer(&spk); identifySpeechDriver(speech, 0); /* start-up messages */ if (speech->construct(&spk, parameterSettings)) { if (speech->setVolume) speech->setVolume(&spk, speechVolume); if (speech->setRate) speech->setRate(&spk, speechRate); if (opt_textString && *opt_textString) { sayString(&spk, opt_textString, 0); } else { processLines(stdin, sayLine, NULL); } speech->destruct(&spk); /* finish with the display */ exitStatus = PROG_EXIT_SUCCESS; } else { logMessage(LOG_ERR, "can't initialize speech driver."); exitStatus = PROG_EXIT_FATAL; } } else { logMessage(LOG_ERR, "can't load speech driver."); exitStatus = PROG_EXIT_FATAL; } return exitStatus; }