-
-
Notifications
You must be signed in to change notification settings - Fork 44
Binding Program Arguments
Purpose: puts program arguments into configuration object. May print help if statically linked.
Location: in the standard driver.
Returns: Returns 0 if arguments successfully passed. Returns 1 on error.
Errors: For dynamic linkage, there must be at least two arguments,
the executable program name of the driver, usually either flx_run
or flx_arun
, followed by the
name of the library module to run. If the library name is missing,
usage help printed to standard output before exiting.
For static linkage, at least the executable name should be present.
If the --debug
switch is used, at least one more argument is required.
Static and dynamic linked programs have arguments
in different slots of argv because the mainline for
dynamic linkage is actually flx_run
executable whereas
for static linkage this is the executable.
So dynamic linked programs have an extra argument which has to be skipped for compatibility of static and dynamic linkage.
This function is the default argument processor passed to
the flx_config
object constructor. For custom embeddings,
the user can create a function with the same type and
pass that to the constructor instead.
@tangle flx_run.include
int get_flx_args_config(int argc, char **argv, flx_config *c) {
#ifndef FLX_BUILD_FOR_STATIC_LINK
c->static_link = false;
if (argc<2)
{
printf("usage: flx_run [--debug] dll_filename options ..\n");
printf(" environment variables (numbers can be decimals):\n");
printf(" FLX_DEBUG # enable debugging traces (default off)\n");
printf(" FLX_DEBUG_ALLOCATIONS # enable debugging allocator (default FLX_DEBUG)\n");
printf(" FLX_DEBUG_COLLECTIONS # enable debugging collector (default FLX_DEBUG)\n");
printf(" FLX_REPORT_COLLECTIONS # report collections (default FLX_DEBUG)\n");
printf(" FLX_DEBUG_THREADS # enable debugging collector (default FLX_DEBUG)\n");
printf(" FLX_DEBUG_DRIVER # enable debugging driver (default FLX_DEBUG)\n");
printf(" FLX_FINALISE # whether to cleanup on termination (default NO)\n");
printf(" FLX_GC_FREQ=n # how often to call garbage collector (default 1000)\n");
printf(" FLX_MIN_MEM=n # initial memory pool n Meg (default 10)\n");
printf(" FLX_MAX_MEM=n # maximum memory n Meg (default -1 = infinite)\n");
printf(" FLX_FREE_FACTOR=n.m # reset FLX_MIN_MEM to actual usage by n.m after gc (default 1.1) \n");
printf(" FLX_ALLOW_COLLECTION_ANYWHERE # (default yes)\n");
return 1;
}
c->filename = argv[1];
c->flx_argv = argv+1;
c->flx_argc = argc-1;
c->debug = (argc > 1) && (strcmp(argv[1], "--debug")==0);
if (c->debug)
{
if (argc < 3)
{
printf("usage: flx_run [--debug] dll_filename options ..\n");
return 1;
}
c->filename = argv[2];
--c->flx_argc;
++c->flx_argv;
}
#else
c->static_link = true;
c->filename = argv[0];
c->flx_argv = argv;
c->flx_argc = argc;
c->debug = false;
// printf("Statically linked Felix program running\n");
#endif
return 0;
}