mirror of https://github.com/tongzx/nt5src
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.
252 lines
6.5 KiB
252 lines
6.5 KiB
//+----------------------------------------------------------------------------
|
|
//
|
|
// File: misc.cpp
|
|
//
|
|
// Module: CMPBK32.DLL
|
|
//
|
|
// Synopsis: Miscellaneous phone book utility functions.
|
|
//
|
|
// Copyright (c) 1998 Microsoft Corporation
|
|
//
|
|
// Author: quintinb created header 08/17/99
|
|
//
|
|
//+----------------------------------------------------------------------------
|
|
|
|
// ############################################################################
|
|
// Miscellaneous support routines
|
|
|
|
#include "cmmaster.h"
|
|
|
|
/* Not used anywhere, take out
|
|
#define irgMaxSzs 5
|
|
char szStrTable[irgMaxSzs][256];
|
|
|
|
// ############################################################################
|
|
PSTR GetSz(WORD wszID)
|
|
{
|
|
static int iSzTable=0;
|
|
|
|
PSTR psz = (PSTR) szStrTable[iSzTable];
|
|
|
|
iSzTable++;
|
|
if (iSzTable >= irgMaxSzs)
|
|
iSzTable = 0;
|
|
|
|
if (!LoadString(g_hInst, wszID, psz, 256))
|
|
{
|
|
CMTRACE1("LoadString failed %d\n", (DWORD) wszID);
|
|
*psz = 0;
|
|
}
|
|
|
|
return (psz);
|
|
}
|
|
*/
|
|
// ############################################################################
|
|
void SzCanonicalFromAE (char *psz, PACCESSENTRY pAE, LPLINECOUNTRYENTRY pLCE)
|
|
{
|
|
if (NO_AREA_CODE == pAE->dwAreaCode)
|
|
{
|
|
wsprintf(psz, "+%lu %s", pLCE->dwCountryCode, pAE->szAccessNumber);
|
|
}
|
|
else
|
|
{
|
|
wsprintf(psz, "+%lu (%s) %s", pLCE->dwCountryCode, pAE->szAreaCode, pAE->szAccessNumber);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
// ############################################################################
|
|
void SzNonCanonicalFromAE (char *psz, PACCESSENTRY pAE, LPLINECOUNTRYENTRY pLCE)
|
|
{
|
|
if (NO_AREA_CODE == pAE->dwAreaCode)
|
|
{
|
|
wsprintf(psz, "%lu %s", pLCE->dwCountryCode, pAE->szAccessNumber);
|
|
}
|
|
else
|
|
{
|
|
wsprintf(psz, "%lu %s %s", pLCE->dwCountryCode, pAE->szAreaCode, pAE->szAccessNumber);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
// ############################################################################
|
|
|
|
int MyStrcmp(PVOID pv1, PVOID pv2)
|
|
{
|
|
char *pc1 = (char*) pv1;
|
|
char *pc2 = (char*) 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 CompareIDLookUpElements(const void*e1, const void*e2)
|
|
{
|
|
if (((PIDLOOKUPELEMENT)e1)->dwID > ((PIDLOOKUPELEMENT)e2)->dwID)
|
|
return 1;
|
|
if (((PIDLOOKUPELEMENT)e1)->dwID < ((PIDLOOKUPELEMENT)e2)->dwID)
|
|
return -1;
|
|
return 0;
|
|
}
|
|
|
|
// ############################################################################
|
|
int __cdecl CompareCntryNameLookUpElementsA(const void*e1, const void*e2)
|
|
{
|
|
PCNTRYNAMELOOKUPELEMENT pCUE1 = (PCNTRYNAMELOOKUPELEMENT)e1;
|
|
PCNTRYNAMELOOKUPELEMENT pCUE2 = (PCNTRYNAMELOOKUPELEMENT)e2;
|
|
|
|
return CompareStringA(LOCALE_USER_DEFAULT,0,pCUE1->psCountryName,
|
|
pCUE1->dwNameSize,pCUE2->psCountryName,
|
|
pCUE2->dwNameSize) - 2;
|
|
}
|
|
|
|
// ############################################################################
|
|
int __cdecl CompareCntryNameLookUpElementsW(const void*e1, const void*e2)
|
|
{
|
|
PCNTRYNAMELOOKUPELEMENTW pCUE1 = (PCNTRYNAMELOOKUPELEMENTW)e1;
|
|
PCNTRYNAMELOOKUPELEMENTW pCUE2 = (PCNTRYNAMELOOKUPELEMENTW)e2;
|
|
|
|
return CompareStringW(LOCALE_USER_DEFAULT,0,pCUE1->psCountryName,
|
|
pCUE1->dwNameSize,pCUE2->psCountryName,
|
|
pCUE2->dwNameSize) - 2;
|
|
}
|
|
|
|
// ############################################################################
|
|
int __cdecl CompareIdxLookUpElements(const void*e1, const void*e2)
|
|
{
|
|
PIDXLOOKUPELEMENT pidx1 = (PIDXLOOKUPELEMENT) e1;
|
|
PIDXLOOKUPELEMENT pidx2 = (PIDXLOOKUPELEMENT) e2;
|
|
|
|
if (pidx1->dwIndex > pidx2->dwIndex)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
if (pidx1->dwIndex < pidx2->dwIndex)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
// ############################################################################
|
|
int __cdecl CompareIdxLookUpElementsFileOrder(const void *pv1, const void *pv2)
|
|
{
|
|
PACCESSENTRY pae1, pae2;
|
|
int iSort;
|
|
|
|
pae1 = (PACCESSENTRY) (((PIDXLOOKUPELEMENT)pv1)->iAE);
|
|
pae2 = (PACCESSENTRY) (((PIDXLOOKUPELEMENT)pv2)->iAE);
|
|
|
|
// sort empty enteries to the end of the list
|
|
if (!(pae1 && pae2))
|
|
{
|
|
// return ((int)pae1) ? -1 : ((int)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((PVOID)pae1->szCity, (PVOID)pae2->szCity);
|
|
if (iSort)
|
|
{
|
|
return (iSort);
|
|
}
|
|
|
|
if (pae1->fType != pae2->fType)
|
|
{
|
|
return (int) (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(PCSTR pSz,DWORD *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(PCSTR pSz,WORD *w)
|
|
{
|
|
DWORD dw;
|
|
if (FSz2Dw(pSz,&dw))
|
|
{
|
|
*w = (WORD)dw;
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
// ############################################################################
|
|
//inline BOOL FSz2B(PCSTR pSz,BYTE *pb)
|
|
BOOL FSz2B(PCSTR pSz,BYTE *pb)
|
|
{
|
|
DWORD dw;
|
|
if (FSz2Dw(pSz,&dw))
|
|
{
|
|
*pb = (BYTE)dw;
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
|
|
|
|
|