227 lines
4.9 KiB
C
227 lines
4.9 KiB
C
|
|
||
|
/****************************************************************************
|
||
|
|
||
|
PROGRAM: UTIL.C
|
||
|
|
||
|
PURPOSE: System utility routines
|
||
|
|
||
|
****************************************************************************/
|
||
|
|
||
|
#include "xerox.h"
|
||
|
#include <string.h>
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
|
||
|
FUNCTION: Alloc
|
||
|
|
||
|
PURPOSE: Allocates memory to hold the specified number of bytes
|
||
|
|
||
|
RETURNS : Pointer to allocated memory or NULL on failure
|
||
|
|
||
|
****************************************************************************/
|
||
|
|
||
|
PVOID
|
||
|
Alloc(
|
||
|
SIZE_T Bytes
|
||
|
)
|
||
|
{
|
||
|
HANDLE hMem;
|
||
|
PVOID Buffer;
|
||
|
|
||
|
hMem = LocalAlloc(LMEM_MOVEABLE, Bytes + sizeof(hMem));
|
||
|
|
||
|
if (hMem == NULL) {
|
||
|
return(NULL);
|
||
|
}
|
||
|
|
||
|
// Lock down the memory
|
||
|
//
|
||
|
Buffer = LocalLock(hMem);
|
||
|
if (Buffer == NULL) {
|
||
|
LocalFree(hMem);
|
||
|
return(NULL);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Store the handle at the start of the memory block and return
|
||
|
// a pointer to just beyond it.
|
||
|
//
|
||
|
|
||
|
*((PHANDLE)Buffer) = hMem;
|
||
|
|
||
|
return (PVOID)(((PHANDLE)Buffer)+1);
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
|
||
|
FUNCTION: GetAllocSize
|
||
|
|
||
|
PURPOSE: Returns the allocated size of the specified memory block.
|
||
|
The block must have been previously allocated using Alloc
|
||
|
|
||
|
RETURNS : Size of memory block in bytes or 0 on error
|
||
|
|
||
|
****************************************************************************/
|
||
|
|
||
|
SIZE_T
|
||
|
GetAllocSize(
|
||
|
PVOID Buffer
|
||
|
)
|
||
|
{
|
||
|
HANDLE hMem;
|
||
|
|
||
|
hMem = *(((PHANDLE)Buffer) - 1);
|
||
|
|
||
|
return(LocalSize(hMem) - sizeof(hMem));
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
|
||
|
FUNCTION: Free
|
||
|
|
||
|
PURPOSE: Frees the memory previously allocated with Alloc
|
||
|
|
||
|
RETURNS : TRUE on success, otherwise FALSE
|
||
|
|
||
|
****************************************************************************/
|
||
|
|
||
|
BOOL
|
||
|
Free(
|
||
|
PVOID Buffer
|
||
|
)
|
||
|
{
|
||
|
HANDLE hMem;
|
||
|
|
||
|
hMem = *(((PHANDLE)Buffer) - 1);
|
||
|
|
||
|
LocalUnlock(hMem);
|
||
|
|
||
|
return(LocalFree(hMem) == NULL);
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
|
||
|
FUNCTION: AddItem
|
||
|
|
||
|
PURPOSE: Adds the item string and data to the specified control
|
||
|
The control is assumed to be a list-box unless fCBox == TRUE
|
||
|
in which case the control is assumed to be a ComboBox
|
||
|
|
||
|
RETURNS: Index at which the item was added or < 0 on error
|
||
|
|
||
|
****************************************************************************/
|
||
|
INT
|
||
|
AddItem(
|
||
|
HWND hDlg,
|
||
|
INT ControlID,
|
||
|
LPSTR String,
|
||
|
LONG_PTR Data,
|
||
|
BOOL fCBox
|
||
|
)
|
||
|
{
|
||
|
HWND hwnd;
|
||
|
INT iItem;
|
||
|
USHORT AddStringMsg = LB_ADDSTRING;
|
||
|
USHORT SetDataMsg = LB_SETITEMDATA;
|
||
|
|
||
|
if (fCBox) {
|
||
|
AddStringMsg = CB_ADDSTRING;
|
||
|
SetDataMsg = CB_SETITEMDATA;
|
||
|
}
|
||
|
|
||
|
hwnd = GetDlgItem(hDlg, ControlID);
|
||
|
|
||
|
iItem = (INT)SendMessage(hwnd, AddStringMsg, 0, (LONG_PTR)String);
|
||
|
|
||
|
if (iItem >= 0) {
|
||
|
SendMessage(hwnd, SetDataMsg, iItem, Data);
|
||
|
}
|
||
|
|
||
|
return(iItem);
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
|
||
|
FUNCTION: AddItemhwnd
|
||
|
|
||
|
PURPOSE: Adds the item string and data to the specified control
|
||
|
The control is assumed to be a list-box unless fCBox == TRUE
|
||
|
in which case the control is assumed to be a ComboBox
|
||
|
|
||
|
RETURNS: Index at which the item was added or < 0 on error
|
||
|
|
||
|
****************************************************************************/
|
||
|
INT
|
||
|
AddItemhwnd(
|
||
|
HWND hwnd,
|
||
|
LPSTR String,
|
||
|
LONG_PTR Data,
|
||
|
BOOL fCBox
|
||
|
)
|
||
|
{
|
||
|
INT iItem;
|
||
|
USHORT AddStringMsg = LB_ADDSTRING;
|
||
|
USHORT SetDataMsg = LB_SETITEMDATA;
|
||
|
|
||
|
if (fCBox) {
|
||
|
AddStringMsg = CB_ADDSTRING;
|
||
|
SetDataMsg = CB_SETITEMDATA;
|
||
|
}
|
||
|
|
||
|
iItem = (INT)SendMessage(hwnd, AddStringMsg, 0, (LONG_PTR)String);
|
||
|
|
||
|
if (iItem >= 0) {
|
||
|
SendMessage(hwnd, SetDataMsg, iItem, Data);
|
||
|
}
|
||
|
|
||
|
return(iItem);
|
||
|
}
|
||
|
|
||
|
|
||
|
/****************************************************************************
|
||
|
|
||
|
FUNCTION: FindData
|
||
|
|
||
|
PURPOSE: Searches for the specified data in a combo box or lbox.
|
||
|
|
||
|
RETURNS: Index of matching item or < 0 on error
|
||
|
|
||
|
****************************************************************************/
|
||
|
LONG_PTR
|
||
|
FindData(
|
||
|
HWND hwnd,
|
||
|
LONG_PTR data,
|
||
|
BOOL fCBox
|
||
|
)
|
||
|
{
|
||
|
INT cItems;
|
||
|
USHORT GetCountMsg = LB_GETCOUNT;
|
||
|
USHORT GetDataMsg = LB_GETITEMDATA;
|
||
|
|
||
|
if (fCBox) {
|
||
|
GetCountMsg = CB_GETCOUNT;
|
||
|
GetDataMsg = CB_GETITEMDATA;
|
||
|
}
|
||
|
|
||
|
cItems = (INT)SendMessage(hwnd, GetCountMsg, 0, 0);
|
||
|
|
||
|
if (cItems >= 0) {
|
||
|
|
||
|
INT iItem;
|
||
|
LONG_PTR ItemData;
|
||
|
|
||
|
for (iItem =0; iItem < cItems; iItem ++) {
|
||
|
ItemData = SendMessage(hwnd, GetDataMsg, iItem, 0);
|
||
|
if (data == ItemData) {
|
||
|
return(iItem);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return(-1);
|
||
|
}
|