53 lines
1.3 KiB
C
53 lines
1.3 KiB
C
|
/****************************************************************
|
||
|
* *
|
||
|
* Copyright 2001 Sanchez Computer Associates, Inc. *
|
||
|
* *
|
||
|
* This source code contains the intellectual property *
|
||
|
* of its copyright holder(s), and is made available *
|
||
|
* under a license. If you do not know the terms of *
|
||
|
* the license, please stop and do not read further. *
|
||
|
* *
|
||
|
****************************************************************/
|
||
|
|
||
|
#include "mdef.h"
|
||
|
#include "gtm_ffs.h"
|
||
|
|
||
|
#define BITS_PER_UCHAR 8
|
||
|
|
||
|
int gtm_ffs (uint4 offset, uchar_ptr_t addr, uint4 size)
|
||
|
{
|
||
|
uchar_ptr_t c;
|
||
|
int i, j, top;
|
||
|
|
||
|
c = addr + (offset / BITS_PER_UCHAR);
|
||
|
if (i = (offset & (BITS_PER_UCHAR - 1)))
|
||
|
{ /* partial byte starting at offset */
|
||
|
for (j = 0; (i < BITS_PER_UCHAR) && (j < size); j++, i++)
|
||
|
{
|
||
|
if (*c & (1 << i))
|
||
|
return (offset + j);
|
||
|
}
|
||
|
c++;
|
||
|
}
|
||
|
assert(c == (addr + (offset + BITS_PER_UCHAR - 1) / BITS_PER_UCHAR));
|
||
|
for (i = ROUND_UP2(offset, BITS_PER_UCHAR), top = ROUND_DOWN2(size + offset, BITS_PER_UCHAR); i < top;
|
||
|
c++, i += BITS_PER_UCHAR)
|
||
|
{ /* full bytes offset to end */
|
||
|
if (*c)
|
||
|
{
|
||
|
for (j = 0; j < BITS_PER_UCHAR; j++)
|
||
|
{
|
||
|
if (*c & (1 << j))
|
||
|
return (i + j);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
for (j = 0, top = size + offset; i < top; j++, i++)
|
||
|
{ /* partial byte at end */
|
||
|
assert(j < BITS_PER_UCHAR);
|
||
|
if (*c & (1 << j))
|
||
|
return i;
|
||
|
}
|
||
|
return -1;
|
||
|
}
|