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