Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*** helpcell.c - HelpGetCells routine.
* * Copyright <C> 1988, Microsoft Corporation * * Purpose: * * Revision History: * * 25-Jan-1990 ln locate -> hlp_locate * [] 04-Aug-1988 LN Created...split from helpif.c. Added auto-fill. * *************************************************************************/
#include <stdio.h>
#if defined (OS2)
#else
#include <windows.h>
#endif
#include "help.h"
#include "helpfile.h"
#include "helpsys.h"
/************************************************************************
** ** Foward Declarations */ uchar near pascal toupr(uchar);
/************************************************************************
** ** HelpGetCells - Return a string of character / attribute pairs from helpfile ** ** Purpose: ** Interpret the help files stored format and return a line at a time of ** character & attribute information. ** ** Entry: ** ln = 1 based line number to return ** cbMax = Max number of characters to transfer ** pbDst = pointer to destination ** pbTopic = pointer to topic text ** prgAttr = pointer to array of character attributes ** ** Exit: ** returns number of bytes transfered, or -1 if that line does not exist. ** DOES blank fill to the cbMax width. ** ** Exceptions: ** */ int far pascal LOADDS HelpGetCells(ln,cbMax,pbDst,pbTopic,prgAttr) int ln; int cbMax; char far *pbDst; PB pbTopic; uchar far *prgAttr; { ushort cbAttr; /* length of current attribute */ ushort cbAttrCur = 0; /* length of current attribute */ ushort cbSrc; /* count of source characters */ uchar cAttrCur; /* current attribute */ uchar iAttrCur; /* index to current attribute */ uchar far *pTopic; /* pointer to topic */ uchar far *pchSrc; /* pointer to source characters */ topichdr far *pHdr; /* pointer to topic header */
pTopic = PBLOCK (pbTopic); pHdr = (topichdr far *)pTopic; if ((pTopic = hlp_locate((ushort)ln,pTopic)) == NULL)/* locate line */ ln = -1;
else if (pHdr->ftype & FTCOMPRESSED) { ln=0; pchSrc = pTopic; /* point to character data */ pTopic += (*pTopic); /* point to attribute data */ cbAttr = *((ushort far UNALIGNED *)pTopic)++ - (ushort)sizeof(ushort);/* count of attribute bytes */ cbSrc = (ushort)((*pchSrc++) -1); /* get count of characters */
while (cbSrc-- && cbMax--) { /* while characters to get */ /*
* Time for a new attribute. If there are attributes left (cbAttr > 0) then * just get the next one (length & index). If there weren't any left, or the * last one had an index of 0xff (indicating end), then we'll use the index * zero attribute byte, else pick up the current attribute byte and move on * in the attribute string. */ if (cbAttrCur == 0) { if (cbAttr > 0) { cbAttrCur = ((intlineattr far UNALIGNED *)pTopic)->cb; iAttrCur = ((intlineattr far UNALIGNED *)pTopic)->attr; } if ((cbAttr <= 0) || (iAttrCur == 0xff)) cAttrCur = prgAttr[0]; else { cAttrCur = prgAttr[iAttrCur]; ((intlineattr far *)pTopic)++; cbAttr -= 2; } } *((ushort far UNALIGNED *)pbDst)++ = (ushort)((cAttrCur << 8) | *pchSrc++); /* stuff char & attr*/ cbAttrCur--; ln += 2; } } #if ASCII
else { /*
** For ascii files, just copy line over with attr[0] */ ln=0; while (*pTopic && (*pTopic != '\r') && cbMax--) { if (*pTopic == '\t') { pTopic++; do { *((ushort far UNALIGNED *)pbDst)++ = (ushort)((prgAttr[0] << 8) | ' '); ln += 2; } while ((ln % 16) && cbMax--); } else { *((ushort far UNALIGNED *)pbDst)++ = (ushort)((prgAttr[0] << 8) | *pTopic++); ln += 2; } } } #endif
#if 0
/*
* blank fill the rest of the line */ while (cbMax--) *((ushort far UNALIGNED *)pbDst)++ = (prgAttr[0] << 8) | ' '; /* stuff char & attr*/ #endif
PBUNLOCK (pbTopic); return ln; /* end HelpGetCells */}
|