The Stovepipe Library

Stovepipe can be used to "stovepipe" the command line user argument list into an a large and complicated piece of code. In Ccaffeine it is used to convey the argument list to a component that the Ccaffeine developers would not want to make a permanent part of Ccaffeine. It can be abused and there is a potential for name pollution and obfuscation, but it is meant to forstall worse alternatives. It comes in two flavors: one that uses the Standard Template Library in C++ (though the api is pure C), and another that uses glib, the popular utility library for gnu software. It will default to glib unless you force STL by using the --with-stl switch to configure.

Here are the functions in libstp:

void stp_init(int argc, char** argv)

Initialize stovepipe with command line arguments.

const char* stp_get(const char* argName)

Return the value keyed to the commandline argument name.

const char* stp_getn(const char* namespce, const char* argName)

By convention, namespaces for arguments are designated with a selected prefix in front of the argument name separated by a dash. For example: myprog --myNamespace-myArgName argValue. stp_getn is a convenience function that enforces that convention. This call is equivalent to stp_get(strcat(strcat(namespace, "-"),argName)).

Examples

A tutorial/test program is included with the distribution. The file "TestStovepipe.c contains a simple example of Stovepipe usage:

int main(int argc, char** argv) {
  stp_init(argc, argv);
  fprintf(stdout, "--hello arg value = \"%s\", "
"--hello-world arg value = \"%s\"\n",
stp_get("hello"), stp_get("hello-world"));
fprintf(stdout, "namespace:hello,argName:world arg value =  \"%s\"\n", 
stp_getn("hello", "world"));
exit(0);
}

Typing "make test" should yield something like this:

$ c++ -o testStovepipe testStovepipe.o libstovepipe.a 

Stovepipe picks up only args with a leading "--". Namespaces are separated by a single - no white space. "--" by itself indicates the end of options for Stovepipe:

$ testStovepipe --hello world -too-few-dashes --hello-world hello 
-- -hello- --hello-world notHello
--hello arg value = "world", --hello-world arg value = "hello"
namespace:hello,argName:world arg value =  "hello"

The same argument used twice gets overwritten, options that do not appear in the command line but are requested return a C string ptr NULL:

$ testStovepipe --hello-world notHello --hello-world hello 
--hello arg value = "(null)", --hello-world arg value = "hello"
namespace:hello,argName:world arg value =  "hello"

Argument values must not begin with a "-" or they will be ignored or considered to be further options, options that appear in the command line but have no associated value return an empty string:

$ testStovepipe --hello --world --hello-world -hello 
--hello arg value = "", --hello-world arg value = ""
namespace:hello,argName:world arg value =  ""