summaryrefslogtreecommitdiff
path: root/tnet_io/KaldiLib/UserInterface.cc
diff options
context:
space:
mode:
Diffstat (limited to 'tnet_io/KaldiLib/UserInterface.cc')
-rw-r--r--tnet_io/KaldiLib/UserInterface.cc669
1 files changed, 0 insertions, 669 deletions
diff --git a/tnet_io/KaldiLib/UserInterface.cc b/tnet_io/KaldiLib/UserInterface.cc
deleted file mode 100644
index b59a6c5..0000000
--- a/tnet_io/KaldiLib/UserInterface.cc
+++ /dev/null
@@ -1,669 +0,0 @@
-#include <stdexcept>
-#include <sstream>
-#include <stdarg.h>
-
-#include "UserInterface.h"
-#include "StkStream.h"
-#include "Features.h"
-
-namespace TNet
-{
- //***************************************************************************
- //***************************************************************************
- int
- npercents(const char *str)
- {
- int ret = 0;
- while (*str) if (*str++ == '%') ret++;
- return ret;
- }
-
-
- //***************************************************************************
- //***************************************************************************
- void
- UserInterface::
- ReadConfig(const char *file_name)
- {
- std::string line_buf;
- std::string::iterator chptr;
- std::string key;
- std::string value;
- std::ostringstream ss;
- int line_no = 0;
- IStkStream i_stream;
-
-
- i_stream.open(file_name, std::ios::binary);
- if (!i_stream.good()) {
- throw std::runtime_error(std::string("Cannot open input config file ")
- + file_name);
- }
- i_stream >> std::ws;
-
- while (!i_stream.eof()) {
- size_t i_pos;
-
- // read line
- std::getline(i_stream, line_buf);
- i_stream >> std::ws;
-
- if (i_stream.fail()) {
- throw std::runtime_error(std::string("Error reading (")
- + file_name + ":" + (ss << line_no,ss).str() + ")");
- }
-
- // increase line counter
- line_no++;
-
- // cut comments
- if (std::string::npos != (i_pos = line_buf.find('#'))) {
- line_buf.erase(i_pos);
- }
-
- // cut leading and trailing spaces
- Trim(line_buf);
-
- // if empty line, then skip it
- if (0 == line_buf.length()) {
- continue;
- }
-
- // line = line_buf.c_str();
- // chptr = parptr;
-
- chptr = line_buf.begin();
-
- for (;;) {
- // Replace speces by '_', which is removed in InsertConfigParam
- while (isalnum(*chptr) || *chptr == '_' || *chptr == '-') {
- chptr++;
- }
-
- while (std::isspace(*chptr)) {
- *chptr = '_';
- chptr++;
- }
-
- if (*chptr != ':') {
- break;
- }
-
- chptr++;
-
- while (std::isspace(*chptr)) {
- *chptr = '_';
- chptr++;
- }
- }
-
- if (*chptr != '=') {
- throw std::runtime_error(std::string("Character '=' expected (")
- + file_name + ":" + (ss.str(""),ss<<line_no,ss).str() + ")");
- }
-
- key.assign(line_buf.begin(), chptr);
-
- chptr++;
-
- value.assign(chptr, line_buf.end());
-
- ParseHTKString(value, value);
- InsertConfigParam(key.c_str(), value.c_str(), 'C');
- }
-
- i_stream.close();
- }
-
-
- //***************************************************************************
- //***************************************************************************
- void
- UserInterface::
- InsertConfigParam(const char *pParamName, const char *value, int optionChar)
- {
- std::string key(pParamName);
- std::string::iterator i_key = key.begin();
-
- while (i_key != key.end()) {
- if (*i_key == '-' || *i_key == '_') {
- i_key = key.erase(i_key);
- }
- else {
- *i_key = toupper(*i_key);
- i_key ++;
- }
- }
-
- mMap[key].mValue = value;
- mMap[key].mRead = false;
- mMap[key].mOption = optionChar;
- }
-
- //***************************************************************************
- //***************************************************************************
- int
- UserInterface::
- ParseOptions(
- int argc,
- char* argv[],
- const char* pOptionMapping,
- const char* pToolName)
- {
- int i;
- int opt = '?';
- int optind;
- bool option_must_follow = false;
- char param[1024];
- char* value;
- const char* optfmt;
- const char* optarg;
- char* chptr;
- char* bptr;
- char tstr[4] = " -?";
- unsigned long long option_mask = 0;
- std::ostringstream ss;
-
- #define MARK_OPTION(ch) {if (isalpha(ch)) option_mask |= 1ULL << ((ch) - 'A');}
- #define OPTION_MARK(ch) (isalpha(ch) && ((1ULL << ((ch) - 'A')) & option_mask))
- #define IS_OPTION(str) ((str)[0] == '-' && (isalpha((str)[1]) || (str)[1] == '-'))
-
- //search for the -A param
- for (optind = 1; optind < argc; optind++) {
- // we found "--", no -A
- if (!strcmp(argv[optind], "--")) {
- break;
- }
-
- //repeat till we find -A
- if (argv[optind][0] != '-' || argv[optind][1] != 'A') {
- continue;
- }
-
- // just "-A" form
- if (argv[optind][2] != '\0') {
- throw std::runtime_error(std::string("Unexpected argument '")
- + (argv[optind] + 2) + "' after option '-A'");
- }
-
- for (i=0; i < argc; i++) {
- // display all params
- if(strchr(argv[i], ' ') || strchr(argv[i], '*'))
- std::cout << '\'' << argv[i] << '\'' << " ";
- else std::cout << argv[i] << " ";
- }
-
- std::cout << std::endl;
-
- break;
- }
-
- for (optind = 1; optind < argc; optind++) {
- // find the '-C?' parameter (possible two configs)
- if (!strcmp(argv[optind], "--")) break;
- if (argv[optind][0] != '-' || argv[optind][1] != 'C') continue;
- if (argv[optind][2] != '\0') {
- ReadConfig(argv[optind] + 2);
- } else if (optind+1 < argc && !IS_OPTION(argv[optind+1])) {
- ReadConfig(argv[++optind]);
- } else {
- throw std::runtime_error("Config file name expected after option '-C'");
- }
- }
-
- for (optind = 1; optind < argc; optind++) {
- if (!strcmp(argv[optind], "--")) break;
- if (argv[optind][0] != '-' || argv[optind][1] != '-') continue;
-
- bptr = new char[strlen(pToolName) + strlen(argv[optind]+2) + 2];
- strcat(strcat(strcpy(bptr, pToolName), ":"), argv[optind]+2);
- value = strchr(bptr, '=');
- if (!value) {
- throw std::runtime_error(std::string("Character '=' expected after option '")
- + argv[optind] + "'");
- }
-
- *value++ = '\0';
-
- InsertConfigParam(bptr, value /*? value : "TRUE"*/, '-');
- delete [] bptr;
- }
-
- for (optind = 1; optind < argc && IS_OPTION(argv[optind]); optind++) {
- option_must_follow = false;
- tstr[2] = opt = argv[optind][1];
- optarg = argv[optind][2] != '\0' ? argv[optind] + 2 : NULL;
-
- if (opt == '-' && !optarg) { // '--' terminates the option list
- return optind+1;
- }
- if (opt == 'C' || opt == '-') { // C, A and long options have been already processed
- if (!optarg) optind++;
- continue;
- }
- if (opt == 'A') continue;
-
- chptr = strstr((char*)pOptionMapping, tstr);
- if (chptr == NULL) {
- throw std::runtime_error(std::string("Invalid command line option '-")
- + static_cast<char>(opt) + "'");
- }
-
- chptr += 3;
- while (std::isspace(*chptr)) {
- chptr++;
- }
-
- if (!chptr || chptr[0] == '-') {// Option without format string will be ignored
- optfmt = " ";
- } else {
- optfmt = chptr;
- while (*chptr && !std::isspace(*chptr)) {
- chptr++;
- }
- if (!*chptr) {
- throw std::runtime_error("Fatal: Unexpected end of optionMap string");
- }
- }
- for (i = 0; !std::isspace(*optfmt); optfmt++) {
- while (std::isspace(*chptr)) chptr++;
- value = chptr;
- while (*chptr && !std::isspace(*chptr)) chptr++;
- assert(static_cast<unsigned int>(chptr-value+1) < sizeof(param));
- strncat(strcat(strcpy(param, pToolName), ":"), value, chptr-value);
- param[chptr-value+strlen(pToolName)+1] = '\0';
- switch (*optfmt) {
- case 'n':
- value = strchr(param, '=');
- if (value) *value = '\0';
- InsertConfigParam(param,
- value ? value + 1: "TRUE", opt);
- break;
-
- case 'l':
- case 'o':
- case 'r':
- i++;
- if (!optarg && (optind+1==argc || IS_OPTION(argv[optind+1]))) {
- if (*optfmt == 'r' || *optfmt == 'l') {
- throw std::runtime_error(std::string("Argument ")
- + (ss<<i,ss).str() + " of option '-"
- + static_cast<char>(opt) + "' expected");
- }
- optfmt = " "; // Stop reading option arguments
- break;
- }
- if (!optarg) optarg = argv[++optind];
- if (*optfmt == 'o') {
- option_must_follow = (bool) 1;
- }
- bptr = NULL;
-
- // For repeated use of option with 'l' (list) format, append
- // ',' and argument string to existing config parameter value.
- if (*optfmt == 'l' && OPTION_MARK(opt)) {
- bptr = strdup(GetStr(param, ""));
- if (bptr == NULL) throw std::runtime_error("Insufficient memory");
- bptr = (char*) realloc(bptr, strlen(bptr) + strlen(optarg) + 2);
- if (bptr == NULL) throw std::runtime_error("Insufficient memory");
- strcat(strcat(bptr, ","), optarg);
- optarg = bptr;
- }
- MARK_OPTION(opt);
- InsertConfigParam(param, optarg, opt);
- free(bptr);
- optarg = NULL;
- break;
-
- default :
- throw std::runtime_error(std::string("Fatal: Invalid character '")
- + *optfmt + "' in optionMap after " + tstr);
- }
- }
- if (optarg) {
- throw std::runtime_error(std::string("Unexpected argument '")
- + optarg + "' after option '-"
- + static_cast<char>(opt) + "'");
- }
- }
-
- for (i = optind; i < argc && !IS_OPTION(argv[i]); i++)
- {}
-
- if (i < argc) {
- throw std::runtime_error(std::string("No option expected after first non-option argument '")
- + argv[optind] + "'");
- }
-
- if (option_must_follow) {
- throw std::runtime_error(std::string("Option '-")
- + static_cast<char>(opt)
- + "' with optional argument must not be the last option");
- }
-
- return optind;
- }
-
-
- //***************************************************************************
- //***************************************************************************
- int
- UserInterface::
- GetFeatureParams(
- int * derivOrder,
- int ** derivWinLens,
- int * startFrmExt,
- int * endFrmExt,
- char ** CMNPath,
- char ** CMNFile,
- const char ** CMNMask,
- char ** CVNPath,
- char ** CVNFile,
- const char ** CVNMask,
- const char ** CVGFile,
- const char * pToolName,
- int pseudoModeule)
- {
- const char * str;
- int targetKind;
- char * chrptr;
- char paramName[32];
- const char * CMNDir;
- const char * CVNDir;
-
- strcpy(paramName, pToolName);
- strcat(paramName, pseudoModeule == 1 ? "SPARM1:" :
- pseudoModeule == 2 ? "SPARM2:" : "");
-
- chrptr = paramName + strlen(paramName);
-
- strcpy(chrptr, "STARTFRMEXT");
- *startFrmExt = GetInt(paramName, 0);
- strcpy(chrptr, "ENDFRMEXT");
- *endFrmExt = GetInt(paramName, 0);
-
- *CMNPath = *CVNPath = NULL;
- strcpy(chrptr, "CMEANDIR");
- CMNDir = GetStr(paramName, NULL);
- strcpy(chrptr, "CMEANMASK");
- *CMNMask = GetStr(paramName, NULL);
-
- if (*CMNMask != NULL) {
- *CMNPath = (char*) malloc((CMNDir ? strlen(CMNDir) : 0) + npercents(*CMNMask) + 2);
- if (*CMNPath == NULL) throw std::runtime_error("Insufficient memory");
- if (CMNDir != NULL) strcat(strcpy(*CMNPath, CMNDir), "/");
- *CMNFile = *CMNPath + strlen(*CMNPath);
- }
- strcpy(chrptr, "VARSCALEDIR");
- CVNDir = GetStr(paramName, NULL);
- strcpy(chrptr, "VARSCALEMASK");
- *CVNMask = GetStr(paramName, NULL);
-
-
- if (*CVNMask != NULL) {
- *CVNPath = (char*) malloc((CVNDir ? strlen(CVNDir) : 0) + npercents(*CVNMask) + 2);
- if (*CVNPath == NULL) throw std::runtime_error("Insufficient memory");
- if (CVNDir != NULL) strcat(strcpy(*CVNPath, CVNDir), "/");
- *CVNFile = *CVNPath + strlen(*CVNPath);
- }
- strcpy(chrptr, "VARSCALEFN");
- *CVGFile = GetStr(paramName, NULL);
- strcpy(chrptr, "TARGETKIND");
- str = GetStr(paramName, "ANON");
-
- targetKind = FeatureRepository::ReadParmKind(str, false);
-
- if (targetKind == -1) {
- throw std::runtime_error(std::string("Invalid TARGETKIND = '")
- + str + "'");
- }
-
- strcpy(chrptr, "DERIVWINDOWS");
- if ((str = GetStr(paramName, NULL)) != NULL) {
- long lval;
- *derivOrder = 0;
- *derivWinLens = NULL;
-
- if (NULL != str)
- {
- while ((str = strtok((char *) str, " \t_")) != NULL)
- {
- lval = strtol(str, &chrptr, 0);
- if (!*str || *chrptr) {
- throw std::runtime_error("Integers separated by '_' expected for parameter DERIVWINDOWS");
- }
- *derivWinLens = (int *)realloc(*derivWinLens, ++*derivOrder*sizeof(int));
- if (*derivWinLens == NULL) throw std::runtime_error("Insufficient memory");
- (*derivWinLens)[*derivOrder-1] = lval;
- str = NULL;
- }
- }
-
- return targetKind;
- }
- *derivOrder = targetKind & PARAMKIND_T ? 3 :
- targetKind & PARAMKIND_A ? 2 :
- targetKind & PARAMKIND_D ? 1 : 0;
-
- if (*derivOrder || targetKind != PARAMKIND_ANON) {
- *derivWinLens = (int *) malloc(3 * sizeof(int));
- if (*derivWinLens == NULL) throw std::runtime_error("Insufficient memory");
-
- strcpy(chrptr, "DELTAWINDOW");
- (*derivWinLens)[0] = GetInt(paramName, 2);
- strcpy(chrptr, "ACCWINDOW");
- (*derivWinLens)[1] = GetInt(paramName, 2);
- strcpy(chrptr, "THIRDWINDOW");
- (*derivWinLens)[2] = GetInt(paramName, 2);
- return targetKind;
- }
- *derivWinLens = NULL;
- *derivOrder = -1;
- return targetKind;
- }
-
-
- //***************************************************************************
- //***************************************************************************
- UserInterface::ValueRecord*
- UserInterface::
- GetParam(const char* pParamName)
- {
- MapType::iterator it;
-
- // this is done only for convenience. in the loop we will increase the
- // pointer again
- pParamName--;
-
- // we iteratively try to find the param name in the map. if an attempt
- // fails, we strip off all characters until the first ':' and we search
- // again
- do {
- pParamName++;
- it = mMap.find(pParamName);
- } while ((it == mMap.end()) && (NULL != (pParamName = strchr(pParamName, ':'))));
-
- if (it == mMap.end()) {
- return NULL;
- }
- else {
- it->second.mRead = true;
- return &(it->second);
- }
- }
-
-
- //***************************************************************************
- //***************************************************************************
- const char *
- UserInterface::
- GetStr(
- const char * pParamName,
- const char * default_value)
- {
- ValueRecord* p_val = GetParam(pParamName);
-
- if (NULL == p_val) {
- return default_value;
- }
- else {
- return p_val->mValue.c_str();
- }
- }
-
-
- //***************************************************************************
- //***************************************************************************
- long
- UserInterface::
- GetInt(
- const char *pParamName,
- long default_value)
- {
- char *chrptr;
- ValueRecord* p_val = GetParam(pParamName);
-
- if (NULL == p_val) {
- return default_value;
- }
-
- const char *val = p_val->mValue.c_str();
- default_value = strtol(val, &chrptr, 0);
- if (!*val || *chrptr) {
- throw std::runtime_error(std::string("Integer number expected for ")
- + pParamName + " but found '" + val + "'");
- }
- return default_value;
- }
-
- //***************************************************************************
- //***************************************************************************
- float
- UserInterface::
- GetFlt(
- const char * pParamName,
- float default_value)
- {
- char *chrptr;
- ValueRecord* p_val = GetParam(pParamName);
-
- if (NULL == p_val) {
- return default_value;
- }
-
- const char *val = p_val->mValue.c_str();
- default_value = strtod(val, &chrptr);
- if (!*val || *chrptr) {
- throw std::runtime_error(std::string("Decimal number expected for ")
- + pParamName + " but found '" + val + "'");
- }
- return default_value;
- }
-
- //***************************************************************************
- //***************************************************************************
- bool
- UserInterface::
- GetBool(
- const char * pParamName,
- bool default_value)
- {
- ValueRecord* p_val = GetParam(pParamName);
-
- if (NULL == p_val) {
- return default_value;
- }
-
- const char* val = p_val->mValue.c_str();
-
- if (!strcasecmp(val, "TRUE") || !strcmp(val, "T")) return 1;
- if (strcasecmp(val, "FALSE") && strcmp(val, "F")) {
- throw std::runtime_error(std::string("TRUE or FALSE expected for ")
- + pParamName + " but found '" + val + "'");
- }
- return false;
- }
-
- //***************************************************************************
- //***************************************************************************
- // '...' are pairs: string and corresponding integer value , terminated by NULL
- int
- UserInterface::
- GetEnum(
- const char * pParamName,
- int default_value,
- ...)
- {
- ValueRecord* p_val = GetParam(pParamName);
-
- if (NULL == p_val) {
- return default_value;
- }
-
- const char* val = p_val->mValue.c_str();
- char* s;
- int i = 0, cnt = 0, l = 0;
- va_list ap;
-
- va_start(ap, default_value);
- while ((s = va_arg(ap, char *)) != NULL) {
- l += strlen(s) + 2;
- ++cnt;
- i = va_arg(ap, int);
- if (!strcmp(val, s)) break;
- }
- va_end(ap);
-
- if (s) {
- return i;
- }
-
- //To report error, create string listing all possible values
- s = (char*) malloc(l + 1);
- s[0] = '\0';
- va_start(ap, default_value);
- for (i = 0; i < cnt; i++) {
- strcat(s, va_arg(ap, char *));
- va_arg(ap, int);
- if (i < cnt - 2) strcat(s, ", ");
- else if (i == cnt - 2) strcat(s, " or ");
- }
-
- va_end(ap);
-
- throw std::runtime_error(std::string(s) + " expected for "
- + pParamName + " but found '" + val + "'");
-
- return 0;
- }
-
-
- //***************************************************************************
- //***************************************************************************
- void
- UserInterface::
- PrintConfig(std::ostream& rStream)
- {
- rStream << "Configuration Parameters[" << mMap.size() << "]\n";
- for (MapType::iterator it = mMap.begin(); it != mMap.end(); ++it) {
- rStream << (it->second.mRead ? " " : "# ")
- << std::setw(35) << std::left << it->first << " = "
- << std::setw(30) << std::left << it->second.mValue
- << " # -" << it->second.mOption << std::endl;
- }
- }
-
- //***************************************************************************
- //***************************************************************************
- void
- UserInterface::
- CheckCommandLineParamUse()
- {
- for (MapType::iterator it = mMap.begin(); it != mMap.end(); ++it) {
- if (!it->second.mRead && it->second.mOption != 'C') {
- Error("Unexpected command line parameter " + it->first);
- }
- }
- }
-
-}