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:
authorMartin Poirier <theeth@yahoo.com>2010-02-07 18:36:20 +0300
committerMartin Poirier <theeth@yahoo.com>2010-02-07 18:36:20 +0300
commit60bf5465a45b04f2ee6e103ecf07ed5708b75e3e (patch)
tree98107aa9010c5555a12501e6087010dddef79295 /source/blender/blenlib
parentf9917af00b5459f56f1108a1aa20498ed1b62ad4 (diff)
Fun stuff: conflict detection in argument parsing library (could have been useful to detect a previous bug, prevents further bugs).
Prints a warning in the console at runtime when filling in the arguments if conflicts exist.
Diffstat (limited to 'source/blender/blenlib')
-rw-r--r--source/blender/blenlib/intern/BLI_args.c63
1 files changed, 37 insertions, 26 deletions
diff --git a/source/blender/blenlib/intern/BLI_args.c b/source/blender/blenlib/intern/BLI_args.c
index b3ecb012282..0a7c016df7f 100644
--- a/source/blender/blenlib/intern/BLI_args.c
+++ b/source/blender/blenlib/intern/BLI_args.c
@@ -44,6 +44,7 @@ typedef struct bAKey {
} bAKey;
typedef struct bArgument {
+ bAKey *key;
BA_ArgCallback func;
void *data;
} bArgument;
@@ -55,7 +56,7 @@ struct bArgs {
int *passes;
};
-unsigned int case_strhash(void *ptr) {
+static unsigned int case_strhash(void *ptr) {
char *s= ptr;
unsigned int i= 0;
unsigned char c;
@@ -86,6 +87,17 @@ static int keycmp(void *a, void *b)
}
}
+static bArgument *lookUp(struct bArgs *ba, char *arg, int pass, int case_str)
+{
+ bAKey key;
+
+ key.case_str = case_str;
+ key.pass = pass;
+ key.arg = arg;
+
+ return BLI_ghash_lookup(ba->items, &key);
+}
+
bArgs *BLI_argsInit(int argc, char **argv)
{
bArgs *ba = MEM_callocN(sizeof(bArgs), "bArgs");
@@ -122,49 +134,52 @@ char **BLI_argsArgv(struct bArgs *ba)
return ba->argv;
}
-void BLI_argsAdd(struct bArgs *ba, char *arg, int pass, BA_ArgCallback cb, void *data)
+static void internalAdd(struct bArgs *ba, char *arg, int pass, int case_str, BA_ArgCallback cb, void *data)
{
- bArgument *a = MEM_callocN(sizeof(bArgument), "bArgument");
- bAKey *key = MEM_callocN(sizeof(bAKey), "bAKey");
+ 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 = 0;
+ key->case_str = case_str;
+ a->key = key;
a->func = cb;
a->data = data;
BLI_ghash_insert(ba->items, key, a);
}
-void BLI_argsAddCase(struct bArgs *ba, char *arg, int pass, BA_ArgCallback cb, void *data)
+void BLI_argsAdd(struct bArgs *ba, char *arg, int pass, BA_ArgCallback cb, void *data)
{
- bArgument *a = MEM_callocN(sizeof(bArgument), "bArgument");
- bAKey *key = MEM_callocN(sizeof(bAKey), "bAKey");
-
- key->arg = arg;
- key->pass = pass;
- key->case_str = 1;
-
- a->func = cb;
- a->data = data;
+ internalAdd(ba, arg, pass, 0, cb, data);
+}
- BLI_ghash_insert(ba->items, key, a);
+void BLI_argsAddCase(struct bArgs *ba, char *arg, int pass, BA_ArgCallback cb, void *data)
+{
+ internalAdd(ba, arg, pass, 1, cb, data);
}
void BLI_argsParse(struct bArgs *ba, int pass, BA_ArgCallback default_cb, void *default_data)
{
- bAKey key;
int i = 0;
- key.case_str = -1; /* signal what side of the comparison it is */
- key.pass = pass;
-
for( i = 1; i < ba->argc; i++) { /* skip argv[0] */
- key.arg = ba->argv[i];
if (ba->passes[i] == 0) {
- bArgument *a = BLI_ghash_lookup(ba->items, &key);
+ /* -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;
@@ -174,10 +189,6 @@ void BLI_argsParse(struct bArgs *ba, int pass, BA_ArgCallback default_cb, void *
} else {
func = default_cb;
data = default_data;
-
- if (func) {
- printf("calling default on %s\n", ba->argv[i]);
- }
}
if (func) {