]> git.ipfire.org Git - thirdparty/squid.git/blob - src/parser/Tokenizer.cc
Merged from trunk
[thirdparty/squid.git] / src / parser / Tokenizer.cc
1 #include "squid.h"
2 #include "parser/Tokenizer.h"
3
4 bool
5 Parser::Tokenizer::token(SBuf &returnedToken, const CharacterSet &delimiters)
6 {
7 SBuf savebuf(buf_);
8 SBuf retval;
9 SBuf::size_type tokenLen = 0;
10 skip(delimiters);
11 // can't use prefix as we're looking for the first char not in delimiters
12 tokenLen = buf_.findFirstOf(delimiters); // not found = npos => consume to end
13 retval = buf_.consume(tokenLen);
14 skip(delimiters);
15 returnedToken = retval;
16 return true;
17 }
18
19 bool
20 Parser::Tokenizer::prefix(SBuf &returnedToken, const CharacterSet &tokenChars, const SBuf::size_type limit)
21 {
22 SBuf::size_type prefixLen = buf_.substr(0,limit).findFirstNotOf(tokenChars);
23 if (prefixLen == 0)
24 return false;
25 returnedToken = buf_.consume(prefixLen);
26 return true;
27 }
28
29 bool
30 Parser::Tokenizer::skip(const CharacterSet &tokenChars)
31 {
32 SBuf::size_type prefixLen = buf_.findFirstNotOf(tokenChars);
33 if (prefixLen == 0)
34 return false;
35 buf_.consume(prefixLen);
36 return true;
37 }
38
39 bool
40 Parser::Tokenizer::skip(const SBuf &tokenToSkip)
41 {
42 if (buf_.startsWith(tokenToSkip)) {
43 buf_.consume(tokenToSkip.length());
44 return true;
45 }
46 return false;
47 }
48
49 bool
50 Parser::Tokenizer::skip(const char tokenChar)
51 {
52 if (buf_[0] == tokenChar) {
53 buf_.consume(1);
54 return true;
55 }
56 return false;
57 }
58
59 // adapted from compatr/strtoll.c
60 bool
61 Parser::Tokenizer::int64 (int64_t & result, int base)
62 {
63 if (buf_.isEmpty())
64 return false;
65
66 // API mismatch with strtoll: we don't eat leading space.
67 if (xisspace(buf_[0]))
68 return false;
69
70 char *eon;
71 errno = 0; // reset errno
72
73 int64_t rv = strtoll(buf_.rawContent(), &eon, base);
74
75 if (errno != 0)
76 return false;
77
78 buf_.consume(eon - buf_.rawContent()); // consume the parsed chunk
79 result = rv;
80 return true;
81
82 }