/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=2 et sw=2 tw=80: */
/**
s2sh2 - a cleanup of s2sh.
s2sh2 is functionally *nearly* identical to s2sh, the primary
difference being that s2sh2 has more conventional/cleaned-up CLI
argument handling. Many of the flags which are toggles in s2sh have
only a single form in s2sh2, to turn something on or off, but not
toggle it.
Other minor differences:
- $2 is a UKWD referring to the global s2 object.
*/
#define S2SH_VERSION 2
#include "shell_common.c"
/**
gcc bug: if this function is marked static here, it does
not recognize that shell_common.c uses it and declares that
it's unused.
*/
static CliAppSwitch const * s2sh_cliapp_switches(){
static const CliAppSwitch cliAppSwitches[] = {
/* {opaque, dash, key, value, brief, details, callback, reserved} */
/** Fills out most of a CliAppSwitch entry */
#define F6(IDFLAGS,DASHES,KEY,VAL,BRIEF,PFLAGS) \
{IDFLAGS, DASHES, KEY, VAL, BRIEF, 0, 0, PFLAGS}
/** Continues the help text for the previous entry. */
#define FCONTINUE(LABEL) {SW_CONTINUE, 0, 0, 0, LABEL, 0, 0, 0}
/** Adds an "additional info" line, not indented. */
#define FINFOLINE(LABEL) {SW_INFOLINE, 0, 0, 0, LABEL, 0, 0, 0}
/** -short | --long[=VALUE]*/
#define FX(IDFLAGS,SHORT,LONG,VALUE,BRIEF,PFLAGS) \
F6(IDFLAGS,2,LONG,VALUE,BRIEF,PFLAGS), \
F6(IDFLAGS,1,SHORT,VALUE,0,PFLAGS)
/** -short, --long on/off switches ...*/
#define F01(IDFLAGS,SHORT,LONG,BRIEF) \
{IDFLAGS+1, 2, LONG, 0, "Enable " BRIEF, 0, 0, 0}, \
{IDFLAGS+1, 1, SHORT, 0, "Enable " BRIEF, 0, 0, 0}, \
{IDFLAGS, 2, "no-"LONG, 0, "Disable " BRIEF, 0, 0, 0}, \
{IDFLAGS, 1, "no"SHORT, 0, "Disable " BRIEF, 0, 0, 0}
/** Start the next group (for --help grouping). */
#define GROUP(GID,DESC) {GID, 0, 0, 0, DESC, 0, 0, 0}
/***********************************************************************/
GROUP(SW_GROUP_0,0),
/**
Keep these arranged so that flags with short and long forms are
ordered consecutively, long one first. The help system uses that to
collapse the flags into a single listing. In such cases, the help
text from the first entry is used and the second is ignored.
*/
FX(SW_HELP, "?", "help", 0,
"Send help text to stdout and exit with code 0.", 0),
FCONTINUE("The -v flag can be used once or twice to get more info."),
FX(SW_VERBOSE,"v","verbose",0,
"Increases verbosity level by 1.", 0),
FX(SW_VERSION,"V","version",0,
"Show version info and exit with code 0. ", 0),
FCONTINUE("Use with -v for more details."),
FX(SW_ESCRIPT,"e","eval","SCRIPT",
"Evaluates the given script code in the global scope. "
"May be used multiple times.", CLIAPP_F_SPACE_VALUE),
FX(SW_INFILE,
"f","file","infile",
"Evaluates the given file. The first non-flag argument is used "
"by default.", CLIAPP_F_SPACE_VALUE | CLIAPP_F_ONCE),
FX(SW_OUTFILE, "o", "output", "outfile",
"Sets cwal's output channel to the given file. Default is stdout.",
CLIAPP_F_SPACE_VALUE | CLIAPP_F_ONCE),
/***********************************************************************/
GROUP(SW_GROUP_1, "Less-common options:"),
FX(SW_ASSERT_1,"A", "assert", 0, "Increase assertion trace level by one: "
"1=trace assert, 2=also trace affirm.",0),
FX(SW_INTERACTIVE,"i", "interactive", 0,
"Force-enter interactive mode after running -e/-f scripts.",0),
FX(SW_AUTOLOAD_0,"I","no-init-script", 0,
"Disables auto-loading of the init script.",0),
FCONTINUE("Init script name = same as this binary plus \".s2\" "),
FCONTINUE("or set via the S2SH_INIT_SCRIPT environment variable."),
/***********************************************************************/
GROUP(SW_GROUP_2, "Esoteric options:"),
FX(SW_METRICS, "m", "metrics", 0,
"Show various cwal/s2 metrics before shutdown.",0),
FCONTINUE("Use -v once or twice for more info."),
F01(SW_MOD_INIT_0, "mi", "module-init",
"automatic initialization of static modules."),
F6(SW_SHELL_API_1,2,"s2.shell",0,
"Forces installation of the s2.shell API unless trumped by --cleanroom.",0),
FCONTINUE("By default s2.shell is only installed in interactive mode."),
F01(SW_SCOPE_H0, "hash", "scope-hashes",
"hashes for scope property storage (else objects)."),
FX(SW_HIST_FILE_1,
"h", "history", "filename",
"Sets the interactive-mode edit history filename.",
CLIAPP_F_SPACE_VALUE | CLIAPP_F_ONCE),
F6(SW_HIST_FILE_0,2, "no-history", 0,
"Disables interactive-mode edit history.", 0),
F6(SW_HIST_FILE_0,1, "noh", 0, 0, 0),
F6(SW_DISABLE, 2, "s2-disable", "comma,list",
"Disables certain s2 API features by name.",0),
FCONTINUE("Use a comma-and/or-space-separated list with any of "
"the following entries:"),
FCONTINUE("fs-stat, fs-read, fs-write, fs-io, fs-all"),
F6(SW_CLEANROOM,2,"cleanroom",0,
"Only core language functionality with no prototype-level methods.",0),
FCONTINUE("Disables the s2/$2 global object and auto-loading of the "
"init script."),
FINFOLINE("Recycling-related options:"),
F01(SW_RE_V0,"rv", "recycle-values", "recycling of value instances."),
F01(SW_RE_C0,"rc","recycle-chunks", "the memory chunk recycler."),
F01(SW_RE_S0,"si","string-interning", "string interning."),
FINFOLINE("Memory-tracking/capping options:"),
FX(SW_MCAP_TOTAL_ALLOCS, "cap-ta", "memcap-total-allocs", "N",
"* Limit the (T)otal number of (A)llocations to N.",
CLIAPP_F_SPACE_VALUE),
FX(SW_MCAP_TOTAL_ALLOCS, "cap-tb", "memcap-total-bytes", "N",
"* Limit the (T)otal number of allocated (B)ytes to N.",
CLIAPP_F_SPACE_VALUE),
FX(SW_MCAP_TOTAL_ALLOCS, "cap-ca", "memcap-concurrent-allocs", "N",
"Limit the (C)oncurrent number of (A)llocations to N.",
CLIAPP_F_SPACE_VALUE),
FX(SW_MCAP_TOTAL_ALLOCS, "cap-cb", "memcap-concurrent-bytes", "N",
"Limit the (C)oncurrent number of allocated (B)ytes to N.",
CLIAPP_F_SPACE_VALUE),
FX(SW_MCAP_TOTAL_ALLOCS, "cap-sb", "memcap-single-alloc", "N",
"Limit the size of any (S)ingle allocation to N (B)ytes.",
CLIAPP_F_SPACE_VALUE),
FINFOLINE("The allocator starts failing (returning NULL) when a capping constraint is violated."),
FCONTINUE("The 'tb' and 'ta' constraint violations are permanent (recovery requires resetting the engine)."),
FCONTINUE("The 'ca' and 'cb' constraints are recoverable once some cwal-managed memory gets freed."),
FCONTINUE("Capping only applies to memory allocated by/via the scripting\n"
"engine, not 3rd-party APIs."),
F6(SW_MEM_FAST1,2,"fast",0,"(F)orce (A)lloc (S)ize (T)racking.",0),
FCONTINUE("Enables more precise tracking and reuse of recycled memory."),
FCONTINUE("Several memcap options enable --fast implicitly."),
#undef GROUP
#undef F01
#undef F6
#undef FX
#undef FPLUS
#undef FPLUSX
#undef FINFOLINE
CliAppSwitch_sentinel /* MUST be the last entry in the list */
};
return cliAppSwitches;
}