NT4/private/windows/win4help/winhelp/fcmanage.c
2020-09-30 17:12:29 +02:00

185 lines
4.2 KiB
C

/*****************************************************************************
* *
* FCMANAGE.C *
* *
* Copyright (C) Microsoft Corporation 1990-1995 *
* All Rights reserved. *
* *
******************************************************************************
* *
* Module Intent: The Full Contextc Manger is the access layer between *
* the file and it associated format and the run-time text *
* structure. It purpose is to parse out full context *
* points from file and pass handles to blocks of memory *
* containing full-contexts. *
* *
*****************************************************************************/
#include "help.h"
#pragma hdrstop
#include "inc\fcpriv.h"
/*******************
*
- Name: VaFromHfc
-
* Purpose: Returns the address of a particular full context.
*
* Arguments: hfc - Handle to a full context
*
* Returns: -1L if an error is encounterd, vaBEYOND_TOPIC if the current
* full context is not withing the topic, or the actual offset.
*
* Method: Gets value from structure stored at base of handle data
*
******************/
VA STDCALL VaFromHfc(HFC hfc)
{
VA vaRet;
ValidateF(hfc);
vaRet = ((QFCINFO)PtrFromGh(hfc))->vaCurr;
return vaRet;
}
/*******************
*
- Name: HfcNextPrevHfc
-
* Purpose: Return the next or previous full context in the help file.
*
* Arguments: hfc - Handle to some full context in the file
* fDir - direction - next FC if TRUE, previous if FALSE.
* vaMarkTop - the first FC in this layout.
* vaMarkBottom - the first FC in the next layout.
*
* Returns: FCNULL if at the end/beginning of the topic
*
* Notes: HfcNextHfc() and HfcPrevHfc() are macros calling this function.
*
******************/
HFC STDCALL HfcNextPrevHfc(HFC hfc, BOOL fNext, QDE qde, int* qwErr,
VA vaMarkTop, VA vaMarkBottom)
{
VA va;
QFCINFO qfcinfo;
QB qb;
MOBJ mobj;
int bType;
*qwErr = wERRS_NO;
qfcinfo = (QFCINFO)PtrFromGh(hfc);
ASSERT(qfcinfo->vaCurr.dword != vaNil);
if (qfcinfo->vaCurr.dword == vaMarkTop.dword && !fNext) {
*qwErr = wERRS_FCEndOfTopic;
return FCNULL;
}
va = (fNext) ? qfcinfo->vaNext : qfcinfo->vaPrev;
if (va.dword == vaMarkBottom.dword && fNext) {
*qwErr = wERRS_FCEndOfTopic;
return FCNULL;
}
/* (kevynct)
* Note! The caller is responsible for freeing the old FC.
*/
if ((hfc = HfcCreate(qde, va, qwErr)) == FCNULL) {
return FCNULL;
}
qb = (QB)QobjLockHfc(hfc);
#ifdef _X86_
CbUnpackMOBJ((QMOBJ)&mobj, qb);
#else
CbUnpackMOBJ((QMOBJ)&mobj, qb, QDE_ISDFFTOPIC(qde));
#endif
bType = mobj.bType;
if (bType == bTypeTopic) {
FreeGh(hfc);
*qwErr = wERRS_FCEndOfTopic;
return FCNULL;
}
return hfc;
}
/*******************
*
- Name: 284 QchLockHfc
-
* Purpose: Gets the pointer to the acutal text of a full context
*
* Arguments: hfc - Handle to a full context
*
* Returns: Pointer to an object, FCNULL indicates
* an error.
*
* +++
*
* Method: Locks handle and returns pointer + size of full context
* information at base of handle data.
*
******************/
QB STDCALL QobjLockHfc(HFC hfc)
{
PSTR qch;
ASSERT(hfc);
if (hfc == FCNULL) /* Bad handle */
return FCNULL;
qch = (LPSTR)PtrFromGh(hfc);
qch += sizeof(FCINFO); /* Index past structure to data */
return qch;
}
/*******************
*
- Name: CbDiskHfc
-
* Purpose: Gets the disk size of an HFC
*
* Arguments: hfc - Handle to a full context
*
* Returns: Size of compressed file.
*
******************/
LONG STDCALL CbDiskHfc(HFC hfc)
{
ASSERT(hfc);
return (LONG)((QFCINFO)PtrFromGh(hfc))->lcbDisk;
}
/*******************
*
- Name: CbUncompressedHfc
-
* Purpose: Gets uncompressed size of an HFC
*
* Arguments: hfc - Handle to a full context
*
* Returns: Size of uncompressed FC.
*
******************/
LONG STDCALL CbTextHfc(HFC hfc)
{
ASSERT(hfc);
return (LONG)((QFCINFO)PtrFromGh(hfc))->lcbText;
}
COBJRG STDCALL CobjrgFromHfc(HFC hfc)
{
ASSERT(hfc);
return (COBJRG)((QFCINFO)PtrFromGh(hfc))->cobjrgP;
}