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.

Dependencies:   mbed

osc_patternmatch.c

Committer:
pehrhovey
Date:
2010-03-17
Revision:
0:439354122597

File content as of revision 0:439354122597:

/* 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++;
      }
     }
   }
 }
}