325 lines
7.9 KiB
C++
325 lines
7.9 KiB
C++
// ############################################################################
|
|
// Miscellaneous support routines
|
|
#include "pch.hpp"
|
|
#include "phbk.h"
|
|
|
|
#define irgMaxSzs 5
|
|
char szStrTable[irgMaxSzs][256];
|
|
|
|
// ############################################################################
|
|
LPSTR GetSz(WORD wszID)
|
|
{
|
|
static int iSzTable=0;
|
|
LPSTR psz = (LPSTR)&szStrTable[iSzTable][0];
|
|
|
|
iSzTable++;
|
|
if (iSzTable >= irgMaxSzs)
|
|
iSzTable = 0;
|
|
|
|
if (!LoadString(g_hInstDll, wszID, psz, 256))
|
|
{
|
|
Dprintf("LoadString failed %d\n", (DWORD) wszID);
|
|
*psz = 0;
|
|
}
|
|
|
|
return (psz);
|
|
}
|
|
|
|
// ############################################################################
|
|
void SzCanonicalFromAE (LPSTR psz, PACCESSENTRY pAE, LPLINECOUNTRYENTRY pLCE)
|
|
{
|
|
if (NO_AREA_CODE == pAE->dwAreaCode)
|
|
{
|
|
wsprintf(psz, "+%ld %s", pLCE->dwCountryCode, pAE->szAccessNumber);
|
|
}
|
|
else
|
|
{
|
|
wsprintf(psz, "+%ld (%s) %s", pLCE->dwCountryCode, pAE->szAreaCode, pAE->szAccessNumber);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
// ############################################################################
|
|
int MyStrcmp(LPVOID pv1, LPVOID pv2)
|
|
{
|
|
LPSTR pc1 = (LPSTR) pv1;
|
|
LPSTR pc2 = (LPSTR) pv2;
|
|
int iRC = 0;
|
|
// loop while not pointed at the ending NULL character and no difference has been found
|
|
while (*pc1 && *pc2 && !iRC)
|
|
{
|
|
iRC = (int)(*pc1 - *pc2);
|
|
pc1++;
|
|
pc2++;
|
|
}
|
|
|
|
// if we exited because we got to the end of one string before we found a difference
|
|
// return -1 if pv1 is longer, else return the character pointed at by pv2. If pv2
|
|
// is longer than pv1 then the value at pv2 will be greater than 0. If both strings
|
|
// ended at the same time, then pv2 will point to 0.
|
|
if (!iRC)
|
|
{
|
|
iRC = (*pc1) ? -1 : (*pc2);
|
|
}
|
|
return iRC;
|
|
}
|
|
// ############################################################################
|
|
int __cdecl Compare950Entry(const void*pv1, const void*pv2)
|
|
{
|
|
return (((NPABLOCK *) pv1)->wAreaCode - ((NPABLOCK *) pv2)->wAreaCode);
|
|
}
|
|
|
|
// ############################################################################
|
|
int __cdecl CompareIDLookUpElements(const void *e1, const void *e2)
|
|
{
|
|
if (((LPIDLOOKUPELEMENT)e1)->dwID > ((LPIDLOOKUPELEMENT)e2)->dwID)
|
|
return 1;
|
|
if (((LPIDLOOKUPELEMENT)e1)->dwID < ((LPIDLOOKUPELEMENT)e2)->dwID)
|
|
return -1;
|
|
return 0;
|
|
}
|
|
|
|
// ############################################################################
|
|
int __cdecl CompareCntryNameLookUpElements(const void *e1, const void *e2)
|
|
{
|
|
LPCNTRYNAMELOOKUPELEMENT pCUE1 = (LPCNTRYNAMELOOKUPELEMENT)e1;
|
|
LPCNTRYNAMELOOKUPELEMENT pCUE2 = (LPCNTRYNAMELOOKUPELEMENT)e2;
|
|
|
|
#ifdef WIN16
|
|
return lstrcmpi(pCUE1->psCountryName, pCUE2->psCountryName);
|
|
#else
|
|
return CompareString(LOCALE_USER_DEFAULT,0,pCUE1->psCountryName,
|
|
pCUE1->dwNameSize,pCUE2->psCountryName,
|
|
pCUE2->dwNameSize) - 2;
|
|
// return CompareString(LOCALE_USER_DEFAULT,0,((LPCNTRYNAMELOOKUPELEMENT)*e1)->psCountryName,
|
|
// ((LPCNTRYNAMELOOKUPELEMENT)*e1)->dwNameSize,((LPCNTRYNAMELOOKUPELEMENT)*e2)->psCountryName,
|
|
// ((LPCNTRYNAMELOOKUPELEMENT)*e2)->dwNameSize) - 2;
|
|
#endif
|
|
}
|
|
|
|
// ############################################################################
|
|
int __cdecl CompareIdxLookUpElements(const void *e1, const void *e2)
|
|
{
|
|
if (((LPIDXLOOKUPELEMENT)e1)->dwIndex > ((LPIDXLOOKUPELEMENT)e2)->dwIndex)
|
|
return 1;
|
|
if (((LPIDXLOOKUPELEMENT)e1)->dwIndex < ((LPIDXLOOKUPELEMENT)e2)->dwIndex)
|
|
return -1;
|
|
return 0;
|
|
}
|
|
|
|
// ############################################################################
|
|
int __cdecl CompareIdxLookUpElementsFileOrder(const void *pv1, const void *pv2)
|
|
{
|
|
PACCESSENTRY pae1, pae2;
|
|
int iSort;
|
|
|
|
pae1 = ((LPIDXLOOKUPELEMENT)pv1)->pAE;
|
|
pae2 = ((LPIDXLOOKUPELEMENT)pv2)->pAE;
|
|
|
|
// sort empty enteries to the end of the list
|
|
if (!(pae1 && pae2))
|
|
{
|
|
return (pae1 ? -1 : (pae2 ? 1 : 0));
|
|
}
|
|
|
|
// country ASC, state ASC, city ASC, toll free DESC, flip DESC, con spd max DESC
|
|
if (pae1->dwCountryID != pae2->dwCountryID)
|
|
{
|
|
return (int)(pae1->dwCountryID - pae2->dwCountryID);
|
|
}
|
|
|
|
if (pae1->wStateID != pae2->wStateID)
|
|
{
|
|
return (pae1->wStateID - pae2->wStateID);
|
|
}
|
|
|
|
iSort = MyStrcmp((LPVOID)pae1->szCity, (LPVOID)pae2->szCity);
|
|
if (iSort)
|
|
{
|
|
return (iSort);
|
|
}
|
|
|
|
if (pae1->fType != pae2->fType)
|
|
{
|
|
return (pae2->fType - pae1->fType);
|
|
}
|
|
|
|
if (pae1->bFlipFactor != pae2->bFlipFactor)
|
|
{
|
|
return (pae2->bFlipFactor - pae1->bFlipFactor);
|
|
}
|
|
|
|
if (pae1->dwConnectSpeedMax != pae2->dwConnectSpeedMax)
|
|
{
|
|
return (int)(pae2->dwConnectSpeedMax - pae1->dwConnectSpeedMax);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
// ############################################################################
|
|
//inline BOOL FSz2Dw(PCSTR pSz,DWORD *dw)
|
|
BOOL FSz2Dw(LPCSTR pSz,DWORD far *dw)
|
|
{
|
|
DWORD val = 0;
|
|
while (*pSz)
|
|
{
|
|
if (*pSz >= '0' && *pSz <= '9')
|
|
{
|
|
val *= 10;
|
|
val += *pSz++ - '0';
|
|
}
|
|
else
|
|
{
|
|
return FALSE; //bad number
|
|
}
|
|
}
|
|
*dw = val;
|
|
return (TRUE);
|
|
}
|
|
|
|
// ############################################################################
|
|
//inline BOOL FSz2W(PCSTR pSz,WORD *w)
|
|
BOOL FSz2W(LPCSTR pSz,WORD far *w)
|
|
{
|
|
DWORD dw;
|
|
if (FSz2Dw(pSz,&dw))
|
|
{
|
|
*w = (WORD)dw;
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
// ############################################################################
|
|
//inline BOOL FSz2B(PCSTR pSz,BYTE *pb)
|
|
BOOL FSz2B(LPCSTR pSz,BYTE far *pb)
|
|
{
|
|
DWORD dw;
|
|
if (FSz2Dw(pSz,&dw))
|
|
{
|
|
*pb = (BYTE)dw;
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
// ############################################################################
|
|
HRESULT ReleaseBold(HWND hwnd)
|
|
{
|
|
HFONT hfont = NULL;
|
|
|
|
hfont = (HFONT)SendMessage(hwnd,WM_GETFONT,0,0);
|
|
if (hfont) DeleteObject(hfont);
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
// ############################################################################
|
|
HRESULT MakeBold (HWND hwnd)
|
|
{
|
|
HRESULT hr = ERROR_SUCCESS;
|
|
HFONT hfont = NULL;
|
|
HFONT hnewfont = NULL;
|
|
LOGFONT far * plogfont = NULL;
|
|
|
|
if (!hwnd) goto MakeBoldExit;
|
|
|
|
hfont = (HFONT)SendMessage(hwnd,WM_GETFONT,0,0);
|
|
if (!hfont)
|
|
{
|
|
hr = GetLastError();
|
|
goto MakeBoldExit;
|
|
}
|
|
|
|
plogfont = (LOGFONT far *)GlobalAlloc(GPTR,sizeof(LOGFONT));
|
|
if (!plogfont)
|
|
{
|
|
hr = GetLastError();
|
|
goto MakeBoldExit;
|
|
}
|
|
|
|
if (!GetObject(hfont,sizeof(LOGFONT),(LPVOID)plogfont))
|
|
{
|
|
hr = GetLastError();
|
|
goto MakeBoldExit;
|
|
}
|
|
|
|
if (plogfont->lfHeight < 24)
|
|
{
|
|
plogfont->lfHeight = plogfont->lfHeight + (plogfont->lfHeight / 4);
|
|
}
|
|
|
|
plogfont->lfWeight = FW_BOLD;
|
|
|
|
if (!(hnewfont = CreateFontIndirect(plogfont)))
|
|
{
|
|
hr = GetLastError();
|
|
goto MakeBoldExit;
|
|
}
|
|
|
|
SendMessage(hwnd,WM_SETFONT,(WPARAM)hnewfont,MAKELPARAM(FALSE,0));
|
|
|
|
GlobalFree(plogfont);
|
|
plogfont = NULL;
|
|
|
|
MakeBoldExit:
|
|
//if (hfont) DeleteObject(hfont);
|
|
// BUG:? Do I need to delete hnewfont at some time?
|
|
return hr;
|
|
}
|
|
|
|
#if !defined(WIN16)
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function: DWGetWin32Platform
|
|
//
|
|
// Synopsis: Return a value to determine win32 platform
|
|
//
|
|
// Arguements: None
|
|
//
|
|
// Returns: platform enumeration (see GetVersionEx for details)
|
|
//
|
|
// History: 8/8/96 ChrisK Created
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
DWORD DWGetWin32Platform()
|
|
{
|
|
OSVERSIONINFO osver;
|
|
ZeroMemory(&osver,sizeof(osver));
|
|
osver.dwOSVersionInfoSize = sizeof(osver);
|
|
if (GetVersionEx(&osver))
|
|
return osver.dwPlatformId;
|
|
AssertSz(0,"GetVersionEx failed.\r\n");
|
|
return 0;
|
|
}
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function: DWGetWin32BuildNumber
|
|
//
|
|
// Synopsis: Return a value to determine win32 build
|
|
//
|
|
// Arguements: None
|
|
//
|
|
// Returns: build number
|
|
//
|
|
// History: 9/26/96 ChrisK Created
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
DWORD DWGetWin32BuildNumber()
|
|
{
|
|
OSVERSIONINFO osver;
|
|
ZeroMemory(&osver,sizeof(osver));
|
|
osver.dwOSVersionInfoSize = sizeof(osver);
|
|
if (GetVersionEx(&osver))
|
|
// dwBuildNumber
|
|
// Identifies the build number of the operating system in the low-order
|
|
// word. (The high-order word contains the major and minor version numbers.)
|
|
return (osver.dwBuildNumber & 0xFFFF);
|
|
AssertSz(0,"GetVersionEx failed.\r\n");
|
|
return 0;
|
|
}
|
|
|
|
#endif
|