int32 ctlfile_next (FILE *fp, char *ctlspec, int32 *sf, int32 *ef, char *uttid) { char line[1024]; int32 k; char *base; *sf = 0; *ef = (int32)0x7ffffff0; /* Read next non-comment or non-empty line */ for (;;) { if (fgets (line, sizeof(line), fp) == NULL) return -1; if ((line[0] != '#') && ((k = sscanf (line, "%s %d %d %s", ctlspec, sf, ef, uttid)) > 0)) break; } switch (k) { case 1: base = path2basename (ctlspec); strcpy (uttid, base); break; case 2: E_FATAL("Bad control file line: %s\n", line); break; case 3: if ((*sf >= *ef) || (*sf < 0)) E_FATAL("Bad control file line: %s\n", line); base = path2basename (ctlspec); sprintf (uttid, "%s_%d_%d", base, *sf, *ef); break; case 4: if ((*sf >= *ef) || (*sf < 0)) E_FATAL("Bad control file line: %s\n", line); break; default: E_FATAL("Panic: How did I get here?\n"); break; } return 0; }
void err_msg(err_lvl_t lvl, const char *path, long ln, const char *fmt, ...) { static const char *err_prefix[ERR_MAX] = { "DEBUG", "INFO", "INFOCONT", "WARN", "ERROR", "FATAL" }; char msg[1024]; va_list ap; if (!err_cb) return; va_start(ap, fmt); vsnprintf(msg, sizeof(msg), fmt, ap); va_end(ap); if (path) { const char *fname = path2basename(path); if (lvl == ERR_INFOCONT) err_cb(err_user_data, lvl, "%s(%ld): %s", fname, ln, msg); else if (lvl == ERR_INFO) err_cb(err_user_data, lvl, "%s: %s(%ld): %s", err_prefix[lvl], fname, ln, msg); else err_cb(err_user_data, lvl, "%s: \"%s\", line %ld: %s", err_prefix[lvl], fname, ln, msg); } else { err_cb(err_user_data, lvl, "%s", msg); } }
/** * @file err.c * @brief Somewhat antiquated logging and error interface. */ #include "config.h" #include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include <string.h> #include <errno.h> #include "sphinxbase/err.h" #include "sphinxbase/prim_type.h" #include "sphinxbase/filename.h" #include "sphinxbase/ckd_alloc.h" static FILE* logfp = NULL; static int logfp_disabled = FALSE; static int sphinx_debug_level; #if defined(__ANDROID__) #include <android/log.h> static void err_logcat_cb(void* user_data, err_lvl_t level, const char *fmt, ...); #elif defined(_WIN32_WCE) #include <windows.h> #define vsnprintf _vsnprintf static void err_wince_cb(void* user_data, err_lvl_t level, const char *fmt, ...); #endif #if defined(__ANDROID__) static err_cb_f err_cb = err_logcat_cb; #elif defined(_WIN32_WCE) static err_cb_f err_cb = err_wince_cb; #else static err_cb_f err_cb = err_logfp_cb; #endif static void* err_user_data; void flushToFile() { fflush(stderr); } void err_msg(err_lvl_t lvl, const char *path, long ln, const char *fmt, ...) { static const char *err_prefix[ERR_MAX] = { "DEBUG", "INFO", "INFOCONT", "WARN", "ERROR", "FATAL" }; char msg[1024]; va_list ap; if (!err_cb) return; va_start(ap, fmt); vsnprintf(msg, sizeof(msg), fmt, ap); va_end(ap); if (path) { const char *fname = path2basename(path); if (lvl == ERR_INFOCONT) err_cb(err_user_data, lvl, "%s(%ld): %s", fname, ln, msg); else if (lvl == ERR_INFO) err_cb(err_user_data, lvl, "%s: %s(%ld): %s", err_prefix[lvl], fname, ln, msg); else err_cb(err_user_data, lvl, "%s: \"%s\", line %ld: %s", err_prefix[lvl], fname, ln, msg); } else { err_cb(err_user_data, lvl, "%s", msg); } } #ifdef _WIN32_WCE /* No strerror for WinCE, so a separate implementation */ void err_msg_system(err_lvl_t lvl, const char *path, long ln, const char *fmt, ...) { static const char *err_prefix[ERR_MAX] = { "DEBUG", "INFO", "INFOCONT", "WARN", "ERROR", "FATAL" }; va_list ap; LPVOID error_wstring; DWORD error; char msg[1024]; char error_string[1024]; if (!err_cb) return; error = GetLastError(); FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, error, 0, // Default language (LPTSTR) &error_wstring, 0, NULL); wcstombs(error_string, error_wstring, 1023); LocalFree(error_wstring); va_start(ap, fmt); vsnprintf(msg, sizeof(msg), fmt, ap); va_end(ap); if (path) { const char *fname = path2basename(path); if (lvl == ERR_INFOCONT) err_cb(err_user_data, lvl, "%s(%ld): %s: %s\n", fname, ln, msg, error_string); else if (lvl == ERR_INFO) err_cb(err_user_data, lvl, "%s: %s(%ld): %s: %s\n", err_prefix[lvl], fname, ln, msg, error_string); else err_cb(err_user_data, lvl, "%s: \"%s\", line %ld: %s: %s\n", err_prefix[lvl], fname, ln, msg, error_string); } else { err_cb(err_user_data, lvl, "%s: %s\n", msg, error_string); } }
int main(int argc, char *argv[]) { char const testname[] = "/foo/bar/baz/quux.argh"; char const testname2[] = "foo/bar/baz"; char const testname3[] = "/foo"; char testout[32]; TEST_EQUAL(0, strcmp("quux.argh", path2basename(testname))); path2dirname(testname, testout); TEST_EQUAL(0, strcmp("/foo/bar/baz", testout)); path2dirname(testname2, testout); TEST_EQUAL(0, strcmp("foo/bar", testout)); path2dirname(testname3, testout); TEST_EQUAL(0, strcmp("", testout)); return 0; }
int32 ctl_read_entry(FILE * fp, char *uttfile, int32 * sf, int32 * ef, char *uttid) { char line[16384]; const char *base; int32 k; do { if (fgets(line, sizeof(line), fp) == NULL) return -1; if (line[0] == '#') k = 0; else k = sscanf(line, "%s %d %d %s", uttfile, sf, ef, uttid); } while (k <= 0); if ((k == 2) || ((k >= 3) && ((*sf >= *ef) || (*sf < 0)))) E_FATAL("Error in ctlfile: %s\n", line); if (k < 4) { /* Create utt-id from mfc-filename (and sf/ef if specified) */ base = path2basename(uttfile); /* strip_fileext (base, uttid); */ strcpy(uttid, base); if (k == 3) { k = strlen(uttid); sprintf(uttid + k, "_%d_%d", *sf, *ef); } else { *sf = 0; *ef = -1; /* Signifies "until EOF" */ } } return 0; }
ptmr_t ctl_process_utt(const char *uttfile, int32 count, void (*func) (void *kb, utt_res_t * ur, int32 sf, int32 ef, char *uttid), void *kb) { char utterance_file[16384]; char uttid[4096]; const char *base; int32 i, c; int32 ts, newts; ptmr_t tm; utt_res_t *ur; ptmr_init(&tm); ur = new_utt_res(); base = path2basename(uttfile); /* strip_fileext() copies base to uttid. So, copying uttid to base * is redundant if strip_fileext() is not called. */ /* strip_fileext (base, uttid); strcpy (base, uttid); */ ts = -1; for (c = 0; c < count; c++) { /* Wait for uttfile to change from previous iteration */ for (i = 0;; i++) { newts = stat_mtime(uttfile); if ((newts >= 0) && (newts != ts)) break; if (i == 0) E_INFO("Waiting for %s, count %d, c %d\n", uttfile, count, c); SLEEP_SEC(1); } ts = newts; /* Form uttid */ sprintf(uttid, "%s_%08d", base, c); strncpy(utterance_file, uttfile, sizeof(utterance_file) - 1); utterance_file[sizeof(utterance_file) - 1] = 0; /* Process this utterance */ ptmr_start(&tm); if (func) { utt_res_set_uttfile(ur, utterance_file); (*func) (kb, ur, 0, -1, uttid); } ptmr_stop(&tm); E_INFO ("%s: %6.1f sec CPU, %6.1f sec Clk; TOT: %8.1f sec CPU, %8.1f sec Clk\n\n", uttid, tm.t_cpu, tm.t_elapsed, tm.t_tot_cpu, tm.t_tot_elapsed); ptmr_reset(&tm); } if (ur) free_utt_res(ur); return tm; }