/* mem.c - array-of-byte functions
*
****************************************************************
* Copyright (C) 1998, 2000 Thomas Lord
*
* See the file "COPYING" for further information about
* the copyright and warranty status of this work.
*/
#include "hackerlab/mem/mem.h"
/************************************************************************
*(h1 "Array-of-Byte Functions"
* :includes ("hackerlab/mem/mem.h"))
*
* These functions operate on regions of memory as arrays of unsigned
* bytes with no further interpretation.
*/
/*(c mem_set)
* void mem_set (t_uchar * mem, unsigned int c, size_t size);
*
* Store `size' bytes of value `c' beginning at `mem'.
*/
void
mem_set (void * mem_v, unsigned int c, size_t size)
{
t_uchar *mem = (t_uchar *) mem_v;
while (size--)
*(mem++) = c;
}
/*(c mem_set0)
* void mem_set0 (t_uchar * mem, size_t n);
*
* Store `n' 0 bytes beginning at `mem'.
*/
void
mem_set0 (void * mem_v, size_t n)
{
t_uchar *mem = (t_uchar *) mem_v;
while (n--)
*(mem++) = 0;
}
/*(c mem_move)
* void mem_move (t_uchar * to, const t_uchar * from, size_t amt);
*
* Copy `amt' bytes from `from' to `to'. The source and destination
* regions may overlap.
*/
void
mem_move (void * to_v, void const * from_v, size_t amt)
{
t_uchar * to = (t_uchar *) to_v;
t_uchar const * from = (t_uchar *) from_v;
if (from == to)
return;
if (from > to)
{
while (amt--)
*to++ = *from++;
}
else
{
to += amt - 1;
from += amt - 1;
while (amt--)
*to-- = *from--;
}
}
/*(c mem_cpy)
* void mem_cpy (void * to, const void * from, size_t amt);
*
* Copy `amt' bytes from `from' to `to'. The source and destination
* regions may not overlap.
*/
void
mem_cpy (void * to, const void * from, size_t amt)
{
if (from == to)
return;
while (amt--)
*(char *)to++ = *(char const *)from++;
}
/*(c mem_cmp)
* int mem_cmp (const t_uchar * m1, const t_uchar * m2, size_t amt);
*
* Compare `amt' bytes starting at `m1' and `m2'. If a difference is
* found, immediately return -1 if the differing byte in `m1' is less
* than the byte in `m2', 1 otherwise. If no difference is found,
* return 0.
*/
int
mem_cmp (void const * m1, void const * m2, size_t amt)
{
while (amt--)
if (*(char const *)m1++ != *(char const *)m2++)
{
--m1;
--m2;
return (*(char const *)m1 < *(char const *)m2) ? -1 : 1;
}
return 0;
}
/*(c mem_occurrences)
* size_t mem_occurrences (const t_uchar * mem,
* unsigned int c,
* size_t size);
*
* Search `size' bytes of data for occurences of byte `c' beginning at
* `mem'. Return the number of occurences found.
*/
size_t
mem_occurrences (const t_uchar * mem,
unsigned int c,
size_t size)
{
size_t x;
x = 0;
while (size--)
if (*mem++ == c)
++x;
return x;
}
syntax highlighted by Code2HTML, v. 0.9.1