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