57static FILE* logfp = NULL;
58static int logfp_disabled = FALSE;
60#if defined(__ANDROID__)
61#include <android/log.h>
63err_logcat_cb(
void* user_data, err_lvl_t level,
const char *fmt, ...);
64#elif defined(_WIN32_WCE)
66#define vsnprintf _vsnprintf
68err_wince_cb(
void* user_data, err_lvl_t level,
const char *fmt, ...);
71#if defined(__ANDROID__)
72static err_cb_f err_cb = err_logcat_cb;
73#elif defined(_WIN32_WCE)
74static err_cb_f err_cb = err_wince_cb;
76static err_cb_f err_cb = err_logfp_cb;
78static void* err_user_data;
81err_msg(err_lvl_t lvl,
const char *path,
long ln,
const char *fmt, ...)
83 static const char *err_prefix[ERR_MAX] = {
84 "DEBUG",
"INFO",
"INFOCONT",
"WARN",
"ERROR",
"FATAL"
94 vsnprintf(msg,
sizeof(msg), fmt, ap);
99 if (lvl == ERR_INFOCONT)
100 err_cb(err_user_data, lvl,
"%s(%ld): %s", fname, ln, msg);
101 else if (lvl == ERR_INFO)
102 err_cb(err_user_data, lvl,
"%s: %s(%ld): %s", err_prefix[lvl], fname, ln, msg);
104 err_cb(err_user_data, lvl,
"%s: \"%s\", line %ld: %s", err_prefix[lvl], fname, ln, msg);
106 err_cb(err_user_data, lvl,
"%s", msg);
112err_msg_system(err_lvl_t lvl,
const char *path,
long ln,
const char *fmt, ...)
114 static const char *err_prefix[ERR_MAX] = {
115 "DEBUG",
"INFO",
"INFOCONT",
"WARN",
"ERROR",
"FATAL"
119 LPVOID error_wstring;
122 char error_string[1024];
127 error = GetLastError();
128 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
129 FORMAT_MESSAGE_FROM_SYSTEM |
130 FORMAT_MESSAGE_IGNORE_INSERTS,
134 (LPTSTR) &error_wstring,
137 wcstombs(error_string, error_wstring, 1023);
138 LocalFree(error_wstring);
141 vsnprintf(msg,
sizeof(msg), fmt, ap);
146 if (lvl == ERR_INFOCONT)
147 err_cb(err_user_data, lvl,
"%s(%ld): %s: %s\n", fname, ln, msg, error_string);
148 else if (lvl == ERR_INFO)
149 err_cb(err_user_data, lvl,
"%s: %s(%ld): %s: %s\n", err_prefix[lvl], fname, ln, msg, error_string);
151 err_cb(err_user_data, lvl,
"%s: \"%s\", line %ld: %s: %s\n", err_prefix[lvl], fname, ln, msg, error_string);
153 err_cb(err_user_data, lvl,
"%s: %s\n", msg, error_string);
158err_msg_system(err_lvl_t lvl,
const char *path,
long ln,
const char *fmt, ...)
160 int local_errno = errno;
162 static const char *err_prefix[ERR_MAX] = {
163 "DEBUG",
"INFO",
"INFOCONT",
"WARN",
"ERROR",
"FATAL"
173 vsnprintf(msg,
sizeof(msg), fmt, ap);
178 if (lvl == ERR_INFOCONT)
179 err_cb(err_user_data, lvl,
"%s(%ld): %s: %s\n", fname, ln, msg, strerror(local_errno));
180 else if (lvl == ERR_INFO)
181 err_cb(err_user_data, lvl,
"%s: %s(%ld): %s: %s\n", err_prefix[lvl], fname, ln, msg, strerror(local_errno));
183 err_cb(err_user_data, lvl,
"%s: \"%s\", line %ld: %s: %s\n", err_prefix[lvl], fname, ln, msg, strerror(local_errno));
185 err_cb(err_user_data, lvl,
"%s: %s\n", msg, strerror(local_errno));
190#if defined(__ANDROID__)
192err_logcat_cb(
void *user_data, err_lvl_t lvl,
const char *fmt, ...)
194 static const int android_level[ERR_MAX] = {ANDROID_LOG_DEBUG, ANDROID_LOG_INFO,
195 ANDROID_LOG_INFO, ANDROID_LOG_WARN, ANDROID_LOG_ERROR, ANDROID_LOG_ERROR};
199 __android_log_vprint(android_level[lvl],
"cmusphinx", fmt, ap);
202#elif defined(_WIN32_WCE)
204err_wince_cb(
void *user_data, err_lvl_t lvl,
const char *fmt, ...)
212 _vsnprintf(msg,
sizeof(msg), fmt, ap);
215 size = mbstowcs(NULL, msg, 0) + 1;
217 mbstowcs(wmsg, msg, size);
219 OutputDebugStringW(wmsg);
224err_logfp_cb(
void *user_data, err_lvl_t lvl,
const char *fmt, ...)
233 vfprintf(fp, fmt, ap);
244 if ((newfp = fopen(path,
"a")) == NULL)
248 if (oldfp != NULL && oldfp != stdout && oldfp != stderr)
256 if (stream == NULL) {
257 logfp_disabled = TRUE;
261 logfp_disabled = FALSE;
281 err_user_data= user_data;
Sphinx's memory allocation/deallocation routines.
SPHINXBASE_EXPORT void ckd_free(void *ptr)
Test and free a 1-D array.
#define ckd_calloc(n, sz)
Macros to simplify the use of above functions.
FILE * err_get_logfp(void)
Get the current logging filehandle.
void err_set_logfp(FILE *stream)
Direct all logging to a given filehandle if default logfp callback is set.
void err_set_callback(err_cb_f cb, void *user_data)
Sets function to output error messages.
int err_set_logfile(const char *path)
Append all log messages to a given file.
Implementation of logging routines.
File names related operation.
SPHINXBASE_EXPORT const char * path2basename(const char *path)
Returns the last part of the path, without modifying anything in memory.
Basic type definitions used in Sphinx.