From: <kin...@us...> - 2013-09-03 03:53:42
|
Revision: 6085 http://sourceforge.net/p/teem/code/6085 Author: kindlmann Date: 2013-09-03 03:53:38 +0000 (Tue, 03 Sep 2013) Log Message: ----------- two small changes that facilitate some long-wanted functionality: 1) in the hestOpt struct there is now a new source field to indicate how it was that that option got its information. The values come from the new hestSource* enum (e.g. hestSourceDefault vs hestSourceUser). 2) hestOptAdd returns the index of the just-added option in the opt array; to facilitate accessing it and its source field later. Now, its easy to see which options were actually satisfied by explicit info from the user, vs being filled with default info Modified Paths: -------------- teem/trunk/src/hest/hest.h teem/trunk/src/hest/methodsHest.c teem/trunk/src/hest/parseHest.c teem/trunk/src/hest/test/ex5.c Modified: teem/trunk/src/hest/hest.h =================================================================== --- teem/trunk/src/hest/hest.h 2013-09-02 08:30:20 UTC (rev 6084) +++ teem/trunk/src/hest/hest.h 2013-09-03 03:53:38 UTC (rev 6085) @@ -46,6 +46,21 @@ #endif /* +******** hestSource* enum +** +** records whether the info to satisfy a particular option came +** from the default or from the user (command-line or response file). +** Distinguishing command-line from response file would take a +** much more significant code restructuring +*/ +enum { + hestSourceUnknown, /* 0 */ + hestSourceDefault, /* 1 */ + hestSourceUser, /* 2 */ + hestSourceLast +}; + +/* ******** hestCB struct ** ** for when the thing you want to parse from the command-line is not a @@ -120,6 +135,12 @@ of a fixed-length array of strings 3: free((*valueP)[i]) and free(*valueP), because it is a dynamically allocated array of strings */ + + /* --------------------- Output */ + + int source; /* from the hestSource* enum; from whence was this + information set, else hestSourceUnknown if not */ + } hestOpt; /* @@ -197,11 +218,14 @@ HEST_EXPORT const int hestPresent; HEST_EXPORT hestParm *hestParmNew(void); HEST_EXPORT hestParm *hestParmFree(hestParm *parm); -HEST_EXPORT void hestOptAdd(hestOpt **optP, - const char *flag, const char *name, - int type, int min, int max, - void *valueP, const char *dflt, const char *info, - ... /* int *sawP, airEnum *enm , hestCB *CB */); +HEST_EXPORT unsigned int hestOptAdd(hestOpt **optP, + const char *flag, const char *name, + int type, int min, int max, + void *valueP, const char *dflt, + const char *info, + ... /* int *sawP, + airEnum *enm, + hestCB *CB */); HEST_EXPORT hestOpt *hestOptFree(hestOpt *opt); HEST_EXPORT int hestOptCheck(hestOpt *opt, char **errP); Modified: teem/trunk/src/hest/methodsHest.c =================================================================== --- teem/trunk/src/hest/methodsHest.c 2013-09-02 08:30:20 UTC (rev 6084) +++ teem/trunk/src/hest/methodsHest.c 2013-09-03 03:53:38 UTC (rev 6085) @@ -77,6 +77,7 @@ opt->CB = NULL; opt->sawP = NULL; opt->kind = opt->alloc = 0; + opt->source = hestSourceUnknown; } /* @@ -93,7 +94,11 @@ } */ -void +/* +** as of Sept 2013 this returns information: the index of the +** option just added. Returns UINT_MAX in case of error. +*/ +unsigned int hestOptAdd(hestOpt **optP, const char *flag, const char *name, int type, int min, int max, @@ -102,16 +107,18 @@ int num; va_list ap; void *dummy = NULL; + unsigned int retIdx; if (!optP) - return; + return UINT_MAX; num = *optP ? _hestNumOpts(*optP) : 0; if (!( ret = AIR_CALLOC(num+2, hestOpt) )) { - return; + return UINT_MAX; } if (num) memcpy(ret, *optP, num*sizeof(hestOpt)); + retIdx = AIR_UINT(num); ret[num].flag = airStrdup(flag); ret[num].name = airStrdup(name); ret[num].type = type; @@ -124,6 +131,8 @@ ret[num].sawP = NULL; ret[num].enm = NULL; ret[num].CB = NULL; + /* seems to be redundant with above _hestOptInit() */ + ret[num].source = hestSourceUnknown; /* deal with var args */ if (5 == _hestKind(&(ret[num]))) { va_start(ap, info); @@ -149,7 +158,7 @@ free(*optP); *optP = ret; AIR_UNUSED(dummy); - return; + return retIdx; } void Modified: teem/trunk/src/hest/parseHest.c =================================================================== --- teem/trunk/src/hest/parseHest.c 2013-09-02 08:30:20 UTC (rev 6084) +++ teem/trunk/src/hest/parseHest.c 2013-09-03 03:53:38 UTC (rev 6085) @@ -733,6 +733,7 @@ numOpts = _hestNumOpts(opt); for (op=0; op<numOpts; op++) { _hestIdent(ident, opt+op, parm, AIR_TRUE); + opt[op].source = udflt[op] ? hestSourceDefault : hestSourceUser; type = opt[op].type; size = (airTypeEnum == type ? (int)sizeof(int) /* HEY scrutinize casts */ Modified: teem/trunk/src/hest/test/ex5.c =================================================================== --- teem/trunk/src/hest/test/ex5.c 2013-09-02 08:30:20 UTC (rev 6084) +++ teem/trunk/src/hest/test/ex5.c 2013-09-03 03:53:38 UTC (rev 6085) @@ -50,17 +50,21 @@ int howMany, i, N; hestOpt *opt = NULL; char *err = NULL; + unsigned int copi, opi, opn; hestOptAdd(&opt, "A", "token", airTypeOther, 1, 1, &single, "alpha", "testing A", NULL, NULL, &cbinfo); hestOptAdd(&opt, "B", "tok1 tok2 tok3", airTypeOther, 3, 3, triple, "beta psi rho", "testing B", NULL, NULL, &cbinfo); - hestOptAdd(&opt, "C", "mtok", airTypeOther, 0, 1, &maybe, - "gamma", "testing C", NULL, NULL, &cbinfo); + copi = + hestOptAdd(&opt,"C", "mtok", airTypeOther, 0, 1, &maybe, + "gamma", "testing C", NULL, NULL, &cbinfo); hestOptAdd(&opt, "D", "tok", airTypeOther, 1, -1, &many, "kappa omega", "testing D", &howMany, NULL, &cbinfo); - hestOptAdd(&opt, "int", "N", airTypeInt, 1, 1, &N, - NULL, "an integer"); + opn = + hestOptAdd(&opt, "int", "N", airTypeInt, 1, 1, &N, + NULL, "an integer"); + opn++; if (hestParse(opt, argc-1, argv+1, &err, NULL)) { fprintf(stderr, "ERROR: %s\n", err); free(err); @@ -78,6 +82,11 @@ } printf("\n"); + printf("source(%s) = %d\n\n", opt[copi].flag, opt[copi].source); + for (opi=0; opi<opn; opi++) { + printf("source(opt[%u]) = %d\n", opi, opt[opi].source); + } + hestParseFree(opt); exit(0); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |