Subversion Repositories HelenOS

Rev

Rev 3728 | Rev 3730 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3728 Rev 3729
Line 187... Line 187...
187
        *dstb++ = *srcb++;
187
        *dstb++ = *srcb++;
188
 
188
 
189
    return dst;
189
    return dst;
190
}
190
}
191
 
191
 
-
 
192
/** Move memory block with possible overlapping. */
192
void *memmove(void *dst, const void *src, size_t n)
193
void *memmove(void *dst, const void *src, size_t n)
193
{
194
{
194
    int i, j;
195
    uint8_t *dp, *sp;
195
   
196
 
-
 
197
    /* Nothing to do? */
196
    if (src > dst)
198
    if (src == dst)
-
 
199
        return dst;
-
 
200
 
-
 
201
    /* Non-overlapping? */
-
 
202
    if (dst >= src + n || src >= dst + n) {
197
        return memcpy(dst, src, n);
203
        return memcpy(dst, src, n);
-
 
204
    }
-
 
205
 
-
 
206
    /* Which direction? */
-
 
207
    if (src > dst) {
-
 
208
        /* Forwards. */
-
 
209
        sp = src;
-
 
210
        dp = dst;
198
 
211
 
199
    for (j = (n % sizeof(unsigned long)) - 1; j >= 0; j--)
212
        while (n-- != 0)
-
 
213
            *dp++ = *sp++;
-
 
214
    } else {
-
 
215
        /* Backwards. */
200
        ((unsigned char *) ((unsigned long *) dst))[j] =
216
        sp = src + (n - 1);
201
            ((unsigned char *) ((unsigned long *) src))[j];
217
        dp = dst + (n - 1);
202
 
218
 
203
    for (i = n / sizeof(unsigned long) - 1; i >=0 ; i--)
219
        while (n-- != 0)
204
        ((unsigned long *) dst)[i] = ((unsigned long *) src)[i];
220
            *dp-- = *sp--;
205
       
221
    }
-
 
222
 
206
    return (char *) dst;
223
    return dst;
207
}
224
}
208
 
225
 
209
/** Compare two memory areas.
226
/** Compare two memory areas.
210
 *
227
 *
211
 * @param s1        Pointer to the first area to compare.
228
 * @param s1        Pointer to the first area to compare.