^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (C) Paul Mackerras 1997.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <stdarg.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <stddef.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) size_t strnlen(const char * s, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) const char *sc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) for (sc = s; count-- && *sc != '\0'; ++sc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) /* nothing */;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) return sc - s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) # define do_div(n, base) ({ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) unsigned int __base = (base); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) unsigned int __rem; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) __rem = ((unsigned long long)(n)) % __base; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) (n) = ((unsigned long long)(n)) / __base; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) __rem; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) })
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) static int skip_atoi(const char **s)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) int i, c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) for (i = 0; '0' <= (c = **s) && c <= '9'; ++*s)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) i = i*10 + c - '0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) return i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define ZEROPAD 1 /* pad with zero */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define SIGN 2 /* unsigned/signed long */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define PLUS 4 /* show plus */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define SPACE 8 /* space if plus */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define LEFT 16 /* left justified */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define SPECIAL 32 /* 0x */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define LARGE 64 /* use 'ABCDEF' instead of 'abcdef' */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) static char * number(char * str, unsigned long long num, int base, int size, int precision, int type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) char c,sign,tmp[66];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) const char *digits="0123456789abcdefghijklmnopqrstuvwxyz";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) if (type & LARGE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) if (type & LEFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) type &= ~ZEROPAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) if (base < 2 || base > 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) c = (type & ZEROPAD) ? '0' : ' ';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) sign = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) if (type & SIGN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) if ((signed long long)num < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) sign = '-';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) num = - (signed long long)num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) size--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) } else if (type & PLUS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) sign = '+';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) size--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) } else if (type & SPACE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) sign = ' ';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) size--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) if (type & SPECIAL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) if (base == 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) size -= 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) else if (base == 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) size--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) if (num == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) tmp[i++]='0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) else while (num != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) tmp[i++] = digits[do_div(num, base)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) if (i > precision)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) precision = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) size -= precision;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) if (!(type&(ZEROPAD+LEFT)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) while(size-->0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) *str++ = ' ';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) if (sign)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) *str++ = sign;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) if (type & SPECIAL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) if (base==8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) *str++ = '0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) else if (base==16) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) *str++ = '0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) *str++ = digits[33];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) if (!(type & LEFT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) while (size-- > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) *str++ = c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) while (i < precision--)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) *str++ = '0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) while (i-- > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) *str++ = tmp[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) while (size-- > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) *str++ = ' ';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) return str;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) int vsprintf(char *buf, const char *fmt, va_list args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) int len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) unsigned long long num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) int i, base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) char * str;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) const char *s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) int flags; /* flags to number() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) int field_width; /* width of output field */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) int precision; /* min. # of digits for integers; max
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) number of chars for from string */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) int qualifier; /* 'h', 'l', or 'L' for integer fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) /* 'z' support added 23/7/1999 S.H. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) /* 'z' changed to 'Z' --davidm 1/25/99 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) for (str=buf ; *fmt ; ++fmt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) if (*fmt != '%') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) *str++ = *fmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) /* process flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) repeat:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) ++fmt; /* this also skips first '%' */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) switch (*fmt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) case '-': flags |= LEFT; goto repeat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) case '+': flags |= PLUS; goto repeat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) case ' ': flags |= SPACE; goto repeat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) case '#': flags |= SPECIAL; goto repeat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) case '0': flags |= ZEROPAD; goto repeat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) /* get field width */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) field_width = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) if ('0' <= *fmt && *fmt <= '9')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) field_width = skip_atoi(&fmt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) else if (*fmt == '*') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) ++fmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) /* it's the next argument */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) field_width = va_arg(args, int);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) if (field_width < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) field_width = -field_width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) flags |= LEFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) /* get the precision */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) precision = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) if (*fmt == '.') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) ++fmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) if ('0' <= *fmt && *fmt <= '9')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) precision = skip_atoi(&fmt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) else if (*fmt == '*') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) ++fmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) /* it's the next argument */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) precision = va_arg(args, int);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) if (precision < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) precision = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) /* get the conversion qualifier */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) qualifier = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) if (*fmt == 'l' && *(fmt + 1) == 'l') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) qualifier = 'q';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) fmt += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) } else if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) || *fmt == 'Z') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) qualifier = *fmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) ++fmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) /* default base */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) base = 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) switch (*fmt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) case 'c':
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) if (!(flags & LEFT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) while (--field_width > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) *str++ = ' ';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) *str++ = (unsigned char) va_arg(args, int);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) while (--field_width > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) *str++ = ' ';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) case 's':
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) s = va_arg(args, char *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) if (!s)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) s = "<NULL>";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) len = strnlen(s, precision);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) if (!(flags & LEFT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) while (len < field_width--)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) *str++ = ' ';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) for (i = 0; i < len; ++i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) *str++ = *s++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) while (len < field_width--)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) *str++ = ' ';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) case 'p':
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) if (field_width == -1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) field_width = 2*sizeof(void *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) flags |= ZEROPAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) str = number(str,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) (unsigned long) va_arg(args, void *), 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) field_width, precision, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) case 'n':
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) if (qualifier == 'l') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) long * ip = va_arg(args, long *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) *ip = (str - buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) } else if (qualifier == 'Z') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) size_t * ip = va_arg(args, size_t *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) *ip = (str - buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) int * ip = va_arg(args, int *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) *ip = (str - buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) case '%':
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) *str++ = '%';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) /* integer number formats - set up the flags and "break" */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) case 'o':
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) base = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) case 'X':
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) flags |= LARGE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) case 'x':
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) base = 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) case 'd':
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) case 'i':
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) flags |= SIGN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) case 'u':
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) *str++ = '%';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) if (*fmt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) *str++ = *fmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) --fmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) if (qualifier == 'l') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) num = va_arg(args, unsigned long);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) if (flags & SIGN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) num = (signed long) num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) } else if (qualifier == 'q') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) num = va_arg(args, unsigned long long);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) if (flags & SIGN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) num = (signed long long) num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) } else if (qualifier == 'Z') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) num = va_arg(args, size_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) } else if (qualifier == 'h') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) num = (unsigned short) va_arg(args, int);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) if (flags & SIGN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) num = (signed short) num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) num = va_arg(args, unsigned int);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) if (flags & SIGN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) num = (signed int) num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) str = number(str, num, base, field_width, precision, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) *str = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) return str-buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) int sprintf(char * buf, const char *fmt, ...)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) va_list args;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) va_start(args, fmt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) i=vsprintf(buf,fmt,args);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) va_end(args);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) return i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) }