78 lines
2.4 KiB
C
78 lines
2.4 KiB
C
|
/***************************************************************************
|
||
|
* __________ __ ___.
|
||
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||
|
* \/ \/ \/ \/ \/
|
||
|
* $Id$
|
||
|
*
|
||
|
* Copyright (C) 2006 by Michael Sevakis
|
||
|
*
|
||
|
* All files in this archive are subject to the GNU General Public License.
|
||
|
* See the file COPYING in the source tree root for full license agreement.
|
||
|
*
|
||
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||
|
* KIND, either express or implied.
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
#include <limits.h>
|
||
|
#include "config.h"
|
||
|
#include "general.h"
|
||
|
|
||
|
int round_value_to_list32(unsigned long value,
|
||
|
const unsigned long list[],
|
||
|
int count,
|
||
|
bool signd)
|
||
|
{
|
||
|
unsigned long dmin = ULONG_MAX;
|
||
|
int idmin = -1, i;
|
||
|
|
||
|
for (i = 0; i < count; i++)
|
||
|
{
|
||
|
unsigned long diff;
|
||
|
|
||
|
if (list[i] == value)
|
||
|
{
|
||
|
idmin = i;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (signd ? ((long)list[i] < (long)value) : (list[i] < value))
|
||
|
diff = value - list[i];
|
||
|
else
|
||
|
diff = list[i] - value;
|
||
|
|
||
|
if (diff < dmin)
|
||
|
{
|
||
|
dmin = diff;
|
||
|
idmin = i;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return idmin;
|
||
|
} /* round_value_to_list32 */
|
||
|
|
||
|
/* Number of bits set in src_mask should equal src_list length */
|
||
|
int make_list_from_caps32(unsigned long src_mask,
|
||
|
const unsigned long *src_list,
|
||
|
unsigned long caps_mask,
|
||
|
unsigned long *caps_list)
|
||
|
{
|
||
|
int i, count;
|
||
|
unsigned long mask;
|
||
|
|
||
|
for (mask = src_mask, count = 0, i = 0;
|
||
|
mask != 0;
|
||
|
src_mask = mask, i++)
|
||
|
{
|
||
|
unsigned long test_bit;
|
||
|
mask &= mask - 1; /* Zero lowest bit set */
|
||
|
test_bit = mask ^ src_mask; /* Isolate the bit */
|
||
|
if (test_bit & caps_mask) /* Add item if caps has test bit set */
|
||
|
caps_list[count++] = src_list ? src_list[i] : (unsigned long)i;
|
||
|
}
|
||
|
|
||
|
return count;
|
||
|
} /* make_list_from_caps32 */
|