diff options
Diffstat (limited to 'firmware/general.c')
-rw-r--r-- | firmware/general.c | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/firmware/general.c b/firmware/general.c new file mode 100644 index 0000000000..7f4348046c --- /dev/null +++ b/firmware/general.c @@ -0,0 +1,77 @@ +/*************************************************************************** + * __________ __ ___. + * 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 */ |