int uri_parse_unreserved(struct uri_parser *parser, string_t *part) { int len = 0; while (parser->cur < parser->end) { int ret; unsigned char ch = 0; if ((ret = uri_parse_unreserved_char(parser, &ch)) < 0) return -1; if (ret == 0) break; if (part != NULL) str_append_c(part, ch); len++; } return len > 0 ? 1 : 0; }
static int uri_parse_reg_name(struct uri_parser *parser, string_t *reg_name) { int len = 0; /* RFC 3986: * * reg-name = *( unreserved / pct-encoded / sub-delims ) */ while (parser->cur < parser->end) { int ret; unsigned char c; /* unreserved / pct-encoded */ if ((ret = uri_parse_unreserved_char(parser, &c)) < 0) return -1; if (ret > 0) { if (reg_name != NULL) str_append_c(reg_name, c); len++; continue; } /* sub-delims */ c = *parser->cur; if ((c & 0x80) == 0 && (_uri_char_lookup[c] & CHAR_MASK_SUB_DELIMS) != 0) { if (reg_name != NULL) str_append_c(reg_name, *parser->cur); parser->cur++; len++; continue; } break; } return len > 0 ? 1 : 0; }