1 |
/* |
2 |
* ircd-hybrid: an advanced Internet Relay Chat Daemon(ircd). |
3 |
* |
4 |
* Copyright (C) 2000 Kevin L. Mitchell <klmitch@mit.edu> |
5 |
* Copyright (C) 2013 by the Hybrid Development Team. |
6 |
* |
7 |
* This program is free software; you can redistribute it and/or modify |
8 |
* it under the terms of the GNU General Public License as published by |
9 |
* the Free Software Foundation; either version 2 of the License, or |
10 |
* (at your option) any later version. |
11 |
* |
12 |
* This program is distributed in the hope that it will be useful, |
13 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 |
* GNU General Public License for more details. |
16 |
* |
17 |
* You should have received a copy of the GNU General Public License |
18 |
* along with this program; if not, write to the Free Software |
19 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 |
20 |
* USA |
21 |
*/ |
22 |
|
23 |
/*! \file xsnprintf.c |
24 |
* \brief IRC-specific printf() clone implementation. |
25 |
* \version $Id: xsnprintf.c 2386 2013-07-06 20:47:09Z michael $ |
26 |
*/ |
27 |
|
28 |
#include "stdinc.h" |
29 |
#include "client.h" |
30 |
#include "channel.h" |
31 |
#include "log.h" |
32 |
#include "xsnprintf.h" |
33 |
|
34 |
|
35 |
/* Inhibit complaints when we use GCC extensions */ |
36 |
#if defined(__GNUC__) && SIZEOF_LONG_LONG |
37 |
# define EXTENSION __extension__ |
38 |
#else |
39 |
/** Fallback (empty) definition of EXTENSION. */ |
40 |
# define EXTENSION |
41 |
#endif |
42 |
|
43 |
/* Find the largest type */ |
44 |
#if SIZEOF_LONG_LONG |
45 |
EXTENSION typedef long long _large_t; |
46 |
EXTENSION typedef unsigned long long _ularge_t; |
47 |
# define SIZEOF__LARGE_T SIZEOF_LONG_LONG |
48 |
/* Oh, if long long happens to be the size of void *, set _pointer_t, too */ |
49 |
# if SIZEOF_LONG_LONG == SIZEOF_VOID_P |
50 |
typedef _ularge_t _pointer_t; |
51 |
# define HAVE_POINTER_T |
52 |
# endif |
53 |
#else |
54 |
/** Fallback definition of the largest integer type. */ |
55 |
typedef long _large_t; |
56 |
/** Fallback definition of the largest unsigned integer type. */ |
57 |
typedef unsigned long _ularge_t; |
58 |
/** Fallback definition of SIZEOF__LARGE_T. */ |
59 |
# define SIZEOF__LARGE_T SIZEOF_LONG |
60 |
#endif |
61 |
|
62 |
/* Select something for _pointer_t */ |
63 |
#ifndef HAVE_POINTER_T |
64 |
# if SIZEOF_LONG == SIZEOF_VOID_P |
65 |
/** Unsigned integer type large enough to hold a pointer. */ |
66 |
typedef unsigned long _pointer_t; |
67 |
# elif SIZEOF_INT == SIZEOF_VOID_P |
68 |
typedef unsigned int _pointer_t; |
69 |
# else |
70 |
# error Unable to find a suitable type for _pointer_t |
71 |
# endif |
72 |
#endif /* HAVE_POINTER_T */ |
73 |
|
74 |
/** rough length sufficient to hold an octal number, since those can be large */ |
75 |
#define INTBUF_LEN (SIZEOF__LARGE_T * 3) |
76 |
|
77 |
/** Return minimum of \a i1 and \a i2. */ |
78 |
#define SNP_MIN(i1, i2) ((i1) < (i2) ? (i1) : (i2)) |
79 |
/** Return maximum of \a i1 and \a i2. */ |
80 |
#define SNP_MAX(i1, i2) ((i1) > (i2) ? (i1) : (i2)) |
81 |
/** Indicate total number of bytes "pseudo-output" in buffer. */ |
82 |
#define TOTAL(buf_p) ((buf_p)->buf_loc + SNP_MAX((buf_p)->buf_overflow, (buf_p)->overflow)) |
83 |
|
84 |
#define WIDTH_MAX 999 /**< keep from overflowing width */ |
85 |
|
86 |
/** data about the output buffer */ |
87 |
struct BufData { |
88 |
char *buf; /**< pointer to buffer */ |
89 |
size_t buf_size; /**< maximum size of buffer */ |
90 |
size_t buf_overflow; /**< how much buffer has been overflowed */ |
91 |
size_t buf_loc; /**< where we are in the buffer */ |
92 |
short limit; /**< max # of chars to convert */ |
93 |
size_t overflow; /**< how much we overflowed the limit */ |
94 |
}; |
95 |
|
96 |
/** initializer for BufData */ |
97 |
#define BUFDATA_INIT { 0, 0, 0, 0, 0, 0 } |
98 |
|
99 |
/** data about format fields */ |
100 |
struct FieldData |
101 |
{ |
102 |
unsigned int flags; /**< flags describing argument */ |
103 |
short base; /**< base for integer conversions */ |
104 |
short width; /**< width of field */ |
105 |
short prec; /**< precision of field */ |
106 |
|
107 |
union |
108 |
{ |
109 |
_ularge_t v_int; /**< an integer value */ |
110 |
long double v_float; /**< a floating point value -- NOT SUPPORTED */ |
111 |
void *v_ptr; /**< a pointer value */ |
112 |
} value; /**< value of a field */ |
113 |
}; |
114 |
|
115 |
/** initializer for FieldData */ |
116 |
#define FIELDDATA_INIT { 0, 0, 0, 0, { 0 } } |
117 |
|
118 |
/* Specifier flags */ |
119 |
#define FLAG_MINUS 0x00000001 /**< found a '-' flag */ |
120 |
#define FLAG_PLUS 0x00000002 /**< found a '+' flag */ |
121 |
#define FLAG_SPACE 0x00000004 /**< found a ' ' flag */ |
122 |
#define FLAG_ALT 0x00000008 /**< found a '#' flag */ |
123 |
#define FLAG_ZERO 0x00000010 /**< found a '0' flag */ |
124 |
#define FLAG_COLON 0x00000020 /**< found a ':' flag */ |
125 |
|
126 |
#define FLAG_RESERVED1 0x00000040 /**< reserved for future expansion */ |
127 |
#define FLAG_RESERVED0 0x00000080 /**< reserved for future expansion */ |
128 |
|
129 |
/* integer types */ |
130 |
#define TYPE_CHAR 0x00000100 /**< number is a char */ |
131 |
#define TYPE_SHORT 0x00000200 /**< number is a short */ |
132 |
#define TYPE_LONG 0x00000400 /**< number is a long */ |
133 |
#define TYPE_QUAD 0x00000800 /**< number is a quad */ |
134 |
|
135 |
/* special integer types */ |
136 |
#define TYPE_INTMAX 0x00001000 /**< number is an intmax_t */ |
137 |
#define TYPE_PTRDIFF 0x00002000 /**< number is a ptrdiff_t */ |
138 |
#define TYPE_SIZE 0x00004000 /**< number is a size_t */ |
139 |
#define TYPE_TIME 0x00008000 /**< number is a time_t */ |
140 |
#define TYPE_POINTER 0x00010000 /**< number is a pointer_t */ |
141 |
|
142 |
/* floating point types */ |
143 |
#define TYPE_LONGDOUBLE 0x00020000 /**< number is a long double */ |
144 |
|
145 |
#define TYPE_RESERVED1 0x00040000 /**< reserved for future expansion */ |
146 |
#define TYPE_RESERVED0 0x00080000 /**< reserved for future expansion */ |
147 |
|
148 |
/** Mask to get just the type data */ |
149 |
#define TYPE_MASK (TYPE_CHAR | TYPE_SHORT | TYPE_LONG | TYPE_QUAD | \ |
150 |
TYPE_INTMAX | TYPE_PTRDIFF | TYPE_SIZE | TYPE_TIME | \ |
151 |
TYPE_POINTER | TYPE_LONGDOUBLE) |
152 |
|
153 |
/* type of argument to extract */ |
154 |
#define ARG_INT 0x00100000 /**< argument is an integer */ |
155 |
#define ARG_FLOAT 0x00200000 /**< argument is a float */ |
156 |
#define ARG_PTR 0x00300000 /**< argument is a pointer */ |
157 |
|
158 |
#define ARG_RESERVED11 0x00400000 /**< reserved for future expansion */ |
159 |
#define ARG_RESERVED10 0x00500000 /**< reserved for future expansion */ |
160 |
#define ARG_RESERVED9 0x00600000 /**< reserved for future expansion */ |
161 |
#define ARG_RESERVED8 0x00700000 /**< reserved for future expansion */ |
162 |
#define ARG_RESERVED7 0x00800000 /**< reserved for future expansion */ |
163 |
#define ARG_RESERVED6 0x00900000 /**< reserved for future expansion */ |
164 |
#define ARG_RESERVED5 0x00a00000 /**< reserved for future expansion */ |
165 |
#define ARG_RESERVED4 0x00b00000 /**< reserved for future expansion */ |
166 |
#define ARG_RESERVED3 0x00c00000 /**< reserved for future expansion */ |
167 |
#define ARG_RESERVED2 0x00d00000 /**< reserved for future expansion */ |
168 |
#define ARG_RESERVED1 0x00e00000 /**< reserved for future expansion */ |
169 |
#define ARG_RESERVED0 0x00f00000 /**< reserved for future expansion */ |
170 |
|
171 |
/* Mask to get just the argument data */ |
172 |
#define ARG_MASK 0x00f00000 /**< masks off non-argument bits */ |
173 |
|
174 |
/* type of conversion to perform */ |
175 |
#define CONV_INT 0x01000000 /**< convert integers */ |
176 |
#define CONV_FLOAT 0x02000000 /**< convert floats */ |
177 |
#define CONV_CHAR 0x03000000 /**< convert chars */ |
178 |
#define CONV_STRING 0x04000000 /**< convert strings */ |
179 |
#define CONV_VARARGS 0x05000000 /**< convert a %v */ |
180 |
#define CONV_CLIENT 0x06000000 /**< convert a struct Client */ |
181 |
#define CONV_CHANNEL 0x07000000 /**< convert a struct Channel */ |
182 |
|
183 |
#define CONV_RESERVED7 0x08000000 /**< reserved for future expansion */ |
184 |
#define CONV_RESERVED6 0x09000000 /**< reserved for future expansion */ |
185 |
#define CONV_RESERVED5 0x0a000000 /**< reserved for future expansion */ |
186 |
#define CONV_RESERVED4 0x0b000000 /**< reserved for future expansion */ |
187 |
#define CONV_RESERVED3 0x0c000000 /**< reserved for future expansion */ |
188 |
#define CONV_RESERVED2 0x0d000000 /**< reserved for future expansion */ |
189 |
#define CONV_RESERVED1 0x0e000000 /**< reserved for future expansion */ |
190 |
#define CONV_RESERVED0 0x0f000000 /**< reserved for future expansion */ |
191 |
|
192 |
/* Mask to get just the conversion data */ |
193 |
#define CONV_MASK 0x0f000000 /**< masks off non-conversion bits */ |
194 |
|
195 |
/* Value information flags */ |
196 |
#define INFO_RESERVED0 0x10000000 /**< reserved for future expansion */ |
197 |
#define INFO_UPPERCASE 0x20000000 /**< use uppercase characters */ |
198 |
#define INFO_UNSIGNED 0x40000000 /**< number is unsigned */ |
199 |
#define INFO_NEGATIVE 0x80000000 /**< number is negative */ |
200 |
|
201 |
#define BASE_OCTAL 9 /**< octal base; bits-per-char * 3 */ |
202 |
#define BASE_DECIMAL -1000 /**< decimal base; 10 ** 3 */ |
203 |
#define BASE_HEX 12 /**< hexadecimal base; bits-per-char * 3 */ |
204 |
|
205 |
|
206 |
/* padding... 1 2 3 4 5 */ |
207 |
/* 12345678901234567890123456789012345678901234567890 */ |
208 |
/** Predefined space padding. */ |
209 |
static char spaces[] = " "; |
210 |
/** Predefined zero padding. */ |
211 |
static char zeros[] = "00000000000000000000000000000000000000000000000000"; |
212 |
|
213 |
/** Length of predefined padding strings. */ |
214 |
#define PAD_LENGTH (sizeof(spaces) - 1) |
215 |
|
216 |
/* |
217 |
* Note that these string tables have characters reversed. There is, of |
218 |
* course, a reason for this; check out how they're built in doprintf. |
219 |
*/ |
220 |
|
221 |
/** string table for octal values */ |
222 |
static const char *octal[] = |
223 |
{ |
224 |
"", "1", "2", "3", "4", "5", "6", "7", |
225 |
"01", "11", "21", "31", "41", "51", "61", "71", |
226 |
"02", "12", "22", "32", "42", "52", "62", "72", |
227 |
"03", "13", "23", "33", "43", "53", "63", "73", |
228 |
"04", "14", "24", "34", "44", "54", "64", "74", |
229 |
"05", "15", "25", "35", "45", "55", "65", "75", |
230 |
"06", "16", "26", "36", "46", "56", "66", "76", |
231 |
"07", "17", "27", "37", "47", "57", "67", "77", |
232 |
"001", "101", "201", "301", "401", "501", "601", "701", |
233 |
"011", "111", "211", "311", "411", "511", "611", "711", |
234 |
"021", "121", "221", "321", "421", "521", "621", "721", |
235 |
"031", "131", "231", "331", "431", "531", "631", "731", |
236 |
"041", "141", "241", "341", "441", "541", "641", "741", |
237 |
"051", "151", "251", "351", "451", "551", "651", "751", |
238 |
"061", "161", "261", "361", "461", "561", "661", "761", |
239 |
"071", "171", "271", "371", "471", "571", "671", "771", |
240 |
"002", "102", "202", "302", "402", "502", "602", "702", |
241 |
"012", "112", "212", "312", "412", "512", "612", "712", |
242 |
"022", "122", "222", "322", "422", "522", "622", "722", |
243 |
"032", "132", "232", "332", "432", "532", "632", "732", |
244 |
"042", "142", "242", "342", "442", "542", "642", "742", |
245 |
"052", "152", "252", "352", "452", "552", "652", "752", |
246 |
"062", "162", "262", "362", "462", "562", "662", "762", |
247 |
"072", "172", "272", "372", "472", "572", "672", "772", |
248 |
"003", "103", "203", "303", "403", "503", "603", "703", |
249 |
"013", "113", "213", "313", "413", "513", "613", "713", |
250 |
"023", "123", "223", "323", "423", "523", "623", "723", |
251 |
"033", "133", "233", "333", "433", "533", "633", "733", |
252 |
"043", "143", "243", "343", "443", "543", "643", "743", |
253 |
"053", "153", "253", "353", "453", "553", "653", "753", |
254 |
"063", "163", "263", "363", "463", "563", "663", "763", |
255 |
"073", "173", "273", "373", "473", "573", "673", "773", |
256 |
"004", "104", "204", "304", "404", "504", "604", "704", |
257 |
"014", "114", "214", "314", "414", "514", "614", "714", |
258 |
"024", "124", "224", "324", "424", "524", "624", "724", |
259 |
"034", "134", "234", "334", "434", "534", "634", "734", |
260 |
"044", "144", "244", "344", "444", "544", "644", "744", |
261 |
"054", "154", "254", "354", "454", "554", "654", "754", |
262 |
"064", "164", "264", "364", "464", "564", "664", "764", |
263 |
"074", "174", "274", "374", "474", "574", "674", "774", |
264 |
"005", "105", "205", "305", "405", "505", "605", "705", |
265 |
"015", "115", "215", "315", "415", "515", "615", "715", |
266 |
"025", "125", "225", "325", "425", "525", "625", "725", |
267 |
"035", "135", "235", "335", "435", "535", "635", "735", |
268 |
"045", "145", "245", "345", "445", "545", "645", "745", |
269 |
"055", "155", "255", "355", "455", "555", "655", "755", |
270 |
"065", "165", "265", "365", "465", "565", "665", "765", |
271 |
"075", "175", "275", "375", "475", "575", "675", "775", |
272 |
"006", "106", "206", "306", "406", "506", "606", "706", |
273 |
"016", "116", "216", "316", "416", "516", "616", "716", |
274 |
"026", "126", "226", "326", "426", "526", "626", "726", |
275 |
"036", "136", "236", "336", "436", "536", "636", "736", |
276 |
"046", "146", "246", "346", "446", "546", "646", "746", |
277 |
"056", "156", "256", "356", "456", "556", "656", "756", |
278 |
"066", "166", "266", "366", "466", "566", "666", "766", |
279 |
"076", "176", "276", "376", "476", "576", "676", "776", |
280 |
"007", "107", "207", "307", "407", "507", "607", "707", |
281 |
"017", "117", "217", "317", "417", "517", "617", "717", |
282 |
"027", "127", "227", "327", "427", "527", "627", "727", |
283 |
"037", "137", "237", "337", "437", "537", "637", "737", |
284 |
"047", "147", "247", "347", "447", "547", "647", "747", |
285 |
"057", "157", "257", "357", "457", "557", "657", "757", |
286 |
"067", "167", "267", "367", "467", "567", "667", "767", |
287 |
"077", "177", "277", "377", "477", "577", "677", "777" |
288 |
}; |
289 |
|
290 |
/** string table for decimal values */ |
291 |
static const char *decimal[] = |
292 |
{ |
293 |
"", "1", "2", "3", "4", "5", "6", "7", "8", "9", |
294 |
"01", "11", "21", "31", "41", "51", "61", "71", "81", "91", |
295 |
"02", "12", "22", "32", "42", "52", "62", "72", "82", "92", |
296 |
"03", "13", "23", "33", "43", "53", "63", "73", "83", "93", |
297 |
"04", "14", "24", "34", "44", "54", "64", "74", "84", "94", |
298 |
"05", "15", "25", "35", "45", "55", "65", "75", "85", "95", |
299 |
"06", "16", "26", "36", "46", "56", "66", "76", "86", "96", |
300 |
"07", "17", "27", "37", "47", "57", "67", "77", "87", "97", |
301 |
"08", "18", "28", "38", "48", "58", "68", "78", "88", "98", |
302 |
"09", "19", "29", "39", "49", "59", "69", "79", "89", "99", |
303 |
"001", "101", "201", "301", "401", "501", "601", "701", "801", "901", |
304 |
"011", "111", "211", "311", "411", "511", "611", "711", "811", "911", |
305 |
"021", "121", "221", "321", "421", "521", "621", "721", "821", "921", |
306 |
"031", "131", "231", "331", "431", "531", "631", "731", "831", "931", |
307 |
"041", "141", "241", "341", "441", "541", "641", "741", "841", "941", |
308 |
"051", "151", "251", "351", "451", "551", "651", "751", "851", "951", |
309 |
"061", "161", "261", "361", "461", "561", "661", "761", "861", "961", |
310 |
"071", "171", "271", "371", "471", "571", "671", "771", "871", "971", |
311 |
"081", "181", "281", "381", "481", "581", "681", "781", "881", "981", |
312 |
"091", "191", "291", "391", "491", "591", "691", "791", "891", "991", |
313 |
"002", "102", "202", "302", "402", "502", "602", "702", "802", "902", |
314 |
"012", "112", "212", "312", "412", "512", "612", "712", "812", "912", |
315 |
"022", "122", "222", "322", "422", "522", "622", "722", "822", "922", |
316 |
"032", "132", "232", "332", "432", "532", "632", "732", "832", "932", |
317 |
"042", "142", "242", "342", "442", "542", "642", "742", "842", "942", |
318 |
"052", "152", "252", "352", "452", "552", "652", "752", "852", "952", |
319 |
"062", "162", "262", "362", "462", "562", "662", "762", "862", "962", |
320 |
"072", "172", "272", "372", "472", "572", "672", "772", "872", "972", |
321 |
"082", "182", "282", "382", "482", "582", "682", "782", "882", "982", |
322 |
"092", "192", "292", "392", "492", "592", "692", "792", "892", "992", |
323 |
"003", "103", "203", "303", "403", "503", "603", "703", "803", "903", |
324 |
"013", "113", "213", "313", "413", "513", "613", "713", "813", "913", |
325 |
"023", "123", "223", "323", "423", "523", "623", "723", "823", "923", |
326 |
"033", "133", "233", "333", "433", "533", "633", "733", "833", "933", |
327 |
"043", "143", "243", "343", "443", "543", "643", "743", "843", "943", |
328 |
"053", "153", "253", "353", "453", "553", "653", "753", "853", "953", |
329 |
"063", "163", "263", "363", "463", "563", "663", "763", "863", "963", |
330 |
"073", "173", "273", "373", "473", "573", "673", "773", "873", "973", |
331 |
"083", "183", "283", "383", "483", "583", "683", "783", "883", "983", |
332 |
"093", "193", "293", "393", "493", "593", "693", "793", "893", "993", |
333 |
"004", "104", "204", "304", "404", "504", "604", "704", "804", "904", |
334 |
"014", "114", "214", "314", "414", "514", "614", "714", "814", "914", |
335 |
"024", "124", "224", "324", "424", "524", "624", "724", "824", "924", |
336 |
"034", "134", "234", "334", "434", "534", "634", "734", "834", "934", |
337 |
"044", "144", "244", "344", "444", "544", "644", "744", "844", "944", |
338 |
"054", "154", "254", "354", "454", "554", "654", "754", "854", "954", |
339 |
"064", "164", "264", "364", "464", "564", "664", "764", "864", "964", |
340 |
"074", "174", "274", "374", "474", "574", "674", "774", "874", "974", |
341 |
"084", "184", "284", "384", "484", "584", "684", "784", "884", "984", |
342 |
"094", "194", "294", "394", "494", "594", "694", "794", "894", "994", |
343 |
"005", "105", "205", "305", "405", "505", "605", "705", "805", "905", |
344 |
"015", "115", "215", "315", "415", "515", "615", "715", "815", "915", |
345 |
"025", "125", "225", "325", "425", "525", "625", "725", "825", "925", |
346 |
"035", "135", "235", "335", "435", "535", "635", "735", "835", "935", |
347 |
"045", "145", "245", "345", "445", "545", "645", "745", "845", "945", |
348 |
"055", "155", "255", "355", "455", "555", "655", "755", "855", "955", |
349 |
"065", "165", "265", "365", "465", "565", "665", "765", "865", "965", |
350 |
"075", "175", "275", "375", "475", "575", "675", "775", "875", "975", |
351 |
"085", "185", "285", "385", "485", "585", "685", "785", "885", "985", |
352 |
"095", "195", "295", "395", "495", "595", "695", "795", "895", "995", |
353 |
"006", "106", "206", "306", "406", "506", "606", "706", "806", "906", |
354 |
"016", "116", "216", "316", "416", "516", "616", "716", "816", "916", |
355 |
"026", "126", "226", "326", "426", "526", "626", "726", "826", "926", |
356 |
"036", "136", "236", "336", "436", "536", "636", "736", "836", "936", |
357 |
"046", "146", "246", "346", "446", "546", "646", "746", "846", "946", |
358 |
"056", "156", "256", "356", "456", "556", "656", "756", "856", "956", |
359 |
"066", "166", "266", "366", "466", "566", "666", "766", "866", "966", |
360 |
"076", "176", "276", "376", "476", "576", "676", "776", "876", "976", |
361 |
"086", "186", "286", "386", "486", "586", "686", "786", "886", "986", |
362 |
"096", "196", "296", "396", "496", "596", "696", "796", "896", "996", |
363 |
"007", "107", "207", "307", "407", "507", "607", "707", "807", "907", |
364 |
"017", "117", "217", "317", "417", "517", "617", "717", "817", "917", |
365 |
"027", "127", "227", "327", "427", "527", "627", "727", "827", "927", |
366 |
"037", "137", "237", "337", "437", "537", "637", "737", "837", "937", |
367 |
"047", "147", "247", "347", "447", "547", "647", "747", "847", "947", |
368 |
"057", "157", "257", "357", "457", "557", "657", "757", "857", "957", |
369 |
"067", "167", "267", "367", "467", "567", "667", "767", "867", "967", |
370 |
"077", "177", "277", "377", "477", "577", "677", "777", "877", "977", |
371 |
"087", "187", "287", "387", "487", "587", "687", "787", "887", "987", |
372 |
"097", "197", "297", "397", "497", "597", "697", "797", "897", "997", |
373 |
"008", "108", "208", "308", "408", "508", "608", "708", "808", "908", |
374 |
"018", "118", "218", "318", "418", "518", "618", "718", "818", "918", |
375 |
"028", "128", "228", "328", "428", "528", "628", "728", "828", "928", |
376 |
"038", "138", "238", "338", "438", "538", "638", "738", "838", "938", |
377 |
"048", "148", "248", "348", "448", "548", "648", "748", "848", "948", |
378 |
"058", "158", "258", "358", "458", "558", "658", "758", "858", "958", |
379 |
"068", "168", "268", "368", "468", "568", "668", "768", "868", "968", |
380 |
"078", "178", "278", "378", "478", "578", "678", "778", "878", "978", |
381 |
"088", "188", "288", "388", "488", "588", "688", "788", "888", "988", |
382 |
"098", "198", "298", "398", "498", "598", "698", "798", "898", "998", |
383 |
"009", "109", "209", "309", "409", "509", "609", "709", "809", "909", |
384 |
"019", "119", "219", "319", "419", "519", "619", "719", "819", "919", |
385 |
"029", "129", "229", "329", "429", "529", "629", "729", "829", "929", |
386 |
"039", "139", "239", "339", "439", "539", "639", "739", "839", "939", |
387 |
"049", "149", "249", "349", "449", "549", "649", "749", "849", "949", |
388 |
"059", "159", "259", "359", "459", "559", "659", "759", "859", "959", |
389 |
"069", "169", "269", "369", "469", "569", "669", "769", "869", "969", |
390 |
"079", "179", "279", "379", "479", "579", "679", "779", "879", "979", |
391 |
"089", "189", "289", "389", "489", "589", "689", "789", "889", "989", |
392 |
"099", "199", "299", "399", "499", "599", "699", "799", "899", "999" |
393 |
}; |
394 |
|
395 |
/** string table for lower-case hexadecimal values */ |
396 |
static const char *hex[] = |
397 |
{ |
398 |
"", "1", "2", "3", "4", "5", "6", "7", |
399 |
"8", "9", "a", "b", "c", "d", "e", "f", |
400 |
"01", "11", "21", "31", "41", "51", "61", "71", |
401 |
"81", "91", "a1", "b1", "c1", "d1", "e1", "f1", |
402 |
"02", "12", "22", "32", "42", "52", "62", "72", |
403 |
"82", "92", "a2", "b2", "c2", "d2", "e2", "f2", |
404 |
"03", "13", "23", "33", "43", "53", "63", "73", |
405 |
"83", "93", "a3", "b3", "c3", "d3", "e3", "f3", |
406 |
"04", "14", "24", "34", "44", "54", "64", "74", |
407 |
"84", "94", "a4", "b4", "c4", "d4", "e4", "f4", |
408 |
"05", "15", "25", "35", "45", "55", "65", "75", |
409 |
"85", "95", "a5", "b5", "c5", "d5", "e5", "f5", |
410 |
"06", "16", "26", "36", "46", "56", "66", "76", |
411 |
"86", "96", "a6", "b6", "c6", "d6", "e6", "f6", |
412 |
"07", "17", "27", "37", "47", "57", "67", "77", |
413 |
"87", "97", "a7", "b7", "c7", "d7", "e7", "f7", |
414 |
"08", "18", "28", "38", "48", "58", "68", "78", |
415 |
"88", "98", "a8", "b8", "c8", "d8", "e8", "f8", |
416 |
"09", "19", "29", "39", "49", "59", "69", "79", |
417 |
"89", "99", "a9", "b9", "c9", "d9", "e9", "f9", |
418 |
"0a", "1a", "2a", "3a", "4a", "5a", "6a", "7a", |
419 |
"8a", "9a", "aa", "ba", "ca", "da", "ea", "fa", |
420 |
"0b", "1b", "2b", "3b", "4b", "5b", "6b", "7b", |
421 |
"8b", "9b", "ab", "bb", "cb", "db", "eb", "fb", |
422 |
"0c", "1c", "2c", "3c", "4c", "5c", "6c", "7c", |
423 |
"8c", "9c", "ac", "bc", "cc", "dc", "ec", "fc", |
424 |
"0d", "1d", "2d", "3d", "4d", "5d", "6d", "7d", |
425 |
"8d", "9d", "ad", "bd", "cd", "dd", "ed", "fd", |
426 |
"0e", "1e", "2e", "3e", "4e", "5e", "6e", "7e", |
427 |
"8e", "9e", "ae", "be", "ce", "de", "ee", "fe", |
428 |
"0f", "1f", "2f", "3f", "4f", "5f", "6f", "7f", |
429 |
"8f", "9f", "af", "bf", "cf", "df", "ef", "ff", |
430 |
"001", "101", "201", "301", "401", "501", "601", "701", |
431 |
"801", "901", "a01", "b01", "c01", "d01", "e01", "f01", |
432 |
"011", "111", "211", "311", "411", "511", "611", "711", |
433 |
"811", "911", "a11", "b11", "c11", "d11", "e11", "f11", |
434 |
"021", "121", "221", "321", "421", "521", "621", "721", |
435 |
"821", "921", "a21", "b21", "c21", "d21", "e21", "f21", |
436 |
"031", "131", "231", "331", "431", "531", "631", "731", |
437 |
"831", "931", "a31", "b31", "c31", "d31", "e31", "f31", |
438 |
"041", "141", "241", "341", "441", "541", "641", "741", |
439 |
"841", "941", "a41", "b41", "c41", "d41", "e41", "f41", |
440 |
"051", "151", "251", "351", "451", "551", "651", "751", |
441 |
"851", "951", "a51", "b51", "c51", "d51", "e51", "f51", |
442 |
"061", "161", "261", "361", "461", "561", "661", "761", |
443 |
"861", "961", "a61", "b61", "c61", "d61", "e61", "f61", |
444 |
"071", "171", "271", "371", "471", "571", "671", "771", |
445 |
"871", "971", "a71", "b71", "c71", "d71", "e71", "f71", |
446 |
"081", "181", "281", "381", "481", "581", "681", "781", |
447 |
"881", "981", "a81", "b81", "c81", "d81", "e81", "f81", |
448 |
"091", "191", "291", "391", "491", "591", "691", "791", |
449 |
"891", "991", "a91", "b91", "c91", "d91", "e91", "f91", |
450 |
"0a1", "1a1", "2a1", "3a1", "4a1", "5a1", "6a1", "7a1", |
451 |
"8a1", "9a1", "aa1", "ba1", "ca1", "da1", "ea1", "fa1", |
452 |
"0b1", "1b1", "2b1", "3b1", "4b1", "5b1", "6b1", "7b1", |
453 |
"8b1", "9b1", "ab1", "bb1", "cb1", "db1", "eb1", "fb1", |
454 |
"0c1", "1c1", "2c1", "3c1", "4c1", "5c1", "6c1", "7c1", |
455 |
"8c1", "9c1", "ac1", "bc1", "cc1", "dc1", "ec1", "fc1", |
456 |
"0d1", "1d1", "2d1", "3d1", "4d1", "5d1", "6d1", "7d1", |
457 |
"8d1", "9d1", "ad1", "bd1", "cd1", "dd1", "ed1", "fd1", |
458 |
"0e1", "1e1", "2e1", "3e1", "4e1", "5e1", "6e1", "7e1", |
459 |
"8e1", "9e1", "ae1", "be1", "ce1", "de1", "ee1", "fe1", |
460 |
"0f1", "1f1", "2f1", "3f1", "4f1", "5f1", "6f1", "7f1", |
461 |
"8f1", "9f1", "af1", "bf1", "cf1", "df1", "ef1", "ff1", |
462 |
"002", "102", "202", "302", "402", "502", "602", "702", |
463 |
"802", "902", "a02", "b02", "c02", "d02", "e02", "f02", |
464 |
"012", "112", "212", "312", "412", "512", "612", "712", |
465 |
"812", "912", "a12", "b12", "c12", "d12", "e12", "f12", |
466 |
"022", "122", "222", "322", "422", "522", "622", "722", |
467 |
"822", "922", "a22", "b22", "c22", "d22", "e22", "f22", |
468 |
"032", "132", "232", "332", "432", "532", "632", "732", |
469 |
"832", "932", "a32", "b32", "c32", "d32", "e32", "f32", |
470 |
"042", "142", "242", "342", "442", "542", "642", "742", |
471 |
"842", "942", "a42", "b42", "c42", "d42", "e42", "f42", |
472 |
"052", "152", "252", "352", "452", "552", "652", "752", |
473 |
"852", "952", "a52", "b52", "c52", "d52", "e52", "f52", |
474 |
"062", "162", "262", "362", "462", "562", "662", "762", |
475 |
"862", "962", "a62", "b62", "c62", "d62", "e62", "f62", |
476 |
"072", "172", "272", "372", "472", "572", "672", "772", |
477 |
"872", "972", "a72", "b72", "c72", "d72", "e72", "f72", |
478 |
"082", "182", "282", "382", "482", "582", "682", "782", |
479 |
"882", "982", "a82", "b82", "c82", "d82", "e82", "f82", |
480 |
"092", "192", "292", "392", "492", "592", "692", "792", |
481 |
"892", "992", "a92", "b92", "c92", "d92", "e92", "f92", |
482 |
"0a2", "1a2", "2a2", "3a2", "4a2", "5a2", "6a2", "7a2", |
483 |
"8a2", "9a2", "aa2", "ba2", "ca2", "da2", "ea2", "fa2", |
484 |
"0b2", "1b2", "2b2", "3b2", "4b2", "5b2", "6b2", "7b2", |
485 |
"8b2", "9b2", "ab2", "bb2", "cb2", "db2", "eb2", "fb2", |
486 |
"0c2", "1c2", "2c2", "3c2", "4c2", "5c2", "6c2", "7c2", |
487 |
"8c2", "9c2", "ac2", "bc2", "cc2", "dc2", "ec2", "fc2", |
488 |
"0d2", "1d2", "2d2", "3d2", "4d2", "5d2", "6d2", "7d2", |
489 |
"8d2", "9d2", "ad2", "bd2", "cd2", "dd2", "ed2", "fd2", |
490 |
"0e2", "1e2", "2e2", "3e2", "4e2", "5e2", "6e2", "7e2", |
491 |
"8e2", "9e2", "ae2", "be2", "ce2", "de2", "ee2", "fe2", |
492 |
"0f2", "1f2", "2f2", "3f2", "4f2", "5f2", "6f2", "7f2", |
493 |
"8f2", "9f2", "af2", "bf2", "cf2", "df2", "ef2", "ff2", |
494 |
"003", "103", "203", "303", "403", "503", "603", "703", |
495 |
"803", "903", "a03", "b03", "c03", "d03", "e03", "f03", |
496 |
"013", "113", "213", "313", "413", "513", "613", "713", |
497 |
"813", "913", "a13", "b13", "c13", "d13", "e13", "f13", |
498 |
"023", "123", "223", "323", "423", "523", "623", "723", |
499 |
"823", "923", "a23", "b23", "c23", "d23", "e23", "f23", |
500 |
"033", "133", "233", "333", "433", "533", "633", "733", |
501 |
"833", "933", "a33", "b33", "c33", "d33", "e33", "f33", |
502 |
"043", "143", "243", "343", "443", "543", "643", "743", |
503 |
"843", "943", "a43", "b43", "c43", "d43", "e43", "f43", |
504 |
"053", "153", "253", "353", "453", "553", "653", "753", |
505 |
"853", "953", "a53", "b53", "c53", "d53", "e53", "f53", |
506 |
"063", "163", "263", "363", "463", "563", "663", "763", |
507 |
"863", "963", "a63", "b63", "c63", "d63", "e63", "f63", |
508 |
"073", "173", "273", "373", "473", "573", "673", "773", |
509 |
"873", "973", "a73", "b73", "c73", "d73", "e73", "f73", |
510 |
"083", "183", "283", "383", "483", "583", "683", "783", |
511 |
"883", "983", "a83", "b83", "c83", "d83", "e83", "f83", |
512 |
"093", "193", "293", "393", "493", "593", "693", "793", |
513 |
"893", "993", "a93", "b93", "c93", "d93", "e93", "f93", |
514 |
"0a3", "1a3", "2a3", "3a3", "4a3", "5a3", "6a3", "7a3", |
515 |
"8a3", "9a3", "aa3", "ba3", "ca3", "da3", "ea3", "fa3", |
516 |
"0b3", "1b3", "2b3", "3b3", "4b3", "5b3", "6b3", "7b3", |
517 |
"8b3", "9b3", "ab3", "bb3", "cb3", "db3", "eb3", "fb3", |
518 |
"0c3", "1c3", "2c3", "3c3", "4c3", "5c3", "6c3", "7c3", |
519 |
"8c3", "9c3", "ac3", "bc3", "cc3", "dc3", "ec3", "fc3", |
520 |
"0d3", "1d3", "2d3", "3d3", "4d3", "5d3", "6d3", "7d3", |
521 |
"8d3", "9d3", "ad3", "bd3", "cd3", "dd3", "ed3", "fd3", |
522 |
"0e3", "1e3", "2e3", "3e3", "4e3", "5e3", "6e3", "7e3", |
523 |
"8e3", "9e3", "ae3", "be3", "ce3", "de3", "ee3", "fe3", |
524 |
"0f3", "1f3", "2f3", "3f3", "4f3", "5f3", "6f3", "7f3", |
525 |
"8f3", "9f3", "af3", "bf3", "cf3", "df3", "ef3", "ff3", |
526 |
"004", "104", "204", "304", "404", "504", "604", "704", |
527 |
"804", "904", "a04", "b04", "c04", "d04", "e04", "f04", |
528 |
"014", "114", "214", "314", "414", "514", "614", "714", |
529 |
"814", "914", "a14", "b14", "c14", "d14", "e14", "f14", |
530 |
"024", "124", "224", "324", "424", "524", "624", "724", |
531 |
"824", "924", "a24", "b24", "c24", "d24", "e24", "f24", |
532 |
"034", "134", "234", "334", "434", "534", "634", "734", |
533 |
"834", "934", "a34", "b34", "c34", "d34", "e34", "f34", |
534 |
"044", "144", "244", "344", "444", "544", "644", "744", |
535 |
"844", "944", "a44", "b44", "c44", "d44", "e44", "f44", |
536 |
"054", "154", "254", "354", "454", "554", "654", "754", |
537 |
"854", "954", "a54", "b54", "c54", "d54", "e54", "f54", |
538 |
"064", "164", "264", "364", "464", "564", "664", "764", |
539 |
"864", "964", "a64", "b64", "c64", "d64", "e64", "f64", |
540 |
"074", "174", "274", "374", "474", "574", "674", "774", |
541 |
"874", "974", "a74", "b74", "c74", "d74", "e74", "f74", |
542 |
"084", "184", "284", "384", "484", "584", "684", "784", |
543 |
"884", "984", "a84", "b84", "c84", "d84", "e84", "f84", |
544 |
"094", "194", "294", "394", "494", "594", "694", "794", |
545 |
"894", "994", "a94", "b94", "c94", "d94", "e94", "f94", |
546 |
"0a4", "1a4", "2a4", "3a4", "4a4", "5a4", "6a4", "7a4", |
547 |
"8a4", "9a4", "aa4", "ba4", "ca4", "da4", "ea4", "fa4", |
548 |
"0b4", "1b4", "2b4", "3b4", "4b4", "5b4", "6b4", "7b4", |
549 |
"8b4", "9b4", "ab4", "bb4", "cb4", "db4", "eb4", "fb4", |
550 |
"0c4", "1c4", "2c4", "3c4", "4c4", "5c4", "6c4", "7c4", |
551 |
"8c4", "9c4", "ac4", "bc4", "cc4", "dc4", "ec4", "fc4", |
552 |
"0d4", "1d4", "2d4", "3d4", "4d4", "5d4", "6d4", "7d4", |
553 |
"8d4", "9d4", "ad4", "bd4", "cd4", "dd4", "ed4", "fd4", |
554 |
"0e4", "1e4", "2e4", "3e4", "4e4", "5e4", "6e4", "7e4", |
555 |
"8e4", "9e4", "ae4", "be4", "ce4", "de4", "ee4", "fe4", |
556 |
"0f4", "1f4", "2f4", "3f4", "4f4", "5f4", "6f4", "7f4", |
557 |
"8f4", "9f4", "af4", "bf4", "cf4", "df4", "ef4", "ff4", |
558 |
"005", "105", "205", "305", "405", "505", "605", "705", |
559 |
"805", "905", "a05", "b05", "c05", "d05", "e05", "f05", |
560 |
"015", "115", "215", "315", "415", "515", "615", "715", |
561 |
"815", "915", "a15", "b15", "c15", "d15", "e15", "f15", |
562 |
"025", "125", "225", "325", "425", "525", "625", "725", |
563 |
"825", "925", "a25", "b25", "c25", "d25", "e25", "f25", |
564 |
"035", "135", "235", "335", "435", "535", "635", "735", |
565 |
"835", "935", "a35", "b35", "c35", "d35", "e35", "f35", |
566 |
"045", "145", "245", "345", "445", "545", "645", "745", |
567 |
"845", "945", "a45", "b45", "c45", "d45", "e45", "f45", |
568 |
"055", "155", "255", "355", "455", "555", "655", "755", |
569 |
"855", "955", "a55", "b55", "c55", "d55", "e55", "f55", |
570 |
"065", "165", "265", "365", "465", "565", "665", "765", |
571 |
"865", "965", "a65", "b65", "c65", "d65", "e65", "f65", |
572 |
"075", "175", "275", "375", "475", "575", "675", "775", |
573 |
"875", "975", "a75", "b75", "c75", "d75", "e75", "f75", |
574 |
"085", "185", "285", "385", "485", "585", "685", "785", |
575 |
"885", "985", "a85", "b85", "c85", "d85", "e85", "f85", |
576 |
"095", "195", "295", "395", "495", "595", "695", "795", |
577 |
"895", "995", "a95", "b95", "c95", "d95", "e95", "f95", |
578 |
"0a5", "1a5", "2a5", "3a5", "4a5", "5a5", "6a5", "7a5", |
579 |
"8a5", "9a5", "aa5", "ba5", "ca5", "da5", "ea5", "fa5", |
580 |
"0b5", "1b5", "2b5", "3b5", "4b5", "5b5", "6b5", "7b5", |
581 |
"8b5", "9b5", "ab5", "bb5", "cb5", "db5", "eb5", "fb5", |
582 |
"0c5", "1c5", "2c5", "3c5", "4c5", "5c5", "6c5", "7c5", |
583 |
"8c5", "9c5", "ac5", "bc5", "cc5", "dc5", "ec5", "fc5", |
584 |
"0d5", "1d5", "2d5", "3d5", "4d5", "5d5", "6d5", "7d5", |
585 |
"8d5", "9d5", "ad5", "bd5", "cd5", "dd5", "ed5", "fd5", |
586 |
"0e5", "1e5", "2e5", "3e5", "4e5", "5e5", "6e5", "7e5", |
587 |
"8e5", "9e5", "ae5", "be5", "ce5", "de5", "ee5", "fe5", |
588 |
"0f5", "1f5", "2f5", "3f5", "4f5", "5f5", "6f5", "7f5", |
589 |
"8f5", "9f5", "af5", "bf5", "cf5", "df5", "ef5", "ff5", |
590 |
"006", "106", "206", "306", "406", "506", "606", "706", |
591 |
"806", "906", "a06", "b06", "c06", "d06", "e06", "f06", |
592 |
"016", "116", "216", "316", "416", "516", "616", "716", |
593 |
"816", "916", "a16", "b16", "c16", "d16", "e16", "f16", |
594 |
"026", "126", "226", "326", "426", "526", "626", "726", |
595 |
"826", "926", "a26", "b26", "c26", "d26", "e26", "f26", |
596 |
"036", "136", "236", "336", "436", "536", "636", "736", |
597 |
"836", "936", "a36", "b36", "c36", "d36", "e36", "f36", |
598 |
"046", "146", "246", "346", "446", "546", "646", "746", |
599 |
"846", "946", "a46", "b46", "c46", "d46", "e46", "f46", |
600 |
"056", "156", "256", "356", "456", "556", "656", "756", |
601 |
"856", "956", "a56", "b56", "c56", "d56", "e56", "f56", |
602 |
"066", "166", "266", "366", "466", "566", "666", "766", |
603 |
"866", "966", "a66", "b66", "c66", "d66", "e66", "f66", |
604 |
"076", "176", "276", "376", "476", "576", "676", "776", |
605 |
"876", "976", "a76", "b76", "c76", "d76", "e76", "f76", |
606 |
"086", "186", "286", "386", "486", "586", "686", "786", |
607 |
"886", "986", "a86", "b86", "c86", "d86", "e86", "f86", |
608 |
"096", "196", "296", "396", "496", "596", "696", "796", |
609 |
"896", "996", "a96", "b96", "c96", "d96", "e96", "f96", |
610 |
"0a6", "1a6", "2a6", "3a6", "4a6", "5a6", "6a6", "7a6", |
611 |
"8a6", "9a6", "aa6", "ba6", "ca6", "da6", "ea6", "fa6", |
612 |
"0b6", "1b6", "2b6", "3b6", "4b6", "5b6", "6b6", "7b6", |
613 |
"8b6", "9b6", "ab6", "bb6", "cb6", "db6", "eb6", "fb6", |
614 |
"0c6", "1c6", "2c6", "3c6", "4c6", "5c6", "6c6", "7c6", |
615 |
"8c6", "9c6", "ac6", "bc6", "cc6", "dc6", "ec6", "fc6", |
616 |
"0d6", "1d6", "2d6", "3d6", "4d6", "5d6", "6d6", "7d6", |
617 |
"8d6", "9d6", "ad6", "bd6", "cd6", "dd6", "ed6", "fd6", |
618 |
"0e6", "1e6", "2e6", "3e6", "4e6", "5e6", "6e6", "7e6", |
619 |
"8e6", "9e6", "ae6", "be6", "ce6", "de6", "ee6", "fe6", |
620 |
"0f6", "1f6", "2f6", "3f6", "4f6", "5f6", "6f6", "7f6", |
621 |
"8f6", "9f6", "af6", "bf6", "cf6", "df6", "ef6", "ff6", |
622 |
"007", "107", "207", "307", "407", "507", "607", "707", |
623 |
"807", "907", "a07", "b07", "c07", "d07", "e07", "f07", |
624 |
"017", "117", "217", "317", "417", "517", "617", "717", |
625 |
"817", "917", "a17", "b17", "c17", "d17", "e17", "f17", |
626 |
"027", "127", "227", "327", "427", "527", "627", "727", |
627 |
"827", "927", "a27", "b27", "c27", "d27", "e27", "f27", |
628 |
"037", "137", "237", "337", "437", "537", "637", "737", |
629 |
"837", "937", "a37", "b37", "c37", "d37", "e37", "f37", |
630 |
"047", "147", "247", "347", "447", "547", "647", "747", |
631 |
"847", "947", "a47", "b47", "c47", "d47", "e47", "f47", |
632 |
"057", "157", "257", "357", "457", "557", "657", "757", |
633 |
"857", "957", "a57", "b57", "c57", "d57", "e57", "f57", |
634 |
"067", "167", "267", "367", "467", "567", "667", "767", |
635 |
"867", "967", "a67", "b67", "c67", "d67", "e67", "f67", |
636 |
"077", "177", "277", "377", "477", "577", "677", "777", |
637 |
"877", "977", "a77", "b77", "c77", "d77", "e77", "f77", |
638 |
"087", "187", "287", "387", "487", "587", "687", "787", |
639 |
"887", "987", "a87", "b87", "c87", "d87", "e87", "f87", |
640 |
"097", "197", "297", "397", "497", "597", "697", "797", |
641 |
"897", "997", "a97", "b97", "c97", "d97", "e97", "f97", |
642 |
"0a7", "1a7", "2a7", "3a7", "4a7", "5a7", "6a7", "7a7", |
643 |
"8a7", "9a7", "aa7", "ba7", "ca7", "da7", "ea7", "fa7", |
644 |
"0b7", "1b7", "2b7", "3b7", "4b7", "5b7", "6b7", "7b7", |
645 |
"8b7", "9b7", "ab7", "bb7", "cb7", "db7", "eb7", "fb7", |
646 |
"0c7", "1c7", "2c7", "3c7", "4c7", "5c7", "6c7", "7c7", |
647 |
"8c7", "9c7", "ac7", "bc7", "cc7", "dc7", "ec7", "fc7", |
648 |
"0d7", "1d7", "2d7", "3d7", "4d7", "5d7", "6d7", "7d7", |
649 |
"8d7", "9d7", "ad7", "bd7", "cd7", "dd7", "ed7", "fd7", |
650 |
"0e7", "1e7", "2e7", "3e7", "4e7", "5e7", "6e7", "7e7", |
651 |
"8e7", "9e7", "ae7", "be7", "ce7", "de7", "ee7", "fe7", |
652 |
"0f7", "1f7", "2f7", "3f7", "4f7", "5f7", "6f7", "7f7", |
653 |
"8f7", "9f7", "af7", "bf7", "cf7", "df7", "ef7", "ff7", |
654 |
"008", "108", "208", "308", "408", "508", "608", "708", |
655 |
"808", "908", "a08", "b08", "c08", "d08", "e08", "f08", |
656 |
"018", "118", "218", "318", "418", "518", "618", "718", |
657 |
"818", "918", "a18", "b18", "c18", "d18", "e18", "f18", |
658 |
"028", "128", "228", "328", "428", "528", "628", "728", |
659 |
"828", "928", "a28", "b28", "c28", "d28", "e28", "f28", |
660 |
"038", "138", "238", "338", "438", "538", "638", "738", |
661 |
"838", "938", "a38", "b38", "c38", "d38", "e38", "f38", |
662 |
"048", "148", "248", "348", "448", "548", "648", "748", |
663 |
"848", "948", "a48", "b48", "c48", "d48", "e48", "f48", |
664 |
"058", "158", "258", "358", "458", "558", "658", "758", |
665 |
"858", "958", "a58", "b58", "c58", "d58", "e58", "f58", |
666 |
"068", "168", "268", "368", "468", "568", "668", "768", |
667 |
"868", "968", "a68", "b68", "c68", "d68", "e68", "f68", |
668 |
"078", "178", "278", "378", "478", "578", "678", "778", |
669 |
"878", "978", "a78", "b78", "c78", "d78", "e78", "f78", |
670 |
"088", "188", "288", "388", "488", "588", "688", "788", |
671 |
"888", "988", "a88", "b88", "c88", "d88", "e88", "f88", |
672 |
"098", "198", "298", "398", "498", "598", "698", "798", |
673 |
"898", "998", "a98", "b98", "c98", "d98", "e98", "f98", |
674 |
"0a8", "1a8", "2a8", "3a8", "4a8", "5a8", "6a8", "7a8", |
675 |
"8a8", "9a8", "aa8", "ba8", "ca8", "da8", "ea8", "fa8", |
676 |
"0b8", "1b8", "2b8", "3b8", "4b8", "5b8", "6b8", "7b8", |
677 |
"8b8", "9b8", "ab8", "bb8", "cb8", "db8", "eb8", "fb8", |
678 |
"0c8", "1c8", "2c8", "3c8", "4c8", "5c8", "6c8", "7c8", |
679 |
"8c8", "9c8", "ac8", "bc8", "cc8", "dc8", "ec8", "fc8", |
680 |
"0d8", "1d8", "2d8", "3d8", "4d8", "5d8", "6d8", "7d8", |
681 |
"8d8", "9d8", "ad8", "bd8", "cd8", "dd8", "ed8", "fd8", |
682 |
"0e8", "1e8", "2e8", "3e8", "4e8", "5e8", "6e8", "7e8", |
683 |
"8e8", "9e8", "ae8", "be8", "ce8", "de8", "ee8", "fe8", |
684 |
"0f8", "1f8", "2f8", "3f8", "4f8", "5f8", "6f8", "7f8", |
685 |
"8f8", "9f8", "af8", "bf8", "cf8", "df8", "ef8", "ff8", |
686 |
"009", "109", "209", "309", "409", "509", "609", "709", |
687 |
"809", "909", "a09", "b09", "c09", "d09", "e09", "f09", |
688 |
"019", "119", "219", "319", "419", "519", "619", "719", |
689 |
"819", "919", "a19", "b19", "c19", "d19", "e19", "f19", |
690 |
"029", "129", "229", "329", "429", "529", "629", "729", |
691 |
"829", "929", "a29", "b29", "c29", "d29", "e29", "f29", |
692 |
"039", "139", "239", "339", "439", "539", "639", "739", |
693 |
"839", "939", "a39", "b39", "c39", "d39", "e39", "f39", |
694 |
"049", "149", "249", "349", "449", "549", "649", "749", |
695 |
"849", "949", "a49", "b49", "c49", "d49", "e49", "f49", |
696 |
"059", "159", "259", "359", "459", "559", "659", "759", |
697 |
"859", "959", "a59", "b59", "c59", "d59", "e59", "f59", |
698 |
"069", "169", "269", "369", "469", "569", "669", "769", |
699 |
"869", "969", "a69", "b69", "c69", "d69", "e69", "f69", |
700 |
"079", "179", "279", "379", "479", "579", "679", "779", |
701 |
"879", "979", "a79", "b79", "c79", "d79", "e79", "f79", |
702 |
"089", "189", "289", "389", "489", "589", "689", "789", |
703 |
"889", "989", "a89", "b89", "c89", "d89", "e89", "f89", |
704 |
"099", "199", "299", "399", "499", "599", "699", "799", |
705 |
"899", "999", "a99", "b99", "c99", "d99", "e99", "f99", |
706 |
"0a9", "1a9", "2a9", "3a9", "4a9", "5a9", "6a9", "7a9", |
707 |
"8a9", "9a9", "aa9", "ba9", "ca9", "da9", "ea9", "fa9", |
708 |
"0b9", "1b9", "2b9", "3b9", "4b9", "5b9", "6b9", "7b9", |
709 |
"8b9", "9b9", "ab9", "bb9", "cb9", "db9", "eb9", "fb9", |
710 |
"0c9", "1c9", "2c9", "3c9", "4c9", "5c9", "6c9", "7c9", |
711 |
"8c9", "9c9", "ac9", "bc9", "cc9", "dc9", "ec9", "fc9", |
712 |
"0d9", "1d9", "2d9", "3d9", "4d9", "5d9", "6d9", "7d9", |
713 |
"8d9", "9d9", "ad9", "bd9", "cd9", "dd9", "ed9", "fd9", |
714 |
"0e9", "1e9", "2e9", "3e9", "4e9", "5e9", "6e9", "7e9", |
715 |
"8e9", "9e9", "ae9", "be9", "ce9", "de9", "ee9", "fe9", |
716 |
"0f9", "1f9", "2f9", "3f9", "4f9", "5f9", "6f9", "7f9", |
717 |
"8f9", "9f9", "af9", "bf9", "cf9", "df9", "ef9", "ff9", |
718 |
"00a", "10a", "20a", "30a", "40a", "50a", "60a", "70a", |
719 |
"80a", "90a", "a0a", "b0a", "c0a", "d0a", "e0a", "f0a", |
720 |
"01a", "11a", "21a", "31a", "41a", "51a", "61a", "71a", |
721 |
"81a", "91a", "a1a", "b1a", "c1a", "d1a", "e1a", "f1a", |
722 |
"02a", "12a", "22a", "32a", "42a", "52a", "62a", "72a", |
723 |
"82a", "92a", "a2a", "b2a", "c2a", "d2a", "e2a", "f2a", |
724 |
"03a", "13a", "23a", "33a", "43a", "53a", "63a", "73a", |
725 |
"83a", "93a", "a3a", "b3a", "c3a", "d3a", "e3a", "f3a", |
726 |
"04a", "14a", "24a", "34a", "44a", "54a", "64a", "74a", |
727 |
"84a", "94a", "a4a", "b4a", "c4a", "d4a", "e4a", "f4a", |
728 |
"05a", "15a", "25a", "35a", "45a", "55a", "65a", "75a", |
729 |
"85a", "95a", "a5a", "b5a", "c5a", "d5a", "e5a", "f5a", |
730 |
"06a", "16a", "26a", "36a", "46a", "56a", "66a", "76a", |
731 |
"86a", "96a", "a6a", "b6a", "c6a", "d6a", "e6a", "f6a", |
732 |
"07a", "17a", "27a", "37a", "47a", "57a", "67a", "77a", |
733 |
"87a", "97a", "a7a", "b7a", "c7a", "d7a", "e7a", "f7a", |
734 |
"08a", "18a", "28a", "38a", "48a", "58a", "68a", "78a", |
735 |
"88a", "98a", "a8a", "b8a", "c8a", "d8a", "e8a", "f8a", |
736 |
"09a", "19a", "29a", "39a", "49a", "59a", "69a", "79a", |
737 |
"89a", "99a", "a9a", "b9a", "c9a", "d9a", "e9a", "f9a", |
738 |
"0aa", "1aa", "2aa", "3aa", "4aa", "5aa", "6aa", "7aa", |
739 |
"8aa", "9aa", "aaa", "baa", "caa", "daa", "eaa", "faa", |
740 |
"0ba", "1ba", "2ba", "3ba", "4ba", "5ba", "6ba", "7ba", |
741 |
"8ba", "9ba", "aba", "bba", "cba", "dba", "eba", "fba", |
742 |
"0ca", "1ca", "2ca", "3ca", "4ca", "5ca", "6ca", "7ca", |
743 |
"8ca", "9ca", "aca", "bca", "cca", "dca", "eca", "fca", |
744 |
"0da", "1da", "2da", "3da", "4da", "5da", "6da", "7da", |
745 |
"8da", "9da", "ada", "bda", "cda", "dda", "eda", "fda", |
746 |
"0ea", "1ea", "2ea", "3ea", "4ea", "5ea", "6ea", "7ea", |
747 |
"8ea", "9ea", "aea", "bea", "cea", "dea", "eea", "fea", |
748 |
"0fa", "1fa", "2fa", "3fa", "4fa", "5fa", "6fa", "7fa", |
749 |
"8fa", "9fa", "afa", "bfa", "cfa", "dfa", "efa", "ffa", |
750 |
"00b", "10b", "20b", "30b", "40b", "50b", "60b", "70b", |
751 |
"80b", "90b", "a0b", "b0b", "c0b", "d0b", "e0b", "f0b", |
752 |
"01b", "11b", "21b", "31b", "41b", "51b", "61b", "71b", |
753 |
"81b", "91b", "a1b", "b1b", "c1b", "d1b", "e1b", "f1b", |
754 |
"02b", "12b", "22b", "32b", "42b", "52b", "62b", "72b", |
755 |
"82b", "92b", "a2b", "b2b", "c2b", "d2b", "e2b", "f2b", |
756 |
"03b", "13b", "23b", "33b", "43b", "53b", "63b", "73b", |
757 |
"83b", "93b", "a3b", "b3b", "c3b", "d3b", "e3b", "f3b", |
758 |
"04b", "14b", "24b", "34b", "44b", "54b", "64b", "74b", |
759 |
"84b", "94b", "a4b", "b4b", "c4b", "d4b", "e4b", "f4b", |
760 |
"05b", "15b", "25b", "35b", "45b", "55b", "65b", "75b", |
761 |
"85b", "95b", "a5b", "b5b", "c5b", "d5b", "e5b", "f5b", |
762 |
"06b", "16b", "26b", "36b", "46b", "56b", "66b", "76b", |
763 |
"86b", "96b", "a6b", "b6b", "c6b", "d6b", "e6b", "f6b", |
764 |
"07b", "17b", "27b", "37b", "47b", "57b", "67b", "77b", |
765 |
"87b", "97b", "a7b", "b7b", "c7b", "d7b", "e7b", "f7b", |
766 |
"08b", "18b", "28b", "38b", "48b", "58b", "68b", "78b", |
767 |
"88b", "98b", "a8b", "b8b", "c8b", "d8b", "e8b", "f8b", |
768 |
"09b", "19b", "29b", "39b", "49b", "59b", "69b", "79b", |
769 |
"89b", "99b", "a9b", "b9b", "c9b", "d9b", "e9b", "f9b", |
770 |
"0ab", "1ab", "2ab", "3ab", "4ab", "5ab", "6ab", "7ab", |
771 |
"8ab", "9ab", "aab", "bab", "cab", "dab", "eab", "fab", |
772 |
"0bb", "1bb", "2bb", "3bb", "4bb", "5bb", "6bb", "7bb", |
773 |
"8bb", "9bb", "abb", "bbb", "cbb", "dbb", "ebb", "fbb", |
774 |
"0cb", "1cb", "2cb", "3cb", "4cb", "5cb", "6cb", "7cb", |
775 |
"8cb", "9cb", "acb", "bcb", "ccb", "dcb", "ecb", "fcb", |
776 |
"0db", "1db", "2db", "3db", "4db", "5db", "6db", "7db", |
777 |
"8db", "9db", "adb", "bdb", "cdb", "ddb", "edb", "fdb", |
778 |
"0eb", "1eb", "2eb", "3eb", "4eb", "5eb", "6eb", "7eb", |
779 |
"8eb", "9eb", "aeb", "beb", "ceb", "deb", "eeb", "feb", |
780 |
"0fb", "1fb", "2fb", "3fb", "4fb", "5fb", "6fb", "7fb", |
781 |
"8fb", "9fb", "afb", "bfb", "cfb", "dfb", "efb", "ffb", |
782 |
"00c", "10c", "20c", "30c", "40c", "50c", "60c", "70c", |
783 |
"80c", "90c", "a0c", "b0c", "c0c", "d0c", "e0c", "f0c", |
784 |
"01c", "11c", "21c", "31c", "41c", "51c", "61c", "71c", |
785 |
"81c", "91c", "a1c", "b1c", "c1c", "d1c", "e1c", "f1c", |
786 |
"02c", "12c", "22c", "32c", "42c", "52c", "62c", "72c", |
787 |
"82c", "92c", "a2c", "b2c", "c2c", "d2c", "e2c", "f2c", |
788 |
"03c", "13c", "23c", "33c", "43c", "53c", "63c", "73c", |
789 |
"83c", "93c", "a3c", "b3c", "c3c", "d3c", "e3c", "f3c", |
790 |
"04c", "14c", "24c", "34c", "44c", "54c", "64c", "74c", |
791 |
"84c", "94c", "a4c", "b4c", "c4c", "d4c", "e4c", "f4c", |
792 |
"05c", "15c", "25c", "35c", "45c", "55c", "65c", "75c", |
793 |
"85c", "95c", "a5c", "b5c", "c5c", "d5c", "e5c", "f5c", |
794 |
"06c", "16c", "26c", "36c", "46c", "56c", "66c", "76c", |
795 |
"86c", "96c", "a6c", "b6c", "c6c", "d6c", "e6c", "f6c", |
796 |
"07c", "17c", "27c", "37c", "47c", "57c", "67c", "77c", |
797 |
"87c", "97c", "a7c", "b7c", "c7c", "d7c", "e7c", "f7c", |
798 |
"08c", "18c", "28c", "38c", "48c", "58c", "68c", "78c", |
799 |
"88c", "98c", "a8c", "b8c", "c8c", "d8c", "e8c", "f8c", |
800 |
"09c", "19c", "29c", "39c", "49c", "59c", "69c", "79c", |
801 |
"89c", "99c", "a9c", "b9c", "c9c", "d9c", "e9c", "f9c", |
802 |
"0ac", "1ac", "2ac", "3ac", "4ac", "5ac", "6ac", "7ac", |
803 |
"8ac", "9ac", "aac", "bac", "cac", "dac", "eac", "fac", |
804 |
"0bc", "1bc", "2bc", "3bc", "4bc", "5bc", "6bc", "7bc", |
805 |
"8bc", "9bc", "abc", "bbc", "cbc", "dbc", "ebc", "fbc", |
806 |
"0cc", "1cc", "2cc", "3cc", "4cc", "5cc", "6cc", "7cc", |
807 |
"8cc", "9cc", "acc", "bcc", "ccc", "dcc", "ecc", "fcc", |
808 |
"0dc", "1dc", "2dc", "3dc", "4dc", "5dc", "6dc", "7dc", |
809 |
"8dc", "9dc", "adc", "bdc", "cdc", "ddc", "edc", "fdc", |
810 |
"0ec", "1ec", "2ec", "3ec", "4ec", "5ec", "6ec", "7ec", |
811 |
"8ec", "9ec", "aec", "bec", "cec", "dec", "eec", "fec", |
812 |
"0fc", "1fc", "2fc", "3fc", "4fc", "5fc", "6fc", "7fc", |
813 |
"8fc", "9fc", "afc", "bfc", "cfc", "dfc", "efc", "ffc", |
814 |
"00d", "10d", "20d", "30d", "40d", "50d", "60d", "70d", |
815 |
"80d", "90d", "a0d", "b0d", "c0d", "d0d", "e0d", "f0d", |
816 |
"01d", "11d", "21d", "31d", "41d", "51d", "61d", "71d", |
817 |
"81d", "91d", "a1d", "b1d", "c1d", "d1d", "e1d", "f1d", |
818 |
"02d", "12d", "22d", "32d", "42d", "52d", "62d", "72d", |
819 |
"82d", "92d", "a2d", "b2d", "c2d", "d2d", "e2d", "f2d", |
820 |
"03d", "13d", "23d", "33d", "43d", "53d", "63d", "73d", |
821 |
"83d", "93d", "a3d", "b3d", "c3d", "d3d", "e3d", "f3d", |
822 |
"04d", "14d", "24d", "34d", "44d", "54d", "64d", "74d", |
823 |
"84d", "94d", "a4d", "b4d", "c4d", "d4d", "e4d", "f4d", |
824 |
"05d", "15d", "25d", "35d", "45d", "55d", "65d", "75d", |
825 |
"85d", "95d", "a5d", "b5d", "c5d", "d5d", "e5d", "f5d", |
826 |
"06d", "16d", "26d", "36d", "46d", "56d", "66d", "76d", |
827 |
"86d", "96d", "a6d", "b6d", "c6d", "d6d", "e6d", "f6d", |
828 |
"07d", "17d", "27d", "37d", "47d", "57d", "67d", "77d", |
829 |
"87d", "97d", "a7d", "b7d", "c7d", "d7d", "e7d", "f7d", |
830 |
"08d", "18d", "28d", "38d", "48d", "58d", "68d", "78d", |
831 |
"88d", "98d", "a8d", "b8d", "c8d", "d8d", "e8d", "f8d", |
832 |
"09d", "19d", "29d", "39d", "49d", "59d", "69d", "79d", |
833 |
"89d", "99d", "a9d", "b9d", "c9d", "d9d", "e9d", "f9d", |
834 |
"0ad", "1ad", "2ad", "3ad", "4ad", "5ad", "6ad", "7ad", |
835 |
"8ad", "9ad", "aad", "bad", "cad", "dad", "ead", "fad", |
836 |
"0bd", "1bd", "2bd", "3bd", "4bd", "5bd", "6bd", "7bd", |
837 |
"8bd", "9bd", "abd", "bbd", "cbd", "dbd", "ebd", "fbd", |
838 |
"0cd", "1cd", "2cd", "3cd", "4cd", "5cd", "6cd", "7cd", |
839 |
"8cd", "9cd", "acd", "bcd", "ccd", "dcd", "ecd", "fcd", |
840 |
"0dd", "1dd", "2dd", "3dd", "4dd", "5dd", "6dd", "7dd", |
841 |
"8dd", "9dd", "add", "bdd", "cdd", "ddd", "edd", "fdd", |
842 |
"0ed", "1ed", "2ed", "3ed", "4ed", "5ed", "6ed", "7ed", |
843 |
"8ed", "9ed", "aed", "bed", "ced", "ded", "eed", "fed", |
844 |
"0fd", "1fd", "2fd", "3fd", "4fd", "5fd", "6fd", "7fd", |
845 |
"8fd", "9fd", "afd", "bfd", "cfd", "dfd", "efd", "ffd", |
846 |
"00e", "10e", "20e", "30e", "40e", "50e", "60e", "70e", |
847 |
"80e", "90e", "a0e", "b0e", "c0e", "d0e", "e0e", "f0e", |
848 |
"01e", "11e", "21e", "31e", "41e", "51e", "61e", "71e", |
849 |
"81e", "91e", "a1e", "b1e", "c1e", "d1e", "e1e", "f1e", |
850 |
"02e", "12e", "22e", "32e", "42e", "52e", "62e", "72e", |
851 |
"82e", "92e", "a2e", "b2e", "c2e", "d2e", "e2e", "f2e", |
852 |
"03e", "13e", "23e", "33e", "43e", "53e", "63e", "73e", |
853 |
"83e", "93e", "a3e", "b3e", "c3e", "d3e", "e3e", "f3e", |
854 |
"04e", "14e", "24e", "34e", "44e", "54e", "64e", "74e", |
855 |
"84e", "94e", "a4e", "b4e", "c4e", "d4e", "e4e", "f4e", |
856 |
"05e", "15e", "25e", "35e", "45e", "55e", "65e", "75e", |
857 |
"85e", "95e", "a5e", "b5e", "c5e", "d5e", "e5e", "f5e", |
858 |
"06e", "16e", "26e", "36e", "46e", "56e", "66e", "76e", |
859 |
"86e", "96e", "a6e", "b6e", "c6e", "d6e", "e6e", "f6e", |
860 |
"07e", "17e", "27e", "37e", "47e", "57e", "67e", "77e", |
861 |
"87e", "97e", "a7e", "b7e", "c7e", "d7e", "e7e", "f7e", |
862 |
"08e", "18e", "28e", "38e", "48e", "58e", "68e", "78e", |
863 |
"88e", "98e", "a8e", "b8e", "c8e", "d8e", "e8e", "f8e", |
864 |
"09e", "19e", "29e", "39e", "49e", "59e", "69e", "79e", |
865 |
"89e", "99e", "a9e", "b9e", "c9e", "d9e", "e9e", "f9e", |
866 |
"0ae", "1ae", "2ae", "3ae", "4ae", "5ae", "6ae", "7ae", |
867 |
"8ae", "9ae", "aae", "bae", "cae", "dae", "eae", "fae", |
868 |
"0be", "1be", "2be", "3be", "4be", "5be", "6be", "7be", |
869 |
"8be", "9be", "abe", "bbe", "cbe", "dbe", "ebe", "fbe", |
870 |
"0ce", "1ce", "2ce", "3ce", "4ce", "5ce", "6ce", "7ce", |
871 |
"8ce", "9ce", "ace", "bce", "cce", "dce", "ece", "fce", |
872 |
"0de", "1de", "2de", "3de", "4de", "5de", "6de", "7de", |
873 |
"8de", "9de", "ade", "bde", "cde", "dde", "ede", "fde", |
874 |
"0ee", "1ee", "2ee", "3ee", "4ee", "5ee", "6ee", "7ee", |
875 |
"8ee", "9ee", "aee", "bee", "cee", "dee", "eee", "fee", |
876 |
"0fe", "1fe", "2fe", "3fe", "4fe", "5fe", "6fe", "7fe", |
877 |
"8fe", "9fe", "afe", "bfe", "cfe", "dfe", "efe", "ffe", |
878 |
"00f", "10f", "20f", "30f", "40f", "50f", "60f", "70f", |
879 |
"80f", "90f", "a0f", "b0f", "c0f", "d0f", "e0f", "f0f", |
880 |
"01f", "11f", "21f", "31f", "41f", "51f", "61f", "71f", |
881 |
"81f", "91f", "a1f", "b1f", "c1f", "d1f", "e1f", "f1f", |
882 |
"02f", "12f", "22f", "32f", "42f", "52f", "62f", "72f", |
883 |
"82f", "92f", "a2f", "b2f", "c2f", "d2f", "e2f", "f2f", |
884 |
"03f", "13f", "23f", "33f", "43f", "53f", "63f", "73f", |
885 |
"83f", "93f", "a3f", "b3f", "c3f", "d3f", "e3f", "f3f", |
886 |
"04f", "14f", "24f", "34f", "44f", "54f", "64f", "74f", |
887 |
"84f", "94f", "a4f", "b4f", "c4f", "d4f", "e4f", "f4f", |
888 |
"05f", "15f", "25f", "35f", "45f", "55f", "65f", "75f", |
889 |
"85f", "95f", "a5f", "b5f", "c5f", "d5f", "e5f", "f5f", |
890 |
"06f", "16f", "26f", "36f", "46f", "56f", "66f", "76f", |
891 |
"86f", "96f", "a6f", "b6f", "c6f", "d6f", "e6f", "f6f", |
892 |
"07f", "17f", "27f", "37f", "47f", "57f", "67f", "77f", |
893 |
"87f", "97f", "a7f", "b7f", "c7f", "d7f", "e7f", "f7f", |
894 |
"08f", "18f", "28f", "38f", "48f", "58f", "68f", "78f", |
895 |
"88f", "98f", "a8f", "b8f", "c8f", "d8f", "e8f", "f8f", |
896 |
"09f", "19f", "29f", "39f", "49f", "59f", "69f", "79f", |
897 |
"89f", "99f", "a9f", "b9f", "c9f", "d9f", "e9f", "f9f", |
898 |
"0af", "1af", "2af", "3af", "4af", "5af", "6af", "7af", |
899 |
"8af", "9af", "aaf", "baf", "caf", "daf", "eaf", "faf", |
900 |
"0bf", "1bf", "2bf", "3bf", "4bf", "5bf", "6bf", "7bf", |
901 |
"8bf", "9bf", "abf", "bbf", "cbf", "dbf", "ebf", "fbf", |
902 |
"0cf", "1cf", "2cf", "3cf", "4cf", "5cf", "6cf", "7cf", |
903 |
"8cf", "9cf", "acf", "bcf", "ccf", "dcf", "ecf", "fcf", |
904 |
"0df", "1df", "2df", "3df", "4df", "5df", "6df", "7df", |
905 |
"8df", "9df", "adf", "bdf", "cdf", "ddf", "edf", "fdf", |
906 |
"0ef", "1ef", "2ef", "3ef", "4ef", "5ef", "6ef", "7ef", |
907 |
"8ef", "9ef", "aef", "bef", "cef", "def", "eef", "fef", |
908 |
"0ff", "1ff", "2ff", "3ff", "4ff", "5ff", "6ff", "7ff", |
909 |
"8ff", "9ff", "aff", "bff", "cff", "dff", "eff", "fff" |
910 |
}; |
911 |
|
912 |
/** string table for upper-case hexadecimal values */ |
913 |
static const char *HEX[] = |
914 |
{ |
915 |
"", "1", "2", "3", "4", "5", "6", "7", |
916 |
"8", "9", "A", "B", "C", "D", "E", "F", |
917 |
"01", "11", "21", "31", "41", "51", "61", "71", |
918 |
"81", "91", "A1", "B1", "C1", "D1", "E1", "F1", |
919 |
"02", "12", "22", "32", "42", "52", "62", "72", |
920 |
"82", "92", "A2", "B2", "C2", "D2", "E2", "F2", |
921 |
"03", "13", "23", "33", "43", "53", "63", "73", |
922 |
"83", "93", "A3", "B3", "C3", "D3", "E3", "F3", |
923 |
"04", "14", "24", "34", "44", "54", "64", "74", |
924 |
"84", "94", "A4", "B4", "C4", "D4", "E4", "F4", |
925 |
"05", "15", "25", "35", "45", "55", "65", "75", |
926 |
"85", "95", "A5", "B5", "C5", "D5", "E5", "F5", |
927 |
"06", "16", "26", "36", "46", "56", "66", "76", |
928 |
"86", "96", "A6", "B6", "C6", "D6", "E6", "F6", |
929 |
"07", "17", "27", "37", "47", "57", "67", "77", |
930 |
"87", "97", "A7", "B7", "C7", "D7", "E7", "F7", |
931 |
"08", "18", "28", "38", "48", "58", "68", "78", |
932 |
"88", "98", "A8", "B8", "C8", "D8", "E8", "F8", |
933 |
"09", "19", "29", "39", "49", "59", "69", "79", |
934 |
"89", "99", "A9", "B9", "C9", "D9", "E9", "F9", |
935 |
"0A", "1A", "2A", "3A", "4A", "5A", "6A", "7A", |
936 |
"8A", "9A", "AA", "BA", "CA", "DA", "EA", "FA", |
937 |
"0B", "1B", "2B", "3B", "4B", "5B", "6B", "7B", |
938 |
"8B", "9B", "AB", "BB", "CB", "DB", "EB", "FB", |
939 |
"0C", "1C", "2C", "3C", "4C", "5C", "6C", "7C", |
940 |
"8C", "9C", "AC", "BC", "CC", "DC", "EC", "FC", |
941 |
"0D", "1D", "2D", "3D", "4D", "5D", "6D", "7D", |
942 |
"8D", "9D", "AD", "BD", "CD", "DD", "ED", "FD", |
943 |
"0E", "1E", "2E", "3E", "4E", "5E", "6E", "7E", |
944 |
"8E", "9E", "AE", "BE", "CE", "DE", "EE", "FE", |
945 |
"0F", "1F", "2F", "3F", "4F", "5F", "6F", "7F", |
946 |
"8F", "9F", "AF", "BF", "CF", "DF", "EF", "FF", |
947 |
"001", "101", "201", "301", "401", "501", "601", "701", |
948 |
"801", "901", "A01", "B01", "C01", "D01", "E01", "F01", |
949 |
"011", "111", "211", "311", "411", "511", "611", "711", |
950 |
"811", "911", "A11", "B11", "C11", "D11", "E11", "F11", |
951 |
"021", "121", "221", "321", "421", "521", "621", "721", |
952 |
"821", "921", "A21", "B21", "C21", "D21", "E21", "F21", |
953 |
"031", "131", "231", "331", "431", "531", "631", "731", |
954 |
"831", "931", "A31", "B31", "C31", "D31", "E31", "F31", |
955 |
"041", "141", "241", "341", "441", "541", "641", "741", |
956 |
"841", "941", "A41", "B41", "C41", "D41", "E41", "F41", |
957 |
"051", "151", "251", "351", "451", "551", "651", "751", |
958 |
"851", "951", "A51", "B51", "C51", "D51", "E51", "F51", |
959 |
"061", "161", "261", "361", "461", "561", "661", "761", |
960 |
"861", "961", "A61", "B61", "C61", "D61", "E61", "F61", |
961 |
"071", "171", "271", "371", "471", "571", "671", "771", |
962 |
"871", "971", "A71", "B71", "C71", "D71", "E71", "F71", |
963 |
"081", "181", "281", "381", "481", "581", "681", "781", |
964 |
"881", "981", "A81", "B81", "C81", "D81", "E81", "F81", |
965 |
"091", "191", "291", "391", "491", "591", "691", "791", |
966 |
"891", "991", "A91", "B91", "C91", "D91", "E91", "F91", |
967 |
"0A1", "1A1", "2A1", "3A1", "4A1", "5A1", "6A1", "7A1", |
968 |
"8A1", "9A1", "AA1", "BA1", "CA1", "DA1", "EA1", "FA1", |
969 |
"0B1", "1B1", "2B1", "3B1", "4B1", "5B1", "6B1", "7B1", |
970 |
"8B1", "9B1", "AB1", "BB1", "CB1", "DB1", "EB1", "FB1", |
971 |
"0C1", "1C1", "2C1", "3C1", "4C1", "5C1", "6C1", "7C1", |
972 |
"8C1", "9C1", "AC1", "BC1", "CC1", "DC1", "EC1", "FC1", |
973 |
"0D1", "1D1", "2D1", "3D1", "4D1", "5D1", "6D1", "7D1", |
974 |
"8D1", "9D1", "AD1", "BD1", "CD1", "DD1", "ED1", "FD1", |
975 |
"0E1", "1E1", "2E1", "3E1", "4E1", "5E1", "6E1", "7E1", |
976 |
"8E1", "9E1", "AE1", "BE1", "CE1", "DE1", "EE1", "FE1", |
977 |
"0F1", "1F1", "2F1", "3F1", "4F1", "5F1", "6F1", "7F1", |
978 |
"8F1", "9F1", "AF1", "BF1", "CF1", "DF1", "EF1", "FF1", |
979 |
"002", "102", "202", "302", "402", "502", "602", "702", |
980 |
"802", "902", "A02", "B02", "C02", "D02", "E02", "F02", |
981 |
"012", "112", "212", "312", "412", "512", "612", "712", |
982 |
"812", "912", "A12", "B12", "C12", "D12", "E12", "F12", |
983 |
"022", "122", "222", "322", "422", "522", "622", "722", |
984 |
"822", "922", "A22", "B22", "C22", "D22", "E22", "F22", |
985 |
"032", "132", "232", "332", "432", "532", "632", "732", |
986 |
"832", "932", "A32", "B32", "C32", "D32", "E32", "F32", |
987 |
"042", "142", "242", "342", "442", "542", "642", "742", |
988 |
"842", "942", "A42", "B42", "C42", "D42", "E42", "F42", |
989 |
"052", "152", "252", "352", "452", "552", "652", "752", |
990 |
"852", "952", "A52", "B52", "C52", "D52", "E52", "F52", |
991 |
"062", "162", "262", "362", "462", "562", "662", "762", |
992 |
"862", "962", "A62", "B62", "C62", "D62", "E62", "F62", |
993 |
"072", "172", "272", "372", "472", "572", "672", "772", |
994 |
"872", "972", "A72", "B72", "C72", "D72", "E72", "F72", |
995 |
"082", "182", "282", "382", "482", "582", "682", "782", |
996 |
"882", "982", "A82", "B82", "C82", "D82", "E82", "F82", |
997 |
"092", "192", "292", "392", "492", "592", "692", "792", |
998 |
"892", "992", "A92", "B92", "C92", "D92", "E92", "F92", |
999 |
"0A2", "1A2", "2A2", "3A2", "4A2", "5A2", "6A2", "7A2", |
1000 |
"8A2", "9A2", "AA2", "BA2", "CA2", "DA2", "EA2", "FA2", |
1001 |
"0B2", "1B2", "2B2", "3B2", "4B2", "5B2", "6B2", "7B2", |
1002 |
"8B2", "9B2", "AB2", "BB2", "CB2", "DB2", "EB2", "FB2", |
1003 |
"0C2", "1C2", "2C2", "3C2", "4C2", "5C2", "6C2", "7C2", |
1004 |
"8C2", "9C2", "AC2", "BC2", "CC2", "DC2", "EC2", "FC2", |
1005 |
"0D2", "1D2", "2D2", "3D2", "4D2", "5D2", "6D2", "7D2", |
1006 |
"8D2", "9D2", "AD2", "BD2", "CD2", "DD2", "ED2", "FD2", |
1007 |
"0E2", "1E2", "2E2", "3E2", "4E2", "5E2", "6E2", "7E2", |
1008 |
"8E2", "9E2", "AE2", "BE2", "CE2", "DE2", "EE2", "FE2", |
1009 |
"0F2", "1F2", "2F2", "3F2", "4F2", "5F2", "6F2", "7F2", |
1010 |
"8F2", "9F2", "AF2", "BF2", "CF2", "DF2", "EF2", "FF2", |
1011 |
"003", "103", "203", "303", "403", "503", "603", "703", |
1012 |
"803", "903", "A03", "B03", "C03", "D03", "E03", "F03", |
1013 |
"013", "113", "213", "313", "413", "513", "613", "713", |
1014 |
"813", "913", "A13", "B13", "C13", "D13", "E13", "F13", |
1015 |
"023", "123", "223", "323", "423", "523", "623", "723", |
1016 |
"823", "923", "A23", "B23", "C23", "D23", "E23", "F23", |
1017 |
"033", "133", "233", "333", "433", "533", "633", "733", |
1018 |
"833", "933", "A33", "B33", "C33", "D33", "E33", "F33", |
1019 |
"043", "143", "243", "343", "443", "543", "643", "743", |
1020 |
"843", "943", "A43", "B43", "C43", "D43", "E43", "F43", |
1021 |
"053", "153", "253", "353", "453", "553", "653", "753", |
1022 |
"853", "953", "A53", "B53", "C53", "D53", "E53", "F53", |
1023 |
"063", "163", "263", "363", "463", "563", "663", "763", |
1024 |
"863", "963", "A63", "B63", "C63", "D63", "E63", "F63", |
1025 |
"073", "173", "273", "373", "473", "573", "673", "773", |
1026 |
"873", "973", "A73", "B73", "C73", "D73", "E73", "F73", |
1027 |
"083", "183", "283", "383", "483", "583", "683", "783", |
1028 |
"883", "983", "A83", "B83", "C83", "D83", "E83", "F83", |
1029 |
"093", "193", "293", "393", "493", "593", "693", "793", |
1030 |
"893", "993", "A93", "B93", "C93", "D93", "E93", "F93", |
1031 |
"0A3", "1A3", "2A3", "3A3", "4A3", "5A3", "6A3", "7A3", |
1032 |
"8A3", "9A3", "AA3", "BA3", "CA3", "DA3", "EA3", "FA3", |
1033 |
"0B3", "1B3", "2B3", "3B3", "4B3", "5B3", "6B3", "7B3", |
1034 |
"8B3", "9B3", "AB3", "BB3", "CB3", "DB3", "EB3", "FB3", |
1035 |
"0C3", "1C3", "2C3", "3C3", "4C3", "5C3", "6C3", "7C3", |
1036 |
"8C3", "9C3", "AC3", "BC3", "CC3", "DC3", "EC3", "FC3", |
1037 |
"0D3", "1D3", "2D3", "3D3", "4D3", "5D3", "6D3", "7D3", |
1038 |
"8D3", "9D3", "AD3", "BD3", "CD3", "DD3", "ED3", "FD3", |
1039 |
"0E3", "1E3", "2E3", "3E3", "4E3", "5E3", "6E3", "7E3", |
1040 |
"8E3", "9E3", "AE3", "BE3", "CE3", "DE3", "EE3", "FE3", |
1041 |
"0F3", "1F3", "2F3", "3F3", "4F3", "5F3", "6F3", "7F3", |
1042 |
"8F3", "9F3", "AF3", "BF3", "CF3", "DF3", "EF3", "FF3", |
1043 |
"004", "104", "204", "304", "404", "504", "604", "704", |
1044 |
"804", "904", "A04", "B04", "C04", "D04", "E04", "F04", |
1045 |
"014", "114", "214", "314", "414", "514", "614", "714", |
1046 |
"814", "914", "A14", "B14", "C14", "D14", "E14", "F14", |
1047 |
"024", "124", "224", "324", "424", "524", "624", "724", |
1048 |
"824", "924", "A24", "B24", "C24", "D24", "E24", "F24", |
1049 |
"034", "134", "234", "334", "434", "534", "634", "734", |
1050 |
"834", "934", "A34", "B34", "C34", "D34", "E34", "F34", |
1051 |
"044", "144", "244", "344", "444", "544", "644", "744", |
1052 |
"844", "944", "A44", "B44", "C44", "D44", "E44", "F44", |
1053 |
"054", "154", "254", "354", "454", "554", "654", "754", |
1054 |
"854", "954", "A54", "B54", "C54", "D54", "E54", "F54", |
1055 |
"064", "164", "264", "364", "464", "564", "664", "764", |
1056 |
"864", "964", "A64", "B64", "C64", "D64", "E64", "F64", |
1057 |
"074", "174", "274", "374", "474", "574", "674", "774", |
1058 |
"874", "974", "A74", "B74", "C74", "D74", "E74", "F74", |
1059 |
"084", "184", "284", "384", "484", "584", "684", "784", |
1060 |
"884", "984", "A84", "B84", "C84", "D84", "E84", "F84", |
1061 |
"094", "194", "294", "394", "494", "594", "694", "794", |
1062 |
"894", "994", "A94", "B94", "C94", "D94", "E94", "F94", |
1063 |
"0A4", "1A4", "2A4", "3A4", "4A4", "5A4", "6A4", "7A4", |
1064 |
"8A4", "9A4", "AA4", "BA4", "CA4", "DA4", "EA4", "FA4", |
1065 |
"0B4", "1B4", "2B4", "3B4", "4B4", "5B4", "6B4", "7B4", |
1066 |
"8B4", "9B4", "AB4", "BB4", "CB4", "DB4", "EB4", "FB4", |
1067 |
"0C4", "1C4", "2C4", "3C4", "4C4", "5C4", "6C4", "7C4", |
1068 |
"8C4", "9C4", "AC4", "BC4", "CC4", "DC4", "EC4", "FC4", |
1069 |
"0D4", "1D4", "2D4", "3D4", "4D4", "5D4", "6D4", "7D4", |
1070 |
"8D4", "9D4", "AD4", "BD4", "CD4", "DD4", "ED4", "FD4", |
1071 |
"0E4", "1E4", "2E4", "3E4", "4E4", "5E4", "6E4", "7E4", |
1072 |
"8E4", "9E4", "AE4", "BE4", "CE4", "DE4", "EE4", "FE4", |
1073 |
"0F4", "1F4", "2F4", "3F4", "4F4", "5F4", "6F4", "7F4", |
1074 |
"8F4", "9F4", "AF4", "BF4", "CF4", "DF4", "EF4", "FF4", |
1075 |
"005", "105", "205", "305", "405", "505", "605", "705", |
1076 |
"805", "905", "A05", "B05", "C05", "D05", "E05", "F05", |
1077 |
"015", "115", "215", "315", "415", "515", "615", "715", |
1078 |
"815", "915", "A15", "B15", "C15", "D15", "E15", "F15", |
1079 |
"025", "125", "225", "325", "425", "525", "625", "725", |
1080 |
"825", "925", "A25", "B25", "C25", "D25", "E25", "F25", |
1081 |
"035", "135", "235", "335", "435", "535", "635", "735", |
1082 |
"835", "935", "A35", "B35", "C35", "D35", "E35", "F35", |
1083 |
"045", "145", "245", "345", "445", "545", "645", "745", |
1084 |
"845", "945", "A45", "B45", "C45", "D45", "E45", "F45", |
1085 |
"055", "155", "255", "355", "455", "555", "655", "755", |
1086 |
"855", "955", "A55", "B55", "C55", "D55", "E55", "F55", |
1087 |
"065", "165", "265", "365", "465", "565", "665", "765", |
1088 |
"865", "965", "A65", "B65", "C65", "D65", "E65", "F65", |
1089 |
"075", "175", "275", "375", "475", "575", "675", "775", |
1090 |
"875", "975", "A75", "B75", "C75", "D75", "E75", "F75", |
1091 |
"085", "185", "285", "385", "485", "585", "685", "785", |
1092 |
"885", "985", "A85", "B85", "C85", "D85", "E85", "F85", |
1093 |
"095", "195", "295", "395", "495", "595", "695", "795", |
1094 |
"895", "995", "A95", "B95", "C95", "D95", "E95", "F95", |
1095 |
"0A5", "1A5", "2A5", "3A5", "4A5", "5A5", "6A5", "7A5", |
1096 |
"8A5", "9A5", "AA5", "BA5", "CA5", "DA5", "EA5", "FA5", |
1097 |
"0B5", "1B5", "2B5", "3B5", "4B5", "5B5", "6B5", "7B5", |
1098 |
"8B5", "9B5", "AB5", "BB5", "CB5", "DB5", "EB5", "FB5", |
1099 |
"0C5", "1C5", "2C5", "3C5", "4C5", "5C5", "6C5", "7C5", |
1100 |
"8C5", "9C5", "AC5", "BC5", "CC5", "DC5", "EC5", "FC5", |
1101 |
"0D5", "1D5", "2D5", "3D5", "4D5", "5D5", "6D5", "7D5", |
1102 |
"8D5", "9D5", "AD5", "BD5", "CD5", "DD5", "ED5", "FD5", |
1103 |
"0E5", "1E5", "2E5", "3E5", "4E5", "5E5", "6E5", "7E5", |
1104 |
"8E5", "9E5", "AE5", "BE5", "CE5", "DE5", "EE5", "FE5", |
1105 |
"0F5", "1F5", "2F5", "3F5", "4F5", "5F5", "6F5", "7F5", |
1106 |
"8F5", "9F5", "AF5", "BF5", "CF5", "DF5", "EF5", "FF5", |
1107 |
"006", "106", "206", "306", "406", "506", "606", "706", |
1108 |
"806", "906", "A06", "B06", "C06", "D06", "E06", "F06", |
1109 |
"016", "116", "216", "316", "416", "516", "616", "716", |
1110 |
"816", "916", "A16", "B16", "C16", "D16", "E16", "F16", |
1111 |
"026", "126", "226", "326", "426", "526", "626", "726", |
1112 |
"826", "926", "A26", "B26", "C26", "D26", "E26", "F26", |
1113 |
"036", "136", "236", "336", "436", "536", "636", "736", |
1114 |
"836", "936", "A36", "B36", "C36", "D36", "E36", "F36", |
1115 |
"046", "146", "246", "346", "446", "546", "646", "746", |
1116 |
"846", "946", "A46", "B46", "C46", "D46", "E46", "F46", |
1117 |
"056", "156", "256", "356", "456", "556", "656", "756", |
1118 |
"856", "956", "A56", "B56", "C56", "D56", "E56", "F56", |
1119 |
"066", "166", "266", "366", "466", "566", "666", "766", |
1120 |
"866", "966", "A66", "B66", "C66", "D66", "E66", "F66", |
1121 |
"076", "176", "276", "376", "476", "576", "676", "776", |
1122 |
"876", "976", "A76", "B76", "C76", "D76", "E76", "F76", |
1123 |
"086", "186", "286", "386", "486", "586", "686", "786", |
1124 |
"886", "986", "A86", "B86", "C86", "D86", "E86", "F86", |
1125 |
"096", "196", "296", "396", "496", "596", "696", "796", |
1126 |
"896", "996", "A96", "B96", "C96", "D96", "E96", "F96", |
1127 |
"0A6", "1A6", "2A6", "3A6", "4A6", "5A6", "6A6", "7A6", |
1128 |
"8A6", "9A6", "AA6", "BA6", "CA6", "DA6", "EA6", "FA6", |
1129 |
"0B6", "1B6", "2B6", "3B6", "4B6", "5B6", "6B6", "7B6", |
1130 |
"8B6", "9B6", "AB6", "BB6", "CB6", "DB6", "EB6", "FB6", |
1131 |
"0C6", "1C6", "2C6", "3C6", "4C6", "5C6", "6C6", "7C6", |
1132 |
"8C6", "9C6", "AC6", "BC6", "CC6", "DC6", "EC6", "FC6", |
1133 |
"0D6", "1D6", "2D6", "3D6", "4D6", "5D6", "6D6", "7D6", |
1134 |
"8D6", "9D6", "AD6", "BD6", "CD6", "DD6", "ED6", "FD6", |
1135 |
"0E6", "1E6", "2E6", "3E6", "4E6", "5E6", "6E6", "7E6", |
1136 |
"8E6", "9E6", "AE6", "BE6", "CE6", "DE6", "EE6", "FE6", |
1137 |
"0F6", "1F6", "2F6", "3F6", "4F6", "5F6", "6F6", "7F6", |
1138 |
"8F6", "9F6", "AF6", "BF6", "CF6", "DF6", "EF6", "FF6", |
1139 |
"007", "107", "207", "307", "407", "507", "607", "707", |
1140 |
"807", "907", "A07", "B07", "C07", "D07", "E07", "F07", |
1141 |
"017", "117", "217", "317", "417", "517", "617", "717", |
1142 |
"817", "917", "A17", "B17", "C17", "D17", "E17", "F17", |
1143 |
"027", "127", "227", "327", "427", "527", "627", "727", |
1144 |
"827", "927", "A27", "B27", "C27", "D27", "E27", "F27", |
1145 |
"037", "137", "237", "337", "437", "537", "637", "737", |
1146 |
"837", "937", "A37", "B37", "C37", "D37", "E37", "F37", |
1147 |
"047", "147", "247", "347", "447", "547", "647", "747", |
1148 |
"847", "947", "A47", "B47", "C47", "D47", "E47", "F47", |
1149 |
"057", "157", "257", "357", "457", "557", "657", "757", |
1150 |
"857", "957", "A57", "B57", "C57", "D57", "E57", "F57", |
1151 |
"067", "167", "267", "367", "467", "567", "667", "767", |
1152 |
"867", "967", "A67", "B67", "C67", "D67", "E67", "F67", |
1153 |
"077", "177", "277", "377", "477", "577", "677", "777", |
1154 |
"877", "977", "A77", "B77", "C77", "D77", "E77", "F77", |
1155 |
"087", "187", "287", "387", "487", "587", "687", "787", |
1156 |
"887", "987", "A87", "B87", "C87", "D87", "E87", "F87", |
1157 |
"097", "197", "297", "397", "497", "597", "697", "797", |
1158 |
"897", "997", "A97", "B97", "C97", "D97", "E97", "F97", |
1159 |
"0A7", "1A7", "2A7", "3A7", "4A7", "5A7", "6A7", "7A7", |
1160 |
"8A7", "9A7", "AA7", "BA7", "CA7", "DA7", "EA7", "FA7", |
1161 |
"0B7", "1B7", "2B7", "3B7", "4B7", "5B7", "6B7", "7B7", |
1162 |
"8B7", "9B7", "AB7", "BB7", "CB7", "DB7", "EB7", "FB7", |
1163 |
"0C7", "1C7", "2C7", "3C7", "4C7", "5C7", "6C7", "7C7", |
1164 |
"8C7", "9C7", "AC7", "BC7", "CC7", "DC7", "EC7", "FC7", |
1165 |
"0D7", "1D7", "2D7", "3D7", "4D7", "5D7", "6D7", "7D7", |
1166 |
"8D7", "9D7", "AD7", "BD7", "CD7", "DD7", "ED7", "FD7", |
1167 |
"0E7", "1E7", "2E7", "3E7", "4E7", "5E7", "6E7", "7E7", |
1168 |
"8E7", "9E7", "AE7", "BE7", "CE7", "DE7", "EE7", "FE7", |
1169 |
"0F7", "1F7", "2F7", "3F7", "4F7", "5F7", "6F7", "7F7", |
1170 |
"8F7", "9F7", "AF7", "BF7", "CF7", "DF7", "EF7", "FF7", |
1171 |
"008", "108", "208", "308", "408", "508", "608", "708", |
1172 |
"808", "908", "A08", "B08", "C08", "D08", "E08", "F08", |
1173 |
"018", "118", "218", "318", "418", "518", "618", "718", |
1174 |
"818", "918", "A18", "B18", "C18", "D18", "E18", "F18", |
1175 |
"028", "128", "228", "328", "428", "528", "628", "728", |
1176 |
"828", "928", "A28", "B28", "C28", "D28", "E28", "F28", |
1177 |
"038", "138", "238", "338", "438", "538", "638", "738", |
1178 |
"838", "938", "A38", "B38", "C38", "D38", "E38", "F38", |
1179 |
"048", "148", "248", "348", "448", "548", "648", "748", |
1180 |
"848", "948", "A48", "B48", "C48", "D48", "E48", "F48", |
1181 |
"058", "158", "258", "358", "458", "558", "658", "758", |
1182 |
"858", "958", "A58", "B58", "C58", "D58", "E58", "F58", |
1183 |
"068", "168", "268", "368", "468", "568", "668", "768", |
1184 |
"868", "968", "A68", "B68", "C68", "D68", "E68", "F68", |
1185 |
"078", "178", "278", "378", "478", "578", "678", "778", |
1186 |
"878", "978", "A78", "B78", "C78", "D78", "E78", "F78", |
1187 |
"088", "188", "288", "388", "488", "588", "688", "788", |
1188 |
"888", "988", "A88", "B88", "C88", "D88", "E88", "F88", |
1189 |
"098", "198", "298", "398", "498", "598", "698", "798", |
1190 |
"898", "998", "A98", "B98", "C98", "D98", "E98", "F98", |
1191 |
"0A8", "1A8", "2A8", "3A8", "4A8", "5A8", "6A8", "7A8", |
1192 |
"8A8", "9A8", "AA8", "BA8", "CA8", "DA8", "EA8", "FA8", |
1193 |
"0B8", "1B8", "2B8", "3B8", "4B8", "5B8", "6B8", "7B8", |
1194 |
"8B8", "9B8", "AB8", "BB8", "CB8", "DB8", "EB8", "FB8", |
1195 |
"0C8", "1C8", "2C8", "3C8", "4C8", "5C8", "6C8", "7C8", |
1196 |
"8C8", "9C8", "AC8", "BC8", "CC8", "DC8", "EC8", "FC8", |
1197 |
"0D8", "1D8", "2D8", "3D8", "4D8", "5D8", "6D8", "7D8", |
1198 |
"8D8", "9D8", "AD8", "BD8", "CD8", "DD8", "ED8", "FD8", |
1199 |
"0E8", "1E8", "2E8", "3E8", "4E8", "5E8", "6E8", "7E8", |
1200 |
"8E8", "9E8", "AE8", "BE8", "CE8", "DE8", "EE8", "FE8", |
1201 |
"0F8", "1F8", "2F8", "3F8", "4F8", "5F8", "6F8", "7F8", |
1202 |
"8F8", "9F8", "AF8", "BF8", "CF8", "DF8", "EF8", "FF8", |
1203 |
"009", "109", "209", "309", "409", "509", "609", "709", |
1204 |
"809", "909", "A09", "B09", "C09", "D09", "E09", "F09", |
1205 |
"019", "119", "219", "319", "419", "519", "619", "719", |
1206 |
"819", "919", "A19", "B19", "C19", "D19", "E19", "F19", |
1207 |
"029", "129", "229", "329", "429", "529", "629", "729", |
1208 |
"829", "929", "A29", "B29", "C29", "D29", "E29", "F29", |
1209 |
"039", "139", "239", "339", "439", "539", "639", "739", |
1210 |
"839", "939", "A39", "B39", "C39", "D39", "E39", "F39", |
1211 |
"049", "149", "249", "349", "449", "549", "649", "749", |
1212 |
"849", "949", "A49", "B49", "C49", "D49", "E49", "F49", |
1213 |
"059", "159", "259", "359", "459", "559", "659", "759", |
1214 |
"859", "959", "A59", "B59", "C59", "D59", "E59", "F59", |
1215 |
"069", "169", "269", "369", "469", "569", "669", "769", |
1216 |
"869", "969", "A69", "B69", "C69", "D69", "E69", "F69", |
1217 |
"079", "179", "279", "379", "479", "579", "679", "779", |
1218 |
"879", "979", "A79", "B79", "C79", "D79", "E79", "F79", |
1219 |
"089", "189", "289", "389", "489", "589", "689", "789", |
1220 |
"889", "989", "A89", "B89", "C89", "D89", "E89", "F89", |
1221 |
"099", "199", "299", "399", "499", "599", "699", "799", |
1222 |
"899", "999", "A99", "B99", "C99", "D99", "E99", "F99", |
1223 |
"0A9", "1A9", "2A9", "3A9", "4A9", "5A9", "6A9", "7A9", |
1224 |
"8A9", "9A9", "AA9", "BA9", "CA9", "DA9", "EA9", "FA9", |
1225 |
"0B9", "1B9", "2B9", "3B9", "4B9", "5B9", "6B9", "7B9", |
1226 |
"8B9", "9B9", "AB9", "BB9", "CB9", "DB9", "EB9", "FB9", |
1227 |
"0C9", "1C9", "2C9", "3C9", "4C9", "5C9", "6C9", "7C9", |
1228 |
"8C9", "9C9", "AC9", "BC9", "CC9", "DC9", "EC9", "FC9", |
1229 |
"0D9", "1D9", "2D9", "3D9", "4D9", "5D9", "6D9", "7D9", |
1230 |
"8D9", "9D9", "AD9", "BD9", "CD9", "DD9", "ED9", "FD9", |
1231 |
"0E9", "1E9", "2E9", "3E9", "4E9", "5E9", "6E9", "7E9", |
1232 |
"8E9", "9E9", "AE9", "BE9", "CE9", "DE9", "EE9", "FE9", |
1233 |
"0F9", "1F9", "2F9", "3F9", "4F9", "5F9", "6F9", "7F9", |
1234 |
"8F9", "9F9", "AF9", "BF9", "CF9", "DF9", "EF9", "FF9", |
1235 |
"00A", "10A", "20A", "30A", "40A", "50A", "60A", "70A", |
1236 |
"80A", "90A", "A0A", "B0A", "C0A", "D0A", "E0A", "F0A", |
1237 |
"01A", "11A", "21A", "31A", "41A", "51A", "61A", "71A", |
1238 |
"81A", "91A", "A1A", "B1A", "C1A", "D1A", "E1A", "F1A", |
1239 |
"02A", "12A", "22A", "32A", "42A", "52A", "62A", "72A", |
1240 |
"82A", "92A", "A2A", "B2A", "C2A", "D2A", "E2A", "F2A", |
1241 |
"03A", "13A", "23A", "33A", "43A", "53A", "63A", "73A", |
1242 |
"83A", "93A", "A3A", "B3A", "C3A", "D3A", "E3A", "F3A", |
1243 |
"04A", "14A", "24A", "34A", "44A", "54A", "64A", "74A", |
1244 |
"84A", "94A", "A4A", "B4A", "C4A", "D4A", "E4A", "F4A", |
1245 |
"05A", "15A", "25A", "35A", "45A", "55A", "65A", "75A", |
1246 |
"85A", "95A", "A5A", "B5A", "C5A", "D5A", "E5A", "F5A", |
1247 |
"06A", "16A", "26A", "36A", "46A", "56A", "66A", "76A", |
1248 |
"86A", "96A", "A6A", "B6A", "C6A", "D6A", "E6A", "F6A", |
1249 |
"07A", "17A", "27A", "37A", "47A", "57A", "67A", "77A", |
1250 |
"87A", "97A", "A7A", "B7A", "C7A", "D7A", "E7A", "F7A", |
1251 |
"08A", "18A", "28A", "38A", "48A", "58A", "68A", "78A", |
1252 |
"88A", "98A", "A8A", "B8A", "C8A", "D8A", "E8A", "F8A", |
1253 |
"09A", "19A", "29A", "39A", "49A", "59A", "69A", "79A", |
1254 |
"89A", "99A", "A9A", "B9A", "C9A", "D9A", "E9A", "F9A", |
1255 |
"0AA", "1AA", "2AA", "3AA", "4AA", "5AA", "6AA", "7AA", |
1256 |
"8AA", "9AA", "AAA", "BAA", "CAA", "DAA", "EAA", "FAA", |
1257 |
"0BA", "1BA", "2BA", "3BA", "4BA", "5BA", "6BA", "7BA", |
1258 |
"8BA", "9BA", "ABA", "BBA", "CBA", "DBA", "EBA", "FBA", |
1259 |
"0CA", "1CA", "2CA", "3CA", "4CA", "5CA", "6CA", "7CA", |
1260 |
"8CA", "9CA", "ACA", "BCA", "CCA", "DCA", "ECA", "FCA", |
1261 |
"0DA", "1DA", "2DA", "3DA", "4DA", "5DA", "6DA", "7DA", |
1262 |
"8DA", "9DA", "ADA", "BDA", "CDA", "DDA", "EDA", "FDA", |
1263 |
"0EA", "1EA", "2EA", "3EA", "4EA", "5EA", "6EA", "7EA", |
1264 |
"8EA", "9EA", "AEA", "BEA", "CEA", "DEA", "EEA", "FEA", |
1265 |
"0FA", "1FA", "2FA", "3FA", "4FA", "5FA", "6FA", "7FA", |
1266 |
"8FA", "9FA", "AFA", "BFA", "CFA", "DFA", "EFA", "FFA", |
1267 |
"00B", "10B", "20B", "30B", "40B", "50B", "60B", "70B", |
1268 |
"80B", "90B", "A0B", "B0B", "C0B", "D0B", "E0B", "F0B", |
1269 |
"01B", "11B", "21B", "31B", "41B", "51B", "61B", "71B", |
1270 |
"81B", "91B", "A1B", "B1B", "C1B", "D1B", "E1B", "F1B", |
1271 |
"02B", "12B", "22B", "32B", "42B", "52B", "62B", "72B", |
1272 |
"82B", "92B", "A2B", "B2B", "C2B", "D2B", "E2B", "F2B", |
1273 |
"03B", "13B", "23B", "33B", "43B", "53B", "63B", "73B", |
1274 |
"83B", "93B", "A3B", "B3B", "C3B", "D3B", "E3B", "F3B", |
1275 |
"04B", "14B", "24B", "34B", "44B", "54B", "64B", "74B", |
1276 |
"84B", "94B", "A4B", "B4B", "C4B", "D4B", "E4B", "F4B", |
1277 |
"05B", "15B", "25B", "35B", "45B", "55B", "65B", "75B", |
1278 |
"85B", "95B", "A5B", "B5B", "C5B", "D5B", "E5B", "F5B", |
1279 |
"06B", "16B", "26B", "36B", "46B", "56B", "66B", "76B", |
1280 |
"86B", "96B", "A6B", "B6B", "C6B", "D6B", "E6B", "F6B", |
1281 |
"07B", "17B", "27B", "37B", "47B", "57B", "67B", "77B", |
1282 |
"87B", "97B", "A7B", "B7B", "C7B", "D7B", "E7B", "F7B", |
1283 |
"08B", "18B", "28B", "38B", "48B", "58B", "68B", "78B", |
1284 |
"88B", "98B", "A8B", "B8B", "C8B", "D8B", "E8B", "F8B", |
1285 |
"09B", "19B", "29B", "39B", "49B", "59B", "69B", "79B", |
1286 |
"89B", "99B", "A9B", "B9B", "C9B", "D9B", "E9B", "F9B", |
1287 |
"0AB", "1AB", "2AB", "3AB", "4AB", "5AB", "6AB", "7AB", |
1288 |
"8AB", "9AB", "AAB", "BAB", "CAB", "DAB", "EAB", "FAB", |
1289 |
"0BB", "1BB", "2BB", "3BB", "4BB", "5BB", "6BB", "7BB", |
1290 |
"8BB", "9BB", "ABB", "BBB", "CBB", "DBB", "EBB", "FBB", |
1291 |
"0CB", "1CB", "2CB", "3CB", "4CB", "5CB", "6CB", "7CB", |
1292 |
"8CB", "9CB", "ACB", "BCB", "CCB", "DCB", "ECB", "FCB", |
1293 |
"0DB", "1DB", "2DB", "3DB", "4DB", "5DB", "6DB", "7DB", |
1294 |
"8DB", "9DB", "ADB", "BDB", "CDB", "DDB", "EDB", "FDB", |
1295 |
"0EB", "1EB", "2EB", "3EB", "4EB", "5EB", "6EB", "7EB", |
1296 |
"8EB", "9EB", "AEB", "BEB", "CEB", "DEB", "EEB", "FEB", |
1297 |
"0FB", "1FB", "2FB", "3FB", "4FB", "5FB", "6FB", "7FB", |
1298 |
"8FB", "9FB", "AFB", "BFB", "CFB", "DFB", "EFB", "FFB", |
1299 |
"00C", "10C", "20C", "30C", "40C", "50C", "60C", "70C", |
1300 |
"80C", "90C", "A0C", "B0C", "C0C", "D0C", "E0C", "F0C", |
1301 |
"01C", "11C", "21C", "31C", "41C", "51C", "61C", "71C", |
1302 |
"81C", "91C", "A1C", "B1C", "C1C", "D1C", "E1C", "F1C", |
1303 |
"02C", "12C", "22C", "32C", "42C", "52C", "62C", "72C", |
1304 |
"82C", "92C", "A2C", "B2C", "C2C", "D2C", "E2C", "F2C", |
1305 |
"03C", "13C", "23C", "33C", "43C", "53C", "63C", "73C", |
1306 |
"83C", "93C", "A3C", "B3C", "C3C", "D3C", "E3C", "F3C", |
1307 |
"04C", "14C", "24C", "34C", "44C", "54C", "64C", "74C", |
1308 |
"84C", "94C", "A4C", "B4C", "C4C", "D4C", "E4C", "F4C", |
1309 |
"05C", "15C", "25C", "35C", "45C", "55C", "65C", "75C", |
1310 |
"85C", "95C", "A5C", "B5C", "C5C", "D5C", "E5C", "F5C", |
1311 |
"06C", "16C", "26C", "36C", "46C", "56C", "66C", "76C", |
1312 |
"86C", "96C", "A6C", "B6C", "C6C", "D6C", "E6C", "F6C", |
1313 |
"07C", "17C", "27C", "37C", "47C", "57C", "67C", "77C", |
1314 |
"87C", "97C", "A7C", "B7C", "C7C", "D7C", "E7C", "F7C", |
1315 |
"08C", "18C", "28C", "38C", "48C", "58C", "68C", "78C", |
1316 |
"88C", "98C", "A8C", "B8C", "C8C", "D8C", "E8C", "F8C", |
1317 |
"09C", "19C", "29C", "39C", "49C", "59C", "69C", "79C", |
1318 |
"89C", "99C", "A9C", "B9C", "C9C", "D9C", "E9C", "F9C", |
1319 |
"0AC", "1AC", "2AC", "3AC", "4AC", "5AC", "6AC", "7AC", |
1320 |
"8AC", "9AC", "AAC", "BAC", "CAC", "DAC", "EAC", "FAC", |
1321 |
"0BC", "1BC", "2BC", "3BC", "4BC", "5BC", "6BC", "7BC", |
1322 |
"8BC", "9BC", "ABC", "BBC", "CBC", "DBC", "EBC", "FBC", |
1323 |
"0CC", "1CC", "2CC", "3CC", "4CC", "5CC", "6CC", "7CC", |
1324 |
"8CC", "9CC", "ACC", "BCC", "CCC", "DCC", "ECC", "FCC", |
1325 |
"0DC", "1DC", "2DC", "3DC", "4DC", "5DC", "6DC", "7DC", |
1326 |
"8DC", "9DC", "ADC", "BDC", "CDC", "DDC", "EDC", "FDC", |
1327 |
"0EC", "1EC", "2EC", "3EC", "4EC", "5EC", "6EC", "7EC", |
1328 |
"8EC", "9EC", "AEC", "BEC", "CEC", "DEC", "EEC", "FEC", |
1329 |
"0FC", "1FC", "2FC", "3FC", "4FC", "5FC", "6FC", "7FC", |
1330 |
"8FC", "9FC", "AFC", "BFC", "CFC", "DFC", "EFC", "FFC", |
1331 |
"00D", "10D", "20D", "30D", "40D", "50D", "60D", "70D", |
1332 |
"80D", "90D", "A0D", "B0D", "C0D", "D0D", "E0D", "F0D", |
1333 |
"01D", "11D", "21D", "31D", "41D", "51D", "61D", "71D", |
1334 |
"81D", "91D", "A1D", "B1D", "C1D", "D1D", "E1D", "F1D", |
1335 |
"02D", "12D", "22D", "32D", "42D", "52D", "62D", "72D", |
1336 |
"82D", "92D", "A2D", "B2D", "C2D", "D2D", "E2D", "F2D", |
1337 |
"03D", "13D", "23D", "33D", "43D", "53D", "63D", "73D", |
1338 |
"83D", "93D", "A3D", "B3D", "C3D", "D3D", "E3D", "F3D", |
1339 |
"04D", "14D", "24D", "34D", "44D", "54D", "64D", "74D", |
1340 |
"84D", "94D", "A4D", "B4D", "C4D", "D4D", "E4D", "F4D", |
1341 |
"05D", "15D", "25D", "35D", "45D", "55D", "65D", "75D", |
1342 |
"85D", "95D", "A5D", "B5D", "C5D", "D5D", "E5D", "F5D", |
1343 |
"06D", "16D", "26D", "36D", "46D", "56D", "66D", "76D", |
1344 |
"86D", "96D", "A6D", "B6D", "C6D", "D6D", "E6D", "F6D", |
1345 |
"07D", "17D", "27D", "37D", "47D", "57D", "67D", "77D", |
1346 |
"87D", "97D", "A7D", "B7D", "C7D", "D7D", "E7D", "F7D", |
1347 |
"08D", "18D", "28D", "38D", "48D", "58D", "68D", "78D", |
1348 |
"88D", "98D", "A8D", "B8D", "C8D", "D8D", "E8D", "F8D", |
1349 |
"09D", "19D", "29D", "39D", "49D", "59D", "69D", "79D", |
1350 |
"89D", "99D", "A9D", "B9D", "C9D", "D9D", "E9D", "F9D", |
1351 |
"0AD", "1AD", "2AD", "3AD", "4AD", "5AD", "6AD", "7AD", |
1352 |
"8AD", "9AD", "AAD", "BAD", "CAD", "DAD", "EAD", "FAD", |
1353 |
"0BD", "1BD", "2BD", "3BD", "4BD", "5BD", "6BD", "7BD", |
1354 |
"8BD", "9BD", "ABD", "BBD", "CBD", "DBD", "EBD", "FBD", |
1355 |
"0CD", "1CD", "2CD", "3CD", "4CD", "5CD", "6CD", "7CD", |
1356 |
"8CD", "9CD", "ACD", "BCD", "CCD", "DCD", "ECD", "FCD", |
1357 |
"0DD", "1DD", "2DD", "3DD", "4DD", "5DD", "6DD", "7DD", |
1358 |
"8DD", "9DD", "ADD", "BDD", "CDD", "DDD", "EDD", "FDD", |
1359 |
"0ED", "1ED", "2ED", "3ED", "4ED", "5ED", "6ED", "7ED", |
1360 |
"8ED", "9ED", "AED", "BED", "CED", "DED", "EED", "FED", |
1361 |
"0FD", "1FD", "2FD", "3FD", "4FD", "5FD", "6FD", "7FD", |
1362 |
"8FD", "9FD", "AFD", "BFD", "CFD", "DFD", "EFD", "FFD", |
1363 |
"00E", "10E", "20E", "30E", "40E", "50E", "60E", "70E", |
1364 |
"80E", "90E", "A0E", "B0E", "C0E", "D0E", "E0E", "F0E", |
1365 |
"01E", "11E", "21E", "31E", "41E", "51E", "61E", "71E", |
1366 |
"81E", "91E", "A1E", "B1E", "C1E", "D1E", "E1E", "F1E", |
1367 |
"02E", "12E", "22E", "32E", "42E", "52E", "62E", "72E", |
1368 |
"82E", "92E", "A2E", "B2E", "C2E", "D2E", "E2E", "F2E", |
1369 |
"03E", "13E", "23E", "33E", "43E", "53E", "63E", "73E", |
1370 |
"83E", "93E", "A3E", "B3E", "C3E", "D3E", "E3E", "F3E", |
1371 |
"04E", "14E", "24E", "34E", "44E", "54E", "64E", "74E", |
1372 |
"84E", "94E", "A4E", "B4E", "C4E", "D4E", "E4E", "F4E", |
1373 |
"05E", "15E", "25E", "35E", "45E", "55E", "65E", "75E", |
1374 |
"85E", "95E", "A5E", "B5E", "C5E", "D5E", "E5E", "F5E", |
1375 |
"06E", "16E", "26E", "36E", "46E", "56E", "66E", "76E", |
1376 |
"86E", "96E", "A6E", "B6E", "C6E", "D6E", "E6E", "F6E", |
1377 |
"07E", "17E", "27E", "37E", "47E", "57E", "67E", "77E", |
1378 |
"87E", "97E", "A7E", "B7E", "C7E", "D7E", "E7E", "F7E", |
1379 |
"08E", "18E", "28E", "38E", "48E", "58E", "68E", "78E", |
1380 |
"88E", "98E", "A8E", "B8E", "C8E", "D8E", "E8E", "F8E", |
1381 |
"09E", "19E", "29E", "39E", "49E", "59E", "69E", "79E", |
1382 |
"89E", "99E", "A9E", "B9E", "C9E", "D9E", "E9E", "F9E", |
1383 |
"0AE", "1AE", "2AE", "3AE", "4AE", "5AE", "6AE", "7AE", |
1384 |
"8AE", "9AE", "AAE", "BAE", "CAE", "DAE", "EAE", "FAE", |
1385 |
"0BE", "1BE", "2BE", "3BE", "4BE", "5BE", "6BE", "7BE", |
1386 |
"8BE", "9BE", "ABE", "BBE", "CBE", "DBE", "EBE", "FBE", |
1387 |
"0CE", "1CE", "2CE", "3CE", "4CE", "5CE", "6CE", "7CE", |
1388 |
"8CE", "9CE", "ACE", "BCE", "CCE", "DCE", "ECE", "FCE", |
1389 |
"0DE", "1DE", "2DE", "3DE", "4DE", "5DE", "6DE", "7DE", |
1390 |
"8DE", "9DE", "ADE", "BDE", "CDE", "DDE", "EDE", "FDE", |
1391 |
"0EE", "1EE", "2EE", "3EE", "4EE", "5EE", "6EE", "7EE", |
1392 |
"8EE", "9EE", "AEE", "BEE", "CEE", "DEE", "EEE", "FEE", |
1393 |
"0FE", "1FE", "2FE", "3FE", "4FE", "5FE", "6FE", "7FE", |
1394 |
"8FE", "9FE", "AFE", "BFE", "CFE", "DFE", "EFE", "FFE", |
1395 |
"00F", "10F", "20F", "30F", "40F", "50F", "60F", "70F", |
1396 |
"80F", "90F", "A0F", "B0F", "C0F", "D0F", "E0F", "F0F", |
1397 |
"01F", "11F", "21F", "31F", "41F", "51F", "61F", "71F", |
1398 |
"81F", "91F", "A1F", "B1F", "C1F", "D1F", "E1F", "F1F", |
1399 |
"02F", "12F", "22F", "32F", "42F", "52F", "62F", "72F", |
1400 |
"82F", "92F", "A2F", "B2F", "C2F", "D2F", "E2F", "F2F", |
1401 |
"03F", "13F", "23F", "33F", "43F", "53F", "63F", "73F", |
1402 |
"83F", "93F", "A3F", "B3F", "C3F", "D3F", "E3F", "F3F", |
1403 |
"04F", "14F", "24F", "34F", "44F", "54F", "64F", "74F", |
1404 |
"84F", "94F", "A4F", "B4F", "C4F", "D4F", "E4F", "F4F", |
1405 |
"05F", "15F", "25F", "35F", "45F", "55F", "65F", "75F", |
1406 |
"85F", "95F", "A5F", "B5F", "C5F", "D5F", "E5F", "F5F", |
1407 |
"06F", "16F", "26F", "36F", "46F", "56F", "66F", "76F", |
1408 |
"86F", "96F", "A6F", "B6F", "C6F", "D6F", "E6F", "F6F", |
1409 |
"07F", "17F", "27F", "37F", "47F", "57F", "67F", "77F", |
1410 |
"87F", "97F", "A7F", "B7F", "C7F", "D7F", "E7F", "F7F", |
1411 |
"08F", "18F", "28F", "38F", "48F", "58F", "68F", "78F", |
1412 |
"88F", "98F", "A8F", "B8F", "C8F", "D8F", "E8F", "F8F", |
1413 |
"09F", "19F", "29F", "39F", "49F", "59F", "69F", "79F", |
1414 |
"89F", "99F", "A9F", "B9F", "C9F", "D9F", "E9F", "F9F", |
1415 |
"0AF", "1AF", "2AF", "3AF", "4AF", "5AF", "6AF", "7AF", |
1416 |
"8AF", "9AF", "AAF", "BAF", "CAF", "DAF", "EAF", "FAF", |
1417 |
"0BF", "1BF", "2BF", "3BF", "4BF", "5BF", "6BF", "7BF", |
1418 |
"8BF", "9BF", "ABF", "BBF", "CBF", "DBF", "EBF", "FBF", |
1419 |
"0CF", "1CF", "2CF", "3CF", "4CF", "5CF", "6CF", "7CF", |
1420 |
"8CF", "9CF", "ACF", "BCF", "CCF", "DCF", "ECF", "FCF", |
1421 |
"0DF", "1DF", "2DF", "3DF", "4DF", "5DF", "6DF", "7DF", |
1422 |
"8DF", "9DF", "ADF", "BDF", "CDF", "DDF", "EDF", "FDF", |
1423 |
"0EF", "1EF", "2EF", "3EF", "4EF", "5EF", "6EF", "7EF", |
1424 |
"8EF", "9EF", "AEF", "BEF", "CEF", "DEF", "EEF", "FEF", |
1425 |
"0FF", "1FF", "2FF", "3FF", "4FF", "5FF", "6FF", "7FF", |
1426 |
"8FF", "9FF", "AFF", "BFF", "CFF", "DFF", "EFF", "FFF" |
1427 |
}; |
1428 |
|
1429 |
/** Append a single character to an output buffer. |
1430 |
* @param[in,out] buf_p Buffer to append to. |
1431 |
* @param[in] c Character to append. |
1432 |
*/ |
1433 |
static void |
1434 |
addc(struct BufData *buf_p, int c) |
1435 |
{ |
1436 |
int overflow = 0; |
1437 |
|
1438 |
if (buf_p->limit == 0) |
1439 |
{ |
1440 |
/* We've gone past the limit... */ |
1441 |
buf_p->overflow++; |
1442 |
overflow++; |
1443 |
} |
1444 |
else if (buf_p->limit > 0) /* update the limit */ |
1445 |
buf_p->limit--; |
1446 |
|
1447 |
if (buf_p->buf_loc >= buf_p->buf_size) |
1448 |
{ |
1449 |
/* We've gone past buffer */ |
1450 |
buf_p->buf_overflow++; |
1451 |
overflow++; |
1452 |
} |
1453 |
|
1454 |
if (!overflow) /* add the character to the buffer */ |
1455 |
buf_p->buf[buf_p->buf_loc++] = c; |
1456 |
} |
1457 |
|
1458 |
/** Append a string to an output buffer. |
1459 |
* @param[in,out] buf_p Buffer to append to. |
1460 |
* @param[in] s_len Length of string to append. |
1461 |
* @param[in] s String to append. |
1462 |
*/ |
1463 |
static void |
1464 |
adds(struct BufData *buf_p, int s_len, const char *s) |
1465 |
{ |
1466 |
int overflow = 0; |
1467 |
|
1468 |
/* while the string exists and has non-zero length */ |
1469 |
while (s_len && *s) |
1470 |
{ |
1471 |
/* poor man's inlining; see addc(), above */ |
1472 |
if (buf_p->limit == 0) |
1473 |
{ |
1474 |
/* We've gone past the limit... */ |
1475 |
buf_p->overflow++; |
1476 |
overflow++; |
1477 |
} |
1478 |
else if (buf_p->limit > 0) /* update the limit */ |
1479 |
buf_p->limit--; |
1480 |
|
1481 |
if (buf_p->buf_loc >= buf_p->buf_size) |
1482 |
{ |
1483 |
/* We've gone past buffer */ |
1484 |
buf_p->buf_overflow++; |
1485 |
overflow++; |
1486 |
} |
1487 |
|
1488 |
if (!overflow) /* add the character to the buffer */ |
1489 |
buf_p->buf[buf_p->buf_loc++] = *s; |
1490 |
|
1491 |
s++; /* advance to next character */ |
1492 |
|
1493 |
if (s_len > 0) /* update string length left to copy */ |
1494 |
s_len--; |
1495 |
} |
1496 |
} |
1497 |
|
1498 |
/** Add certain padding to an output buffer. |
1499 |
* @param[in,out] buf_p Buffer to append to. |
1500 |
* @param[in] padlen Length of padding to add. |
1501 |
* @param[in] pad Padding string (at least PAD_LENGTH bytes long). |
1502 |
*/ |
1503 |
static void |
1504 |
do_pad(struct BufData *buf_p, int padlen, char *pad) |
1505 |
{ |
1506 |
/* do chunks of PAD_LENGTH first */ |
1507 |
for (; padlen > PAD_LENGTH; padlen -= PAD_LENGTH) |
1508 |
adds(buf_p, PAD_LENGTH, pad); |
1509 |
|
1510 |
/* add any left-over padding */ |
1511 |
adds(buf_p, padlen, pad); |
1512 |
} |
1513 |
|
1514 |
/** Return length of string, up to a maximum. |
1515 |
* @param[in] str String to find length for. |
1516 |
* @param[in] maxlen Maximum value to return. |
1517 |
* @return Minimum of \a maxlen and length of \a str. |
1518 |
*/ |
1519 |
static int |
1520 |
my_strnlen(const char *str, int maxlen) |
1521 |
{ |
1522 |
int len = 0; |
1523 |
|
1524 |
while (*str++ && maxlen--) |
1525 |
len++; |
1526 |
|
1527 |
return len; |
1528 |
} |
1529 |
|
1530 |
/** Workhorse printing function. |
1531 |
* @param[in] dest Client to format the message. |
1532 |
* @param[in,out] buf_p Description of output buffer. |
1533 |
* @param[in] fmt Message format string. |
1534 |
* @param[in] vp Variable-length argument list for format string. |
1535 |
*/ |
1536 |
static void |
1537 |
doprintf(struct Client *dest, struct BufData *buf_p, const char *fmt, va_list vp) |
1538 |
{ |
1539 |
enum |
1540 |
{ |
1541 |
FLAG, /* Gathering flags */ |
1542 |
WIDTH, /* Gathering field width */ |
1543 |
DOT, /* Found a dot */ |
1544 |
PREC, /* Gathering field precision */ |
1545 |
OPT, /* Gathering field options (l, h, q, etc.) */ |
1546 |
SPEC /* Looking for field specifier */ |
1547 |
} state = FLAG; |
1548 |
|
1549 |
struct FieldData fld_s = FIELDDATA_INIT; |
1550 |
const char *fstart = NULL; |
1551 |
|
1552 |
for (; *fmt; ++fmt) |
1553 |
{ |
1554 |
/* If it's not %, or if it's %%, append it to the string */ |
1555 |
if (*fmt != '%' || (*fmt == '%' && *++fmt == '%')) |
1556 |
{ |
1557 |
addc(buf_p, *fmt); /* add the character to the string */ |
1558 |
continue; /* go to the next character */ |
1559 |
} |
1560 |
|
1561 |
state = FLAG; /* initialize our field data */ |
1562 |
fld_s.flags = 0; |
1563 |
fld_s.base = BASE_DECIMAL; |
1564 |
fld_s.width = 0; |
1565 |
fld_s.prec = -1; |
1566 |
fstart = fmt; |
1567 |
|
1568 |
for (; *fmt; ++fmt) |
1569 |
{ |
1570 |
switch (*fmt) |
1571 |
{ |
1572 |
case '-': /* Deal with a minus flag */ |
1573 |
if (state == FLAG) |
1574 |
fld_s.flags |= FLAG_MINUS; |
1575 |
else if (state == PREC) |
1576 |
{ |
1577 |
/* precisions may not be negative */ |
1578 |
fld_s.prec = -1; |
1579 |
state = OPT; /* prohibit further precision wrangling */ |
1580 |
} |
1581 |
continue; |
1582 |
|
1583 |
case '+': /* Deal with a plus flag */ |
1584 |
if (state == FLAG) |
1585 |
fld_s.flags |= FLAG_PLUS; |
1586 |
continue; |
1587 |
|
1588 |
case ' ': /* Deal with a space flag */ |
1589 |
if (state == FLAG) |
1590 |
fld_s.flags |= FLAG_SPACE; |
1591 |
continue; |
1592 |
|
1593 |
case '#': /* Deal with the so-called "alternate" flag */ |
1594 |
if (state == FLAG) |
1595 |
fld_s.flags |= FLAG_ALT; |
1596 |
continue; |
1597 |
|
1598 |
case ':': /* Deal with the colon flag */ |
1599 |
if (state == FLAG) |
1600 |
fld_s.flags |= FLAG_COLON; |
1601 |
continue; |
1602 |
|
1603 |
case '0': /* Deal with a zero flag */ |
1604 |
if (state == FLAG) { |
1605 |
fld_s.flags |= FLAG_ZERO; |
1606 |
continue; |
1607 |
} |
1608 |
/*FALLTHROUGH*/ |
1609 |
case '1': case '2': case '3': case '4': case '5': |
1610 |
case '6': case '7': case '8': case '9': |
1611 |
if (state == FLAG) /* switch to the WIDTH state if needed? */ |
1612 |
state = WIDTH; |
1613 |
else if (state != WIDTH && state != PREC) |
1614 |
continue; /* don't process it any more */ |
1615 |
|
1616 |
/* convert number */ |
1617 |
if (state == WIDTH) { |
1618 |
if (fld_s.width < WIDTH_MAX) /* prevent overflow */ |
1619 |
fld_s.width = fld_s.width * 10 + (*fmt - '0'); |
1620 |
} else { |
1621 |
if (fld_s.prec < WIDTH_MAX) /* prevent overflow */ |
1622 |
fld_s.prec = fld_s.prec * 10 + (*fmt - '0'); |
1623 |
} |
1624 |
continue; |
1625 |
|
1626 |
case '.': /* We found a '.'; go to precision state */ |
1627 |
if (state <= DOT) { |
1628 |
state = PREC; |
1629 |
fld_s.prec = 0; |
1630 |
} |
1631 |
continue; |
1632 |
|
1633 |
case '*': /* Grab an argument containing a width or precision */ |
1634 |
if (state <= WIDTH && fld_s.width <= 0) { |
1635 |
fld_s.width = (short)va_arg(vp, int); /* Get argument */ |
1636 |
|
1637 |
state = DOT; /* '.' better be next */ |
1638 |
|
1639 |
if (fld_s.width < 0) { /* deal with negative width */ |
1640 |
fld_s.flags |= FLAG_MINUS; |
1641 |
fld_s.width = -fld_s.width; |
1642 |
} |
1643 |
} else if (state == PREC && fld_s.prec <= 0) { |
1644 |
fld_s.prec = (short)va_arg(vp, int); /* Get argument */ |
1645 |
|
1646 |
state = OPT; /* No more precision stuff */ |
1647 |
|
1648 |
if (fld_s.prec < 0) /* deal with negative precision */ |
1649 |
fld_s.prec = -1; |
1650 |
} |
1651 |
continue; |
1652 |
|
1653 |
case 'h': /* it's a short */ |
1654 |
if (state <= OPT) { |
1655 |
state = OPT; |
1656 |
if (fld_s.flags & TYPE_SHORT) /* We support 'hh' */ |
1657 |
fld_s.flags |= TYPE_CHAR; |
1658 |
else if (!(fld_s.flags & TYPE_MASK)) |
1659 |
fld_s.flags |= TYPE_SHORT; |
1660 |
} |
1661 |
continue; |
1662 |
|
1663 |
case 'l': /* it's a long */ |
1664 |
if (state <= OPT) { |
1665 |
state = OPT; |
1666 |
if (fld_s.flags & TYPE_LONG) /* We support 'll' */ |
1667 |
fld_s.flags |= TYPE_QUAD | TYPE_LONGDOUBLE; |
1668 |
else if (!(fld_s.flags & TYPE_MASK)) |
1669 |
fld_s.flags |= TYPE_LONG; |
1670 |
} |
1671 |
continue; |
1672 |
|
1673 |
case 'q': case 'L': /* it's a quad or long double */ |
1674 |
if (state <= OPT) { |
1675 |
state = OPT; |
1676 |
if (!(fld_s.flags & TYPE_MASK)) |
1677 |
fld_s.flags |= TYPE_QUAD | TYPE_LONGDOUBLE; |
1678 |
} |
1679 |
continue; |
1680 |
|
1681 |
case 'j': /* it's an intmax_t */ |
1682 |
if (state <= OPT) { |
1683 |
state = OPT; |
1684 |
if (!(fld_s.flags & TYPE_MASK)) |
1685 |
fld_s.flags |= TYPE_INTMAX; |
1686 |
} |
1687 |
continue; |
1688 |
|
1689 |
case 't': /* it's a ptrdiff_t */ |
1690 |
if (state <= OPT) { |
1691 |
state = OPT; |
1692 |
if (!(fld_s.flags & TYPE_MASK)) |
1693 |
fld_s.flags |= TYPE_PTRDIFF; |
1694 |
} |
1695 |
continue; |
1696 |
|
1697 |
case 'z': case 'Z': /* it's a size_t */ |
1698 |
if (state <= OPT) { |
1699 |
state = OPT; |
1700 |
if (!(fld_s.flags & TYPE_MASK)) |
1701 |
fld_s.flags |= TYPE_SIZE; |
1702 |
} |
1703 |
continue; |
1704 |
|
1705 |
case 'T': /* it's a time_t */ |
1706 |
if (state <= OPT) { |
1707 |
state = OPT; |
1708 |
if (!(fld_s.flags & TYPE_MASK)) |
1709 |
fld_s.flags |= TYPE_TIME; |
1710 |
} |
1711 |
continue; |
1712 |
|
1713 |
case 's': /* convert a string */ |
1714 |
fld_s.flags &= ~(FLAG_PLUS | FLAG_SPACE | FLAG_ALT | FLAG_ZERO | |
1715 |
FLAG_COLON | TYPE_MASK); |
1716 |
fld_s.flags |= ARG_PTR | CONV_STRING; |
1717 |
break; |
1718 |
|
1719 |
case 'd': case 'i': |
1720 |
fld_s.flags &= ~(FLAG_COLON); |
1721 |
fld_s.flags |= ARG_INT | CONV_INT; |
1722 |
break; |
1723 |
|
1724 |
case 'X': /* uppercase hexadecimal */ |
1725 |
fld_s.flags |= INFO_UPPERCASE; |
1726 |
/*FALLTHROUGH*/ |
1727 |
case 'o': case 'x': /* octal or hexadecimal */ |
1728 |
if (*fmt == 'o') |
1729 |
fld_s.base = BASE_OCTAL; |
1730 |
else |
1731 |
fld_s.base = BASE_HEX; |
1732 |
/*FALLTHROUGH*/ |
1733 |
case 'u': /* Unsigned int */ |
1734 |
fld_s.flags &= ~(FLAG_PLUS | FLAG_SPACE | FLAG_COLON); |
1735 |
fld_s.flags |= INFO_UNSIGNED | ARG_INT | CONV_INT; |
1736 |
break; |
1737 |
|
1738 |
/* Don't support floating point at this time; it's too complicated */ |
1739 |
/* case 'E': case 'G': case 'A': */ |
1740 |
/* fld_s.flags |= INFO_UPPERCASE; */ |
1741 |
/*FALLTHROUGH*/ |
1742 |
/* case 'e': case 'f': case 'g': case 'a': */ |
1743 |
/* fld_s.flags |= ARG_FLOAT | CONV_FLOAT; */ |
1744 |
/* break; */ |
1745 |
|
1746 |
case 'c': /* character */ |
1747 |
fld_s.flags &= ~(FLAG_PLUS | FLAG_SPACE | FLAG_ALT | FLAG_ZERO | |
1748 |
FLAG_COLON | TYPE_MASK); |
1749 |
fld_s.flags |= INFO_UNSIGNED | ARG_INT | TYPE_CHAR | CONV_CHAR; |
1750 |
fld_s.prec = -1; |
1751 |
break; |
1752 |
|
1753 |
case 'p': /* display a pointer */ |
1754 |
fld_s.flags &= ~(FLAG_PLUS | FLAG_SPACE | FLAG_COLON | TYPE_MASK); |
1755 |
fld_s.flags |= (FLAG_ALT | FLAG_ZERO | TYPE_POINTER | ARG_PTR | |
1756 |
CONV_INT | INFO_UNSIGNED); |
1757 |
fld_s.prec = (SIZEOF_VOID_P * 2); /* number of characters */ |
1758 |
fld_s.base = BASE_HEX; |
1759 |
break; |
1760 |
|
1761 |
case 'n': /* write back a character count */ |
1762 |
if (fld_s.flags & TYPE_CHAR) /* eg, %hhn */ |
1763 |
*((char *)va_arg(vp, int *)) = TOTAL(buf_p); |
1764 |
else if (fld_s.flags & TYPE_SHORT) /* eg, %hn */ |
1765 |
*((short *)va_arg(vp, int *)) = TOTAL(buf_p); |
1766 |
else if (fld_s.flags & TYPE_QUAD) /* eg, %qn */ |
1767 |
*((int64_t *)va_arg(vp, int64_t *)) = TOTAL(buf_p); |
1768 |
else if (fld_s.flags & TYPE_LONG) /* eg, %ln */ |
1769 |
*((long *)va_arg(vp, long *)) = TOTAL(buf_p); |
1770 |
else if (fld_s.flags & TYPE_INTMAX) /* eg, %jn */ |
1771 |
*((_large_t *)va_arg(vp, _large_t *)) = TOTAL(buf_p); |
1772 |
else if (fld_s.flags & TYPE_PTRDIFF) /* eg, %tn */ |
1773 |
*((ptrdiff_t *)va_arg(vp, ptrdiff_t *)) = TOTAL(buf_p); |
1774 |
else if (fld_s.flags & TYPE_SIZE) /* eg, %zn */ |
1775 |
*((size_t *)va_arg(vp, size_t *)) = TOTAL(buf_p); |
1776 |
else if (fld_s.flags & TYPE_TIME) /* eg, %Tn */ |
1777 |
*((time_t *)va_arg(vp, time_t *)) = TOTAL(buf_p); |
1778 |
else /* eg, %n */ |
1779 |
*((int *)va_arg(vp, int *)) = TOTAL(buf_p); |
1780 |
fld_s.flags = 0; /* no further processing required */ |
1781 |
break; |
1782 |
|
1783 |
case 'm': /* write out a string describing an errno error */ |
1784 |
fld_s.flags &= ~(FLAG_PLUS | FLAG_SPACE | FLAG_ALT | FLAG_ZERO | |
1785 |
FLAG_COLON | TYPE_MASK); |
1786 |
fld_s.flags |= CONV_STRING; |
1787 |
fld_s.value.v_ptr = strerror(errno); |
1788 |
break; |
1789 |
|
1790 |
case 'v': /* here's the infamous %v... */ |
1791 |
fld_s.flags &= ~(FLAG_PLUS | FLAG_SPACE | FLAG_ALT | FLAG_ZERO | |
1792 |
FLAG_COLON | TYPE_MASK); |
1793 |
fld_s.flags |= ARG_PTR | CONV_VARARGS; |
1794 |
break; |
1795 |
|
1796 |
case 'C': /* convert a client name... */ |
1797 |
fld_s.flags &= ~(FLAG_PLUS | FLAG_SPACE | FLAG_ZERO | TYPE_MASK); |
1798 |
fld_s.flags |= ARG_PTR | CONV_CLIENT; |
1799 |
break; |
1800 |
|
1801 |
case 'H': /* convert a channel name... */ |
1802 |
fld_s.flags &= ~(FLAG_PLUS | FLAG_SPACE | FLAG_ALT | FLAG_ZERO | |
1803 |
FLAG_COLON | TYPE_MASK); |
1804 |
fld_s.flags |= ARG_PTR | CONV_CHANNEL; |
1805 |
break; |
1806 |
|
1807 |
default: /* Unsupported, display a message and the entire format */ |
1808 |
adds(buf_p, -1, "(Unsupported: %"); |
1809 |
adds(buf_p, fmt - fstart + 1, fstart); |
1810 |
addc(buf_p, ')'); |
1811 |
fld_s.flags = 0; /* no further processing required */ |
1812 |
break; |
1813 |
} /* switch (*fmt) { */ |
1814 |
|
1815 |
break; |
1816 |
} /* for (; *fmt; fmt++) { */ |
1817 |
|
1818 |
if (!*fmt) /* hit the end */ |
1819 |
break; |
1820 |
else if (!(fld_s.flags & (ARG_MASK | CONV_MASK))) /* is it done? */ |
1821 |
continue; |
1822 |
|
1823 |
if ((fld_s.flags & ARG_MASK) == ARG_INT) { /* grab an integer argument */ |
1824 |
if (fld_s.flags & INFO_UNSIGNED) { /* go direct if unsigned */ |
1825 |
if (fld_s.flags & TYPE_CHAR) /* eg, %hhu */ |
1826 |
fld_s.value.v_int = (unsigned char)va_arg(vp, unsigned int); |
1827 |
else if (fld_s.flags & TYPE_SHORT) /* eg, %hu */ |
1828 |
fld_s.value.v_int = (unsigned short)va_arg(vp, unsigned int); |
1829 |
else if (fld_s.flags & TYPE_QUAD) /* eg, %qu */ |
1830 |
fld_s.value.v_int = va_arg(vp, uint64_t); |
1831 |
else if (fld_s.flags & TYPE_LONG) /* eg, %lu */ |
1832 |
fld_s.value.v_int = va_arg(vp, unsigned long); |
1833 |
else if (fld_s.flags & TYPE_INTMAX) /* eg, %ju */ |
1834 |
fld_s.value.v_int = va_arg(vp, _large_t); |
1835 |
else if (fld_s.flags & TYPE_PTRDIFF) /* eg, %tu */ |
1836 |
fld_s.value.v_int = va_arg(vp, ptrdiff_t); |
1837 |
else if (fld_s.flags & TYPE_SIZE) /* eg, %zu */ |
1838 |
fld_s.value.v_int = va_arg(vp, size_t); |
1839 |
else if (fld_s.flags & TYPE_TIME) /* eg, %Tu */ |
1840 |
fld_s.value.v_int = va_arg(vp, time_t); |
1841 |
else if (fld_s.flags & TYPE_POINTER) /* eg, %p */ |
1842 |
fld_s.value.v_int = va_arg(vp, _pointer_t); |
1843 |
else /* eg, %u */ |
1844 |
fld_s.value.v_int = va_arg(vp, unsigned int); |
1845 |
} else { |
1846 |
_large_t signed_int; /* temp. store the signed integer */ |
1847 |
|
1848 |
if (fld_s.flags & TYPE_CHAR) /* eg, %hhd */ |
1849 |
signed_int = (char)va_arg(vp, unsigned int); |
1850 |
else if (fld_s.flags & TYPE_SHORT) /* eg, %hd */ |
1851 |
signed_int = (short)va_arg(vp, unsigned int); |
1852 |
else if (fld_s.flags & TYPE_QUAD) /* eg, %qd */ |
1853 |
signed_int = va_arg(vp, int64_t); |
1854 |
else if (fld_s.flags & TYPE_LONG) /* eg, %ld */ |
1855 |
signed_int = va_arg(vp, long); |
1856 |
else if (fld_s.flags & TYPE_INTMAX) /* eg, %jd */ |
1857 |
signed_int = va_arg(vp, _large_t); |
1858 |
else if (fld_s.flags & TYPE_PTRDIFF) /* eg, %td */ |
1859 |
signed_int = va_arg(vp, ptrdiff_t); |
1860 |
else if (fld_s.flags & TYPE_SIZE) /* eg, %zd */ |
1861 |
signed_int = va_arg(vp, size_t); |
1862 |
else if (fld_s.flags & TYPE_TIME) /* eg, %Td */ |
1863 |
signed_int = va_arg(vp, time_t); |
1864 |
else /* eg, %d */ |
1865 |
signed_int = va_arg(vp, int); |
1866 |
|
1867 |
if (signed_int < 0) { /* Now figure out if it's negative... */ |
1868 |
fld_s.flags |= INFO_NEGATIVE; |
1869 |
fld_s.value.v_int = -signed_int; /* negate safely (I hope) */ |
1870 |
} else |
1871 |
fld_s.value.v_int = signed_int; |
1872 |
} |
1873 |
} |
1874 |
else if ((fld_s.flags & ARG_MASK) == ARG_FLOAT) |
1875 |
{ |
1876 |
/* extract a float */ |
1877 |
if (fld_s.flags & TYPE_LONGDOUBLE) /* eg, %Lf */ |
1878 |
fld_s.value.v_float = va_arg(vp, long double); |
1879 |
else /* eg, %f */ |
1880 |
fld_s.value.v_float = va_arg(vp, double); |
1881 |
} |
1882 |
else if ((fld_s.flags & ARG_MASK) == ARG_PTR) |
1883 |
{ |
1884 |
/* pointer argument */ |
1885 |
fld_s.value.v_ptr = va_arg(vp, void *); |
1886 |
} |
1887 |
|
1888 |
/* We've eaten the arguments, we have all the information we need for |
1889 |
* the conversion. Time to actually *do* the conversion |
1890 |
*/ |
1891 |
if ((fld_s.flags & CONV_MASK) == CONV_INT) |
1892 |
{ |
1893 |
/* convert an integer */ |
1894 |
char intbuf[INTBUF_LEN]; |
1895 |
const char **table = NULL, *tstr = NULL; |
1896 |
int ibuf_loc = INTBUF_LEN, ilen, zlen = 0, plen = 0, elen = 0; |
1897 |
|
1898 |
if (fld_s.base == BASE_OCTAL) /* select string table to use */ |
1899 |
table = octal; |
1900 |
else if (fld_s.base == BASE_DECIMAL) |
1901 |
table = decimal; |
1902 |
else if (fld_s.base == BASE_HEX) |
1903 |
{ |
1904 |
/* have to deal with upper case */ |
1905 |
table = (fld_s.flags & INFO_UPPERCASE) ? HEX : hex; |
1906 |
|
1907 |
if (fld_s.flags & FLAG_ALT) |
1908 |
elen = 2; /* account for the length of 0x */ |
1909 |
} |
1910 |
|
1911 |
if (fld_s.prec < 0) { /* default precision is 1 */ |
1912 |
if ((fld_s.flags & (FLAG_MINUS | FLAG_ZERO)) == FLAG_ZERO && |
1913 |
fld_s.width) { |
1914 |
fld_s.prec = fld_s.width - elen; |
1915 |
fld_s.width = 0; |
1916 |
} else |
1917 |
fld_s.prec = 1; |
1918 |
} |
1919 |
|
1920 |
/* If there's a sign flag, account for it */ |
1921 |
if (fld_s.flags & (FLAG_PLUS | FLAG_SPACE | INFO_NEGATIVE)) |
1922 |
elen++; |
1923 |
|
1924 |
if (fld_s.base < 0) { /* non-binary base flagged by negative */ |
1925 |
fld_s.base = -fld_s.base; /* negate it... */ |
1926 |
|
1927 |
while (fld_s.value.v_int) { /* and convert it */ |
1928 |
tstr = table[fld_s.value.v_int % fld_s.base]; /* which string? */ |
1929 |
fld_s.value.v_int /= fld_s.base; /* next value */ |
1930 |
|
1931 |
ilen = 3; /* if we have to fill in zeros, here's how many */ |
1932 |
|
1933 |
while (*tstr) { /* add string to intbuf; note growing backwards */ |
1934 |
intbuf[--ibuf_loc] = *(tstr++); |
1935 |
ilen--; |
1936 |
} |
1937 |
|
1938 |
if (fld_s.value.v_int > 0 && ilen) /* add zeros if needed */ |
1939 |
while (ilen--) |
1940 |
intbuf[--ibuf_loc] = '0'; |
1941 |
} |
1942 |
} else { /* optimize for powers of 2 */ |
1943 |
while (fld_s.value.v_int) { /* which string? */ |
1944 |
tstr = table[(fld_s.value.v_int & ((1 << fld_s.base) - 1))]; |
1945 |
fld_s.value.v_int >>= fld_s.base; /* next value */ |
1946 |
|
1947 |
ilen = 3; /* if we have to fill in zeros, here's how many */ |
1948 |
|
1949 |
while (*tstr) { /* add string to intbuf; note growing backwards */ |
1950 |
intbuf[--ibuf_loc] = *(tstr++); |
1951 |
ilen--; |
1952 |
} |
1953 |
|
1954 |
if (fld_s.value.v_int > 0 && ilen) /* add zeros if needed */ |
1955 |
while (ilen--) |
1956 |
intbuf[--ibuf_loc] = '0'; |
1957 |
} |
1958 |
} |
1959 |
|
1960 |
ilen = INTBUF_LEN - ibuf_loc; /* how many chars did we add? */ |
1961 |
|
1962 |
if (fld_s.prec > ilen) /* do we need any leading zeros? */ |
1963 |
zlen = fld_s.prec - ilen; |
1964 |
|
1965 |
if (fld_s.base == BASE_OCTAL && zlen == 0 && fld_s.flags & FLAG_ALT) |
1966 |
zlen++; /* factor in a leading zero for %#o */ |
1967 |
|
1968 |
if (fld_s.width > ilen + zlen + elen) /* calculate space padding */ |
1969 |
plen = fld_s.width - (ilen + zlen + elen); |
1970 |
|
1971 |
if (plen > 0 && !(fld_s.flags & FLAG_MINUS)) |
1972 |
do_pad(buf_p, plen, spaces); /* pre-padding */ |
1973 |
|
1974 |
if (fld_s.flags & INFO_NEGATIVE) /* leading signs */ |
1975 |
addc(buf_p, '-'); |
1976 |
else if (fld_s.flags & FLAG_PLUS) |
1977 |
addc(buf_p, '+'); |
1978 |
else if (fld_s.flags & FLAG_SPACE) |
1979 |
addc(buf_p, ' '); |
1980 |
|
1981 |
if ((fld_s.flags & FLAG_ALT) && fld_s.base == BASE_HEX) |
1982 |
{ |
1983 |
/* hex 0x */ |
1984 |
addc(buf_p, '0'); |
1985 |
addc(buf_p, fld_s.flags & INFO_UPPERCASE ? 'X' : 'x'); |
1986 |
} |
1987 |
|
1988 |
if (zlen > 0) /* leading zeros */ |
1989 |
do_pad(buf_p, zlen, zeros); |
1990 |
|
1991 |
adds(buf_p, ilen, intbuf + ibuf_loc); /* add the integer string */ |
1992 |
|
1993 |
if (plen > 0 && (fld_s.flags & FLAG_MINUS)) |
1994 |
do_pad(buf_p, plen, spaces); /* post-padding */ |
1995 |
|
1996 |
/* Don't support floating point at this time; it's too complicated */ |
1997 |
/* } else if ((fld_s.flags & CONV_MASK) == CONV_FLOAT) { */ |
1998 |
/* convert a float */ |
1999 |
} else if ((fld_s.flags & CONV_MASK) == CONV_CHAR) { |
2000 |
if (fld_s.width > 0 && !(fld_s.flags & FLAG_MINUS)) |
2001 |
do_pad(buf_p, fld_s.width - 1, spaces); /* pre-padding */ |
2002 |
|
2003 |
addc(buf_p, fld_s.value.v_int); /* add the character */ |
2004 |
|
2005 |
if (fld_s.width > 0 && (fld_s.flags & FLAG_MINUS)) |
2006 |
do_pad(buf_p, fld_s.width - 1, spaces); /* post-padding */ |
2007 |
} |
2008 |
else if ((fld_s.flags & CONV_MASK) == CONV_STRING || |
2009 |
fld_s.value.v_ptr == 0) |
2010 |
{ |
2011 |
/* spaces or null pointers */ |
2012 |
int slen, plen; |
2013 |
const char *str = fld_s.value.v_ptr; |
2014 |
|
2015 |
if (!str) /* NULL pointers print "(null)" */ |
2016 |
str = "(null)"; |
2017 |
|
2018 |
slen = my_strnlen(str, fld_s.prec); /* str lengths and pad lengths */ |
2019 |
plen = (fld_s.width - slen <= 0 ? 0 : fld_s.width - slen); |
2020 |
|
2021 |
if (plen > 0 && !(fld_s.flags & FLAG_MINUS)) |
2022 |
do_pad(buf_p, plen, spaces); /* pre-padding */ |
2023 |
|
2024 |
adds(buf_p, slen, str); /* add the string */ |
2025 |
|
2026 |
if (plen > 0 && (fld_s.flags & FLAG_MINUS)) |
2027 |
do_pad(buf_p, plen, spaces); /* post-padding */ |
2028 |
} |
2029 |
else if ((fld_s.flags & CONV_MASK) == CONV_VARARGS) |
2030 |
{ |
2031 |
struct BufData buf_s = BUFDATA_INIT; |
2032 |
struct VarData *vdata = fld_s.value.v_ptr; |
2033 |
int plen, tlen; |
2034 |
|
2035 |
buf_s.buf = buf_p->buf + buf_p->buf_loc; |
2036 |
buf_s.buf_size = buf_p->buf_size - buf_p->buf_loc; |
2037 |
buf_s.limit = fld_s.prec; |
2038 |
|
2039 |
doprintf(dest, &buf_s, vdata->vd_format, vdata->vd_args); |
2040 |
|
2041 |
plen = (fld_s.width - buf_s.buf_loc <= 0 ? 0 : |
2042 |
fld_s.width - buf_s.buf_loc); |
2043 |
|
2044 |
if (plen > 0) { |
2045 |
if (fld_s.flags & FLAG_MINUS) { /* left aligned... */ |
2046 |
buf_p->buf_loc += buf_s.buf_loc; /* remember the modifications */ |
2047 |
buf_p->buf_overflow += buf_s.buf_overflow; |
2048 |
|
2049 |
do_pad(buf_p, plen, spaces); /* and do the post-padding */ |
2050 |
} else { /* right aligned... */ |
2051 |
/* Ok, first, see if we'll have *anything* left after padding */ |
2052 |
if (plen > buf_s.buf_size) { |
2053 |
/* nope, good, this is easy: everything overflowed buffer */ |
2054 |
do_pad(buf_p, plen, spaces); |
2055 |
|
2056 |
buf_s.buf_overflow += buf_s.buf_loc; /* update buf counts */ |
2057 |
buf_s.buf_loc = 0; |
2058 |
buf_p->buf_overflow += buf_s.buf_overflow; |
2059 |
} else { |
2060 |
/* first figure out how much we're going to save */ |
2061 |
tlen = SNP_MIN(buf_s.buf_loc, buf_s.buf_size - plen); |
2062 |
|
2063 |
memmove(buf_s.buf + plen, buf_s.buf, tlen); /* save it... */ |
2064 |
do_pad(buf_p, plen, spaces); /* add spaces... */ |
2065 |
|
2066 |
buf_s.buf_overflow += buf_s.buf_loc - tlen; /* update buf counts */ |
2067 |
buf_s.buf_loc = tlen; |
2068 |
buf_p->buf_overflow += buf_s.buf_overflow; |
2069 |
buf_p->buf_loc += buf_s.buf_loc; |
2070 |
} |
2071 |
} |
2072 |
} else { |
2073 |
buf_p->buf_loc += buf_s.buf_loc; /* no padding, but remember mods */ |
2074 |
buf_p->buf_overflow += buf_s.buf_overflow; |
2075 |
} |
2076 |
|
2077 |
vdata->vd_chars = buf_s.buf_loc; /* return relevant data */ |
2078 |
vdata->vd_overflow = SNP_MAX(buf_s.buf_overflow, buf_s.overflow); |
2079 |
} else if ((fld_s.flags & CONV_MASK) == CONV_CLIENT) { |
2080 |
struct Client *cptr = fld_s.value.v_ptr; |
2081 |
const char *str1 = NULL, *str2 = NULL, *str3 = NULL; |
2082 |
int slen1 = 0, slen2 = 0, slen3 = 0, elen = 0, plen = 0; |
2083 |
|
2084 |
/* &me is used if it's not a definite server */ |
2085 |
if (dest && (IsServer(dest) || IsMe(dest))) { |
2086 |
if (IsServer(cptr) || IsMe(cptr)) |
2087 |
str1 = ID(cptr); |
2088 |
else { |
2089 |
str1 = ID(cptr->servptr); |
2090 |
str2 = ID(cptr); |
2091 |
} |
2092 |
fld_s.flags &= ~(FLAG_ALT | FLAG_COLON); |
2093 |
} else { |
2094 |
str1 = cptr->name[0] ? cptr->name : "*"; |
2095 |
if (!IsServer(cptr) && !IsMe(cptr) && fld_s.flags & FLAG_ALT) { |
2096 |
assert(cptr->name[0]); |
2097 |
str2 = cptr->username; |
2098 |
str3 = cptr->host; |
2099 |
} else |
2100 |
fld_s.flags &= ~FLAG_ALT; |
2101 |
} |
2102 |
|
2103 |
if (fld_s.flags & FLAG_COLON) |
2104 |
elen++; /* account for : */ |
2105 |
|
2106 |
slen1 = my_strnlen(str1, fld_s.prec < 0 ? -1 : fld_s.prec - elen); |
2107 |
if (fld_s.flags & FLAG_ALT) |
2108 |
elen++; /* account for ! */ |
2109 |
if (str2 && (fld_s.prec < 0 || fld_s.prec - (slen1 + elen) > 0)) |
2110 |
slen2 = my_strnlen(str2, fld_s.prec < 0 ? -1 : fld_s.prec - (slen1 + elen)); |
2111 |
if (fld_s.flags & FLAG_ALT) |
2112 |
elen++; /* account for @ */ |
2113 |
if (str3 && (fld_s.prec < 0 || fld_s.prec - (slen1 + slen2 + elen) > 0)) |
2114 |
slen3 = my_strnlen(str3, fld_s.prec < 0 ? -1 : fld_s.prec - (slen1 + slen2 + elen)); |
2115 |
plen = (fld_s.width - (slen1 + slen2 + slen3 + elen) <= 0 ? 0 : fld_s.width - (slen1 + slen2 + slen3 + elen)); |
2116 |
|
2117 |
if (plen > 0 && !(fld_s.flags & FLAG_MINUS)) |
2118 |
do_pad(buf_p, plen, spaces); /* pre-padding */ |
2119 |
|
2120 |
if (fld_s.flags & FLAG_COLON) |
2121 |
addc(buf_p, ':'); |
2122 |
adds(buf_p, slen1, str1); |
2123 |
if (fld_s.flags & FLAG_ALT) |
2124 |
addc(buf_p, '!'); |
2125 |
if (str2) |
2126 |
adds(buf_p, slen2, str2); |
2127 |
if (fld_s.flags & FLAG_ALT) |
2128 |
addc(buf_p, '@'); |
2129 |
if (str3) |
2130 |
adds(buf_p, slen3, str3); |
2131 |
|
2132 |
if (plen > 0 && (fld_s.flags & FLAG_MINUS)) |
2133 |
do_pad(buf_p, plen, spaces); /* post-padding */ |
2134 |
} |
2135 |
else if ((fld_s.flags & CONV_MASK) == CONV_CHANNEL) |
2136 |
{ |
2137 |
struct Channel *chan = fld_s.value.v_ptr; |
2138 |
char *str = chan->chname; |
2139 |
int slen, plen; |
2140 |
|
2141 |
slen = my_strnlen(str, fld_s.prec); /* str lengths and pad lengths */ |
2142 |
plen = (fld_s.width - slen <= 0 ? 0 : fld_s.width - slen); |
2143 |
|
2144 |
if (plen > 0 && !(fld_s.flags & FLAG_MINUS)) |
2145 |
do_pad(buf_p, plen, spaces); /* pre-padding */ |
2146 |
|
2147 |
adds(buf_p, slen, str); /* add the string */ |
2148 |
|
2149 |
if (plen > 0 && (fld_s.flags & FLAG_MINUS)) |
2150 |
do_pad(buf_p, plen, spaces); /* post-padding */ |
2151 |
} |
2152 |
} /* for (; *fmt; fmt++) { */ |
2153 |
} |
2154 |
|
2155 |
/* ircd_snprintf() has a big Doxygen comment in the header file. */ |
2156 |
int |
2157 |
xsnprintf(struct Client *dest, char *buf, size_t buf_len, |
2158 |
const char *format, ...) |
2159 |
{ |
2160 |
struct BufData buf_s = BUFDATA_INIT; |
2161 |
va_list args; |
2162 |
|
2163 |
if (!format) |
2164 |
return 0; |
2165 |
|
2166 |
buf_s.buf = buf; /* initialize buffer settings */ |
2167 |
buf_s.buf_size = buf_len - 1; |
2168 |
buf_s.limit = -1; |
2169 |
|
2170 |
va_start(args, format); |
2171 |
doprintf(dest, &buf_s, format, args); /* fill the buffer */ |
2172 |
va_end(args); |
2173 |
|
2174 |
buf_s.buf[buf_s.buf_loc] = '\0'; /* terminate buffer */ |
2175 |
|
2176 |
return TOTAL(&buf_s); |
2177 |
} |
2178 |
|
2179 |
/** Like ircd_snprintf() but with a va_list argument list. |
2180 |
* @param[in] dest Client receiving of message. |
2181 |
* @param[out] buf Output buffer for formatted message. |
2182 |
* @param[in] buf_len Number of bytes that can be written to \a buf. |
2183 |
* @param[in] format Format string for message. |
2184 |
* @param[in] args Variable-length argument list for format string. |
2185 |
* @return Number of bytes that would be written to \a buf without truncation. |
2186 |
*/ |
2187 |
int |
2188 |
xvsnprintf(struct Client *dest, char *buf, size_t buf_len, |
2189 |
const char *format, va_list args) |
2190 |
{ |
2191 |
struct BufData buf_s = BUFDATA_INIT; |
2192 |
|
2193 |
if (!format) |
2194 |
return 0; |
2195 |
|
2196 |
buf_s.buf = buf; /* initialize buffer settings */ |
2197 |
buf_s.buf_size = buf_len - 1; |
2198 |
buf_s.limit = -1; |
2199 |
|
2200 |
doprintf(dest, &buf_s, format, args); /* fill the buffer */ |
2201 |
|
2202 |
buf_s.buf[buf_s.buf_loc] = '\0'; /* terminate buffer */ |
2203 |
|
2204 |
return TOTAL(&buf_s); |
2205 |
} |