From c782cce310e6bb69485184d1900e14fadfb229cf Mon Sep 17 00:00:00 2001
From: Jonathan Schleifer <js@webkeks.org>
Date: Fri, 10 Jan 2014 21:06:42 +0100
Subject: [PATCH 06/10] glibc: Remove nested function.
Nested functions are a (again, broken) GNU extension which is not
supported by Clang. It has been replaced by a bunch of gotos and a
variable that works as a return address.
---
.../libroot/posix/glibc/stdio-common/printf_fp.c | 34 +++++++++++++++++-----
1 file changed, 27 insertions(+), 7 deletions(-)
diff --git a/src/system/libroot/posix/glibc/stdio-common/printf_fp.c b/src/system/libroot/posix/glibc/stdio-common/printf_fp.c
index 4c68c5e..d22c731 100644
a
|
b
|
__printf_fp (FILE *fp,
|
200 | 200 | /* Nonzero if this is output on a wide character stream. */ |
201 | 201 | int wide = info->wide; |
202 | 202 | |
203 | | auto wchar_t hack_digit (void); |
| 203 | wchar_t hack_digit_ret; |
| 204 | int hack_digit_callee; |
204 | 205 | |
205 | | wchar_t hack_digit (void) |
| 206 | while (0) |
206 | 207 | { |
207 | 208 | mp_limb_t hi; |
208 | 209 | |
| 210 | hack_digit: |
209 | 211 | if (expsign != 0 && type == 'f' && exponent-- > 0) |
210 | 212 | hi = 0; |
211 | 213 | else if (scalesize == 0) |
… |
… |
__printf_fp (FILE *fp,
|
232 | 234 | /* We're not prepared for an mpn variable with zero |
233 | 235 | limbs. */ |
234 | 236 | fracsize = 1; |
235 | | return L'0' + hi; |
| 237 | hack_digit_ret = L'0' + hi; |
| 238 | goto hack_digit_end; |
236 | 239 | } |
237 | 240 | } |
238 | 241 | |
… |
… |
__printf_fp (FILE *fp,
|
241 | 244 | frac[fracsize++] = cy; |
242 | 245 | } |
243 | 246 | |
244 | | return L'0' + hi; |
| 247 | hack_digit_ret = L'0' + hi; |
| 248 | hack_digit_end: |
| 249 | switch (hack_digit_callee) |
| 250 | { |
| 251 | case 1: goto hack_digit_callee1; |
| 252 | case 2: goto hack_digit_callee2; |
| 253 | case 3: goto hack_digit_callee3; |
| 254 | default: abort(); |
| 255 | } |
245 | 256 | } |
246 | 257 | |
247 | 258 | |
… |
… |
__printf_fp (FILE *fp,
|
885 | 896 | while (intdig_no < intdig_max) |
886 | 897 | { |
887 | 898 | ++intdig_no; |
888 | | *wcp++ = hack_digit (); |
| 899 | hack_digit_callee = 1; |
| 900 | goto hack_digit; |
| 901 | hack_digit_callee1: |
| 902 | *wcp++ = hack_digit_ret; |
889 | 903 | } |
890 | 904 | significant = 1; |
891 | 905 | if (info->alt |
… |
… |
__printf_fp (FILE *fp,
|
907 | 921 | || (fracdig_no < fracdig_max && (fracsize > 1 || frac[0] != 0))) |
908 | 922 | { |
909 | 923 | ++fracdig_no; |
910 | | *wcp = hack_digit (); |
| 924 | hack_digit_callee = 2; |
| 925 | goto hack_digit; |
| 926 | hack_digit_callee2: |
| 927 | *wcp++ = hack_digit_ret; |
911 | 928 | if (*wcp != L'0') |
912 | 929 | significant = 1; |
913 | 930 | else if (significant == 0) |
… |
… |
__printf_fp (FILE *fp,
|
920 | 937 | } |
921 | 938 | |
922 | 939 | /* Do rounding. */ |
923 | | digit = hack_digit (); |
| 940 | hack_digit_callee = 3; |
| 941 | goto hack_digit; |
| 942 | hack_digit_callee3: |
| 943 | digit = hack_digit_ret; |
924 | 944 | if (digit > L'4') |
925 | 945 | { |
926 | 946 | wchar_t *wtp = wcp; |