[comp.sources.amiga] v89i188: hyperhelp - amiga help system, Part02/03

page%swap@Sun.COM (Bob Page) (10/26/89)

Submitted-by: jap@syssun.cl.msu.edu (Joe A. Porkka)
Posting-number: Volume 89, Issue 188
Archive-name: applications/hyphelp.2

# This is a shell archive.
# Remove anything above and including the cut line.
# Then run the rest of the file through 'sh'.
# Unpacked files will be owned by you and have default permissions.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar: SHell ARchive
# Run the following text through 'sh' to create:
#	gc2.c
#	gen.c
#	getenv.c
#	getfile.c
#	grandcentral.c
#	help.h
# This is archive 2 of a 3-part kit.
# This archive created: Wed Oct 25 10:02:51 1989
echo "extracting gc2.c"
sed 's/^X//' << \SHAR_EOF > gc2.c
X/* These functions should be in grandcentral.c */
X
X#include <intuition/intuition.h>
X#include <exec/io.h>
X#include <exec/memory.h>
X#include "help.h"
X#include "helptext.h"
X
Xextern struct NewWindow nw;
Xextern int debug, stdout;
Xextern struct Screen *screen;
Xextern struct MsgPort *mp;
X
Xextern ULONG ENVRefresh, ENVNumClicks, ENVAskFirst;
Xextern struct Task *mytask;
X
X/* From print.c */
Xextern struct IOStdReq *printreq;
X/* grandcentral.c */
Xextern short openroot, closeall, hideall, goaway, findabout, checkflags;
Xextern int printing, printbuflen;
Xextern u_char *printbuf;
Xextern struct openwindows *printow;
X
X#define SETREFRESH(ow) ((struct openwindows *)ow)->flags|=ow_REFRESH
X#define CLRREFRESH(ow) ((struct openwindows *)ow)->flags&=~ow_REFRESH
X
Xextern ULONG prevsecs, prevmicros;
Xextern u_short clickx, clicky, clickcount;
Xextern struct key key;
X
XULONG lastclicksecs, lastclickmicros;
X
X/* flipwindow()
X   Flip a window between icon and full size.
X   Also can be used to re-open hidden windows.
X*/
Xint
Xflipwindow(tmpow,flag)
X    struct openwindows *tmpow;
X    int flag; /* 0==flip window, 1==re-open window */
X{
X    short left, top, wide, high;
X
X    nw.Screen=screen;
X    SETREFRESH(tmpow);
X    if(tmpow->window) {
X	getdims(tmpow);
X	left=tmpow->LeftEdge,
X	top =tmpow->TopEdge,
X	wide=tmpow->Width,
X	high=tmpow->Height;
X
X#ifdef DEBUG1
X	dmsg(1,"flip window\n");
X#endif
X	CWS(tmpow->window, tmpow->doc->savefont);
X	tmpow->window=0;
X	nw.LeftEdge=tmpow->saveleft;
X	nw.TopEdge=tmpow->savetop;
X	nw.Width=tmpow->savewide;
X	nw.Height=tmpow->savehigh;
X
X	tmpow->saveleft=left;
X	tmpow->savetop=top;
X	tmpow->savewide=wide;
X	tmpow->savehigh=high;
X    } else {
X#ifdef DEBUG1
X	dmsg(1,"Open hidden window\n");
X#endif
X	nw.LeftEdge=tmpow->LeftEdge;
X	nw.TopEdge=tmpow->TopEdge;
X	nw.Width=tmpow->Width;
X	nw.Height=tmpow->Height;
X	nw.MinWidth=tmpow->MinWidth;
X	nw.MinHeight=tmpow->MinHeight;
X    }
X
X    /* Open full size window if ICONIZED or hidden and !iconized */
X    if( (flag && !(tmpow->flags & ow_ICONIZED)) || ((!flag) && (tmpow->flags & ow_ICONIZED)) ) {
X#ifdef DEBUG1
X	dmsg(1,"OPEN BIG WINDOW\n");
X#endif
X	if(!flag) {
X	    nw.MinWidth=tmpow->saveminwidth;
X	    nw.MinHeight=tmpow->saveminheight;
X	}
X	nw.DetailPen=-1;
X	nw.BlockPen=-1;
X	nw.Flags=HELPWINDOWFLAGS | ENVRefresh;
X	nw.Title=tmpow->doc->body->comment;
X	nw.FirstGadget=tmpow->scroll;
X	tmpow->scroll->NextGadget=tmpow->up;
X	tmpow->up->NextGadget=tmpow->down;
X	tmpow->down->NextGadget=0;
X	tmpow->icon->NextGadget=0;
X	tmpow->window=OpenWindow(&nw);
X	if(tmpow->window==0) {
X#ifdef DEBUG5
X	    dmsg(5,"OPEN BIG WINDOW failed!\n");
X#endif
X	    return 0;
X	}
X	tmpow->window->UserPort=mp;
X	ModifyIDCMP(tmpow->window, HELPWINDOWIDCMPFLAGS);
X	AddGadget(tmpow->window,tmpow->icon,0);      /* Put the ICON gadget at the head of the class */
X	RefreshGList(tmpow->icon,tmpow->window,0,1); /* ...and make it appear */
X	SetDrMd(tmpow->window->RPort,JAM1);
X	if(tmpow->doc->savefont) SetFont(tmpow->window->RPort,tmpow->doc->savefont);
X	tmpow->window->UserData=(BYTE *)tmpow;
X	if(!flag) tmpow->flags &= ~ow_ICONIZED;
X	if((tmpow->doc->linespace+tmpow->window->RPort->Font->tf_YSize)*3 < tmpow->window->MinHeight) {
X	    tmpow->window->RPort->TxHeight=tmpow->window->RPort->Font->tf_YSize+tmpow->doc->linespace;
X	}
X	makemenu(tmpow->window);
X    } else {
X#ifdef DEBUG1
X	dmsg(1,"OPEN ICON WINDOW\n");
X#endif
X	nw.DetailPen=0;
X	nw.BlockPen=3;
X	nw.Flags=HELPICONWINDOWFLAGS;
X	nw.FirstGadget=0;
X	nw.Title=tmpow->doc->body->comment;
X	nw.MinHeight=2;
X	nw.MinWidth=2;
X	tmpow->window=OpenWindow(&nw);
X	if(tmpow->window==0) {
X#ifdef DEBUG5
X	    dmsg(5,"OPEN ICON WINDOW failed!\n");
X#endif
X	    return 0;
X	}
X	tmpow->window->UserPort=mp;
X	ModifyIDCMP(tmpow->window, HELPICONWINDOWIDCMPFLAGS);
X	AddGadget(tmpow->window,tmpow->icon,0);      /* Put the ICON gadget at the head of the class */
X	RefreshGList(tmpow->icon,tmpow->window,0,1); /* ...and make it appear */
X	tmpow->window->UserData=(BYTE *)tmpow;
X	if(!flag) tmpow->flags |= ow_ICONIZED;
X	makemenu(tmpow->window);
X    }
X    getdims(tmpow);
X    return 1;
X}
X
Xvoid
Xgetdims(tmpow)
X    struct openwindows *tmpow;
X{
X    LockLayerRom(tmpow->window->WLayer);
X    tmpow->Height = tmpow->window->Height;
X    tmpow->Width = tmpow->window->Width;
X    tmpow->LeftEdge = tmpow->window->LeftEdge;
X    tmpow->TopEdge = tmpow->window->TopEdge;
X    tmpow->MinWidth= tmpow->window->MinWidth;
X    tmpow->MinHeight= tmpow->window->MinHeight;
X    UnlockLayerRom(tmpow->window->WLayer);
X}
X
Xvoid
Xscrollit(ow)
X    struct openwindows *ow;
X{
X    int line;
X    line= (((struct PropInfo *)ow->scroll->SpecialInfo)->VertPot*(ow->doc->l_count - ow->high)) >>16;
X    moveto(ow,line);
X    SETREFRESH(ow);
X}
X
X/*
Xvoid
Xcancelprintjob() {
X    printitout();
X    if(printing) {
X	dmsg(1,"Cancel print job! printing=%ld\n",printing);
X	printing=0;
X	if(printow) {
X	    closewindow(printow);
X	    printow=0;
X	    dmsg(1,"About to dnit print\n");
X	    printdnit();
X	}
X	dmsg(1,"About to free printbuffer...");
X	if(printbuf && printbuflen) FreeMem(printbuf,printbuflen);
X	printbuf=0;
X	printbuflen=0;
X	dmsg(1,"Freed!\n");
X    } else {
X       dmsg(1,"CANCEL PRINT WHILE NOT PRINTING==0!\n");
X    }
X    printitout();
X}
X*/
Xvoid checkclicks(im,tmpow)
X    struct IntuiMessage *im;
X    struct openwindows *tmpow;
X{
X    if (!(im->Seconds>lastclicksecs || (im->Seconds==lastclicksecs && im->Micros>=lastclickmicros))) {
X	return; /* Avoid allowing user to accidently (or purposely)doubleclick a second time on something,
X		   before we get to take care of the first
X		 */
X    }
X    if(prevsecs==0) {
X	clickcount=1;
X	clickx=im->MouseX;
X	clicky=im->MouseY;
X    }
X    if(     ((clickx-im->MouseX)*(clickx-im->MouseX)+
X	    (clicky-im->MouseY)*(clicky-im->MouseY))
X	<
X	    ((tmpow->window->RPort->TxHeight)*(tmpow->window->RPort->TxHeight))
X    ) {
X	if(DoubleClick(prevsecs,prevmicros,im->Seconds,im->Micros) || ENVNumClicks==1) {
X	    clickcount++;
X	    if(clickcount>=ENVNumClicks) {
X		clickcount=0;
X		prevsecs=0; /* Prevent triple clicks */
X#ifdef DEBUG1
X		dmsg(1,"SELECT CLICK\n");
X#endif
X		findword(tmpow,(int)im->MouseX,(int)im->MouseY, &key);
X		if(key.name) {
X#ifdef DEBUG1
X		    dmsg(1,"Type is ");
X#endif
X		    if(key.type) {
X			int len;
X			u_char *tmpcmd;
X
X			dmsg(1,"execute '%s'",key.name);
X			if(askforexec(tmpow->window,key.name)) {
X			    len=strlen(key.name)+17;
X			    tmpcmd=(u_char *)AllocMem(len,0);
X			    if(tmpcmd) {
X				strncpy(tmpcmd,"run <nil: >nil: ",17);
X				strncpy(tmpcmd+16,key.name,len);
X				Execute(tmpcmd,0,stdout);
X#ifdef DEBUG1
X				dmsg(1,"\nReturncode==%ld\n",IoErr());
X#endif
X				if(tmpcmd) FreeMem(tmpcmd,len);
X			    } else {
X#ifdef DEBUG5
X				dmsg(5,"** Out-of-mem, could not execute!\n");
X#endif
X			    }
X			    CurrentTime(&lastclicksecs,&lastclickmicros);
X			} else {
X			    dmsg(1,"Execute aborted!\n");
X			    DisplayBeep(tmpow->window->WScreen);
X			}
X		    } else {
X			struct openwindows *tmpow2;
X			u_char *tmpname, len;
X#ifdef DEBUG1
X			dmsg(1,"reference");
X			dmsg(1,".\nFileName='%s'\n",key.name);
X			dmsg(1,"Opening up the reference\n");
X#endif
X			tmpname=strchr(key.name,(u_char)',');
X			if(tmpname) {
X			    len=tmpname-key.name-1; /*Length of label*/
X			    while(*tmpname==' ' || *tmpname=='\t') tmpname++;
X			    tmpow2=getfile(tmpname);
X			} else {
X			    tmpow2=getfile(key.name);
X			}
X			CurrentTime(&lastclicksecs,&lastclickmicros);
X			if(tmpow2==0) {
X#ifdef DEBUG1
X			    dmsg(1,"Could not open referenced file.\n");
X#endif
X			    DisplayBeep(tmpow->window->WScreen);
X			} else {
X			    tmpow=tmpow2;
X			    if(tmpname) {
X#ifdef DEBUG1
X				dmsg(1,"GOTO ");
X#endif
X				if(tmpow->doc->labs && tmpow->doc->lab_count) {
X				    int j;
X#ifdef DEBUG1
X				    if(debug) {
X					int i;
X					dmsg(1,"Searching for label '");
X					for(i=0;i<len;i++) dmsg(1,"%lc",key.name[i]);
X					dmsg(1,"'.\n");
X				    }
X#endif
X				    for(j=0;j<tmpow->doc->lab_count;j++) {
X					if(strnicmp(key.name,tmpow->doc->labs[j].name,len)==0) {
X					    tmpow->doc->pnum=tmpow->doc->labs[j].paragraph;
X					    tmpow->doc->lnum=tmpow->doc->labs[j].line;
X					    fixscrollgadget(tmpow);
X#ifdef DEBUG1
X					    dmsg(1,"Found!, pnum=%ld, lnum=%ld.\n",tmpow->doc->pnum, tmpow->doc->lnum);
X#endif
X					    break;
X					}
X				    }
X				}
X			    }
X			    refresh(tmpow);
X			}
X		    }
X		    if(key.length) {
X#ifdef DEBUG1
X			dmsg(1,"Freeing memory for key==%ld.\n",key.length);
X#endif
X			FreeMem(key.name,key.length);
X			key.length=0;
X		    }
X		} else {
X#ifdef DEBUG1
X		    dmsg(1,"FileName='<nil>'.\n");
X#endif
X		}
X	    } else {
X		prevsecs=im->Seconds;
X		prevmicros=im->Micros;
X	    }
X	} else {
X	    prevsecs=im->Seconds;
X	    prevmicros=im->Micros;
X	    clickcount=1;
X	}
X    } else {
X	clickcount=0;
X	prevsecs=prevmicros=0;
X    }
X}
X
Xvoid
Xprocessmenuevent(menunumber,MenuStrip, tmpow)
X    USHORT menunumber;
X    struct Menu *MenuStrip;
X    struct openwindows *tmpow;
X{
X    struct MenuItem *item, *ItemAddress();
X    if(menunumber!=MENUNULL) {
X
X	while(menunumber!=MENUNULL) {
X	    item=ItemAddress(MenuStrip,menunumber);
X#ifdef DEBUG1
X	    dmsg(1,"Menu menunumber=%lx.\n",menunumber);
X	    dmsg(1,"Menu==%ld, Item=%ld, SubItem=%ld",
X		MENUNUM(menunumber), ITEMNUM(menunumber), SUBNUM(menunumber));
X#endif
X
X	    switch(MENUNUM(menunumber)) {
X		case 0: /* MENU: Control */
X		    switch(ITEMNUM(menunumber)) {
X			case 0: /* ITEM: Open A file */
X#ifdef DEBUG1
X			    dmsg(1,"Open a file -- Not Implemented yet!\n");
X#endif
X			    break;
X			case 1: /* ITEM: Open root file */
X#ifdef DEBUG1
X			    dmsg(1,"Open root file!\n");
X#endif
X			    openroot=1;
X			    checkflags++;
X			    break;
X			case 2: /* ITEM: Close all windows */
X#ifdef DEBUG1
X			    dmsg(1,"Close selected!\n");
X#endif
X			    closeall=1;
X			    checkflags++;
X			    break;
X			case 3: /* ITEM: Hide all windows */
X#ifdef DEBUG1
X			    dmsg(1,"Hide selected!\n");
X#endif
X			    hideall=1;
X			    break;
X			case 4: /* ITEM: Go away completely */
X#ifdef DEBUG1
X			    dmsg(1,"Go away\n");
X#endif
X			    goaway=1;
X			    break;
X			case 5: /* ITEM: About */
X			    dmsg(1,"About\n");
X			    findabout=1;
X			    break;
X		    }
X		    break;
X		case 1: /* MENU: Print */
X		    switch(ITEMNUM(menunumber)) {
X			case 0: /* ITEM: Print window */
X			    checkflags++;
X			    tmpow->flags|= ow_PRINTWINDOW;
X			    break;
X			case 1: /* ITEM: Print file */
X			    checkflags++;
X			    tmpow->flags|= ow_PRINTFILE ;
X			    break;
X			case 2: /* ITEM: Cancel prints */
X			    if(printing) printing=6;
X			    break;
X		    }
X		    break;
X
X	    }
X	    menunumber=item->NextSelect;
X	}
X
X    } else {
X#ifdef DEBUG1
X	dmsg(1,"No menu pick.\n");
X#endif
X    }
X}
SHAR_EOF
echo "extracting gen.c"
sed 's/^X//' << \SHAR_EOF > gen.c
X/* HyperHelp -- Copyright 1989 Joe Porkka */
X
X/* gen.c -- General usage routines. Some are duplicates from the
X	    standard C library, but are duplicated here to avoid
X	    linking with the C library.
X*/
X
Xchar *arg(len,str)
X    register int *len;
X    register char **str;
X{
X    register int x;
X    register char *s,*a,quote=0;
X
X    x=*len; s=*str;
X    while(x>=0 && (*s==' ' || *s=='\t' || *s=='\n')) {x--; s++;}
X    if(*s=='\'' || *s=='"') {quote=*s++; x--;}
X    a=s;
X    if(quote) {
X	while(x>=0 && (*s!='\'' && *s!='"')) {x--;s++;}
X    } else {
X	while(x>=0 && (*s!=' ' && *s!='\t' && *s!='\n')) {x--; s++;}
X    }
X    *s=0;
X    *str=s+1;
X    *len=x;
X    return(a);
X}
X
Xchar *
Xstrchr(s,c)
X    register char *s,c;
X{
X    if(s==0) return 0;
X    while(*s!=0) if(*s++==c) return s;
X    return 0;
X}
X
Xint
Xstrncpy(to,from,max)
X    register char *to, *from;
X    register int max;
X{
X    register int k;
X
X    for(k=0;k<max;k++)
X	if( ( *to++ = *from++ )==0) break;
X    return k;
X}
X
Xint
Xstrlen(to)
X    register char *to;
X{
X    register int x=0;
X    while(*to++) x++;
X    return (x);
X}
X
Xstrcmp(this,that)
X    register char *this, *that;
X{
X    register int i,j;
X
X    if(this==0 && that==0) return(0);
X    i=strlen(this);
X    j=strlen(that);
X    while(*this++==*that++ && i>0 && j>0) {
X	i--; j--;
X    };
X    if(i==0 && j==0) return(0);
X    if( *--this < *--that ) return(-1);
X    if( *this>*that ) return(1);
X    if(i) return(1); else return(-1);
X}
X
Xint
Xstrnicmp(this,that,n)
X    register char *this, *that;
X    register int n;
X{
X    register int i=0;
X    register char a,b;
X
X    if(this==0 && that==0) return(0);
X    while(i<n) {
X	a=*this++;
X	b=*that++;
X	if(a!=b) {
X	    if(a==0) return -1;
X	    if(b==0) return  1;
X	    if(a>='a' && a<='z')
X		a-=32;
X	    if(b>='a' && b<='z')
X		b-=32;
X
X	    if(a!=b) break;
X	} else if(a==0) return 0;
X	i++;
X    };
X    return (int) (a-b);
X}
X
Xint
Xstrfind(str,what)
X    char *str, *what;
X{
X    register char a,b, *pos, *pat;
X
X    if(str==0 && what==0 || what==0) return(0);
X    for(pos=str; *pos!=0; pos= ++str) {
X	pat=what;
X	while( (b=*pat++)!=0 ) {
X	    a=*pos++;
X	    if(a==0) return 1;
X	    if(a!=b) {
X		if(a>='a' && a<='z')
X		    a-=32;
X		if(b>='a' && b<='z')
X		    b-=32;
X
X		if(a!=b) break;
X	    }
X	}
X	if(b==0) return 0;
X    }
X    return 1;
X}
SHAR_EOF
echo "extracting getenv.c"
sed 's/^X//' << \SHAR_EOF > getenv.c
X/* HyperHelp -- Copyright 1989 Joe Porkka */
X
X/* getenv.c -- reads the ENV: vars into internal variables */
X
X#include <exec/types.h>
X#include <exec/tasks.h>
X#include <graphics/text.h>
X#include <exec/memory.h>
X#include <libraries/dosextens.h>
Xextern struct Task *mytask;
X#define MEMF_NAMED 0x10000000
X#define AllocMem allocmem
X#define FreeMem freemem
X
X
X/* DESCRIPTION OF ENV: VARIABLES:
X   ==============================
X
X * NoSetFont		If this exists, then the FONT directive in files
X			will be ignored.
X
X * Font = name.font n	Sets the default font for files that do not specify
X			a font. If NoSetFont exists, then all files will
X			use this font.
X
X * HotKey = code,qual	Sets the hotkey to scancode 'code' with
X			'qual' qualifiers (exclusively) set.
X
X * RootFile = path	Sets what the root of the helpfiles are.
X			This defaults to "help:toplevel"
X
X * Screen =		Can be set to WBENCHSCREEN or CUSTOMSCREEN.
X
X * Pen = n		Sets the default text pen color.
X
X * Paper = n		Sets the default 'paper' color.
X
X * Top			Sets the default position
X * Left 		and size of help windows.
X * Width		These values are range checked
X * Height		for safeties sake.
X
X * XInc 		Sets the X and Y increments to offset
X * YInc 		windows to avoid overlaps.
X
X*/
X
X#define HELPCODE 0x5f
X#define HELPQUAL 0x0040
X#define ENVBUFSIZE 100
X#define ROOTFILE "help:toplevel"
X
Xchar *envbuf;
X
Xint NoSetFont, NoHotKey, ScreenType, ENVAskFirst;
X
Xunsigned int HotKeyCode, HotKeyQual, PenColor;
Xint ENVTop, ENVLeft, ENVWidth, ENVHeight, ENVXInc, ENVYInc;
Xint ENVLspace,ENVNumClicks;
Xunsigned char *ENVRootFile, *ENVIndexFile;
Xstruct TextAttr *ENVFont;
Xunsigned long ENVRefresh;
X
Xint nsetflag ;
Xextern int oserr;
Xextern int debug;
X
Xint
Xgetenv() {
X    int length;
X    struct Process *myproc=(struct Process *)mytask;
X    APTR tmpptr;
X
X    oserr=0;
X    NoSetFont=0; NoHotKey=0;
X    ENVAskFirst=1;
X    ENVFont=0;
X    PenColor=-1;
X    ScreenType=0; /* WBenchscreen */
X
X    envbuf=(char *)AllocMem(ENVBUFSIZE,0);
X    if(envbuf==0) return 0;
X
X    /* Disable the "Insert Volume ENV:" garbage */
X    tmpptr=myproc->pr_WindowPtr;
X#ifdef DEBUG1
X    dmsg(1,"Process WindowPtr=0x%lx.\n",myproc->pr_WindowPtr);
X#endif
X    myproc->pr_WindowPtr= (APTR)-1; /* keep the requesters away */
X    HotKeyCode = getnumvar("ENV:HELPHotKeyCode");
X    if(oserr==218) {
X    /* If ENV: not mounted, then don't keep trying to access it */
X	FreeMem(envbuf,ENVBUFSIZE);
X	envbuf=0;
X	HotKeyCode= HELPCODE;
X	HotKeyQual= HELPQUAL;
X	myproc->pr_WindowPtr=tmpptr;
X	return 0;
X    }
X    ENVAskFirst=0; /* Make it default to on, unless there is an envronment */
X    if(oserr==205) { /* File did not exist */
X	HotKeyCode= HELPCODE;
X    }
X    HotKeyQual = getnumvar("ENV:HELPHotKeyQual");
X    if(oserr==205) { /* File did not exist */
X	HotKeyQual= HELPQUAL;
X    }
X    PenColor   = getnumvar("ENV:HELPPenColor");
X    if(oserr==205) {
X#ifdef DEBUG5
X	dmsg(5,"OSERR=205, pencolor=%ld\n",PenColor);
X#endif
X	PenColor=-1;
X    }
X    if(PenColor==0) PenColor=1;
X#ifdef DEBUG1
X    dmsg(1,"GETENV: Pencolor=%ld\n",PenColor);
X#endif
X    ENVTop	  = getnumvar("ENV:HELPTop");
X    ENVLeft	  = getnumvar("ENV:HELPLeft");
X    ENVWidth	  = getnumvar("ENV:HELPWidth");
X    ENVHeight	  = getnumvar("ENV:HELPHeight");
X    ENVXInc	  = getnumvar("ENV:HELPXInc");
X    ENVYInc	  = getnumvar("ENV:HELPYInc");
X    ENVLspace	  = getnumvar("ENV:HELPLspace");
X    ENVNumClicks  = getnumvar("ENV:HELPNumClicks");
X    if(ENVNumClicks<1 || ENVNumClicks >4) ENVNumClicks=2;
X
X    length = getvar("ENV:HELPSCREEN");
X    if(length) {
X#ifdef DEBUG1
X	/* dmsg(1,"Screen = '%s'\n",envbuf); */
X#endif
X	if(strfind(envbuf,"custom")==0) {
X	    ScreenType=1;
X	}
X	if(strfind(envbuf,"interlace")==0) {
X	    ScreenType|=2;
X	}
X    }
X    length = getvar("ENV:HELPREFRESH");
X    if(length) {
X	if(strnicmp("smart_refresh",envbuf,13)==0 || strnicmp("smart",envbuf,5)==0) {
X	    ENVRefresh=1;
X	}
X    }
X
X    length=getvar("ENV:HELPNoSetFont");
X    if(length==-1)
X	NoSetFont=0;
X    else
X	NoSetFont=1;
X
X    length=getvar("ENV:HELPAskFirst");
X    if(length==-1)
X	ENVAskFirst=0;
X    else
X	ENVAskFirst=1;
X
X    length=getvar("ENV:HELPNoHotKey");
X    if(length==-1)
X	NoHotKey=0;
X    else
X	NoHotKey=1;
X
X    length=getvar("ENV:HELPFont");
X    if(length==-1) {
X	ENVFont=0;
X    } else {
X	int j,t;
X
X	envbuf[length]=0;
X	for(j=0;envbuf[j]!=0 && envbuf[j]!=' ';j++);
X	ENVFont=(struct TextAttr *)AllocMem(sizeof(struct TextAttr),MEMF_CLEAR | MEMF_NAMED,"getenv TextAttr");
X	if(ENVFont) {
X	    ENVFont->ta_Name = (STRPTR) AllocMem(j,0|MEMF_NAMED,"getenv fontname");
X	    if(ENVFont->ta_Name) {
X		strncpy(ENVFont->ta_Name,envbuf,j);
X		ENVFont->ta_Name[j]=0;
X
X		dmsg(1,"getenv: Font name is '%s'\t",ENVFont->ta_Name);
X
X		while(envbuf[j]==' ')j++;
X		t=0;
X		while(envbuf[j]<='9' && envbuf[j]>='0') {
X		    t=t*10+ envbuf[j]-'0';
X		    j++;
X		}
X		ENVFont->ta_YSize=t;
X
X		dmsg(1,"getenv: Font height =%ld.\n",t);
X
X	    } else {
X		FreeMem(ENVFont,sizeof(struct TextAttr));
X		ENVFont=0;
X	    }
X	}
X    }
X    length=getvar("ENV:ENVRootFile");
X    if(length==-1) {
X	ENVRootFile=0;
X    } else {
X	envbuf[length]=0;
X	ENVRootFile=(char *)AllocMem(length+1,0);
X	if(ENVRootFile) strncpy(ENVRootFile,envbuf,length+1);
X    }
X    length=getvar("ENV:ENVIndexFile");
X    if(length==-1) {
X	ENVIndexFile=0;
X    } else {
X	envbuf[length]=0;
X	ENVIndexFile=(char *)AllocMem(length+1,0);
X	if(ENVIndexFile) strncpy(ENVIndexFile,envbuf,length+1);
X    }
X
X#ifdef DEBUG1
X    /* dmsg(1,"Done.\n"); */
X#endif
X    FreeMem(envbuf,ENVBUFSIZE);
X    envbuf=0;
X    myproc->pr_WindowPtr=tmpptr;
X    return -1;
X}
X
Xint
Xgetnumvar(name)
X    char *name;
X{
X    long length;
X
X    length=getvar(name);
X#ifdef DEBUG1
X    /* dmsg(1,"Getenv(%s)=",name); */
X#endif
X    if (length==-1) {
X#ifdef DEBUG1
X	/* dmsg(1,"<nil>\n"); */
X#endif
X	return 0;
X    }
X#ifdef DEBUG1
X    /* dmsg(1,"'%s' ",envbuf); */
X#endif
X    return(getint(envbuf));
X}
X
Xint
Xgetvar(name)
X    char *name;
X{
X    long fh, len;
X
X    oserr=0;
X    fh=Open(name,1005);
X    if(fh==0) {
X	oserr=IoErr();
X	return -1; /* value did not exist */
X    }
X
X    len=Read(fh,envbuf,ENVBUFSIZE);
X    if(len==ENVBUFSIZE) len--;
X    envbuf[len]=0; /* It must be NULL terminated */
X    Close(fh);
X    return len;
X}
X
Xint
Xgetint(str)
X    char *str;
X{
X    int val=0;
X    int base=10;
X
X    while (*str==' ' || *str=='\t') str++;
X    if(*str=='0') {
X	base=8;
X	str++;
X	if(*str=='x' || *str=='X') {
X	    base=16;
X	    str++;
X	}
X    }
X    while(*str!=0) {
X	if( (base==10 && *str>='0' && *str<='9') || ( base==8 && *str>='0' && *str<='7'))
X	    val = val*base + (*str) - '0';
X	else if (base==16) {
X	    if(*str>='0' && *str<='9')
X		val = val*16 + (*str) - '0';
X	    else {
X		*str &= ~32;
X		if(*str>='A' && *str<='F')
X		    val = val*16 + (*str) - (10+'A');
X	    }
X	} else
X	    break;
X	str++;
X    }
X    dmsg(1,"VAL=%ld.\n",val);
X    return val;
X}
X
SHAR_EOF
echo "extracting getfile.c"
sed 's/^X//' << \SHAR_EOF > getfile.c
X/* HyperHelp -- Copyright 1989 Joe Porkka */
X
X/* getfile.c -- Reads a file into memory + prepares it for use */
X
X#include <exec/types.h>
X#include <exec/io.h>
X#include <exec/memory.h>
X#include <libraries/dos.h>
X#include <libraries/dosextens.h>
X#include <graphics/text.h>
X#include <intuition/intuition.h>
X#include "help.h"
X#include "helptext.h"
X#include "style.h"
X
Xextern int debug;
Xextern long oserr;
Xextern struct DOSerror errortext[];
Xextern struct List windowhead;
Xextern short screenWIDTH, screenHEIGHT;
X
X/* ENV: variables */
Xextern int ENVTop, ENVLeft, ENVWidth, ENVHeight, ENVXInc, ENVYInc;
Xextern int NoSetFont;
Xextern struct TextAttr *ENVFont;
X/**/
X
Xextern int TOP,LEFT,WIDTH,HEIGHT,XINC,YINC; /* FROM windows.c */
Xint sleft, stop, swidth, sheight;
X
Xstruct openwindows *
Xgetprintfile(name,wide)
X    int wide;
X    u_char *name;
X{
X    struct doc    *doc;
X    struct openwindows *ow;
X
X    doc=getdatafile(name);
X    if(doc==0) {
X#ifdef DEBUG1
X        dmsg(1,"getdatafile returns 0\n");
X#endif
X        return(0);
X    }
X    ow=(struct openwindows *)AllocMem(sizeof(struct openwindows),MEMF_CLEAR|MEMF_NAMED,"getfile1");
X    if(ow==0) {
X#ifdef DEBUG5
X        dmsg(5,"OW IS ZERO!\n");
X#endif
X        freefile(doc);
X        return(0);
X    }
X    ow->doc=doc;
X
X    AddTail(&windowhead,ow);
X
X    ow->doc->pnum=0; ow->doc->lnum=0;
X
X    if(format(doc,wide,0)==0) {
X        closewindowsafely(ow);
X        ow->window=0;
X        Remove(ow);
X        freefile(ow->doc);
X        FreeMem(ow,sizeof(struct openwindows) );
X        return(0);
X    }
X    return(ow);
X}
X
Xstruct openwindows *
Xgetfile(name)
X    u_char *name;
X{
X    struct doc    *doc;
X    struct Window      *win;
X    struct openwindows *ow;
X    int top,left,width,height;
X    doc=getdatafile(name);
X    if(doc==0) {
X#ifdef DEBUG1
X        dmsg(1,"getdatafile returns 0\n");
X#endif
X        return(0);
X    }
X    ow=(struct openwindows *)AllocMem(sizeof(struct openwindows),MEMF_CLEAR|MEMF_NAMED,"getfile1");
X    if(ow==0) {
X#ifdef DEBUG5
X        dmsg(5,"OW IS ZERO!\n");
X#endif
X        freefile(doc);
X        return(0);
X    }
X    ow->doc=doc;
X    if(sleft!=-1) {
X        left=sleft;
X        top=stop;
X        width=swidth;
X        height=sheight;
X    } else {
X        if(LEFT+WIDTH>=screenWIDTH) {
X            ENVLeft+=ENVXInc;
X            if(ENVLeft+WIDTH>screenWIDTH) ENVLeft=0;
X            LEFT=ENVLeft;
X        }
X        if(TOP+HEIGHT>=screenHEIGHT) {
X            ENVTop+=ENVYInc;
X            if(ENVTop+HEIGHT>screenHEIGHT) ENVTop=0;
X            TOP=ENVTop;
X        }
X        top=TOP;
X        left=LEFT;
X        width=WIDTH;
X        height=HEIGHT;
X    }
X#ifdef DEBUG1
X    dmsg(1,"Makeing window (%ld,%ld,%ld,%ld)\n",left,top,width,height);
X#endif
X    win=makewindow(ow,left,top,width,height,doc->body->comment,&doc->body->font);
X    if(win==0) {
X#ifdef DEBUG5
X        dmsg(5,"Makewindow failed!\n");
X#endif
X        freefile(doc);
X        FreeMem(ow,sizeof(struct openwindows));
X        return(0);
X    }
X    if(ow->doc->linespace+win->RPort->TxHeight < win->MinHeight/3) {
X        win->RPort->TxHeight+=ow->doc->linespace;
X    }
X    if(sleft==-1) {
X        LEFT+=ENVXInc;
X        TOP+=ENVYInc;
X    }
X    AddTail(&windowhead,ow);
X
X    win->UserData=(BYTE *)ow;
X    ow->doc->pnum=0; ow->doc->lnum=0;
X
X    /* if(ow->doc->savefont) { */
X
X    if(sizewindow(win)==0) {
X        closewindowsafely(ow);
X        ow->window=0;
X        Remove(ow);
X        freefile(ow->doc);
X        FreeMem(ow,sizeof(struct openwindows) );
X        return(0);
X    }
X    return(ow);
X}
X
Xstruct doc *
Xgetdatafile(filename)
X    u_char *filename;
X{
X    struct doc *doc, *tmp;
X
X#ifdef DEBUG1
X    /* dmsg(1,"File name='%s'\n",filename); */
X#endif
X    if( (doc=readfile(filename))==0) {
X#ifdef DEBUG1
X        dmsg(1,"getfile: Open failed, returncode=%ld\n",oserr);
X#endif
X        goto fail;
X    }
X    tmp=pbreakfile(doc);
X    if(tmp==0) {
X#ifdef DEBUG1
X        dmsg(1,"getfile: Format data failed\n");
X#endif
X        goto fail;
X    }
X
X    return(doc);
X
Xfail:
X    if(doc) {freefile(doc); doc=0;}
X    if(oserr) {
X#ifdef DEBUG5
X        dmsg(5,"getfile: error %ld, %s\n",oserr,errortext[errnum(oserr)].text);
X#endif
X    }
X    return(0);
X}
X
Xstruct doc *
Xreadfile(name)
X    u_char *name;
X{
X    struct FileInfoBlock *fileinfo=0;
X    struct  Lock *lock=0,*Lock();        /* to get info about the disk */
X    struct doc *doc=0;
X    int i;
X    long len, fh=0, Open();
X    struct openwindows *ow;
X
X    oserr=103;
X    len=strlen(name)+1; /* Make sure that we compare the \0 at the end too */
X    if( (doc=(struct doc *)AllocMem(sizeof(struct doc),MEMF_CLEAR|MEMF_NAMED,"readfile2"))==0) {
X#ifdef DEBUG5
X        dmsg(5,"Could not get doc mem=%ld\n",AvailMem(0));
X#endif
X        goto fail;
X    }
X    for(ow=(struct openwindows*)windowhead.lh_Head ; ow->node.ln_Succ; ow=ow->node.ln_Succ) {
X        if( strnicmp(ow->doc->body->filename,name,len)==0) {
X            (*doc)=(*ow->doc);
X            doc->labs=0;
X            doc->p=(struct paragraph *)AllocMem(doc->p_count * sizeof(struct paragraph),MEMF_CLEAR|MEMF_NAMED,"Copy of doc");
X            if(doc->p==0) {
X                doc->body=0;
X                goto fail;
X            }
X            for(i=0;i<doc->p_count;i++) {
X                doc->p[i].pindent = ow->doc->p[i].pindent;
X                doc->p[i].indent = ow->doc->p[i].indent;
X                doc->p[i].data = ow->doc->p[i].data;
X                doc->p[i].length = ow->doc->p[i].length;
X            }
X            doc->body->usecount++;
X            doc->pnum=doc->lnum=0;
X            doc->savefont=0;
X            break;
X        }
X    }
X    if(!doc->body) {
X        if( (fileinfo=(struct FileInfoBlock *)AllocMem(sizeof(struct FileInfoBlock),0|MEMF_NAMED,"readfile1"))==0) {
X#ifdef DEBUG5
X            dmsg(5,"Could not get FileInfoBlock mem=%ld\n",AvailMem(0));
X#endif
X            goto fail;
X        }
X        if( (lock=Lock(name,ACCESS_READ))==0) {
X#ifdef DEBUG5
X            dmsg(5,"Could not get lock\n");
X#endif
X            oserr=IoErr();
X            goto fail;
X        }
X        if(0==Examine(lock,fileinfo)){
X#ifdef DEBUG5
X            dmsg(5,"Could not examine\n");
X#endif
X            oserr=IoErr();
X            goto fail;
X        }
X        if(fileinfo->fib_DirEntryType>=0){
X#ifdef DEBUG5
X            dmsg(5,"ERROR: FILE is directory\n");
X#endif
X            oserr=212;
X            goto fail;
X        }
X        if(fileinfo->fib_Size==0){
X#ifdef DEBUG6
X            dmsg(6,"ERROR: SIZE==0\n");
X#endif
X            oserr=212;
X            goto fail;
X        }
X
X        if( (doc->body=(struct textbody *)AllocMem(sizeof(struct textbody),MEMF_CLEAR|MEMF_NAMED,"readfile textbody"))==0) {
X#ifdef DEBUG5
X            dmsg(5,"Could not alloc textbody size");
X#endif
X            goto fail;
X        }
X        doc->body->length=fileinfo->fib_Size;
X
X        if(strncpy(doc->body->comment,fileinfo->fib_Comment,COMWIDTH)==0) {
X            (void)strncpy(doc->body->comment,name,COMWIDTH);
X        }
X        doc->body->comment[COMWIDTH-1]=0;
X        if (fileinfo) FreeMem(fileinfo,sizeof(struct FileInfoBlock));
X        fileinfo=0;
X        if( (doc->body->text=(char *)AllocMem(doc->body->length,0|MEMF_NAMED,"readfile3"))==0) {
X#ifdef DEBUG5
X            dmsg(5,"Could not alloc body size=%ld, mem=%ld\n",doc->body->length,AvailMem(0));
X#endif
X            goto fail;
X        }
X        doc->body->usecount++;
X
X        if( (fh=Open(name,1005))==0){
X#ifdef DEBUG5
X            dmsg(5,"Could not OPEN\n");
X#endif
X            oserr=IoErr();
X            goto fail;
X        }
X        UnLock(lock);
X        len=Read(fh,doc->body->text,doc->body->length);
X        if(len!=doc->body->length) {
X#ifdef DEBUG5
X            dmsg(5,"getfile: Read failed, read %ld bytes out of %ld total length\n",len,doc->body->length);
X#endif
X            oserr=IoErr();
X            goto fail;
X        }
X
X        oserr=0;
X        Close(fh);
X
X        if(0==(doc->body->filename=(char *)AllocMem(strlen(name)+1,MEMF_NAMED,"readfilename"))) {
X#ifdef DEBUG5
X            dmsg(5,"getfile: Could not save filename\n");
X#endif
X            oserr=103;
X            goto fail;
X        }
X        strncpy(doc->body->filename,name,strlen(name)+1);
X    }
X    return(doc);
X
Xfail:
X#ifdef DEBUG5
X    dmsg(5,"getfile: ReadFile Failed!\n");
X#endif
X    /* pause("WAITING..."); */
X    if (lock)     UnLock(lock);
X    if (doc) {
X        if(doc->body) {
X            if(doc->body->usecount) doc->body->usecount--;
X       /* NOTE: There is no need to check for paragraphs here. */
X            if(doc->body->usecount==0) {
X                if(doc->body->text) {
X                    FreeMem(doc->body->text,doc->body->length);
X                    doc->body->text=0;
X                }
X                if(doc->body->filename) {
X                    FreeMem(doc->body->filename,strlen(doc->body->filename)+1);
X                }
X                FreeMem(doc->body,sizeof(struct textbody));
X                doc->body=0;
X            }
X        }
X        FreeMem(doc,sizeof(struct doc));
X    }
X    if (fh) Close(fh);
X    if (fileinfo) FreeMem(fileinfo,sizeof(struct FileInfoBlock));
X    return(0);
X}
X
Xvoid
Xfreefile(doc)
X    struct doc *doc;
X{
X    int i;
X
X    if(doc->body) {
X        if(doc->body->usecount) doc->body->usecount--;
X        if(doc->body->usecount==0) {
X            if(doc->body->text) {
X                FreeMem(doc->body->text,doc->body->length);
X                doc->body->text=0;
X            }
X            if(doc->body->filename) {
X                FreeMem(doc->body->filename,strlen(doc->body->filename)+1);
X            }
X
X            if(doc->body->font.ta_Name) {
X                FreeMem(doc->body->font.ta_Name, strlen(doc->body->font.ta_Name)+1);
X            }
X            doc->body->font.ta_Name=0;
X            FreeMem(doc->body,sizeof(struct textbody));
X            doc->body=0;
X        }
X    }
X    if(doc->labs && doc->lab_count) {
X        FreeMem(doc->labs, sizeof(struct labels)*doc->lab_count);
X    }
X    doc->labs=0;
X    for(i=0;i<doc->p_count;i++) {
X        if(doc->p[i].count && doc->p[i].lines) {
X            FreeMem(doc->p[i].lines, doc->p[i].count * sizeof(struct displaylines));
X            doc->p[i].lines=0;
X        }
X    }
X    FreeMem(doc->p,doc->p_count*sizeof(struct paragraph));
X    doc->p=0;
X    doc->body=0;
X
X    /* if(doc->propwidth) { */
X        /* FreeMem(doc->propwidth,256); */
X        /* doc->propwidth=0; */
X    /* } */
X    FreeMem(doc,sizeof(struct doc));
X}
X
X
Xstruct doc *
Xpbreakfile(doc)
X    struct doc *doc;
X{
X    register u_char c, *begin, *body=doc->body->text;
X    register u_long size=doc->body->length, marksize;
X    u_char *markbody, *command, tmpchar;
X    u_short c_len, flags=0, inc;
X    u_short p_count=0, refmark=0;
X    int i;
X    struct paragraph *p=0;
X
X    sleft=stop=swidth=sheight=-1;
X    /* Check to see if this is a HyperHelp file ( Begins with a (@ @) )*/
X    if(doc->body->usecount>1) return doc;
X    else {
X        if(ENVFont) {
X            i=strlen(ENVFont->ta_Name)+1;
X            doc->body->font = *ENVFont;
X            doc->body->font.ta_Name = (STRPTR)AllocMem(i,0|MEMF_NAMED,"pbreak0");
X            if(doc->body->font.ta_Name==0) {
X                doc->body->font.ta_YSize=0;
X            } else {
X                strncpy(doc->body->font.ta_Name,ENVFont->ta_Name,i);
X            }
X        }
X        begin=body;
X        if( size>1 && body[0]=='(' && body[1]=='@' ) {
X            flags=DOC_FORMATED;
X
X            while(size>0) {
X                switch( c=*body++ ) {
X                case 0:
X                    *body=32;
X                    break;
X                case '\t':
X                    break;
X                case '\n':
X                    *(body-1) = 32;
X                    if( *body=='\n' && size>1 ) {
X                        *(body-1)=0;
X                        *body=0;
X                        p_count++;
X                        size--;
X                        body++;
X                    }
X                    break;
X                case '(':
X                    if(*body=='@' && size>1 ) {
X                        markbody = body-1;
X                        marksize = size;
X                        /* *(body-1) = 0; */
X                        command=body+1;
X                        size-=2;
X                        c_len=0;
X                        inc=1;
X                        while(size>0) {
X                            if(*body<=' ') {
X                                *body=' ';
X                                if(inc!=0) {
X                                    inc=0;
X                                    c_len--;
X                                }
X                                body++;
X                            } else if( *body == '@' && (*(body+1) == ')' && size>1)) {
X                                body++;
X                                break;
X                            } else if( *body++ == '(' && (*body == '@' && size>1)) {
X                                body=markbody+2;
X                                size = marksize -1;
X                                marksize=0;
X#ifdef DEBUG6
X                                dmsg(6,"getfile: NESTED COMMAND NOT ALLOWED!\n");
X#endif
X                                break;
X                            }
X                            size--;
X                            c_len+=inc;
X                        }
X                        if(size==0 || marksize==0) {   /* ERROR Reached EOF before finding '@)' */
X#ifdef DEBUG6
X                            if(marksize!=0) dmsg(6,"getfile: ERROR -- no closeing '@)'.\n");
X#endif
X                            break;
X                        }
X                        *body = 1;
X                        if(c_len>1)tmpchar = token(command,c_len-1);
X                        if(c_len<=1 || tmpchar!=0) {
X                            *(body-1)=0; /* set a null byte for end of string*/
X                            markbody[0]=0; /* set open paren to \0 */
X                            *(command-1) = body-command+3;
X                            switch(tmpchar) {
X                                case 0:
X                                    tmpchar=STYLE_INVALID;
X                                    break;
X                                case STYLE_NORMAL:
X                                case STYLE_UNDERLINE:
X                                case STYLE_BOLD:
X                                case STYLE_ITALIC:
X                                case STYLE_COLOR:
X                                    break;
X                                case STYLE_WINDOW:
X                                    {
X                                        u_char *ptr;
X                                        int top=TOP,left=LEFT,width=WIDTH,height=HEIGHT;
X
X                                        ptr=scannum(command+7,&top);
X                                        ptr=scannum(ptr,&left);
X                                        ptr=scannum(ptr,&width);
X                                        ptr=scannum(ptr,&height);
X                                        if(top+height<=screenHEIGHT && left+width<=screenWIDTH) {
X                                            dmsg(1,"Setting top=%ld, height=%ld.\n",top,height);
X                                            dmsg(1,"Setting left=%ld, width=%ld.\n",left,width);
X                                            sleft=left;
X                                            stop=top;
X                                            swidth=width;
X                                            sheight=height;
X                                        }
X                                    }
X                                    break;
X                                case STYLE_REF:
X                                case STYLE_EXEC:
X                                    if(refmark) {
X#ifdef DEBUG6
X                                        dmsg(6,"getfile: Error, nested REFs not allowed\n");
X#endif
X                                        tmpchar=STYLE_INVALID;
X                                    } else refmark=1;
X                                    break;
X                                case STYLE_UNREF:
X                                    if(refmark)
X                                        refmark=0;
X                                    else {
X#ifdef DEBUG6
X                                        dmsg(6,"getfile: UNREF missing matching REF or EXECUTE\n");
X#endif
X                                        tmpchar=STYLE_INVALID;
X                                    }
X                                    break;
X                                case STYLE_FONT:
X                                    /* (@font topaz.font 8@) */
X                                    if (!NoSetFont) {
X                                        int j,t=0;
X                                        for(j=5;command[j]!=0 && command[j]!=' ';j++);
X                                        /* j-=5; */
X                                        if(doc->body->font.ta_Name) {
X                                            FreeMem(doc->body->font.ta_Name, strlen(doc->body->font.ta_Name)+1);
X                                        }
X                                        doc->body->font.ta_Name = (STRPTR) AllocMem(j-4,0|MEMF_NAMED,"pbreak1");
X                                        if(doc->body->font.ta_Name) {
X                                            strncpy(doc->body->font.ta_Name,command+5,j-5);
X                                            doc->body->font.ta_Name[j-5]=0;
X#ifdef DEBUG1
X                                            dmsg(1,"getfile: Font name is '%s'\t",doc->body->font.ta_Name);
X#endif
X                                            while(command[j]==' ')j++;
X                                            while(command[j]<='9' && command[j]>='0') {
X                                                t=t*10+ command[j]-'0';
X                                                j++;
X                                            }
X                                            doc->body->font.ta_YSize=t;
X#ifdef DEBUG1
X                                            dmsg(1,"getfile: Font height =%ld.\n",t);
X#endif
X                                        }
X                                    }
X                                    break;
X                                case STYLE_TITLE:
X                                    /* (@title This windows title */
X                                    strncpy(doc->body->comment,command+6,COMWIDTH);
X                                    doc->body->comment[COMWIDTH-1]=0;
X                                    break;
X                                case STYLE_LSPACE:
X                                    if(command[7]>='0' && command[7]<='9') {
X                                        doc->linespace = (command[7]-'0');
X#ifdef DEBUG1
X                                        dmsg(1,"getfile:linespace set to %ld.\n",doc->linespace);
X#endif
X                                    }
X                                    break;
X                                case STYLE_INDENT:
X                                case STYLE_PINDENT:
X                                    break;
X                                case STYLE_LABEL:
X                                    doc->lab_count++;
X                                    break;
X                                default:
X#ifdef DEBUG9
X                                    dmsg(9,"ERROR: GETFILE.c -> Unknown STLYE=%lx.\n",tmpchar);
X#endif
X                                    break;
X                            }
X                            *command++=tmpchar;
X                            body++;
X                        } else {
X#ifdef DEBUG6
X                            dmsg(6,"getfile: UNRECOGNIZED COMMAND c_len=%ld, tmpchar=%ld\n",c_len,tmpchar);
X#endif
X                            body++;
X                        }
X                    }
X                    break;
X                default:
X                    if(c<32) {
X#ifdef DEBUG6
X                        dmsg(6,"getfile: ERROR Illegal character 0x%lx in textfile.\n",(long)c);
X#endif
X                        *(body-1)=0;
X                    }
X                    break;
X                }
X                size--;
X            } /* end while(size>0) for formatted text */
X        } else {
X            while(size>0) {
X                switch( c=*body++ ) {
X                case '\n':
X                    *(body-1)=0;
X                    p_count++;
X                    break;
X                case '\t':
X                    break;
X                default:
X                    if( c<32) {
X                        *(body-1)=32;
X                    }
X                    break;
X                }
X                size--;
X            }
X        }
X    }
X#ifdef DEBUG"\33[32mPBREAK\33[31m SIZE=%ld
X    /* dmsg("\33[32mPBREAK\33[31m SIZE=%ld, body-begin=%ld\n",size,body-doc->body); */
X#endif
X    p=(struct paragraph *)AllocMem(sizeof(struct paragraph)*(p_count+1),MEMF_CLEAR|MEMF_NAMED,"pbreak2");
X    if(p==0) {
X        goto fail;
X    }
X#ifdef DEBUG1
X    dmsg(1,"p=%lx, doc=%lx, doc->body=%lx end=%lx ",p,doc,doc->body, doc->body+doc->body->length);
X#endif
X#ifdef DEBUG1
X    dmsg(1,"Pcount=%ld\n",p_count);
X#endif
X    doc->p = p;
X    doc->p_count=p_count+1;
X    body=doc->body->text;
X    doc->p[0].data=body;
X    doc->flags |= flags;
X    for(i=1;i<=p_count;i++) {
X        if(flags & DOC_FORMATED) {
X            while(*body!=0 || *(body+1)!=0) {
X                body++;
X            }
X            doc->p[i-1].length=body- doc->p[i-1].data;
X            body++;
X        } else {
X            while(*body!=0 ) {
X                body++;
X            }
X            doc->p[i-1].length=body- doc->p[i-1].data;
X        }
X        body++;
X        doc->p[i].data=body;
X    }
X    i--;
X    doc->p[i].length= ((long)doc->body->text)+doc->body->length-(long)body;
X#ifdef DEBUG1
X    dmsg(1,"i=%ld, LastLen=%ld\n",i,doc->p[i].length);
X#endif
X    /*
X    {
X        int j;
X        for(j=doc->p[i].length-1;j>=0;j--) {
X            if(doc->p[i].data[j]<32) doc->p[i].length--; else break;
X        }
X    }
X    */
X    return(doc);
X
Xfail:
X#ifdef DEBUG1
X    dmsg(1,"getfile: PBREAK FAILED\n");
X#endif
X    if(doc && doc->body->font.ta_Name) {
X        FreeMem(doc->body->font.ta_Name, strlen(doc->body->font.ta_Name)+1);
X        doc->body->font.ta_Name=0;
X    }
X
X    return(0);
X}
X
Xu_char *
Xscannum(ptr, num)
X    u_char *ptr;
X    int *num;
X{
X    register int n=0;
X    if(ptr==0) return 0;
X    while(*ptr==' ' || *ptr=='\t') ptr++;
X    if (!(*ptr>='0' && *ptr<='9')) return 0;
X    while(*ptr>='0' && *ptr<='9') {
X        n = n*10+ ptr[0]-'0';
X        ptr++;
X    }
X    *num=n;
X    while(*ptr==' ' || *ptr=='\t') ptr++;
X    if(*ptr==',' || *ptr=='/') ptr++;
X    if(*ptr==0) return 0;
X    dmsg(1,"Scan returns n=%ld.\n",n);
X    return ptr;
X}
X
SHAR_EOF
echo "extracting grandcentral.c"
sed 's/^X//' << \SHAR_EOF > grandcentral.c
X/* HyperHelp -- Copyright 1989 Joe Porkka */
X
X/* grandcentral.c -- The "main" loop of the program. Handles all the
X		     input events, and manages the windows
X*/
X
X/* #define DEBUG1 */
X#include <intuition/intuition.h>
X#include <exec/io.h>
X#include <exec/memory.h>
X#include "help.h"
X#include "helptext.h"
Xextern int ScreenType;
Xextern struct NewWindow nw;
Xextern int debug;
Xextern char *RootFile;
Xextern struct Screen *screen;
Xextern struct List windowhead;
Xextern short windowcount;
Xextern struct MsgPort *mp;
X
Xextern ULONG ENVRefresh, ENVNumClicks, ENVAskFirst;
Xextern struct Task *mytask;
X
X/* From print.c */
Xextern struct IOStdReq *printreq;
Xint printing, printbuflen;
Xu_char *printbuf;
Xstruct openwindows *printow;
X
X#define SETREFRESH(ow) ((struct openwindows *)ow)->flags|=ow_REFRESH
X#define CLRREFRESH(ow) ((struct openwindows *)ow)->flags&=~ow_REFRESH
X
X#define KEY_UP	  0x4c
X#define KEY_DOWN  0x4d
X#define KEY_RIGHT 0x4e
X#define KEY_LEFT  0x4f
X#define KEY_ESC   0x45
X#define KEY_C	  0x33
X
X#define QUAL_SHIFT 0X003
X#define QUAL_CTRL  0X008
X#define QUAL_ALT   0X030
X#define QUAL_REPT  0X200
X
Xextern ULONG lastclicksecs, lastclickmicros; /* From GC2.C */
Xshort openroot, closeall, hideall, goaway, findabout;
XULONG prevsecs=0, prevmicros=0;
Xu_short clickx, clicky, clickcount;
Xstruct key key;
Xint wide, high;
Xshort checkflags;
X
Xint
Xgrandcentral()
X{
X    struct openwindows *tmpow, *ow;
X    struct IntuiMessage *im, *im2, *succ, *GetMsg();
X    unsigned long sigs;
X    short   countdown,dir;
X    ULONG Class;
X    USHORT Code;
X    USHORT Qualifier;
X
X    lastclicksecs = lastclickmicros =0;
X    prevsecs=0, prevmicros=0;
X    openroot=1; /* make the root file open immediatly */
X    closeall=0; hideall=0; goaway=0; findabout=0;
X    countdown=0; dir=0; checkflags=0;
X    printing=0; printow=0; printbuf=0; printbuflen=0;
X    printreq=0;
X
X    do {
X	if(closeall) {
X	    closeall=0;
X	    hideall=0;
X	    openroot=1;
X#ifdef DEBUG1
X	    dmsg(1,"Closing all windows!\n");
X#endif
X	    closeallwindows();
X#ifdef DEBUG1
X	    dmsg(1,"All closed, waiting for hotkey.\n");
X#endif
X	    if(waitforhotkey()==0)  return 0;
X	}
X
X	if(goaway) {
X	    goaway=0;
X	    return 0; /* Cause main() to call die() to clean things up */
X	}
X	if(hideall) {
X	    closeall=0;
X	    hideall=0;
X#ifdef DEBUG1
X	    dmsg(1,"Hideing all windows\n");
X#endif
X	    for(ow=(struct openwindows*)windowhead.lh_Head ; ow->node.ln_Succ; ow=ow->node.ln_Succ) {
X		if(!(ow->flags & ow_PRINTING)) {
X		    getdims(ow);
X		    CWS(ow->window, ow->doc->savefont);
X		    ow->window=0;
X		}
X	    }
X	    if(screen) {
X		CloseScreen(screen);
X		screen=0;
X	    }
X#ifdef DEBUG1
X	    dmsg(1,"Waiting for hot key\n");
X#endif
X	    if(waitforhotkey()==0)  return 0;
X#ifdef DEBUG1
X	    dmsg(1,"Got hot key, opening windows\n");
X#endif
X	    if(ScreenType!=0 && screen==0) customscreen();
X
X	    checkflags=0;
X	    for(ow=(struct openwindows*)windowhead.lh_Head ; ow->node.ln_Succ; ow=ow->node.ln_Succ) {
X		if(!(ow->flags & ow_PRINTING)) {
X		    flipwindow(ow,1);
X		    checkflags++;
X		}
X	    }
X#ifdef DEBUG1
X	    dmsg(1,"Windows all open!\n");
X#endif
X	    if(windowcount==0) {
X#ifdef DEBUG1
X		dmsg(1,"Failed to open any windows :-( \n");
X#endif
X		return 0;
X	    }
X	    Signal(mytask,0x80000000); /* Make sure we get to the GetMsg() call */
X	}
X	if(openroot){
X	    openroot=0;
X	    closeall=hideall=0;
X	    ow=getfile(RootFile);
X	    if(ow==0 && windowcount==0) {
X#ifdef DEBUG1
X		dmsg(1,"Could not open initial file.");
X#endif
X		return 0;
X	    }
X	    refresh(ow);
X	}
X	if(checkflags) {
X#ifdef DEBUG1
X	    dmsg(1,"$=%ld ",checkflags);
X#endif
X	    for(tmpow=(struct openwindows *)windowhead.lh_Head;tmpow->node.ln_Succ;tmpow=tmpow->node.ln_Succ) {
X		if(tmpow->window && tmpow->flags & ow_REFRESH) {
X		    if(checkflags) checkflags--;
X		    refresh(tmpow);
X		    tmpow->flags&=~ow_REFRESH;
X		}
X		if((!printing) && tmpow->window && tmpow->flags & (ow_PRINTFILE | ow_PRINTWINDOW)) {
X		    static UBYTE *wt, *st;
X		    static int test;
X		    static char *printwait="Opening printer.device";
X
X		    if(checkflags) checkflags--;
X		    printing=0; /* Just to be sure. */
X		    wt=tmpow->window->Title;
X		    st=tmpow->window->ScreenTitle;
X		    SetWindowTitles(tmpow->window,printwait,printwait);
X		    test=printinit(mp);
X		    SetWindowTitles(tmpow->window,wt,st);
X		    if(test==0) {
X#ifdef DEBUG5
X			dmsg(5,"Could not init printer!\n");
X#endif
X			tmpow->flags&= ~(ow_PRINTFILE | ow_PRINTWINDOW);
X		    } else {
X			if(tmpow->flags & ow_PRINTWINDOW) {
X			    high=tmpow->high;
X			    wide=tmpow->wide;
X			} else {
X			    getprintwidth(&wide, &high);
X			    high=0;
X			}
X			tmpow->flags&= ~(ow_PRINTFILE | ow_PRINTWINDOW);
X			printbuf=(u_char *)AllocMem(wide+wide,MEMF_NAMED,"Print buffer");
X			if(printbuf==0) {
X#ifdef DEBUG5
X			    dmsg(5,"No mem for print buf!\n");
X#endif
X			    printdnit();
X			} else {
X			    printbuflen=wide+wide;
X			    printow=getprintfile(tmpow->doc->body->filename,wide);
X#ifdef DEBUG1
X			    dmsg(1,"GOTFILE!! WINDOWCOUNT=%ld.\n",windowcount);
X#endif
X			    if(printow==0) {
X#ifdef DEBUG5
X				dmsg(5,"Could not getprintfile!\n");
X#endif
X				printdnit();
X			    } else {
X				printow->flags |= ow_PRINTING;
X#ifdef DEBUG1
X				dmsg(1,"Sending FIRST printmessage\n");
X#endif
X				printit("\033#1"); /* reinitialize aRIN */
X				printing=1;
X				if(high) { /* Set begining position if printing from window */
X				    printow->doc->pnum=tmpow->doc->pnum;
X				    printow->doc->lnum=tmpow->doc->lnum;
X				}
X			    }
X			}
X		    }
X		}
X	    }
X	}
X	/* pause("Wait for input signal"); */
X	if(windowcount==0) {
X#ifdef DEBUG1
X	    dmsg(1,"Attempt to wait while no windows open.\n");
X#endif
X	    return 0;
X	}
X	sigs=Wait(-1);
X	while( (im=GetMsg(mp))!=0) {
X#ifdef DEBUG1
X	    dmsg(1,"LOOP ");
X#endif
X	    if( (printreq==(struct IOStdReq *)im) && printing && printreq) {
X		if(printreq->io_Error) {
X#ifdef DEBUG5
X		    dmsg(5,"print error!\n");
X#endif
X		    printing=5;
X		}
X		switch(printing) {
X		    case 1: /* Just put out the aRIN, now put the filename */
X			printit(printow->doc->body->filename);
X			printing=2;
X			break;
X		    case 2: /* Now put out a cr */
X			printit("\n");
X			printing=3;
X			break;
X		    case 3:
X			displayline(0,&printow->doc->p[printow->doc->pnum],printow->doc->lnum,printow,printbuf,printbuflen);
X			printit(printbuf);
X			printing=2;
X			printow->doc->lnum++;
X			if(printow->doc->lnum >= printow->doc->p[printow->doc->pnum].count) {
X			    printow->doc->lnum=0;
X			    printow->doc->pnum++;
X			    if(printow->doc->pnum >= printow->doc->p_count) {
X				printing=4; /* end of doc */
X			    }
X			}
X			if(high) {
X			    high--;
X			    if(high==0) printing=4; /* End of window */
X			}
X			break;
X		    case 4: /* Now put out a cr, FF, aRIN */
X			printit("\n\14\33#1");
X			printing=5;
X			break;
X		    case 5: /* Stop printing */
X    xcancelprintjob:
X#include "kludge.h"
X			/* cancelprintjob(); /* This call calls the guru, so inline the function */ */
X			printing=0;
X#ifdef DEBUG1
X			dmsg(1,"   GC %ld %ld %ld \n",printing,printreq,printbuf);
X#endif
X			break;
X		    case 6: /* Abort all printing */
X			printit("\33c"); /* Hard reset, to empty buffer */
X			printing=7;
X			break;
X		    case 7: /* Now remove any pending jobs */
X			for(tmpow=(struct openwindows*)windowhead.lh_Head ; tmpow->node.ln_Succ; tmpow=tmpow->node.ln_Succ) {
X			    tmpow->flags &= ~(ow_PRINTFILE | ow_PRINTWINDOW);
X			}
X#ifdef DEBUG1
X			dmsg(1,"Now removeing current job.\n");
X#endif
X			goto xcancelprintjob; /* To avoid too many copies
X						of kludge.h
X					      */
X			/* break; */
X		}
X		continue;
X	    }
X	    tmpow= (struct openwindows *)im->IDCMPWindow->UserData;
X	    Class=im->Class;
X	    Code=im->Code;
X	    Qualifier=im->Qualifier;
X	    if(Class==RAWKEY) {
X		switch(Code) {
X		    case KEY_UP:
X			Class=GADGETDOWN;
X			im->IAddress = (APTR) tmpow->up;
X			break;
X		    case KEY_DOWN:
X			Class=GADGETDOWN;
X			im->IAddress = (APTR)tmpow->down;
X			break;
X		    case KEY_UP+128:
X			Class=GADGETUP;
X			im->IAddress = (APTR)tmpow->up;
X			break;
X		    case KEY_DOWN+128:
X			Class=GADGETUP;
X			im->IAddress = (APTR)tmpow->down;
X			break;
X		    default:
X			Code=0;
X			Class=0;
X			break;
X		} /* Switch (Code) */
X		/* Remove excess repeat keys from Message port */
X		if (im->Qualifier & QUAL_REPT) {
X		    Forbid();
X		    im2 = (struct IntuiMessage *)mp->mp_MsgList.lh_Head;
X		    while ( succ=(struct IntuiMessage *)im2->ExecMessage.mn_Node.ln_Succ ) {
X		       if ( im!=im2 && im2->Class==RAWKEY && (im2->Qualifier & QUAL_REPT) ) {
X			  Remove ( im2 );
X			  ReplyMsg( im2 );
X		       }
X		       im2 = succ;
X		    }
X		    Permit();
X		}
X	    } /* if (Class == RAWKEY) */
X	    switch(Class) {
X	    case 0:
X		break; /* Ignore NULL Class */
X	    case MOUSEMOVE:
X		if (! (tmpow->flags & ow_REFRESH)) checkflags++;
X		scrollit(tmpow);
X		break;
X	    case GADGETDOWN:
X#ifdef DEBUG1
X		/* dmsg(1,"GADGETDOWN '%s', #%ld.\n",im->IDCMPWindow->Title,(long) ((struct Gadget *)im->IAddress)->GadgetID); */
X#endif
X		countdown=7; /* .7 second initial delay */
X		switch( ((struct Gadget *)im->IAddress)->GadgetID ) {
X		    case SCROLLBAR:
X#ifdef DEBUG1
X			/* dmsg(1,"SCROLL BAR!\n"); */
X#endif
X			if (! (tmpow->flags & ow_REFRESH)) checkflags++;
X			scrollit(tmpow);
X			break;
X		    case UPARROW:
X			dir=-1;
X			if(Qualifier & QUAL_SHIFT) dir= -tmpow->high;
X			move( tmpow,dir);
X			if(dir<-1 || ENVRefresh!=SMART_REFRESH) {
X			    if (! (tmpow->flags & ow_REFRESH)) checkflags++;
X			    SETREFRESH(tmpow);
X			}
X			fixscrollgadget(tmpow);
X			ModifyIDCMP(im->IDCMPWindow,im->IDCMPWindow->IDCMPFlags | INTUITICKS);
X			break;
X		    case DOWNARROW:
X			dir=1;
X			if(Qualifier & QUAL_SHIFT) dir=tmpow->high;
X			move(tmpow, dir);
X			if(dir>1 || ENVRefresh!=SMART_REFRESH) {
X			    if (! (tmpow->flags & ow_REFRESH)) checkflags++;
X			    SETREFRESH(tmpow);
X			}
X			fixscrollgadget(tmpow);
X			ModifyIDCMP(im->IDCMPWindow,im->IDCMPWindow->IDCMPFlags | INTUITICKS);
X			break;
X		    default:
X		    break;
X		}
X		break;
X	    case INTUITICKS:
X		if(countdown) {
X		    countdown--;
X		    if(countdown==0) {
X			ReplyMsg(im);
X			if(dir<0) {
X			    if( tmpow->up->Flags & SELECTED) {
X				move(tmpow,dir);
X				fixscrollgadget(tmpow);
X				if (! (tmpow->flags & ow_REFRESH)) checkflags++;
X				SETREFRESH(tmpow);
X				countdown=2;
X			    }
X			} else if(dir>0) {
X			    if( tmpow->down->Flags & SELECTED) {
X				move( tmpow,dir);
X				fixscrollgadget(tmpow);
X				if (! (tmpow->flags & ow_REFRESH)) checkflags++;
X				SETREFRESH(tmpow);
X				countdown=2;
X			    }
X			}
X			im=0;
X		    }
X		} else {
X		    ModifyIDCMP(im->IDCMPWindow,im->IDCMPWindow->IDCMPFlags & (~INTUITICKS));
X		}
X		break;
X	    case GADGETUP:
X#ifdef DEBUG1
X		dmsg(1,"GADGETUP '%s', #%ld.\n",im->IDCMPWindow->Title,(long) ((struct Gadget *)im->IAddress)->GadgetID);
X#endif
X		if(  ((struct Gadget *)im->IAddress)->GadgetID ==ICONWINDOW) {
X		    if (! (tmpow->flags & ow_REFRESH)) checkflags++;
X		    if(flipwindow(tmpow,0)==0) goto caseclosewindow;
X		    im=0;
X		} else {
X		    ModifyIDCMP(im->IDCMPWindow,im->IDCMPWindow->IDCMPFlags & (~INTUITICKS));
X		}
X		break;
X	    case MENUPICK:
X#ifdef DEBUG1
X		dmsg(1,"MENU PICK  ");
X#endif
X		processmenuevent(Code, tmpow->window->MenuStrip, tmpow);
X		if(findabout) {
X		    findabout=0;
X		    about(tmpow->window);
X		}
X		break;
X	    case SIZEVERIFY:
X#ifdef DEBUG1
X		dmsg(1,"** SIZEVERIFY **\n");
X#endif
X		break;
X	    case NEWSIZE:
X		tmpow->flags |= ow_SIZED; /* Tell refresh() to update entire window */
X	    /* Prevent another resize, and save the windows' size, then continue */
X		getdims(tmpow);
X
X#ifdef DEBUG1
X		dmsg(1,"** NEWSZ **\n");
X#endif
X		if(sizewindow(im->IDCMPWindow)!=0) {
X		    break;
X		}
X		/* refresh(tmpow); */
X#ifdef DEBUG5
X		dmsg(5,"****ERROR grandcentral(): size operation failed, closeing window.\n");
X#endif
X	    /* NOTE: The break is intentionally missing */
X	    case CLOSEWINDOW:
Xcaseclosewindow:
X#ifdef DEBUG1
X		dmsg(1,"Case closewindow\n");
X#endif
X		ReplyMsg(im);
X		closewindow(tmpow);
X		im=0;
X		tmpow=0;
X		break;
X	    case REFRESHWINDOW:
X		if( tmpow->flags & ow_SIZED) {
X		    /* Clear the damage list, then update the window */
X		    BeginRefresh(im->IDCMPWindow);
X		    EndRefresh(im->IDCMPWindow,-1);
X		    cleardisplay(tmpow);
X		    refresh(tmpow );
X		    tmpow->flags &= ~ ow_SIZED;
X		} else {
X		    BeginRefresh(im->IDCMPWindow);
X		    refresh(tmpow );
X		    EndRefresh(im->IDCMPWindow,-1);
X		}
X		break;
X	    case MOUSEBUTTONS:
X		switch(Code) {
X		    case SELECTDOWN:
X#ifdef DEBUG1
X			dmsg(1,"LEFT DOWN\n");
X#endif
X			checkclicks(im,tmpow);
X			break;
X		    case SELECTUP:
X#ifdef DEBUG1
X			dmsg(1,"LEFT UP\n");
X#endif
X			countdown=0;
X			break;
X		    default:
X			break;
X		}
X		break;
X	    default:
X#ifdef DEBUG9
X		dmsg(9,"Unknown IntuiMessage->Class=%08lx\n",Class);
X#endif
X		break;
X	    }
X	    if(im) ReplyMsg(im);
X	}
X    } while( windowcount && !(sigs & 4096));
X    return 1;
Xfail:
X    return 0;
X}
SHAR_EOF
echo "extracting help.h"
sed 's/^X//' << \SHAR_EOF > help.h
X/* HyperHelp -- Copyright 1989 Joe Porkka */
X
X/* help.h  --  Useful #defines and typedefs + a couple of structs
X	       and function prototypes for everything.
X*/
X
Xtypedef unsigned short u_short;
Xtypedef unsigned int u_int;
Xtypedef unsigned long u_long;
Xtypedef unsigned char u_char;
Xtypedef unsigned char u_byte;
X
X#define DEBUG9
X#define DEBUG99
X#define DEBUG10
X
X#define AllocMem allocmem
X#define FreeMem freemem
X#define MEMF_NAMED 0x10000000
X
X#define SCROLLBAR 1
X#define UPARROW 2
X#define DOWNARROW 3
X#define ICONWINDOW 4
X#define HELPICONWINDOWFLAGS WINDOWDRAG | WINDOWDEPTH | WINDOWCLOSE | SIMPLE_REFRESH | NOCAREREFRESH
X#define HELPWINDOWFLAGS     WINDOWDRAG | WINDOWDEPTH | WINDOWCLOSE | SIZEBRIGHT | ACTIVATE | WINDOWSIZING
X
X#define HELPICONWINDOWIDCMPFLAGS CLOSEWINDOW | MOUSEBUTTONS | GADGETUP | MENUPICK
X#define HELPWINDOWIDCMPFLAGS	 CLOSEWINDOW | MOUSEBUTTONS | MOUSEMOVE | GADGETDOWN | GADGETUP | NEWSIZE | REFRESHWINDOW | RAWKEY | MENUPICK
X
X#define HELPWINDOWLIST 'HELP'
X#define MINX  176
X#define MINY  55
X#define TABSTOP 8
X
Xstruct key {
X    u_short length, type; /* type==0 file, type!=0 execute */
X    u_char *name;
X};
Xstruct DOSerror {
X    int number;
X    char *text;
X};
X
X/* Functions in "main.c" */
Xvoid main(int, char *);
Xint startup();
Xvoid shutdown();
Xvoid die(char *);
Xvoid closewindow(struct openwindows *); /* Should be in windows.c */
X
X/* Functions in "images.c" */
Xvoid getimages( USHORT **, USHORT **, USHORT **);
X
X/* Functions in "windows.c" */
Xvoid CWS(struct Window *, struct TextFont *);
Xstruct Window *makewindow(struct openwindows *,int,int,int,int,u_char *, struct TextAttr *);
Xstruct Window *OpenWindow(struct NewWindow *);
Xvoid closewindowsafely(struct openwindows *);
Xint sizewindow(struct Window *);
Xvoid fixscrollgadget(struct openwindows *);
Xvoid refresh(struct openwindows *);
X
X/* Functions in "move.c" */
Xvoid moveto(struct openwindows*, int);
Xvoid move(struct openwindows*,int);
Xint currentlinenum(struct doc *);
X
X/* Functions in "fileinit.c" */
Xint fileinit(void);
X
X/* Functions in "format.c" */
Xint format(struct doc *, int , struct RastPort *);
X
X/* Functions in "gen.c" */
Xchar *arg(int *, char **);
Xint strncpy(char *, char *, int), strlen(char *);
Xint strcmp(char *,char *), strnicmp(char *, char *, int);
Xu_char *strchr(u_char *, u_char);
Xint strfind(char *, char *);
X
X/* Functions in "getfile.c" */
Xstruct openwindows *getfile(u_char *);
Xstruct openwindows *getprintfile(u_char *,int);
Xstruct doc *getdatafile(u_char *);
Xstruct doc *readfile(char *);
Xvoid freefile(struct doc *);
Xu_char token(u_char *, u_long );
Xstruct doc *pbreakfile(struct doc *);
Xu_char *scannum(u_char *, int *);
X
X/* Functions in "displayline.c" */
Xvoid displayline(struct RastPort *,struct paragraph *, u_short, struct openwindows *, u_char *, int);
Xvoid indentbuf(u_char **, int *, int);
Xvoid copyintobuf(u_char, u_char **, int *, u_char *, int);
X
X/* Functions in "findwordinline.c" */
Xvoid findword(struct openwindows *, int, int, struct key *);
Xint findwordinline(struct paragraph *,u_short,short, struct key *, u_short *, int);
X
X/* Functions in "grandcentral.c" */
Xint grandcentral();
X
X/* Functions in "gc2.c" */
Xint flipwindow(struct openwindows *, int);
Xvoid getdims(struct openwindows *);
Xvoid scrollit(struct openwindows *);
Xvoid processmenuevent(USHORT, struct Menu *, struct openwindows *);
Xvoid checkclicks(struct IntuiMessage *, struct openwindows *);
X
X/* Functions in "index.c" */
Xu_char *lookup(u_long, u_char *, int);
Xvoid index(u_char *, struct key *);
Xu_long openindexfile(u_char *);
Xvoid closeindexfile(u_long);
X
X/* Functions in "oserr.c" */
Xint errnum(int);
X
X/* Functions in "menu.c" */
Xvoid makemenu(struct Window *);
Xvoid removemenu(struct Window *);
Xvoid initmenus(struct Window *);
Xvoid domenu(struct Menu *, BYTE *, int *);
Xvoid domenuitem(struct Menu *, struct MenuItem *, struct IntuiText *, BYTE *, BYTE, int *);
X
X/* Functions in "print.c" */
Xint printinit(struct MsgPort *);
Xvoid getprintwidth(int *, int *);
Xvoid printit(u_char *);
Xvoid printdnit(void);
X
X/* Retired Functions */
Xstruct doc *formatfile(struct RemoveThisDef, struct doc *);
Xint linebreakfile(struct RemoveThisDef, struct doc *, int);
Xvoid printline(struct RemoveThisDef, struct paragraph *, u_short);
Xchar *docommand(struct RemoveThisDef, u_char **, u_long *);
SHAR_EOF
echo "End of archive 2 (of 3)"
# if you want to concatenate archives, remove anything after this line
exit