|
|
1.1 root 1: /*
2: * Copyright (c) 1988 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: */
17:
18: #ifndef lint
19: static char sccsid[] = "@(#)genbsubs.c 4.1 (Berkeley) 12/4/88";
20: #endif /* not lint */
21:
22: /* The output of bunequal is the offset of the byte which didn't match;
23: * if all the bytes match, then we return n.
24: * bunequal(s1, s2, n) */
25:
26: int
27: bunequal(s1, s2, n)
28: register char *s1, *s2;
29: register n;
30: {
31: register int i = 0;
32:
33: while (i++ < n) {
34: if (*s1++ != *s2++) {
35: break;
36: }
37: }
38: return(i-1);
39: }
40:
41: /* bskip(s1, n, b) : finds the first occurrence of any byte != 'b' in the 'n'
42: * bytes beginning at 's1'.
43: */
44:
45: int
46: bskip(s1, n, b)
47: register char *s1;
48: register int n;
49: register int b;
50: {
51: register int i = 0;
52:
53: while (i++ < n) {
54: if (*s1++ != b) {
55: break;
56: }
57: }
58: return(i-1);
59: }
60:
61: /*
62: * memNSchr(const void *s, int c, size_t n, int and)
63: *
64: * Like memchr, but the comparison is '((*s)&and) == c',
65: * and we increment our way through s by "stride" ('s += stride').
66: *
67: * We optimize for the most used strides of +1 and -1.
68: */
69:
70: unsigned char *
71: memNSchr(s, c, n, and, stride)
72: char *s;
73: int c;
74: unsigned int n;
75: int and;
76: int stride;
77: {
78: register unsigned char _c, *_s, _and;
79:
80: _and = and;
81: _c = (c&_and);
82: _s = (unsigned char *)s;
83: switch (stride) {
84: case 1:
85: while (n--) {
86: if (((*_s)&_and) == _c) {
87: return _s;
88: }
89: _s++;
90: }
91: break;
92: case -1:
93: while (n--) {
94: if (((*_s)&_and) == _c) {
95: return _s;
96: }
97: _s--;
98: }
99: break;
100: default:
101: while (n--) {
102: if (((*_s)&_and) == _c) {
103: return _s;
104: }
105: _s += stride;
106: }
107: }
108: return 0;
109: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.