]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/parser/Tokenizer.cc
2 #include "parser/Tokenizer.h"
5 Parser::Tokenizer::token(SBuf
&returnedToken
, const CharacterSet
&delimiters
)
9 SBuf::size_type tokenLen
= buf_
.findFirstOf(delimiters
); // not found = npos => consume to end
10 if (tokenLen
== SBuf::npos
&& !delimiters
['\0']) {
11 // no delimiter found, nor is NUL/EOS/npos acceptible as one
15 SBuf retval
= buf_
.consume(tokenLen
);
17 returnedToken
= retval
;
22 Parser::Tokenizer::prefix(SBuf
&returnedToken
, const CharacterSet
&tokenChars
, const SBuf::size_type limit
)
24 SBuf::size_type prefixLen
= buf_
.substr(0,limit
).findFirstNotOf(tokenChars
);
27 returnedToken
= buf_
.consume(prefixLen
);
32 Parser::Tokenizer::skip(const CharacterSet
&tokenChars
)
34 SBuf::size_type prefixLen
= buf_
.findFirstNotOf(tokenChars
);
37 buf_
.consume(prefixLen
);
42 Parser::Tokenizer::skip(const SBuf
&tokenToSkip
)
44 if (buf_
.startsWith(tokenToSkip
)) {
45 buf_
.consume(tokenToSkip
.length());
52 Parser::Tokenizer::skip(const char tokenChar
)
54 if (buf_
[0] == tokenChar
) {
61 /* reworked from compat/strtoll.c */
63 Parser::Tokenizer::int64(int64_t & result
, int base
)
68 //fixme: account for buf_.size()
70 const char *s
= buf_
.rawContent();
71 const char *end
= buf_
.rawContent() + buf_
.length();
76 } else if (*s
== '+') {
79 if (s
>= end
) return false;
80 if (( base
== 0 || base
== 16) && *s
== '0' && (s
+1 <= end
) &&
81 tolower(*(s
+1)) == 'x') {
93 if (s
>= end
) return false;
97 cutoff
= neg
? -static_cast<uint64_t>(INT64_MIN
) : INT64_MAX
;
98 int cutlim
= cutoff
% static_cast<int64_t>(base
);
99 cutoff
/= static_cast<uint64_t>(base
);
103 for (c
= *s
++; s
<= end
; c
= *s
++) {
106 } else if (xisalpha(c
)) {
107 c
-= xisupper(c
) ? 'A' - 10 : 'a' - 10;
113 if (any
< 0 || static_cast<uint64_t>(acc
) > cutoff
|| (static_cast<uint64_t>(acc
) == cutoff
&& c
> cutlim
))
122 if (any
== 0) // nothing was parsed
125 acc
= neg
? INT64_MIN
: INT64_MAX
;
132 buf_
.consume(s
- buf_
.rawContent() -1);