added dirty code to handle command line options in both bch and uch types
This commit is contained in:
parent
0d96bbb5f0
commit
85e36ae88b
@ -397,7 +397,6 @@ static void clear_sigterm (void)
|
||||
}
|
||||
/* ========================================================================= */
|
||||
|
||||
|
||||
#define MIN_MEMSIZE 2048000ul
|
||||
|
||||
int main (int argc, char* argv[])
|
||||
@ -406,7 +405,7 @@ int main (int argc, char* argv[])
|
||||
static moo_ooch_t str_main[] = { 'm', 'a', 'i', 'n' };
|
||||
|
||||
moo_t* moo;
|
||||
moo_stdcfg_t cfg;
|
||||
moo_cfgstd_t cfg;
|
||||
moo_errinf_t errinf;
|
||||
|
||||
moo_oocs_t objname;
|
||||
@ -448,6 +447,7 @@ int main (int argc, char* argv[])
|
||||
}
|
||||
|
||||
memset (&cfg, 0, MOO_SIZEOF(cfg));
|
||||
cfg.type = MOO_CFGSTD_OPTB;
|
||||
cfg.memsize = MIN_MEMSIZE;
|
||||
|
||||
while ((c = moo_getbopt(argc, argv, &opt)) != MOO_BCI_EOF)
|
||||
@ -455,7 +455,7 @@ int main (int argc, char* argv[])
|
||||
switch (c)
|
||||
{
|
||||
case 'l':
|
||||
cfg.logopt = opt.arg;
|
||||
cfg.u.optb.log = opt.arg;
|
||||
break;
|
||||
|
||||
case 'm':
|
||||
@ -472,7 +472,7 @@ int main (int argc, char* argv[])
|
||||
#if defined(MOO_BUILD_DEBUG)
|
||||
else if (moo_comp_bcstr(opt.lngopt, "debug") == 0)
|
||||
{
|
||||
cfg.dbgopt = opt.arg;
|
||||
cfg.u.optb.dbg = opt.arg;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
@ -498,7 +498,17 @@ int main (int argc, char* argv[])
|
||||
moo = moo_openstd(0, &cfg, &errinf);
|
||||
if (!moo)
|
||||
{
|
||||
fprintf (stderr, "ERROR: cannot open moo - %d\n", (int)errinf.num);
|
||||
#if defined(MOO_OOCH_IS_BCH)
|
||||
fprintf (stderr, "ERROR: cannot open moo - [%d] %s\n", (int)errinf.num, errinf.msg);
|
||||
#elif (MOO_SIZEOF_UCH_T == MOO_SIZEOF_WCHAR_T)
|
||||
fprintf (stderr, "ERROR: cannot open moo - [%d] %ls\n", (int)errinf.num, errinf.msg);
|
||||
#else
|
||||
moo_bch_t bcsmsg[MOO_COUNTOF(errinf.msg) * 2]; /* error messages may get truncated */
|
||||
moo_oow_t wcslen, bcslen;
|
||||
bcslen = MOO_COUNTOF(bcsmsg);
|
||||
moo_conv_ucstr_to_utf8 (errinf.msg, &wcslen, bcsmsg, &bcslen);
|
||||
fprintf (stderr, "ERROR: cannot open moo - [%d] %s\n", (int)errinf.num, bcsmsg);
|
||||
#endif
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -3,24 +3,43 @@
|
||||
|
||||
#include <moo.h>
|
||||
|
||||
enum moo_stdcfg_type_t
|
||||
enum moo_cfgstd_type_t
|
||||
{
|
||||
moo_stdcfg_tYPE_B,
|
||||
moo_stdcfg_tYPE_U
|
||||
MOO_CFGSTD_OPT,
|
||||
MOO_CFGSTD_OPTB,
|
||||
MOO_CFGSTD_OPTU
|
||||
};
|
||||
typedef enum moo_stdcfg_type_t moo_stdcfg_type_t;
|
||||
typedef enum moo_cfgstd_type_t moo_cfgstd_type_t;
|
||||
|
||||
struct moo_stdcfg_t
|
||||
struct moo_cfgstd_t
|
||||
{
|
||||
moo_stdcfg_type_t type;
|
||||
moo_cfgstd_type_t type;
|
||||
|
||||
moo_oow_t memsize;
|
||||
int large_pages;
|
||||
|
||||
const void* logopt;
|
||||
const void* dbgopt;
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
const moo_ooch_t* log;
|
||||
const moo_ooch_t* dbg;
|
||||
} opt;
|
||||
|
||||
struct
|
||||
{
|
||||
const moo_bch_t* log;
|
||||
const moo_bch_t* dbg;
|
||||
} optb;
|
||||
|
||||
struct
|
||||
{
|
||||
const moo_uch_t* log;
|
||||
const moo_uch_t* dbg;
|
||||
} optu;
|
||||
} u;
|
||||
};
|
||||
typedef struct moo_stdcfg_t moo_stdcfg_t;
|
||||
typedef struct moo_cfgstd_t moo_cfgstd_t;
|
||||
|
||||
|
||||
enum moo_iostd_type_t
|
||||
@ -60,7 +79,7 @@ extern "C" {
|
||||
|
||||
MOO_EXPORT moo_t* moo_openstd (
|
||||
moo_oow_t xtnsize,
|
||||
const moo_stdcfg_t* cfg,
|
||||
const moo_cfgstd_t* cfg,
|
||||
moo_errinf_t* errinfo
|
||||
);
|
||||
|
||||
|
230
moo/lib/std.c
230
moo/lib/std.c
@ -2838,28 +2838,30 @@ static struct
|
||||
{ "debug+", MOO_LOG_FATAL | MOO_LOG_ERROR | MOO_LOG_WARN | MOO_LOG_INFO | MOO_LOG_DEBUG }
|
||||
};
|
||||
|
||||
static int handle_logopt (moo_t* moo, const moo_bch_t* str)
|
||||
static struct
|
||||
{
|
||||
const char* name;
|
||||
moo_bitmask_t mask;
|
||||
} dbg_mask_table[] =
|
||||
{
|
||||
{ "bigint", MOO_DEBUG_BIGINT },
|
||||
{ "gc", MOO_DEBUG_GC }
|
||||
};
|
||||
|
||||
static int parse_logoptb (moo_t* moo, const moo_bch_t* str, moo_oow_t* xpathlen, moo_bitmask_t* xlogmask)
|
||||
{
|
||||
xtn_t* xtn = GET_XTN(moo);
|
||||
moo_bch_t* xstr = (moo_bch_t*)str;
|
||||
moo_bch_t* cm, * flt;
|
||||
moo_bitmask_t logmask;
|
||||
moo_oow_t i;
|
||||
moo_oow_t i, len, pathlen;
|
||||
|
||||
cm = moo_find_bchar_in_bcstr(xstr, ',');
|
||||
cm = moo_find_bchar_in_bcstr(str, ',');
|
||||
if (cm)
|
||||
{
|
||||
/* i duplicate this string for open() below as open() doesn't
|
||||
* accept a length-bounded string */
|
||||
xstr = moo_dupbchars(moo, str, moo_count_bcstr(str));
|
||||
if (!xstr)
|
||||
{
|
||||
moo_seterrbfmt (moo, MOO_ESYSERR, "out of memory in duplicating %hs", str);
|
||||
return -1;
|
||||
}
|
||||
|
||||
cm = moo_find_bchar_in_bcstr(xstr, ',');
|
||||
*cm = '\0';
|
||||
cm = moo_find_bchar_in_bcstr(str, ',');
|
||||
pathlen = cm - str;
|
||||
|
||||
logmask = xtn->log.mask;
|
||||
do
|
||||
@ -2867,11 +2869,11 @@ static int handle_logopt (moo_t* moo, const moo_bch_t* str)
|
||||
flt = cm + 1;
|
||||
|
||||
cm = moo_find_bchar_in_bcstr(flt, ',');
|
||||
if (cm) *cm = '\0';
|
||||
len = cm? (cm - flt): moo_count_bcstr(flt);
|
||||
|
||||
for (i = 0; i < MOO_COUNTOF(log_mask_table); i++)
|
||||
{
|
||||
if (moo_comp_bcstr(flt, log_mask_table[i].name) == 0)
|
||||
if (moo_comp_bchars_bcstr(flt, len, log_mask_table[i].name) == 0)
|
||||
{
|
||||
logmask |= log_mask_table[i].mask;
|
||||
break;
|
||||
@ -2880,20 +2882,92 @@ static int handle_logopt (moo_t* moo, const moo_bch_t* str)
|
||||
|
||||
if (i >= MOO_COUNTOF(log_mask_table))
|
||||
{
|
||||
moo_seterrbfmt (moo, MOO_EINVAL, "unknown log option value %hs", flt);
|
||||
if (str != xstr) moo_freemem (moo, xstr);
|
||||
moo_seterrbfmt (moo, MOO_EINVAL, "unknown log option value %.*hs", len, flt);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
while (cm);
|
||||
|
||||
|
||||
if (!(logmask & MOO_LOG_ALL_TYPES)) logmask |= MOO_LOG_ALL_TYPES; /* no types specified. force to all types */
|
||||
if (!(logmask & MOO_LOG_ALL_LEVELS)) logmask |= MOO_LOG_ALL_LEVELS; /* no levels specified. force to all levels */
|
||||
}
|
||||
else
|
||||
{
|
||||
logmask = MOO_LOG_ALL_LEVELS | MOO_LOG_ALL_TYPES;
|
||||
pathlen = moo_count_bcstr(str);
|
||||
}
|
||||
|
||||
*xlogmask = logmask;
|
||||
*xpathlen = pathlen;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int parse_logoptu (moo_t* moo, const moo_uch_t* str, moo_oow_t* xpathlen, moo_bitmask_t* xlogmask)
|
||||
{
|
||||
xtn_t* xtn = GET_XTN(moo);
|
||||
moo_uch_t* cm, * flt;
|
||||
moo_bitmask_t logmask;
|
||||
moo_oow_t i, len, pathlen;
|
||||
|
||||
cm = moo_find_uchar_in_ucstr(str, ',');
|
||||
if (cm)
|
||||
{
|
||||
cm = moo_find_uchar_in_ucstr(str, ',');
|
||||
pathlen = cm - str;
|
||||
|
||||
logmask = xtn->log.mask;
|
||||
do
|
||||
{
|
||||
flt = cm + 1;
|
||||
|
||||
cm = moo_find_uchar_in_ucstr(flt, ',');
|
||||
len = cm? (cm - flt): moo_count_ucstr(flt);
|
||||
|
||||
for (i = 0; i < MOO_COUNTOF(log_mask_table); i++)
|
||||
{
|
||||
if (moo_comp_uchars_bcstr(flt, len, log_mask_table[i].name) == 0)
|
||||
{
|
||||
logmask |= log_mask_table[i].mask;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i >= MOO_COUNTOF(log_mask_table))
|
||||
{
|
||||
moo_seterrbfmt (moo, MOO_EINVAL, "unknown log option value %.*ls", len, flt);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
while (cm);
|
||||
|
||||
if (!(logmask & MOO_LOG_ALL_TYPES)) logmask |= MOO_LOG_ALL_TYPES; /* no types specified. force to all types */
|
||||
if (!(logmask & MOO_LOG_ALL_LEVELS)) logmask |= MOO_LOG_ALL_LEVELS; /* no levels specified. force to all levels */
|
||||
}
|
||||
else
|
||||
{
|
||||
logmask = MOO_LOG_ALL_LEVELS | MOO_LOG_ALL_TYPES;
|
||||
pathlen = moo_count_ucstr(str);
|
||||
}
|
||||
|
||||
*xlogmask = logmask;
|
||||
*xpathlen = pathlen;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int handle_logoptb (moo_t* moo, const moo_bch_t* str)
|
||||
{
|
||||
xtn_t* xtn = GET_XTN(moo);
|
||||
moo_bitmask_t logmask;
|
||||
moo_oow_t pathlen;
|
||||
moo_bch_t* xstr = (moo_bch_t*)str;
|
||||
|
||||
if (parse_logoptb(moo, str, &pathlen, &logmask) <= -1) return -1;
|
||||
|
||||
if (str[pathlen] != '\0')
|
||||
{
|
||||
xstr = moo_dupbchars(moo, str, pathlen);
|
||||
if (!xstr) moo_seterrbfmt (moo, moo_geterrnum(moo), "out of memory in duplicating %hs", str);
|
||||
}
|
||||
|
||||
xtn->log.fd = open(xstr, O_CREAT | O_WRONLY | O_APPEND , 0644);
|
||||
@ -2914,10 +2988,40 @@ static int handle_logopt (moo_t* moo, const moo_bch_t* str)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int handle_dbgopt (moo_t* moo, const moo_bch_t* str)
|
||||
static int handle_logoptu (moo_t* moo, const moo_uch_t* str)
|
||||
{
|
||||
xtn_t* xtn = GET_XTN(moo);
|
||||
moo_bitmask_t logmask;
|
||||
moo_oow_t pathlen;
|
||||
moo_bch_t* xstr;
|
||||
|
||||
if (parse_logoptu(moo, str, &pathlen, &logmask) <= -1) return -1;
|
||||
|
||||
xstr = moo_duputobchars(moo, str, pathlen, MOO_NULL); /* moo_duputobchars() null-terminates xstr */
|
||||
if (!xstr) moo_seterrbfmt (moo, moo_geterrnum(moo), "out of memory in duplicating %hs", str);
|
||||
|
||||
xtn->log.fd = open(xstr, O_CREAT | O_WRONLY | O_APPEND , 0644);
|
||||
if (xtn->log.fd == -1)
|
||||
{
|
||||
moo_seterrbfmt (moo, MOO_ESYSERR, "cannot open log file %hs", xstr); /* TODO: use syserrb/u??? */
|
||||
moo_freemem (moo, xstr);
|
||||
return -1;
|
||||
}
|
||||
|
||||
xtn->log.mask = logmask;
|
||||
xtn->log.fd_flag |= LOGFD_OPENED_HERE;
|
||||
#if defined(HAVE_ISATTY)
|
||||
if (isatty(xtn->log.fd)) xtn->log.fd_flag |= LOGFD_TTY;
|
||||
#endif
|
||||
|
||||
moo_freemem (moo, xstr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int handle_dbgoptb (moo_t* moo, const moo_bch_t* str)
|
||||
{
|
||||
const moo_bch_t* cm, * flt;
|
||||
moo_oow_t len;
|
||||
moo_oow_t len, i;
|
||||
moo_bitmask_t trait, dbgopt = 0;
|
||||
|
||||
cm = str - 1;
|
||||
@ -2927,9 +3031,16 @@ static int handle_dbgopt (moo_t* moo, const moo_bch_t* str)
|
||||
|
||||
cm = moo_find_bchar_in_bcstr(flt, ',');
|
||||
len = cm? (cm - flt): moo_count_bcstr(flt);
|
||||
if (moo_comp_bchars_bcstr(flt, len, "gc") == 0) dbgopt |= MOO_DEBUG_GC;
|
||||
else if (moo_comp_bchars_bcstr(flt, len, "bigint") == 0) dbgopt |= MOO_DEBUG_BIGINT;
|
||||
else
|
||||
|
||||
for (i = 0; i < MOO_COUNTOF(dbg_mask_table); i++)
|
||||
{
|
||||
if (moo_comp_bchars_bcstr(flt, len, dbg_mask_table[i].name) == 0)
|
||||
{
|
||||
dbgopt |= dbg_mask_table[i].mask;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i >= MOO_COUNTOF(log_mask_table))
|
||||
{
|
||||
moo_seterrbfmt (moo, MOO_EINVAL, "unknown log option value %.*hs", len, flt);
|
||||
return -1;
|
||||
@ -2944,6 +3055,73 @@ static int handle_dbgopt (moo_t* moo, const moo_bch_t* str)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int handle_dbgoptu (moo_t* moo, const moo_uch_t* str)
|
||||
{
|
||||
const moo_uch_t* cm, * flt;
|
||||
moo_oow_t len, i;
|
||||
moo_bitmask_t trait, dbgopt = 0;
|
||||
|
||||
cm = str - 1;
|
||||
do
|
||||
{
|
||||
flt = cm + 1;
|
||||
|
||||
cm = moo_find_uchar_in_ucstr(flt, ',');
|
||||
len = cm? (cm - flt): moo_count_ucstr(flt);
|
||||
|
||||
for (i = 0; i < MOO_COUNTOF(dbg_mask_table); i++)
|
||||
{
|
||||
if (moo_comp_uchars_bcstr(flt, len, dbg_mask_table[i].name) == 0)
|
||||
{
|
||||
dbgopt |= dbg_mask_table[i].mask;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i >= MOO_COUNTOF(log_mask_table))
|
||||
{
|
||||
moo_seterrbfmt (moo, MOO_EINVAL, "unknown log option value %.*ls", len, flt);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
while (cm);
|
||||
|
||||
moo_getoption (moo, MOO_TRAIT, &trait);
|
||||
trait |= dbgopt;
|
||||
moo_setoption (moo, MOO_TRAIT, &trait);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int handle_cfg_options (moo_t* moo, const moo_cfgstd_t* cfg)
|
||||
{
|
||||
switch (cfg->type)
|
||||
{
|
||||
#if defined(MOO_OOCH_IS_BCH)
|
||||
case MOO_CFGSTD_OPT:
|
||||
MOO_ASSERT (moo, &cfg->u.optb.log == &cfg->u.opt.log);
|
||||
MOO_ASSERT (moo, &cfg->u.optb.dbg == &cfg->u.opt.dbg);
|
||||
#endif
|
||||
case MOO_CFGSTD_OPTB:
|
||||
if ((cfg->u.optb.log && handle_logoptb(moo, cfg->u.optb.log) <= -1) ||
|
||||
(cfg->u.optb.dbg && handle_dbgoptb(moo, cfg->u.optb.dbg) <= -1)) return -1;
|
||||
return 0;
|
||||
|
||||
#if defined(MOO_OOCH_IS_UCH)
|
||||
case MOO_CFGSTD_OPT:
|
||||
MOO_ASSERT (moo, &cfg->u.optu.log == &cfg->u.opt.log);
|
||||
MOO_ASSERT (moo, &cfg->u.optu.dbg == &cfg->u.opt.dbg);
|
||||
#endif
|
||||
case MOO_CFGSTD_OPTU:
|
||||
if ((cfg->u.optu.log && handle_logoptu(moo, cfg->u.optu.log) <= -1) ||
|
||||
(cfg->u.optu.dbg && handle_dbgoptu(moo, cfg->u.optu.dbg) <= -1)) return -1;
|
||||
return 0;
|
||||
|
||||
default:
|
||||
moo_seterrbfmt (moo, MOO_EINVAL, "unsupported configuration option type - %d", (int)cfg->type);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
/* ========================================================================= */
|
||||
|
||||
|
||||
@ -2995,7 +3173,7 @@ static void fini_moo (moo_t* moo)
|
||||
unchain (moo);
|
||||
}
|
||||
|
||||
moo_t* moo_openstd (moo_oow_t xtnsize, const moo_stdcfg_t* cfg, moo_errinf_t* errinfo)
|
||||
moo_t* moo_openstd (moo_oow_t xtnsize, const moo_cfgstd_t* cfg, moo_errinf_t* errinfo)
|
||||
{
|
||||
moo_t* moo;
|
||||
moo_vmprim_t vmprim;
|
||||
@ -3037,9 +3215,7 @@ moo_t* moo_openstd (moo_oow_t xtnsize, const moo_stdcfg_t* cfg, moo_errinf_t* er
|
||||
evtcb.fini = fini_moo;
|
||||
moo_regevtcb (moo, &evtcb);
|
||||
|
||||
/* TODO: cfg->logopt, dbgopt => bch uch differentation */
|
||||
if ((cfg->logopt && handle_logopt(moo, cfg->logopt) <= -1) ||
|
||||
(cfg->dbgopt && handle_dbgopt(moo, cfg->dbgopt) <= -1))
|
||||
if (handle_cfg_options(moo, cfg) <= -1)
|
||||
{
|
||||
if (errinfo) moo_geterrinf (moo, errinfo);
|
||||
moo_close (moo);
|
||||
|
Loading…
Reference in New Issue
Block a user