12 #include "../../gfx.h"
14 #if GFX_USE_GFILE && GFILE_NEED_PRINTG
19 #define FLOAT_PRECISION 100000
21 int fnprintg(
GFILE *f,
int maxlen,
const char *fmt, ...) {
26 res = vfnprintg(f, maxlen, fmt, ap);
31 static char *ltoa_wd(
char *p,
long num,
unsigned radix,
long divisor) {
35 if (!divisor) divisor = num;
39 i = (int)(num % radix);
45 }
while ((divisor /= radix) != 0);
47 i = (int)(p + MAX_FILLER - q);
55 int vfnprintg(
GFILE *f,
int maxlen,
const char *fmt, va_list arg) {
57 char *p, *s, c, filler;
58 int i, precision, width;
59 gBool is_long, left_align;
61 #if GFILE_ALLOW_FLOATS
63 char tmpbuf[2*MAX_FILLER + 1];
65 char tmpbuf[MAX_FILLER + 1];
77 ret++;
if (!--maxlen)
return ret;
100 if (c >=
'0' && c <=
'9') {
102 width = width * 10 + c;
104 width = va_arg(arg,
int);
111 if (c >=
'0' && c <=
'9') {
113 precision = precision * 10 + c;
115 precision = va_arg(arg,
int);
121 if (c ==
'l' || c ==
'L') {
127 is_long = (c >=
'A') && (c <=
'Z');
135 *p++ = va_arg(arg,
int);
139 if ((s = va_arg(arg,
char *)) == 0)
143 for (p = s; *p && (--precision >= 0); p++);
148 l = va_arg(arg,
long);
150 l = va_arg(arg,
int);
155 p = ltoa_wd(p, l, 10, 0);
157 #if GFILE_ALLOW_FLOATS
159 fpv = (float) va_arg(arg,
double);
165 p = ltoa_wd(p, l, 10, 0);
167 l = (fpv - l) * FLOAT_PRECISION;
168 p = ltoa_wd(p, l, 10, FLOAT_PRECISION / 10);
174 goto unsigned_common;
178 goto unsigned_common;
184 l = va_arg(arg,
long);
186 l = va_arg(arg,
int);
187 p = ltoa_wd(p, l, c, 0);
195 if ((width -= i) < 0)
200 if (*s ==
'-' && filler ==
'0') {
202 ret++;
if (!--maxlen)
return ret;
207 ret++;
if (!--maxlen)
return ret;
208 }
while (++width != 0);
212 ret++;
if (!--maxlen)
return ret;
216 ret++;
if (!--maxlen)
return ret;
struct GFILE GFILE
A file pointer.
gMemSize gfileWrite(GFILE *f, const void *buf, gMemSize len)
Write to file.