vsprintf: reduce code size by avoiding extra check
[linux-2.6.git] / 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         case 's':
896                 /* Fallthrough */
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, c;
1160         int read;
1161         struct printf_spec spec = {0};
1162
1163         /* Reject out-of-range values early.  Large positive sizes are
1164            used for unknown buffer sizes. */
1165         if (WARN_ON_ONCE((int) size < 0))
1166                 return 0;
1167
1168         str = buf;
1169         end = buf + size;
1170
1171         /* Make sure end is always >= buf */
1172         if (end < buf) {
1173                 end = ((void *)-1);
1174                 size = end - buf;
1175         }
1176
1177         while (*fmt) {
1178                 const char *old_fmt = fmt;
1179
1180                 read = format_decode(fmt, &spec);
1181
1182                 fmt += read;
1183
1184                 switch (spec.type) {
1185                 case FORMAT_TYPE_NONE: {
1186                         int copy = read;
1187                         if (str < end) {
1188                                 if (copy > end - str)
1189                                         copy = end - str;
1190                                 memcpy(str, old_fmt, copy);
1191                         }
1192                         str += read;
1193                         break;
1194                 }
1195
1196                 case FORMAT_TYPE_WIDTH:
1197                         spec.field_width = va_arg(args, int);
1198                         break;
1199
1200                 case FORMAT_TYPE_PRECISION:
1201                         spec.precision = va_arg(args, int);
1202                         break;
1203
1204                 case FORMAT_TYPE_CHAR:
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                 case FORMAT_TYPE_STR:
1225                         str = string(str, end, va_arg(args, char *), spec);
1226                         break;
1227
1228                 case FORMAT_TYPE_PTR:
1229                         str = pointer(fmt+1, str, end, va_arg(args, void *),
1230                                       spec);
1231                         while (isalnum(*fmt))
1232                                 fmt++;
1233                         break;
1234
1235                 case FORMAT_TYPE_PERCENT_CHAR:
1236                         if (str < end)
1237                                 *str = '%';
1238                         ++str;
1239                         break;
1240
1241                 case FORMAT_TYPE_INVALID:
1242                         if (str < end)
1243                                 *str = '%';
1244                         ++str;
1245                         break;
1246
1247                 case FORMAT_TYPE_NRCHARS: {
1248                         int qualifier = spec.qualifier;
1249
1250                         if (qualifier == 'l') {
1251                                 long *ip = va_arg(args, long *);
1252                                 *ip = (str - buf);
1253                         } else if (TOLOWER(qualifier) == 'z') {
1254                                 size_t *ip = va_arg(args, size_t *);
1255                                 *ip = (str - buf);
1256                         } else {
1257                                 int *ip = va_arg(args, int *);
1258                                 *ip = (str - buf);
1259                         }
1260                         break;
1261                 }
1262
1263                 default:
1264                         switch (spec.type) {
1265                         case FORMAT_TYPE_LONG_LONG:
1266                                 num = va_arg(args, long long);
1267                                 break;
1268                         case FORMAT_TYPE_ULONG:
1269                                 num = va_arg(args, unsigned long);
1270                                 break;
1271                         case FORMAT_TYPE_LONG:
1272                                 num = va_arg(args, long);
1273                                 break;
1274                         case FORMAT_TYPE_SIZE_T:
1275                                 num = va_arg(args, size_t);
1276                                 break;
1277                         case FORMAT_TYPE_PTRDIFF:
1278                                 num = va_arg(args, ptrdiff_t);
1279                                 break;
1280                         case FORMAT_TYPE_UBYTE:
1281                                 num = (unsigned char) va_arg(args, int);
1282                                 break;
1283                         case FORMAT_TYPE_BYTE:
1284                                 num = (signed char) va_arg(args, int);
1285                                 break;
1286                         case FORMAT_TYPE_USHORT:
1287                                 num = (unsigned short) va_arg(args, int);
1288                                 break;
1289                         case FORMAT_TYPE_SHORT:
1290                                 num = (short) va_arg(args, int);
1291                                 break;
1292                         case FORMAT_TYPE_INT:
1293                                 num = (int) va_arg(args, int);
1294                                 break;
1295                         default:
1296                                 num = va_arg(args, unsigned int);
1297                         }
1298
1299                         str = number(str, end, num, spec);
1300                 }
1301         }
1302
1303         if (size > 0) {
1304                 if (str < end)
1305                         *str = '\0';
1306                 else
1307                         end[-1] = '\0';
1308         }
1309
1310         /* the trailing null byte doesn't count towards the total */
1311         return str-buf;
1312
1313 }
1314 EXPORT_SYMBOL(vsnprintf);
1315
1316 /**
1317  * vscnprintf - Format a string and place it in a buffer
1318  * @buf: The buffer to place the result into
1319  * @size: The size of the buffer, including the trailing null space
1320  * @fmt: The format string to use
1321  * @args: Arguments for the format string
1322  *
1323  * The return value is the number of characters which have been written into
1324  * the @buf not including the trailing '\0'. If @size is <= 0 the function
1325  * returns 0.
1326  *
1327  * Call this function if you are already dealing with a va_list.
1328  * You probably want scnprintf() instead.
1329  *
1330  * See the vsnprintf() documentation for format string extensions over C99.
1331  */
1332 int vscnprintf(char *buf, size_t size, const char *fmt, va_list args)
1333 {
1334         int i;
1335
1336         i = vsnprintf(buf, size, fmt, args);
1337
1338         return (i >= size) ? (size - 1) : i;
1339 }
1340 EXPORT_SYMBOL(vscnprintf);
1341
1342 /**
1343  * snprintf - Format a string and place it in a buffer
1344  * @buf: The buffer to place the result into
1345  * @size: The size of the buffer, including the trailing null space
1346  * @fmt: The format string to use
1347  * @...: Arguments for the format string
1348  *
1349  * The return value is the number of characters which would be
1350  * generated for the given input, excluding the trailing null,
1351  * as per ISO C99.  If the return is greater than or equal to
1352  * @size, the resulting string is truncated.
1353  *
1354  * See the vsnprintf() documentation for format string extensions over C99.
1355  */
1356 int snprintf(char *buf, size_t size, const char *fmt, ...)
1357 {
1358         va_list args;
1359         int i;
1360
1361         va_start(args, fmt);
1362         i = vsnprintf(buf, size, fmt, args);
1363         va_end(args);
1364
1365         return i;
1366 }
1367 EXPORT_SYMBOL(snprintf);
1368
1369 /**
1370  * scnprintf - Format a string and place it in a buffer
1371  * @buf: The buffer to place the result into
1372  * @size: The size of the buffer, including the trailing null space
1373  * @fmt: The format string to use
1374  * @...: Arguments for the format string
1375  *
1376  * The return value is the number of characters written into @buf not including
1377  * the trailing '\0'. If @size is <= 0 the function returns 0.
1378  */
1379
1380 int scnprintf(char *buf, size_t size, const char *fmt, ...)
1381 {
1382         va_list args;
1383         int i;
1384
1385         va_start(args, fmt);
1386         i = vsnprintf(buf, size, fmt, args);
1387         va_end(args);
1388
1389         return (i >= size) ? (size - 1) : i;
1390 }
1391 EXPORT_SYMBOL(scnprintf);
1392
1393 /**
1394  * vsprintf - Format a string and place it in a buffer
1395  * @buf: The buffer to place the result into
1396  * @fmt: The format string to use
1397  * @args: Arguments for the format string
1398  *
1399  * The function returns the number of characters written
1400  * into @buf. Use vsnprintf() or vscnprintf() in order to avoid
1401  * buffer overflows.
1402  *
1403  * Call this function if you are already dealing with a va_list.
1404  * You probably want sprintf() instead.
1405  *
1406  * See the vsnprintf() documentation for format string extensions over C99.
1407  */
1408 int vsprintf(char *buf, const char *fmt, va_list args)
1409 {
1410         return vsnprintf(buf, INT_MAX, fmt, args);
1411 }
1412 EXPORT_SYMBOL(vsprintf);
1413
1414 /**
1415  * sprintf - Format a string and place it in a buffer
1416  * @buf: The buffer to place the result into
1417  * @fmt: The format string to use
1418  * @...: Arguments for the format string
1419  *
1420  * The function returns the number of characters written
1421  * into @buf. Use snprintf() or scnprintf() in order to avoid
1422  * buffer overflows.
1423  *
1424  * See the vsnprintf() documentation for format string extensions over C99.
1425  */
1426 int sprintf(char *buf, const char *fmt, ...)
1427 {
1428         va_list args;
1429         int i;
1430
1431         va_start(args, fmt);
1432         i = vsnprintf(buf, INT_MAX, fmt, args);
1433         va_end(args);
1434
1435         return i;
1436 }
1437 EXPORT_SYMBOL(sprintf);
1438
1439 #ifdef CONFIG_BINARY_PRINTF
1440 /*
1441  * bprintf service:
1442  * vbin_printf() - VA arguments to binary data
1443  * bstr_printf() - Binary data to text string
1444  */
1445
1446 /**
1447  * vbin_printf - Parse a format string and place args' binary value in a buffer
1448  * @bin_buf: The buffer to place args' binary value
1449  * @size: The size of the buffer(by words(32bits), not characters)
1450  * @fmt: The format string to use
1451  * @args: Arguments for the format string
1452  *
1453  * The format follows C99 vsnprintf, except %n is ignored, and its argument
1454  * is skiped.
1455  *
1456  * The return value is the number of words(32bits) which would be generated for
1457  * the given input.
1458  *
1459  * NOTE:
1460  * If the return value is greater than @size, the resulting bin_buf is NOT
1461  * valid for bstr_printf().
1462  */
1463 int vbin_printf(u32 *bin_buf, size_t size, const char *fmt, va_list args)
1464 {
1465         struct printf_spec spec = {0};
1466         char *str, *end;
1467         int read;
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                 read = format_decode(fmt, &spec);
1494
1495                 fmt += read;
1496
1497                 switch (spec.type) {
1498                 case FORMAT_TYPE_NONE:
1499                         break;
1500
1501                 case FORMAT_TYPE_WIDTH:
1502                 case FORMAT_TYPE_PRECISION:
1503                         save_arg(int);
1504                         break;
1505
1506                 case FORMAT_TYPE_CHAR:
1507                         save_arg(char);
1508                         break;
1509
1510                 case FORMAT_TYPE_STR: {
1511                         const char *save_str = va_arg(args, char *);
1512                         size_t len;
1513
1514                         if ((unsigned long)save_str > (unsigned long)-PAGE_SIZE
1515                                         || (unsigned long)save_str < PAGE_SIZE)
1516                                 save_str = "(null)";
1517                         len = strlen(save_str) + 1;
1518                         if (str + len < end)
1519                                 memcpy(str, save_str, len);
1520                         str += len;
1521                         break;
1522                 }
1523
1524                 case FORMAT_TYPE_PTR:
1525                         save_arg(void *);
1526                         /* skip all alphanumeric pointer suffixes */
1527                         while (isalnum(*fmt))
1528                                 fmt++;
1529                         break;
1530
1531                 case FORMAT_TYPE_PERCENT_CHAR:
1532                         break;
1533
1534                 case FORMAT_TYPE_INVALID:
1535                         break;
1536
1537                 case FORMAT_TYPE_NRCHARS: {
1538                         /* skip %n 's argument */
1539                         int qualifier = spec.qualifier;
1540                         void *skip_arg;
1541                         if (qualifier == 'l')
1542                                 skip_arg = va_arg(args, long *);
1543                         else if (TOLOWER(qualifier) == 'z')
1544                                 skip_arg = va_arg(args, size_t *);
1545                         else
1546                                 skip_arg = va_arg(args, int *);
1547                         break;
1548                 }
1549
1550                 default:
1551                         switch (spec.type) {
1552
1553                         case FORMAT_TYPE_LONG_LONG:
1554                                 save_arg(long long);
1555                                 break;
1556                         case FORMAT_TYPE_ULONG:
1557                         case FORMAT_TYPE_LONG:
1558                                 save_arg(unsigned long);
1559                                 break;
1560                         case FORMAT_TYPE_SIZE_T:
1561                                 save_arg(size_t);
1562                                 break;
1563                         case FORMAT_TYPE_PTRDIFF:
1564                                 save_arg(ptrdiff_t);
1565                                 break;
1566                         case FORMAT_TYPE_UBYTE:
1567                         case FORMAT_TYPE_BYTE:
1568                                 save_arg(char);
1569                                 break;
1570                         case FORMAT_TYPE_USHORT:
1571                         case FORMAT_TYPE_SHORT:
1572                                 save_arg(short);
1573                                 break;
1574                         default:
1575                                 save_arg(int);
1576                         }
1577                 }
1578         }
1579
1580         return (u32 *)(PTR_ALIGN(str, sizeof(u32))) - bin_buf;
1581 #undef save_arg
1582 }
1583 EXPORT_SYMBOL_GPL(vbin_printf);
1584
1585 /**
1586  * bstr_printf - Format a string from binary arguments and place it in a buffer
1587  * @buf: The buffer to place the result into
1588  * @size: The size of the buffer, including the trailing null space
1589  * @fmt: The format string to use
1590  * @bin_buf: Binary arguments for the format string
1591  *
1592  * This function like C99 vsnprintf, but the difference is that vsnprintf gets
1593  * arguments from stack, and bstr_printf gets arguments from @bin_buf which is
1594  * a binary buffer that generated by vbin_printf.
1595  *
1596  * The format follows C99 vsnprintf, but has some extensions:
1597  *  see vsnprintf comment for details.
1598  *
1599  * The return value is the number of characters which would
1600  * be generated for the given input, excluding the trailing
1601  * '\0', as per ISO C99. If you want to have the exact
1602  * number of characters written into @buf as return value
1603  * (not including the trailing '\0'), use vscnprintf(). If the
1604  * return is greater than or equal to @size, the resulting
1605  * string is truncated.
1606  */
1607 int bstr_printf(char *buf, size_t size, const char *fmt, const u32 *bin_buf)
1608 {
1609         unsigned long long num;
1610         char *str, *end, c;
1611         const char *args = (const char *)bin_buf;
1612         struct printf_spec spec = {0};
1613
1614         if (WARN_ON_ONCE((int) size < 0))
1615                 return 0;
1616
1617         str = buf;
1618         end = buf + size;
1619
1620 #define get_arg(type)                                                   \
1621 ({                                                                      \
1622         typeof(type) value;                                             \
1623         if (sizeof(type) == 8) {                                        \
1624                 args = PTR_ALIGN(args, sizeof(u32));                    \
1625                 *(u32 *)&value = *(u32 *)args;                          \
1626                 *((u32 *)&value + 1) = *(u32 *)(args + 4);              \
1627         } else {                                                        \
1628                 args = PTR_ALIGN(args, sizeof(type));                   \
1629                 value = *(typeof(type) *)args;                          \
1630         }                                                               \
1631         args += sizeof(type);                                           \
1632         value;                                                          \
1633 })
1634
1635         /* Make sure end is always >= buf */
1636         if (end < buf) {
1637                 end = ((void *)-1);
1638                 size = end - buf;
1639         }
1640
1641         while (*fmt) {
1642                 int read;
1643                 const char *old_fmt = fmt;
1644
1645                 read = format_decode(fmt, &spec);
1646
1647                 fmt += read;
1648
1649                 switch (spec.type) {
1650                 case FORMAT_TYPE_NONE: {
1651                         int copy = read;
1652                         if (str < end) {
1653                                 if (copy > end - str)
1654                                         copy = end - str;
1655                                 memcpy(str, old_fmt, copy);
1656                         }
1657                         str += read;
1658                         break;
1659                 }
1660
1661                 case FORMAT_TYPE_WIDTH:
1662                         spec.field_width = get_arg(int);
1663                         break;
1664
1665                 case FORMAT_TYPE_PRECISION:
1666                         spec.precision = get_arg(int);
1667                         break;
1668
1669                 case FORMAT_TYPE_CHAR:
1670                         if (!(spec.flags & LEFT)) {
1671                                 while (--spec.field_width > 0) {
1672                                         if (str < end)
1673                                                 *str = ' ';
1674                                         ++str;
1675                                 }
1676                         }
1677                         c = (unsigned char) get_arg(char);
1678                         if (str < end)
1679                                 *str = c;
1680                         ++str;
1681                         while (--spec.field_width > 0) {
1682                                 if (str < end)
1683                                         *str = ' ';
1684                                 ++str;
1685                         }
1686                         break;
1687
1688                 case FORMAT_TYPE_STR: {
1689                         const char *str_arg = args;
1690                         size_t len = strlen(str_arg);
1691                         args += len + 1;
1692                         str = string(str, end, (char *)str_arg, spec);
1693                         break;
1694                 }
1695
1696                 case FORMAT_TYPE_PTR:
1697                         str = pointer(fmt+1, str, end, get_arg(void *), spec);
1698                         while (isalnum(*fmt))
1699                                 fmt++;
1700                         break;
1701
1702                 case FORMAT_TYPE_PERCENT_CHAR:
1703                         if (str < end)
1704                                 *str = '%';
1705                         ++str;
1706                         break;
1707
1708                 case FORMAT_TYPE_INVALID:
1709                         if (str < end)
1710                                 *str = '%';
1711                         ++str;
1712                         break;
1713
1714                 case FORMAT_TYPE_NRCHARS:
1715                         /* skip */
1716                         break;
1717
1718                 default:
1719                         switch (spec.type) {
1720
1721                         case FORMAT_TYPE_LONG_LONG:
1722                                 num = get_arg(long long);
1723                                 break;
1724                         case FORMAT_TYPE_ULONG:
1725                                 num = get_arg(unsigned long);
1726                                 break;
1727                         case FORMAT_TYPE_LONG:
1728                                 num = get_arg(unsigned long);
1729                                 break;
1730                         case FORMAT_TYPE_SIZE_T:
1731                                 num = get_arg(size_t);
1732                                 break;
1733                         case FORMAT_TYPE_PTRDIFF:
1734                                 num = get_arg(ptrdiff_t);
1735                                 break;
1736                         case FORMAT_TYPE_UBYTE:
1737                                 num = get_arg(unsigned char);
1738                                 break;
1739                         case FORMAT_TYPE_BYTE:
1740                                 num = get_arg(signed char);
1741                                 break;
1742                         case FORMAT_TYPE_USHORT:
1743                                 num = get_arg(unsigned short);
1744                                 break;
1745                         case FORMAT_TYPE_SHORT:
1746                                 num = get_arg(short);
1747                                 break;
1748                         case FORMAT_TYPE_UINT:
1749                                 num = get_arg(unsigned int);
1750                                 break;
1751                         default:
1752                                 num = get_arg(int);
1753                         }
1754
1755                         str = number(str, end, num, spec);
1756                 }
1757         }
1758
1759         if (size > 0) {
1760                 if (str < end)
1761                         *str = '\0';
1762                 else
1763                         end[-1] = '\0';
1764         }
1765
1766 #undef get_arg
1767
1768         /* the trailing null byte doesn't count towards the total */
1769         return str - buf;
1770 }
1771 EXPORT_SYMBOL_GPL(bstr_printf);
1772
1773 /**
1774  * bprintf - Parse a format string and place args' binary value in a buffer
1775  * @bin_buf: The buffer to place args' binary value
1776  * @size: The size of the buffer(by words(32bits), not characters)
1777  * @fmt: The format string to use
1778  * @...: Arguments for the format string
1779  *
1780  * The function returns the number of words(u32) written
1781  * into @bin_buf.
1782  */
1783 int bprintf(u32 *bin_buf, size_t size, const char *fmt, ...)
1784 {
1785         va_list args;
1786         int ret;
1787
1788         va_start(args, fmt);
1789         ret = vbin_printf(bin_buf, size, fmt, args);
1790         va_end(args);
1791
1792         return ret;
1793 }
1794 EXPORT_SYMBOL_GPL(bprintf);
1795
1796 #endif /* CONFIG_BINARY_PRINTF */
1797
1798 /**
1799  * vsscanf - Unformat a buffer into a list of arguments
1800  * @buf:        input buffer
1801  * @fmt:        format of buffer
1802  * @args:       arguments
1803  */
1804 int vsscanf(const char *buf, const char *fmt, va_list args)
1805 {
1806         const char *str = buf;
1807         char *next;
1808         char digit;
1809         int num = 0;
1810         int qualifier, base, field_width;
1811         int is_sign = 0;
1812
1813         while (*fmt && *str) {
1814                 /* skip any white space in format */
1815                 /* white space in format matchs any amount of
1816                  * white space, including none, in the input.
1817                  */
1818                 if (isspace(*fmt)) {
1819                         while (isspace(*fmt))
1820                                 ++fmt;
1821                         while (isspace(*str))
1822                                 ++str;
1823                 }
1824
1825                 /* anything that is not a conversion must match exactly */
1826                 if (*fmt != '%' && *fmt) {
1827                         if (*fmt++ != *str++)
1828                                 break;
1829                         continue;
1830                 }
1831
1832                 if (!*fmt)
1833                         break;
1834                 ++fmt;
1835
1836                 /* skip this conversion.
1837                  * advance both strings to next white space
1838                  */
1839                 if (*fmt == '*') {
1840                         while (!isspace(*fmt) && *fmt != '%' && *fmt)
1841                                 fmt++;
1842                         while (!isspace(*str) && *str)
1843                                 str++;
1844                         continue;
1845                 }
1846
1847                 /* get field width */
1848                 field_width = -1;
1849                 if (isdigit(*fmt))
1850                         field_width = skip_atoi(&fmt);
1851
1852                 /* get conversion qualifier */
1853                 qualifier = -1;
1854                 if (*fmt == 'h' || TOLOWER(*fmt) == 'l' ||
1855                     TOLOWER(*fmt) == 'z') {
1856                         qualifier = *fmt++;
1857                         if (unlikely(qualifier == *fmt)) {
1858                                 if (qualifier == 'h') {
1859                                         qualifier = 'H';
1860                                         fmt++;
1861                                 } else if (qualifier == 'l') {
1862                                         qualifier = 'L';
1863                                         fmt++;
1864                                 }
1865                         }
1866                 }
1867                 base = 10;
1868                 is_sign = 0;
1869
1870                 if (!*fmt || !*str)
1871                         break;
1872
1873                 switch (*fmt++) {
1874                 case 'c':
1875                 {
1876                         char *s = (char *)va_arg(args, char*);
1877                         if (field_width == -1)
1878                                 field_width = 1;
1879                         do {
1880                                 *s++ = *str++;
1881                         } while (--field_width > 0 && *str);
1882                         num++;
1883                 }
1884                 continue;
1885                 case 's':
1886                 {
1887                         char *s = (char *)va_arg(args, char *);
1888                         if (field_width == -1)
1889                                 field_width = INT_MAX;
1890                         /* first, skip leading white space in buffer */
1891                         while (isspace(*str))
1892                                 str++;
1893
1894                         /* now copy until next white space */
1895                         while (*str && !isspace(*str) && field_width--)
1896                                 *s++ = *str++;
1897                         *s = '\0';
1898                         num++;
1899                 }
1900                 continue;
1901                 case 'n':
1902                         /* return number of characters read so far */
1903                 {
1904                         int *i = (int *)va_arg(args, int*);
1905                         *i = str - buf;
1906                 }
1907                 continue;
1908                 case 'o':
1909                         base = 8;
1910                         break;
1911                 case 'x':
1912                 case 'X':
1913                         base = 16;
1914                         break;
1915                 case 'i':
1916                         base = 0;
1917                 case 'd':
1918                         is_sign = 1;
1919                 case 'u':
1920                         break;
1921                 case '%':
1922                         /* looking for '%' in str */
1923                         if (*str++ != '%')
1924                                 return num;
1925                         continue;
1926                 default:
1927                         /* invalid format; stop here */
1928                         return num;
1929                 }
1930
1931                 /* have some sort of integer conversion.
1932                  * first, skip white space in buffer.
1933                  */
1934                 while (isspace(*str))
1935                         str++;
1936
1937                 digit = *str;
1938                 if (is_sign && digit == '-')
1939                         digit = *(str + 1);
1940
1941                 if (!digit
1942                     || (base == 16 && !isxdigit(digit))
1943                     || (base == 10 && !isdigit(digit))
1944                     || (base == 8 && (!isdigit(digit) || digit > '7'))
1945                     || (base == 0 && !isdigit(digit)))
1946                         break;
1947
1948                 switch (qualifier) {
1949                 case 'H':       /* that's 'hh' in format */
1950                         if (is_sign) {
1951                                 signed char *s = (signed char *)va_arg(args, signed char *);
1952                                 *s = (signed char)simple_strtol(str, &next, base);
1953                         } else {
1954                                 unsigned char *s = (unsigned char *)va_arg(args, unsigned char *);
1955                                 *s = (unsigned char)simple_strtoul(str, &next, base);
1956                         }
1957                         break;
1958                 case 'h':
1959                         if (is_sign) {
1960                                 short *s = (short *)va_arg(args, short *);
1961                                 *s = (short)simple_strtol(str, &next, base);
1962                         } else {
1963                                 unsigned short *s = (unsigned short *)va_arg(args, unsigned short *);
1964                                 *s = (unsigned short)simple_strtoul(str, &next, base);
1965                         }
1966                         break;
1967                 case 'l':
1968                         if (is_sign) {
1969                                 long *l = (long *)va_arg(args, long *);
1970                                 *l = simple_strtol(str, &next, base);
1971                         } else {
1972                                 unsigned long *l = (unsigned long *)va_arg(args, unsigned long *);
1973                                 *l = simple_strtoul(str, &next, base);
1974                         }
1975                         break;
1976                 case 'L':
1977                         if (is_sign) {
1978                                 long long *l = (long long *)va_arg(args, long long *);
1979                                 *l = simple_strtoll(str, &next, base);
1980                         } else {
1981                                 unsigned long long *l = (unsigned long long *)va_arg(args, unsigned long long *);
1982                                 *l = simple_strtoull(str, &next, base);
1983                         }
1984                         break;
1985                 case 'Z':
1986                 case 'z':
1987                 {
1988                         size_t *s = (size_t *)va_arg(args, size_t *);
1989                         *s = (size_t)simple_strtoul(str, &next, base);
1990                 }
1991                 break;
1992                 default:
1993                         if (is_sign) {
1994                                 int *i = (int *)va_arg(args, int *);
1995                                 *i = (int)simple_strtol(str, &next, base);
1996                         } else {
1997                                 unsigned int *i = (unsigned int *)va_arg(args, unsigned int*);
1998                                 *i = (unsigned int)simple_strtoul(str, &next, base);
1999                         }
2000                         break;
2001                 }
2002                 num++;
2003
2004                 if (!next)
2005                         break;
2006                 str = next;
2007         }
2008
2009         /*
2010          * Now we've come all the way through so either the input string or the
2011          * format ended. In the former case, there can be a %n at the current
2012          * position in the format that needs to be filled.
2013          */
2014         if (*fmt == '%' && *(fmt + 1) == 'n') {
2015                 int *p = (int *)va_arg(args, int *);
2016                 *p = str - buf;
2017         }
2018
2019         return num;
2020 }
2021 EXPORT_SYMBOL(vsscanf);
2022
2023 /**
2024  * sscanf - Unformat a buffer into a list of arguments
2025  * @buf:        input buffer
2026  * @fmt:        formatting of buffer
2027  * @...:        resulting arguments
2028  */
2029 int sscanf(const char *buf, const char *fmt, ...)
2030 {
2031         va_list args;
2032         int i;
2033
2034         va_start(args, fmt);
2035         i = vsscanf(buf, fmt, args);
2036         va_end(args);
2037
2038         return i;
2039 }
2040 EXPORT_SYMBOL(sscanf);