| 
							- #include "rtosc.h"
 - #include <ctype.h>
 - #include <stdlib.h>
 - 
 - static bool rtosc_match_number(const char **pattern, const char **msg)
 - {
 -     //Verify both hold digits
 -     if(!isdigit(**pattern) || !isdigit(**msg))
 -         return false;
 - 
 -     //Read in both numeric values
 -     unsigned max = atoi(*pattern);
 -     unsigned val = atoi(*msg);
 - 
 -     ////Advance pointers
 -     while(isdigit(**pattern))++*pattern;
 -     while(isdigit(**msg))++*msg;
 - 
 -     //Match iff msg number is strictly less than pattern
 -     return val < max;
 - }
 - 
 - const char *rtosc_match_path(const char *pattern, const char *msg)
 - {
 -     while(1) {
 -         //Check for special characters
 -         if(*pattern == ':' && !*msg)
 -             return pattern;
 -         else if(*pattern == '/' && *msg == '/')
 -             return ++pattern;
 -         else if(*pattern == '#') {
 -             ++pattern;
 -             if(!rtosc_match_number(&pattern, &msg))
 -                 return NULL;
 -         } else if((*pattern == *msg)) { //verbatim compare
 -             if(*msg)
 -                 ++pattern, ++msg;
 -             else
 -                 return pattern;
 -         } else
 -             return NULL;
 -     }
 - }
 - 
 - //Match the arg string or fail
 - static bool rtosc_match_args(const char *pattern, const char *msg)
 - {
 -     //match anything if now arg restriction is present (ie the ':')
 -     if(*pattern++ != ':')
 -         return true;
 - 
 -     const char *arg_str = rtosc_argument_string(msg);
 -     bool      arg_match = *pattern || *pattern == *arg_str;
 - 
 -     while(*pattern && *pattern != ':')
 -         arg_match &= (*pattern++==*arg_str++);
 - 
 -     if(*pattern==':') {
 -         if(arg_match && !*arg_str)
 -             return true;
 -         else
 -             return rtosc_match_args(pattern, msg); //retry
 -     }
 - 
 -     return arg_match;
 - }
 - 
 - bool rtosc_match(const char *pattern, const char *msg)
 - {
 -     const char *arg_pattern = rtosc_match_path(pattern, msg);
 -     if(!arg_pattern)
 -         return false;
 -     else if(*arg_pattern == ':')
 -         return rtosc_match_args(arg_pattern, msg);
 -     return true;
 - }
 
 
  |