8 static const char flag_chars[] = "#0- +";
10 #define FLAG_ALT (1 << 0)
11 #define FLAG_ZERO (1 << 1)
12 #define FLAG_LEFTJUSTIFY (1 << 2)
13 #define FLAG_SPACEPOSITIVE (1 << 3)
14 #define FLAG_PLUSPOSITIVE (1 << 4)
15 #define FLAG_NUMERIC (1 << 5)
16 #define FLAG_SIGNED (1 << 6)
17 #define FLAG_NEGATIVE (1 << 7)
18 #define FLAG_ALT2 (1 << 8)
19 #define FLAG_CAPS (1 << 9)
22 __vprintf_internal(char* buffer, const char* fmt, size_t max_len, va_list vargs)
24 // This sprintf just a random implementation I found it on Internet . lol.
25 // Of course, with some modifications for porting to LunaixOS :)
27 char numbuf[NUMBUFSIZ];
30 if (max_len && ptr >= max_len - 1) {
41 for (++fmt; *fmt; ++fmt) {
42 const char* flagc = strchr(flag_chars, *fmt);
44 flags |= 1 << (flagc - flag_chars);
52 if (*fmt >= '1' && *fmt <= '9') {
53 for (width = 0; *fmt >= '0' && *fmt <= '9';) {
54 width = 10 * width + *fmt++ - '0';
56 } else if (*fmt == '*') {
57 width = va_arg(vargs, int);
65 if (*fmt >= '0' && *fmt <= '9') {
66 for (precision = 0; *fmt >= '0' && *fmt <= '9';) {
67 precision = 10 * precision + *fmt++ - '0';
69 } else if (*fmt == '*') {
70 precision = va_arg(vargs, int);
78 // process main conversion character
80 unsigned long num = 0;
92 long x = length ? va_arg(vargs, long) : va_arg(vargs, int);
93 int negative = x < 0 ? FLAG_NEGATIVE : 0;
94 num = negative ? -x : x;
95 flags |= FLAG_NUMERIC | FLAG_SIGNED | negative;
100 num = length ? va_arg(vargs, unsigned long)
101 : va_arg(vargs, unsigned);
102 flags |= FLAG_NUMERIC;
106 goto format_unsigned;
109 goto format_unsigned;
111 flags = flags | FLAG_CAPS;
113 goto format_unsigned;
115 num = (uintptr_t)va_arg(vargs, void*);
117 flags |= FLAG_ALT | FLAG_ALT2 | FLAG_NUMERIC;
120 data = va_arg(vargs, char*);
124 numbuf[0] = va_arg(vargs, int);
129 numbuf[0] = (*fmt ? *fmt : '%');
137 if (flags & FLAG_NUMERIC) {
138 data = itoa(num, numbuf, base);
141 while ((flags & FLAG_CAPS) && (c = data[i])) {
142 data[i] = c & ~((c & 0x40) >> 1);
147 const char* prefix = "";
148 if ((flags & FLAG_NUMERIC) && (flags & FLAG_SIGNED)) {
149 if (flags & FLAG_NEGATIVE) {
151 } else if (flags & FLAG_PLUSPOSITIVE) {
153 } else if (flags & FLAG_SPACEPOSITIVE) {
156 } else if ((flags & FLAG_NUMERIC) && (flags & FLAG_ALT) &&
157 (base == 16 || base == -16) &&
158 (num || (flags & FLAG_ALT2))) {
163 if (precision >= 0 && !(flags & FLAG_NUMERIC)) {
164 len = strnlen(data, precision);
169 if ((flags & FLAG_NUMERIC) && precision >= 0) {
170 zeros = precision > len ? precision - len : 0;
171 } else if ((flags & FLAG_NUMERIC) && (flags & FLAG_ZERO) &&
172 !(flags & FLAG_LEFTJUSTIFY) &&
173 len + (int)strlen(prefix) < width) {
174 zeros = width - len - strlen(prefix);
178 width -= len + zeros + strlen(prefix);
179 for (; !(flags & FLAG_LEFTJUSTIFY) && width > 0; --width) {
182 for (; *prefix; ++prefix) {
183 buffer[ptr++] = *prefix;
185 for (; zeros > 0; --zeros) {
188 for (; len > 0; ++data, --len) {
189 buffer[ptr++] = *data;
191 for (; width > 0; --width) {
195 buffer[ptr++] = '\0';