1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
From 81a3958304581ade78069d850261e74a9a58a014 Mon Sep 17 00:00:00 2001
From: Justus Winter <4winter@informatik.uni-hamburg.de>
Date: Sat, 4 Jul 2015 11:59:48 +0200
Subject: [PATCH gnumach 2/5] 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.
---
Makefile.am | 2 +-
kern/printf.c | 28 +++++++++++++++++++++-------
kern/printf.h | 2 +-
3 files changed, 23 insertions(+), 9 deletions(-)
diff --git a/Makefile.am b/Makefile.am
index 913db55..76a192b 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -159,7 +159,7 @@ noinst_PROGRAMS += \
clib_routines := memcmp memcpy memmove \
strchr strstr strsep strtok \
htonl htons ntohl ntohs \
- udivdi3 __udivdi3 \
+ udivdi3 __udivdi3 __umoddi3 \
__rel_iplt_start __rel_iplt_end \
__ffsdi2 \
_START _start etext _edata end _end # actually ld magic, not libc.
diff --git a/kern/printf.c b/kern/printf.c
index 1db0d08..e060b9d 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 = 0;
int plus_sign;
int sign_char;
boolean_t altfmt, truncate;
@@ -276,6 +277,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 = 1;
+ }
truncate = FALSE;
@@ -287,7 +292,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 +439,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 +454,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:
diff --git a/kern/printf.h b/kern/printf.h
index 86857d3..76047f0 100644
--- a/kern/printf.h
+++ b/kern/printf.h
@@ -35,7 +35,7 @@ extern void _doprnt (const char *fmt,
int radix,
vm_offset_t putc_arg);
-extern void printnum (unsigned long u, int base,
+extern void printnum (unsigned long long u, int base,
void (*putc)(char, vm_offset_t),
vm_offset_t putc_arg);
--
2.1.4
|