#include #include #include #include #include #include "Common.h" #include "MathAux.h" /// Defines the white chars for string trimming #if !defined(WHITE_CHARS) # define WHITE_CHARS " \t" #endif namespace TNet { #include // Allocating stream variable used by stream modifier MatrixVectorIostreamControl const int MATRIX_IOS_FORMAT_IWORD = std::ios_base::xalloc(); //*************************************************************************** //*************************************************************************** int getHTKstr(char *str) { char termChar = '\0'; char *chrptr = str; while (std::isspace(*chrptr)) ++chrptr; if (*chrptr == '\'' || *chrptr == '"') { termChar = *chrptr; chrptr++; } for (; *chrptr; chrptr++) { if (*chrptr == '\'' || *chrptr == '"') { if (termChar == *chrptr) { termChar = '\0'; chrptr++; break; } } if (std::isspace(*chrptr) && !termChar) { break; } if (*chrptr == '\\') { ++chrptr; if (*chrptr == '\0' || (*chrptr >= '0' && *chrptr <= '7' && (*++chrptr < '0' || *chrptr > '7' || *++chrptr < '0' || *chrptr > '7'))) { return -1; } if (*chrptr >= '0' && *chrptr <= '7') { *chrptr = (char)((*chrptr - '0') + (chrptr[-1] - '0') * 8 + (chrptr[-2] - '0') * 64); } } *str++ = *chrptr; } if (termChar) { return -2; } *str = '\0'; return 0; } //***************************************************************************** //***************************************************************************** void ParseHTKString(const std::string & rIn, std::string & rOut) { int ret_val; // the new string will be at most as long as the original, so we allocate // space char* new_str = new char[rIn.size() + 1]; char* p_htk_str = new_str; strcpy(p_htk_str, rIn.c_str()); ret_val = getHTKstr(p_htk_str); // call the function if (!ret_val) { rOut = p_htk_str; } delete [] new_str; if (ret_val) { throw std::runtime_error("Error parsing HTK string"); } } //*************************************************************************** //*************************************************************************** bool IsBigEndian() { int a = 1; return (bool) ((char *) &a)[0] != 1; } //*************************************************************************** //*************************************************************************** void MakeHtkFileName(char* pOutFileName, const char* inFileName, const char* out_dir, const char* out_ext) { const char* base_name; const char* bname_end = NULL; const char* chrptr; // if (*inFileName == '*' && *++inFileName == '/') ++inFileName; // we don't do anything if file is stdin/out if (!strcmp(inFileName, "-")) { pOutFileName[0] = '-'; pOutFileName[1] = '\0'; return; } base_name = strrchr(inFileName, '/'); base_name = base_name != NULL ? base_name + 1 : inFileName; if (out_ext) bname_end = strrchr(base_name, '.'); if (!bname_end) bname_end = base_name + strlen(base_name); if ((chrptr = strstr(inFileName, "/./")) != NULL) { // what is in path after /./ serve as base name base_name = chrptr + 3; } /* else if (*inFileName != '/') { // if inFileName isn't absolut path, don't forget directory structure base_name = inFileName; }*/ *pOutFileName = '\0'; if (out_dir) { if (*out_dir) { strcat(pOutFileName, out_dir); strcat(pOutFileName, "/"); } strncat(pOutFileName, base_name, bname_end-base_name); } else { strncat(pOutFileName, inFileName, bname_end-inFileName); } if (out_ext && *out_ext) { strcat(pOutFileName, "."); strcat(pOutFileName, out_ext); } } //**************************************************************************** //**************************************************************************** bool CloseEnough(const float f1, const float f2, const float nRounds) { bool ret_val = (_ABS((f1 - f2) / (f2 == 0.0f ? 1.0f : f2)) < (nRounds * FLT_EPSILON)); return ret_val; } //**************************************************************************** //**************************************************************************** bool CloseEnough(const double f1, const double f2, const double nRounds) { bool ret_val = (_ABS((f1 - f2) / (f2 == 0.0 ? 1.0 : f2)) < (nRounds * DBL_EPSILON)); return ret_val; } //**************************************************************************** //**************************************************************************** char* ExpandHtkFilterCmd(const char *command, const char *filename, const char* pFilter) { char *out, *outend; const char *chrptr = command; int ndollars = 0; int fnlen = strlen(filename); while (*chrptr++) ndollars += (*chrptr == *pFilter); out = (char*) malloc(strlen(command) - ndollars + ndollars * fnlen + 1); outend = out; for (chrptr = command; *chrptr; chrptr++) { if (*chrptr == *pFilter) { strcpy(outend, filename); outend += fnlen; } else { *outend++ = *chrptr; } } *outend = '\0'; return out; } //*************************************************************************** //*************************************************************************** char * StrToUpper(char *str) { char *chptr; for (chptr = str; *chptr; chptr++) { *chptr = (char)toupper(*chptr); } return str; } //**************************************************************************** //**************************************************************************** std::string& Trim(std::string& rStr) { // WHITE_CHARS is defined in common.h std::string::size_type pos = rStr.find_last_not_of(WHITE_CHARS); if(pos != std::string::npos) { rStr.erase(pos + 1); pos = rStr.find_first_not_of(WHITE_CHARS); if(pos != std::string::npos) rStr.erase(0, pos); } else rStr.erase(rStr.begin(), rStr.end()); return rStr; } } // namespace TNet //#ifdef CYGWIN void assertf(const char *c, int i, const char *msg){ printf("Assertion \"%s\" failed: file \"%s\", line %d\n", msg?msg:"(null)", c?c:"(null)", i); abort(); } void assertf_throw(const char *c, int i, const char *msg){ char buf[2000]; snprintf(buf, 1999, "Assertion \"%s\" failed, throwing exception: file \"%s\", line %d\n", msg?msg:"(null)", c?c:"(null)", i); throw std::runtime_error((std::string)buf); } //#endif