otp-parse.c revision 23bdbb7b1831785c6ba6df190f6369da882d2b9d
b1798ddcfb952efb7cc8bacaf51b3486a7fec121Stephen Gallagher * OTP extended response parser.
4139a7a731f2831963a42b26aac111422be28792Jakub Hrozek * Copyright (c) 2006 Andrey Panin <pazke@donpac.ru>
b1798ddcfb952efb7cc8bacaf51b3486a7fec121Stephen Gallagher * This software is released under the MIT license.
b1798ddcfb952efb7cc8bacaf51b3486a7fec121Stephen Gallagher#define IS_LWS(c) ((c) == ' ' || (c) == '\t')
b1798ddcfb952efb7cc8bacaf51b3486a7fec121Stephen Gallagherstatic inline const char *otp_skip_lws(const char *data)
5cd4414fce1e0eb4133dfc6fc828bf25c8a959f9Lukas Slebodnikstatic inline bool otp_check_tail(const char *data)
4139a7a731f2831963a42b26aac111422be28792Jakub Hrozek return *data != 0;
b1798ddcfb952efb7cc8bacaf51b3486a7fec121Stephen Gallagherint otp_read_hex(const char *data, const char **endptr, unsigned char *hash)
4139a7a731f2831963a42b26aac111422be28792Jakub Hrozek unsigned int i = 0;
char c = *data;
if (i_isxdigit(c)) {
data++;
} else if (!IS_LWS(c)) {
data++;
#define add_word() do { \
count++; \
char c = *data;
if (space) {
if (IS_LWS(c))
else if (i_isalpha(c)) {
if (i_isalpha(c)) {
count = 0;
} else if (IS_LWS(c)) {
add_word();
add_word();
int algo;
s = p = data;
while ((*p != 0) && !IS_LWS(*p)) p++;
if (algo < 0)
*endptr = p;
const char *end;
if (ret < 0)
return ret;
const char *end;
if (ret < 0) {
return ret;
if (ret < 0) {
if (ret < 0) {
const char *end;
int ret;
if (ret != 0)
return ret;