Go to the documentation of this file.
14 #define XML_INDENT_STRING " "
16 static char *clo_versionString =
NULL;
17 static char *clo_helpString =
NULL;
18 static int clo_ignoreKeyCase = 1;
19 static int clo_enableDumpOptions = 1;
21 static char **selectOptionKeys =
NULL;
24 static int clo_enableExtraOptions = 0;
27 static int clo_enablePositionOptions = 0;
30 static int clo_enableParOption = 1;
73 if (*
count >= *storageSize) {
75 void **oldArray = *array;
77 *array = (
void**) malloc(
sizeof (
void*) * (*storageSize));
81 (*array)[
i] = oldArray[
i];
84 for (;
i < *storageSize;
i++)
87 (*array)[*
count] = ptr;
109 const char* envStart;
120 if (*inPtr ==
'(' || *inPtr ==
'{')
128 if (*inPtr ==
')' || *inPtr ==
'}')
133 envVal = getenv(envStr);
136 memcpy(outPtr, envVal,
i);
139 i = inPtr - envStart;
140 memcpy(outPtr, envStart,
i);
165 dataTypeStr =
"boolean";
171 dataTypeStr =
"int64";
174 dataTypeStr =
"float";
177 dataTypeStr =
"double";
180 dataTypeStr =
"string";
183 dataTypeStr =
"ifile";
186 dataTypeStr =
"ofile";
189 dataTypeStr =
"helpString";
192 dataTypeStr =
"position";
195 dataTypeStr =
"unknownType";
214 for (
i = 0;
i < option->
count;
i++) {
259 if (option->
count == 0) {
270 data = (
int*) malloc(
sizeof (
int) * option->
count);
272 for (
i = 0;
i < option->
count;
i++) {
277 *ptr = tolower(*ptr);
280 if (strcmp(
str,
"0") == 0 || strcmp(
str,
"f") == 0
281 || strcmp(
str,
"false") == 0 || strcmp(
str,
"n") == 0
282 || strcmp(
str,
"no") == 0 || strcmp(
str,
"off") == 0) {
284 }
else if (strcmp(
str,
"1") == 0 || strcmp(
str,
"t") == 0
285 || strcmp(
str,
"true") == 0 || strcmp(
str,
"y") == 0
286 || strcmp(
str,
"yes") == 0 || strcmp(
str,
"on") == 0) {
290 "-E- clo_parseOption: Invalid boolean value=%s for option key=%s\n",
302 int *
data = (
int*) malloc(
sizeof (
int) * option->
count);
304 for (
i = 0;
i < option->
count;
i++) {
310 "-E- clo_parseOption: Invalid integer value=%s for option key=%s\n",
321 int64_t *
data = (int64_t*) malloc(
sizeof (int64_t) * option->
count);
323 for (
i = 0;
i < option->
count;
i++) {
329 "-E- clo_parseOption: Invalid integer value=%s for option key=%s\n",
340 float *
data = (
float*) malloc(
sizeof (
float) * option->
count);
342 for (
i = 0;
i < option->
count;
i++) {
348 "-E- clo_parseOption: Invalid float value=%s for option key=%s\n",
359 double *
data = (
double*) malloc(
sizeof (
double) * option->
count);
361 for (
i = 0;
i < option->
count;
i++) {
367 "-E- clo_parseOption: Invalid double value=%s for option key=%s\n",
391 clo_ignoreKeyCase = 1;
393 clo_ignoreKeyCase = 0;
402 return clo_ignoreKeyCase;
411 clo_enableDumpOptions =
val;
420 return clo_enableDumpOptions;
430 clo_enableExtraOptions =
val;
440 return clo_enableExtraOptions;
449 if (clo_versionString)
450 free(clo_versionString);
454 clo_versionString =
NULL;
465 int size = 30 + strlen(programName) + strlen(versionStr);
466 char*
str = (
char*) malloc(
size);
467 sprintf(
str,
"%s %s (%s %s)", programName, versionStr, __DATE__, __TIME__);
468 if (clo_versionString)
469 free(clo_versionString);
470 clo_versionString =
str;
479 return clo_versionString;
489 free(clo_helpString);
493 clo_helpString =
NULL;
502 return clo_helpString;
515 selectOptionKeys = keys;
524 return selectOptionKeys;
537 list->storageSize = 0;
538 list->numOptions = 0;
541 list->positionStorageSize = 0;
542 list->positionNumOptions = 0;
546 "print usage information");
552 "print the version\n information");
557 "print\n information about each option");
560 NULL,
"print\n information about each option to paramfile");
563 "print\n information about each option to XML file");
565 if(clo_enableParOption) {
567 "input parameter file");
586 const char *defaultVal,
const char *desc) {
653 "-E- clo_addAlias: key=%s does not exist.\n",
key);
671 &(
list->numOptions), (
void*) option);
694 "-E- clo_addOption: option with key=%s already exists.\n",
key);
715 &(
list->positionNumOptions), (
void*) option);
728 for (
i = 0;
i <
list->positionNumOptions;
i++) {
729 if (
list->positionOptions[
i])
732 list->positionNumOptions = 0;
748 "-E- clo_copyOption: can not copy an option with a NULL key\n");
771 opt->
cb = option->
cb;
805 for (
i = 0;
i <
list->numOptions;
i++) {
809 for (
i = 0;
i <
list->positionNumOptions;
i++) {
812 &(
list->positionNumOptions), (
void*) option);
848 for (
i = 0;
i < option->
count;
i++) {
879 for (
i = 0;
i <
list->numOptions;
i++) {
880 if (
list->options[
i])
885 list->numOptions = 0;
888 if (
list->positionOptions) {
889 for (
i = 0;
i <
list->positionNumOptions;
i++) {
890 if (
list->positionOptions[
i])
893 free(
list->positionOptions);
895 list->positionNumOptions = 0;
910 if (i < 0 || i >=
list->numOptions)
912 return list->options[
i];
928 int length = strlen(
str);
980 while (i < list->numOptions) {
981 option =
list->options[
i];
982 if (clo_ignoreKeyCase) {
983 if (strcasecmp(option->
key, keyStr) == 0) {
988 if (strcasecmp(option->
aliases[
j], keyStr) == 0) {
993 if (strcmp(option->
key, keyStr) == 0) {
998 if (strcmp(option->
aliases[
j], keyStr) == 0) {
1019 return list->numOptions;
1038 fprintf(
stderr,
"-E- clo_getOptionRawString: option=%s needs to be set\n",
1056 "-E- clo_getOptionString: option=%s is not a string option\n",
1060 if (option->
count == 0) {
1065 "-E- clo_getOptionString: option=%s needs to be set\n",
1071 if (option->
count != 1) {
1073 "-E- clo_getOptionString: option=%s needs to be set with only one value\n",
1090 "-E- clo_getOptionBool: option=%s is not a boolean option\n",
1094 if (option->
count <= 0) {
1097 if (option->
count != 1) {
1099 "-E- clo_getOptionBool: option=%s count needs to be 1\n",
1103 return ((
int*) (option->
valArray))[0];
1116 "-E- clo_getOptionInt: option=%s is not an integer option\n",
1120 if (option->
count <= 0) {
1121 fprintf(
stderr,
"-E- clo_getOptionInt: option=%s needs to be set\n",
1125 if (option->
count != 1) {
1126 fprintf(
stderr,
"-E- clo_getOptionInt: option=%s count needs to be 1\n",
1130 return ((
int*) (option->
valArray))[0];
1143 "-E- clo_getOptionInt64: option=%s is not a 64 bit integer option\n",
1147 if (option->
count <= 0) {
1148 fprintf(
stderr,
"-E- clo_getOptionInt64: option=%s needs to be set\n",
1152 if (option->
count != 1) {
1153 fprintf(
stderr,
"-E- clo_getOptionInt: option=%s count needs to be 1\n",
1157 return ((int64_t*) (option->
valArray))[0];
1170 "-E- clo_getOptionFloat: option=%s is not a float option\n",
1174 if (option->
count <= 0) {
1175 fprintf(
stderr,
"-E- clo_getOptionFloat: option=%s needs to be set\n",
1179 if (option->
count != 1) {
1181 "-E- clo_getOptionFloat: option=%s count needs to be 1\n",
1185 return ((
float*) (option->
valArray))[0];
1198 "-E- clo_getOptionDouble: option=%s is not a double option\n",
1202 if (option->
count <= 0) {
1203 fprintf(
stderr,
"-E- clo_getOptionDouble: option=%s needs to be set\n",
1207 if (option->
count != 1) {
1209 "-E- clo_getOptionDouble: option=%s count needs to be 1\n",
1213 return ((
double*) (option->
valArray))[0];
1232 "-E- clo_getOptionStrings: option=%s is not a string option\n",
1254 "-E- clo_getOptionBools: option=%s is not a boolean option\n",
1276 "-E- clo_getOptionInts: option=%s is not an integer option\n",
1298 "-E- clo_getOptionFloats: option=%s is not a float option\n",
1320 "-E- clo_getOptionDoubles: option=%s is not a double option\n",
1341 if (option ==
NULL) {
1342 fprintf(
stderr,
"-E- clo_getRawString: option=%s not found\n",
key);
1359 if (option ==
NULL) {
1360 fprintf(
stderr,
"-E- clo_getString: option=%s not found\n",
key);
1377 if (option ==
NULL) {
1378 fprintf(
stderr,
"-E- clo_getBool: option=%s not found\n",
key);
1395 if (option ==
NULL) {
1396 fprintf(
stderr,
"-E- clo_getInt: option=%s not found\n",
key);
1413 if (option ==
NULL) {
1414 fprintf(
stderr,
"-E- clo_getInt: option=%s not found\n",
key);
1431 if (option ==
NULL) {
1432 fprintf(
stderr,
"-E- clo_getFloat: option=%s not found\n",
key);
1449 if (option ==
NULL) {
1450 fprintf(
stderr,
"-E- clo_getDouble: option=%s not found\n",
key);
1472 if (option ==
NULL) {
1473 fprintf(
stderr,
"-E- clo_getStrings: option=%s not found\n",
key);
1495 if (option ==
NULL) {
1496 fprintf(
stderr,
"-E- clo_getBools: option=%s not found\n",
key);
1518 if (option ==
NULL) {
1519 fprintf(
stderr,
"-E- clo_getInts: option=%s not found\n",
key);
1541 if (option ==
NULL) {
1542 fprintf(
stderr,
"-E- clo_getFloats: option=%s not found\n",
key);
1564 if (option ==
NULL) {
1565 fprintf(
stderr,
"-E- clo_getDoubles: option=%s not found\n",
key);
1580 const char *source) {
1588 deleteAfter = option->
valStr;
1593 for (
i = 0;
i < option->
count;
i++) {
1612 "-E- clo_setOptionString: No value given for option key=%s\n",
1621 i = strlen(ptr) - 1;
1637 deleteAfter = option->
source;
1652 (option->
cb)(option);
1668 const char *
val,
const char *source) {
1673 if (option ==
NULL) {
1674 fprintf(
stderr,
"-E- clo_setString: option=%s not found\n",
key);
1686 clo_enablePositionOptions =
val;
1696 return clo_enablePositionOptions;
1706 return list->positionNumOptions;
1718 if (i < 0 || i >=
list->positionNumOptions)
1720 return list->positionOptions[
i];
1725 if (option ==
NULL) {
1726 fprintf(
stderr,
"-E- clo_getPositionString: option %d not found on command line\n",
pos);
1739 clo_enableParOption =
val;
1748 return clo_enableParOption;
1760 if (option->
count > 1)
1766 int* vals = (
int*) option->
valArray;
1768 printf(
"<noValue>");
1774 for (
i = 1;
i < option->
count;
i++) {
1785 int* vals = (
int*) option->
valArray;
1787 printf(
"<noValue>");
1789 printf(
"%d", vals[0]);
1790 for (
i = 1;
i < option->
count;
i++)
1791 printf(
",%d", vals[
i]);
1797 float* vals = (
float*) option->
valArray;
1799 printf(
"<noValue>");
1801 printf(
"%f", vals[0]);
1802 for (
i = 1;
i < option->
count;
i++)
1803 printf(
",%f", vals[
i]);
1809 double* vals = (
double*) option->
valArray;
1811 printf(
"<noValue>");
1813 printf(
"%f", vals[0]);
1814 for (
i = 1;
i < option->
count;
i++)
1815 printf(
",%f", vals[
i]);
1822 if (option->
count <= 0)
1823 printf(
"<noValue>");
1826 for (
i = 1;
i < option->
count;
i++)
1833 printf(
"unknown type");
1837 if (option->
count > 1)
1848 for (
i = 0;
i <
list->numOptions;
i++) {
1851 if (
list->options[
i]->valStr) {
1852 printf(
"%s=",
list->options[
i]->key);
1872 printf(
" %s", option->
desc);
1878 printf(
" %s (%s)", option->
key, dataTypeStr);
1880 printf(
" (alias=%s", option->
aliases[0]);
1888 printf(
" = %s", option->
desc);
1907 printf(
" %s (%s)", option->
key, dataTypeStr);
1909 printf(
" (alias=%s", option->
aliases[0]);
1918 printf(
" (current=");
1923 printf(
" (source=%s)", option->
source);
1937 if (selectOptionKeys) {
1939 key = selectOptionKeys[
i];
1949 "clo_printOptions - Could not find option \"%s\" in option list.\n",
1953 key = selectOptionKeys[
i];
1956 for (
i = 0;
i <
list->numOptions;
i++) {
1957 if (
list->options[
i]->desc) {
1969 if (clo_versionString)
1970 printf(
"%s\n", clo_versionString);
1972 printf(
"Version String not set.\n");
1980 printf(
"%s\n", clo_helpString);
2004 for (
i = 0;
i <
list->numOptions;
i++) {
2028 char* equalPtr = strchr(newStr,
'=');
2032 valStr = equalPtr + 1;
2035 if (newStr[0] ==
'-')
2052 if (option ==
NULL) {
2054 if (clo_enableExtraOptions) {
2056 NULL,
"UNDEFINED_OPTION");
2058 fprintf(
stderr,
"-E- clo_readString: unknown option \"%s\" from %s\n",
2063 if (strcmp(source,
"command line") == 0) {
2064 if (clo_enablePositionOptions) {
2069 fprintf(
stderr,
"-E- clo_readString: unknown option \"%s\" from %s\n",
2074 if (clo_enableExtraOptions) {
2076 NULL,
"UNDEFINED_OPTION");
2078 fprintf(
stderr,
"-E- clo_readString: unknown option \"%s\" from %s\n",
2129 option->
cb_flag = enableFileDescending;
2130 for (
i = 1;
i < argc;
i++) {
2135 if (clo_enableDumpOptions) {
2145 printf(
"writing options param file to %s\n",
2153 printf(
"writing options XML file to %s\n",
2184 str = (
char*) malloc(
2185 strlen(option->
key) + strlen(option->
valStr) + 5);
2193 for (
i = 0;
i <
list->positionNumOptions;
i++) {
2196 list->positionNumOptions = 0;
2201 &(
list->positionNumOptions), option);
2225 sourceStr =
strdup(fileName);
2227 if ((fp = fopen(fileName,
"r")) ==
NULL) {
2228 fprintf(
stderr,
"-E- clo_readFile: Can't open parameter file - %s\n",
2233 while ((fgets(
line, 2046, fp)) !=
NULL) {
2240 if (*ptr ==
'#' || *ptr ==
';' || *ptr ==
'\0')
2300 "clo_writeParameterFile - Could not open \"%s\" for writing.\n",
2305 if (selectOptionKeys) {
2307 key = selectOptionKeys[
i];
2312 && strcmp(option->
key,
"dump_options_paramfile")
2313 && strcmp(option->
key,
"par")) {
2314 fprintf(fout,
"%s = %s\n", option->
key, option->
valStr);
2318 "clo_writeParameterFile - Could not find option \"%s\" in option list.\n",
2322 key = selectOptionKeys[
i];
2325 for (
i = 0;
i <
list->numOptions;
i++) {
2326 option =
list->options[
i];
2328 && strcmp(option->
key,
"dump_options_paramfile")
2329 && strcmp(option->
key,
"par")) {
2330 fprintf(fout,
"%s = %s\n", option->
key, option->
valStr);
2368 free(clo_programMetadataList.
entries);
2385 fprintf(fout,
"<%s>\n", tag);
2399 fprintf(fout,
"</%s>\n", tag);
2415 fprintf(fout,
"<%s/>\n", tag);
2416 }
else if (strpbrk(
value,
"<>&"))
2417 fprintf(fout,
"<%s><![CDATA[%s]]></%s>\n", tag,
value, tag);
2419 fprintf(fout,
"<%s>%s</%s>\n", tag,
value, tag);
2430 static void writeXmlValidValue(FILE *fout,
int level,
const char *
value,
2445 static void writeXmlDescription(FILE *fout,
int level,
const char *
str) {
2450 char *saveLine, *saveVal;
2458 buff2 = (
char*) malloc(
i + 2);
2460 line2 = (
char*) malloc(
i + 1);
2462 val2 = (
char*) malloc(
i + 1);
2464 desc2 = (
char*) malloc(
i + 1);
2468 line = strtok_r(buff,
"\n", &saveLine);
2472 val = strtok_r(
line,
":", &saveVal);
2473 desc = strtok_r(
NULL,
":", &saveVal);
2479 if (strpbrk(
val,
" \t\r\n") ==
NULL) {
2485 writeXmlValidValue(fout,
level + 1, val2, desc2);
2498 strcat(desc2, line2);
2502 strcat(buff2, line2);
2505 line = strtok_r(
NULL,
"\n", &saveLine);
2509 writeXmlValidValue(fout,
level + 1, val2, desc2);
2529 static void writeXmlOption(FILE *fout,
clo_option_t* option) {
2533 fprintf(fout,
" <option type=\"%s\">\n",
2553 writeXmlDescription(fout, 3, option->
desc);
2581 "clo_writeXmlFile - Could not open \"%s\" for writing.\n",
2586 fprintf(fout,
"<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n");
2588 "<paramInfo xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n");
2590 " xsi:noNamespaceSchemaLocation=\"http://seadas.gsfc.nasa.gov/software/schemas/ParamInfo-1.0.xsd\">\n");
2601 if (selectOptionKeys) {
2603 key = selectOptionKeys[
i];
2607 writeXmlOption(fout, option);
2610 "clo_writeXmlFile - Could not find option \"%s\" in option list.\n",
2614 key = selectOptionKeys[
i];
2617 for (
i = 0;
i <
list->numOptions;
i++) {
2618 option =
list->options[
i];
2619 writeXmlOption(fout, option);
2624 for (
i = 0;
i <
list->positionNumOptions;
i++) {
2625 option =
list->positionOptions[
i];
2626 writeXmlOption(fout, option);
void clo_addToArray(void ***array, int *storageSize, int *count, void *ptr)
#define XML_INDENT_STRING
void clo_writeXmlEndTag(FILE *fout, int level, const char *tag)
clo_option_t * clo_addOption(clo_optionList_t *list, const char *key, enum clo_dataType_t dataType, const char *defaultVal, const char *desc)
float clo_getOptionFloat(clo_option_t *option)
char * clo_getString(clo_optionList_t *list, const char *key)
void clo_readArgs(clo_optionList_t *list, int argc, char *argv[])
list(APPEND LIBS ${PGSTK_LIBRARIES}) add_executable(atteph_info_modis atteph_info_modis.c) target_link_libraries(atteph_info_modis $
double clo_getOptionDouble(clo_option_t *option)
double * clo_getOptionDoubles(clo_option_t *option, int *count)
void clo_setEnablePositionOptions(int val)
a context in which it is NOT documented to do so subscript which cannot be easily calculated when extracting TONS attitude data from the Terra L0 files Corrected several defects in extraction of entrained ephemeris and and as HDF file for both the L1A and Geolocation enabling retrieval of South Polar DEM data Resolved Bug by changing to opent the geolocation file only after a successful read of the L1A metadata
clo_option_t * clo_getPositionOption(clo_optionList_t *list, int i)
void clo_readOptions(clo_optionList_t *list, clo_optionList_t *readList)
char * clo_envExpandString(const char *str)
void clo_addAlias(clo_optionList_t *list, const char *key, const char *alias)
void clo_writeXmlStartTag(FILE *fout, int level, const char *tag)
char ** clo_getOptionStrings(clo_option_t *option, int *count)
void trimBlanks(char *str)
char * clo_getOptionRawString(clo_option_t *option)
int clo_isSet(clo_optionList_t *list, const char *key)
clo_option_t * clo_findOption(clo_optionList_t *list, const char *key)
int clo_getOptionInt(clo_option_t *option)
void clo_readString(clo_optionList_t *list, const char *str, const char *source)
void clo_helpOptionCb(struct clo_option_t *option)
clo_optionList_t * clo_copyList(clo_optionList_t *list)
int clo_setString(clo_optionList_t *list, const char *key, const char *val, const char *source)
void clo_writeXmlTag(FILE *fout, int level, const char *tag, const char *value)
int clo_writeParameterFile(clo_optionList_t *list, const char *filename)
int clo_getInt(clo_optionList_t *list, const char *key)
char ** clo_getSelectOptionKeys()
#define CLO_ARRAY_DELIMITER
int clo_isOptionSet(clo_option_t *option)
void clo_setVersion2(const char *programName, const char *versionStr)
int clo_writeXmlFile(clo_optionList_t *list, const char *filename)
int * clo_getInts(clo_optionList_t *list, const char *key, int *count)
void clo_setSelectOptionKeys(char **keys)
void clo_clearXmlProgramMetadata()
void clo_versionOptionCb(struct clo_option_t *option)
void clo_clearPositionOptions(clo_optionList_t *list)
void clo_printOption(clo_option_t *option)
int64_t clo_getOptionInt64(clo_option_t *option)
clo_option_t * clo_copyOption(clo_option_t *option)
int clo_getIgnoreKeyCase()
int clo_getEnablePositionOptions()
void clo_setEnableDumpOptions(int val)
clo_optionList_t * clo_createList()
void clo_printVals(clo_optionList_t *list)
int clo_setOptionString(clo_option_t *option, const char *val, const char *source)
void clo_addXmlProgramMetadata(const char *tag, const char *value)
int clo_getEnableDumpOptions()
void clo_setHelpStr(const char *str)
char * strdup(const char *)
float clo_getFloat(clo_optionList_t *list, const char *key)
char * clo_getOptionString(clo_option_t *option)
void clo_readArgsPar(clo_optionList_t *list, int argc, char *argv[], int enableFileDescending)
void clo_parseOption(clo_option_t *option)
float * clo_getOptionFloats(clo_option_t *option, int *count)
char * clo_getPositionString(clo_optionList_t *list, int pos)
int * clo_getOptionInts(clo_option_t *option, int *count)
void clo_printUsage(clo_optionList_t *list)
int clo_getEnableParOption()
void clo_parOptionCb(clo_option_t *option)
float * clo_getFloats(clo_optionList_t *list, const char *key, int *count)
char * clo_trimDashesDup(const char *str)
char filename[FILENAME_MAX]
int * clo_getOptionBools(clo_option_t *option, int *count)
clo_option_t * clo_getOption(clo_optionList_t *list, int i)
void clo_addOptionAlias(clo_option_t *option, const char *alias)
void clo_readFile(clo_optionList_t *list, const char *fileName)
no change in intended resolving MODur00064 Corrected handling of bad ephemeris attitude data
int clo_getNumOptions(clo_optionList_t *list)
void clo_dumpOptions(clo_optionList_t *list)
void clo_setEnableExtraOptions(int val)
void clo_setVersion(const char *str)
void clo_setEnableParOption(int val)
void clo_printOptions(clo_optionList_t *list)
int64_t clo_getInt64(clo_optionList_t *list, const char *key)
clo_option_t * clo_addPositionOption(clo_optionList_t *list)
void clo_setIgnoreKeyCase(int val)
double clo_getDouble(clo_optionList_t *list, const char *key)
void clo_parseOptionString(clo_option_t *option)
char * clo_dataTypeToString(enum clo_dataType_t dataType)
int * clo_getBools(clo_optionList_t *list, const char *key, int *count)
void clo_printOptionVal(clo_option_t *option)
double * clo_getDoubles(clo_optionList_t *list, const char *key, int *count)
void clo_deleteList(clo_optionList_t *list)
void clo_dumpOption(clo_option_t *option)
int clo_getPositionNumOptions(clo_optionList_t *list)
void clo_deleteOption(clo_option_t *option)
char * clo_getRawString(clo_optionList_t *list, const char *key)
char * trimBlanksDup(const char *str)
int clo_getBool(clo_optionList_t *list, const char *key)
int clo_getEnableExtraOptions()
clo_option_t * clo_createOption(const char *key, enum clo_dataType_t dataType, const char *defaultVal, const char *desc)
char ** clo_getStrings(clo_optionList_t *list, const char *key, int *count)
enum clo_dataType_t dataType
clo_option_t ** positionOptions
How many dimensions is the output array Default is Not sure if anything above will work correctly strcpy(l2prod->title, "no title yet")
void clo_trimDashes(char *str)
void clo_printHelpString()
int clo_getOptionBool(clo_option_t *option)
void clo_insertOption(clo_optionList_t *list, clo_option_t *option)