libsys: 64-bit numbers support for printf()

Change some drivers accordingly.
This commit is contained in:
David van Moolenbroek
2012-07-24 16:14:48 +00:00
parent 86344bb535
commit 8caec1b57b
6 changed files with 31 additions and 36 deletions

View File

@@ -20,16 +20,16 @@ int vprintf(const char *fmt, va_list argp)
{
int c, charcount = 0;
enum { LEFT, RIGHT } adjust;
enum { LONG, INT } intsize;
enum { LLONG, LONG, INT } intsize;
int fill;
int width, max, len, base;
static char X2C_tab[]= "0123456789ABCDEF";
static char x2c_tab[]= "0123456789abcdef";
char *x2c;
char *p;
long i;
unsigned long u;
char temp[8 * sizeof(long) / 3 + 2];
long long i;
unsigned long long u;
char temp[8 * sizeof(long long) / 3 + 2];
while ((c= *fmt++) != 0) {
if (c != '%') {
@@ -93,13 +93,21 @@ int vprintf(const char *fmt, va_list argp)
intsize= LONG;
c= *fmt++;
}
if (c == 'l' || c == 'L') {
/* "Long long" key, e.g. %lld. */
intsize= LLONG;
c= *fmt++;
}
if (c == 0) break;
switch (c) {
/* Decimal. */
case 'd':
i= intsize == LONG ? va_arg(argp, long)
: va_arg(argp, int);
switch (intsize) {
case LLONG: i= va_arg(argp, long long); break;
case LONG: i= va_arg(argp, long); break;
case INT: i= va_arg(argp, int); break;
}
u= i < 0 ? -i : i;
goto int2ascii;
@@ -110,7 +118,8 @@ int vprintf(const char *fmt, va_list argp)
/* Pointer, interpret as %X or %lX. */
case 'p':
if (sizeof(char *) > sizeof(int)) intsize= LONG;
if (sizeof(char *) > sizeof(long)) intsize= LLONG;
else if (sizeof(char *) > sizeof(int)) intsize= LONG;
/* Hexadecimal. %X prints upper case A-F, not %lx. */
case 'X':
@@ -122,8 +131,11 @@ int vprintf(const char *fmt, va_list argp)
/* Unsigned decimal. */
case 'u':
getint:
u= intsize == LONG ? va_arg(argp, unsigned long)
: va_arg(argp, unsigned int);
switch (intsize) {
case LLONG: u= va_arg(argp, unsigned long long); break;
case LONG: u= va_arg(argp, unsigned long); break;
case INT: u= va_arg(argp, unsigned int); break;
}
int2ascii:
p= temp + sizeof(temp)-1;
*p= 0;