static int match_host(const struct url_info *url_info, const struct url_info *pattern_info) { const char *url = url_info->url + url_info->host_off; const char *pat = pattern_info->url + pattern_info->host_off; int url_len = url_info->host_len; int pat_len = pattern_info->host_len; while (url_len && pat_len) { const char *url_next = end_of_token(url, '.', url_len); const char *pat_next = end_of_token(pat, '.', pat_len); if (pat_next == pat + 1 && pat[0] == '*') /* wildcard matches anything */ ; else if ((pat_next - pat) == (url_next - url) && !memcmp(url, pat, url_next - url)) /* the components are the same */ ; else return 0; /* found an unmatch */ if (url_next < url + url_len) url_next++; url_len -= url_next - url; url = url_next; if (pat_next < pat + pat_len) pat_next++; pat_len -= pat_next - pat; pat = pat_next; } return (!url_len && !pat_len); }
char * find_next_token (const char **ptr, unsigned int *lengthptr) { const char *p = next_token (*ptr); if (*p == '\0') return 0; *ptr = end_of_token (p); if (lengthptr != 0) *lengthptr = *ptr - p; return (char *)p; }
char * find_next_token (char **ptr, unsigned int *lengthptr) { char *p = next_token (*ptr); char *end; if (*p == '\0') return 0; *ptr = end = end_of_token (p); if (lengthptr != 0) *lengthptr = end - p; return p; }
/* gettoken: read one token and let *outptr point to it. */ int gettoken(char** outptr) { token_type_t type; *outptr = token; while (*input_char == ' '|| *input_char == '\t') input_char++; *token++ = *input_char; switch (*input_char++) { case '\n': type = NEWLINE; break; case '<': type = INPUT; break; case '>': type = OUTPUT; break; case '&': type = AMPERSAND; break; case '|': type = PIPE; break; default: type = NORMAL; while (!end_of_token(*input_char)) *token++ = *input_char++; } *token++ = 0; /* null-terminate the string. */ return type; }