Esempio n. 1
0
File: misc.c Progetto: 10v/cmusphinx
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;
}
Esempio n. 5
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;
}
Esempio n. 6
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;
}