📄 pbap_client_parse.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 + -