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

140 lines
4 KiB
C

/**************************************************************************
*HelpGetLine - Return a line of ascii text
*
* Copyright <C> 1988, Microsoft Corporation
*
* Revision History:
*
* 25-Jan-1990 ln LOCATE -> HLP_LOCATE
* 22-Feb-1989 ln Check correctly for end of topic while copying
* line.
* 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
* 11-Nov-1988 ln Adjust cbMax on entry
* 03-Nov-1988 ln Added GQ sensitivity
* [] 22-Sep-1988 LN Created
*
* Notes:
*
* Sensitive to the following switches:
*
* HOFFSET - If defined, handle/offset version
* OS2 - If defined, OS/2 protect mode version
* DSLOAD - If defined, causes DS to be reloaded, if needed
* ASCII - If TRUE, includes ASCII support code
* GQ - If defined, INC BP before saving & DEC before restore
*
**************************************************************************/
#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>
/**** HelpGetLine - Return a line of ascii text
*
* Interpret the help files stored format and return a line at a time of
* ascii text.
*
* ushort far pascal LOADDS HelpGetLine (
* ushort ln, = 1 based line number to return
* ushort cbMax, = Max number of bytes to transfer
* uchar far *pszDst, = pointer to destination
* PB pbTopic = PB pointer to topic text
*
* Output:
* Returns number of characters transfered, or 0 if that line does not exist.
*
*************************************************************************/
USHORT pascal
HelpGetLine (
USHORT ln,
USHORT cbMax,
PUCHAR pszDst,
PB pbTopic
) {
struct topichdr *pT;
USHORT cbTransfered = 0;
PUCHAR pszDstOrg = pszDst;
cbMax--; //adjust to account for terminating zero
pT = PBLOCK(pbTopic);
if (pT) {
PCHAR pLine = hlp_locate(ln, (PCHAR)pT);
if (pLine) {
*pszDst = ' ';
*(pszDst +1) = '\00'; // initialize dest.
if (pT->ftype & FTCOMPRESSED) {
// For compressed files, get the length of the line from the
// first byte, and of course skip that byte. Form the
// maximum byte count ot be transfered as the lesser of the
// actual length of the line or caller cbMax.
USHORT Len = (USHORT)*pLine++ - 1;
if (Len) {
ULONG LongLen;
Len = (Len > cbMax) ? cbMax : Len;
LongLen = Len/sizeof(ULONG);
Len = (USHORT)(Len % sizeof(ULONG));
while (LongLen--) {
*((ULONG UNALIGNED*)pszDst)++ = *((ULONG UNALIGNED *)pLine)++;
}
while (Len--) {
*pszDst++ = *pLine++;
}
*pszDst++ = '\00'; // Null terminate it
cbTransfered = (USHORT)(pszDst - pszDstOrg);
} else {
cbTransfered = 2;
}
} else {
// For non-compressed files, copy one line
PCHAR pSrc = pLine;
CHAR c = *pLine;
if (c == '\n') {
cbTransfered = 2;
} else {
while (c != '\00' && c != '\n') {
c = *pszDst++ = *pLine++;
}
*(pszDst-1) = '\00'; // null terminate it
cbTransfered = (USHORT)(pszDst - pszDstOrg);
}
}
}
PBUNLOCK(pbTopic);
}
return cbTransfered;
}