130014Sminshall /*
230014Sminshall  *	Copyright (c) 1984, 1985, 1986 by the Regents of the
330014Sminshall  *	University of California and by Gregory Glenn Minshall.
430014Sminshall  *
530014Sminshall  *	Permission to use, copy, modify, and distribute these
630014Sminshall  *	programs and their documentation for any purpose and
730014Sminshall  *	without fee is hereby granted, provided that this
830014Sminshall  *	copyright and permission appear on all copies and
930014Sminshall  *	supporting documentation, the name of the Regents of
1030014Sminshall  *	the University of California not be used in advertising
1130014Sminshall  *	or publicity pertaining to distribution of the programs
1230014Sminshall  *	without specific prior permission, and notice be given in
1330014Sminshall  *	supporting documentation that copying and distribution is
1430014Sminshall  *	by permission of the Regents of the University of California
1530014Sminshall  *	and by Gregory Glenn Minshall.  Neither the Regents of the
1630014Sminshall  *	University of California nor Gregory Glenn Minshall make
1730014Sminshall  *	representations about the suitability of this software
1830014Sminshall  *	for any purpose.  It is provided "as is" without
1930014Sminshall  *	express or implied warranty.
2030014Sminshall  */
2130014Sminshall 
2230014Sminshall #ifndef	lint
2330014Sminshall static	char	sccsid[] = "@(#)genbsubs.c	3.1  10/29/86";
2430014Sminshall #endif	/* ndef lint */
2530014Sminshall 
2630014Sminshall /* The output of bunequal is the offset of the byte which didn't match;
2730014Sminshall  * if all the bytes match, then we return n.
2830014Sminshall  * bunequal(s1, s2, n) */
2930014Sminshall 
3030014Sminshall int
3130014Sminshall bunequal(s1, s2, n)
3230014Sminshall register char *s1, *s2;
3330014Sminshall register n;
3430014Sminshall {
3530014Sminshall     register int i = 0;
3630014Sminshall 
3730014Sminshall     while (i++ < n) {
3830014Sminshall 	if (*s1++ != *s2++) {
3930014Sminshall 	    break;
4030014Sminshall 	}
4130014Sminshall     }
4230014Sminshall     return(i-1);
4330014Sminshall }
4430014Sminshall 
4530014Sminshall /* bskip(s1, n, b) : finds the first occurrence of any byte != 'b' in the 'n'
4630014Sminshall  * bytes beginning at 's1'.
4730014Sminshall  */
4830014Sminshall 
4930014Sminshall int
5030014Sminshall bskip(s1, n, b)
5130014Sminshall register char *s1;
5230014Sminshall register int n;
5330014Sminshall register int b;
5430014Sminshall {
5530014Sminshall     register int i = 0;
5630014Sminshall 
5730014Sminshall     while (i++ < n) {
5830014Sminshall 	if (*s1++ != b) {
5930014Sminshall 	    break;
6030014Sminshall 	}
6130014Sminshall     }
6230014Sminshall     return(i-1);
6330014Sminshall }
64*31067Sminshall 
65*31067Sminshall /*
66*31067Sminshall  * memNIchr(const void *s, int c, size_t n, int and)
67*31067Sminshall  *
68*31067Sminshall  * Like memchr, but the comparison is '((*s)&and) == c'.
69*31067Sminshall  *
70*31067Sminshall  */
71*31067Sminshall 
72*31067Sminshall unsigned char *
73*31067Sminshall memNIchr(s, c, n, and)
74*31067Sminshall char *s;
75*31067Sminshall int c;
76*31067Sminshall unsigned int n;
77*31067Sminshall int and;
78*31067Sminshall {
79*31067Sminshall     register unsigned char _c, *_s, _and;
80*31067Sminshall 
81*31067Sminshall     _and = and;
82*31067Sminshall     _c = (c&_and);
83*31067Sminshall     _s = (unsigned char *)s;
84*31067Sminshall     while (n--) {
85*31067Sminshall 	if (((*_s)&_and) == _c) {
86*31067Sminshall 	    return _s;
87*31067Sminshall 	}
88*31067Sminshall 	_s++;
89*31067Sminshall     }
90*31067Sminshall     return 0;
91*31067Sminshall }
92*31067Sminshall 
93*31067Sminshall /*
94*31067Sminshall  * memNDchr(const void *s, int c, size_t n, int and)
95*31067Sminshall  *
96*31067Sminshall  * Like memchr, but the comparison is '((*s)&and) == c',
97*31067Sminshall  * and we increment our way through s by "stride" ('s += stride').
98*31067Sminshall  *
99*31067Sminshall  * We optimize for the most used strides of +1 and -1.
100*31067Sminshall  */
101*31067Sminshall 
102*31067Sminshall unsigned char *
103*31067Sminshall memNSchr(s, c, n, and, stride)
104*31067Sminshall char *s;
105*31067Sminshall int c;
106*31067Sminshall unsigned int n;
107*31067Sminshall int and;
108*31067Sminshall int stride;
109*31067Sminshall {
110*31067Sminshall     register unsigned char _c, *_s, _and;
111*31067Sminshall 
112*31067Sminshall     _and = and;
113*31067Sminshall     _c = (c&_and);
114*31067Sminshall     _s = (unsigned char *)s;
115*31067Sminshall     switch (stride) {
116*31067Sminshall     case 1:
117*31067Sminshall 	while (n--) {
118*31067Sminshall 	    if (((*_s)&_and) == _c) {
119*31067Sminshall 		return _s;
120*31067Sminshall 	    }
121*31067Sminshall 	    _s++;
122*31067Sminshall 	}
123*31067Sminshall 	break;
124*31067Sminshall     case -1:
125*31067Sminshall 	while (n--) {
126*31067Sminshall 	    if (((*_s)&_and) == _c) {
127*31067Sminshall 		return _s;
128*31067Sminshall 	    }
129*31067Sminshall 	    _s--;
130*31067Sminshall 	}
131*31067Sminshall 	break;
132*31067Sminshall     default:
133*31067Sminshall 	while (n--) {
134*31067Sminshall 	    if (((*_s)&_and) == _c) {
135*31067Sminshall 		return _s;
136*31067Sminshall 	    }
137*31067Sminshall 	    _s += stride;
138*31067Sminshall 	}
139*31067Sminshall     }
140*31067Sminshall     return 0;
141*31067Sminshall }
142