diff options
author | Martin Peach <mrpeach@users.sourceforge.net> | 2011-10-21 20:02:32 +0000 |
---|---|---|
committer | Martin Peach <mrpeach@users.sourceforge.net> | 2011-10-21 20:02:32 +0000 |
commit | d8afc1de663e737a9dd66ab2c3979bbdc448efd6 (patch) | |
tree | 7c82fe88189a727b9901357ecd543beef71876b7 /osc | |
parent | ffc2c1c4f1944035234df6bd1888866c5d59df3d (diff) |
When path pattern matches exactly, don't output the empty symbol as selector. Instead output bang if no args, use arg[0] as selector if it's a
symbol, and otherwise use "list" as the selector. This should fix bug ID: 3426523.
svn path=/trunk/externals/mrpeach/; revision=15633
Diffstat (limited to 'osc')
-rw-r--r-- | osc/routeOSC.c | 33 |
1 files changed, 28 insertions, 5 deletions
diff --git a/osc/routeOSC.c b/osc/routeOSC.c index a64907a..b4e5dda 100644 --- a/osc/routeOSC.c +++ b/osc/routeOSC.c @@ -303,6 +303,7 @@ static void routeOSC_doanything(t_routeOSC *x, t_symbol *s, int argc, t_atom *ar if (noPath) { // just a list starting with a symbol // The special symbol is s + if (x->x_verbosity) post("routeOSC_doanything _1_(%p): (%d) noPath: s is \"%s\"", x, i, s->s_name); outlet_anything(x->x_outlets[i], s, argc, argv); } else // normal OSC path @@ -310,11 +311,13 @@ static void routeOSC_doanything(t_routeOSC *x, t_symbol *s, int argc, t_atom *ar // I hate stupid Max lists with a special first element if (argc == 0) { + if (x->x_verbosity) post("routeOSC_doanything _2_(%p): (%d) no args", x, i); outlet_bang(x->x_outlets[i]); } else if (argv[0].a_type == A_SYMBOL) { // Promote the symbol that was argv[0] to the special symbol + if (x->x_verbosity) post("routeOSC_doanything _3_(%p): (%d) symbol: is \"%s\"", x, i, argv[0].a_w.w_symbol->s_name); outlet_anything(x->x_outlets[i], argv[0].a_w.w_symbol, argc-1, argv+1); } else if (argc > 1) @@ -322,6 +325,7 @@ static void routeOSC_doanything(t_routeOSC *x, t_symbol *s, int argc, t_atom *ar // Multiple arguments starting with a number, so naturally we have // to use a special function to output this "list", since it's what // Max originally meant by "list". + if (x->x_verbosity) post("routeOSC_doanything _4_(%p): (%d) list:", x, i); outlet_list(x->x_outlets[i], 0L, argc, argv); } else @@ -330,6 +334,7 @@ static void routeOSC_doanything(t_routeOSC *x, t_symbol *s, int argc, t_atom *ar // not as a list if (argv[0].a_type == A_FLOAT) { + if (x->x_verbosity) post("routeOSC_doanything _5_(%p): (%d) a single float", x, i); outlet_float(x->x_outlets[i], argv[0].a_w.w_float); } else @@ -357,17 +362,34 @@ static void routeOSC_doanything(t_routeOSC *x, t_symbol *s, int argc, t_atom *ar { StrCopyUntilNthSlash(patternBegin, pattern+1, x->x_prefix_depth[i]); if (x->x_verbosity) - post("routeOSC_doanything(%p): (%d) patternBegin is %s", x, i, patternBegin); + post("routeOSC_doanything _6_(%p): (%d) patternBegin is %s", x, i, patternBegin); if (MyPatternMatch(patternBegin, x->x_prefixes[i]+1)) { if (x->x_verbosity) - post("routeOSC_doanything(%p): (%d) matched %s depth %d", x, i, x->x_prefixes[i], x->x_prefix_depth[i]); + post("routeOSC_doanything _7_(%p): (%d) matched %s depth %d", x, i, x->x_prefixes[i], x->x_prefix_depth[i]); ++matchedAnything; nextSlash = NthSlashOrNull(pattern+1, x->x_prefix_depth[i]); if (x->x_verbosity) - post("routeOSC_doanything(%p): (%d) nextSlash %s", x, i, nextSlash); - if (restOfPattern == 0) restOfPattern = gensym(nextSlash); - outlet_anything(x->x_outlets[i], restOfPattern, argc, argv); + post("routeOSC_doanything _8_(%p): (%d) nextSlash %s [%d]", x, i, nextSlash, nextSlash[0]); + if (*nextSlash != '\0') + { + if (x->x_verbosity) post("routeOSC_doanything _9_(%p): (%d) more pattern", x, i); + restOfPattern = gensym(nextSlash); + outlet_anything(x->x_outlets[i], restOfPattern, argc, argv); + } + else if (argc == 0) + { + if (x->x_verbosity) post("routeOSC_doanything _10_(%p): (%d) no more pattern, no args", x, i); + outlet_bang(x->x_outlets[i]); + } + else + { + if (x->x_verbosity) post("routeOSC_doanything _11_(%p): (%d) no more pattern, %d args", x, i, argc); + if (argv[0].a_type == A_SYMBOL) // Promote the symbol that was argv[0] to the special symbol + outlet_anything(x->x_outlets[i], argv[0].a_w.w_symbol, argc-1, argv+1); + else + outlet_anything(x->x_outlets[i], gensym("list"), argc, argv); + } } } } @@ -376,6 +398,7 @@ static void routeOSC_doanything(t_routeOSC *x, t_symbol *s, int argc, t_atom *ar if (!matchedAnything) { // output unmatched data on rightmost outlet a la normal 'route' object, jdl 20020908 + if (x->x_verbosity) post("routeOSC_doanything _13_(%p) unmatched %d, %d args", x, i, argc); outlet_anything(x->x_outlets[x->x_num], s, argc, argv); } } |