[comp.sources.amiga] v89i187: hyperhelp - amiga help system, Part01/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 187
Archive-name: applications/hyphelp.1

[Source code only.  Help files in comp.binaries.amiga.  ..bob]

# 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:
#	cco
#	debug.c
#	displayline.c
#	fileinit.c
#	findwordinline.c
#	format.c
# This is archive 1 of a 3-part kit.
# This archive created: Wed Oct 25 10:02:51 1989
echo "extracting cco"
sed 's/^X//' << \SHAR_EOF > cco
X.KEY file/a
Xfailat 1
Xlc1 -. -b -cscdmtuw  -oram: <file>
Xlc2 -. -o<file>.o -r -v -sc=HelpCode ram:<file>
X
SHAR_EOF
echo "extracting debug.c"
sed 's/^X//' << \SHAR_EOF > debug.c
X/* HyperHelp -- Copyright 1989 Joe Porkka */
X
X/* debug.c -- Memory tracking routines + misc. other debug things */
X
X#include <exec/types.h>
X#include <exec/lists.h>
X
X#define TRACKFILE "t:trackmem"
X
Xextern long stdin, stdout;
Xextern long debug;
Xstatic char membuf[500]; /* for building strings with sprintf() */
Xstatic long mfile=0;
X
Xstatic struct List memlist;
X
Xstruct node {
X    struct node *ln_Succ;
X    struct node *ln_Pred;
X};
Xstruct memnode {
X    struct node n;
X    char *name;
X    unsigned long size;
X};
X
Xvoid
Xpause(s)
X    unsigned char *s;
X{
X    static char *pausebuf[256];
X
X    if(stdout==0) {
X	return;
X    }
X    if(!debug) return;
X#ifdef DEBUG1
X    if(s) dmsg(1,"`%s' ",s);
X#endif
X    if(stdin && IsInteractive(stdin)) {
X#ifdef DEBUG1
X	dmsg(1,"PRESS ENTER to continue  ");
X#endif
X	Read(stdin,pausebuf,10);
X    } else {
X#ifdef DEBUG1
X	dmsg(1,"PAUSE");
X#endif
X	Delay(50);
X#ifdef DEBUG1
X	dmsg(1,".\n");
X#endif
X    }
X}
X
Xvoid
Xmeminit()
X{
X    mfile=0;
X    if(!debug) {
X	return;
X    }
X    mfile=Open(TRACKFILE,1006);
X    /* mfile=Open("*",1006); */
X    if(mfile==0) {
X#ifdef DEBUG1
X	if(stdout) dmsg(1,"fail to open memfile\n");
X#endif
X	return;
X    }
X
X    memlist.lh_Head = (struct Node *)&memlist.lh_Tail;
X    memlist.lh_TailPred = (struct Node *)&memlist.lh_Head;
X    memlist.lh_Tail=0;
X    memlist.lh_Type=0;
X}
X
Xvoid
Xmembye() {
X    struct memnode *node;
X    char *ptr;
X    int count=0, amount=0;
X    if(mfile==0) return;
X
X    while (!(memlist.lh_TailPred == (struct Node *)&memlist)) {
X	node=(struct memnode *)memlist.lh_Head;
X	if(node->name) ptr=node->name; else ptr="<nil>";
X	sprintf(membuf,"UNfreed mem at %6lx size=%4lx name=%s\n",((unsigned char *)node)+sizeof(struct memnode),node->size,ptr);
X	Write(mfile,membuf,strlen(membuf));
X	RemHead(&memlist);
X	count++;
X	amount+=node->size;
X	FreeMem(node,node->size+sizeof(struct memnode));
X    }
X    Close(mfile);
X#ifdef DEBUG1
X    dmsg(1,"There were %ld bytes not freed in %ld blocks.\nTake a look in file'%s'.\n",amount,count,TRACKFILE);
X#endif
X    pause(0);
X    mfile=0;
X}
X
X
Xunsigned char *
Xallocmem(size,type,name)
X    unsigned long size,type;
X    char *name;
X{
X    unsigned char *t, *AllocMem();
X    struct memnode *node;
X    char *ptr=0;
X
X    if(mfile==0) {
X	return AllocMem(size,type & ~ 0x10000000);
X    }
X    sprintf(membuf,"AllocMem(%6lx,%4lx",size,type);
X    /* Write(mfile,membuf,strlen(membuf)); */
X    if(type & 0x10000000) {
X	type &= ~0x10000000;
X	sprintf(membuf,",'%s'",name);
X	/* Write(mfile,membuf,strlen(membuf)); */
X	ptr=name;
X    }
X    t=AllocMem(size+sizeof(struct memnode),type);
X    sprintf(membuf,")==%6lx.\n",t+sizeof(struct memnode));
X    /* Write(mfile,membuf,strlen(membuf)); */
X
X    node=(struct memnode *)t;
X    node->size=size;
X    node->name=ptr;
X    AddHead(&memlist,node);
X
X    return t+sizeof(struct memnode);
X}
X
Xvoid
Xfreemem(ptr,size)
X    unsigned char *ptr;
X    unsigned long size;
X{
X    struct memnode *node;
X
X    if(mfile==0) {
X	FreeMem(ptr,size);
X	return;
X    }
X    sprintf(membuf,"FreeMem(%6lx,%4lx) ... ",ptr,size);
X    /* Write(mfile,membuf,strlen(membuf)); */
X
X    ptr -= sizeof(struct memnode);
X    for(node=(struct memnode *)memlist.lh_Head; node->n.ln_Succ; node=(struct memnode *)node->n.ln_Succ) {
X	if(node->size==size && node==(struct memnode *)ptr) {
X	    /* Write(mfile,"OK!\n",4); */
X	    Remove(node);
X	    FreeMem(ptr,size+sizeof(struct memnode));
X	    return;
X	}
X    }
X    Write(mfile,membuf,strlen(membuf));
X    Write(mfile,"FAILED!\n",8);
X
X    return;
X}
X
SHAR_EOF
echo "extracting displayline.c"
sed 's/^X//' << \SHAR_EOF > displayline.c
X/* HyperHelp -- Copyright 1989 Joe Porkka */
X
X/* displayline.c -- Displays one line of text into a window */
X
X#include <exec/types.h>
X#include <graphics/text.h>
X#include <graphics/rastport.h>
X#include <intuition/intuition.h>
X#include "help.h"
X#include "helptext.h"
X#include "style.h"
X
Xextern PenColor;
Xextern int debug;
X
X#define PRINTTEXT   if(pos-begin > 0) {\
X			if(!buf) {\
X			    SetSoftStyle(rp,style,0x0f);\
X			    if( color!=-1 ) {\
X				SetAPen(rp,color);\
X			    } else {\
X				SetAPen(rp,PenColor);\
X			    }\
X			    Text(rp,begin,pos-begin);\
X			}else{\
X			    copyintobuf(style,&buf,&buflen,begin,pos-begin);\
X			}\
X			begin=pos;\
X		    }\
X
X/* These help to optimize print output */
Xstatic u_char pstyle, pstyle_italic, pstyle_bold, pstyle_underline, pstyle_color;
X
Xvoid
Xindentbuf(buf,buflen,indent)
X    u_char **buf;
X    int *buflen,indent;
X{
X    u_char *bp;
X    int i,blen;
X
X    bp=*buf;
X    blen = *buflen;
X
X    if(blen<indent) indent=blen;
X    blen -= indent;
X    for(i=0;i<indent;i++) *bp++ == ' ';
X
X    *bp=0;
X    *buf=bp;
X    *buflen=blen;
X}
X
Xvoid
Xcopyintobuf(style,buf,buflen,pos,len)
X    u_char style, **buf, *pos;
X    int *buflen,len;
X{
X    u_char *bp;
X    int i,blen;
X
X    bp=*buf;
X    blen = *buflen;
X
X    style &= 7;
X    if(pstyle != style) { /* style change && enuff space to do it? */
X	/* *bp++ = '\033'; *bp++ = '['; */
X	if( (pstyle&1) != pstyle_underline && blen>4 ) {
X	    *bp++ = '\033'; *bp++ = '[';
X	    pstyle_underline=(pstyle & 1);
X	    if(pstyle_underline) {
X		*bp++ = '4'; *bp++ = 'm';
X		blen-=4;
X	    } else {
X		*bp++ = '2'; *bp++ = '4'; *bp++ = 'm';
X		blen-=5;
X	    }
X	}
X	if( (pstyle&2) != pstyle_bold && blen>4) {
X	    *bp++ = '\033'; *bp++ = '[';
X	    pstyle_bold=(pstyle & 2);
X	    if(pstyle_bold) {
X		*bp++ = '1'; *bp++ = 'm';
X		blen-=4;
X	    } else {
X		*bp++ = '2'; *bp++ = '2'; *bp++ = 'm';
X		blen-=5;
X	    }
X	}
X	if( (pstyle&4) != pstyle_italic && blen>4) {
X	    *bp++ = '\033'; *bp++ = '[';
X	    pstyle_italic=(pstyle & 4);
X	    if(pstyle_italic) {
X		*bp++ = '3'; *bp++ = 'm';
X		blen-=4;
X	    } else {
X		*bp++ = '2'; *bp++ = '3'; *bp++ = 'm';
X		blen-=5;
X	    }
X	}
X    }
X    if(blen>0) {
X	if(blen<len) len=blen;
X	blen -= len;
X	for(i=0;i<len;i++) {
X	    if (*pos==0)        /* This should probly print a diagnostic */
X		*pos=128;	/* but I have not seen this ever output  */
X	    *bp++ = *pos++;
X	}
X    }
X    *bp=0;
X    *buf=bp;
X    *buflen=blen;
X}
X
Xvoid
Xdisplayline(rp,p,num,ow,buf,buflen)
X    struct RastPort *rp;
X    struct paragraph *p;
X    u_short num;
X    struct openwindows *ow;
X    u_char *buf;	      /* these two are for printfiles */
X    int buflen;
X{
X    register u_char *pos, *end, *begin, style, color;
X    int len, W, bl=ow->window->BorderLeft;
X    /*NOTE: `spacing' below is just a flag, not a valid pointer to spacing info */
X    int spacing;
X
X    if(rp) {
X	spacing=rp->TxFlags & FPF_PROPORTIONAL;
X	W=rp->TxWidth;
X    }  else {
X	spacing=0;
X	W=1;
X    }
X    begin = pos = p->data+p->lines[num].offset;
X    style=p->lines[num].style ;
X    color=p->lines[num].color ;
X    len=0;
X    pstyle= pstyle_italic= pstyle_bold= pstyle_underline= pstyle_color=0;
X    if(buf) buf[0]=0;
X    if(num==0 && p->pindent>0) {
X	if(rp) rp->cp_x+=p->pindent*W;
X	len +=p->pindent;
X	if(buf) indentbuf(&buf,&buflen,p->pindent);
X    } else if(num>0  &&  p->indent>0) {
X	if(rp) rp->cp_x+= p->indent*W;
X	len +=p->indent;
X	if(buf) indentbuf(&buf,&buflen,p->indent);
X    }
X    for(end=pos+p->lines[num].length;pos<end;pos++) {
X	if( *pos=='\t') {
X	    PRINTTEXT;
X	    if(spacing) {
X		if(*pos=='\t') {
X		    if(rp) rp->cp_x += (8 - ((rp->cp_x-bl) / W &7)) * W;
X		    begin++;
X		    pos++;
X		}
X	    } else {
X		if(*pos=='\t') {
X		    if(rp) rp->cp_x += (8-(len & 7))*W;
X		    len+= 8-(len & 7);
X		    begin++;
X		    pos++;
X		}
X	    }
X	} else if(*pos==0) {
X	    if(*(pos+1)==0 || end-pos<2) {
X		pos--;
X		break;
X	    }
X	    PRINTTEXT;
X	    switch(*(pos+2)) {
X	    case STYLE_REF:
X		style |= 0x81;
X		break;
X	    case STYLE_EXEC:
X		style |= 0xC1;
X		break;
X	    case STYLE_UNREF:
X		style &= ~0xC1;
X		break;
X	    case STYLE_NORMAL:
X		style=0;
X		color=PenColor;
X		break;
X	    case STYLE_UNDERLINE:
X		style ^= 1;
X		break;
X	    case STYLE_BOLD:
X		style ^= 2;
X		break;
X	    case STYLE_ITALIC:
X		style ^= 4;
X		break;
X	    case STYLE_COLOR:
X		if(pos[8]>='0' && pos[8]<='7') {
X		    color = (pos[8]-'0');
X		} else color = PenColor;
X		break;
X	    case STYLE_FONT:
X	    case STYLE_WINDOW:
X	    case STYLE_TITLE:
X		break;
X	    case STYLE_LSPACE:
X	    case STYLE_INDENT:
X	    case STYLE_PINDENT:
X	    case STYLE_LABEL:
X		break;
X	    default:
X#ifdef DEBUG9
X		dmsg(9,"Unknown style=%lx\n",(long)(*(pos+2)));
X#endif
X	    }
X
X	    pos+=*(pos+1)-1;
X	    begin=pos+1;
X	} else len++;
X    }
X    PRINTTEXT;
X}
X
X
X
SHAR_EOF
echo "extracting fileinit.c"
sed 's/^X//' << \SHAR_EOF > fileinit.c
X/* HyperHelp -- Copyright 1989 Joe Porkka */
X
X/* fileinit.c -- Initialize fileIO, and our task */
X
X
X#include <exec/types.h>
X#include <exec/tasks.h>
X
Xextern int debug;
Xstruct	Task *mytask, *FindTask();
Xlong	stdout, stdin, oserr, outwindow;
Xint
Xfileinit() {
X    outwindow=0;
X    stdout=0;
X    if(debug) outwindow=stdout=Open("CON:300/100/339/99/HyperHelp DEBUG output window.",1005);
X    if(stdout==0) stdout=Output();
X    stdin=Input();
X    mytask=(struct Task *)FindTask(0);
X    mytask->tc_SigRecvd=0;
X    oserr=0;
X    return(-1);
X}
X
X
SHAR_EOF
echo "extracting findwordinline.c"
sed 's/^X//' << \SHAR_EOF > findwordinline.c
X /* HyperHelp -- Copyright 1989 Joe Porkka */
X
X/* findword.c -- Given a mouse-click, computes location in the file */
X
X#include <exec/types.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 char *IndexFile;
X
Xvoid
Xfindword(ow,x,y,key)
X    struct openwindows *ow;
X    int x,y;
X    struct key *key;
X{
X    u_short wordx, wordy, lnum;
X    u_short pnum;
X    struct paragraph *p;
X    struct RastPort *rp=ow->window->RPort;
X
X    key->type=0;
X    key->name=0;
X    key->length=0;
X    x-=ow->window->BorderLeft;
X    y-=ow->window->BorderTop;
X
X    if(ow->doc->propwidth)
X	wordx=x;
X    else
X	wordx= x/rp->TxWidth;
X
X    wordy= y/rp->TxHeight;
X
X    if(x<0 || y<0 || wordx>=ow->wide || wordy>=ow->high) {
X	return;
X    }
X    pnum=ow->doc->pnum;
X    lnum=ow->doc->lnum;
X    p = &ow->doc->p[pnum];
X    while(wordy>0) {
X	lnum++;
X	if (lnum>=p->count) {
X	    lnum=0;
X	    pnum++;
X	    if(pnum>=ow->doc->p_count) return;
X	    p = &ow->doc->p[pnum];
X	}
X	wordy--;
X    }
X    if(findwordinline(p,lnum,wordx,key, ow->doc->propwidth,rp->TxWidth+1)==0) return;
X
X#ifdef DEBUG1
X    dmsg(1,"Cheking the index, avail=%ld... ",AvailMem(0));
X#endif
X    index(IndexFile,key);
X#ifdef DEBUG1
X    dmsg(1,"%ld done\n",AvailMem(0));
X#endif
X    return;
X}
X
Xint
Xfindwordinline(p,lnum,count,key, spacing,W)
X    struct paragraph *p;
X    u_short lnum;
X    short count;
X    struct key *key;
X    u_short *spacing;
X    int W;
X{
X    register u_char *pos, *end, *begin, *lastref=0;
X    u_short ref, lnum2, len=0;
X    u_char *reffile=0;
X
X    key->name=0;
X    key->length=0;
X    key->type=0;
X
X    if(lnum==0 ) {
X	count-=p->pindent;
X	len  +=p->pindent;
X    } else {
X	count-=p->indent;
X	len  +=p->indent;
X    }
X
X    begin = pos = p->data+p->lines[lnum].offset;
X#ifdef DEBUG1
X    dmsg(1,"FINDWORD count=%ld '",count);
X#endif
X    if (p->lines[lnum].style & 0x80) ref=1; else ref=0;
X    for(end=pos+p->lines[lnum].length;pos<end && count>0;pos++) {
X	if(*pos==0) {
X	    switch(*(pos+2)) {
X	    case STYLE_EXEC:
X		key->type=1;
X		lastref=pos;
X		ref=1;
X		break;
X	    case STYLE_REF:
X		key->type=0;
X		lastref=pos;
X		ref=1;
X		break;
X	    case STYLE_UNREF:
X		key->type=0;
X		lastref=0;
X		ref=0;
X		break;
X	    }
X	    pos+=*(pos+1)-1 ;
X	    begin=pos+1;
X	} else {
X	    if(spacing) {
X		if(*pos=='\t') {
X		    count -= (8-(len/W &7))*W;
X		    len   += (8-(len/W &7))*W;
X		} else {
X		    count -= 1+spacing[*pos];
X		    len   += 1+spacing[*pos];
X		}
X	    } else {
X		if(*pos=='\t') {
X		    /* dmsg(1,"%ld += %ld\n",len,8-(len &7)); */
X		    count -= 8-(len & 7);
X		    len   += 8-(len & 7);
X		} else {
X		    count--;
X		    len++;
X		}
X	    }
X
X	    dmsg(1,"%lc",(long)(*pos));
X	}
X    }
X    dmsg(1,"'\n");
X    if(pos<end) {
X	if(ref) {
X#ifdef DEBUG1
X	    dmsg(1,"Reference point!\n");
X#endif
X	    if(lastref==0) {
X		lnum2=lnum;
X		while(lastref==0) {
X#ifdef DEBUG1
X		    dmsg(1,"REF");
X#endif
X		    if(lnum2==0) {
X#ifdef DEBUG9
X			dmsg(9,"findwordinline: ** BUG ALERT!! Reference without a REF mark\n");
X#endif
X			return(0);
X		    }
X		    lnum2--;
X		    begin = p->data+p->lines[lnum2].offset;
X		    lastref = begin + p->lines[lnum2].length - 2;
X		    while (lastref>=begin) {
X			if(*lastref==0 && (*(lastref+2)==STYLE_REF || *(lastref+2)==STYLE_EXEC)) {
X			    ref=1;
X			    if( *(lastref+2)==STYLE_EXEC) ref=2;
X#ifdef DEBUG1
X			    dmsg(1,"FOUNDREF BACK ");
X#endif
X			    break;
X			}
X			lastref--;
X		    }
X		    if(lastref<begin) lastref=0;
X		}
X	    }
X	    reffile=lastref+6;
X	    if(ref==2) {
X		reffile++;
X		key->type=1;
X	    }
X#ifdef DEBUG1
X	    dmsg(1,"REFERENCE FILE = '%s'\n",reffile);
X#endif
X	    key->name=reffile;
X	    return 0;
X	} /* if ref */ else {
X	    while(pos>begin && pos[-1]>' ') pos--;
X	    key->name=pos;
X	    key->type=0;
X	    return 1;
X	}
X    }
X    return(0);
X}
SHAR_EOF
echo "extracting format.c"
sed 's/^X//' << \SHAR_EOF > format.c
X/* HyperHelp -- Copyright 1989 Joe Porkka */
X
X/* format.c -- formats the text for a specified width widow */
X
X#include <exec/types.h>
X#include <exec/memory.h>
X#include <graphics/rastport.h>
X#include <graphics/text.h>
X#include "help.h"
X#include "helptext.h"
X#include "style.h"
X
Xextern int debug;
Xextern int PenColor;
X
X#define NDL 12
Xstruct displaylines dl[NDL];
X
Xint
Xformat(doc, width, rp)
X    struct doc *doc;
X    int width;
X    struct RastPort *rp;
X{
X    struct paragraph *thisp;
X    struct displaylines *tmp;
X
X    int DefaultColor, j, k, l;
X    u_short *spacing=doc->propwidth;
X    int i, W, charperline, lab_count;
X    u_short charcount, len, countp=0, count, oldcount=0;
X    u_char *pos, *end, *pspace, *lastpos, *tmppos;
X    u_char style, pstyle, color, pcolor, indent, pindent;
X
X    if(PenColor==-1) DefaultColor=1; else DefaultColor=PenColor;
X    if( (spacing==0 && width>254) || (width>1024) ) return(0);
X    if(rp)
X	W=rp->TxWidth;
X    else {
X	W=1;
X	spacing=0;
X#ifdef DEBUG2
X	dmsg(2,"Spacing set to zero!\n");
X#endif
X    }
X    pcolor=color=DefaultColor;
X
X    pindent=0;
X    indent=0;
X    doc->l_count=0;
X
X    lab_count=0;
X    if(doc->lab_count!=0 && doc->labs==0) {
X	doc->labs=(struct labels *)AllocMem(sizeof(struct labels)*doc->lab_count,MEMF_CLEAR);
X    }
X
X    charperline=width/W;
X    do {
X	thisp=&doc->p[countp];
X	countp++;
X	if(thisp->count && thisp->lines) {
X	    FreeMem(thisp->lines, thisp->count * sizeof(struct displaylines));
X	    thisp->lines=0;
X	}
X	thisp->count=0;
X	count=0;
X	pos= thisp->data;
X	pspace=0; pstyle=0;
X	style=0;
X	end= &thisp->data[thisp->length];
X
X	len=pindent;
X	thisp->indent=indent;
X	thisp->pindent=pindent;
X	/* dmsg(1,"FORMAT: pindent=%ld, indent=%ld.\n",pindent,indent); */
X
X	if(spacing) len*=W;
X	charcount=0;
X
X	lastpos=pos;
X	dl[0].offset=0;
X	dl[0].style=style;
X	dl[0].color=color;
X	oldcount=0;
X	while(pos<end) {
X	    if(*pos == 0 && *(pos+1) != 0) {
X		switch (* (pos+2) ) {
X		case STYLE_REF:
X		    style |= 0x81;
X		    break;
X		case STYLE_EXEC:
X		    style |= 0xC1;
X		    break;
X		case STYLE_UNREF:
X		    style &= ~0xC1;
X		    break;
X		case STYLE_NORMAL:
X		    style=0;
X		    color=DefaultColor;
X		    break;
X		case STYLE_UNDERLINE:
X		    style ^= 1;
X		    break;
X		case STYLE_BOLD:
X		    style ^= 2;
X		    break;
X		case STYLE_ITALIC:
X		    style ^= 4;
X		    break;
X		case STYLE_COLOR:
X		    if(pos[8]>='0' && pos[8]<='7') {
X			color = (pos[8]-'0');
X		    } else color = DefaultColor;
X		    break;
X		case STYLE_LSPACE:
X		    if(pos[9]>='0' && pos[9]<='9') {
X			doc->linespace = (pos[9]-'0');
X#ifdef DEBUG1
X			dmsg(1,"linespace set to %ld.\n",doc->linespace);
X#endif
X		    }
X		    break;
X		case STYLE_INDENT:
X		    l=9; j=0;
X		    while(pos[l]==32) l++;
X		    if(pos[l]=='-') {
X			j=-1;
X			l++;
X		    } else if(pos[l]=='+') {
X			j= 1;
X			l++;
X		    }
X		    if(pos[l]>='0' && pos[l]<='9') {
X			k = (pos[l]-'0');
X			if(pos[l+1]>='0' && pos[l+1]<='9') {
X			    k = k*10+(pos[l+1]-'0');
X			}
X		    } else k=0;
X		    if(j) {
X			if(j<0 && k>indent) k=indent;
X			indent += j*k;
X		    } else indent=k;
X
X		    while(indent>charperline && indent!=0) indent/=2;
X		    if(len+indent*W <= width) {
X			len+=indent*W;
X			thisp->indent=indent;
X		    }
X		    break;
X		case STYLE_PINDENT:
X		    l=10; j=0;
X		    while(pos[l]==32) l++;
X		    if(pos[l]=='-') {
X			j=-1;
X			l++;
X		    } else if(pos[l]=='+') {
X			j= 1;
X			l++;
X		    }
X		    if(pos[l]>='0' && pos[l]<='9') {
X			k = (pos[l]-'0');
X			if(pos[l+1]>='0' && pos[l+1]<='9') {
X			    k = k*10+(pos[l+1]-'0');
X			}
X		    } else k=0;
X		    if(j) {
X			if(j<0 && k>pindent) k=pindent;
X			pindent += j*k;
X		    } else pindent=k;
X
X		    while(pindent>charperline && pindent!=0) pindent/=2;
X		    break;
X		case STYLE_LABEL:
X		    if(doc->labs && lab_count<doc->lab_count) {
X			doc->labs[lab_count].name=&pos[8];
X			doc->labs[lab_count].paragraph=countp-1;
X			doc->labs[lab_count].line=thisp->count;
X			lab_count++;
X		    }
X		    break;
X		}
X		pos+=*(pos+1);
X	    } else {
X		if(spacing) {
X		    if(*pos=='\t')
X			len += (8-(len/W &7))*W;
X		    else
X			len+=1+spacing[*pos];
X		} else {
X		    if(*pos=='\t') {
X			len+= 8-(len & 7);
X		    } else
X			len++;
X		}
X		if(*pos == ' ' || *pos=='\t') {
X		    pspace=pos+1;
X		    pstyle=style;
X		    pcolor=color;
X		}
X		pos++;
X
X		if(len>=width) {
X		    if(pspace) {
X			pos=pspace;
X			style=pstyle;
X			color=pcolor;
X		    }
X		    tmppos=pos;
X		    if(count < NDL ) {
X			while( (*(pos-1)==' ' || *(pos-1)=='\t') && pos>lastpos) {
X			    pos--;
X			}
X			dl[count].length=pos-lastpos;
X		    } else {
X#ifdef DEBUG1
X			dmsg(1,"!");
X#endif
X		    }
X		    pos=tmppos;
X		    if(*pos==' ' || *pos=='\t') pos++;
X		    lastpos=pos;
X		    doc->l_count++;
X		    thisp->count++;
X		    count++;
X		    if(count >= NDL) {
X
X			tmp =(struct displaylines *)AllocMem(thisp->count * sizeof(struct displaylines),0|MEMF_NAMED,"format0");
X			if(tmp==0) {
X#ifdef DEBUG5
X			    dmsg(5,"WHOOPS! I ran out of memory! tried to get %ld bytes\n",thisp->count * sizeof(struct displaylines));
X#endif
X			    thisp->count=0;
X			    return(0 );
X			}
X			if(thisp->lines) {
X			    CopyMem(thisp->lines,tmp,oldcount*sizeof(struct displaylines));
X			}
X			CopyMem(&dl,&tmp[oldcount],NDL*sizeof(struct displaylines));
X			count=0;
X			if(thisp->lines) {
X			    FreeMem(thisp->lines,oldcount*sizeof(struct displaylines));
X			}
X			oldcount=thisp->count;
X			thisp->lines=tmp;
X		    }
X		    dl[count].offset=pos-thisp->data;
X		    dl[count].style=style;
X		    dl[count].color=color;
X
X		    len=indent;
X		    if(spacing) len*=W;
X		    pspace=0;
X		    pstyle=0;
X		}
X	    }
X	}
X	if(len>0 || thisp->count==0) {
X	    if(count < NDL) dl[count].length=pos-lastpos;
X	    thisp->count++;
X	    count++;
X	    doc->l_count++;
X	}
X	tmp=(struct displaylines *)AllocMem(thisp->count * sizeof(struct displaylines),0|MEMF_NAMED,"format1");
X	if(tmp==0) {
X#ifdef DEBUG5
X	    dmsg(5,"WHOOPS! I ran out of memory! tried to get %ld bytes\n",thisp->count * sizeof(struct displaylines));
X#endif
X	    if(thisp->lines) {
X		FreeMem(thisp->lines,oldcount * sizeof(struct displaylines));
X		thisp->lines=0;
X	    }
X	    thisp->count=0;
X	    return(0 );
X	}
X
X	if(thisp->lines) {
X	    CopyMem(thisp->lines,tmp,oldcount*sizeof(struct displaylines));
X	}
X	for(i=oldcount;i<thisp->count;i++) {
X	    tmp[i]=dl[i-oldcount];
X	}
X	if(thisp->lines) {
X	    FreeMem(thisp->lines,oldcount * sizeof(struct displaylines));
X	}
X	thisp->lines=tmp;
X    } while (countp<doc->p_count);
X    return(-1);
X}
SHAR_EOF
echo "End of archive 1 (of 3)"
# if you want to concatenate archives, remove anything after this line
exit