9 #include "wvprotostream.h"
16 WvProtoStream::WvProtoStream(
WvStream *_cloned,
WvLog *_debuglog)
20 logp =
new WvLog(_debuglog->
split(WvLog::Debug4));
29 WvProtoStream::~WvProtoStream()
41 if (logp && log_enable)
44 logp->
write(buf, size);
54 static unsigned char whitespace[] =
" \t\r\n";
58 tokbuf.
get(tokbuf.
match(whitespace,
sizeof(whitespace)));
61 len = tokbuf.
notmatch(whitespace,
sizeof(whitespace));
62 return len ?
new Token(tokbuf.
get(len), len) : NULL;
66 WvString WvProtoStream::next_token_str()
68 Token *t = next_token();
77 WvString WvProtoStream::token_remaining()
87 WvProtoStream::TokenList *WvProtoStream::tokenize()
89 TokenList *tl =
new TokenList;
92 while ((t = next_token()) != NULL)
95 if (logp && log_enable && !tl->isempty())
98 TokenList::Iter i(*tl);
99 for (i.rewind(); i.next(); )
100 (*logp)(
"(%s) ", i.data);
112 size_t WvProtoStream::list_to_array(TokenList *tl, Token **array)
114 size_t total = tl->count(), count;
117 *array =
new Token[total];
119 TokenList::Iter i(*tl);
120 for (count = 0, i.rewind(); i.next(); count++)
123 (*array)[count].fill((
unsigned char *)(
const char *)t.data, t.length);
139 if (!line)
return NULL;
141 char *newline = strdup(line);
144 tokbuf.put(line, strlen(line));
146 if (logp && log_enable)
168 for (i = lookup; *i; i++)
170 if ( (!case_sensitive && !strcasecmp(t.data, *i))
171 || ( case_sensitive && !strcmp(t.data, *i)) )
179 void WvProtoStream::do_state(Token &)
184 void WvProtoStream::switch_state(
int newstate)
212 WvProtoStream::Token::Token()
218 WvProtoStream::Token::Token(
const unsigned char *_data,
size_t _length)
220 fill(_data, _length);
224 void WvProtoStream::Token::fill(
const unsigned char *_data,
229 data.setsize(length + 1);
230 memcpy(data.edit(), _data, length);
231 data.edit()[length] = 0;
235 WvProtoStream::Token::~Token()