diff options
author | Justus Winter <4winter@informatik.uni-hamburg.de> | 2015-07-04 11:59:48 +0200 |
---|---|---|
committer | Justus Winter <4winter@informatik.uni-hamburg.de> | 2015-07-10 22:08:18 +0200 |
commit | 78262cab3a92e09f63f5853d77db87620eac2543 (patch) | |
tree | 53f30d379e0c51aad802d738d5e1247e3c753f90 /kern/printf.c | |
parent | 923c1f275596b97e823023e7020475b9a5258d5e (diff) | |
download | gnumach-78262cab3a92e09f63f5853d77db87620eac2543.tar.gz gnumach-78262cab3a92e09f63f5853d77db87620eac2543.tar.bz2 gnumach-78262cab3a92e09f63f5853d77db87620eac2543.zip |
kern: make printf handle long long integers
* Makefile.am (clib_routines): Steal `__umoddi3'.
* kern/printf.c (MAXBUF): Increase size.
(printnum, _doprnt): Handle long long integers.
* kern/printf.h (printnum): Adjust declaration.
Diffstat (limited to 'kern/printf.c')
-rw-r--r-- | kern/printf.c | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/kern/printf.c b/kern/printf.c index 1db0d08d..13f2dc05 100644 --- a/kern/printf.c +++ b/kern/printf.c @@ -126,11 +126,11 @@ #define isdigit(d) ((d) >= '0' && (d) <= '9') #define Ctod(c) ((c) - '0') -#define MAXBUF (sizeof(long int) * 8) /* enough for binary */ +#define MAXBUF (sizeof(long long int) * 8) /* enough for binary */ void printnum( - unsigned long u, + unsigned long long u, int base, void (*putc)( char, vm_offset_t ), vm_offset_t putc_arg) @@ -178,8 +178,9 @@ void _doprnt( int prec; boolean_t ladjust; char padc; - long n; - unsigned long u; + long long n; + unsigned long long u; + int have_long_long; int plus_sign; int sign_char; boolean_t altfmt, truncate; @@ -218,6 +219,7 @@ void _doprnt( plus_sign = 0; sign_char = 0; altfmt = FALSE; + have_long_long = FALSE; while (TRUE) { c = *fmt; @@ -276,6 +278,10 @@ void _doprnt( if (c == 'l') c = *++fmt; /* need it if sizeof(int) < sizeof(long) */ + if (c == 'l') { + c = *++fmt; /* handle `long long' */ + have_long_long = TRUE; + } truncate = FALSE; @@ -287,7 +293,10 @@ void _doprnt( boolean_t any; int i; - u = va_arg(argp, unsigned long); + if (! have_long_long) + u = va_arg(argp, unsigned long); + else + u = va_arg(argp, unsigned long long); p = va_arg(argp, char *); base = *p++; printnum(u, base, putc, putc_arg); @@ -431,7 +440,10 @@ void _doprnt( goto print_unsigned; print_signed: - n = va_arg(argp, long); + if (! have_long_long) + n = va_arg(argp, long); + else + n = va_arg(argp, long long); if (n >= 0) { u = n; sign_char = plus_sign; @@ -443,7 +455,10 @@ void _doprnt( goto print_num; print_unsigned: - u = va_arg(argp, unsigned long); + if (! have_long_long) + u = va_arg(argp, unsigned long); + else + u = va_arg(argp, unsigned long long); goto print_num; print_num: |