File: splitbits.cal

package info (click to toggle)
calc 2.15.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 7,848 kB
  • sloc: ansic: 62,147; makefile: 7,664; sh: 503; awk: 74; sed: 7
file content (83 lines) | stat: -rw-r--r-- 2,379 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/*
 * splitbits - split an integer into list on bit boundardies of a fixed size
 *
 * Copyright (C) 2018,2023  Landon Curt Noll
 *
 * Calc is open software; you can redistribute it and/or modify it under
 * the terms of the version 2.1 of the GNU Lesser General Public License
 * as published by the Free Software Foundation.
 *
 * Calc is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General
 * Public License for more details.
 *
 * A copy of version 2.1 of the GNU Lesser General Public License is
 * distributed with calc under the filename COPYING-LGPL.  You should have
 * received a copy with calc; if not, write to Free Software Foundation, Inc.
 * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 *
 * Under source code control:   2006/06/07 14:10:11
 * File existed as early as:    2006
 *
 * chongo <was here> /\oo/\     http://www.isthe.com/chongo/
 * Share and enjoy!  :-)        http://www.isthe.com/chongo/tech/comp/calc/
 */


/*
 * setup splitbits errors
 */
static E_SPLITBITS_1, E_SPLITBITS_2, E_SPLITBITS_3;
if (! iserror(E_SPLITBITS_1)) E_SPLITBITS_1 = newerror("1st argument to splitbits must be an integer");
if (! iserror(E_SPLITBITS_2)) E_SPLITBITS_2 = newerror("2nd argument to splitbits must be an integer");
if (! iserror(E_SPLITBITS_3)) E_SPLITBITS_3 = newerror("2nd argument must be an integer > 0");


/*
 * define splitbits function
 */
define splitbits(x, b)
{
    local ret;          /* list to return */
    local mask;         /* 2^b-1 */
    local x_is_reg = 0; /* true if x < 0 */

    /* firewall */
    if (! isint(x)) {
        return error(E_SPLITBITS_1);
    }
    if (! isint(b)) {
        return error(E_SPLITBITS_2);
    }
    if (b <= 0) {
        return error(E_SPLITBITS_3);
    }

    /* special case: x == 0 */
    if (x == 0) {
        return list(0);
    }

    /* setup for splitting x */
    ret = list();
    mask = 2^b-1;
    if (x < 0) {
        x_is_reg = 1;
        x = abs(x);
    }

    /* split x */
    while (x > 0) {
        printf("%d %x\n", size(ret), x);
        if (x_is_reg) {
            append(ret, xor(x & mask, mask));
        } else {
            append(ret, x & mask);
        }
        x >>= b;
    }

    /* return list */
    return ret;
}