]> git.proxmox.com Git - mirror_edk2.git/commitdiff
StdLib: reinstate the use of va_arg() to handle long double arguments in vfscanf.
authorOlivier Martin <Olivier.Martin@arm.com>
Wed, 20 Aug 2014 21:11:26 +0000 (21:11 +0000)
committerdarylm503 <darylm503@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 20 Aug 2014 21:11:26 +0000 (21:11 +0000)
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

StdLib/LibC/Stdio/vfscanf.c

index 4f84a39c683ae0c2f647d0869acd645e0d4e152b..9cd2c47d790e9519fb1aac7c9f4edd6d41e8ae49 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
     Implementation of scanf internals for <stdio.h>.\r
 \r
-    Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>\r
+    Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>\r
     This program and the accompanying materials are licensed and made available\r
     under the terms and conditions of the BSD License that accompanies this\r
     distribution.  The full text of the license may be found at\r
@@ -124,7 +124,8 @@ int __scanfdebug = 0;
 static int\r
 __collate_range_cmp(int c1, int c2)\r
 {\r
-  static char s1[2], s2[2];\r
+  static char s1[2] = { {0}, {0} };\r
+  static char s2[2] = { {0}, {0} };\r
 \r
   s1[0] = (char)c1;\r
   s2[0] = (char)c2;\r
@@ -156,23 +157,23 @@ __svfscanf(FILE *fp, char const *fmt0, va_list ap)
 int\r
 __svfscanf_unlocked(FILE *fp, const char *fmt0, va_list ap)\r
 {\r
-  const u_char *fmt = (const u_char *)fmt0;\r
-  int c;      /* character from format, or conversion */\r
-  size_t width;   /* field width, or 0 */\r
-  char *p;    /* points into all kinds of strings */\r
-  size_t n;   /* handy size_t */\r
-  int flags;    /* flags as defined above */\r
-  char *p0;   /* saves original value of p when necessary */\r
-  int nassigned;    /* number of fields assigned */\r
-  int nconversions; /* number of conversions */\r
-  int nread;    /* number of characters consumed from fp */\r
-  int base;   /* base argument to conversion function */\r
-  char ccltab[256]; /* character class table for %[...] */\r
-  char buf[BUF];    /* buffer for numeric and mb conversions */\r
-  wchar_t *wcp;   /* handy wide character pointer */\r
-  size_t nconv;   /* length of multibyte sequence converted */\r
-  static const mbstate_t initial = { 0 };\r
-  mbstate_t mbs;\r
+          const u_char     *fmt     = (const u_char *)fmt0;\r
+                int         c;              /* character from format, or conversion */\r
+                size_t      width;          /* field width, or 0 */\r
+                char       *p;              /* points into all kinds of strings */\r
+                size_t      n;              /* handy size_t */\r
+                int         flags;          /* flags as defined above */\r
+                char       *p0;             /* saves original value of p when necessary */\r
+                int         nassigned;      /* number of fields assigned */\r
+                int         nconversions;   /* number of conversions */\r
+                int         nread;          /* number of characters consumed from fp */\r
+                int         base;           /* base argument to conversion function */\r
+                char        ccltab[256];    /* character class table for %[...] */\r
+                char        buf[BUF];       /* buffer for numeric and mb conversions */\r
+                wchar_t    *wcp;            /* handy wide character pointer */\r
+                size_t      nconv;          /* length of multibyte sequence converted */\r
+  static const  mbstate_t   initial = { 0 };\r
+                mbstate_t   mbs;\r
 \r
   /* `basefix' is used to avoid `if' tests in the integer scanner */\r
   static const short basefix[17] =\r
@@ -843,12 +844,8 @@ literal:
         goto match_failure;\r
       if ((flags & SUPPRESS) == 0) {\r
         if (flags & LONGDBL) {\r
-          long double **mp = (long double **)ap;\r
           long double res = strtold(buf, &p);\r
-\r
-          *(*mp) = res;\r
-          ap += sizeof(long double *);\r
-/*???*/   //*va_arg(ap, long double *) = res;\r
+          *va_arg(ap, long double *) = res;\r
         } else if (flags & LONG) {\r
           double res = strtod(buf, &p);\r
           *va_arg(ap, double *) = res;\r