From 2f2ffece124e4ed4b96d2846263015d4b5ad6c00 Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Thu, 23 Jul 2015 14:42:09 -0700 Subject: Merge to XFA - else after returns. (cherry picked from commit 3c012fef2bb72c8ec1faa73e11ee35539b2559d6) Original Review URL: https://codereview.chromium.org/1243953004 . R=thestig@chromium.org Review URL: https://codereview.chromium.org/1239313005 . --- fpdfsdk/src/javascript/util.cpp | 1035 +++++++++++++++++++-------------------- 1 file changed, 511 insertions(+), 524 deletions(-) (limited to 'fpdfsdk/src/javascript/util.cpp') diff --git a/fpdfsdk/src/javascript/util.cpp b/fpdfsdk/src/javascript/util.cpp index c4f03093a7..4083ed58da 100644 --- a/fpdfsdk/src/javascript/util.cpp +++ b/fpdfsdk/src/javascript/util.cpp @@ -22,13 +22,13 @@ static v8::Isolate* GetIsolate(IFXJS_Context* cc) { - CJS_Context* pContext = (CJS_Context *)cc; - ASSERT(pContext != NULL); + CJS_Context* pContext = (CJS_Context *)cc; + ASSERT(pContext != NULL); - CJS_Runtime* pRuntime = pContext->GetJSRuntime(); - ASSERT(pRuntime != NULL); + CJS_Runtime* pRuntime = pContext->GetJSRuntime(); + ASSERT(pRuntime != NULL); - return pRuntime->GetIsolate(); + return pRuntime->GetIsolate(); } BEGIN_JS_STATIC_CONST(CJS_Util) @@ -38,11 +38,11 @@ BEGIN_JS_STATIC_PROP(CJS_Util) END_JS_STATIC_PROP() BEGIN_JS_STATIC_METHOD(CJS_Util) - JS_STATIC_METHOD_ENTRY(printd) - JS_STATIC_METHOD_ENTRY(printf) - JS_STATIC_METHOD_ENTRY(printx) - JS_STATIC_METHOD_ENTRY(scand) - JS_STATIC_METHOD_ENTRY(byteToChar) + JS_STATIC_METHOD_ENTRY(printd) + JS_STATIC_METHOD_ENTRY(printf) + JS_STATIC_METHOD_ENTRY(printx) + JS_STATIC_METHOD_ENTRY(scand) + JS_STATIC_METHOD_ENTRY(byteToChar) END_JS_STATIC_METHOD() IMPLEMENT_JS_CLASS(CJS_Util,util) @@ -58,549 +58,539 @@ util::~util(void) struct stru_TbConvert { - const FX_WCHAR* lpszJSMark; - const FX_WCHAR* lpszCppMark; + const FX_WCHAR* lpszJSMark; + const FX_WCHAR* lpszCppMark; }; const stru_TbConvert fcTable[] = { - { L"mmmm", L"%B" }, - { L"mmm", L"%b" }, - { L"mm", L"%m" }, - //"m" - { L"dddd", L"%A" }, - { L"ddd", L"%a" }, - { L"dd", L"%d" }, - //"d", "%w", - { L"yyyy", L"%Y" }, - { L"yy", L"%y" }, - { L"HH", L"%H" }, - //"H" - { L"hh", L"%I" }, - //"h" - { L"MM", L"%M" }, - //"M" - { L"ss", L"%S" }, - //"s - { L"TT", L"%p" }, - //"t" + { L"mmmm", L"%B" }, + { L"mmm", L"%b" }, + { L"mm", L"%m" }, + //"m" + { L"dddd", L"%A" }, + { L"ddd", L"%a" }, + { L"dd", L"%d" }, + //"d", "%w", + { L"yyyy", L"%Y" }, + { L"yy", L"%y" }, + { L"HH", L"%H" }, + //"H" + { L"hh", L"%I" }, + //"h" + { L"MM", L"%M" }, + //"M" + { L"ss", L"%S" }, + //"s + { L"TT", L"%p" }, + //"t" #if defined(_WIN32) - { L"tt", L"%p" }, - { L"h", L"%#I" }, + { L"tt", L"%p" }, + { L"h", L"%#I" }, #else - { L"tt", L"%P" }, - { L"h", L"%l" }, + { L"tt", L"%P" }, + { L"h", L"%l" }, #endif }; -#define UTIL_INT 0 -#define UTIL_DOUBLE 1 -#define UTIL_STRING 2 +#define UTIL_INT 0 +#define UTIL_DOUBLE 1 +#define UTIL_STRING 2 int util::ParstDataType(std::wstring* sFormat) { - size_t i = 0; - bool bPercent = FALSE; - for (i=0; ilength(); ++i) - { - wchar_t c = (*sFormat)[i]; - if (c == L'%') - { - bPercent = true; - continue; - } - - if (bPercent) - { - if (c == L'c' || c == L'C' || c == L'd' || c == L'i' || c == L'o' || c == L'u' || c == L'x' || c == L'X') - { - return UTIL_INT; - } - else if (c == L'e' || c == L'E' || c == L'f' || c == L'g' || c == L'G') - { - return UTIL_DOUBLE; - } - else if (c == L's' || c == L'S') - { - // Map s to S since we always deal internally - // with wchar_t strings. - (*sFormat)[i] = L'S'; - return UTIL_STRING; - } - else if (c == L'.' || c == L'+' || c == L'-' || c == L'#' || c == L' ' || CJS_PublicMethods::IsDigit(c)) - { - continue; - } - else break; - } - } - - return -1; + bool bPercent = FALSE; + for (size_t i = 0; i < sFormat->length(); ++i) + { + wchar_t c = (*sFormat)[i]; + if (c == L'%') + { + bPercent = true; + continue; + } + + if (bPercent) + { + if (c == L'c' || c == L'C' || c == L'd' || c == L'i' || c == L'o' || c == L'u' || c == L'x' || c == L'X') + { + return UTIL_INT; + } + if (c == L'e' || c == L'E' || c == L'f' || c == L'g' || c == L'G') + { + return UTIL_DOUBLE; + } + if (c == L's' || c == L'S') + { + // Map s to S since we always deal internally + // with wchar_t strings. + (*sFormat)[i] = L'S'; + return UTIL_STRING; + } + if (c == L'.' || c == L'+' || c == L'-' || c == L'#' || c == L' ' || CJS_PublicMethods::IsDigit(c)) + { + continue; + } + break; + } + } + + return -1; } FX_BOOL util::printf(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError) { - int iSize = params.size(); - if (iSize < 1) - return FALSE; - std::wstring c_ConvChar(params[0].ToCFXWideString().c_str()); - std::vector c_strConvers; - int iOffset = 0; - int iOffend = 0; - c_ConvChar.insert(c_ConvChar.begin(),L'S'); - while(iOffset != -1) - { - iOffend = c_ConvChar.find(L"%",iOffset+1); - std::wstring strSub; - if (iOffend == -1) - strSub = c_ConvChar.substr(iOffset); - else - strSub = c_ConvChar.substr(iOffset ,iOffend - iOffset); - c_strConvers.push_back(strSub); - iOffset = iOffend ; - } - - std::wstring c_strResult; - - //for(int iIndex = 1;iIndex < params.size();iIndex++) - std::wstring c_strFormat; - for(int iIndex = 0;iIndex < (int)c_strConvers.size();iIndex++) - { - c_strFormat = c_strConvers[iIndex]; - if (iIndex == 0) - { - c_strResult = c_strFormat; - continue; - } - - - CFX_WideString strSegment; - if (iIndex >= iSize) { - c_strResult += c_strFormat; - continue; - } - - switch (ParstDataType(&c_strFormat)) - { - case UTIL_INT: - strSegment.Format(c_strFormat.c_str(), params[iIndex].ToInt()); - break; - case UTIL_DOUBLE: - strSegment.Format(c_strFormat.c_str(), params[iIndex].ToDouble()); - break; - case UTIL_STRING: - strSegment.Format(c_strFormat.c_str(), params[iIndex].ToCFXWideString().c_str()); - break; - default: - strSegment.Format(L"%S", c_strFormat.c_str()); - break; - } - c_strResult += strSegment.GetBuffer(strSegment.GetLength()+1); - } - - c_strResult.erase(c_strResult.begin()); - vRet = c_strResult.c_str(); - return TRUE; + int iSize = params.size(); + if (iSize < 1) + return FALSE; + std::wstring c_ConvChar(params[0].ToCFXWideString().c_str()); + std::vector c_strConvers; + int iOffset = 0; + int iOffend = 0; + c_ConvChar.insert(c_ConvChar.begin(),L'S'); + while(iOffset != -1) + { + iOffend = c_ConvChar.find(L"%",iOffset+1); + std::wstring strSub; + if (iOffend == -1) + strSub = c_ConvChar.substr(iOffset); + else + strSub = c_ConvChar.substr(iOffset ,iOffend - iOffset); + c_strConvers.push_back(strSub); + iOffset = iOffend ; + } + + std::wstring c_strResult; + + //for(int iIndex = 1;iIndex < params.size();iIndex++) + std::wstring c_strFormat; + for(int iIndex = 0;iIndex < (int)c_strConvers.size();iIndex++) + { + c_strFormat = c_strConvers[iIndex]; + if (iIndex == 0) + { + c_strResult = c_strFormat; + continue; + } + + + CFX_WideString strSegment; + if (iIndex >= iSize) { + c_strResult += c_strFormat; + continue; + } + + switch (ParstDataType(&c_strFormat)) + { + case UTIL_INT: + strSegment.Format(c_strFormat.c_str(), params[iIndex].ToInt()); + break; + case UTIL_DOUBLE: + strSegment.Format(c_strFormat.c_str(), params[iIndex].ToDouble()); + break; + case UTIL_STRING: + strSegment.Format(c_strFormat.c_str(), params[iIndex].ToCFXWideString().c_str()); + break; + default: + strSegment.Format(L"%S", c_strFormat.c_str()); + break; + } + c_strResult += strSegment.GetBuffer(strSegment.GetLength()+1); + } + + c_strResult.erase(c_strResult.begin()); + vRet = c_strResult.c_str(); + return TRUE; } FX_BOOL util::printd(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError) { - v8::Isolate* isolate = GetIsolate(cc); - - int iSize = params.size(); - if (iSize < 2) - return FALSE; - - CJS_Value p1(isolate); - p1 = params[0]; - - CJS_Value p2 = params[1]; - CJS_Date jsDate(isolate); - if (!p2.ConvertToDate(jsDate)) - { - sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPRINT1); - return FALSE; - } - - if (!jsDate.IsValidDate()) - { - sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPRINT2); - return FALSE; - } - - if (p1.GetType() == VT_number) - { - int nFormat = p1.ToInt(); - CFX_WideString swResult; - - switch (nFormat) - { - case 0: - swResult.Format(L"D:%04d%02d%02d%02d%02d%02d", - jsDate.GetYear(), - jsDate.GetMonth() + 1, - jsDate.GetDay(), - jsDate.GetHours(), - jsDate.GetMinutes(), - jsDate.GetSeconds()); - break; - case 1: - swResult.Format(L"%04d.%02d.%02d %02d:%02d:%02d", - jsDate.GetYear(), - jsDate.GetMonth() + 1, - jsDate.GetDay(), - jsDate.GetHours(), - jsDate.GetMinutes(), - jsDate.GetSeconds()); - break; - case 2: - swResult.Format(L"%04d/%02d/%02d %02d:%02d:%02d", - jsDate.GetYear(), - jsDate.GetMonth() + 1, - jsDate.GetDay(), - jsDate.GetHours(), - jsDate.GetMinutes(), - jsDate.GetSeconds()); - break; - default: - return FALSE; - } - - vRet = swResult.c_str(); - return TRUE; - } - else if (p1.GetType() == VT_string) - { - std::basic_string cFormat = p1.ToCFXWideString().c_str(); - - bool bXFAPicture = false; - if (iSize > 2) - { - bXFAPicture = params[2].ToBool(); - } - - if (bXFAPicture) - { - return FALSE; //currently, it doesn't support XFAPicture. - } + v8::Isolate* isolate = GetIsolate(cc); + + int iSize = params.size(); + if (iSize < 2) + return FALSE; + + CJS_Value p1(isolate); + p1 = params[0]; + + CJS_Value p2 = params[1]; + CJS_Date jsDate(isolate); + if (!p2.ConvertToDate(jsDate)) + { + sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPRINT1); + return FALSE; + } + + if (!jsDate.IsValidDate()) + { + sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPRINT2); + return FALSE; + } + + if (p1.GetType() == VT_number) + { + int nFormat = p1.ToInt(); + CFX_WideString swResult; + + switch (nFormat) + { + case 0: + swResult.Format(L"D:%04d%02d%02d%02d%02d%02d", + jsDate.GetYear(), + jsDate.GetMonth() + 1, + jsDate.GetDay(), + jsDate.GetHours(), + jsDate.GetMinutes(), + jsDate.GetSeconds()); + break; + case 1: + swResult.Format(L"%04d.%02d.%02d %02d:%02d:%02d", + jsDate.GetYear(), + jsDate.GetMonth() + 1, + jsDate.GetDay(), + jsDate.GetHours(), + jsDate.GetMinutes(), + jsDate.GetSeconds()); + break; + case 2: + swResult.Format(L"%04d/%02d/%02d %02d:%02d:%02d", + jsDate.GetYear(), + jsDate.GetMonth() + 1, + jsDate.GetDay(), + jsDate.GetHours(), + jsDate.GetMinutes(), + jsDate.GetSeconds()); + break; + default: + return FALSE; + } + + vRet = swResult.c_str(); + return TRUE; + } + if (p1.GetType() == VT_string) + { + std::basic_string cFormat = p1.ToCFXWideString().c_str(); + + bool bXFAPicture = false; + if (iSize > 2) + { + bXFAPicture = params[2].ToBool(); + } + + if (bXFAPicture) + { + return FALSE; //currently, it doesn't support XFAPicture. + } int iIndex; - for(iIndex = 0;iIndex12?iHour-12:iHour }, - { L"M", iMin }, - { L"s", iSec }, - }; - - //cFormat = strFormat.GetBuffer(strFormat.GetLength()+1); - for(iIndex = 0;iIndex12?iHour-12:iHour }, + { L"M", iMin }, + { L"s", iSec }, + }; + + for(iIndex = 0;iIndex 0) - { - if (cFormat[iEnd-1] == L'%') - { - iStart = iEnd+1; - continue; - } - } - cFormat.replace(iEnd, FXSYS_wcslen(cTableAd[iIndex].lpszJSMark), tszValue); - iStart = iEnd; - } - } - - CFX_WideString strFormat; -// strFormat.Format(L"%d,%d,%d,%d,%d,%d",iYear, iMonth, iDay, iHour, iMin, iSec); -// CString strFormat = cppTm.Format(cFormat.c_str()); - wchar_t buf[64] = {}; - strFormat = wcsftime(buf, 64, cFormat.c_str(), &time); - cFormat = buf; - vRet = cFormat.c_str(); - //rtRet = strFormat.GetBuffer(strFormat.GetLength()+1); - return TRUE; - } - return FALSE; + int iStart = 0; + int iEnd; + while((iEnd = cFormat.find(cTableAd[iIndex].lpszJSMark, iStart)) != -1) + { + if (iEnd > 0) + { + if (cFormat[iEnd-1] == L'%') + { + iStart = iEnd+1; + continue; + } + } + cFormat.replace(iEnd, FXSYS_wcslen(cTableAd[iIndex].lpszJSMark), tszValue); + iStart = iEnd; + } + } + + CFX_WideString strFormat; + wchar_t buf[64] = {}; + strFormat = wcsftime(buf, 64, cFormat.c_str(), &time); + cFormat = buf; + vRet = cFormat.c_str(); + return TRUE; + } + return FALSE; } void util::printd(const std::wstring &cFormat2, CJS_Date jsDate, bool bXFAPicture, std::wstring &cPurpose) { - std::wstring cFormat = cFormat2; + std::wstring cFormat = cFormat2; - if (bXFAPicture) - { - return ; //currently, it doesn't support XFAPicture. - } + if (bXFAPicture) + { + return ; //currently, it doesn't support XFAPicture. + } int iIndex; - for(iIndex = 0;iIndex12?iHour-12:iHour }, - { L"M", iMin }, - { L"s", iSec }, - }; - - //cFormat = strFormat.GetBuffer(strFormat.GetLength()+1); - for(iIndex = 0;iIndex 0) - { - if (cFormat[iEnd-1] == L'%') - { - iStart = iEnd+1; - continue; - } - } - cFormat.replace(iEnd,FXSYS_wcslen(cTableAd[iIndex].lpszJSMark),tszValue); - iStart = iEnd; - } - } - - CFX_WideString strFormat; - wchar_t buf[64] = {}; - strFormat = wcsftime(buf, 64, cFormat.c_str(), &time); - cFormat = buf; - cPurpose = cFormat; + for(iIndex = 0;iIndex12?iHour-12:iHour }, + { L"M", iMin }, + { L"s", iSec }, + }; + + //cFormat = strFormat.GetBuffer(strFormat.GetLength()+1); + for(iIndex = 0;iIndex 0) + { + if (cFormat[iEnd-1] == L'%') + { + iStart = iEnd+1; + continue; + } + } + cFormat.replace(iEnd,FXSYS_wcslen(cTableAd[iIndex].lpszJSMark),tszValue); + iStart = iEnd; + } + } + + CFX_WideString strFormat; + wchar_t buf[64] = {}; + strFormat = wcsftime(buf, 64, cFormat.c_str(), &time); + cFormat = buf; + cPurpose = cFormat; } FX_BOOL util::printx(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError) { - int iSize = params.size(); - if (iSize<2) - return FALSE; - CFX_WideString sFormat = params[0].ToCFXWideString(); - CFX_WideString sSource = params[1].ToCFXWideString(); - std::string cFormat = CFX_ByteString::FromUnicode(sFormat).c_str(); - std::string cSource = CFX_ByteString::FromUnicode(sSource).c_str(); - std::string cDest; - printx(cFormat,cSource,cDest); - vRet = cDest.c_str(); - return TRUE; + int iSize = params.size(); + if (iSize<2) + return FALSE; + CFX_WideString sFormat = params[0].ToCFXWideString(); + CFX_WideString sSource = params[1].ToCFXWideString(); + std::string cFormat = CFX_ByteString::FromUnicode(sFormat).c_str(); + std::string cSource = CFX_ByteString::FromUnicode(sSource).c_str(); + std::string cDest; + printx(cFormat,cSource,cDest); + vRet = cDest.c_str(); + return TRUE; } void util::printx(const std::string &cFormat,const std::string &cSource2,std::string &cPurpose) { - std::string cSource(cSource2); - if (!cPurpose.empty()) - //cPurpose.clear(); - cPurpose.erase(); - int itSource = 0; - int iSize = cSource.size(); - for(int iIndex = 0; iIndex < (int)cFormat.size() && itSource='0'&&cSource[itSource]<='9') || (cSource[itSource]>='a' && cSource[itSource]<='z') || (cSource[itSource]>='A' && cSource[itSource]<='Z')) - { - //cPurpose.push_back(cSource[itSource]); - cPurpose += cSource[itSource]; - itSource++; - break; - } - itSource++; - } - break; - } - break; - case 'A': - { - while(itSource < iSize) - { - if ((cSource[itSource]>='a' && cSource[itSource]<='z') || (cSource[itSource]>='A' && cSource[itSource]<='Z')) - { - //cPurpose.push_back(cSource[itSource]); - cPurpose += cSource[itSource]; - itSource++; - break; - } - itSource++; - } - break; - } - break; - case '9': - { - while(itSource < iSize) - { - if (cSource[itSource]>='0'&&cSource[itSource]<='9') - { - //cPurpose.push_back(cSource[itSource]); - cPurpose += cSource[itSource]; - itSource++; - break; - } - itSource++; - } - break; - } - case '*': - { - cPurpose.append(cSource,itSource,iSize-itSource); - itSource = iSize-1; - break; - } - case '\\': - break; - case '>': - { - for(std::string::iterator it = cSource.begin();it != cSource.end(); it++) - { - *it = toupper(*it); - } - break; - } - case '<': - { - for(std::string::iterator it = cSource.begin();it != cSource.end(); it++) - { - *it = tolower(*it); - } - break; - } - case '=': - break; - default: - //cPurpose.push_back(letter); - cPurpose += letter; - break; - } - } + std::string cSource(cSource2); + if (!cPurpose.empty()) + //cPurpose.clear(); + cPurpose.erase(); + int itSource = 0; + int iSize = cSource.size(); + for(int iIndex = 0; iIndex < (int)cFormat.size() && itSource='0'&&cSource[itSource]<='9') || (cSource[itSource]>='a' && cSource[itSource]<='z') || (cSource[itSource]>='A' && cSource[itSource]<='Z')) + { + //cPurpose.push_back(cSource[itSource]); + cPurpose += cSource[itSource]; + itSource++; + break; + } + itSource++; + } + break; + } + break; + case 'A': + { + while(itSource < iSize) + { + if ((cSource[itSource]>='a' && cSource[itSource]<='z') || (cSource[itSource]>='A' && cSource[itSource]<='Z')) + { + //cPurpose.push_back(cSource[itSource]); + cPurpose += cSource[itSource]; + itSource++; + break; + } + itSource++; + } + break; + } + break; + case '9': + { + while(itSource < iSize) + { + if (cSource[itSource]>='0'&&cSource[itSource]<='9') + { + //cPurpose.push_back(cSource[itSource]); + cPurpose += cSource[itSource]; + itSource++; + break; + } + itSource++; + } + break; + } + case '*': + { + cPurpose.append(cSource,itSource,iSize-itSource); + itSource = iSize-1; + break; + } + case '\\': + break; + case '>': + { + for(std::string::iterator it = cSource.begin();it != cSource.end(); it++) + { + *it = toupper(*it); + } + break; + } + case '<': + { + for(std::string::iterator it = cSource.begin();it != cSource.end(); it++) + { + *it = tolower(*it); + } + break; + } + case '=': + break; + default: + //cPurpose.push_back(letter); + cPurpose += letter; + break; + } + } } FX_BOOL util::scand(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError) { - v8::Isolate* isolate = GetIsolate(cc); - int iSize = params.size(); - if (iSize < 2) - return FALSE; - - CFX_WideString sFormat = params[0].ToCFXWideString(); - CFX_WideString sDate = params[1].ToCFXWideString(); - double dDate = JS_GetDateTime(); - if (sDate.GetLength() > 0) - { - FX_BOOL bWrongFormat = FALSE; - dDate = CJS_PublicMethods::MakeRegularDate(sDate,sFormat,bWrongFormat); - } - - if (!JS_PortIsNan(dDate)) - { - CJS_Date date(isolate,dDate); - vRet = date; - } - else - { - vRet.SetNull(); - } - - return TRUE; + v8::Isolate* isolate = GetIsolate(cc); + int iSize = params.size(); + if (iSize < 2) + return FALSE; + + CFX_WideString sFormat = params[0].ToCFXWideString(); + CFX_WideString sDate = params[1].ToCFXWideString(); + double dDate = JS_GetDateTime(); + if (sDate.GetLength() > 0) + { + FX_BOOL bWrongFormat = FALSE; + dDate = CJS_PublicMethods::MakeRegularDate(sDate,sFormat,bWrongFormat); + } + + if (!JS_PortIsNan(dDate)) + { + CJS_Date date(isolate,dDate); + vRet = date; + } + else + { + vRet.SetNull(); + } + + return TRUE; } int64_t FX_atoi64(const char *nptr) @@ -625,21 +615,18 @@ int64_t FX_atoi64(const char *nptr) c = (int)(unsigned char)*nptr++; /* get next char */ } - if (sign == '-') - return -total; - else - return total; /* return result, negated if necessary */ + return sign == '-' ? -total : total; } FX_BOOL util::byteToChar(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError) { - int iSize = params.size(); - if (iSize == 0) - return FALSE; - int nByte = params[0].ToInt(); - unsigned char cByte = (unsigned char)nByte; - CFX_WideString csValue; - csValue.Format(L"%c", cByte); - vRet = csValue.c_str(); - return TRUE; + int iSize = params.size(); + if (iSize == 0) + return FALSE; + int nByte = params[0].ToInt(); + unsigned char cByte = (unsigned char)nByte; + CFX_WideString csValue; + csValue.Format(L"%c", cByte); + vRet = csValue.c_str(); + return TRUE; } -- cgit v1.2.3