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

236 lines
8.2 KiB
C

/*
** 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 */