172 |
|
char *op; |
173 |
|
unsigned n; |
174 |
|
{ |
175 |
– |
extern char *memcpy(); |
175 |
|
register char *p; |
176 |
|
register unsigned on; |
177 |
|
|
178 |
< |
free(op); /* free it first */ |
179 |
< |
p = malloc(n); /* p==op if same bucket */ |
180 |
< |
if (p == NULL) |
181 |
< |
return(NULL); |
182 |
< |
if (p != op) /* different bucket, do copy */ |
178 |
> |
if (op != NULL) |
179 |
> |
on = 1 << ((M_HEAD *)op-1)->bucket; |
180 |
> |
else |
181 |
> |
on = 0; |
182 |
> |
if (n <= on && n > on>>1) |
183 |
> |
return(op); /* same bucket */ |
184 |
> |
p = malloc(n); |
185 |
> |
if (p != NULL) |
186 |
|
#ifdef BSD |
187 |
|
bcopy(op, p, n>on ? on : n); |
188 |
|
#else |
189 |
|
(void)memcpy(p, op, n>on ? on : n); |
190 |
|
#endif |
191 |
+ |
free(op); |
192 |
|
return(p); |
193 |
|
} |
194 |
|
|