718 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			718 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* ELLE - Copyright 1982, 1987 by Ken Harrenstien, SRI International
 | ||
|  *	This software is quasi-public; it may be used freely with
 | ||
|  *	like software, but may NOT be sold or made part of licensed
 | ||
|  *	products without permission of the author.
 | ||
|  */
 | ||
| /*	EEEDIT - E-type routines */
 | ||
| 
 | ||
| #include "elle.h"
 | ||
| 
 | ||
| /* E_	- Operate on cur_buf.  Do not change value of cur_dot unless
 | ||
|  *		unavoidable side effect (also e_setcur).
 | ||
|  * EX_	- Like E_ but take SB ptr value.  Never touch cur_dot.
 | ||
|  * ED_	- Like E_, operate on cur_buf, update cur_dot and display stuff.
 | ||
|  * D_	- Perform necessary display update for given operations.
 | ||
|  *
 | ||
|  * Note that "dot" refers to the current read/write pointer for a sbbuffer.
 | ||
|  * The name comes from EMACS/TECO where "." represents this value.
 | ||
|  */
 | ||
| 
 | ||
| #define CURSBB (SBBUF *)cur_buf		/* Shorthand for current SB buffer */
 | ||
| 
 | ||
| e_reset()	/* Reset current buffer */
 | ||
| {	ex_reset(CURSBB);
 | ||
| 	cur_dot = 0;
 | ||
| }
 | ||
| 
 | ||
| /* Basic functions - apply SB routines to current buffer.
 | ||
|  * There is some optimization here which knows that certain SB functions
 | ||
|  * are macros.
 | ||
|  */
 | ||
| e_rgetc()	/* Read/move 1 char backward */
 | ||
| {	return(sb_rgetc((CURSBB)));
 | ||
| }
 | ||
| e_rdelc()	/* Delete 1 char backward */
 | ||
| {	return(sb_rdelc((CURSBB)));
 | ||
| }
 | ||
| e_delc()	/* Delete 1 char forward */
 | ||
| {	return(sb_deln(CURSBB,(chroff)1));
 | ||
| }
 | ||
| e_getc()	/* Read/move 1 char forward */
 | ||
| {	register SBBUF *sb;
 | ||
| 	sb = CURSBB;		/* Macro: use reg */
 | ||
| 	return(sb_getc(sb));
 | ||
| }
 | ||
| e_backc()	/* Move 1 char backward */
 | ||
| {	register SBBUF *sb;
 | ||
| 	sb = CURSBB;		/* Macro: use reg */
 | ||
| 	sb_backc(sb);			/* No value returned */
 | ||
| }
 | ||
| e_putc(c)	/* Insert/write 1 char forward */
 | ||
| char c;
 | ||
| {	register SBBUF *sb;
 | ||
| 	sb = CURSBB;		/* Macro: use reg */
 | ||
| 	return(sb_putc(sb, c));
 | ||
| }
 | ||
| e_peekc()	/* Read 1 char forward (no move) */
 | ||
| {	register SBBUF *sb;
 | ||
| 	sb = CURSBB;		/* Macro: use reg */
 | ||
| 	return(sb_peekc(sb));
 | ||
| }
 | ||
| e_ovwc(ch)	/* Overwrite 1 char forward */
 | ||
| char ch;
 | ||
| {
 | ||
| 	sb_setovw(CURSBB);	/* Turn on overwrite mode */
 | ||
| 	e_putc(ch);
 | ||
| 	sb_clrovw(CURSBB);	/* Turn off overwrite mode */
 | ||
| }
 | ||
| 
 | ||
| SBSTR *
 | ||
| e_copyn(off)	/* Copy N chars forward/backward, return SD to sbstring */
 | ||
| chroff off;
 | ||
| {	return(sb_cpyn(CURSBB,off));
 | ||
| }
 | ||
| e_deln(off)	/* Delete N chars forward/backward */
 | ||
| chroff off;
 | ||
| {	return(sb_deln(CURSBB, off));
 | ||
| }
 | ||
| 
 | ||
| /* E_SETCUR() - set cur_dot to current position (dot).  This is the only
 | ||
|  *	E_ routine that mungs cur_dot except for e_reset.
 | ||
|  */
 | ||
| e_setcur()
 | ||
| {	cur_dot = e_dot();
 | ||
| }
 | ||
| e_gosetcur(dot)		/* Go to specified dot and set cur_dot as well */
 | ||
| chroff dot;
 | ||
| {	sb_seek(CURSBB,dot,0);
 | ||
| 	e_setcur();	/* Not cur_dot = dot since want canonicalization */
 | ||
| }
 | ||
| 
 | ||
| /* E_GO(dot) - Move to specified location. */
 | ||
| /* These "GO" routines all move to the location specified, returning
 | ||
|  *	0 if successful and -1 on error.  "cur_dot" is never changed,
 | ||
|  *	with the exception of e_gosetcur.
 | ||
|  * Note that other "GO" routines (eg E_GONL) will return 1 if successful
 | ||
|  *	and 0 if stopped by EOF.
 | ||
|  */
 | ||
| 
 | ||
| e_gocur() { return(e_go(cur_dot)); }		/* Move to cur_dot */
 | ||
| e_gobob() { return(e_go((chroff) 0)); }		/* Move to Beg Of Buffer */
 | ||
| e_goeob() { return(sb_seek(CURSBB,(chroff)0,2)); } /* Move to End Of Buffer */
 | ||
| e_go(dot)	/* Move to specified location. */
 | ||
| chroff dot;
 | ||
| {	return(sb_seek(CURSBB,dot,0));
 | ||
| }
 | ||
| e_igoff(ioff)	/* Move (int) N chars forward/backward */
 | ||
| int ioff;
 | ||
| {	return(sb_seek(CURSBB,(chroff)ioff,1));
 | ||
| }
 | ||
| 
 | ||
| e_goff(off)	/* Move (full) N chars forward/backward */
 | ||
| chroff off;
 | ||
| {	return(sb_seek(CURSBB,off,1));
 | ||
| }
 | ||
| 
 | ||
| int ex_gonl(), ex_gopl(), ex_gobol(), ex_goeol();
 | ||
| 
 | ||
| e_gobol() { return(ex_gobol(CURSBB)); }	/* Move to beg of this line */
 | ||
| e_goeol() { return(ex_goeol(CURSBB)); }	/* Move to end of this line */
 | ||
| e_gonl()  { return(ex_gonl(CURSBB)); }	/* Move to beg of next line */
 | ||
| e_gopl()  { return(ex_gopl(CURSBB)); }	/* Move to beg of prev line */
 | ||
| 
 | ||
| 
 | ||
| /* E_DOT() - Return current value of dot. */
 | ||
| chroff e_dot()   { return(sb_tell(CURSBB)); }		/* Current pos */
 | ||
| chroff e_nldot() { return(e_alldot(CURSBB,ex_gonl)); }	/* Beg of next line */
 | ||
| chroff e_pldot() { return(e_alldot(CURSBB,ex_gopl)); }	/* Beg of prev line */
 | ||
| chroff e_boldot(){ return(e_alldot(CURSBB,ex_gobol));}	/* Beg of this line */
 | ||
| chroff e_eoldot(){ return(e_alldot(CURSBB,ex_goeol));}	/* End of this line */
 | ||
| 
 | ||
| chroff
 | ||
| e_alldot(sbp,rtn)	/* Auxiliary for above stuff */
 | ||
| SBBUF *sbp;
 | ||
| int (*rtn)();
 | ||
| {	return(ex_alldot(sbp,rtn,e_dot()));
 | ||
| }
 | ||
| 
 | ||
| /* E_BLEN - Return length of current buffer */
 | ||
| chroff
 | ||
| e_blen() { return(ex_blen(CURSBB)); }
 | ||
| 
 | ||
| /* EX_ routines - similar to E_ but take a buffer/sbbuf argument
 | ||
|  *	instead of assuming current buffer.
 | ||
|  */
 | ||
| 
 | ||
| /* EX_RESET - Reset a given buffer */
 | ||
| ex_reset(b)
 | ||
| struct buffer *b;
 | ||
| {	sbs_del(sb_close((SBBUF *)b));
 | ||
| 	sb_open((SBBUF *)b,(SBSTR *)0);
 | ||
| }
 | ||
| 
 | ||
| ex_go(sbp,loc)		/* Move to given dot in specified sbbuf */
 | ||
| chroff loc;
 | ||
| SBBUF *sbp;
 | ||
| {	return(sb_seek(sbp,loc,0));
 | ||
| }
 | ||
| 
 | ||
| chroff
 | ||
| ex_dot(sbp)	/* Return current position in specified sbbuf */
 | ||
| SBBUF *sbp;
 | ||
| {
 | ||
| 	return(sb_tell(sbp));
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| chroff
 | ||
| ex_boldot(sbp,dot)	/* Return dot for BOL of specified sbbuf */
 | ||
| SBBUF *sbp;
 | ||
| chroff dot;
 | ||
| {	return(ex_alldot(sbp,ex_gobol,dot));
 | ||
| }
 | ||
| 
 | ||
| chroff
 | ||
| ex_alldot(sbp,rtn,dot)	/* Auxiliary for some e_ stuff */
 | ||
| SBBUF *sbp;
 | ||
| int (*rtn)();
 | ||
| chroff dot;
 | ||
| {	register SBBUF *sb;
 | ||
| 	chroff savloc, retloc;
 | ||
| 
 | ||
| 	savloc = sb_tell(sb = sbp);
 | ||
| 	sb_seek(sb,dot,0);
 | ||
| 	(*rtn)(sb);
 | ||
| 	retloc = sb_tell(sb);
 | ||
| 	sb_seek(sb,savloc,0);
 | ||
| 	return(retloc);
 | ||
| }
 | ||
| 
 | ||
| /* GO (forward) to Next Line of specified sbbuf - returns 0 if stopped at EOF
 | ||
|  * before an EOL is seen. */
 | ||
| ex_gonl(sbp)
 | ||
| SBBUF *sbp;
 | ||
| {	register SBBUF *sb;
 | ||
| 	register int c;
 | ||
| 	sb = sbp;
 | ||
| #if FX_EOLMODE
 | ||
| 	if(eolcrlf(sb))
 | ||
| 		while((c = sb_getc(sb)) != EOF)
 | ||
| 		  {	if(c == LF)		/* Possible EOL? */
 | ||
| 			  {	sb_backc(sb);	/* See if prev char was CR */
 | ||
| 				if((c = sb_rgetc(sb)) != EOF)
 | ||
| 					sb_getc(sb);
 | ||
| 				sb_getc(sb);	/* Must restore position */
 | ||
| 				if(c == CR)	/* Now test for CR */
 | ||
| 					return(1);	/* Won, CR-LF! */
 | ||
| 			  }
 | ||
| 		  }
 | ||
| 	else
 | ||
| #endif
 | ||
| 	while((c = sb_getc(sb)) != EOF)
 | ||
| 		if(c == LF)
 | ||
| 			return(1);
 | ||
| 	return(0);
 | ||
| }
 | ||
| 
 | ||
| /* GO (forward) to End Of Line of specified sbbuf - returns 0 if stopped at
 | ||
|  * EOF before an EOL is seen. */
 | ||
| ex_goeol(sbp)
 | ||
| SBBUF *sbp;
 | ||
| {	register SBBUF *sb;
 | ||
| 	register int c;
 | ||
| 	sb = sbp;
 | ||
| #if FX_EOLMODE
 | ||
| 	if(eolcrlf(sb))
 | ||
| 		while((c = sb_getc(sb)) != EOF)
 | ||
| 		  {	if(c == LF)		/* Possible EOL? */
 | ||
| 			  {	sb_backc(sb);	/* See if prev char was CR */
 | ||
| 				if((c = sb_rgetc(sb)) == CR)
 | ||
| 					return(1);	/* Won, CR-LF! */
 | ||
| 				if(c != EOF)	/* No, must restore position */
 | ||
| 					sb_getc(sb);	/* Skip over */
 | ||
| 				sb_getc(sb);		/* Skip over LF */
 | ||
| 			  }
 | ||
| 		  }
 | ||
| 	else
 | ||
| #endif
 | ||
| 	while((c = sb_getc(sb)) != EOF)
 | ||
| 		if(c == LF)
 | ||
| 		  {	sb_backc(sb);
 | ||
| 			return(1);
 | ||
| 		  }
 | ||
| 	return(0);
 | ||
| }
 | ||
| 
 | ||
| /* GO (backward) to Beg Of Line of specified sbbuf - returns 0 if stopped
 | ||
|  * at EOF
 | ||
|  */
 | ||
| ex_gobol(sbp)
 | ||
| SBBUF *sbp;
 | ||
| {	register SBBUF *sb;
 | ||
| 	register int c;
 | ||
| 	sb = sbp;
 | ||
| #if FX_EOLMODE
 | ||
| 	if(eolcrlf(sb))
 | ||
| 		while((c = sb_rgetc(sb)) != EOF)
 | ||
| 		  {	if(c == LF)		/* Possible EOL? */
 | ||
| 			  {	if((c = sb_rgetc(sb)) == CR)
 | ||
| 				  {	sb_getc(sb);	/* Won, CR-LF! */
 | ||
| 					sb_getc(sb);	/* Move back */
 | ||
| 					return(1);
 | ||
| 				  }
 | ||
| 				if(c != EOF)	/* No, must restore position */
 | ||
| 					sb_getc(sb);	/* Undo the rgetc */
 | ||
| 			  }
 | ||
| 		  }
 | ||
| 	else
 | ||
| #endif
 | ||
| 	while((c = sb_rgetc(sb)) != EOF)
 | ||
| 		if(c == LF)
 | ||
| 		  {	sb_getc(sb);
 | ||
| 			return(1);
 | ||
| 		  }
 | ||
| 	return(0);
 | ||
| }
 | ||
| 
 | ||
| /* GO (backward) to Previous Line of specified sbbuf - returns 0 if stopped
 | ||
|  * at EOF before an EOL is seen (i.e. if already on 1st line of buffer)
 | ||
|  */
 | ||
| ex_gopl(sbp)
 | ||
| SBBUF *sbp;
 | ||
| {	register SBBUF *sb;
 | ||
| 	register int c;
 | ||
| 	sb = sbp;
 | ||
| #if FX_EOLMODE
 | ||
| 	if(eolcrlf(sb))
 | ||
| 		while((c = sb_rgetc(sb)) != EOF)
 | ||
| 		  {	if(c == LF)		/* Possible EOL? */
 | ||
| 			  {	if((c = sb_rgetc(sb)) == CR)
 | ||
| 				  {	ex_gobol(sb);
 | ||
| 					return(1);		/* Won! */
 | ||
| 				  }
 | ||
| 				if(c != EOF)	/* No, must restore position */
 | ||
| 					sb_getc(sb);	/* Undo the rgetc */
 | ||
| 			  }
 | ||
| 		  }
 | ||
| 	else
 | ||
| #endif
 | ||
| 	while((c = sb_rgetc(sb)) != EOF)
 | ||
| 		if(c == LF)
 | ||
| 		  {	ex_gobol(sb);
 | ||
| 			return(1);	/* Won! */
 | ||
| 		  }
 | ||
| 	return(0);
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| chroff
 | ||
| ex_blen(sbp)		/* Return length of specified sbbuf */
 | ||
| SBBUF *sbp;
 | ||
| {
 | ||
| 	return(sb_tell(sbp)+sb_ztell(sbp));
 | ||
| }
 | ||
| 
 | ||
| /* Miscellaneous stuff */
 | ||
| 
 | ||
| /* E_GOFWSP() - Forward over whitespace */
 | ||
| e_gofwsp()
 | ||
| {	register int c;
 | ||
| 	while((c = e_getc()) == SP || c == TAB);
 | ||
| 	if(c != EOF) e_backc();
 | ||
| }
 | ||
| 
 | ||
| /* E_GOBWSP() - Backward over whitespace */
 | ||
| e_gobwsp()
 | ||
| {	register int c;
 | ||
| 	while((c = e_rgetc()) == SP || c == TAB);
 | ||
| 	if(c != EOF) e_getc();
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| /* E_GOLINE(n) - Goes N lines forward (or backward).
 | ||
| **	If N == 0, goes to beginning of current line.
 | ||
| **	Returns 0 if hit EOF.
 | ||
| */
 | ||
| e_goline(i)
 | ||
| register int i;
 | ||
| {
 | ||
| 	if(i > 0)
 | ||
| 	  {	do { if(!e_gonl()) return(0); }
 | ||
| 		while(--i);
 | ||
| 	  }
 | ||
| 	else if(i < 0)
 | ||
| 	  {	i = -i;
 | ||
| 		do { if(!e_gopl()) return(0); }
 | ||
| 		while(--i);
 | ||
| 	  }
 | ||
| 	else e_gobol();		/* arg of 0 */
 | ||
| 	return 1;
 | ||
| }
 | ||
| 
 | ||
| /* E_LBLANKP() - Returns true if all characters in rest of line are blank.
 | ||
|  *	Moves to beginning of next line as side effect, unless fails.
 | ||
|  */
 | ||
| e_lblankp()
 | ||
| {	register int c;
 | ||
| 	for(;;) switch(e_getc())
 | ||
| 	  {
 | ||
| 		case SP:
 | ||
| 		case TAB:
 | ||
| 			continue;
 | ||
| 		case LF:	/* Normally drop thru to return 1 as for EOF */
 | ||
| #if FX_EOLMODE
 | ||
| 			if(eolcrlf(cur_buf))
 | ||
| 			  {	e_rgetc();
 | ||
| 				if((c = e_rgetc()) != EOF) /* Get prev char */
 | ||
| 					e_getc();
 | ||
| 				e_getc();
 | ||
| 				if(c != CR)		/* Now examine */
 | ||
| 					continue;	/* Not CR-LF, go on */
 | ||
| 			  }	/* Else drop thru to return win */
 | ||
| #endif
 | ||
| 		case EOF:
 | ||
| 			return(1);
 | ||
| 		default:
 | ||
| 			return(0);
 | ||
| 	  }
 | ||
| 	/* Never drops out */
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| e_insn(ch, cnt)
 | ||
| int ch;
 | ||
| int cnt;
 | ||
| {	register int i;
 | ||
| 	if((i = cnt) > 0)
 | ||
| 		do { e_putc(ch);
 | ||
| 		  } while(--i);
 | ||
| }
 | ||
| 
 | ||
| e_sputz(acp)
 | ||
| char *acp;
 | ||
| {	register SBBUF *sb;
 | ||
| 	register char *cp;
 | ||
| 	register int c;
 | ||
| 	if(cp = acp)
 | ||
| 	  {	sb = CURSBB;
 | ||
| 		while(c = *cp++)
 | ||
| 			sb_putc(sb,c);
 | ||
| 	  }
 | ||
| }
 | ||
| 
 | ||
| /* BOLEQ - Returns TRUE if 2 dots are on the same line
 | ||
|  *	(i.e. have the same Beg-Of-Line)
 | ||
|  */
 | ||
| boleq(dot1,dot2)
 | ||
| chroff dot1,dot2;
 | ||
| {	return( (ex_boldot(CURSBB,dot1) == ex_boldot(CURSBB,dot2)));
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| char *
 | ||
| dottoa(str,val)
 | ||
| char *str;
 | ||
| chroff val;
 | ||
| {	register char *s;
 | ||
| 
 | ||
| 	s = str;
 | ||
| 	if(val < 0)
 | ||
| 	  {	*s++ = '-';
 | ||
| 		val = -val;
 | ||
| 	  }
 | ||
| 	if(val >= 10)
 | ||
| 		s = dottoa(s, val/10);
 | ||
| 	*s++ = '0' + (int)(val%10);
 | ||
| 	*s = 0;
 | ||
| 	return(s);
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| /* Paragraph utilities */
 | ||
| 
 | ||
| #if FX_FPARA || FX_BPARA || FX_MRKPARA || FX_FILLPARA
 | ||
| 
 | ||
| #if FX_SFPREF
 | ||
| extern char *fill_prefix;	/* Defined in eefill.c for now */
 | ||
| extern int fill_plen;		/* Ditto */
 | ||
| #endif /*FX_SFPREF*/
 | ||
| 
 | ||
| #if ICONOGRAPHICS
 | ||
| int para_mode = PARABLOCK;	/* eexcmd.c only other file that refs this */
 | ||
| #endif /*ICONOGRAPHICS*/
 | ||
| 
 | ||
| 
 | ||
| /* Go to beginning of paragraph */
 | ||
| e_gobpa()
 | ||
| {	register int c;
 | ||
| 	chroff savdot;
 | ||
| 
 | ||
| 	savdot = e_dot();
 | ||
| 	e_bwsp();
 | ||
| 	while((c = e_rgetc()) != EOF)
 | ||
| 		if(c == LF)		/* Went past line? */
 | ||
| 		  {	e_getc();		/* Back up and check */
 | ||
| #if FX_SFPREF
 | ||
| 			if(fill_plen)
 | ||
| 				if(tstfillp(fill_plen))
 | ||
| 				  {	e_igoff(-(fill_plen+1));
 | ||
| 					continue;
 | ||
| 				  }
 | ||
| 				else break;
 | ||
| #endif /*FX_SFPREF*/
 | ||
| #if ICONOGRAPHICS
 | ||
|                         c = e_peekc ();
 | ||
| 
 | ||
|                         if (para_mode == PARABLOCK)
 | ||
|                             if (c == LF)
 | ||
|                                 break;
 | ||
| 
 | ||
|                         if (para_mode == PARALINE)
 | ||
|                             if (c_wsp (c))
 | ||
|                                 break;
 | ||
| #else
 | ||
| 			if(c_pwsp(e_peekc()))	/* Check 1st chr for wsp */
 | ||
| 				break;		/* If wsp, done */
 | ||
| #endif /*ICONOGRAPHICS*/
 | ||
| 			e_rgetc();		/* Nope, continue */
 | ||
| 		  }
 | ||
| 	if((c = e_peekc()) == '.' || c == '-')
 | ||
| 	  {	e_gonl();
 | ||
| 		if(e_dot() >= savdot)
 | ||
| 			e_gopl();
 | ||
| 	  }
 | ||
| }
 | ||
| 
 | ||
| /* Go to end of paragraph */
 | ||
| e_goepa()
 | ||
| {	register int c;
 | ||
| 
 | ||
| 	e_gobol();			/* First go to beg of cur line */
 | ||
| 	e_fwsp();
 | ||
| 	while((c = e_getc()) != EOF)
 | ||
|         	if (c == LF)
 | ||
| 		  {
 | ||
| #if FX_SFPREF
 | ||
| 		if(fill_plen)		/* If Fill Prefix is defined */
 | ||
| 			if(tstfillp(fill_plen))	/* then must start with it */
 | ||
| 				continue;
 | ||
| 			else break;		/* or else we're done */
 | ||
| #endif /*FX_SFPREF*/
 | ||
| #if ICONOGRAPHICS
 | ||
|                 if (para_mode == PARABLOCK)
 | ||
|                     if (e_peekc () == LF)
 | ||
|                         break;
 | ||
| 
 | ||
|                 if (para_mode == PARALINE)
 | ||
|                     if (c_wsp (e_peekc ()))
 | ||
|                         break;
 | ||
| #else
 | ||
|                 if(c_pwsp(e_peekc()))
 | ||
|                         break;
 | ||
| #endif /*-ICONOGRAPHICS*/
 | ||
| 		  }
 | ||
| }
 | ||
| 
 | ||
| exp_do(rpos, rneg)
 | ||
| int (*rpos)(), (*rneg)();
 | ||
| {	register int e;
 | ||
| 	register int (*rtn)();
 | ||
| 
 | ||
| 	if((e = exp) == 0)
 | ||
| 		return;
 | ||
| 	rtn = rpos;
 | ||
| 	if(e < 0)
 | ||
| 	  {	rtn = rneg;
 | ||
| 		e = -e;
 | ||
| 	  }
 | ||
| 	do { (*rtn)();
 | ||
| 	  } while(--e);
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| e_fwsp()
 | ||
| {	register int c;
 | ||
| 	while(c_wsp(c = e_getc()));
 | ||
| 	if(c != EOF) e_backc();
 | ||
| }
 | ||
| e_bwsp()
 | ||
| {	register int c;
 | ||
| 	while(c_wsp(c = e_rgetc()));
 | ||
| 	if(c != EOF) e_getc();
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| c_wsp(ch)
 | ||
| int ch;
 | ||
| {	register int c;
 | ||
| 	c = ch;
 | ||
| 	if(c == SP || c == TAB || c == LF || c == FF)
 | ||
| 		return(1);
 | ||
| 	return(0);
 | ||
| }
 | ||
| c_pwsp(ch)
 | ||
| int ch;
 | ||
| {	register int c;
 | ||
| 	c = ch;
 | ||
| 	if(c == '.' || c == '-')
 | ||
| 		return(1);
 | ||
| 	return(c_wsp(c));
 | ||
| }
 | ||
| 
 | ||
| #endif /* FX_FPARA || FX_BPARA || FX_MRKPARA || FX_FILLPARA */
 | ||
| 
 | ||
| /* Word function auxiliaries */
 | ||
| 
 | ||
| /* Returns true if this character is a delimiter. */
 | ||
| delimp(c)
 | ||
| int  c;
 | ||
| {	static int  delim_tab[] =
 | ||
| 	  {
 | ||
| 	    0177777, 0177777,		/* All controls */
 | ||
| 	    0177777, 0176000,		/* All punct but 0-9 */
 | ||
| 	    0000001, 0074000,		/* All punct but A-Z and _ */
 | ||
| 	    0000001, 0174000		/* All punct but a-z */
 | ||
| 	  };
 | ||
| 	return (delim_tab[c >> 4] & (1 << (c & 017)));
 | ||
| }
 | ||
| 
 | ||
| e_wding(adot,n)
 | ||
| register chroff *adot;
 | ||
| int n;
 | ||
| {	chroff savdot;
 | ||
| 	savdot = e_dot();
 | ||
| 	e_gowd(n);
 | ||
| 	*adot = e_dot();
 | ||
| 	e_go(savdot);
 | ||
| 	if(*adot == savdot)
 | ||
| 	  {	ring_bell();
 | ||
| 		return(0);
 | ||
| 	  }
 | ||
| 	return(1);
 | ||
| }
 | ||
| chroff
 | ||
| e_wdot(dot,n)
 | ||
| chroff dot;
 | ||
| int n;
 | ||
| {	chroff savdot, retdot;
 | ||
| 	savdot = e_dot();
 | ||
| 	e_go(dot);
 | ||
| 	e_gowd(n);
 | ||
| 	retdot = e_dot();
 | ||
| 	e_go(savdot);
 | ||
| 	return(retdot);
 | ||
| }
 | ||
| e_gowd(n)
 | ||
| int n;
 | ||
| {	register int (*gch)(), c, cnt;
 | ||
| 	int e_getc(), e_rgetc();
 | ||
| 	chroff ret_dot;
 | ||
| 
 | ||
| 	if((cnt = n) == 0)
 | ||
| 		return;
 | ||
| 	if(cnt > 0)
 | ||
| 		gch = e_getc;		/* Forward routine */
 | ||
| 	else
 | ||
| 	  {	gch = e_rgetc;		/* Backward routine */
 | ||
| 		cnt = -cnt;
 | ||
| 	  }
 | ||
| 	do
 | ||
| 	  {	ret_dot = e_dot();	/* Remember dot for last word found */
 | ||
| 		while((c = (*gch)()) != EOF && delimp(c));
 | ||
| 		if(c == EOF)
 | ||
| 		  {	e_go(ret_dot);		/* Use last word found */
 | ||
| 			break;
 | ||
| 		  }
 | ||
| 		while((c = (*gch)()) != EOF && !delimp(c));
 | ||
| 		if(c == EOF)
 | ||
| 			break;
 | ||
| 		if(n < 0) e_getc(); else e_backc();
 | ||
| 	  } while(--cnt);
 | ||
| }
 | ||
| 
 | ||
| /* Searching */
 | ||
| 
 | ||
| e_search(mstr,mlen,backwards)
 | ||
| char *mstr;
 | ||
| int mlen;
 | ||
| int backwards;
 | ||
| {	register SBBUF *sb;
 | ||
| 	register char *cp;
 | ||
| 	register int c;
 | ||
| 	char *savcp;
 | ||
| 	int cnt, scnt;
 | ||
| #if IMAGEN
 | ||
| 	register int c1;
 | ||
| 	register int caseless = (cur_buf->b_flags & B_TEXTMODE);
 | ||
| #endif /*IMAGEN*/
 | ||
| 
 | ||
| 	sb = (SBBUF *) cur_buf;
 | ||
| 	if (!backwards)
 | ||
| 	  {		/* Search forwards */
 | ||
| 	sfwd:	cp = mstr;
 | ||
| 		while((c = sb_getc(sb)) != EOF)
 | ||
| 		  {
 | ||
| #if IMAGEN
 | ||
| 			if((!caseless && c != *cp) || 
 | ||
| 			    (caseless && upcase(c) != upcase(*cp))) continue;
 | ||
| #else
 | ||
| 			if(c != *cp) continue;
 | ||
| #endif /*-IMAGEN*/
 | ||
| 			cp++;
 | ||
| 			cnt = mlen;
 | ||
| 			while(--cnt > 0)
 | ||
| 			  {
 | ||
| #if IMAGEN
 | ||
| 				c1 = *cp++;
 | ||
| 				c = e_getc();
 | ||
| 				if ((!caseless && c1 != c) ||
 | ||
| 				     (caseless && upcase(c1) != upcase(c)))
 | ||
| #else
 | ||
| 				if(*cp++ != (c = e_getc()))
 | ||
| #endif /*-IMAGEN*/
 | ||
| 				  {	if(c == EOF) return(0);
 | ||
| 					sb_seek(sb,(chroff)(cnt-mlen),1);
 | ||
| 					goto sfwd;
 | ||
| 				  }
 | ||
| 			  }
 | ||
| 			return(1);
 | ||
| 		  }
 | ||
| 	  }
 | ||
| 	else
 | ||
| 	  {		/* Search backwards */
 | ||
| 		scnt = mlen - 1;
 | ||
| 		savcp = mstr + scnt;		/* Point to end of string */
 | ||
| 
 | ||
| 	sbck:	cp = savcp;
 | ||
| 		while((c = sb_rgetc(sb)) != EOF)
 | ||
| 		  {
 | ||
| #if IMAGEN
 | ||
| 			if((!caseless && c != *cp) || 
 | ||
| 			    (caseless && upcase(c) != upcase(*cp))) continue;
 | ||
| #else
 | ||
| 			if(c != *cp) continue;
 | ||
| #endif /*-IMAGEN*/
 | ||
| 			cp--;
 | ||
| 			if((cnt = scnt) == 0) return(1);
 | ||
| 			do
 | ||
| 			  {
 | ||
| #if IMAGEN
 | ||
| 				c1 = *cp--;
 | ||
| 				c = e_rgetc();
 | ||
| 				if ((!caseless && c1 != c) ||
 | ||
| 				     (caseless && upcase(c1) != upcase(c)))
 | ||
| #else
 | ||
| 				if(*cp-- != (c = e_rgetc()))
 | ||
| #endif /*-IMAGEN*/
 | ||
| 				  {	if(c == EOF) return(0);
 | ||
| 					sb_seek(sb,(chroff)(mlen-cnt),1);
 | ||
| 					goto sbck;
 | ||
| 				  }
 | ||
| 			  }
 | ||
| 			while(--cnt);
 | ||
| 			return(1);
 | ||
| 		  }
 | ||
| 	  }
 | ||
| 	return(0);		/* Failed */
 | ||
| }
 | 
