summaryrefslogtreecommitdiffstats
path: root/lib/ldb/ldb_sqlite3/base160.c
blob: 7ad39f7c2f504f2e6c1b82173d792e001eb35997 (plain)
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/* 
   base160 code used by ldb_sqlite3

   Copyright (C) 2004 Derrell Lipman

   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 3 of the License, or (at your option) any later version.

   This library 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.

   You should have received a copy of the GNU Lesser General Public
   License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/


/*
 * ldb_sqlite3_base160()
 *
 * Convert an integer value to a string containing the base 160 representation
 * of the integer.  We always convert to a string representation that is 4
 * bytes in length, and we always null terminate.
 *
 * Parameters:
 *   val --
 *     The value to be converted
 *
 *   result --
 *     Buffer in which the result is to be placed
 *
 * Returns:
 *   nothing
 */
static unsigned char        base160tab[161] =
{
    48 , 49 , 50 , 51 , 52 , 53 , 54 , 55 , 56 , 57 , /* 0-9 */
    58 , 59 , 65 , 66 , 67 , 68 , 69 , 70 , 71 , 72 , /* : ; A-H */
    73 , 74 , 75 , 76 , 77 , 78 , 79 , 80 , 81 , 82 , /* I-R */
    83 , 84 , 85 , 86 , 87 , 88 , 89 , 90 , 97 , 98 , /* S-Z , a-b */
    99 , 100, 101, 102, 103, 104, 105, 106, 107, 108, /* c-l */
    109, 110, 111, 112, 113, 114, 115, 116, 117, 118, /* m-v */
    119, 120, 121, 122, 160, 161, 162, 163, 164, 165, /* w-z, latin1 */
    166, 167, 168, 169, 170, 171, 172, 173, 174, 175, /* latin1 */
    176, 177, 178, 179, 180, 181, 182, 183, 184, 185, /* latin1 */
    186, 187, 188, 189, 190, 191, 192, 193, 194, 195, /* latin1 */
    196, 197, 198, 199, 200, 201, 202, 203, 204, 205, /* latin1 */
    206, 207, 208, 209, 210, 211, 212, 213, 214, 215, /* latin1 */
    216, 217, 218, 219, 220, 221, 222, 223, 224, 225, /* latin1 */
    226, 227, 228, 229, 230, 231, 232, 233, 234, 235, /* latin1 */
    236, 237, 238, 239, 240, 241, 242, 243, 244, 245, /* latin1 */
    246, 247, 248, 249, 250, 251, 252, 253, 254, 255, /* latin1 */
    '\0'
};


/*
 * lsqlite3_base160()
 *
 * Convert an unsigned long integer into a base160 representation of the
 * number.
 *
 * Parameters:
 *   val --
 *     value to be converted
 *
 *   result --
 *     character array, 5 bytes long, into which the base160 representation
 *     will be placed.  The result will be a four-digit representation of the
 *     number (with leading zeros prepended as necessary), and null
 *     terminated.
 *
 * Returns:
 *   Nothing
 */
void
lsqlite3_base160(unsigned long val,
                 unsigned char result[5])
{
    int             i;

    for (i = 3; i >= 0; i--) {
        
        result[i] = base160tab[val % 160];
        val /= 160;
    }

    result[4] = '\0';
}


/*
 * lsqlite3_base160Next()
 *
 * Retrieve the next-greater number in the base160 sequence for the terminal
 * tree node (the last four digits).  Only one tree level (four digits) are
 * operated on.
 *
 * Parameters:
 *   base160 -- a character array containing either an empty string (in which
 *              case no operation is performed), or a string of base160 digits
 *              with a length of a multiple of four digits.
 *
 *              Upon return, the trailing four digits (one tree level) will
 *              have been incremented by 1.
 *
 * Returns:
 *   base160 -- the modified array
 */
char *
lsqlite3_base160Next(char base160[])
{
    int             i;
    int             len;
    unsigned char * pTab;
    char *          pBase160 = base160;

    /*
     * We need a minimum of four digits, and we will always get a multiple of
     * four digits.
     */
    if ((len = strlen(pBase160)) >= 4)
    {
        pBase160 += strlen(pBase160) - 1;

        /* We only carry through four digits: one level in the tree */
        for (i = 0; i < 4; i++) {

            /* What base160 value does this digit have? */
            pTab = strchr(base160tab, *pBase160);

            /* Is there a carry? */
            if (pTab < base160tab + sizeof(base160tab) - 1) {

                /* Nope.  Just increment this value and we're done. */
                *pBase160 = *++pTab;
                break;
            } else {

                /*
                 * There's a carry.  This value gets base160tab[0], we
                 * decrement the buffer pointer to get the next higher-order
                 * digit, and continue in the loop.
                 */
                *pBase160-- = base160tab[0];
            }
        }
    }

    return base160;
}