148760Sbostic /*-
2*62364Sbostic  * Copyright (c) 1988, 1993
3*62364Sbostic  *	The Regents of the University of California.  All rights reserved.
430014Sminshall  *
548760Sbostic  * %sccs.include.redist.c%
630014Sminshall  */
730014Sminshall 
833815Sbostic #ifndef lint
9*62364Sbostic static char sccsid[] = "@(#)genbsubs.c	8.1 (Berkeley) 06/06/93";
1033815Sbostic #endif /* not lint */
1130014Sminshall 
1230014Sminshall /* The output of bunequal is the offset of the byte which didn't match;
1330014Sminshall  * if all the bytes match, then we return n.
1430014Sminshall  * bunequal(s1, s2, n) */
1530014Sminshall 
1630014Sminshall int
bunequal(s1,s2,n)1730014Sminshall bunequal(s1, s2, n)
1830014Sminshall register char *s1, *s2;
1930014Sminshall register n;
2030014Sminshall {
2130014Sminshall     register int i = 0;
2230014Sminshall 
2330014Sminshall     while (i++ < n) {
2430014Sminshall 	if (*s1++ != *s2++) {
2530014Sminshall 	    break;
2630014Sminshall 	}
2730014Sminshall     }
2830014Sminshall     return(i-1);
2930014Sminshall }
3030014Sminshall 
3130014Sminshall /* bskip(s1, n, b) : finds the first occurrence of any byte != 'b' in the 'n'
3230014Sminshall  * bytes beginning at 's1'.
3330014Sminshall  */
3430014Sminshall 
3530014Sminshall int
bskip(s1,n,b)3630014Sminshall bskip(s1, n, b)
3730014Sminshall register char *s1;
3830014Sminshall register int n;
3930014Sminshall register int b;
4030014Sminshall {
4130014Sminshall     register int i = 0;
4230014Sminshall 
4330014Sminshall     while (i++ < n) {
4430014Sminshall 	if (*s1++ != b) {
4530014Sminshall 	    break;
4630014Sminshall 	}
4730014Sminshall     }
4830014Sminshall     return(i-1);
4930014Sminshall }
5031067Sminshall 
5131067Sminshall /*
5231070Sminshall  * memNSchr(const void *s, int c, size_t n, int and)
5331067Sminshall  *
5431067Sminshall  * Like memchr, but the comparison is '((*s)&and) == c',
5531067Sminshall  * and we increment our way through s by "stride" ('s += stride').
5631067Sminshall  *
5731067Sminshall  * We optimize for the most used strides of +1 and -1.
5831067Sminshall  */
5931067Sminshall 
6031067Sminshall unsigned char *
memNSchr(s,c,n,and,stride)6131067Sminshall memNSchr(s, c, n, and, stride)
6231067Sminshall char *s;
6331067Sminshall int c;
6431067Sminshall unsigned int n;
6531067Sminshall int and;
6631067Sminshall int stride;
6731067Sminshall {
6831067Sminshall     register unsigned char _c, *_s, _and;
6931067Sminshall 
7031067Sminshall     _and = and;
7131067Sminshall     _c = (c&_and);
7231067Sminshall     _s = (unsigned char *)s;
7331067Sminshall     switch (stride) {
7431067Sminshall     case 1:
7531067Sminshall 	while (n--) {
7631067Sminshall 	    if (((*_s)&_and) == _c) {
7731067Sminshall 		return _s;
7831067Sminshall 	    }
7931067Sminshall 	    _s++;
8031067Sminshall 	}
8131067Sminshall 	break;
8231067Sminshall     case -1:
8331067Sminshall 	while (n--) {
8431067Sminshall 	    if (((*_s)&_and) == _c) {
8531067Sminshall 		return _s;
8631067Sminshall 	    }
8731067Sminshall 	    _s--;
8831067Sminshall 	}
8931067Sminshall 	break;
9031067Sminshall     default:
9131067Sminshall 	while (n--) {
9231067Sminshall 	    if (((*_s)&_and) == _c) {
9331067Sminshall 		return _s;
9431067Sminshall 	    }
9531067Sminshall 	    _s += stride;
9631067Sminshall 	}
9731067Sminshall     }
9831067Sminshall     return 0;
9931067Sminshall }
100