Source code of Windows XP (NT5)
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

//+----------------------------------------------------------------------------
//
// 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;
}