57 static FILE* logfp = NULL;
58 static int logfp_disabled = FALSE;
60 static int sphinx_debug_level;
62 #if defined(__ANDROID__)
63 #include <android/log.h>
65 err_logcat_cb(
void* user_data, err_lvl_t level,
const char *fmt, ...);
66 #elif defined(_WIN32_WCE)
68 #define vsnprintf _vsnprintf
70 err_wince_cb(
void* user_data, err_lvl_t level,
const char *fmt, ...);
73 #if defined(__ANDROID__)
74 static err_cb_f err_cb = err_logcat_cb;
75 #elif defined(_WIN32_WCE)
76 static err_cb_f err_cb = err_wince_cb;
78 static err_cb_f err_cb = err_logfp_cb;
80 static void* err_user_data;
83 err_msg(err_lvl_t lvl,
const char *path,
long ln,
const char *fmt, ...)
85 static const char *err_prefix[ERR_MAX] = {
86 "DEBUG",
"INFO",
"INFOCONT",
"WARN",
"ERROR",
"FATAL"
96 vsnprintf(msg,
sizeof(msg), fmt, ap);
101 if (lvl == ERR_INFOCONT)
102 err_cb(err_user_data, lvl,
"%s(%ld): %s", fname, ln, msg);
103 else if (lvl == ERR_INFO)
104 err_cb(err_user_data, lvl,
"%s: %s(%ld): %s", err_prefix[lvl], fname, ln, msg);
106 err_cb(err_user_data, lvl,
"%s: \"%s\", line %ld: %s", err_prefix[lvl], fname, ln, msg);
108 err_cb(err_user_data, lvl,
"%s", msg);
114 err_msg_system(err_lvl_t lvl,
const char *path,
long ln,
const char *fmt, ...)
116 static const char *err_prefix[ERR_MAX] = {
117 "DEBUG",
"INFO",
"INFOCONT",
"WARN",
"ERROR",
"FATAL"
121 LPVOID error_wstring;
124 char error_string[1024];
129 error = GetLastError();
130 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
131 FORMAT_MESSAGE_FROM_SYSTEM |
132 FORMAT_MESSAGE_IGNORE_INSERTS,
136 (LPTSTR) &error_wstring,
139 wcstombs(error_string, error_wstring, 1023);
140 LocalFree(error_wstring);
143 vsnprintf(msg,
sizeof(msg), fmt, ap);
148 if (lvl == ERR_INFOCONT)
149 err_cb(err_user_data, lvl,
"%s(%ld): %s: %s\n", fname, ln, msg, error_string);
150 else if (lvl == ERR_INFO)
151 err_cb(err_user_data, lvl,
"%s: %s(%ld): %s: %s\n", err_prefix[lvl], fname, ln, msg, error_string);
153 err_cb(err_user_data, lvl,
"%s: \"%s\", line %ld: %s: %s\n", err_prefix[lvl], fname, ln, msg, error_string);
155 err_cb(err_user_data, lvl,
"%s: %s\n", msg, error_string);
160 err_msg_system(err_lvl_t lvl,
const char *path,
long ln,
const char *fmt, ...)
162 int local_errno = errno;
164 static const char *err_prefix[ERR_MAX] = {
165 "DEBUG",
"INFO",
"INFOCONT",
"WARN",
"ERROR",
"FATAL"
175 vsnprintf(msg,
sizeof(msg), fmt, ap);
180 if (lvl == ERR_INFOCONT)
181 err_cb(err_user_data, lvl,
"%s(%ld): %s: %s\n", fname, ln, msg, strerror(local_errno));
182 else if (lvl == ERR_INFO)
183 err_cb(err_user_data, lvl,
"%s: %s(%ld): %s: %s\n", err_prefix[lvl], fname, ln, msg, strerror(local_errno));
185 err_cb(err_user_data, lvl,
"%s: \"%s\", line %ld: %s: %s\n", err_prefix[lvl], fname, ln, msg, strerror(local_errno));
187 err_cb(err_user_data, lvl,
"%s: %s\n", msg, strerror(local_errno));
192 #if defined(__ANDROID__)
194 err_logcat_cb(
void *user_data, err_lvl_t lvl,
const char *fmt, ...)
196 static const int android_level[ERR_MAX] = {ANDROID_LOG_DEBUG, ANDROID_LOG_INFO,
197 ANDROID_LOG_INFO, ANDROID_LOG_WARN, ANDROID_LOG_ERROR, ANDROID_LOG_ERROR};
201 __android_log_vprint(android_level[lvl],
"cmusphinx", fmt, ap);
204 #elif defined(_WIN32_WCE)
206 err_wince_cb(
void *user_data, err_lvl_t lvl,
const char *fmt, ...)
214 _vsnprintf(msg,
sizeof(msg), fmt, ap);
217 size = mbstowcs(NULL, msg, 0) + 1;
219 mbstowcs(wmsg, msg, size);
221 OutputDebugStringW(wmsg);
226 err_logfp_cb(
void *user_data, err_lvl_t lvl,
const char *fmt, ...)
235 vfprintf(fp, fmt, ap);
245 if ((newfp = fopen(path,
"a")) == NULL)
249 if (oldfp != NULL && oldfp != stdout && oldfp != stderr)
257 if (stream == NULL) {
258 logfp_disabled = TRUE;
262 logfp_disabled = FALSE;
281 int prev = sphinx_debug_level;
282 sphinx_debug_level = level;
289 return sphinx_debug_level;
296 err_user_data= user_data;
SPHINXBASE_EXPORT const char * path2basename(const char *path)
Returns the last part of the path, without modifying anything in memory.
SPHINXBASE_EXPORT void err_set_logfp(FILE *stream)
Direct all logging to a given filehandle if default logfp callback is set.
#define ckd_calloc(n, sz)
Macros to simplify the use of above functions.
SPHINXBASE_EXPORT FILE * err_get_logfp(void)
Get the current logging filehandle.
SPHINXBASE_EXPORT int err_set_debug_level(int level)
Set debugging verbosity level.
SPHINXBASE_EXPORT void err_set_callback(err_cb_f callback, void *user_data)
Sets function to output error messages.
Sphinx's memory allocation/deallocation routines.
SPHINXBASE_EXPORT int err_get_debug_level(void)
Get debugging verbosity level.
File names related operation.
Basic type definitions used in Sphinx.
SPHINXBASE_EXPORT void ckd_free(void *ptr)
Test and free a 1-D array.
Implementation of logging routines.
SPHINXBASE_EXPORT int err_set_logfile(const char *path)
Append all log messages to a given file.