fixed log functions for the WCHAR mode

This commit is contained in:
hyung-hwan 2017-09-16 03:57:54 +00:00
parent 33436ab0fb
commit bcc9da7aca
2 changed files with 93 additions and 54 deletions

View File

@ -58,8 +58,7 @@
#define QSE_LOG_CONSOLE (1UL << 20) #define QSE_LOG_CONSOLE (1UL << 20)
#define QSE_LOG_FILE (1UL << 21) #define QSE_LOG_FILE (1UL << 21)
#define QSE_LOG_SYSLOG (1UL << 22) #define QSE_LOG_SYSLOG (1UL << 22)
#define QSE_LOG_SYSLOG_LOCAL (1UL << 23) #define QSE_LOG_SYSLOG_REMOTE (1UL << 23)
#define QSE_LOG_SYSLOG_REMOTE (1UL << 24)
#define QSE_LOG_MASK_PRIORITY 0x00000FFFUL #define QSE_LOG_MASK_PRIORITY 0x00000FFFUL
#define QSE_LOG_MASK_OPTION 0x000FF000UL #define QSE_LOG_MASK_OPTION 0x000FF000UL
@ -220,6 +219,7 @@ struct qse_log_t
qse_mbs_t* dmsgbuf; qse_mbs_t* dmsgbuf;
#if defined(QSE_CHAR_IS_WCHAR) #if defined(QSE_CHAR_IS_WCHAR)
qse_wcs_t* wmsgbuf; qse_wcs_t* wmsgbuf;
qse_mchar_t mident[QSE_LOG_IDENT_MAX * 2 +1];
#endif #endif
qse_mtx_t mtx; qse_mtx_t mtx;
@ -240,7 +240,7 @@ typedef struct qse_log_target_t qse_log_target_t;
extern "C" { extern "C" {
#endif #endif
qse_log_t* qse_log_open ( QSE_EXPORT qse_log_t* qse_log_open (
qse_mmgr_t* mmgr, qse_mmgr_t* mmgr,
qse_size_t xtnsize, qse_size_t xtnsize,
const qse_char_t* ident, const qse_char_t* ident,
@ -248,56 +248,76 @@ qse_log_t* qse_log_open (
const qse_log_target_t* target const qse_log_target_t* target
); );
void qse_log_close ( QSE_EXPORT void qse_log_close (
qse_log_t* log qse_log_t* log
); );
void qse_log_setident ( QSE_EXPORT void qse_log_setident (
qse_log_t* log, qse_log_t* log,
const qse_char_t* ident const qse_char_t* ident
); );
void qse_log_settarget ( QSE_EXPORT void qse_log_settarget (
qse_log_t* log, qse_log_t* log,
int flags, int flags,
const qse_log_target_t* target const qse_log_target_t* target
); );
int qse_log_gettarget ( QSE_EXPORT int qse_log_gettarget (
qse_log_t* log, qse_log_t* log,
qse_log_target_t* target qse_log_target_t* target
); );
void qse_log_setpriority ( QSE_EXPORT void qse_log_setoption (
qse_log_t* log,
int options
);
#if defined(QSE_HAVE_INLINE)
static QSE_INLINE int qse_log_getoption (qse_log_t* log)
{
return log->flags & QSE_LOG_MASK_OPTION;
}
#else
#define qse_log_getoption(log) ((log)->flags & QSE_LOG_MASK_OPTION)
#endif
QSE_EXPORT void qse_log_setpriority (
qse_log_t* log, qse_log_t* log,
int priority int priority
); );
int qse_log_setprioritybyname ( QSE_EXPORT int qse_log_setprioritybyname (
qse_log_t* log, qse_log_t* log,
const qse_char_t* name const qse_char_t* name
); );
void qse_log_setsyslogfacility ( QSE_EXPORT void qse_log_setsyslogfacility (
qse_log_t* log, qse_log_t* log,
qse_log_facility_t facility qse_log_facility_t facility
); );
int qse_log_setsyslogfacilitybyname ( QSE_EXPORT int qse_log_setsyslogfacilitybyname (
qse_log_t* log, qse_log_t* log,
const qse_char_t* name const qse_char_t* name
); );
int qse_log_getpriority ( #if defined(QSE_HAVE_INLINE)
qse_log_t* log static QSE_INLINE int qse_log_getpriority (qse_log_t* log)
); {
return log->flags & QSE_LOG_MASK_PRIORITY;
}
#else
#define qse_log_getpriority(log) ((log)->flags & QSE_LOG_MASK_PRIORITY)
#endif
const qse_char_t* qse_log_getpriorityname ( const qse_char_t* qse_log_getpriorityname (
qse_log_t* log qse_log_t* log
); );
void qse_log_report ( QSE_EXPORT void qse_log_report (
qse_log_t* log, qse_log_t* log,
const qse_char_t* ident, const qse_char_t* ident,
int pri, int pri,
@ -305,7 +325,7 @@ void qse_log_report (
... ...
); );
void qse_log_reportv ( QSE_EXPORT void qse_log_reportv (
qse_log_t* log, qse_log_t* log,
const qse_char_t* ident, const qse_char_t* ident,
int pri, int pri,
@ -313,7 +333,7 @@ void qse_log_reportv (
va_list ap va_list ap
); );
const qse_char_t* qse_get_log_priority_name ( QSE_EXPORT const qse_char_t* qse_get_log_priority_name (
int pri int pri
); );

View File

@ -53,7 +53,7 @@ static const qse_char_t* __priority_names[] =
QSE_NULL QSE_NULL
}; };
static const qse_char_t* __syslog_month_names[] = static const qse_mchar_t* __syslog_month_names[] =
{ {
QSE_MT("Jan"), QSE_MT("Jan"),
QSE_MT("Feb"), QSE_MT("Feb"),
@ -158,7 +158,6 @@ int qse_log_init (qse_log_t* log, qse_mmgr_t* mmgr, const qse_char_t* ident, int
} }
if (potflags & QSE_LOG_CONSOLE) log->flags |= QSE_LOG_CONSOLE; if (potflags & QSE_LOG_CONSOLE) log->flags |= QSE_LOG_CONSOLE;
if (potflags & QSE_LOG_SYSLOG) log->flags |= QSE_LOG_SYSLOG; if (potflags & QSE_LOG_SYSLOG) log->flags |= QSE_LOG_SYSLOG;
if (potflags & QSE_LOG_SYSLOG_LOCAL) log->flags |= QSE_LOG_SYSLOG_LOCAL;
if (potflags & QSE_LOG_SYSLOG_REMOTE) if (potflags & QSE_LOG_SYSLOG_REMOTE)
{ {
@ -255,6 +254,11 @@ void qse_log_setident (qse_log_t* log, const qse_char_t* ident)
if (log->t.syslog.opened) if (log->t.syslog.opened)
{ {
/* it's best to avoid using QSE_LOG_SYSLOG
* if the application calls syslog APIs directly.
* otherwise, it may conflict with openlog()/closelog()
* called in this library */
closelog (); closelog ();
log->t.syslog.opened = 0; log->t.syslog.opened = 0;
/* it will be opened again with the new identifier in the /* it will be opened again with the new identifier in the
@ -264,30 +268,44 @@ void qse_log_setident (qse_log_t* log, const qse_char_t* ident)
void qse_log_settarget (qse_log_t* log, int flags, const qse_log_target_t* target) void qse_log_settarget (qse_log_t* log, int flags, const qse_log_target_t* target)
{ {
#if 0 if (log->t.syslog_remote.sock >= 0)
/* TODO: */
if ((log->flags & QSE_LOG_SYSLOG_REMOTE) != 0 &&
(flags & QSE_LOG_SYSLOG_REMOTE) == 0)
{ {
QSE_CLOSE (log->t.syslog_remote.sock); QSE_CLOSE (log->t.syslog_remote.sock);
log->t.syslog_remote.sock = -1;
} }
if ((log->flags & QSE_LOG_SYSLOG_REMOTE) == 0 && if (log->t.console.sio)
(flags & QSE_LOG_SYSLOG_REMOTE) != 0)
{ {
int sock; qse_sio_close (log->t.console.sio);
sock = qse_sckopen (AF_INET, SOCK_DGRAM, 0); log->t.console.sio = QSE_NULL;
if (sock == -1) flags &= ~QSE_LOG_SYSLOG_REMOTE; }
else log->t.syslog_remote.sock = sock;
if (log->t.file.sio)
{
qse_sio_close (log->t.file.sio);
log->t.file.sio = QSE_NULL;
}
if (log->t.syslog.opened)
{
closelog ();
log->t.syslog.opened = 0;
} }
log->flags &= (QSE_LOG_MASK_PRIORITY | QSE_LOG_MASK_OPTION); /* preserve the priority and the options */ log->flags &= (QSE_LOG_MASK_PRIORITY | QSE_LOG_MASK_OPTION); /* preserve the priority and the options */
if (flags & QSE_LOG_FILE) log->flags |= QSE_LOG_FILE; if (flags & QSE_LOG_FILE)
{
qse_strxcpy (log->t.file.path, QSE_COUNTOF(log->t.file.path), target->file);
log->flags |= QSE_LOG_FILE;
}
if (flags & QSE_LOG_CONSOLE) log->flags |= QSE_LOG_CONSOLE; if (flags & QSE_LOG_CONSOLE) log->flags |= QSE_LOG_CONSOLE;
if (flags & QSE_LOG_SYSLOG) log->flags |= QSE_LOG_SYSLOG; if (flags & QSE_LOG_SYSLOG) log->flags |= QSE_LOG_SYSLOG;
if (flags & QSE_LOG_SYSLOG_REMOTE)
if (flags & QSE_LOG_SYSLOG_REMOTE) log->flags |= QSE_LOG_SYSLOG_REMOTE; {
#endif log->t.syslog_remote.addr = target->syslog_remote;
log->flags |= QSE_LOG_SYSLOG_REMOTE;
}
} }
@ -301,9 +319,15 @@ int qse_log_gettarget (qse_log_t* log, qse_log_target_t* target)
return log->flags & QSE_LOG_MASK_TARGET; return log->flags & QSE_LOG_MASK_TARGET;
} }
void qse_log_setoption (qse_log_t* log, int option)
{
log->flags = (log->flags & (QSE_LOG_MASK_TARGET | QSE_LOG_MASK_PRIORITY)) | (option & QSE_LOG_MASK_OPTION);
}
void qse_log_setpriority (qse_log_t* log, int priority) void qse_log_setpriority (qse_log_t* log, int priority)
{ {
log->flags = (log->flags & QSE_LOG_MASK_TARGET) | (priority & QSE_LOG_MASK_PRIORITY); log->flags = (log->flags & (QSE_LOG_MASK_TARGET | QSE_LOG_MASK_OPTION)) | (priority & QSE_LOG_MASK_PRIORITY);
} }
int qse_log_setprioritybyname (qse_log_t* log, const qse_char_t* name) int qse_log_setprioritybyname (qse_log_t* log, const qse_char_t* name)
@ -324,6 +348,15 @@ int qse_log_setprioritybyname (qse_log_t* log, const qse_char_t* name)
return -1; return -1;
} }
const qse_char_t* qse_log_getpriorityname (qse_log_t* log)
{
int pri = log->flags & QSE_LOG_MASK_PRIORITY;
if (pri < 0 || pri >= QSE_COUNTOF(__priority_names)) return QSE_NULL;
return __priority_names[pri];
}
void qse_log_setsyslogfacility (qse_log_t* log, qse_log_facility_t facility) void qse_log_setsyslogfacility (qse_log_t* log, qse_log_facility_t facility)
{ {
#ifndef _WIN32 #ifndef _WIN32
@ -354,19 +387,6 @@ int qse_log_setsyslogfacilitybyname (qse_log_t* log, const qse_char_t* name)
#endif #endif
} }
int qse_log_getpriority (qse_log_t* log)
{
return log->flags & QSE_LOG_MASK_PRIORITY;
}
const qse_char_t* qse_log_getpriorityname (qse_log_t* log)
{
int pri = log->flags & QSE_LOG_MASK_PRIORITY;
if (pri < 0 || pri >= QSE_COUNTOF(__priority_names)) return QSE_NULL;
return __priority_names[pri];
}
static QSE_INLINE void __report_over_sio (qse_log_t* log, qse_sio_t* sio, const qse_mchar_t* tm, const qse_char_t* ident, const qse_char_t* fmt, va_list arg) static QSE_INLINE void __report_over_sio (qse_log_t* log, qse_sio_t* sio, const qse_mchar_t* tm, const qse_char_t* ident, const qse_char_t* fmt, va_list arg)
{ {
int id_out = 0; int id_out = 0;
@ -439,7 +459,7 @@ void qse_log_reportv (qse_log_t* log, const qse_char_t* ident, int pri, const qs
if (cnow.gmtoff == QSE_TYPE_MIN(int)) if (cnow.gmtoff == QSE_TYPE_MIN(int))
{ {
qse_mbsxfmt (tm, QSE_COUNTOF(tm), qse_mbsxfmt (tm, QSE_COUNTOF(tm),
QSE_T("%04.4d-%02d-%02d %02d:%02d:%02d"), QSE_MT("%04.4d-%02d-%02d %02d:%02d:%02d"),
cnow.year + QSE_BTIME_YEAR_BASE, cnow.mon + 1, cnow.mday, cnow.year + QSE_BTIME_YEAR_BASE, cnow.mon + 1, cnow.mday,
cnow.hour, cnow.min, cnow.sec); cnow.hour, cnow.min, cnow.sec);
} }
@ -449,7 +469,7 @@ void qse_log_reportv (qse_log_t* log, const qse_char_t* ident, int pri, const qs
gmtoff_hour = cnow.gmtoff / QSE_SECS_PER_HOUR; gmtoff_hour = cnow.gmtoff / QSE_SECS_PER_HOUR;
gmtoff_min = (cnow.gmtoff % QSE_SECS_PER_HOUR) / QSE_SECS_PER_MIN; gmtoff_min = (cnow.gmtoff % QSE_SECS_PER_HOUR) / QSE_SECS_PER_MIN;
qse_mbsxfmt (tm, QSE_COUNTOF(tm), qse_mbsxfmt (tm, QSE_COUNTOF(tm),
QSE_T("%04.4d-%02d-%02d %02d:%02d:%02d %c%02d%02d"), QSE_MT("%04.4d-%02d-%02d %02d:%02d:%02d %c%02d%02d"),
cnow.year + QSE_BTIME_YEAR_BASE, cnow.mon + 1, cnow.mday, cnow.year + QSE_BTIME_YEAR_BASE, cnow.mon + 1, cnow.mday,
cnow.hour, cnow.min, cnow.sec, cnow.hour, cnow.min, cnow.sec,
((cnow.gmtoff > 0)? QSE_T('+'): QSE_T('-')), ((cnow.gmtoff > 0)? QSE_T('+'): QSE_T('-')),
@ -488,7 +508,7 @@ void qse_log_reportv (qse_log_t* log, const qse_char_t* ident, int pri, const qs
} }
} }
if (log->flags & (QSE_LOG_SYSLOG | QSE_LOG_SYSLOG_LOCAL | QSE_LOG_SYSLOG_REMOTE)) if (log->flags & (QSE_LOG_SYSLOG | QSE_LOG_SYSLOG_REMOTE))
{ {
va_list xap; va_list xap;
qse_size_t fplen, fpdlen, fpdilen; qse_size_t fplen, fpdlen, fpdilen;
@ -560,7 +580,7 @@ void qse_log_reportv (qse_log_t* log, const qse_char_t* ident, int pri, const qs
if (qse_mbs_vfcat (log->dmsgbuf, fmt, xap) == (qse_size_t)-1) goto done; if (qse_mbs_vfcat (log->dmsgbuf, fmt, xap) == (qse_size_t)-1) goto done;
#else #else
if (qse_wcs_vfmt (log->wmsgbuf, fmt, xap) == (qse_size_t)-1 || if (qse_wcs_vfmt (log->wmsgbuf, fmt, xap) == (qse_size_t)-1 ||
qse_mbs_vfcat (log->dmsgbuf, QSE_MT("%.*ls"), QSE_WCS_LEN(log->wmsgbuf), QSE_WCS_PTR(log->wmsgbuf)) == (qse_size_t)-1) goto done; qse_mbs_fcat (log->dmsgbuf, QSE_MT("%.*ls"), QSE_WCS_LEN(log->wmsgbuf), QSE_WCS_PTR(log->wmsgbuf)) == (qse_size_t)-1) goto done;
#endif #endif
if (log->flags & QSE_LOG_SYSLOG) if (log->flags & QSE_LOG_SYSLOG)
@ -578,9 +598,8 @@ void qse_log_reportv (qse_log_t* log, const qse_char_t* ident, int pri, const qs
#if defined(QSE_CHAR_IS_MCHAR) #if defined(QSE_CHAR_IS_MCHAR)
openlog (log->ident, sl_opt, log->syslog_facility); openlog (log->ident, sl_opt, log->syslog_facility);
#else #else
qse_mchar_t idbuf[QSE_LOG_IDENT_MAX * 2 + 1]; qse_mbsxfmt (log->mident, QSE_COUNTOF(log->mident), QSE_MT("%ls"), log->ident);
qse_mbsxfmt (idbuf, QSE_COUNTOF(idbuf), QSE_MT("%ls"), log->ident); openlog (log->mident, sl_opt, log->syslog_facility);
openlog (idbuf, sl_opt, log->syslog_facility);
#endif #endif
log->t.syslog.opened = 1; log->t.syslog.opened = 1;
} }