Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

125 lines
3.5 KiB

// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1995 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
#include "stdafx.h"
#include <float.h> // floating point precision
#ifdef AFX_CORE3_SEG
#pragma code_seg(AFX_CORE3_SEG)
#endif
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// Extra data validation procs for float/double support
// see "dlgdata.cpp" for non-floating point support
/////////////////////////////////////////////////////////////////////////////
static BOOL AFXAPI AfxSimpleFloatParse(LPCTSTR lpszText, double& d)
{
ASSERT(lpszText != NULL);
while (*lpszText == ' ' || *lpszText == '\t')
lpszText++;
TCHAR chFirst = lpszText[0];
d = _tcstod(lpszText, (LPTSTR*)&lpszText);
if (d == 0.0 && chFirst != '0')
return FALSE; // could not convert
while (*lpszText == ' ' || *lpszText == '\t')
lpszText++;
if (*lpszText != '\0')
return FALSE; // not terminated properly
return TRUE;
}
void AFXAPI AfxTextFloatFormat(CDataExchange* pDX, int nIDC,
void* pData, double value, int nSizeGcvt)
{
ASSERT(pData != NULL);
HWND hWndCtrl = pDX->PrepareEditCtrl(nIDC);
TCHAR szBuffer[32];
if (pDX->m_bSaveAndValidate)
{
::GetWindowText(hWndCtrl, szBuffer, _countof(szBuffer));
double d;
if (!AfxSimpleFloatParse(szBuffer, d))
{
AfxMessageBox(AFX_IDP_PARSE_REAL);
pDX->Fail(); // throws exception
}
if (nSizeGcvt == FLT_DIG)
*((float*)pData) = (float)d;
else
*((double*)pData) = d;
}
else
{
_stprintf(szBuffer, _T("%.*g"), nSizeGcvt, value);
AfxSetWindowText(hWndCtrl, szBuffer);
}
}
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, float& value)
{
AfxTextFloatFormat(pDX, nIDC, &value, value, FLT_DIG);
}
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, double& value)
{
AfxTextFloatFormat(pDX, nIDC, &value, value, DBL_DIG);
}
/////////////////////////////////////////////////////////////////////////////
// Validation procs
static void AFXAPI FailMinMaxReal(CDataExchange* pDX,
double minVal, double maxVal, int precision, UINT nIDPrompt)
// error string must have '%1' and '%2' in it
{
if (!pDX->m_bSaveAndValidate)
{
TRACE0("Warning: initial dialog data is out of range.\n");
return; // don't stop now
}
TCHAR szMin[32], szMax[32];
CString prompt;
_stprintf(szMin, _T("%.*g"), precision, minVal);
_stprintf(szMax, _T("%.*g"), precision, maxVal);
AfxFormatString2(prompt, nIDPrompt, szMin, szMax);
AfxMessageBox(prompt, MB_ICONEXCLAMATION, nIDPrompt);
prompt.Empty(); // exception prep
pDX->Fail();
}
void AFXAPI DDV_MinMaxFloat(CDataExchange* pDX, float const& value, float minVal, float maxVal)
{
ASSERT(minVal <= maxVal);
if (value < minVal || value > maxVal)
FailMinMaxReal(pDX, (double)minVal, (double)maxVal, FLT_DIG,
AFX_IDP_PARSE_REAL_RANGE);
}
void AFXAPI DDV_MinMaxDouble(CDataExchange* pDX, double const& value, double minVal, double maxVal)
{
ASSERT(minVal <= maxVal);
if (value < minVal || value > maxVal)
FailMinMaxReal(pDX, (double)minVal, (double)maxVal, DBL_DIG,
AFX_IDP_PARSE_REAL_RANGE);
}
/////////////////////////////////////////////////////////////////////////////