/* ** help.h ** ** typedefs & definitions used in the help system and by those who use it. ** ** define: ** HOFFSET - to define buffer pointers (PB's) as handle/offset, else ** they are defined as void far *. */ typedef char f; /* boolean */ typedef unsigned char uchar; typedef unsigned long ulong; typedef unsigned short ushort; /* ** lineattr ** external representation of line attributes, as returned by HelpGetLineAttr */ typedef struct lineattr { /* LA */ ushort attr; /* attribute index */ ushort cb; /* count of bytes */ } lineattr; /* ** mh ** a memory handle is defined for use with systems that use dynamic, moveable ** memory. It is long, so that in simple cases where memory is NOT moveable, ** the handle can contain the far pointer to the base. */ typedef void * mh; /* dynamic memory handle */ /* ** nc ** a context number is a unique id associated with each context string. ** ** fhnc returns the file memory handle from the nc ** fLocal returns TRUE if the context is a uniq context number (local, or ** result of explicit uniq call. */ typedef struct _nc { mh mh; ulong cn; } nc ; /* context number */ // rjsa #define fmhnc(x) ((unsigned)(((unsigned long)x & 0xffff0000L) >> 16)) #define fmhnc(x) ((x).mh) #define fUniq(x) ((x).cn & 0x8000) /* ** topichdr ** header placed (by HelpDecomp) at the begining of every decompressed topic */ typedef struct topichdr { /* TH */ uchar appChar; /* app-specific character const */ uchar linChar; /* character for line removal */ uchar ftype; /* source file type */ ushort lnCur; /* line number last accessed */ ushort lnOff; /* offset into topic for that line*/ } topichdr; /* ** hotspot ** defines the position of an embedded cross reference, or "hotspot". Used by ** HelpHlNext and HelpXRef */ typedef struct hotspot { /* HS */ ushort line; /* the topic line with an xref */ ushort col; /* the starting column of xref */ ushort ecol; /* the ending columng of xref */ uchar far *pXref; /* pointer to xref string */ } hotspot; /* ** helpheader ** This defines the actual structure of a help file header. Provided here ** for HelpGetInfo */ #define HS_count 9 /* number-1 of sections defined */ #pragma pack(1) typedef struct helpheader { /* HH */ ushort wMagic; /* word indicating help file */ ushort wVersion; /* helpfile version */ ushort wFlags; /* flags */ ushort appChar; /* application specific char */ ushort cTopics; /* count of topics */ ushort cContexts; /* count of context strings */ ushort cbWidth; /* fixed width */ ushort cPreDef; /* count of pre-defined contexts*/ uchar fname[14]; /* base file name */ ushort reserved[2]; /* unused */ ulong tbPos[HS_count]; /* positions for file sections */ } helpheader; #pragma pack() /* ** fdb ** Dynamically allocated structure which is created for each open help file. ** Remains allocated for the life of the file. ** ** rgmhSections contains dynamic memory handles. Each open file has various ** dynamic memory buffers associated with it. Each can be present or discarded, ** as memory constrictions determine. If needed and not present, they are ** reloaded from the associated help file. All may be discarded when memory ** gets tight. An entry is defined for each help file section, except for the ** Topics themselves. ** */ typedef struct fdb { /* FDB */ FILE * fhHelp; /* OS file handle */ nc ncInit; /* initial context (includes mh)*/ mh rgmhSections[HS_count-1]; /* dynamic memory handles */ uchar ftype; /* file type */ uchar fname[14]; /* base file name */ ulong foff; /* our file offset, if appended */ nc ncLink; /* nc linking any appended file */ helpheader hdr; /* file header */ } fdb; /* ** helpinfo ** structure of information relating to a help file and/or context returned ** by HelpGetInfo */ typedef struct helpinfo { /* HI */ fdb fileinfo; /* entire fdb copied out */ char filename[1]; /* filename appended to data */ } helpinfo; /* ** Macros for accessing helpinfo data */ #define FHHELP(x) ((x)->fileinfo.fhHelp) #define NCINIT(x) ((x)->fileinfo.ncInit) #define FTYPE(x) ((x)->fileinfo.ftype) #define FNAME(x) ((x)->fileinfo.fname) #define FOFF(x) ((x)->fileinfo.foff) #define NCLINK(x) ((x)->fileinfo.ncLink) #define WMAGIC(x) ((x)->fileinfo.hdr.wMagic) #define WVERSION(x) ((x)->fileinfo.hdr.wVersion) #define WFLAGS(x) ((x)->fileinfo.hdr.wFlags) #define APPCHAR(x) ((x)->fileinfo.hdr.appChar) #define CTOPICS(x) ((x)->fileinfo.hdr.cTopics) #define CCONTEXTS(x) ((x)->fileinfo.hdr.cContexts) #define CBWIDTH(x) ((x)->fileinfo.hdr.cbWidth) #define CPREDEF(x) ((x)->fileinfo.hdr.cPreDef) #define HFNAME(x) ((x)->fileinfo.hdr.fname) #define TBPOS(x) ((x)->fileinfo.hdr.tbPos) /****************************************************************************** ** ** Some versions of the help engine run with SS!=DS, and thus require the ** _loadds attribute on function calls. */ #ifdef DSLOAD #define LOADDS _loadds #else #define LOADDS #endif /****************************************************************************** ** ** PB ** pointer to a buffer. Based on the switch HOFFSET, it is either a ** handle-offset or a far pointer. In the handle/offset case, the high word ** contains a memory handle which must be locked, to get a "real" address, to ** which the offset is added. */ #ifdef HOFFSET #define PB ulong #else #define PB void far * #endif typedef PB pb; /****************************************************************************** ** ** Forward declarations */ void far pascal LOADDS HelpInit (void); void far pascal LOADDS HelpClose(nc); nc far pascal LOADDS HelpOpen(char far *); nc far pascal LOADDS HelpNc(char far *, nc); nc far pascal LOADDS HelpNcCmp (char far *, nc, f (pascal far *)(uchar far *, uchar far *, ushort, f, f)); ushort far pascal LOADDS HelpNcCb(nc); ushort far pascal LOADDS HelpLook(nc, PB); f far pascal LOADDS HelpDecomp(PB, PB, nc); void far pascal LOADDS HelpCtl(PB, f); nc far pascal LOADDS HelpNcNext(nc); nc far pascal LOADDS HelpNcPrev(nc); nc far pascal LOADDS HelpNcUniq(nc); void far pascal LOADDS HelpNcRecord(nc); nc far pascal LOADDS HelpNcBack(void); f far pascal LOADDS HelpSzContext(uchar far *, nc); int far pascal LOADDS HelpGetInfo (nc, helpinfo far *, int); void far pascal LOADDS HelpShrink(void); int far pascal LOADDS HelpGetCells(int, int, char far *, PB, uchar far *); ushort far pascal LOADDS HelpGetLine(ushort, ushort, uchar far *, PB); ushort far pascal LOADDS HelpGetLineAttr(ushort, int, lineattr far *, PB); int far pascal LOADDS HelpcLines(PB); f far pascal LOADDS HelpHlNext(int, PB, hotspot far *); char far * pascal far LOADDS HelpXRef(PB, hotspot far *); /****************************************************************************** ** ** constant declarations ** ** Character attribute bits. These bits are order together to form attribute ** indecies. Data in the help file has associated with it attribute information ** encoded in length/index pairs. Each index is simply a constant which ** indicates which of several attributes should be applied to the characters in ** that portion of the line. */ #define A_PLAIN 0 /* plain, "normal" text */ #define A_BOLD 1 /* emboldened text */ #define A_ITALICS 2 /* italicised text */ #define A_UNDERLINE 4 /* underlined text */ /****************************************************************************** ** ** Help Error Codes. ** ** Return values greater than HELPERR_MAX are valid nc's. */ #define HELPERR_FNF 1 /* OpenFileOnPath failed */ #define HELPERR_READ 2 /* ReadHelpFile failed on header*/ #define HELPERR_LIMIT 3 /* to many open helpfiles */ #define HELPERR_BADAPPEND 4 /* bad appeneded file */ #define HELPERR_NOTHELP 5 /* Not a help file */ #define HELPERR_BADVERS 6 /* newer or incompatible help file */ #define HELPERR_MEMORY 7 /* memory allocation failed */ #define HELPERR_MAX 10 /* max help error */