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.
This commit is contained in:
Jonathan Schleifer 2014-01-10 21:06:42 +01:00 committed by Stephan Aßmus
parent 4683fcc35c
commit 38fee4c388
1 changed files with 27 additions and 7 deletions

View File

@ -200,12 +200,14 @@ __printf_fp (FILE *fp,
/* Nonzero if this is output on a wide character stream. */
int wide = info->wide;
auto wchar_t hack_digit (void);
wchar_t hack_digit_ret;
int hack_digit_callee;
wchar_t hack_digit (void)
while (0)
{
mp_limb_t hi;
hack_digit:
if (expsign != 0 && type == 'f' && exponent-- > 0)
hi = 0;
else if (scalesize == 0)
@ -232,7 +234,8 @@ __printf_fp (FILE *fp,
/* We're not prepared for an mpn variable with zero
limbs. */
fracsize = 1;
return L'0' + hi;
hack_digit_ret = L'0' + hi;
goto hack_digit_end;
}
}
@ -241,7 +244,15 @@ __printf_fp (FILE *fp,
frac[fracsize++] = cy;
}
return L'0' + hi;
hack_digit_ret = L'0' + hi;
hack_digit_end:
switch (hack_digit_callee)
{
case 1: goto hack_digit_callee1;
case 2: goto hack_digit_callee2;
case 3: goto hack_digit_callee3;
default: abort();
}
}
@ -885,7 +896,10 @@ __printf_fp (FILE *fp,
while (intdig_no < intdig_max)
{
++intdig_no;
*wcp++ = hack_digit ();
hack_digit_callee = 1;
goto hack_digit;
hack_digit_callee1:
*wcp++ = hack_digit_ret;
}
significant = 1;
if (info->alt
@ -907,7 +921,10 @@ __printf_fp (FILE *fp,
|| (fracdig_no < fracdig_max && (fracsize > 1 || frac[0] != 0)))
{
++fracdig_no;
*wcp = hack_digit ();
hack_digit_callee = 2;
goto hack_digit;
hack_digit_callee2:
*wcp++ = hack_digit_ret;
if (*wcp != L'0')
significant = 1;
else if (significant == 0)
@ -920,7 +937,10 @@ __printf_fp (FILE *fp,
}
/* Do rounding. */
digit = hack_digit ();
hack_digit_callee = 3;
goto hack_digit;
hack_digit_callee3:
digit = hack_digit_ret;
if (digit > L'4')
{
wchar_t *wtp = wcp;