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:
committed by
Stephan Aßmus
parent
4683fcc35c
commit
38fee4c388
@@ -200,12 +200,14 @@ __printf_fp (FILE *fp,
|
|||||||
/* Nonzero if this is output on a wide character stream. */
|
/* Nonzero if this is output on a wide character stream. */
|
||||||
int wide = info->wide;
|
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;
|
mp_limb_t hi;
|
||||||
|
|
||||||
|
hack_digit:
|
||||||
if (expsign != 0 && type == 'f' && exponent-- > 0)
|
if (expsign != 0 && type == 'f' && exponent-- > 0)
|
||||||
hi = 0;
|
hi = 0;
|
||||||
else if (scalesize == 0)
|
else if (scalesize == 0)
|
||||||
@@ -232,7 +234,8 @@ __printf_fp (FILE *fp,
|
|||||||
/* We're not prepared for an mpn variable with zero
|
/* We're not prepared for an mpn variable with zero
|
||||||
limbs. */
|
limbs. */
|
||||||
fracsize = 1;
|
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;
|
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)
|
while (intdig_no < intdig_max)
|
||||||
{
|
{
|
||||||
++intdig_no;
|
++intdig_no;
|
||||||
*wcp++ = hack_digit ();
|
hack_digit_callee = 1;
|
||||||
|
goto hack_digit;
|
||||||
|
hack_digit_callee1:
|
||||||
|
*wcp++ = hack_digit_ret;
|
||||||
}
|
}
|
||||||
significant = 1;
|
significant = 1;
|
||||||
if (info->alt
|
if (info->alt
|
||||||
@@ -907,7 +921,10 @@ __printf_fp (FILE *fp,
|
|||||||
|| (fracdig_no < fracdig_max && (fracsize > 1 || frac[0] != 0)))
|
|| (fracdig_no < fracdig_max && (fracsize > 1 || frac[0] != 0)))
|
||||||
{
|
{
|
||||||
++fracdig_no;
|
++fracdig_no;
|
||||||
*wcp = hack_digit ();
|
hack_digit_callee = 2;
|
||||||
|
goto hack_digit;
|
||||||
|
hack_digit_callee2:
|
||||||
|
*wcp++ = hack_digit_ret;
|
||||||
if (*wcp != L'0')
|
if (*wcp != L'0')
|
||||||
significant = 1;
|
significant = 1;
|
||||||
else if (significant == 0)
|
else if (significant == 0)
|
||||||
@@ -920,7 +937,10 @@ __printf_fp (FILE *fp,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Do rounding. */
|
/* Do rounding. */
|
||||||
digit = hack_digit ();
|
hack_digit_callee = 3;
|
||||||
|
goto hack_digit;
|
||||||
|
hack_digit_callee3:
|
||||||
|
digit = hack_digit_ret;
|
||||||
if (digit > L'4')
|
if (digit > L'4')
|
||||||
{
|
{
|
||||||
wchar_t *wtp = wcp;
|
wchar_t *wtp = wcp;
|
||||||
|
|||||||
Reference in New Issue
Block a user