StdLib: Fix printf issues with floating point and wide character strings. Also resolves a compilation issue with VS2010. See ISSUES.txt items 1, 11.

ISSUES.txt:  Added issue 11, updated status of issue 1.

gdtoa/gdtoaimp.h:  Fix definition of union U.

Locale/_wcstod.h:  Return 0.0 instead of 0 in the "no_convert" case.

Locale/multibyte_Utf8.c:  In wcsrtombs(), if both the destination pointer is NULL and the size, Limit, is 0; return the estimated length of the converted string up to ASCII_STRING_MAX bytes.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by:  daryl.mcdaniel@intel.com
Reviewed-by:    Aniruddha_Herekar@Dell.com


git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@14171 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
darylm503 2013-03-11 18:00:30 +00:00
parent f149129429
commit 05c7d5f615
4 changed files with 70 additions and 63 deletions

View File

@ -14,16 +14,17 @@ StdLib Issues
============= =============
Category TOOLs Reported Status Category TOOLs Reported Status
------------------------ -------- -------------- ----------- ------------------------ -------- -------------- -----------
1: Compilation Error vs2010 2012 Understood 1: Compilation Error vs2010 2012 Fixed 3/2013
stdlib\libc\gdtoa\strtod.c(825) : warning C4789: destination of memory copy is too small stdlib\libc\gdtoa\strtod.c(825) : warning C4789: destination of memory copy is too small
runtime crashes when using floating-point formats with printf
2: Compilation Error ALL 2012 Fixed 1/2012 2: Compilation Error ALL 2012 Fixed 1/2012
StdLib/LibC/Uefi/SysCalls.c: In function 'utimes': error: 'va_start' used in function with fixed args StdLib/LibC/Uefi/SysCalls.c: In function 'utimes': error: 'va_start' used in function with fixed args
3: Usage Clarification 2012 Understood/Document 3: Usage Clarification 2012 Document
Clarify that the current StdLib may not be used for developing drivers. Clarify that the current StdLib may not be used for developing drivers.
4: Execution/Compile errors 2012 Understood 4: Execution/Compile errors 2012 Fixed 1/2013
Mismatch in use of EFIAPI between declaration and definition of some functions. Mismatch in use of EFIAPI between declaration and definition of some functions.
5: Error message Quality during execution 2012 Verified 5: Error message Quality during execution 2012 Verified
@ -48,6 +49,9 @@ StdLib Issues
If the Shell does not have a current volume or directory, file operations If the Shell does not have a current volume or directory, file operations
may hang or fail. may hang or fail.
11: printf("-%ls-", L"test") will only print "--" 2013 Fixed 3/2013
PosixLib PosixLib
============= =============
Category TOOLs Reported Status Category TOOLs Reported Status

View File

@ -34,9 +34,9 @@
* function template for wcstof, wcstod, wcstold. * function template for wcstof, wcstod, wcstold.
* *
* parameters: * parameters:
* _FUNCNAME : function name * _FUNCNAME : function name
* _RETURN_TYPE : return type * _RETURN_TYPE : return type
* _STRTOD_FUNC : real conversion function * _STRTOD_FUNC : real conversion function
*/ */
#ifndef __WCSTOD_H_ #ifndef __WCSTOD_H_
#define __WCSTOD_H_ #define __WCSTOD_H_
@ -54,73 +54,73 @@
_RETURN_TYPE _RETURN_TYPE
_FUNCNAME(const wchar_t * __restrict nptr, wchar_t ** __restrict endptr) _FUNCNAME(const wchar_t * __restrict nptr, wchar_t ** __restrict endptr)
{ {
const wchar_t *src, *start; const wchar_t *src, *start;
_RETURN_TYPE val; _RETURN_TYPE val;
char *buf, *end; char *buf, *end;
size_t bufsiz, len; size_t bufsiz, len;
_DIAGASSERT(nptr != NULL); _DIAGASSERT(nptr != NULL);
/* endptr may be null */ /* endptr may be null */
src = nptr; src = nptr;
while (iswspace((wint_t)*src) != 0) while (iswspace((wint_t)*src) != 0)
++src; ++src;
if (*src == L'\0') if (*src == L'\0')
goto no_convert; goto no_convert;
/* /*
* Convert the supplied numeric wide char. string to multibyte. * Convert the supplied numeric wide char. string to multibyte.
* *
* We could attempt to find the end of the numeric portion of the * We could attempt to find the end of the numeric portion of the
* wide char. string to avoid converting unneeded characters but * wide char. string to avoid converting unneeded characters but
* choose not to bother; optimising the uncommon case where * choose not to bother; optimising the uncommon case where
* the input string contains a lot of text after the number * the input string contains a lot of text after the number
* duplicates a lot of strto{f,d,ld}()'s functionality and * duplicates a lot of strto{f,d,ld}()'s functionality and
* slows down the most common cases. * slows down the most common cases.
*/ */
start = src; start = src;
len = wcstombs(NULL, src, 0); len = wcstombs(NULL, src, 0);
if (len == (size_t)-1) if (len == (size_t)-1)
/* errno = EILSEQ */ /* errno = EILSEQ */
goto no_convert; goto no_convert;
_DIAGASSERT(len > 0); _DIAGASSERT(len > 0);
bufsiz = len; bufsiz = len;
buf = (void *)malloc(bufsiz + 1); buf = (void *)malloc(bufsiz + 1);
if (buf == NULL) if (buf == NULL)
/* errno = ENOMEM */ /* errno = ENOMEM */
goto no_convert; goto no_convert;
len = wcstombs(buf, src, bufsiz + 1); len = wcstombs(buf, src, bufsiz + 1);
_DIAGASSERT(len == bufsiz); _DIAGASSERT(len == bufsiz);
_DIAGASSERT(buf[len] == '\0'); _DIAGASSERT(buf[len] == '\0');
/* Let strto{f,d,ld}() do most of the work for us. */ /* Let strto{f,d,ld}() do most of the work for us. */
val = _STRTOD_FUNC(buf, &end); val = _STRTOD_FUNC(buf, &end);
if (buf == end) { if (buf == end) {
free(buf); free(buf);
goto no_convert; goto no_convert;
} }
/* /*
* We only know where the number ended in the _multibyte_ * We only know where the number ended in the _multibyte_
* representation of the string. If the caller wants to know * representation of the string. If the caller wants to know
* where it ended, count multibyte characters to find the * where it ended, count multibyte characters to find the
* corresponding position in the wide char string. * corresponding position in the wide char string.
*/ */
if (endptr != NULL) if (endptr != NULL)
/* XXX Assume each wide char is one byte. */ /* XXX Assume each wide char is one byte. */
*endptr = __UNCONST(start + (size_t)(end - buf)); *endptr = __UNCONST(start + (size_t)(end - buf));
free(buf); free(buf);
return val; return val;
no_convert: no_convert:
if (endptr != NULL) if (endptr != NULL)
*endptr = __UNCONST(nptr); *endptr = __UNCONST(nptr);
return 0; return 0.0;
} }
#endif /*__WCSTOD_H_*/ #endif /*__WCSTOD_H_*/

View File

@ -14,6 +14,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <wchar.h> #include <wchar.h>
#include <sys/types.h> #include <sys/types.h>
#include <limits.h>
typedef int ch_UCS4; typedef int ch_UCS4;
@ -913,6 +914,9 @@ wcsrtombs(
return (0); return (0);
if (Dest == NULL) { if (Dest == NULL) {
if(MaxBytes <= 0) {
MaxBytes = ASCII_STRING_MAX;
}
NumStored = EstimateWtoM(*Src, MaxBytes, NULL); NumStored = EstimateWtoM(*Src, MaxBytes, NULL);
} }
else { else {

View File

@ -283,8 +283,7 @@ extern "C" {
Exactly one of IEEE_LITTLE_ENDIAN, IEEE_BIG_ENDIAN, VAX, or IBM should be defined. Exactly one of IEEE_LITTLE_ENDIAN, IEEE_BIG_ENDIAN, VAX, or IBM should be defined.
#endif #endif
typedef union { double d; ULong L[2]; } U; typedef union { double d; UINT32 L[2]; } U;
//typedef union { double d; UINT32 L[2]; } U;
#ifdef YES_ALIAS #ifdef YES_ALIAS
#define dval(x) x #define dval(x) x