175 lines
3.5 KiB
C
175 lines
3.5 KiB
C
/****************************** Module Header ******************************\
|
|
* Module Name: DMGHSZ.C
|
|
*
|
|
* This module contains functions used for HSZ control.
|
|
*
|
|
* Created: 8/2/88 sanfords, Microsoft
|
|
* Modified: 6/5/90 Rich Gartland, Aldus (Win 3.0)
|
|
*
|
|
* Copyright (c) 1988, 1989 Microsoft Corporation
|
|
* Copyright (c) 1990 Aldus Corporation
|
|
\***************************************************************************/
|
|
#include "ddemlp.h"
|
|
|
|
|
|
ATOM FindAddHszHelper(LPSTR psz, BOOL fAdd);
|
|
|
|
/*********************** HSZ management functions *************************\
|
|
* An HSZ is an atom with a NULL tacked onto it in the HIWORD
|
|
* of the HSZ.
|
|
*
|
|
* WINDOWS 3.0 IMPLEMENTATION NOTE:
|
|
* Since under Windows there is only the local atom table or the (single)
|
|
* global atom table (and we need to use the global table to work right),
|
|
* we always have an atom table index of 0. When we run out of atom table
|
|
* space, future hsz adds return failure.
|
|
*
|
|
* History:
|
|
* Created 9/12/89 Sanfords
|
|
\***************************************************************************/
|
|
|
|
|
|
BOOL FreeHsz(a)
|
|
ATOM a;
|
|
{
|
|
if (!a)
|
|
return(TRUE);
|
|
#ifdef DEBUG
|
|
cAtoms--;
|
|
#endif
|
|
MONHSZ(a, MH_INTDELETE, GetCurrentTask());
|
|
if (GlobalDeleteAtom(a)) {
|
|
DEBUGBREAK();
|
|
return(FALSE);
|
|
}
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
|
|
BOOL IncHszCount(a)
|
|
ATOM a;
|
|
{
|
|
char aChars[255];
|
|
|
|
if (a == NULL)
|
|
return(TRUE);
|
|
#ifdef DEBUG
|
|
cAtoms++;
|
|
#endif
|
|
MONHSZ(a, MH_INTKEEP, GetCurrentTask());
|
|
if (GlobalGetAtomName(a, (LPSTR)aChars, 255))
|
|
return(GlobalAddAtom((LPSTR)aChars));
|
|
else {
|
|
AssertF(FALSE, "Cant increment atom");
|
|
return(FALSE);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/***************************** Private Function ****************************\
|
|
* Returns the length of the hsz given without NULL terminator.
|
|
* Wild HSZs have a length of 0.
|
|
*
|
|
* History:
|
|
* Created 9/12/89 Sanfords
|
|
\***************************************************************************/
|
|
WORD QueryHszLength(hsz)
|
|
HSZ hsz;
|
|
{
|
|
WORD cb;
|
|
char aChars[255];
|
|
|
|
if (LOWORD(hsz) == 0L)
|
|
return(0);
|
|
|
|
if (!(cb = GlobalGetAtomName(LOWORD(hsz), (LPSTR)aChars, 255))) {
|
|
AssertF(FALSE, "Cant get atom length");
|
|
return(0);
|
|
}
|
|
|
|
if (HIWORD(hsz))
|
|
cb += 7;
|
|
|
|
return(cb);
|
|
}
|
|
|
|
|
|
|
|
|
|
WORD QueryHszName(hsz, psz, cchMax)
|
|
HSZ hsz;
|
|
LPSTR psz;
|
|
WORD cchMax;
|
|
{
|
|
register WORD cb;
|
|
|
|
if (LOWORD(hsz) == 0) {
|
|
if (cchMax)
|
|
*psz = '\0';
|
|
return(0);
|
|
}
|
|
|
|
cb = GlobalGetAtomName(LOWORD(hsz), psz, cchMax);
|
|
if (cb && HIWORD(hsz) && (cb < cchMax - 7)) {
|
|
wsprintf(&psz[cb], ":(%04x)", HIWORD(hsz));
|
|
cb += 7;
|
|
}
|
|
return cb;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/***************************** Private Function ****************************\
|
|
* This finds the hsz for psz depending on fAdd.
|
|
*
|
|
* History:
|
|
* Created 9/12/89 Sanfords
|
|
\***************************************************************************/
|
|
ATOM FindAddHsz(psz, fAdd)
|
|
LPSTR psz;
|
|
BOOL fAdd;
|
|
{
|
|
if (psz == NULL || *psz == '\0')
|
|
return(0L);
|
|
|
|
return(FindAddHszHelper(psz, fAdd));
|
|
}
|
|
|
|
|
|
|
|
|
|
ATOM FindAddHszHelper(psz, fAdd)
|
|
LPSTR psz;
|
|
BOOL fAdd;
|
|
{
|
|
ATOM atom;
|
|
|
|
atom = fAdd ? GlobalAddAtom(psz) : GlobalFindAtom(psz);
|
|
if (fAdd) {
|
|
#ifdef DEBUG
|
|
cAtoms++;
|
|
#endif
|
|
MONHSZ(atom, MH_INTCREATE, GetCurrentTask());
|
|
}
|
|
|
|
return(atom);
|
|
}
|
|
|
|
|
|
|
|
HSZ MakeInstAppName(
|
|
ATOM a,
|
|
HWND hwndFrame)
|
|
{
|
|
// make upper half of HSZ be HWND FRAME for now.
|
|
IncHszCount(a);
|
|
return((HSZ)MAKELONG(a, hwndFrame));
|
|
}
|
|
|