extended the value of the -l option to have log types after a log file name. e.g. -l /dev/stderr,app,gc
This commit is contained in:
parent
7710ad99d0
commit
d8bcb6e012
@ -196,6 +196,7 @@ struct xtn_t
|
||||
int vm_running;
|
||||
|
||||
int logfd;
|
||||
int logmask;
|
||||
|
||||
#if defined(_WIN32)
|
||||
HANDLE waitable_timer;
|
||||
@ -736,6 +737,8 @@ static void log_write (moo_t* moo, moo_oow_t mask, const moo_ooch_t* msg, moo_oo
|
||||
xtn_t* xtn = moo_getxtn(moo);
|
||||
int logfd;
|
||||
|
||||
if (!(xtn->logmask & mask)) return;
|
||||
|
||||
if (mask & MOO_LOG_STDOUT) logfd = 1;
|
||||
else if (mask & MOO_LOG_STDERR) logfd = 2;
|
||||
else
|
||||
@ -2060,6 +2063,58 @@ static void close_moo (moo_t* moo)
|
||||
moo_close (moo);
|
||||
}
|
||||
|
||||
static int handle_logopt (moo_t* moo, const moo_bch_t* str)
|
||||
{
|
||||
xtn_t* xtn = moo_getxtn (moo);
|
||||
moo_bch_t* xstr = (moo_bch_t*)str;
|
||||
moo_bch_t* cm, * flt;
|
||||
|
||||
cm = moo_findbcharinbcstr (xstr, ',');
|
||||
if (cm)
|
||||
{
|
||||
xstr = moo_dupbchars (moo, str, moo_countbcstr(str));
|
||||
if (!xstr)
|
||||
{
|
||||
fprintf (stderr, "ERROR: out of memory in duplicating %s\n", str);
|
||||
return -1;
|
||||
}
|
||||
|
||||
cm = moo_findbcharinbcstr(xstr, ',');
|
||||
*cm = '\0';
|
||||
|
||||
do
|
||||
{
|
||||
flt = cm + 1;
|
||||
|
||||
cm = moo_findbcharinbcstr(flt, ',');
|
||||
if (cm) *cm = '\0';
|
||||
|
||||
if (moo_compbcstr (flt, "app") == 0) xtn->logmask |= MOO_LOG_APP;
|
||||
else if (moo_compbcstr (flt, "mnemonic") == 0) xtn->logmask |= MOO_LOG_MNEMONIC;
|
||||
else if (moo_compbcstr (flt, "gc") == 0) xtn->logmask |= MOO_LOG_GC;
|
||||
else if (moo_compbcstr (flt, "ic") == 0) xtn->logmask |= MOO_LOG_IC;
|
||||
else if (moo_compbcstr (flt, "primitive") == 0) xtn->logmask |= MOO_LOG_PRIMITIVE;
|
||||
|
||||
}
|
||||
while (cm);
|
||||
}
|
||||
else
|
||||
{
|
||||
xtn->logmask = MOO_LOG_ALL_TYPES;
|
||||
}
|
||||
|
||||
xtn->logfd = open (xstr, O_CREAT | O_WRONLY | O_APPEND , 0644);
|
||||
if (xtn->logfd == -1)
|
||||
{
|
||||
fprintf (stderr, "ERROR: cannot open %s\n", xstr);
|
||||
if (str != xstr) moo_freemem (moo, xstr);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (str != xstr) moo_freemem (moo, xstr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main (int argc, char* argv[])
|
||||
{
|
||||
static moo_ooch_t str_my_object[] = { 'M', 'y', 'O', 'b','j','e','c','t' }; /*TODO: make this an argument */
|
||||
@ -2079,7 +2134,7 @@ int main (int argc, char* argv[])
|
||||
MOO_NULL
|
||||
};
|
||||
|
||||
const char* logfile = MOO_NULL;
|
||||
const char* logopt = MOO_NULL;
|
||||
|
||||
setlocale (LC_ALL, "");
|
||||
|
||||
@ -2096,7 +2151,7 @@ int main (int argc, char* argv[])
|
||||
switch (c)
|
||||
{
|
||||
case 'l':
|
||||
logfile = opt.arg;
|
||||
logopt = opt.arg;
|
||||
break;
|
||||
|
||||
case ':':
|
||||
@ -2134,7 +2189,7 @@ int main (int argc, char* argv[])
|
||||
moo = moo_open (&sys_mmgr, MOO_SIZEOF(xtn_t), 2048000lu, &vmprim, MOO_NULL);
|
||||
if (!moo)
|
||||
{
|
||||
printf ("cannot open moo\n");
|
||||
fprintf (stderr, "ERROR: cannot open moo\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -2164,12 +2219,10 @@ int main (int argc, char* argv[])
|
||||
xtn = moo_getxtn (moo);
|
||||
xtn->logfd = -1;
|
||||
|
||||
if (logfile)
|
||||
if (logopt)
|
||||
{
|
||||
xtn->logfd = open (logfile, O_CREAT | O_WRONLY | O_APPEND , 0644);
|
||||
if (xtn->logfd == -1)
|
||||
if (handle_logopt (moo, logopt) <= -1)
|
||||
{
|
||||
fprintf (stderr, "ERROR: cannot open %s\n", logfile);
|
||||
close_moo (moo);
|
||||
return -1;
|
||||
}
|
||||
|
@ -1358,8 +1358,14 @@ enum moo_log_mask_t
|
||||
MOO_LOG_PRIMITIVE = (1 << 10),
|
||||
MOO_LOG_APP = (1 << 11), /* moo applications, set by moo logging primitive */
|
||||
|
||||
|
||||
MOO_LOG_ALL_LEVELS = (MOO_LOG_DEBUG | MOO_LOG_INFO | MOO_LOG_WARN | MOO_LOG_ERROR | MOO_LOG_FATAL),
|
||||
MOO_LOG_ALL_TYPES = (MOO_LOG_MNEMONIC | MOO_LOG_GC | MOO_LOG_IC | MOO_LOG_PRIMITIVE | MOO_LOG_APP),
|
||||
|
||||
|
||||
MOO_LOG_STDOUT = (1 << 14), /* write log messages to stdout without timestamp. MOO_LOG_STDOUT wins over MOO_LOG_STDERR. */
|
||||
MOO_LOG_STDERR = (1 << 15), /* write log messages to stderr without timestamp. */
|
||||
|
||||
};
|
||||
typedef enum moo_log_mask_t moo_log_mask_t;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user