Control of mbed using OSC. Based on code from the Make Controller. Right now you can turn the onboard LEDs on/off and toggle 8 digital out pins. More I/O will be done in the future.
Diff: osc_patternmatch.c
- Revision:
- 0:439354122597
diff -r 000000000000 -r 439354122597 osc_patternmatch.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/osc_patternmatch.c Wed Mar 17 03:17:38 2010 +0000 @@ -0,0 +1,212 @@ +/* Pehr Hovey - mBed OSC + * This Code is from the Make Controller firmware repository + * http://makingthings.com + */ +/********************************************************************************* + + Copyright 2006-2009 MakingThings + + Licensed under the Apache License, + Version 2.0 (the "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software distributed + under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. See the License for + the specific language governing permissions and limitations under the License. + +*********************************************************************************/ + +/* + osc_patternmatch.c + + Adapted from OSC-pattern-match.c, by Matt Wright + Adapted from oscpattern.c, by Matt Wright and Amar Chaudhury + */ + + + + +static const char *theWholePattern; /* Just for warning messages */ + +static bool MatchBrackets (const char *pattern, const char *test); +static bool MatchList (const char *pattern, const char *test); + +bool Osc_PatternMatch(const char * pattern, const char * test) +{ + theWholePattern = pattern; + + if (pattern == 0 || pattern[0] == 0) + { + return test[0] == 0; + } + + if (test[0] == 0) + { + if (pattern[0] == '*') + return Osc_PatternMatch(pattern+1,test); + else + return false; + } + + switch (pattern[0]) + { + case 0: + return test[0] == 0; + case '?': + return Osc_PatternMatch(pattern + 1, test + 1); + case '*': + if (Osc_PatternMatch(pattern+1, test)) + return true; + else + return Osc_PatternMatch(pattern, test+1); + case ']': + case '}': + // OSCWarning("Spurious %c in pattern \".../%s/...\"",pattern[0], theWholePattern); + return false; + case '[': + return MatchBrackets (pattern,test); + case '{': + return MatchList (pattern,test); + case '\\': + if (pattern[1] == 0) + return test[0] == 0; + else + { + if (pattern[1] == test[0]) + return Osc_PatternMatch(pattern+2,test+1); + else + return false; + } + default: + if (pattern[0] == test[0]) + return Osc_PatternMatch(pattern+1,test+1); + else + return false; + } +} + + +/* we know that pattern[0] == '[' and test[0] != 0 */ + +static bool MatchBrackets (const char *pattern, const char *test) +{ + bool result; + bool negated = false; + const char *p = pattern; + + if (pattern[1] == 0) + { + // OSCWarning("Unterminated [ in pattern \".../%s/...\"", theWholePattern); + return false; + } + + if (pattern[1] == '!') + { + negated = true; + p++; + } + + while (*p != ']') + { + if (*p == 0) + { + //OSCWarning("Unterminated [ in pattern \".../%s/...\"", theWholePattern); + return false; + } + if (p[1] == '-' && p[2] != 0) + { + if (test[0] >= p[0] && test[0] <= p[2]) + { + result = !negated; + goto advance; + } + } + if (p[0] == test[0]) + { + result = !negated; + goto advance; + } + p++; + } + + result = negated; + +advance: + + if (!result) + return false; + + while (*p != ']') + { + if (*p == 0) + { + //OSCWarning("Unterminated [ in pattern \".../%s/...\"", theWholePattern); + return false; + } + p++; + } + + return Osc_PatternMatch(p+1,test+1); +} + +static bool MatchList (const char *pattern, const char *test) +{ + + const char *restOfPattern, *tp = test; + + for(restOfPattern = pattern; *restOfPattern != '}'; restOfPattern++) + { + if (*restOfPattern == 0) + { + //OSCWarning("Unterminated { in pattern \".../%s/...\"", theWholePattern); + return false; + } + } + + restOfPattern++; /* skip close curly brace */ + + pattern++; /* skip open curly brace */ + + while (1) + { + if (*pattern == ',') + { + if (Osc_PatternMatch(restOfPattern, tp)) + return true; + else + { + tp = test; + ++pattern; + } + } + else + { + if (*pattern == '}') + return Osc_PatternMatch(restOfPattern, tp); + else + { + if (*pattern == *tp) + { + ++pattern; + ++tp; + } + else + { + tp = test; + while (*pattern != ',' && *pattern != '}') { + pattern++; + } + if (*pattern == ',') + pattern++; + } + } + } + } +} + + + +