int glob__match(char *local, char *s, char *format, t_list **results) { #ifdef DEBUG // printf("local = %s, s = %s, format = %s\n", local, s, format); #endif if (!*s && !*format) return (1); else if (*format == '/') glob__open_directory(local, format + 1, 2, results); else if (*s == *format) return (glob__match(local, s + 1, format + 1, results)); else if (*format == '*') return (match_wildcard(local, s, format, results)); else if (*format == '?') return (glob__match(local, s + 1, format + 1, results)); else if (*format == '[') return (match_bracket(local, s, format, results)); return (0); }
static int fnmatch_internal(const char *pat, size_t m, const char *str, size_t n, int flags) { const char *p, *ptail, *endpat; const char *s, *stail, *endstr; size_t pinc, sinc, tailcnt=0; int c, k; if (flags & FNM_PERIOD) { if (*str == '.' && *pat != '.') return FNM_NOMATCH; } for (;;) { switch ((c = pat_next(pat, m, &pinc, flags))) { case UNMATCHABLE: return FNM_NOMATCH; case STAR: pat++; m--; break; default: k = str_next(str, n, &sinc); if (k <= 0) return (c==END) ? 0 : FNM_NOMATCH; str += sinc; n -= sinc; if (c == BRACKET) { if (!match_bracket(pat, k)) return FNM_NOMATCH; } else if (c != QUESTION && k != c) { return FNM_NOMATCH; } pat+=pinc; m-=pinc; continue; } break; } /* Compute real pat length if it was initially unknown/-1 */ m = strnlen(pat, m); endpat = pat + m; /* Find the last * in pat and count chars needed after it */ for (p=ptail=pat; p<endpat; p+=pinc) { switch (pat_next(p, endpat-p, &pinc, flags)) { case UNMATCHABLE: return FNM_NOMATCH; case STAR: tailcnt=0; ptail = p+1; break; default: tailcnt++; break; } } /* Past this point we need not check for UNMATCHABLE in pat, * because all of pat has already been parsed once. */ /* Compute real str length if it was initially unknown/-1 */ n = strnlen(str, n); endstr = str + n; if (n < tailcnt) return FNM_NOMATCH; /* Find the final tailcnt chars of str, accounting for UTF-8. * On illegal sequences we may get it wrong, but in that case * we necessarily have a matching failure anyway. */ for (s=endstr; s>str && tailcnt; tailcnt--) { if (s[-1] < 128U) s--; else while ((unsigned char)*--s-0x80U<0x40 && s>str); } if (tailcnt) return FNM_NOMATCH; stail = s; /* Check that the pat and str tails match */ p = ptail; for (;;) { c = pat_next(p, endpat-p, &pinc, flags); p += pinc; if ((k = str_next(s, endstr-s, &sinc)) <= 0) { if (c != END) return FNM_NOMATCH; break; } s += sinc; if (c == BRACKET) { if (!match_bracket(p-pinc, k)) return FNM_NOMATCH; } else if (c != QUESTION && k != c) { return FNM_NOMATCH; } } /* We're all done with the tails now, so throw them out */ endstr = stail; endpat = ptail; /* Match pattern components until there are none left */ while (pat<endpat) { p = pat; s = str; for (;;) { c = pat_next(p, endpat-p, &pinc, flags); p += pinc; /* Encountering * completes/commits a component */ if (c == STAR) { pat = p; str = s; break; } k = str_next(s, endstr-s, &sinc); if (!k) return FNM_NOMATCH; if (c == BRACKET) { if (!match_bracket(p-pinc, k)) break; } else if (c != QUESTION && k != c) { break; } s += sinc; } if (c == STAR) continue; /* If we failed, advance str, by 1 char if it's a valid * char, or past all invalid bytes otherwise. */ k = str_next(str, endstr-str, &sinc); if (k > 0) str += sinc; else for (str++; str_next(str, endstr-str, &sinc)<0; str++); } return 0; }
void find_comments_and_literals(char * orig_buffer, char * buffer, items * Items, int add_literals, int add_comments, int add_backslashes) { int i, n, end; n = strlen(buffer); for (i = 0; i < n;) { switch (buffer[i]) { case '\"': end = match_symbol(buffer, i, '\"'); assert(end > 0); if (add_literals) add_item(Items, i, end - 1, STRING); i = end; break; case '\'': end = match_symbol(buffer, i, '\''); assert(end > 0); if (add_literals) add_item(Items, i, end - 1, LITERAL); i = end; break; case '/': if (buffer[i + 1] == '*') { if (flag_nested_comments) { end = match_bracket(orig_buffer, buffer, n, i, "/*", "*/"); if (end < 0) { printf("No matching closing comment\n"); exit(-1); } if (add_comments) add_item(Items, i, end + 1, COMMENT); i = end + 2; } else { end = matchComment(buffer, i, Items); assert(end > 0); if (add_comments) add_item(Items, i, end - 1, COMMENT); i = end; } } else i++; break; case '\\': if (add_backslashes) add_item(Items, i, i + 1, ESCSEQ); i += 2; break; default: i++; break; } if (i < 0) { printf("Internal error detected\n"); exit(-1); } } }