Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/blenlib/intern/BLI_args.c')
-rw-r--r--source/blender/blenlib/intern/BLI_args.c379
1 files changed, 200 insertions, 179 deletions
diff --git a/source/blender/blenlib/intern/BLI_args.c b/source/blender/blenlib/intern/BLI_args.c
index 61619bc114b..8f282373cf5 100644
--- a/source/blender/blenlib/intern/BLI_args.c
+++ b/source/blender/blenlib/intern/BLI_args.c
@@ -37,267 +37,288 @@ static char NO_DOCS[] = "NO DOCUMENTATION SPECIFIED";
struct bArgDoc;
typedef struct bArgDoc {
- struct bArgDoc *next, *prev;
- const char *short_arg;
- const char *long_arg;
- const char *documentation;
- bool done;
+ struct bArgDoc *next, *prev;
+ const char *short_arg;
+ const char *long_arg;
+ const char *documentation;
+ bool done;
} bArgDoc;
typedef struct bAKey {
- const char *arg;
- uintptr_t pass; /* cast easier */
- int case_str; /* case specific or not */
+ const char *arg;
+ uintptr_t pass; /* cast easier */
+ int case_str; /* case specific or not */
} bAKey;
typedef struct bArgument {
- bAKey *key;
- BA_ArgCallback func;
- void *data;
- bArgDoc *doc;
+ bAKey *key;
+ BA_ArgCallback func;
+ void *data;
+ bArgDoc *doc;
} bArgument;
struct bArgs {
- ListBase docs;
- GHash *items;
- int argc;
- const char **argv;
- int *passes;
+ ListBase docs;
+ GHash *items;
+ int argc;
+ const char **argv;
+ int *passes;
};
static uint case_strhash(const void *ptr)
{
- const char *s = ptr;
- uint i = 0;
- unsigned char c;
+ const char *s = ptr;
+ uint i = 0;
+ unsigned char c;
- while ((c = tolower(*s++))) {
- i = i * 37 + c;
- }
+ while ((c = tolower(*s++))) {
+ i = i * 37 + c;
+ }
- return i;
+ return i;
}
static uint keyhash(const void *ptr)
{
- const bAKey *k = ptr;
- return case_strhash(k->arg); /* ^ BLI_ghashutil_inthash((void *)k->pass); */
+ const bAKey *k = ptr;
+ return case_strhash(k->arg); /* ^ BLI_ghashutil_inthash((void *)k->pass); */
}
static bool keycmp(const void *a, const void *b)
{
- const bAKey *ka = a;
- const bAKey *kb = b;
- if (ka->pass == kb->pass || ka->pass == -1 || kb->pass == -1) { /* -1 is wildcard for pass */
- if (ka->case_str == 1 || kb->case_str == 1) {
- return (BLI_strcasecmp(ka->arg, kb->arg) != 0);
- }
- else {
- return (!STREQ(ka->arg, kb->arg));
- }
- }
- else {
- return BLI_ghashutil_intcmp((const void *)ka->pass, (const void *)kb->pass);
- }
+ const bAKey *ka = a;
+ const bAKey *kb = b;
+ if (ka->pass == kb->pass || ka->pass == -1 || kb->pass == -1) { /* -1 is wildcard for pass */
+ if (ka->case_str == 1 || kb->case_str == 1) {
+ return (BLI_strcasecmp(ka->arg, kb->arg) != 0);
+ }
+ else {
+ return (!STREQ(ka->arg, kb->arg));
+ }
+ }
+ else {
+ return BLI_ghashutil_intcmp((const void *)ka->pass, (const void *)kb->pass);
+ }
}
static bArgument *lookUp(struct bArgs *ba, const char *arg, int pass, int case_str)
{
- bAKey key;
+ bAKey key;
- key.case_str = case_str;
- key.pass = pass;
- key.arg = arg;
+ key.case_str = case_str;
+ key.pass = pass;
+ key.arg = arg;
- return BLI_ghash_lookup(ba->items, &key);
+ return BLI_ghash_lookup(ba->items, &key);
}
bArgs *BLI_argsInit(int argc, const 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, "bArgs passes gh");
- BLI_listbase_clear(&ba->docs);
- ba->argc = argc;
- ba->argv = argv;
-
- return ba;
+ bArgs *ba = MEM_callocN(sizeof(bArgs), "bArgs");
+ ba->passes = MEM_callocN(sizeof(int) * argc, "bArgs passes");
+ ba->items = BLI_ghash_new(keyhash, keycmp, "bArgs passes gh");
+ BLI_listbase_clear(&ba->docs);
+ ba->argc = argc;
+ ba->argv = argv;
+
+ return ba;
}
void BLI_argsFree(struct bArgs *ba)
{
- BLI_ghash_free(ba->items, MEM_freeN, MEM_freeN);
- MEM_freeN(ba->passes);
- BLI_freelistN(&ba->docs);
- MEM_freeN(ba);
+ BLI_ghash_free(ba->items, MEM_freeN, MEM_freeN);
+ MEM_freeN(ba->passes);
+ BLI_freelistN(&ba->docs);
+ MEM_freeN(ba);
}
void BLI_argsPrint(struct bArgs *ba)
{
- int i;
- for (i = 0; i < ba->argc; i++) {
- printf("argv[%d] = %s\n", i, ba->argv[i]);
- }
+ int i;
+ for (i = 0; i < ba->argc; i++) {
+ printf("argv[%d] = %s\n", i, ba->argv[i]);
+ }
}
const char **BLI_argsArgv(struct bArgs *ba)
{
- return ba->argv;
+ return ba->argv;
}
-static bArgDoc *internalDocs(struct bArgs *ba, const char *short_arg, const char *long_arg, const char *doc)
+static bArgDoc *internalDocs(struct bArgs *ba,
+ const char *short_arg,
+ const char *long_arg,
+ const char *doc)
{
- bArgDoc *d;
+ bArgDoc *d;
- d = MEM_callocN(sizeof(bArgDoc), "bArgDoc");
+ d = MEM_callocN(sizeof(bArgDoc), "bArgDoc");
- if (doc == NULL) {
- doc = NO_DOCS;
- }
+ if (doc == NULL) {
+ doc = NO_DOCS;
+ }
- d->short_arg = short_arg;
- d->long_arg = long_arg;
- d->documentation = doc;
+ d->short_arg = short_arg;
+ d->long_arg = long_arg;
+ d->documentation = doc;
- BLI_addtail(&ba->docs, d);
+ BLI_addtail(&ba->docs, d);
- return d;
+ return d;
}
-static void internalAdd(struct bArgs *ba, const char *arg, int pass,
- int case_str, BA_ArgCallback cb, void *data, bArgDoc *d)
+static void internalAdd(struct bArgs *ba,
+ const char *arg,
+ int pass,
+ int case_str,
+ BA_ArgCallback cb,
+ void *data,
+ bArgDoc *d)
{
- bArgument *a;
- bAKey *key;
-
- a = lookUp(ba, arg, pass, case_str);
-
- if (a) {
- printf("WARNING: conflicting argument\n");
- printf("\ttrying to add '%s' on pass %i, %scase sensitive\n",
- arg, pass, case_str == 1 ? "not " : "");
- printf("\tconflict with '%s' on pass %i, %scase sensitive\n\n",
- a->key->arg, (int)a->key->pass, a->key->case_str == 1 ? "not " : "");
- }
-
- a = MEM_callocN(sizeof(bArgument), "bArgument");
- key = MEM_callocN(sizeof(bAKey), "bAKey");
-
- key->arg = arg;
- key->pass = pass;
- key->case_str = case_str;
-
- a->key = key;
- a->func = cb;
- a->data = data;
- a->doc = d;
-
- BLI_ghash_insert(ba->items, key, a);
+ bArgument *a;
+ bAKey *key;
+
+ a = lookUp(ba, arg, pass, case_str);
+
+ if (a) {
+ printf("WARNING: conflicting argument\n");
+ printf("\ttrying to add '%s' on pass %i, %scase sensitive\n",
+ arg,
+ pass,
+ case_str == 1 ? "not " : "");
+ printf("\tconflict with '%s' on pass %i, %scase sensitive\n\n",
+ a->key->arg,
+ (int)a->key->pass,
+ a->key->case_str == 1 ? "not " : "");
+ }
+
+ a = MEM_callocN(sizeof(bArgument), "bArgument");
+ key = MEM_callocN(sizeof(bAKey), "bAKey");
+
+ key->arg = arg;
+ key->pass = pass;
+ key->case_str = case_str;
+
+ a->key = key;
+ a->func = cb;
+ a->data = data;
+ a->doc = d;
+
+ BLI_ghash_insert(ba->items, key, a);
}
-void BLI_argsAddCase(struct bArgs *ba, int pass,
- const char *short_arg, int short_case,
- const char *long_arg, int long_case,
- const char *doc, BA_ArgCallback cb, void *data)
+void BLI_argsAddCase(struct bArgs *ba,
+ int pass,
+ const char *short_arg,
+ int short_case,
+ const char *long_arg,
+ int long_case,
+ const char *doc,
+ BA_ArgCallback cb,
+ void *data)
{
- bArgDoc *d = internalDocs(ba, short_arg, long_arg, doc);
+ bArgDoc *d = internalDocs(ba, short_arg, long_arg, doc);
- if (short_arg) {
- internalAdd(ba, short_arg, pass, short_case, cb, data, d);
- }
+ 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);
- }
+ if (long_arg) {
+ internalAdd(ba, long_arg, pass, long_case, cb, data, d);
+ }
}
-void BLI_argsAdd(struct bArgs *ba, int pass,
- const char *short_arg, const char *long_arg,
- const char *doc, BA_ArgCallback cb, void *data)
+void BLI_argsAdd(struct bArgs *ba,
+ int pass,
+ const char *short_arg,
+ const char *long_arg,
+ const char *doc,
+ BA_ArgCallback cb,
+ void *data)
{
- BLI_argsAddCase(ba, pass, short_arg, 0, long_arg, 0, doc, cb, data);
+ BLI_argsAddCase(ba, pass, short_arg, 0, long_arg, 0, doc, cb, data);
}
static void internalDocPrint(bArgDoc *d)
{
- 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);
+ 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, const char *arg)
{
- bArgument *a = lookUp(ba, arg, -1, -1);
+ bArgument *a = lookUp(ba, arg, -1, -1);
- if (a) {
- bArgDoc *d = a->doc;
+ if (a) {
+ bArgDoc *d = a->doc;
- internalDocPrint(d);
+ internalDocPrint(d);
- d->done = true;
- }
+ d->done = true;
+ }
}
void BLI_argsPrintOtherDoc(struct bArgs *ba)
{
- bArgDoc *d;
+ bArgDoc *d;
- for (d = ba->docs.first; d; d = d->next) {
- if (d->done == 0) {
- internalDocPrint(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] */
- if (ba->passes[i] == 0) {
- /* -1 signal what side of the comparison it is */
- bArgument *a = lookUp(ba, ba->argv[i], pass, -1);
- BA_ArgCallback func = NULL;
- void *data = NULL;
-
- if (a) {
- func = a->func;
- data = a->data;
- }
- else {
- func = default_cb;
- data = default_data;
- }
-
- if (func) {
- int retval = func(ba->argc - i, ba->argv + i, data);
-
- if (retval >= 0) {
- int j;
-
- /* use extra arguments */
- for (j = 0; j <= retval; j++) {
- ba->passes[i + j] = pass;
- }
- i += retval;
- }
- else if (retval == -1) {
- if (a) {
- if (a->key->pass != -1) {
- ba->passes[i] = pass;
- }
- }
- break;
- }
- }
- }
- }
+ int i = 0;
+
+ for (i = 1; i < ba->argc; i++) { /* skip argv[0] */
+ if (ba->passes[i] == 0) {
+ /* -1 signal what side of the comparison it is */
+ bArgument *a = lookUp(ba, ba->argv[i], pass, -1);
+ BA_ArgCallback func = NULL;
+ void *data = NULL;
+
+ if (a) {
+ func = a->func;
+ data = a->data;
+ }
+ else {
+ func = default_cb;
+ data = default_data;
+ }
+
+ if (func) {
+ int retval = func(ba->argc - i, ba->argv + i, data);
+
+ if (retval >= 0) {
+ int j;
+
+ /* use extra arguments */
+ for (j = 0; j <= retval; j++) {
+ ba->passes[i + j] = pass;
+ }
+ i += retval;
+ }
+ else if (retval == -1) {
+ if (a) {
+ if (a->key->pass != -1) {
+ ba->passes[i] = pass;
+ }
+ }
+ break;
+ }
+ }
+ }
+ }
}