mirror of https://github.com/acidanthera/audk.git
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:
parent
f149129429
commit
05c7d5f615
|
@ -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
|
||||||
|
|
|
@ -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_*/
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue