This is match.c in view mode; [Download] [Up]
/* * (c) Copyright 1990, Kim Fabricius Storm. All rights reserved. * * String/Subject matching routines. */ #include "config.h" #include "regexp.h" export int case_fold_search = 1; #define MAXFOLD 256 /* max length of any string */ /* * Systems which have a tolower(c) function which is defined for * all characters, but no _tolower(c) macro which works for * isupper(c) only, may define HAVE_GENERIC_TOLOWER -- it * may give a slight speed-up, but is not mandatory. */ #ifndef HAVE_GENERIC_TOLOWER #ifndef _tolower #define _tolower(c) tolower(c) #endif #endif fold_string(mask) /* convert mask to lower-case */ register char *mask; { register char c; for ( ; c = *mask; mask++) { #ifdef _tolower if (!isascii(c) || !isupper(c)) continue; *mask = _tolower(c); #else *mask = tolower(c); #endif } } streq_fold(mask, str) /* mask is prefix of str - FOLD */ register char *mask, *str; { register char c, d; while (d = *mask++) { if ((c = *str++) == NUL) return 0; if (c == d) continue; #ifdef _tolower if (!isascii(c) || !isupper(c) || _tolower(c) != d) return 0; #else if (tolower(c) != d) return 0; #endif } return c == NUL ? 1 : 2; } strmatch_fold(mask, str) /* mask occurs anywhere in str - FOLD */ char *mask; register char *str; { register char c, m1 = *mask++; for (;;) { while (c = *str++) { /* find first occ. of mask[0] in str. */ if (c == m1) break; #ifdef _tolower if (!isascii(c) || !isupper(c)) continue; if (_tolower(c) == m1) break; #else if (tolower(c) == m1) break; #endif } if (c == NUL) return 0; if (streq_fold(mask, str)) return 1; } } strmatch(mask, str) /* mask occurs anywhere in str - CASE */ char *mask; register char *str; { register char *q, *m; register char m1 = *mask; for (; *str; str++) { if (*str != m1) continue; q = str; m = mask; do if (*++m == NUL) return 1; while (*++q == *m); } return 0; } strmatch_cf(mask, str) /* fold if case_fold_search is set */ char *mask; char *str; { if (case_fold_search) return strmatch_fold(mask, str); return strmatch(mask, str); } /* * case insensitive regexp matching */ int regexec_fold(prog, string) register regexp *prog; char *string; { char buf[256]; register char c, *bp, *str, *maxb; bp = buf, maxb = &buf[255]; str = string; while (bp < maxb && (c = *str++) != NUL) #ifdef _tolower *bp++ = (!isascii(c) || !isupper(c)) ? c : _tolower(c); #else *bp++ = tolower(c); #endif *bp = NUL; if (!regexec(prog, buf)) return 0; prog->startp[0] = string + (prog->startp[0] - buf); prog->endp[0] = string + (prog->endp[0] - buf); return 1; } int regexec_cf(prog, string) register regexp *prog; char *string; { if (case_fold_search) return regexec_fold(prog, string); return regexec(prog, string); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.