⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pbap_client_parse.c

📁 pbap_client:bluetooth 可查询带有PBAP功能手机的Phonebook
💻 C
字号:
/*
    Warning - this file was autogenerated by genparse
    DO NOT EDIT - any changes will be lost
*/

#include "pbap_client_parse.h"

#include <ctype.h>
#include <panic.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <util.h> /* hash and compare */

#if (defined TEST_HARNESS || defined DISPLAY_AT_CMDS)
#include <stdio.h>
#endif

typedef const uint8 *ptr;

static __inline__ char my_toupper(char c)
{ return 'a' <= c && c <= 'z' ? c +'A'-'a' : c; }

static ptr skip1(ptr s, ptr e)
{
  if(s)
    while(s != e && (*s == ' ' || *s == '\t'))
      ++s;
  return s;
}

static const int isStringTable[] =
{
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    1,0,0,1,0,0,0,0,0,0,1,1,0,1,0,1,
    1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,
    0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
    1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,
    0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
    1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0
};

static __inline__ int isString(char c)
{
    return (c & ~0x7F) == 0 && isStringTable[(int)c];
}

static __inline__ ptr skipQuote(ptr p, ptr e)
{ return p && p != e && *p == '"' ? p+1 : p; }

static ptr getString(ptr p, ptr e, struct sequence *res)
{
  p = skipQuote(p, e);
  if(p)
  {
    ptr s = p;
    while(p != e && isString(*p)) ++p;
    if(p != s)
    {
        res->data = s;
        res->length = p - s;
        return skipQuote(p, e);
    }
    else
    {
        p = skipQuote(p, e);
        if (*p==',')
        {
            res->data = 0;
            res->length = 0;
            return p;
        }
    }
  }
  res->data = 0;
  res->length = 0;
  return 0;
}

#ifdef TEST_HARNESS
static void printString(const char *name, const struct sequence *s)
{
  uint16 i;
  printf(" %s='", name);
  for(i = 0; i < s->length; ++i) putchar(s->data[i]);
  printf("'");
}
#endif

static ptr skipOnce1(ptr s, ptr e)
{
  if(s)
  {
    if(s != e && (*s == ',' || *s == ';'))
      ++s;
  }
  return s;
}

static ptr match1(ptr s, ptr e)
{ return s && s != e && (*s == '\r' || *s == '\n') ? s+1 : 0; }

static ptr findEndOfPacket(ptr s, ptr e)
{
  /*
     Returns
     0   if the buffer holds an incomplete packet
     s+1 if the buffer holds an invalid packet
     end of the first packet otherwise
  */
  if(s == e) return 0;

  if(*s == '\r')
  {
    /* expecting <cr> <lf> ... <cr> <lf> */
    if(e-s >= 4)
    {
      if(s[1] == '\n')
      {
        ptr p = s+2;
        p = (const uint8*)UtilFind(0xFFFF, '\r', (const uint16*)p, 0, 1, (uint16)(e-p));
        return p == 0 || p + 1 == e ? 0 /* no terminator yet */
             : p[1] == '\n' ? p+2 /* valid */
             : s+1 ; /* invalid terminator */
      }
      else
      {
        return s+1;
      }
    }
    else
    {
      /* Can't tell yet */
      return 0;
    }
  }
  else
  {
    /* expecting ... <cr> */
    ptr p = s;
    while(p != e && (*p == ' ' || *p == '\n' || *p == '\0' || *p == '\t')) ++p;
    if(p != e && *p == '\r') return s+1;
    while(p != e && *p != '\r') ++p;
    return p == e ? 0 : p+1;
  }
}

#ifndef TEST_HARNESS
#ifdef __XAP__
uint16 pbap_parseSource(Source rfcDataIn, Task task)
{
  ptr s = SourceMap(rfcDataIn);
  ptr e = s + SourceSize(rfcDataIn);
  ptr p = pbap_parseData(s, e, task);
  if(p != s)
  {
    SourceDrop(rfcDataIn, (uint16) (p - s));
    return 1;
  }
  else
  {
    return 0;
  }
}
#endif
#endif

typedef struct {
  char c;
  int to;
} Arc;

static const Arc arcs[] = {
  { '\t', 0 },
  { ' ', 0 },
  { 'A', 1 },
  { 'T', 2 },
  { '\t', 2 },
  { ' ', 2 },
  { '+', 3 },
  { '\t', 3 },
  { ' ', 3 },
  { 'C', 4 },
  { 'D', 5 },
  { 'G', 6 },
  { 'S', 7 },
  { 'O', 8 },
  { 'I', 9 },
  { 'L', 10 },
  { 'V', 11 },
  { 'P', 12 },
  { 'N', 13 },
  { 'S', 14 },
  { 'P', 15 },
  { 'C', 16 },
  { 'B', 17 },
  { '\t', 13 },
  { ' ', 13 },
  { ':', -1 },
  { '=', -1 },
  { 'C', 18 },
  { 'B', 19 },
  { 'E', 20 },
  { 'L', 21 },
  { '\t', 17 },
  { ' ', 17 },
  { ':', -2 },
  { '=', -2 },
  { 'O', 22 },
  { '\t', 19 },
  { ' ', 19 },
  { ':', -3 },
  { '=', -3 },
  { '\t', 20 },
  { ' ', 20 },
  { ':', -4 },
  { '=', -4 },
  { '\t', 21 },
  { ' ', 21 },
  { ':', -5 },
  { '=', -5 },
  { '\t', 22 },
  { '\n', -6 },
  { '\r', -6 },
  { ' ', 22 },
};

static const Arc *const states[24] = {
  &arcs[0],
  &arcs[3],
  &arcs[4],
  &arcs[7],
  &arcs[13],
  &arcs[14],
  &arcs[16],
  &arcs[17],
  &arcs[18],
  &arcs[19],
  &arcs[20],
  &arcs[21],
  &arcs[22],
  &arcs[23],
  &arcs[27],
  &arcs[28],
  &arcs[29],
  &arcs[31],
  &arcs[35],
  &arcs[36],
  &arcs[40],
  &arcs[44],
  &arcs[48],
  &arcs[52],
};

static uint16 matchLiteral(ptr s, ptr e, Task task)
{ s=s; e=e; task=task; return 0; }

ptr pbap_parseData(ptr s, ptr e, Task task)
{
  ptr p;

#ifdef DISPLAY_AT_CMDS
  {
  	ptr c = s;
    printf("\nreceived: ");
  	while (c != e)
  	{
		if (*c == '\r')			printf("\\r");
		else if (*c == '\n') 	printf("\\n");
		else 					putchar(*c);

		c++;
  	}
  }
#endif

#ifdef TEST_HARNESS
  task = task;
#endif
  for(; (p = findEndOfPacket(s, e)) != 0; s = p)
  {
    if(p == s+1)
    {
      /* Silently discard one character; no packets are that short */
      continue;
    }
    else if(matchLiteral(s, p, task))
    {
      continue;
    }
    else
    {
      union {
        struct ATConnectReq ATConnectReq;
        struct SetPhonebookReq SetPhonebookReq;
        struct DownloadPhonebook DownloadPhonebook;
        struct GetVCardEntry GetVCardEntry;
        struct GetVCardList GetVCardList;
        struct GetVCardListSearch GetVCardListSearch;
      } u, *uu = &u;
      int state = 0;
      ptr t = s;
      while(t != e && state >= 0)
      {
        char m = my_toupper((char) *t);
        const Arc *a = states[state];
        const Arc *const last_a = states[state+1];
        a = (const Arc *) (void *) UtilFind(0xFFFF, (uint16) m, (const uint16 *) (void *) &a[0].c, 0, sizeof(Arc), (uint16) (last_a - a));
        /*lint -e{801} suppress goto is deprecated */
        if(!a) goto unrecognised;
        state = a->to;
        ++t;
      }
      switch(-state)
      {
        case 1:
          if(match1(skip1(getString(skip1(skipOnce1(getString(skip1(skipOnce1(getString(skip1(t, e), e, &uu->ATConnectReq.NAP), e), e), e, &uu->ATConnectReq.UAP), e), e), e, &uu->ATConnectReq.LAP), e), e))
          {
#ifndef TEST_HARNESS
            handleATConnectReq(task, &uu->ATConnectReq);
#endif
#ifdef TEST_HARNESS
            printf("Called handleATConnectReq");
            printString("NAP", &uu->ATConnectReq.NAP);
            printString("UAP", &uu->ATConnectReq.UAP);
            printString("LAP", &uu->ATConnectReq.LAP);
            putchar('\n');
#endif
            continue;
          }
          break;
        case 2:
          if(match1(skip1(UtilGetNumber(skip1(skipOnce1(UtilGetNumber(skip1(t, e), e, &uu->SetPhonebookReq.Repository), e), e), e, &uu->SetPhonebookReq.Phonebook), e), e))
          {
#ifndef TEST_HARNESS
            handleSetPhonebookReq(task, &uu->SetPhonebookReq);
#endif
#ifdef TEST_HARNESS
            printf("Called handleSetPhonebookReq");
            printf(" Repository=%d", uu->SetPhonebookReq.Repository);
            printf(" Phonebook=%d", uu->SetPhonebookReq.Phonebook);
            putchar('\n');
#endif
            continue;
          }
          break;
        case 3:
          if(match1(skip1(getString(skip1(skipOnce1(UtilGetNumber(skip1(skipOnce1(UtilGetNumber(skip1(skipOnce1(UtilGetNumber(skip1(skipOnce1(UtilGetNumber(skip1(skipOnce1(UtilGetNumber(skip1(t, e), e, &uu->DownloadPhonebook.Repository), e), e), e, &uu->DownloadPhonebook.Phonebook), e), e), e, &uu->DownloadPhonebook.format), e), e), e, &uu->DownloadPhonebook.Start), e), e), e, &uu->DownloadPhonebook.maxList), e), e), e, &uu->DownloadPhonebook.filter), e), e))
          {
#ifndef TEST_HARNESS
            handleDownloadPhonebook(task, &uu->DownloadPhonebook);
#endif
#ifdef TEST_HARNESS
            printf("Called handleDownloadPhonebook");
            printf(" Repository=%d", uu->DownloadPhonebook.Repository);
            printf(" Phonebook=%d", uu->DownloadPhonebook.Phonebook);
            printf(" format=%d", uu->DownloadPhonebook.format);
            printf(" Start=%d", uu->DownloadPhonebook.Start);
            printf(" maxList=%d", uu->DownloadPhonebook.maxList);
            printString("filter", &uu->DownloadPhonebook.filter);
            putchar('\n');
#endif
            continue;
          }
          break;
        case 4:
          if(match1(skip1(getString(skip1(skipOnce1(UtilGetNumber(skip1(skipOnce1(UtilGetNumber(skip1(t, e), e, &uu->GetVCardEntry.entry), e), e), e, &uu->GetVCardEntry.format), e), e), e, &uu->GetVCardEntry.filter), e), e))
          {
#ifndef TEST_HARNESS
            handleGetVCardEntry(task, &uu->GetVCardEntry);
#endif
#ifdef TEST_HARNESS
            printf("Called handleGetVCardEntry");
            printf(" entry=%d", uu->GetVCardEntry.entry);
            printf(" format=%d", uu->GetVCardEntry.format);
            printString("filter", &uu->GetVCardEntry.filter);
            putchar('\n');
#endif
            continue;
          }
          break;
        case 5:
          if(match1(skip1(UtilGetNumber(skip1(skipOnce1(UtilGetNumber(skip1(t, e), e, &uu->GetVCardList.Start), e), e), e, &uu->GetVCardList.maxList), e), e))
          {
#ifndef TEST_HARNESS
            handleGetVCardList(task, &uu->GetVCardList);
#endif
#ifdef TEST_HARNESS
            printf("Called handleGetVCardList");
            printf(" Start=%d", uu->GetVCardList.Start);
            printf(" maxList=%d", uu->GetVCardList.maxList);
            putchar('\n');
#endif
            continue;
          }
          if(match1(skip1(getString(skip1(skipOnce1(UtilGetNumber(skip1(skipOnce1(UtilGetNumber(skip1(skipOnce1(UtilGetNumber(skip1(t, e), e, &uu->GetVCardListSearch.Start), e), e), e, &uu->GetVCardListSearch.maxList), e), e), e, &uu->GetVCardListSearch.srchAttr), e), e), e, &uu->GetVCardListSearch.srchVal), e), e))
          {
#ifndef TEST_HARNESS
            handleGetVCardListSearch(task, &uu->GetVCardListSearch);
#endif
#ifdef TEST_HARNESS
            printf("Called handleGetVCardListSearch");
            printf(" Start=%d", uu->GetVCardListSearch.Start);
            printf(" maxList=%d", uu->GetVCardListSearch.maxList);
            printf(" srchAttr=%d", uu->GetVCardListSearch.srchAttr);
            printString("srchVal", &uu->GetVCardListSearch.srchVal);
            putchar('\n');
#endif
            continue;
          }
          break;
        case 6:
          if(t)
          {
#ifndef TEST_HARNESS
            handleATDisconnectReq(task);
#endif
#ifdef TEST_HARNESS
            printf("Called handleATDisconnectReq");
            putchar('\n');
#endif
            continue;
          }
          break;
        default:
          break;
      }
      /*
        The message does not contain a recognised AT command or response.
        Pass the data on to the application to have a go at 
      */
unrecognised:
#ifndef TEST_HARNESS
      pbap_handleUnrecognised(s, (uint16) (p-s), task);
#endif
#ifdef TEST_HARNESS
      printf("Called handleUnrecognised\n");
#endif
    }
  }

  return s;
}

/*
handleATConnectReq
   Skip " \t"
   MatchChar A
   MatchChar T
   Skip " \t"
   MatchChar +
   Skip " \t"
   MatchChar C
   MatchChar O
   MatchChar N
   Skip " \t"
   Match "=:"
   Skip " \t"
   GetString NAP
   SkipOnce ",;"
   Skip " \t"
   GetString UAP
   SkipOnce ",;"
   Skip " \t"
   GetString LAP
   Skip " \t"
   Match "\r\n"


handleATDisconnectReq
   Skip " \t"
   MatchChar A
   MatchChar T
   Skip " \t"
   MatchChar +
   Skip " \t"
   MatchChar D
   MatchChar I
   MatchChar S
   MatchChar C
   MatchChar O
   Skip " \t"
   Match "\r\n"


handleSetPhonebookReq
   Skip " \t"
   MatchChar A
   MatchChar T
   Skip " \t"
   MatchChar +
   Skip " \t"
   MatchChar S
   MatchChar P
   MatchChar B
   Skip " \t"
   Match "=:"
   Skip " \t"
   GetNumber Repository
   SkipOnce ",;"
   Skip " \t"
   GetNumber Phonebook
   Skip " \t"
   Match "\r\n"


handleGetVCardList
   Skip " \t"
   MatchChar A
   MatchChar T
   Skip " \t"
   MatchChar +
   Skip " \t"
   MatchChar G
   MatchChar V
   MatchChar C
   MatchChar L
   Skip " \t"
   Match "=:"
   Skip " \t"
   GetNumber Start
   SkipOnce ",;"
   Skip " \t"
   GetNumber maxList
   Skip " \t"
   Match "\r\n"


handleGetVCardListSearch
   Skip " \t"
   MatchChar A
   MatchChar T
   Skip " \t"
   MatchChar +
   Skip " \t"
   MatchChar G
   MatchChar V
   MatchChar C
   MatchChar L
   Skip " \t"
   Match "=:"
   Skip " \t"
   GetNumber Start
   SkipOnce ",;"
   Skip " \t"
   GetNumber maxList
   SkipOnce ",;"
   Skip " \t"
   GetNumber srchAttr
   SkipOnce ",;"
   Skip " \t"
   GetString srchVal
   Skip " \t"
   Match "\r\n"


handleGetVCardEntry
   Skip " \t"
   MatchChar A
   MatchChar T
   Skip " \t"
   MatchChar +
   Skip " \t"
   MatchChar G
   MatchChar V
   MatchChar C
   MatchChar E
   Skip " \t"
   Match "=:"
   Skip " \t"
   GetNumber entry
   SkipOnce ",;"
   Skip " \t"
   GetNumber format
   SkipOnce ",;"
   Skip " \t"
   GetString filter
   Skip " \t"
   Match "\r\n"


handleDownloadPhonebook
   Skip " \t"
   MatchChar A
   MatchChar T
   Skip " \t"
   MatchChar +
   Skip " \t"
   MatchChar D
   MatchChar L
   MatchChar P
   MatchChar B
   Skip " \t"
   Match "=:"
   Skip " \t"
   GetNumber Repository
   SkipOnce ",;"
   Skip " \t"
   GetNumber Phonebook
   SkipOnce ",;"
   Skip " \t"
   GetNumber format
   SkipOnce ",;"
   Skip " \t"
   GetNumber Start
   SkipOnce ",;"
   Skip " \t"
   GetNumber maxList
   SkipOnce ",;"
   Skip " \t"
   GetString filter
   Skip " \t"
   Match "\r\n"


*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -