1 /*
2 * (c) Copyright 1990 Conor P. Cahill (uunet!virtech!cpcahil).
3 * You may copy, distribute, and use this software as long as this
4 * copyright statement is not removed.
5 */
6
7 #ifndef lint
8 static
9 char rcs_hdr[] = "$Id: memory.c,v 1.2 2006-07-25 10:09:19 rt Exp $";
10 #endif
11
12 void malloc_check_data();
13
14 char *
memccpy(ptr1,ptr2,ch,len)15 memccpy(ptr1, ptr2, ch, len)
16 register char * ptr1;
17 register char * ptr2;
18 int len;
19 int ch;
20 {
21 int check;
22 register int i;
23 char * rtn;
24
25 /*
26 * I know that the assignment could be done in the following, but
27 * I wanted to perform a check before any assignment, so first I
28 * determine the length, check the pointers and then do the assignment.
29 */
30 for( i=0; (i < len) && (ptr2[i] != ch); i++)
31 {
32 }
33 if( ptr2[i] == ch )
34 {
35 check = i+1;
36 }
37 else
38 {
39 check = len;
40 }
41
42 malloc_check_data("memccpy", ptr1, check);
43 malloc_check_data("memccpy", ptr2, check);
44
45 /*
46 * if we found the character...
47 */
48
49 if( i < len )
50 {
51 rtn = ptr1+i+1;
52 i++;
53 }
54 else
55 {
56 rtn = (char *) 0;
57 }
58
59 while( i-- )
60 {
61 *(ptr1++) = *(ptr2++);
62 }
63
64 return(rtn);
65 }
66
67 char *
memchr(ptr1,ch,len)68 memchr(ptr1,ch,len)
69 register char * ptr1;
70 register int ch;
71 int len;
72 {
73 int i;
74
75 for( i=0; (i < len) && (ptr1[i] != (char) ch); i++)
76 {
77 }
78
79 malloc_check_data("memchr", ptr1, i);
80
81 if( i < len )
82 {
83 return( ptr1+i );
84 }
85 else
86 {
87 return( (char *) 0);
88 }
89 }
90
91 char *
memcpy(ptr1,ptr2,len)92 memcpy(ptr1, ptr2, len)
93 register char * ptr1;
94 register char * ptr2;
95 register int len;
96 {
97 char * rtn = ptr1;
98
99 malloc_check_data("memcpy", ptr1, len);
100 malloc_check_data("memcpy", ptr2, len);
101
102 /*
103 * while the normal memcpy does not guarrantee that it will
104 * handle overlapping memory correctly, we will try...
105 */
106 if( ptr1 > ptr2 && ptr1 < (ptr2+len))
107 {
108 ptr1 += (len-1);
109 ptr2 += (len-1);
110 while( len-- > 0 )
111 {
112 *(ptr1--) = *(ptr2--);
113 }
114 }
115 else
116 {
117 while( len-- > 0 )
118 {
119 *(ptr1++) = *(ptr2++);
120 }
121 }
122
123 return(rtn);
124 }
125
126 int
memcmp(ptr1,ptr2,len)127 memcmp(ptr1, ptr2, len)
128 register char * ptr1;
129 register char * ptr2;
130 register int len;
131 {
132 malloc_check_data("memcpy", ptr1, len);
133 malloc_check_data("memcpy", ptr2, len);
134
135 while( --len >= 0 && (*ptr1 == *ptr2) )
136 {
137 ptr1++;
138 ptr2++;
139 }
140
141 /*
142 * If stopped by len, return zero
143 */
144 if( len < 0 )
145 {
146 return(0);
147 }
148
149 return( *ptr1 - *ptr2 );
150 }
151
152 char *
memset(ptr1,ch,len)153 memset(ptr1, ch, len)
154 register char * ptr1;
155 register int ch;
156 register int len;
157 {
158 char * rtn = ptr1;
159
160 malloc_check_data("memcpy", ptr1, len);
161
162 while( len-- )
163 {
164 *(ptr1++) = ch;
165 }
166
167 return(rtn);
168 }
169
170 char *
bcopy(ptr2,ptr1,len)171 bcopy(ptr2,ptr1,len)
172 char * ptr2;
173 char * ptr1;
174 int len;
175 {
176 return(memcpy(ptr1,ptr2,len));
177 }
178
179 char *
bzero(ptr1,len)180 bzero(ptr1,len)
181 char * ptr1;
182 int len;
183 {
184 return(memset(ptr1,'\0',len));
185 }
186
187 int
bcmp(ptr2,ptr1,len)188 bcmp(ptr2, ptr1, len)
189 char * ptr1;
190 char * ptr2;
191 int len;
192 {
193 return( memcmp(ptr1,ptr2,len) );
194 }
195
196