summaryrefslogtreecommitdiff
path: root/debian/patches/upstreamme0002-kern-make-printf-handle-long-long-integers.patch
blob: 76fa0eb5b3f0d93c3f0be41de111c83b2aafb5a4 (plain)
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