windows-nt/Source/XPSP1/NT/sdktools/mep/help/enginlib/hloc.c
2020-09-26 16:20:57 +08:00

147 lines
3.3 KiB
C

/**************************************************************************
*hlp_locate - locate line in help text
*
* Copyright <C> 1988, Microsoft Corporation
*
* Purpose:
*
* Revision History:
*
* 17-OCt-1990 RJSA translated to C
* 25-Jan-1990 LN renamed to hlp_locate
* 22-Dec-1988 LN Removed MASM High Level Lang support (Need
* to control segments better than that will
* let me)
* 08-Dec-1988 LN CSEG
* [] 18-Aug-1988 LN Created
*
*
**************************************************************************/
#include <stdio.h>
#if defined (OS2)
#define INCL_BASE
#include <os2.h>
#else
#include <windows.h>
#endif
#include <help.h>
#include <helpfile.h>
#include <helpsys.h>
/**** hlp_locate - locate a line in the buffer
* uchar far * near pascal hlp_locate(
* ushort ln,
* uchar far *pTopic
* )
*
* Purpose:
* commonly used routine to find a line in the topic text.
*
* Entry:
* ln = 1 based line number to look for (-1 means return number
* of lines in topic)
* pTopic = Topic text to look for it in
*
* Exit:
* returns pointer to start of line
*
* Exceptions:
* returns NULL on not found
*
**************************************************************************/
PCHAR pascal
hlp_locate (
SHORT ln,
PCHAR pTopic
){
struct topichdr UNALIGNED *pT = (struct topichdr *)pTopic;
PBYTE pSrc = (PBYTE)pTopic;
SHORT lnOrig = ln;
if (pT->lnCur <= (USHORT)ln) {
// Use last past position calculated
ln -= (pT->lnCur );
pSrc += pT->lnOff;
} else {
// Start from beginning
pSrc += sizeof(struct topichdr);
}
if (pT->ftype & FTCOMPRESSED) {
// Compressed file. Walk over each text\attribute pair
// until the desired line is found.
while ( *pSrc && ln) {
pSrc += *pSrc;
pSrc += *(USHORT UNALIGNED *)pSrc;
if ( *pSrc && *(pSrc+1) != pT->linChar ) {
ln--;
}
}
//while (*pSrc && ln) {
//
// if (*(pSrc + 1) != pT->linChar) {
// ln--;
// }
// pSrc += *pSrc;
// pSrc += *(PUSHORT)pSrc;
//}
} else {
// ASCII file
while (*pSrc && ln) {
if (*pSrc != pT->linChar) {
ln--;
}
while (*pSrc && *pSrc != 0x0A) {
pSrc++;
}
if (*pSrc)
pSrc++;
}
}
if (*pSrc) {
// Line found. Update the topic hdr with the pointers to the text
// and line number that we just found, to help speed us up next time.
pT->lnOff = (USHORT)((PBYTE)pSrc - (PBYTE)pT);
pT->lnCur = lnOrig;
} else {
//
// Line not found. Update nothing and return NULL
// (Side Effect: line requested (ln) - line count left (ln) is the
// number of lines in the topic! If original ln is -1, we'll return
// that instead!
if (lnOrig == -1)
pSrc = (PBYTE)IntToPtr(lnOrig - ln);
else
pSrc = (PBYTE)0L;
}
return pSrc;
}