StdLib: reinstate the use of va_arg() to handle long double arguments in vfscanf.

Applies the patch, submitted by Olivier Martin, to use va_arg for long double.
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Olivier Martin <Olivier.Martin@arm.com>
Reviewed-by: Daryl McDaniel <daryl.mcdaniel@intel.com>

Also initializes an array so that strings will be properly terminated.
Includes some cosmetic changes to enhance readability.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Daryl McDaniel <daryl.mcdaniel@intel.com>
Reviewed-by: Olivier Martin <Olivier.Martin@arm.com>


git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15856 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Olivier Martin
2014-08-20 21:11:26 +00:00
committed by darylm503
parent dfa8858555
commit 9792ff7c5d

View File

@ -1,7 +1,7 @@
/** @file
Implementation of scanf internals for <stdio.h>.
Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials are licensed and made available
under the terms and conditions of the BSD License that accompanies this
distribution. The full text of the license may be found at
@ -124,7 +124,8 @@ int __scanfdebug = 0;
static int
__collate_range_cmp(int c1, int c2)
{
static char s1[2], s2[2];
static char s1[2] = { {0}, {0} };
static char s2[2] = { {0}, {0} };
s1[0] = (char)c1;
s2[0] = (char)c2;
@ -843,12 +844,8 @@ literal:
goto match_failure;
if ((flags & SUPPRESS) == 0) {
if (flags & LONGDBL) {
long double **mp = (long double **)ap;
long double res = strtold(buf, &p);
*(*mp) = res;
ap += sizeof(long double *);
/*???*/ //*va_arg(ap, long double *) = res;
*va_arg(ap, long double *) = res;
} else if (flags & LONG) {
double res = strtod(buf, &p);
*va_arg(ap, double *) = res;