f9532e09b608a642690442799b51df9f97d10a7b
[safe/jmp/linux-2.6] / lib / vsprintf.c
1 /*
2  *  linux/lib/vsprintf.c
3  *
4  *  Copyright (C) 1991, 1992  Linus Torvalds
5  */
6
7 /* vsprintf.c -- Lars Wirzenius & Linus Torvalds. */
8 /*
9  * Wirzenius wrote this portably, Torvalds fucked it up :-)
10  */
11
12 /*
13  * Fri Jul 13 2001 Crutcher Dunnavant <crutcher+kernel@datastacks.com>
14  * - changed to provide snprintf and vsnprintf functions
15  * So Feb  1 16:51:32 CET 2004 Juergen Quade <quade@hsnr.de>
16  * - scnprintf and vscnprintf
17  */
18
19 #include <stdarg.h>
20 #include <linux/module.h>
21 #include <linux/types.h>
22 #include <linux/string.h>
23 #include <linux/ctype.h>
24 #include <linux/kernel.h>
25 #include <linux/kallsyms.h>
26 #include <linux/uaccess.h>
27 #include <linux/ioport.h>
28 #include <net/addrconf.h>
29
30 #include <asm/page.h>           /* for PAGE_SIZE */
31 #include <asm/div64.h>
32 #include <asm/sections.h>       /* for dereference_function_descriptor() */
33
34 /* Works only for digits and letters, but small and fast */
35 #define TOLOWER(x) ((x) | 0x20)
36
37 static unsigned int simple_guess_base(const char *cp)
38 {
39         if (cp[0] == '0') {
40                 if (TOLOWER(cp[1]) == 'x' && isxdigit(cp[2]))
41                         return 16;
42                 else
43                         return 8;
44         } else {
45                 return 10;
46         }
47 }
48
49 /**
50  * simple_strtoul - convert a string to an unsigned long
51  * @cp: The start of the string
52  * @endp: A pointer to the end of the parsed string will be placed here
53  * @base: The number base to use
54  */
55 unsigned long simple_strtoul(const char *cp, char **endp, unsigned int base)
56 {
57         unsigned long result = 0;
58
59         if (!base)
60                 base = simple_guess_base(cp);
61
62         if (base == 16 && cp[0] == '0' && TOLOWER(cp[1]) == 'x')
63                 cp += 2;
64
65         while (isxdigit(*cp)) {
66                 unsigned int value;
67
68                 value = isdigit(*cp) ? *cp - '0' : TOLOWER(*cp) - 'a' + 10;
69                 if (value >= base)
70                         break;
71                 result = result * base + value;
72                 cp++;
73         }
74         if (endp)
75                 *endp = (char *)cp;
76
77         return result;
78 }
79 EXPORT_SYMBOL(simple_strtoul);
80
81 /**
82  * simple_strtol - convert a string to a signed long
83  * @cp: The start of the string
84  * @endp: A pointer to the end of the parsed string will be placed here
85  * @base: The number base to use
86  */
87 long simple_strtol(const char *cp, char **endp, unsigned int base)
88 {
89         if (*cp == '-')
90                 return -simple_strtoul(cp + 1, endp, base);
91
92         return simple_strtoul(cp, endp, base);
93 }
94 EXPORT_SYMBOL(simple_strtol);
95
96 /**
97  * simple_strtoull - convert a string to an unsigned long long
98  * @cp: The start of the string
99  * @endp: A pointer to the end of the parsed string will be placed here
100  * @base: The number base to use
101  */
102 unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base)
103 {
104         unsigned long long result = 0;
105
106         if (!base)
107                 base = simple_guess_base(cp);
108
109         if (base == 16 && cp[0] == '0' && TOLOWER(cp[1]) == 'x')
110                 cp += 2;
111
112         while (isxdigit(*cp)) {
113                 unsigned int value;
114
115                 value = isdigit(*cp) ? *cp - '0' : TOLOWER(*cp) - 'a' + 10;
116                 if (value >= base)
117                         break;
118                 result = result * base + value;
119                 cp++;
120         }
121         if (endp)
122                 *endp = (char *)cp;
123
124         return result;
125 }
126 EXPORT_SYMBOL(simple_strtoull);
127
128 /**
129  * simple_strtoll - convert a string to a signed long long
130  * @cp: The start of the string
131  * @endp: A pointer to the end of the parsed string will be placed here
132  * @base: The number base to use
133  */
134 long long simple_strtoll(const char *cp, char **endp, unsigned int base)
135 {
136         if (*cp == '-')
137                 return -simple_strtoull(cp + 1, endp, base);
138
139         return simple_strtoull(cp, endp, base);
140 }
141
142 /**
143  * strict_strtoul - convert a string to an unsigned long strictly
144  * @cp: The string to be converted
145  * @base: The number base to use
146  * @res: The converted result value
147  *
148  * strict_strtoul converts a string to an unsigned long only if the
149  * string is really an unsigned long string, any string containing
150  * any invalid char at the tail will be rejected and -EINVAL is returned,
151  * only a newline char at the tail is acceptible because people generally
152  * change a module parameter in the following way:
153  *
154  *      echo 1024 > /sys/module/e1000/parameters/copybreak
155  *
156  * echo will append a newline to the tail.
157  *
158  * It returns 0 if conversion is successful and *res is set to the converted
159  * value, otherwise it returns -EINVAL and *res is set to 0.
160  *
161  * simple_strtoul just ignores the successive invalid characters and
162  * return the converted value of prefix part of the string.
163  */
164 int strict_strtoul(const char *cp, unsigned int base, unsigned long *res)
165 {
166         char *tail;
167         unsigned long val;
168         size_t len;
169
170         *res = 0;
171         len = strlen(cp);
172         if (len == 0)
173                 return -EINVAL;
174
175         val = simple_strtoul(cp, &tail, base);
176         if (tail == cp)
177                 return -EINVAL;
178
179         if ((*tail == '\0') ||
180                 ((len == (size_t)(tail - cp) + 1) && (*tail == '\n'))) {
181                 *res = val;
182                 return 0;
183         }
184
185         return -EINVAL;
186 }
187 EXPORT_SYMBOL(strict_strtoul);
188
189 /**
190  * strict_strtol - convert a string to a long strictly
191  * @cp: The string to be converted
192  * @base: The number base to use
193  * @res: The converted result value
194  *
195  * strict_strtol is similiar to strict_strtoul, but it allows the first
196  * character of a string is '-'.
197  *
198  * It returns 0 if conversion is successful and *res is set to the converted
199  * value, otherwise it returns -EINVAL and *res is set to 0.
200  */
201 int strict_strtol(const char *cp, unsigned int base, long *res)
202 {
203         int ret;
204         if (*cp == '-') {
205                 ret = strict_strtoul(cp + 1, base, (unsigned long *)res);
206                 if (!ret)
207                         *res = -(*res);
208         } else {
209                 ret = strict_strtoul(cp, base, (unsigned long *)res);
210         }
211
212         return ret;
213 }
214 EXPORT_SYMBOL(strict_strtol);
215
216 /**
217  * strict_strtoull - convert a string to an unsigned long long strictly
218  * @cp: The string to be converted
219  * @base: The number base to use
220  * @res: The converted result value
221  *
222  * strict_strtoull converts a string to an unsigned long long only if the
223  * string is really an unsigned long long string, any string containing
224  * any invalid char at the tail will be rejected and -EINVAL is returned,
225  * only a newline char at the tail is acceptible because people generally
226  * change a module parameter in the following way:
227  *
228  *      echo 1024 > /sys/module/e1000/parameters/copybreak
229  *
230  * echo will append a newline to the tail of the string.
231  *
232  * It returns 0 if conversion is successful and *res is set to the converted
233  * value, otherwise it returns -EINVAL and *res is set to 0.
234  *
235  * simple_strtoull just ignores the successive invalid characters and
236  * return the converted value of prefix part of the string.
237  */
238 int strict_strtoull(const char *cp, unsigned int base, unsigned long long *res)
239 {
240         char *tail;
241         unsigned long long val;
242         size_t len;
243
244         *res = 0;
245         len = strlen(cp);
246         if (len == 0)
247                 return -EINVAL;
248
249         val = simple_strtoull(cp, &tail, base);
250         if (tail == cp)
251                 return -EINVAL;
252         if ((*tail == '\0') ||
253                 ((len == (size_t)(tail - cp) + 1) && (*tail == '\n'))) {
254                 *res = val;
255                 return 0;
256         }
257
258         return -EINVAL;
259 }
260 EXPORT_SYMBOL(strict_strtoull);
261
262 /**
263  * strict_strtoll - convert a string to a long long strictly
264  * @cp: The string to be converted
265  * @base: The number base to use
266  * @res: The converted result value
267  *
268  * strict_strtoll is similiar to strict_strtoull, but it allows the first
269  * character of a string is '-'.
270  *
271  * It returns 0 if conversion is successful and *res is set to the converted
272  * value, otherwise it returns -EINVAL and *res is set to 0.
273  */
274 int strict_strtoll(const char *cp, unsigned int base, long long *res)
275 {
276         int ret;
277         if (*cp == '-') {
278                 ret = strict_strtoull(cp + 1, base, (unsigned long long *)res);
279                 if (!ret)
280                         *res = -(*res);
281         } else {
282                 ret = strict_strtoull(cp, base, (unsigned long long *)res);
283         }
284
285         return ret;
286 }
287 EXPORT_SYMBOL(strict_strtoll);
288
289 static int skip_atoi(const char **s)
290 {
291         int i = 0;
292
293         while (isdigit(**s))
294                 i = i*10 + *((*s)++) - '0';
295
296         return i;
297 }
298
299 /* Decimal conversion is by far the most typical, and is used
300  * for /proc and /sys data. This directly impacts e.g. top performance
301  * with many processes running. We optimize it for speed
302  * using code from
303  * http://www.cs.uiowa.edu/~jones/bcd/decimal.html
304  * (with permission from the author, Douglas W. Jones). */
305
306 /* Formats correctly any integer in [0,99999].
307  * Outputs from one to five digits depending on input.
308  * On i386 gcc 4.1.2 -O2: ~250 bytes of code. */
309 static char *put_dec_trunc(char *buf, unsigned q)
310 {
311         unsigned d3, d2, d1, d0;
312         d1 = (q>>4) & 0xf;
313         d2 = (q>>8) & 0xf;
314         d3 = (q>>12);
315
316         d0 = 6*(d3 + d2 + d1) + (q & 0xf);
317         q = (d0 * 0xcd) >> 11;
318         d0 = d0 - 10*q;
319         *buf++ = d0 + '0'; /* least significant digit */
320         d1 = q + 9*d3 + 5*d2 + d1;
321         if (d1 != 0) {
322                 q = (d1 * 0xcd) >> 11;
323                 d1 = d1 - 10*q;
324                 *buf++ = d1 + '0'; /* next digit */
325
326                 d2 = q + 2*d2;
327                 if ((d2 != 0) || (d3 != 0)) {
328                         q = (d2 * 0xd) >> 7;
329                         d2 = d2 - 10*q;
330                         *buf++ = d2 + '0'; /* next digit */
331
332                         d3 = q + 4*d3;
333                         if (d3 != 0) {
334                                 q = (d3 * 0xcd) >> 11;
335                                 d3 = d3 - 10*q;
336                                 *buf++ = d3 + '0';  /* next digit */
337                                 if (q != 0)
338                                         *buf++ = q + '0'; /* most sign. digit */
339                         }
340                 }
341         }
342
343         return buf;
344 }
345 /* Same with if's removed. Always emits five digits */
346 static char *put_dec_full(char *buf, unsigned q)
347 {
348         /* BTW, if q is in [0,9999], 8-bit ints will be enough, */
349         /* but anyway, gcc produces better code with full-sized ints */
350         unsigned d3, d2, d1, d0;
351         d1 = (q>>4) & 0xf;
352         d2 = (q>>8) & 0xf;
353         d3 = (q>>12);
354
355         /*
356          * Possible ways to approx. divide by 10
357          * gcc -O2 replaces multiply with shifts and adds
358          * (x * 0xcd) >> 11: 11001101 - shorter code than * 0x67 (on i386)
359          * (x * 0x67) >> 10:  1100111
360          * (x * 0x34) >> 9:    110100 - same
361          * (x * 0x1a) >> 8:     11010 - same
362          * (x * 0x0d) >> 7:      1101 - same, shortest code (on i386)
363          */
364         d0 = 6*(d3 + d2 + d1) + (q & 0xf);
365         q = (d0 * 0xcd) >> 11;
366         d0 = d0 - 10*q;
367         *buf++ = d0 + '0';
368         d1 = q + 9*d3 + 5*d2 + d1;
369                 q = (d1 * 0xcd) >> 11;
370                 d1 = d1 - 10*q;
371                 *buf++ = d1 + '0';
372
373                 d2 = q + 2*d2;
374                         q = (d2 * 0xd) >> 7;
375                         d2 = d2 - 10*q;
376                         *buf++ = d2 + '0';
377
378                         d3 = q + 4*d3;
379                                 q = (d3 * 0xcd) >> 11; /* - shorter code */
380                                 /* q = (d3 * 0x67) >> 10; - would also work */
381                                 d3 = d3 - 10*q;
382                                 *buf++ = d3 + '0';
383                                         *buf++ = q + '0';
384
385         return buf;
386 }
387 /* No inlining helps gcc to use registers better */
388 static noinline char *put_dec(char *buf, unsigned long long num)
389 {
390         while (1) {
391                 unsigned rem;
392                 if (num < 100000)
393                         return put_dec_trunc(buf, num);
394                 rem = do_div(num, 100000);
395                 buf = put_dec_full(buf, rem);
396         }
397 }
398
399 #define ZEROPAD 1               /* pad with zero */
400 #define SIGN    2               /* unsigned/signed long */
401 #define PLUS    4               /* show plus */
402 #define SPACE   8               /* space if plus */
403 #define LEFT    16              /* left justified */
404 #define SMALL   32              /* Must be 32 == 0x20 */
405 #define SPECIAL 64              /* 0x */
406
407 enum format_type {
408         FORMAT_TYPE_NONE, /* Just a string part */
409         FORMAT_TYPE_WIDTH,
410         FORMAT_TYPE_PRECISION,
411         FORMAT_TYPE_CHAR,
412         FORMAT_TYPE_STR,
413         FORMAT_TYPE_PTR,
414         FORMAT_TYPE_PERCENT_CHAR,
415         FORMAT_TYPE_INVALID,
416         FORMAT_TYPE_LONG_LONG,
417         FORMAT_TYPE_ULONG,
418         FORMAT_TYPE_LONG,
419         FORMAT_TYPE_UBYTE,
420         FORMAT_TYPE_BYTE,
421         FORMAT_TYPE_USHORT,
422         FORMAT_TYPE_SHORT,
423         FORMAT_TYPE_UINT,
424         FORMAT_TYPE_INT,
425         FORMAT_TYPE_NRCHARS,
426         FORMAT_TYPE_SIZE_T,
427         FORMAT_TYPE_PTRDIFF
428 };
429
430 struct printf_spec {
431         enum format_type        type;
432         int                     flags;          /* flags to number() */
433         int                     field_width;    /* width of output field */
434         int                     base;
435         int                     precision;      /* # of digits/chars */
436         int                     qualifier;
437 };
438
439 static char *number(char *buf, char *end, unsigned long long num,
440                         struct printf_spec spec)
441 {
442         /* we are called with base 8, 10 or 16, only, thus don't need "G..."  */
443         static const char digits[16] = "0123456789ABCDEF"; /* "GHIJKLMNOPQRSTUVWXYZ"; */
444
445         char tmp[66];
446         char sign;
447         char locase;
448         int need_pfx = ((spec.flags & SPECIAL) && spec.base != 10);
449         int i;
450
451         /* locase = 0 or 0x20. ORing digits or letters with 'locase'
452          * produces same digits or (maybe lowercased) letters */
453         locase = (spec.flags & SMALL);
454         if (spec.flags & LEFT)
455                 spec.flags &= ~ZEROPAD;
456         sign = 0;
457         if (spec.flags & SIGN) {
458                 if ((signed long long)num < 0) {
459                         sign = '-';
460                         num = -(signed long long)num;
461                         spec.field_width--;
462                 } else if (spec.flags & PLUS) {
463                         sign = '+';
464                         spec.field_width--;
465                 } else if (spec.flags & SPACE) {
466                         sign = ' ';
467                         spec.field_width--;
468                 }
469         }
470         if (need_pfx) {
471                 spec.field_width--;
472                 if (spec.base == 16)
473                         spec.field_width--;
474         }
475
476         /* generate full string in tmp[], in reverse order */
477         i = 0;
478         if (num == 0)
479                 tmp[i++] = '0';
480         /* Generic code, for any base:
481         else do {
482                 tmp[i++] = (digits[do_div(num,base)] | locase);
483         } while (num != 0);
484         */
485         else if (spec.base != 10) { /* 8 or 16 */
486                 int mask = spec.base - 1;
487                 int shift = 3;
488
489                 if (spec.base == 16)
490                         shift = 4;
491                 do {
492                         tmp[i++] = (digits[((unsigned char)num) & mask] | locase);
493                         num >>= shift;
494                 } while (num);
495         } else { /* base 10 */
496                 i = put_dec(tmp, num) - tmp;
497         }
498
499         /* printing 100 using %2d gives "100", not "00" */
500         if (i > spec.precision)
501                 spec.precision = i;
502         /* leading space padding */
503         spec.field_width -= spec.precision;
504         if (!(spec.flags & (ZEROPAD+LEFT))) {
505                 while (--spec.field_width >= 0) {
506                         if (buf < end)
507                                 *buf = ' ';
508                         ++buf;
509                 }
510         }
511         /* sign */
512         if (sign) {
513                 if (buf < end)
514                         *buf = sign;
515                 ++buf;
516         }
517         /* "0x" / "0" prefix */
518         if (need_pfx) {
519                 if (buf < end)
520                         *buf = '0';
521                 ++buf;
522                 if (spec.base == 16) {
523                         if (buf < end)
524                                 *buf = ('X' | locase);
525                         ++buf;
526                 }
527         }
528         /* zero or space padding */
529         if (!(spec.flags & LEFT)) {
530                 char c = (spec.flags & ZEROPAD) ? '0' : ' ';
531                 while (--spec.field_width >= 0) {
532                         if (buf < end)
533                                 *buf = c;
534                         ++buf;
535                 }
536         }
537         /* hmm even more zero padding? */
538         while (i <= --spec.precision) {
539                 if (buf < end)
540                         *buf = '0';
541                 ++buf;
542         }
543         /* actual digits of result */
544         while (--i >= 0) {
545                 if (buf < end)
546                         *buf = tmp[i];
547                 ++buf;
548         }
549         /* trailing space padding */
550         while (--spec.field_width >= 0) {
551                 if (buf < end)
552                         *buf = ' ';
553                 ++buf;
554         }
555
556         return buf;
557 }
558
559 static char *string(char *buf, char *end, const char *s, struct printf_spec spec)
560 {
561         int len, i;
562
563         if ((unsigned long)s < PAGE_SIZE)
564                 s = "(null)";
565
566         len = strnlen(s, spec.precision);
567
568         if (!(spec.flags & LEFT)) {
569                 while (len < spec.field_width--) {
570                         if (buf < end)
571                                 *buf = ' ';
572                         ++buf;
573                 }
574         }
575         for (i = 0; i < len; ++i) {
576                 if (buf < end)
577                         *buf = *s;
578                 ++buf; ++s;
579         }
580         while (len < spec.field_width--) {
581                 if (buf < end)
582                         *buf = ' ';
583                 ++buf;
584         }
585
586         return buf;
587 }
588
589 static char *symbol_string(char *buf, char *end, void *ptr,
590                                 struct printf_spec spec, char ext)
591 {
592         unsigned long value = (unsigned long) ptr;
593 #ifdef CONFIG_KALLSYMS
594         char sym[KSYM_SYMBOL_LEN];
595         if (ext != 'f' && ext != 's')
596                 sprint_symbol(sym, value);
597         else
598                 kallsyms_lookup(value, NULL, NULL, NULL, sym);
599
600         return string(buf, end, sym, spec);
601 #else
602         spec.field_width = 2 * sizeof(void *);
603         spec.flags |= SPECIAL | SMALL | ZEROPAD;
604         spec.base = 16;
605
606         return number(buf, end, value, spec);
607 #endif
608 }
609
610 static char *resource_string(char *buf, char *end, struct resource *res,
611                                 struct printf_spec spec, const char *fmt)
612 {
613 #ifndef IO_RSRC_PRINTK_SIZE
614 #define IO_RSRC_PRINTK_SIZE     6
615 #endif
616
617 #ifndef MEM_RSRC_PRINTK_SIZE
618 #define MEM_RSRC_PRINTK_SIZE    10
619 #endif
620         struct printf_spec hex_spec = {
621                 .base = 16,
622                 .precision = -1,
623                 .flags = SPECIAL | SMALL | ZEROPAD,
624         };
625         struct printf_spec dec_spec = {
626                 .base = 10,
627                 .precision = -1,
628                 .flags = 0,
629         };
630         struct printf_spec str_spec = {
631                 .field_width = -1,
632                 .precision = 10,
633                 .flags = LEFT,
634         };
635         struct printf_spec flag_spec = {
636                 .base = 16,
637                 .precision = -1,
638                 .flags = SPECIAL | SMALL,
639         };
640
641         /* 32-bit res (sizeof==4): 10 chars in dec, 10 in hex ("0x" + 8)
642          * 64-bit res (sizeof==8): 20 chars in dec, 18 in hex ("0x" + 16) */
643 #define RSRC_BUF_SIZE           ((2 * sizeof(resource_size_t)) + 4)
644 #define FLAG_BUF_SIZE           (2 * sizeof(res->flags))
645 #define DECODED_BUF_SIZE        sizeof("[mem - 64bit pref disabled]")
646 #define RAW_BUF_SIZE            sizeof("[mem - flags 0x]")
647         char sym[max(2*RSRC_BUF_SIZE + DECODED_BUF_SIZE,
648                      2*RSRC_BUF_SIZE + FLAG_BUF_SIZE + RAW_BUF_SIZE)];
649
650         char *p = sym, *pend = sym + sizeof(sym);
651         int size = -1, addr = 0;
652         int decode = (fmt[0] == 'R') ? 1 : 0;
653
654         if (res->flags & IORESOURCE_IO) {
655                 size = IO_RSRC_PRINTK_SIZE;
656                 addr = 1;
657         } else if (res->flags & IORESOURCE_MEM) {
658                 size = MEM_RSRC_PRINTK_SIZE;
659                 addr = 1;
660         }
661
662         *p++ = '[';
663         if (res->flags & IORESOURCE_IO)
664                 p = string(p, pend, "io  ", str_spec);
665         else if (res->flags & IORESOURCE_MEM)
666                 p = string(p, pend, "mem ", str_spec);
667         else if (res->flags & IORESOURCE_IRQ)
668                 p = string(p, pend, "irq ", str_spec);
669         else if (res->flags & IORESOURCE_DMA)
670                 p = string(p, pend, "dma ", str_spec);
671         else {
672                 p = string(p, pend, "??? ", str_spec);
673                 decode = 0;
674         }
675         hex_spec.field_width = size;
676         p = number(p, pend, res->start, addr ? hex_spec : dec_spec);
677         if (res->start != res->end) {
678                 *p++ = '-';
679                 p = number(p, pend, res->end, addr ? hex_spec : dec_spec);
680         }
681         if (decode) {
682                 if (res->flags & IORESOURCE_MEM_64)
683                         p = string(p, pend, " 64bit", str_spec);
684                 if (res->flags & IORESOURCE_PREFETCH)
685                         p = string(p, pend, " pref", str_spec);
686                 if (res->flags & IORESOURCE_DISABLED)
687                         p = string(p, pend, " disabled", str_spec);
688         } else {
689                 p = string(p, pend, " flags ", str_spec);
690                 p = number(p, pend, res->flags, flag_spec);
691         }
692         *p++ = ']';
693         *p = '\0';
694
695         return string(buf, end, sym, spec);
696 }
697
698 static char *mac_address_string(char *buf, char *end, u8 *addr,
699                                 struct printf_spec spec, const char *fmt)
700 {
701         char mac_addr[sizeof("xx:xx:xx:xx:xx:xx")];
702         char *p = mac_addr;
703         int i;
704
705         for (i = 0; i < 6; i++) {
706                 p = pack_hex_byte(p, addr[i]);
707                 if (fmt[0] == 'M' && i != 5)
708                         *p++ = ':';
709         }
710         *p = '\0';
711
712         return string(buf, end, mac_addr, spec);
713 }
714
715 static char *ip4_string(char *p, const u8 *addr, bool leading_zeros)
716 {
717         int i;
718
719         for (i = 0; i < 4; i++) {
720                 char temp[3];   /* hold each IP quad in reverse order */
721                 int digits = put_dec_trunc(temp, addr[i]) - temp;
722                 if (leading_zeros) {
723                         if (digits < 3)
724                                 *p++ = '0';
725                         if (digits < 2)
726                                 *p++ = '0';
727                 }
728                 /* reverse the digits in the quad */
729                 while (digits--)
730                         *p++ = temp[digits];
731                 if (i < 3)
732                         *p++ = '.';
733         }
734         *p = '\0';
735
736         return p;
737 }
738
739 static char *ip6_compressed_string(char *p, const char *addr)
740 {
741         int i, j, range;
742         unsigned char zerolength[8];
743         int longest = 1;
744         int colonpos = -1;
745         u16 word;
746         u8 hi, lo;
747         bool needcolon = false;
748         bool useIPv4;
749         struct in6_addr in6;
750
751         memcpy(&in6, addr, sizeof(struct in6_addr));
752
753         useIPv4 = ipv6_addr_v4mapped(&in6) || ipv6_addr_is_isatap(&in6);
754
755         memset(zerolength, 0, sizeof(zerolength));
756
757         if (useIPv4)
758                 range = 6;
759         else
760                 range = 8;
761
762         /* find position of longest 0 run */
763         for (i = 0; i < range; i++) {
764                 for (j = i; j < range; j++) {
765                         if (in6.s6_addr16[j] != 0)
766                                 break;
767                         zerolength[i]++;
768                 }
769         }
770         for (i = 0; i < range; i++) {
771                 if (zerolength[i] > longest) {
772                         longest = zerolength[i];
773                         colonpos = i;
774                 }
775         }
776
777         /* emit address */
778         for (i = 0; i < range; i++) {
779                 if (i == colonpos) {
780                         if (needcolon || i == 0)
781                                 *p++ = ':';
782                         *p++ = ':';
783                         needcolon = false;
784                         i += longest - 1;
785                         continue;
786                 }
787                 if (needcolon) {
788                         *p++ = ':';
789                         needcolon = false;
790                 }
791                 /* hex u16 without leading 0s */
792                 word = ntohs(in6.s6_addr16[i]);
793                 hi = word >> 8;
794                 lo = word & 0xff;
795                 if (hi) {
796                         if (hi > 0x0f)
797                                 p = pack_hex_byte(p, hi);
798                         else
799                                 *p++ = hex_asc_lo(hi);
800                         p = pack_hex_byte(p, lo);
801                 }
802                 else if (lo > 0x0f)
803                         p = pack_hex_byte(p, lo);
804                 else
805                         *p++ = hex_asc_lo(lo);
806                 needcolon = true;
807         }
808
809         if (useIPv4) {
810                 if (needcolon)
811                         *p++ = ':';
812                 p = ip4_string(p, &in6.s6_addr[12], false);
813         }
814         *p = '\0';
815
816         return p;
817 }
818
819 static char *ip6_string(char *p, const char *addr, const char *fmt)
820 {
821         int i;
822
823         for (i = 0; i < 8; i++) {
824                 p = pack_hex_byte(p, *addr++);
825                 p = pack_hex_byte(p, *addr++);
826                 if (fmt[0] == 'I' && i != 7)
827                         *p++ = ':';
828         }
829         *p = '\0';
830
831         return p;
832 }
833
834 static char *ip6_addr_string(char *buf, char *end, const u8 *addr,
835                              struct printf_spec spec, const char *fmt)
836 {
837         char ip6_addr[sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255")];
838
839         if (fmt[0] == 'I' && fmt[2] == 'c')
840                 ip6_compressed_string(ip6_addr, addr);
841         else
842                 ip6_string(ip6_addr, addr, fmt);
843
844         return string(buf, end, ip6_addr, spec);
845 }
846
847 static char *ip4_addr_string(char *buf, char *end, const u8 *addr,
848                              struct printf_spec spec, const char *fmt)
849 {
850         char ip4_addr[sizeof("255.255.255.255")];
851
852         ip4_string(ip4_addr, addr, fmt[0] == 'i');
853
854         return string(buf, end, ip4_addr, spec);
855 }
856
857 /*
858  * Show a '%p' thing.  A kernel extension is that the '%p' is followed
859  * by an extra set of alphanumeric characters that are extended format
860  * specifiers.
861  *
862  * Right now we handle:
863  *
864  * - 'F' For symbolic function descriptor pointers with offset
865  * - 'f' For simple symbolic function names without offset
866  * - 'S' For symbolic direct pointers with offset
867  * - 's' For symbolic direct pointers without offset
868  * - 'R' For decoded struct resource, e.g., [mem 0x0-0x1f 64bit pref]
869  * - 'r' For raw struct resource, e.g., [mem 0x0-0x1f flags 0x201]
870  * - 'M' For a 6-byte MAC address, it prints the address in the
871  *       usual colon-separated hex notation
872  * - 'm' For a 6-byte MAC address, it prints the hex address without colons
873  * - 'I' [46] for IPv4/IPv6 addresses printed in the usual way
874  *       IPv4 uses dot-separated decimal without leading 0's (1.2.3.4)
875  *       IPv6 uses colon separated network-order 16 bit hex with leading 0's
876  * - 'i' [46] for 'raw' IPv4/IPv6 addresses
877  *       IPv6 omits the colons (01020304...0f)
878  *       IPv4 uses dot-separated decimal with leading 0's (010.123.045.006)
879  * - 'I6c' for IPv6 addresses printed as specified by
880  *       http://www.ietf.org/id/draft-kawamura-ipv6-text-representation-03.txt
881  * Note: The difference between 'S' and 'F' is that on ia64 and ppc64
882  * function pointers are really function descriptors, which contain a
883  * pointer to the real address.
884  */
885 static char *pointer(const char *fmt, char *buf, char *end, void *ptr,
886                         struct printf_spec spec)
887 {
888         if (!ptr)
889                 return string(buf, end, "(null)", spec);
890
891         switch (*fmt) {
892         case 'F':
893         case 'f':
894                 ptr = dereference_function_descriptor(ptr);
895                 /* Fallthrough */
896         case 's':
897         case 'S':
898                 return symbol_string(buf, end, ptr, spec, *fmt);
899         case 'R':
900         case 'r':
901                 return resource_string(buf, end, ptr, spec, fmt);
902         case 'M':                       /* Colon separated: 00:01:02:03:04:05 */
903         case 'm':                       /* Contiguous: 000102030405 */
904                 return mac_address_string(buf, end, ptr, spec, fmt);
905         case 'I':                       /* Formatted IP supported
906                                          * 4:   1.2.3.4
907                                          * 6:   0001:0203:...:0708
908                                          * 6c:  1::708 or 1::1.2.3.4
909                                          */
910         case 'i':                       /* Contiguous:
911                                          * 4:   001.002.003.004
912                                          * 6:   000102...0f
913                                          */
914                 switch (fmt[1]) {
915                 case '6':
916                         return ip6_addr_string(buf, end, ptr, spec, fmt);
917                 case '4':
918                         return ip4_addr_string(buf, end, ptr, spec, fmt);
919                 }
920                 break;
921         }
922         spec.flags |= SMALL;
923         if (spec.field_width == -1) {
924                 spec.field_width = 2*sizeof(void *);
925                 spec.flags |= ZEROPAD;
926         }
927         spec.base = 16;
928
929         return number(buf, end, (unsigned long) ptr, spec);
930 }
931
932 /*
933  * Helper function to decode printf style format.
934  * Each call decode a token from the format and return the
935  * number of characters read (or likely the delta where it wants
936  * to go on the next call).
937  * The decoded token is returned through the parameters
938  *
939  * 'h', 'l', or 'L' for integer fields
940  * 'z' support added 23/7/1999 S.H.
941  * 'z' changed to 'Z' --davidm 1/25/99
942  * 't' added for ptrdiff_t
943  *
944  * @fmt: the format string
945  * @type of the token returned
946  * @flags: various flags such as +, -, # tokens..
947  * @field_width: overwritten width
948  * @base: base of the number (octal, hex, ...)
949  * @precision: precision of a number
950  * @qualifier: qualifier of a number (long, size_t, ...)
951  */
952 static int format_decode(const char *fmt, struct printf_spec *spec)
953 {
954         const char *start = fmt;
955
956         /* we finished early by reading the field width */
957         if (spec->type == FORMAT_TYPE_WIDTH) {
958                 if (spec->field_width < 0) {
959                         spec->field_width = -spec->field_width;
960                         spec->flags |= LEFT;
961                 }
962                 spec->type = FORMAT_TYPE_NONE;
963                 goto precision;
964         }
965
966         /* we finished early by reading the precision */
967         if (spec->type == FORMAT_TYPE_PRECISION) {
968                 if (spec->precision < 0)
969                         spec->precision = 0;
970
971                 spec->type = FORMAT_TYPE_NONE;
972                 goto qualifier;
973         }
974
975         /* By default */
976         spec->type = FORMAT_TYPE_NONE;
977
978         for (; *fmt ; ++fmt) {
979                 if (*fmt == '%')
980                         break;
981         }
982
983         /* Return the current non-format string */
984         if (fmt != start || !*fmt)
985                 return fmt - start;
986
987         /* Process flags */
988         spec->flags = 0;
989
990         while (1) { /* this also skips first '%' */
991                 bool found = true;
992
993                 ++fmt;
994
995                 switch (*fmt) {
996                 case '-': spec->flags |= LEFT;    break;
997                 case '+': spec->flags |= PLUS;    break;
998                 case ' ': spec->flags |= SPACE;   break;
999                 case '#': spec->flags |= SPECIAL; break;
1000                 case '0': spec->flags |= ZEROPAD; break;
1001                 default:  found = false;
1002                 }
1003
1004                 if (!found)
1005                         break;
1006         }
1007
1008         /* get field width */
1009         spec->field_width = -1;
1010
1011         if (isdigit(*fmt))
1012                 spec->field_width = skip_atoi(&fmt);
1013         else if (*fmt == '*') {
1014                 /* it's the next argument */
1015                 spec->type = FORMAT_TYPE_WIDTH;
1016                 return ++fmt - start;
1017         }
1018
1019 precision:
1020         /* get the precision */
1021         spec->precision = -1;
1022         if (*fmt == '.') {
1023                 ++fmt;
1024                 if (isdigit(*fmt)) {
1025                         spec->precision = skip_atoi(&fmt);
1026                         if (spec->precision < 0)
1027                                 spec->precision = 0;
1028                 } else if (*fmt == '*') {
1029                         /* it's the next argument */
1030                         spec->type = FORMAT_TYPE_PRECISION;
1031                         return ++fmt - start;
1032                 }
1033         }
1034
1035 qualifier:
1036         /* get the conversion qualifier */
1037         spec->qualifier = -1;
1038         if (*fmt == 'h' || TOLOWER(*fmt) == 'l' ||
1039             TOLOWER(*fmt) == 'z' || *fmt == 't') {
1040                 spec->qualifier = *fmt++;
1041                 if (unlikely(spec->qualifier == *fmt)) {
1042                         if (spec->qualifier == 'l') {
1043                                 spec->qualifier = 'L';
1044                                 ++fmt;
1045                         } else if (spec->qualifier == 'h') {
1046                                 spec->qualifier = 'H';
1047                                 ++fmt;
1048                         }
1049                 }
1050         }
1051
1052         /* default base */
1053         spec->base = 10;
1054         switch (*fmt) {
1055         case 'c':
1056                 spec->type = FORMAT_TYPE_CHAR;
1057                 return ++fmt - start;
1058
1059         case 's':
1060                 spec->type = FORMAT_TYPE_STR;
1061                 return ++fmt - start;
1062
1063         case 'p':
1064                 spec->type = FORMAT_TYPE_PTR;
1065                 return fmt - start;
1066                 /* skip alnum */
1067
1068         case 'n':
1069                 spec->type = FORMAT_TYPE_NRCHARS;
1070                 return ++fmt - start;
1071
1072         case '%':
1073                 spec->type = FORMAT_TYPE_PERCENT_CHAR;
1074                 return ++fmt - start;
1075
1076         /* integer number formats - set up the flags and "break" */
1077         case 'o':
1078                 spec->base = 8;
1079                 break;
1080
1081         case 'x':
1082                 spec->flags |= SMALL;
1083
1084         case 'X':
1085                 spec->base = 16;
1086                 break;
1087
1088         case 'd':
1089         case 'i':
1090                 spec->flags |= SIGN;
1091         case 'u':
1092                 break;
1093
1094         default:
1095                 spec->type = FORMAT_TYPE_INVALID;
1096                 return fmt - start;
1097         }
1098
1099         if (spec->qualifier == 'L')
1100                 spec->type = FORMAT_TYPE_LONG_LONG;
1101         else if (spec->qualifier == 'l') {
1102                 if (spec->flags & SIGN)
1103                         spec->type = FORMAT_TYPE_LONG;
1104                 else
1105                         spec->type = FORMAT_TYPE_ULONG;
1106         } else if (TOLOWER(spec->qualifier) == 'z') {
1107                 spec->type = FORMAT_TYPE_SIZE_T;
1108         } else if (spec->qualifier == 't') {
1109                 spec->type = FORMAT_TYPE_PTRDIFF;
1110         } else if (spec->qualifier == 'H') {
1111                 if (spec->flags & SIGN)
1112                         spec->type = FORMAT_TYPE_BYTE;
1113                 else
1114                         spec->type = FORMAT_TYPE_UBYTE;
1115         } else if (spec->qualifier == 'h') {
1116                 if (spec->flags & SIGN)
1117                         spec->type = FORMAT_TYPE_SHORT;
1118                 else
1119                         spec->type = FORMAT_TYPE_USHORT;
1120         } else {
1121                 if (spec->flags & SIGN)
1122                         spec->type = FORMAT_TYPE_INT;
1123                 else
1124                         spec->type = FORMAT_TYPE_UINT;
1125         }
1126
1127         return ++fmt - start;
1128 }
1129
1130 /**
1131  * vsnprintf - Format a string and place it in a buffer
1132  * @buf: The buffer to place the result into
1133  * @size: The size of the buffer, including the trailing null space
1134  * @fmt: The format string to use
1135  * @args: Arguments for the format string
1136  *
1137  * This function follows C99 vsnprintf, but has some extensions:
1138  * %pS output the name of a text symbol with offset
1139  * %ps output the name of a text symbol without offset
1140  * %pF output the name of a function pointer with its offset
1141  * %pf output the name of a function pointer without its offset
1142  * %pR output the address range in a struct resource
1143  * %n is ignored
1144  *
1145  * The return value is the number of characters which would
1146  * be generated for the given input, excluding the trailing
1147  * '\0', as per ISO C99. If you want to have the exact
1148  * number of characters written into @buf as return value
1149  * (not including the trailing '\0'), use vscnprintf(). If the
1150  * return is greater than or equal to @size, the resulting
1151  * string is truncated.
1152  *
1153  * Call this function if you are already dealing with a va_list.
1154  * You probably want snprintf() instead.
1155  */
1156 int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
1157 {
1158         unsigned long long num;
1159         char *str, *end;
1160         struct printf_spec spec = {0};
1161
1162         /* Reject out-of-range values early.  Large positive sizes are
1163            used for unknown buffer sizes. */
1164         if (WARN_ON_ONCE((int) size < 0))
1165                 return 0;
1166
1167         str = buf;
1168         end = buf + size;
1169
1170         /* Make sure end is always >= buf */
1171         if (end < buf) {
1172                 end = ((void *)-1);
1173                 size = end - buf;
1174         }
1175
1176         while (*fmt) {
1177                 const char *old_fmt = fmt;
1178                 int read = format_decode(fmt, &spec);
1179
1180                 fmt += read;
1181
1182                 switch (spec.type) {
1183                 case FORMAT_TYPE_NONE: {
1184                         int copy = read;
1185                         if (str < end) {
1186                                 if (copy > end - str)
1187                                         copy = end - str;
1188                                 memcpy(str, old_fmt, copy);
1189                         }
1190                         str += read;
1191                         break;
1192                 }
1193
1194                 case FORMAT_TYPE_WIDTH:
1195                         spec.field_width = va_arg(args, int);
1196                         break;
1197
1198                 case FORMAT_TYPE_PRECISION:
1199                         spec.precision = va_arg(args, int);
1200                         break;
1201
1202                 case FORMAT_TYPE_CHAR: {
1203                         char c;
1204
1205                         if (!(spec.flags & LEFT)) {
1206                                 while (--spec.field_width > 0) {
1207                                         if (str < end)
1208                                                 *str = ' ';
1209                                         ++str;
1210
1211                                 }
1212                         }
1213                         c = (unsigned char) va_arg(args, int);
1214                         if (str < end)
1215                                 *str = c;
1216                         ++str;
1217                         while (--spec.field_width > 0) {
1218                                 if (str < end)
1219                                         *str = ' ';
1220                                 ++str;
1221                         }
1222                         break;
1223                 }
1224
1225                 case FORMAT_TYPE_STR:
1226                         str = string(str, end, va_arg(args, char *), spec);
1227                         break;
1228
1229                 case FORMAT_TYPE_PTR:
1230                         str = pointer(fmt+1, str, end, va_arg(args, void *),
1231                                       spec);
1232                         while (isalnum(*fmt))
1233                                 fmt++;
1234                         break;
1235
1236                 case FORMAT_TYPE_PERCENT_CHAR:
1237                         if (str < end)
1238                                 *str = '%';
1239                         ++str;
1240                         break;
1241
1242                 case FORMAT_TYPE_INVALID:
1243                         if (str < end)
1244                                 *str = '%';
1245                         ++str;
1246                         break;
1247
1248                 case FORMAT_TYPE_NRCHARS: {
1249                         int qualifier = spec.qualifier;
1250
1251                         if (qualifier == 'l') {
1252                                 long *ip = va_arg(args, long *);
1253                                 *ip = (str - buf);
1254                         } else if (TOLOWER(qualifier) == 'z') {
1255                                 size_t *ip = va_arg(args, size_t *);
1256                                 *ip = (str - buf);
1257                         } else {
1258                                 int *ip = va_arg(args, int *);
1259                                 *ip = (str - buf);
1260                         }
1261                         break;
1262                 }
1263
1264                 default:
1265                         switch (spec.type) {
1266                         case FORMAT_TYPE_LONG_LONG:
1267                                 num = va_arg(args, long long);
1268                                 break;
1269                         case FORMAT_TYPE_ULONG:
1270                                 num = va_arg(args, unsigned long);
1271                                 break;
1272                         case FORMAT_TYPE_LONG:
1273                                 num = va_arg(args, long);
1274                                 break;
1275                         case FORMAT_TYPE_SIZE_T:
1276                                 num = va_arg(args, size_t);
1277                                 break;
1278                         case FORMAT_TYPE_PTRDIFF:
1279                                 num = va_arg(args, ptrdiff_t);
1280                                 break;
1281                         case FORMAT_TYPE_UBYTE:
1282                                 num = (unsigned char) va_arg(args, int);
1283                                 break;
1284                         case FORMAT_TYPE_BYTE:
1285                                 num = (signed char) va_arg(args, int);
1286                                 break;
1287                         case FORMAT_TYPE_USHORT:
1288                                 num = (unsigned short) va_arg(args, int);
1289                                 break;
1290                         case FORMAT_TYPE_SHORT:
1291                                 num = (short) va_arg(args, int);
1292                                 break;
1293                         case FORMAT_TYPE_INT:
1294                                 num = (int) va_arg(args, int);
1295                                 break;
1296                         default:
1297                                 num = va_arg(args, unsigned int);
1298                         }
1299
1300                         str = number(str, end, num, spec);
1301                 }
1302         }
1303
1304         if (size > 0) {
1305                 if (str < end)
1306                         *str = '\0';
1307                 else
1308                         end[-1] = '\0';
1309         }
1310
1311         /* the trailing null byte doesn't count towards the total */
1312         return str-buf;
1313
1314 }
1315 EXPORT_SYMBOL(vsnprintf);
1316
1317 /**
1318  * vscnprintf - Format a string and place it in a buffer
1319  * @buf: The buffer to place the result into
1320  * @size: The size of the buffer, including the trailing null space
1321  * @fmt: The format string to use
1322  * @args: Arguments for the format string
1323  *
1324  * The return value is the number of characters which have been written into
1325  * the @buf not including the trailing '\0'. If @size is <= 0 the function
1326  * returns 0.
1327  *
1328  * Call this function if you are already dealing with a va_list.
1329  * You probably want scnprintf() instead.
1330  *
1331  * See the vsnprintf() documentation for format string extensions over C99.
1332  */
1333 int vscnprintf(char *buf, size_t size, const char *fmt, va_list args)
1334 {
1335         int i;
1336
1337         i = vsnprintf(buf, size, fmt, args);
1338
1339         return (i >= size) ? (size - 1) : i;
1340 }
1341 EXPORT_SYMBOL(vscnprintf);
1342
1343 /**
1344  * snprintf - Format a string and place it in a buffer
1345  * @buf: The buffer to place the result into
1346  * @size: The size of the buffer, including the trailing null space
1347  * @fmt: The format string to use
1348  * @...: Arguments for the format string
1349  *
1350  * The return value is the number of characters which would be
1351  * generated for the given input, excluding the trailing null,
1352  * as per ISO C99.  If the return is greater than or equal to
1353  * @size, the resulting string is truncated.
1354  *
1355  * See the vsnprintf() documentation for format string extensions over C99.
1356  */
1357 int snprintf(char *buf, size_t size, const char *fmt, ...)
1358 {
1359         va_list args;
1360         int i;
1361
1362         va_start(args, fmt);
1363         i = vsnprintf(buf, size, fmt, args);
1364         va_end(args);
1365
1366         return i;
1367 }
1368 EXPORT_SYMBOL(snprintf);
1369
1370 /**
1371  * scnprintf - Format a string and place it in a buffer
1372  * @buf: The buffer to place the result into
1373  * @size: The size of the buffer, including the trailing null space
1374  * @fmt: The format string to use
1375  * @...: Arguments for the format string
1376  *
1377  * The return value is the number of characters written into @buf not including
1378  * the trailing '\0'. If @size is <= 0 the function returns 0.
1379  */
1380
1381 int scnprintf(char *buf, size_t size, const char *fmt, ...)
1382 {
1383         va_list args;
1384         int i;
1385
1386         va_start(args, fmt);
1387         i = vsnprintf(buf, size, fmt, args);
1388         va_end(args);
1389
1390         return (i >= size) ? (size - 1) : i;
1391 }
1392 EXPORT_SYMBOL(scnprintf);
1393
1394 /**
1395  * vsprintf - Format a string and place it in a buffer
1396  * @buf: The buffer to place the result into
1397  * @fmt: The format string to use
1398  * @args: Arguments for the format string
1399  *
1400  * The function returns the number of characters written
1401  * into @buf. Use vsnprintf() or vscnprintf() in order to avoid
1402  * buffer overflows.
1403  *
1404  * Call this function if you are already dealing with a va_list.
1405  * You probably want sprintf() instead.
1406  *
1407  * See the vsnprintf() documentation for format string extensions over C99.
1408  */
1409 int vsprintf(char *buf, const char *fmt, va_list args)
1410 {
1411         return vsnprintf(buf, INT_MAX, fmt, args);
1412 }
1413 EXPORT_SYMBOL(vsprintf);
1414
1415 /**
1416  * sprintf - Format a string and place it in a buffer
1417  * @buf: The buffer to place the result into
1418  * @fmt: The format string to use
1419  * @...: Arguments for the format string
1420  *
1421  * The function returns the number of characters written
1422  * into @buf. Use snprintf() or scnprintf() in order to avoid
1423  * buffer overflows.
1424  *
1425  * See the vsnprintf() documentation for format string extensions over C99.
1426  */
1427 int sprintf(char *buf, const char *fmt, ...)
1428 {
1429         va_list args;
1430         int i;
1431
1432         va_start(args, fmt);
1433         i = vsnprintf(buf, INT_MAX, fmt, args);
1434         va_end(args);
1435
1436         return i;
1437 }
1438 EXPORT_SYMBOL(sprintf);
1439
1440 #ifdef CONFIG_BINARY_PRINTF
1441 /*
1442  * bprintf service:
1443  * vbin_printf() - VA arguments to binary data
1444  * bstr_printf() - Binary data to text string
1445  */
1446
1447 /**
1448  * vbin_printf - Parse a format string and place args' binary value in a buffer
1449  * @bin_buf: The buffer to place args' binary value
1450  * @size: The size of the buffer(by words(32bits), not characters)
1451  * @fmt: The format string to use
1452  * @args: Arguments for the format string
1453  *
1454  * The format follows C99 vsnprintf, except %n is ignored, and its argument
1455  * is skiped.
1456  *
1457  * The return value is the number of words(32bits) which would be generated for
1458  * the given input.
1459  *
1460  * NOTE:
1461  * If the return value is greater than @size, the resulting bin_buf is NOT
1462  * valid for bstr_printf().
1463  */
1464 int vbin_printf(u32 *bin_buf, size_t size, const char *fmt, va_list args)
1465 {
1466         struct printf_spec spec = {0};
1467         char *str, *end;
1468
1469         str = (char *)bin_buf;
1470         end = (char *)(bin_buf + size);
1471
1472 #define save_arg(type)                                                  \
1473 do {                                                                    \
1474         if (sizeof(type) == 8) {                                        \
1475                 unsigned long long value;                               \
1476                 str = PTR_ALIGN(str, sizeof(u32));                      \
1477                 value = va_arg(args, unsigned long long);               \
1478                 if (str + sizeof(type) <= end) {                        \
1479                         *(u32 *)str = *(u32 *)&value;                   \
1480                         *(u32 *)(str + 4) = *((u32 *)&value + 1);       \
1481                 }                                                       \
1482         } else {                                                        \
1483                 unsigned long value;                                    \
1484                 str = PTR_ALIGN(str, sizeof(type));                     \
1485                 value = va_arg(args, int);                              \
1486                 if (str + sizeof(type) <= end)                          \
1487                         *(typeof(type) *)str = (type)value;             \
1488         }                                                               \
1489         str += sizeof(type);                                            \
1490 } while (0)
1491
1492         while (*fmt) {
1493                 int read = format_decode(fmt, &spec);
1494
1495                 fmt += read;
1496
1497                 switch (spec.type) {
1498                 case FORMAT_TYPE_NONE:
1499                 case FORMAT_TYPE_INVALID:
1500                 case FORMAT_TYPE_PERCENT_CHAR:
1501                         break;
1502
1503                 case FORMAT_TYPE_WIDTH:
1504                 case FORMAT_TYPE_PRECISION:
1505                         save_arg(int);
1506                         break;
1507
1508                 case FORMAT_TYPE_CHAR:
1509                         save_arg(char);
1510                         break;
1511
1512                 case FORMAT_TYPE_STR: {
1513                         const char *save_str = va_arg(args, char *);
1514                         size_t len;
1515
1516                         if ((unsigned long)save_str > (unsigned long)-PAGE_SIZE
1517                                         || (unsigned long)save_str < PAGE_SIZE)
1518                                 save_str = "(null)";
1519                         len = strlen(save_str) + 1;
1520                         if (str + len < end)
1521                                 memcpy(str, save_str, len);
1522                         str += len;
1523                         break;
1524                 }
1525
1526                 case FORMAT_TYPE_PTR:
1527                         save_arg(void *);
1528                         /* skip all alphanumeric pointer suffixes */
1529                         while (isalnum(*fmt))
1530                                 fmt++;
1531                         break;
1532
1533                 case FORMAT_TYPE_NRCHARS: {
1534                         /* skip %n 's argument */
1535                         int qualifier = spec.qualifier;
1536                         void *skip_arg;
1537                         if (qualifier == 'l')
1538                                 skip_arg = va_arg(args, long *);
1539                         else if (TOLOWER(qualifier) == 'z')
1540                                 skip_arg = va_arg(args, size_t *);
1541                         else
1542                                 skip_arg = va_arg(args, int *);
1543                         break;
1544                 }
1545
1546                 default:
1547                         switch (spec.type) {
1548
1549                         case FORMAT_TYPE_LONG_LONG:
1550                                 save_arg(long long);
1551                                 break;
1552                         case FORMAT_TYPE_ULONG:
1553                         case FORMAT_TYPE_LONG:
1554                                 save_arg(unsigned long);
1555                                 break;
1556                         case FORMAT_TYPE_SIZE_T:
1557                                 save_arg(size_t);
1558                                 break;
1559                         case FORMAT_TYPE_PTRDIFF:
1560                                 save_arg(ptrdiff_t);
1561                                 break;
1562                         case FORMAT_TYPE_UBYTE:
1563                         case FORMAT_TYPE_BYTE:
1564                                 save_arg(char);
1565                                 break;
1566                         case FORMAT_TYPE_USHORT:
1567                         case FORMAT_TYPE_SHORT:
1568                                 save_arg(short);
1569                                 break;
1570                         default:
1571                                 save_arg(int);
1572                         }
1573                 }
1574         }
1575
1576         return (u32 *)(PTR_ALIGN(str, sizeof(u32))) - bin_buf;
1577 #undef save_arg
1578 }
1579 EXPORT_SYMBOL_GPL(vbin_printf);
1580
1581 /**
1582  * bstr_printf - Format a string from binary arguments and place it in a buffer
1583  * @buf: The buffer to place the result into
1584  * @size: The size of the buffer, including the trailing null space
1585  * @fmt: The format string to use
1586  * @bin_buf: Binary arguments for the format string
1587  *
1588  * This function like C99 vsnprintf, but the difference is that vsnprintf gets
1589  * arguments from stack, and bstr_printf gets arguments from @bin_buf which is
1590  * a binary buffer that generated by vbin_printf.
1591  *
1592  * The format follows C99 vsnprintf, but has some extensions:
1593  *  see vsnprintf comment for details.
1594  *
1595  * The return value is the number of characters which would
1596  * be generated for the given input, excluding the trailing
1597  * '\0', as per ISO C99. If you want to have the exact
1598  * number of characters written into @buf as return value
1599  * (not including the trailing '\0'), use vscnprintf(). If the
1600  * return is greater than or equal to @size, the resulting
1601  * string is truncated.
1602  */
1603 int bstr_printf(char *buf, size_t size, const char *fmt, const u32 *bin_buf)
1604 {
1605         struct printf_spec spec = {0};
1606         char *str, *end;
1607         const char *args = (const char *)bin_buf;
1608
1609         if (WARN_ON_ONCE((int) size < 0))
1610                 return 0;
1611
1612         str = buf;
1613         end = buf + size;
1614
1615 #define get_arg(type)                                                   \
1616 ({                                                                      \
1617         typeof(type) value;                                             \
1618         if (sizeof(type) == 8) {                                        \
1619                 args = PTR_ALIGN(args, sizeof(u32));                    \
1620                 *(u32 *)&value = *(u32 *)args;                          \
1621                 *((u32 *)&value + 1) = *(u32 *)(args + 4);              \
1622         } else {                                                        \
1623                 args = PTR_ALIGN(args, sizeof(type));                   \
1624                 value = *(typeof(type) *)args;                          \
1625         }                                                               \
1626         args += sizeof(type);                                           \
1627         value;                                                          \
1628 })
1629
1630         /* Make sure end is always >= buf */
1631         if (end < buf) {
1632                 end = ((void *)-1);
1633                 size = end - buf;
1634         }
1635
1636         while (*fmt) {
1637                 const char *old_fmt = fmt;
1638                 int read = format_decode(fmt, &spec);
1639
1640                 fmt += read;
1641
1642                 switch (spec.type) {
1643                 case FORMAT_TYPE_NONE: {
1644                         int copy = read;
1645                         if (str < end) {
1646                                 if (copy > end - str)
1647                                         copy = end - str;
1648                                 memcpy(str, old_fmt, copy);
1649                         }
1650                         str += read;
1651                         break;
1652                 }
1653
1654                 case FORMAT_TYPE_WIDTH:
1655                         spec.field_width = get_arg(int);
1656                         break;
1657
1658                 case FORMAT_TYPE_PRECISION:
1659                         spec.precision = get_arg(int);
1660                         break;
1661
1662                 case FORMAT_TYPE_CHAR: {
1663                         char c;
1664
1665                         if (!(spec.flags & LEFT)) {
1666                                 while (--spec.field_width > 0) {
1667                                         if (str < end)
1668                                                 *str = ' ';
1669                                         ++str;
1670                                 }
1671                         }
1672                         c = (unsigned char) get_arg(char);
1673                         if (str < end)
1674                                 *str = c;
1675                         ++str;
1676                         while (--spec.field_width > 0) {
1677                                 if (str < end)
1678                                         *str = ' ';
1679                                 ++str;
1680                         }
1681                         break;
1682                 }
1683
1684                 case FORMAT_TYPE_STR: {
1685                         const char *str_arg = args;
1686                         args += strlen(str_arg) + 1;
1687                         str = string(str, end, (char *)str_arg, spec);
1688                         break;
1689                 }
1690
1691                 case FORMAT_TYPE_PTR:
1692                         str = pointer(fmt+1, str, end, get_arg(void *), spec);
1693                         while (isalnum(*fmt))
1694                                 fmt++;
1695                         break;
1696
1697                 case FORMAT_TYPE_PERCENT_CHAR:
1698                 case FORMAT_TYPE_INVALID:
1699                         if (str < end)
1700                                 *str = '%';
1701                         ++str;
1702                         break;
1703
1704                 case FORMAT_TYPE_NRCHARS:
1705                         /* skip */
1706                         break;
1707
1708                 default: {
1709                         unsigned long long num;
1710
1711                         switch (spec.type) {
1712
1713                         case FORMAT_TYPE_LONG_LONG:
1714                                 num = get_arg(long long);
1715                                 break;
1716                         case FORMAT_TYPE_ULONG:
1717                         case FORMAT_TYPE_LONG:
1718                                 num = get_arg(unsigned long);
1719                                 break;
1720                         case FORMAT_TYPE_SIZE_T:
1721                                 num = get_arg(size_t);
1722                                 break;
1723                         case FORMAT_TYPE_PTRDIFF:
1724                                 num = get_arg(ptrdiff_t);
1725                                 break;
1726                         case FORMAT_TYPE_UBYTE:
1727                                 num = get_arg(unsigned char);
1728                                 break;
1729                         case FORMAT_TYPE_BYTE:
1730                                 num = get_arg(signed char);
1731                                 break;
1732                         case FORMAT_TYPE_USHORT:
1733                                 num = get_arg(unsigned short);
1734                                 break;
1735                         case FORMAT_TYPE_SHORT:
1736                                 num = get_arg(short);
1737                                 break;
1738                         case FORMAT_TYPE_UINT:
1739                                 num = get_arg(unsigned int);
1740                                 break;
1741                         default:
1742                                 num = get_arg(int);
1743                         }
1744
1745                         str = number(str, end, num, spec);
1746                 } /* default: */
1747                 } /* switch(spec.type) */
1748         } /* while(*fmt) */
1749
1750         if (size > 0) {
1751                 if (str < end)
1752                         *str = '\0';
1753                 else
1754                         end[-1] = '\0';
1755         }
1756
1757 #undef get_arg
1758
1759         /* the trailing null byte doesn't count towards the total */
1760         return str - buf;
1761 }
1762 EXPORT_SYMBOL_GPL(bstr_printf);
1763
1764 /**
1765  * bprintf - Parse a format string and place args' binary value in a buffer
1766  * @bin_buf: The buffer to place args' binary value
1767  * @size: The size of the buffer(by words(32bits), not characters)
1768  * @fmt: The format string to use
1769  * @...: Arguments for the format string
1770  *
1771  * The function returns the number of words(u32) written
1772  * into @bin_buf.
1773  */
1774 int bprintf(u32 *bin_buf, size_t size, const char *fmt, ...)
1775 {
1776         va_list args;
1777         int ret;
1778
1779         va_start(args, fmt);
1780         ret = vbin_printf(bin_buf, size, fmt, args);
1781         va_end(args);
1782
1783         return ret;
1784 }
1785 EXPORT_SYMBOL_GPL(bprintf);
1786
1787 #endif /* CONFIG_BINARY_PRINTF */
1788
1789 /**
1790  * vsscanf - Unformat a buffer into a list of arguments
1791  * @buf:        input buffer
1792  * @fmt:        format of buffer
1793  * @args:       arguments
1794  */
1795 int vsscanf(const char *buf, const char *fmt, va_list args)
1796 {
1797         const char *str = buf;
1798         char *next;
1799         char digit;
1800         int num = 0;
1801         int qualifier, base, field_width;
1802         bool is_sign;
1803
1804         while (*fmt && *str) {
1805                 /* skip any white space in format */
1806                 /* white space in format matchs any amount of
1807                  * white space, including none, in the input.
1808                  */
1809                 if (isspace(*fmt)) {
1810                         while (isspace(*fmt))
1811                                 ++fmt;
1812                         while (isspace(*str))
1813                                 ++str;
1814                 }
1815
1816                 /* anything that is not a conversion must match exactly */
1817                 if (*fmt != '%' && *fmt) {
1818                         if (*fmt++ != *str++)
1819                                 break;
1820                         continue;
1821                 }
1822
1823                 if (!*fmt)
1824                         break;
1825                 ++fmt;
1826
1827                 /* skip this conversion.
1828                  * advance both strings to next white space
1829                  */
1830                 if (*fmt == '*') {
1831                         while (!isspace(*fmt) && *fmt != '%' && *fmt)
1832                                 fmt++;
1833                         while (!isspace(*str) && *str)
1834                                 str++;
1835                         continue;
1836                 }
1837
1838                 /* get field width */
1839                 field_width = -1;
1840                 if (isdigit(*fmt))
1841                         field_width = skip_atoi(&fmt);
1842
1843                 /* get conversion qualifier */
1844                 qualifier = -1;
1845                 if (*fmt == 'h' || TOLOWER(*fmt) == 'l' ||
1846                     TOLOWER(*fmt) == 'z') {
1847                         qualifier = *fmt++;
1848                         if (unlikely(qualifier == *fmt)) {
1849                                 if (qualifier == 'h') {
1850                                         qualifier = 'H';
1851                                         fmt++;
1852                                 } else if (qualifier == 'l') {
1853                                         qualifier = 'L';
1854                                         fmt++;
1855                                 }
1856                         }
1857                 }
1858
1859                 if (!*fmt || !*str)
1860                         break;
1861
1862                 base = 10;
1863                 is_sign = 0;
1864
1865                 switch (*fmt++) {
1866                 case 'c':
1867                 {
1868                         char *s = (char *)va_arg(args, char*);
1869                         if (field_width == -1)
1870                                 field_width = 1;
1871                         do {
1872                                 *s++ = *str++;
1873                         } while (--field_width > 0 && *str);
1874                         num++;
1875                 }
1876                 continue;
1877                 case 's':
1878                 {
1879                         char *s = (char *)va_arg(args, char *);
1880                         if (field_width == -1)
1881                                 field_width = INT_MAX;
1882                         /* first, skip leading white space in buffer */
1883                         while (isspace(*str))
1884                                 str++;
1885
1886                         /* now copy until next white space */
1887                         while (*str && !isspace(*str) && field_width--)
1888                                 *s++ = *str++;
1889                         *s = '\0';
1890                         num++;
1891                 }
1892                 continue;
1893                 case 'n':
1894                         /* return number of characters read so far */
1895                 {
1896                         int *i = (int *)va_arg(args, int*);
1897                         *i = str - buf;
1898                 }
1899                 continue;
1900                 case 'o':
1901                         base = 8;
1902                         break;
1903                 case 'x':
1904                 case 'X':
1905                         base = 16;
1906                         break;
1907                 case 'i':
1908                         base = 0;
1909                 case 'd':
1910                         is_sign = 1;
1911                 case 'u':
1912                         break;
1913                 case '%':
1914                         /* looking for '%' in str */
1915                         if (*str++ != '%')
1916                                 return num;
1917                         continue;
1918                 default:
1919                         /* invalid format; stop here */
1920                         return num;
1921                 }
1922
1923                 /* have some sort of integer conversion.
1924                  * first, skip white space in buffer.
1925                  */
1926                 while (isspace(*str))
1927                         str++;
1928
1929                 digit = *str;
1930                 if (is_sign && digit == '-')
1931                         digit = *(str + 1);
1932
1933                 if (!digit
1934                     || (base == 16 && !isxdigit(digit))
1935                     || (base == 10 && !isdigit(digit))
1936                     || (base == 8 && (!isdigit(digit) || digit > '7'))
1937                     || (base == 0 && !isdigit(digit)))
1938                         break;
1939
1940                 switch (qualifier) {
1941                 case 'H':       /* that's 'hh' in format */
1942                         if (is_sign) {
1943                                 signed char *s = (signed char *)va_arg(args, signed char *);
1944                                 *s = (signed char)simple_strtol(str, &next, base);
1945                         } else {
1946                                 unsigned char *s = (unsigned char *)va_arg(args, unsigned char *);
1947                                 *s = (unsigned char)simple_strtoul(str, &next, base);
1948                         }
1949                         break;
1950                 case 'h':
1951                         if (is_sign) {
1952                                 short *s = (short *)va_arg(args, short *);
1953                                 *s = (short)simple_strtol(str, &next, base);
1954                         } else {
1955                                 unsigned short *s = (unsigned short *)va_arg(args, unsigned short *);
1956                                 *s = (unsigned short)simple_strtoul(str, &next, base);
1957                         }
1958                         break;
1959                 case 'l':
1960                         if (is_sign) {
1961                                 long *l = (long *)va_arg(args, long *);
1962                                 *l = simple_strtol(str, &next, base);
1963                         } else {
1964                                 unsigned long *l = (unsigned long *)va_arg(args, unsigned long *);
1965                                 *l = simple_strtoul(str, &next, base);
1966                         }
1967                         break;
1968                 case 'L':
1969                         if (is_sign) {
1970                                 long long *l = (long long *)va_arg(args, long long *);
1971                                 *l = simple_strtoll(str, &next, base);
1972                         } else {
1973                                 unsigned long long *l = (unsigned long long *)va_arg(args, unsigned long long *);
1974                                 *l = simple_strtoull(str, &next, base);
1975                         }
1976                         break;
1977                 case 'Z':
1978                 case 'z':
1979                 {
1980                         size_t *s = (size_t *)va_arg(args, size_t *);
1981                         *s = (size_t)simple_strtoul(str, &next, base);
1982                 }
1983                 break;
1984                 default:
1985                         if (is_sign) {
1986                                 int *i = (int *)va_arg(args, int *);
1987                                 *i = (int)simple_strtol(str, &next, base);
1988                         } else {
1989                                 unsigned int *i = (unsigned int *)va_arg(args, unsigned int*);
1990                                 *i = (unsigned int)simple_strtoul(str, &next, base);
1991                         }
1992                         break;
1993                 }
1994                 num++;
1995
1996                 if (!next)
1997                         break;
1998                 str = next;
1999         }
2000
2001         /*
2002          * Now we've come all the way through so either the input string or the
2003          * format ended. In the former case, there can be a %n at the current
2004          * position in the format that needs to be filled.
2005          */
2006         if (*fmt == '%' && *(fmt + 1) == 'n') {
2007                 int *p = (int *)va_arg(args, int *);
2008                 *p = str - buf;
2009         }
2010
2011         return num;
2012 }
2013 EXPORT_SYMBOL(vsscanf);
2014
2015 /**
2016  * sscanf - Unformat a buffer into a list of arguments
2017  * @buf:        input buffer
2018  * @fmt:        formatting of buffer
2019  * @...:        resulting arguments
2020  */
2021 int sscanf(const char *buf, const char *fmt, ...)
2022 {
2023         va_list args;
2024         int i;
2025
2026         va_start(args, fmt);
2027         i = vsscanf(buf, fmt, args);
2028         va_end(args);
2029
2030         return i;
2031 }
2032 EXPORT_SYMBOL(sscanf);