diff options
Diffstat (limited to 'source/blender/blenlib/intern/BLI_args.c')
-rw-r--r-- | source/blender/blenlib/intern/BLI_args.c | 102 |
1 files changed, 90 insertions, 12 deletions
diff --git a/source/blender/blenlib/intern/BLI_args.c b/source/blender/blenlib/intern/BLI_args.c index 1a677499d1f..8d72311f80b 100644 --- a/source/blender/blenlib/intern/BLI_args.c +++ b/source/blender/blenlib/intern/BLI_args.c @@ -33,10 +33,22 @@ #include "MEM_guardedalloc.h" +#include "BLI_listbase.h" #include "BLI_string.h" #include "BLI_args.h" #include "BLI_ghash.h" +char NO_DOCS[] = "NO DOCUMENTATION SPECIFIED"; + +struct bArgDoc; +typedef struct bArgDoc { + struct bArgDoc *next, *prev; + char *short_arg; + char *long_arg; + char *documentation; + int done; +} bArgDoc; + typedef struct bAKey { char *arg; uintptr_t pass; /* cast easier */ @@ -47,9 +59,11 @@ typedef struct bArgument { bAKey *key; BA_ArgCallback func; void *data; + bArgDoc *doc; } bArgument; struct bArgs { + ListBase docs; GHash *items; int argc; char **argv; @@ -70,7 +84,7 @@ static unsigned int case_strhash(void *ptr) { static unsigned int keyhash(void *ptr) { bAKey *k = ptr; - return case_strhash(k->arg) ^ BLI_ghashutil_inthash((void*)k->pass); + return case_strhash(k->arg); // ^ BLI_ghashutil_inthash((void*)k->pass); } static int keycmp(void *a, void *b) @@ -102,7 +116,8 @@ bArgs *BLI_argsInit(int argc, char **argv) { bArgs *ba = MEM_callocN(sizeof(bArgs), "bArgs"); ba->passes = MEM_callocN(sizeof(int) * argc, "bArgs passes"); - ba->items = BLI_ghash_new(keyhash, keycmp); + ba->items = BLI_ghash_new(keyhash, keycmp, "bArgs passes gh"); + ba->docs.first = ba->docs.last = NULL; ba->argc = argc; ba->argv = argv; @@ -118,6 +133,7 @@ void BLI_argsFree(struct bArgs *ba) { BLI_ghash_free(ba->items, freeItem, freeItem); MEM_freeN(ba->passes); + BLI_freelistN(&ba->docs); MEM_freeN(ba); } @@ -134,7 +150,25 @@ char **BLI_argsArgv(struct bArgs *ba) return ba->argv; } -static void internalAdd(struct bArgs *ba, char *arg, int pass, int case_str, BA_ArgCallback cb, void *data) +static bArgDoc *internalDocs(struct bArgs *ba, char *short_arg, char *long_arg, char *doc) +{ + bArgDoc *d; + + d = MEM_callocN(sizeof(bArgDoc), "bArgDoc"); + + if (doc == NULL) + doc = NO_DOCS; + + d->short_arg = short_arg; + d->long_arg = long_arg; + d->documentation = doc; + + BLI_addtail(&ba->docs, d); + + return d; +} + +static void internalAdd(struct bArgs *ba, char *arg, int pass, int case_str, BA_ArgCallback cb, void *data, bArgDoc *d) { bArgument *a; bAKey *key; @@ -157,30 +191,73 @@ static void internalAdd(struct bArgs *ba, char *arg, int pass, int case_str, BA_ a->key = key; a->func = cb; a->data = data; + a->doc = d; BLI_ghash_insert(ba->items, key, a); } -void BLI_argsAdd(struct bArgs *ba, char *arg, int pass, BA_ArgCallback cb, void *data) +void BLI_argsAddCase(struct bArgs *ba, int pass, char *short_arg, int short_case, char *long_arg, int long_case, char *doc, BA_ArgCallback cb, void *data) +{ + bArgDoc *d = internalDocs(ba, short_arg, long_arg, doc); + + if (short_arg) + internalAdd(ba, short_arg, pass, short_case, cb, data, d); + + if (long_arg) + internalAdd(ba, long_arg, pass, long_case, cb, data, d); + + +} + +void BLI_argsAdd(struct bArgs *ba, int pass, char *short_arg, char *long_arg, char *doc, BA_ArgCallback cb, void *data) { - internalAdd(ba, arg, pass, 0, cb, data); + BLI_argsAddCase(ba, pass, short_arg, 0, long_arg, 0, doc, cb, data); } -void BLI_argsAddCase(struct bArgs *ba, char *arg, int pass, BA_ArgCallback cb, void *data) +static void internalDocPrint(bArgDoc *d) { - internalAdd(ba, arg, pass, 1, cb, data); + if (d->short_arg && d->long_arg) + printf("%s or %s", d->short_arg, d->long_arg); + else if (d->short_arg) + printf("%s", d->short_arg); + else if (d->long_arg) + printf("%s", d->long_arg); + + printf(" %s\n\n", d->documentation); } +void BLI_argsPrintArgDoc(struct bArgs *ba, char *arg) +{ + bArgument *a = lookUp(ba, arg, -1, -1); + + if (a) + { + bArgDoc *d = a->doc; + + internalDocPrint(d); + + d->done = 1; + } +} + +void BLI_argsPrintOtherDoc(struct bArgs *ba) +{ + bArgDoc *d; + + for( d = ba->docs.first; d; d = d->next) + { + if (d->done == 0) + { + internalDocPrint(d); + } + } +} void BLI_argsParse(struct bArgs *ba, int pass, BA_ArgCallback default_cb, void *default_data) { int i = 0; for( i = 1; i < ba->argc; i++) { /* skip argv[0] */ - /* stop on -- */ - if (BLI_streq(ba->argv[i], "--")) - break; - if (ba->passes[i] == 0) { /* -1 signal what side of the comparison it is */ bArgument *a = lookUp(ba, ba->argv[i], pass, -1); @@ -207,7 +284,8 @@ void BLI_argsParse(struct bArgs *ba, int pass, BA_ArgCallback default_cb, void * } i += retval; } else if (retval == -1){ - ba->passes[i] = pass; + if (a->key->pass != -1) + ba->passes[i] = pass; break; } } |