// ############################################################################
// 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