643 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			643 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /* ELLE - Copyright 1982, 1985, 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.
 | ||
|  */
 | ||
| /*
 | ||
|  * EEFILL	Fill Mode functions
 | ||
|  */
 | ||
| 
 | ||
| #include "elle.h"
 | ||
| 
 | ||
| extern int ev_fcolumn;	/* Fill Column variable (defined in EEVINI) */
 | ||
| #if FX_SFPREF
 | ||
| char *fill_prefix;	/* Fill Prefix variable */
 | ||
| int fill_plen;		/* Length of Fill Prefix (0 = no prefix) */
 | ||
| #endif /*FX_SFPREF*/
 | ||
| 
 | ||
| #if FX_FILLMODE
 | ||
| int fill_mode = 0;	/* TRUE when Auto Fill Mode is on */
 | ||
| int *fill_trig;		/* Pointer to fill-trigger chbit array */
 | ||
| static char *fill_initrig = " \t.,;:)!";
 | ||
| #endif /*FX_FILLMODE*/
 | ||
| 
 | ||
| /* Following stuff for testing routines on */
 | ||
| /*
 | ||
| 
 | ||
|           1         2         3         4         5	    6         7
 | ||
| 0123456789012345678901234567890123456789012345678901234567890123456789012345
 | ||
| 
 | ||
| Okay...  more stuff to hack.  Okay.  a b c d e f g h i j k l m
 | ||
| n o p q r s t u v w x y z dfsd stuff to hack 01234 Okay testing
 | ||
| more stuff to hack.  Okay...  more stuff to hack more stuff to
 | ||
| hack.  Okay...  more stuff to line long stuff to hack.  Okay...
 | ||
| even more gap and.  period.  okay, end of stuff.
 | ||
| 	This is another fence.
 | ||
| */
 | ||
| 
 | ||
| 
 | ||
| #if FX_SFCOL
 | ||
| /* EFUN: "Set Fill Column" */
 | ||
| f_sfcol()
 | ||
| {	register int linel;
 | ||
| 	char temp[20];
 | ||
| 
 | ||
| 	linel = exp_p ? exp : d_curind();
 | ||
| 	if(linel < 0) linel = 0;
 | ||
| 	say("Fill column = ");
 | ||
| 	dottoa(temp,(chroff)linel);
 | ||
| 	saytoo(temp);
 | ||
| 	ev_fcolumn = linel;
 | ||
| }
 | ||
| #endif /*FX_SFCOL*/
 | ||
| 
 | ||
| 
 | ||
| #if FX_SFPREF
 | ||
| /* EFUN: "Set Fill Prefix" */
 | ||
| f_sfpref()
 | ||
| {	register int i;
 | ||
| 	register char *cp;
 | ||
| 
 | ||
| 	if((i = cur_dot - e_boldot()) > MAXLINE)
 | ||
| 	  {	ding("Absurd Fill Prefix");
 | ||
| 		return;
 | ||
| 	  }
 | ||
| 	if(fill_prefix)
 | ||
| 	  {	chkfree(fill_prefix);
 | ||
| 		fill_plen = 0;
 | ||
| 	  }
 | ||
| 	if(i <= 0)
 | ||
| 	  {	fill_prefix = 0;
 | ||
| 		cp = "";
 | ||
| 	  }
 | ||
| 	else
 | ||
| 	  {	fill_prefix = cp = memalloc((SBMO)(i+1));
 | ||
| 		fill_plen = i;
 | ||
| 		e_gobol();
 | ||
| 		do { *cp++ = e_getc(); }
 | ||
| 		while(--i);
 | ||
| 		*cp = 0;
 | ||
| 		cp = fill_prefix;
 | ||
| 	  }
 | ||
| 	say("Fill Prefix = \"");
 | ||
| 	saytoo(cp);
 | ||
| 	saytoo("\"");
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| /* TSTFILLP(lim) - Check for existence of Fill Prefix at current dot.  If
 | ||
|  *	not there, returns 0 without changing dot.  If there, returns
 | ||
|  *	1 and leaves dot immediately after the Fill Prefix.
 | ||
|  *	Lim = # of chars allowed to scan from buffer.
 | ||
|  */
 | ||
| tstfillp(lim)
 | ||
| int lim;
 | ||
| {	register int i, c;
 | ||
| 	register char *cp;
 | ||
| 	chroff savdot;
 | ||
| 
 | ||
| 	if(!(i = fill_plen) || (i > lim))
 | ||
| 		return(0);
 | ||
| 	savdot = e_dot();
 | ||
| 	cp = fill_prefix;
 | ||
| 	do {	if(*cp++ != e_getc())
 | ||
| 		  {	e_go(savdot);
 | ||
| 			return(0);
 | ||
| 		  }
 | ||
| 	  } while(--i);
 | ||
| 	return(1);
 | ||
| }
 | ||
| #endif /*FX_SFPREF*/
 | ||
| 
 | ||
| #if FX_FILLREG || FX_FILLPARA
 | ||
| 
 | ||
| /* ED_FILL(start, end, flag) - Fill a region.
 | ||
|  *	Flag	0 for full filling; extra whitespace is flushed.  First
 | ||
|  *			word is always retained.
 | ||
|  *		1 for skimpy filling such as Auto-Fill likes.
 | ||
|  *			Extra whitespace is NOT flushed, except at
 | ||
|  *			beginning of a newly created line.
 | ||
|  *			This is not yet implemented however.
 | ||
|  * Note: updates cur_dot to compensate for changes in buffer, and returns
 | ||
|  *	there when done!
 | ||
|  * Note: Checks for Fill Prefix when it exists.
 | ||
|  */
 | ||
| ed_fill(begloc, endloc, flag)
 | ||
| chroff begloc, endloc;
 | ||
| int flag;
 | ||
| {	register int c;
 | ||
| 	register int len, lastc;
 | ||
| 	chroff savloc;
 | ||
| 	int lastbrk;
 | ||
| 	int parlen;
 | ||
| 
 | ||
| 	parlen = endloc - begloc;
 | ||
| 	if(parlen < 0)
 | ||
| 	  {	begloc = endloc;
 | ||
| 		parlen = -parlen;
 | ||
| 	  }
 | ||
| 	e_go(begloc);
 | ||
| 	len = d_curind();		/* Set up current col */
 | ||
| 
 | ||
| #if FX_SFPREF
 | ||
| 	/* If at beg of line, check for fill prefix and skip over it */
 | ||
| 	if((len == 0) && tstfillp(parlen))
 | ||
| 	  {	parlen -= fill_plen;
 | ||
| 		len = d_curind();
 | ||
| 	  }
 | ||
| #endif /*FX_SFPREF*/
 | ||
| 	lastbrk = 0;			/* Put next word on no matter what. */
 | ||
| 	c = 0;
 | ||
| 	for(;;)
 | ||
| 	  {
 | ||
| #if ICONOGRAPHICS
 | ||
|              if (c != ')' && c != '"')  /* allow for two sp after .) or ." */
 | ||
| #endif /*ICONOGRAPHICS*/
 | ||
| 		lastc = c;
 | ||
| 		if(--parlen < 0) break;
 | ||
| 		c = e_getc();
 | ||
| 		if(c == EOF)
 | ||
| 			break;
 | ||
| #if FX_SFPREF
 | ||
| 		/* If at beg of line, check for fill prefix and flush it */
 | ||
| 		if((c == LF) && tstfillp(parlen))
 | ||
| 		  {	e_igoff(-(fill_plen+1));
 | ||
| 			e_ovwc(c = SP);
 | ||
| 			e_deln((chroff)fill_plen);
 | ||
| 			parlen -= fill_plen;
 | ||
| 			if(cur_dot >= e_dot())
 | ||
| 				cur_dot -= fill_plen;
 | ||
| 		  }
 | ||
| #endif /*FX_SFPREF*/
 | ||
| 		if(c == TAB || c == LF)		/* Replace tabs+eols by sps */
 | ||
| 		  {	e_backc();		/* Back up 1 */
 | ||
| 			e_ovwc(c = SP);
 | ||
| 		  }
 | ||
| 		if(c == SP)
 | ||
| 		  {	if(lastc == SP)
 | ||
| 			  {	e_rdelc();
 | ||
| 				if(cur_dot > e_dot()) --cur_dot;
 | ||
| 				continue;
 | ||
| 			  }
 | ||
| 			lastbrk = len;
 | ||
| 			if(lastc == '.' || lastc == '!' || lastc == '?'
 | ||
| #if ICONOGRAPHICS
 | ||
|                                                         || lastc == ':'
 | ||
| #endif /*ICONOGRAPHICS*/
 | ||
| 									)
 | ||
| 			  {	if(--parlen < 0) goto done;
 | ||
| 				if((c = e_getc()) == EOF)
 | ||
| 					goto done;
 | ||
| 				len++;
 | ||
| 				if(c != SP)
 | ||
| 				  {	e_backc();
 | ||
| 					e_putc(c = SP);
 | ||
| 					if(cur_dot >= e_dot()) ++cur_dot;
 | ||
| 				  }
 | ||
| 			  }
 | ||
| 		  }
 | ||
| #if ICONOGRAPHICS
 | ||
| 		if (c == BS)                    /* adjust for backspaces */
 | ||
| 			if ((len -= 2) < 0) len = 0;
 | ||
| #endif /*ICONOGRAPHICS*/
 | ||
| 		/* Normal char */
 | ||
| 		if(++len > ev_fcolumn && lastbrk)	/* If went too far */
 | ||
| 		  {	c = lastbrk - len;	/* Must put EOL at last SP */
 | ||
| 			e_igoff(c);
 | ||
| 			parlen -= c;	/* C is negative, actually adding */
 | ||
| 			parlen--;
 | ||
| 			e_ovwc(LF);
 | ||
| 			lastbrk = 0;
 | ||
| 			len = 0;
 | ||
| 			c = SP;		/* Pretend this char was space */
 | ||
| #if FX_SFPREF
 | ||
| 			if(fill_plen)
 | ||
| 			  {	if(cur_dot >= e_dot())
 | ||
| 					cur_dot += fill_plen;
 | ||
| 				/* Better hope no nulls in prefix! */
 | ||
| 				e_sputz(fill_prefix);
 | ||
| 				len = d_curind();
 | ||
| 			  }
 | ||
| #endif /*FX_SFPREF*/
 | ||
| 		  }
 | ||
| 	  }
 | ||
| done:	savloc = cur_dot;
 | ||
| 	e_setcur();	/* Reached paragraph end, set cur_dot temporarily */
 | ||
| 	buf_tmod(begloc-cur_dot);	/* So that proper range is marked */
 | ||
| 	e_gosetcur(savloc);		/* Then restore original cur_dot */
 | ||
| }
 | ||
| #endif /*FX_FILLREG || FX_FILLPARA*/
 | ||
| 
 | ||
| #if FX_FILLMODE
 | ||
| 
 | ||
| /* EFUN: "Auto Fill Mode" */
 | ||
| /*	Toggles Auto Fill Mode (a minor mode). */
 | ||
| f_fillmode()
 | ||
| {	register char *cp;
 | ||
| 	int *chballoc();
 | ||
| 
 | ||
| 	fill_mode = fill_mode ? 0 : 1;
 | ||
| 	if(!fill_trig)
 | ||
| 	  {	fill_trig = chballoc(128);
 | ||
| 		for(cp = fill_initrig; *cp; ++cp)
 | ||
| 			chbis(fill_trig, *cp);
 | ||
| 	  }
 | ||
| 	redp(RD_MODE);
 | ||
| }
 | ||
| 
 | ||
| /* Called by F_INSSELF to handle char insertion in Auto Fill mode */
 | ||
| fx_insfill(c)
 | ||
| int c;
 | ||
| {
 | ||
| 	ed_insn(c,exp);
 | ||
| 	if(chbit(fill_trig, c))
 | ||
| 	  {	fill_cur_line();
 | ||
| 
 | ||
| 	  }
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| fill_cur_line()
 | ||
| {
 | ||
| 	register int foundit, i;
 | ||
| 	chroff lastbrkdot, boldot, eoldot;
 | ||
| 
 | ||
| 	boldot = e_boldot();
 | ||
| 
 | ||
| 	/* First back up to find place to make first break. */
 | ||
| 	e_bwsp();
 | ||
| 	lastbrkdot = e_dot();
 | ||
| 	foundit = 0;
 | ||
| 	for(foundit = 0; foundit >= 0;)
 | ||
| 	  {	if((i = d_curind()) <= ev_fcolumn)
 | ||
| 		  {	if(foundit)
 | ||
| 				foundit = -1;
 | ||
| 			else break;
 | ||
| 		  }
 | ||
| 		else ++foundit;
 | ||
| 		while (!c_wsp (e_rgetc ())) ;
 | ||
| 		e_bwsp();
 | ||
| 		lastbrkdot = e_dot();
 | ||
| 		if(lastbrkdot <= boldot)
 | ||
| 		  {	lastbrkdot = boldot;
 | ||
| 			break;
 | ||
| 		  }
 | ||
| 	  }
 | ||
| 
 | ||
| 	if(foundit)
 | ||
| 		ed_fill(lastbrkdot, e_eoldot(), 1);
 | ||
| }
 | ||
| #endif /*FX_FILLMODE*/
 | ||
| 
 | ||
| #if IMAGEN
 | ||
| 
 | ||
| #if FX_TEXTMODE
 | ||
| /* EFUN: "Text Mode Toggle" (not EMACS) */
 | ||
| f_textmode()
 | ||
| {
 | ||
| 	cur_buf->b_flags ^= B_TEXTMODE;
 | ||
| 	redp(RD_MODE);
 | ||
| }
 | ||
| #endif /*FX_TEXTMODE*/
 | ||
| 
 | ||
| int curr_indent = -1;		/* Current indent (for text mode autowrap) */
 | ||
| 				/*  (misnomered: actually current column) */
 | ||
| chroff best_break;		/* Best break point so far */
 | ||
| 
 | ||
| 
 | ||
| /* Fill-mode version of "Insert Self" */
 | ||
| 
 | ||
| fim_insself(c)
 | ||
| int c;
 | ||
| {
 | ||
| 	register int ind, flags = cur_buf->b_flags;
 | ||
| 
 | ||
| 	/* In Text mode, auto-wrap happens at spaces after fill column */
 | ||
| 	if (c == SP && flags & B_TEXTMODE && exp == 1 && magic_wrap(c))
 | ||
| 		return;
 | ||
| 
 | ||
| 	/* In C-mode, tab stops are every 4 columns */
 | ||
| 	else if (c == TAB && flags & B_CMODE &&
 | ||
| 			(ind = magic_backto_bol()) >= 0)
 | ||
| 		ed_indto((ind + 4) & ~3);
 | ||
| 	else
 | ||
| 	  {	ed_insn(c, exp);
 | ||
| 
 | ||
| 		/* Keep track of indent, once we have a grip on it */
 | ||
| 		if (last_cmd == INSCMD && curr_indent != -1)
 | ||
| 		  {	this_cmd = INSCMD;  /* Keep the ball rolling */
 | ||
| 			if (c == TAB)
 | ||
| 				curr_indent = ((curr_indent + 8) & ~7)
 | ||
| 						 + 8 * (exp - 1);
 | ||
| 			else if (c == '\n')
 | ||
| 				curr_indent = 0;
 | ||
| 			else if (c < SP || c > 0176)
 | ||
| 				curr_indent += (2 * exp);
 | ||
| 			else
 | ||
| 				curr_indent += exp;
 | ||
| 		  }
 | ||
| 	  }
 | ||
| }
 | ||
| 
 | ||
| /* Fill-mode version of "Delete Character" */
 | ||
| 
 | ||
| fim_dchar()
 | ||
| {	/* In C mode, deleting at BOL should do fake TAB preservation */
 | ||
| 	if (cur_buf->b_flags & B_CMODE)
 | ||
| 	  {	chroff savdot;
 | ||
| 		register int c, indent;
 | ||
| 
 | ||
| 		if (e_rgetc() != LF)
 | ||
| 		  {	/* Only hack this at BOL */
 | ||
| 			e_getc();
 | ||
| 			goto normal;
 | ||
| 	    	  }
 | ||
| 		e_getc();
 | ||
| 		savdot = e_dot();
 | ||
| 		indent = 0;
 | ||
| 		while ((c = e_getc()) == SP || c == TAB)
 | ||
| 			if (c == SP)
 | ||
| 				++indent;
 | ||
| 		else
 | ||
| 			indent = (indent + 8) & ~7;
 | ||
| 		e_rgetc();
 | ||
| 		if (indent >= 4)
 | ||
| 		  {	ed_delete(savdot, e_dot());
 | ||
| 			ed_indto((indent - 4) & ~3);
 | ||
| 			f_begline();		/* HACK!!!! */
 | ||
| 		  }
 | ||
| 		else
 | ||
| 		  {	e_go(savdot);
 | ||
| 			ef_deln(exp);
 | ||
| 		  }
 | ||
| 	  }
 | ||
| 	else
 | ||
|  normal:	return (ef_deln(exp));
 | ||
| }
 | ||
| 
 | ||
| /* Fill-mode version of "Backward Delete Character" */
 | ||
| 
 | ||
| fim_bdchar()
 | ||
| {	register int ind;
 | ||
| 
 | ||
| 	/* If in C mode, and deleting into white space at BOL, hack tabs */
 | ||
| 	if (exp == 1 && cur_buf->b_flags & B_CMODE &&
 | ||
| 			(ind = magic_backto_bol()) > 0)
 | ||
| 		ed_indto(ind < 4 ? ind - 1 : ((ind - 4) & ~3));
 | ||
| 	else
 | ||
| 		return (ef_deln (-exp));
 | ||
| }
 | ||
| 
 | ||
| /* Fill-mode version of "CRLF" */
 | ||
| fim_crlf()
 | ||
| {	register int i;
 | ||
| 
 | ||
| 	if(e_getc() == LF
 | ||
| 	  && exp == 1
 | ||
| 	  && e_lblankp() && e_lblankp())
 | ||
| 	  {	e_gocur();
 | ||
| 		e_gonl();
 | ||
| 		e_setcur();
 | ||
| 		ed_delete(e_dot(), e_eoldot());
 | ||
| 	  }
 | ||
| 	else
 | ||
| 	  {	e_gocur();
 | ||
| #if IMAGEN
 | ||
| 		if (cur_buf->b_flags & B_TEXTMODE && exp == 1 &&
 | ||
| 		    magic_wrap('\n'))
 | ||
| 			return;
 | ||
| 		else
 | ||
| #endif /*IMAGEN*/
 | ||
| 		if((i = exp) > 0)
 | ||
| 			do ed_crins();
 | ||
| 			while(--i);
 | ||
| 	  }
 | ||
| }
 | ||
| 
 | ||
| /* Do all magic for auto-wrap in Text mode:
 | ||
|  * return as did wrap (i.e., everything is taken care of)
 | ||
|  */
 | ||
| magic_wrap(tc)
 | ||
| int tc;				/* "trigger char" */
 | ||
| {
 | ||
| 	register int c, indent, i, nc;
 | ||
| 	chroff savdot, modstart, breakdot;
 | ||
|     
 | ||
| 	savdot = e_dot();
 | ||
| 	nc = 0;
 | ||
| 	if (last_cmd == INSCMD && curr_indent != -1)
 | ||
| 	  {	indent = curr_indent;		/* Already know our indent */
 | ||
| 		breakdot = best_break;
 | ||
| 	  }
 | ||
| 	else
 | ||
| 	  {
 | ||
| #ifdef INDENTDEBUG
 | ||
| 		barf2("Full indent calculation");
 | ||
| #endif
 | ||
| 		for (nc = 0; (c = e_rgetc()) != EOF && c != '\n'; ++nc)
 | ||
| 		    ;				/* nc: # chars to look at */
 | ||
| 		if (c == '\n')			/* Go back over NL */
 | ||
| 			e_getc();
 | ||
| 		indent = 0;
 | ||
|     
 | ||
| 		/* Search for last line break point, leaving it in breakdot */
 | ||
| 		breakdot = (chroff)0;
 | ||
| 		while (--nc >= 0)
 | ||
| 		  {	c = e_getc();
 | ||
| 			if (c == TAB)
 | ||
| 				indent = (indent + 8) & ~7;
 | ||
| 			else if (c < SP || c > 0176)
 | ||
| 				indent += 2;
 | ||
| 			else
 | ||
| 				++indent;
 | ||
| 			if ((c == SP || c == TAB) &&
 | ||
| 			  (breakdot == (chroff)0 || (indent <= ev_fcolumn)))
 | ||
| 				breakdot = e_dot();
 | ||
| 		  }
 | ||
| 	  }
 | ||
| 
 | ||
|     /* If there is nothing to do, get out */
 | ||
| 	if (indent <= ev_fcolumn)
 | ||
| 	  {	e_go(savdot);
 | ||
| 		if (tc == SP)
 | ||
| 		  {	curr_indent = indent;
 | ||
| 			best_break = (chroff)(savdot + 1); /* Remember here, also */
 | ||
| 			this_cmd = INSCMD;		/* We do know current indent */
 | ||
| 		  }
 | ||
| 		else if (tc == '\n')
 | ||
| 		  {	curr_indent = 0;
 | ||
| 			best_break = (chroff)0;
 | ||
| 			this_cmd = INSCMD;
 | ||
| 		  }
 | ||
| 		else
 | ||
| 			errbarf("bad trigger");
 | ||
| 		return(0);
 | ||
| 	  }
 | ||
| 
 | ||
| 	if (breakdot == (chroff)0)
 | ||
| 	  {
 | ||
| 	/* No breakpoint found or none needed, just break line at end
 | ||
| 	 */
 | ||
| 		e_go(savdot);
 | ||
| 		modstart = savdot;
 | ||
| 		e_putc('\n');
 | ||
| 	  }
 | ||
| 	else
 | ||
| 	  {
 | ||
| 	/* Get to breakpoint and replace with newline
 | ||
| 	 */
 | ||
| 		e_go(breakdot);
 | ||
| 		e_rdelc();
 | ||
| 		modstart = e_dot();		/* Remember where changes start */
 | ||
| 		e_putc('\n');			/* Insert line break */
 | ||
| 		e_go(savdot);			/* Get back to trigger point */
 | ||
| 	  }
 | ||
| 	if (e_rgetc() != '\n')
 | ||
| 	  {		/* If not at line start, */
 | ||
| 		e_getc();
 | ||
| 		e_putc(tc);			/*  insert trigger character */
 | ||
| 
 | ||
| 	/* Once again, compute new indent by backing up to BOL */
 | ||
| 		for (nc = 0; (c = e_rgetc()) != EOF && c != '\n'; ++nc)
 | ||
| 			;
 | ||
| 		if (c == '\n')			/* Go back over NL */
 | ||
| 			e_getc();
 | ||
| 		indent = 0;
 | ||
| 		breakdot = (chroff)0;
 | ||
| 		while (--nc >= 0)
 | ||
| 		  {		/* Get back to current dot */
 | ||
| 			c = e_getc();
 | ||
| 			if (c == TAB)
 | ||
| 				indent = (indent + 8) & ~7;
 | ||
| 			else if (c < SP || c > 0176)
 | ||
| 				indent += 2;
 | ||
| 			else
 | ||
| 				++indent;
 | ||
| 			if ((c == SP || c == TAB) &&
 | ||
| 			  (breakdot == (chroff)0 || (indent <= ev_fcolumn)))
 | ||
| 				breakdot = e_dot();
 | ||
| 		  }
 | ||
| 		if (breakdot == (chroff)0)	/* If no good break found, use dot */
 | ||
| 			breakdot = e_dot();
 | ||
| 		curr_indent = indent;		/* Now we know where we are */
 | ||
| 		if (tc == '\n')			/* If trigger was NL */
 | ||
| 			best_break = (chroff)0;	/*  indent is 0, and no best break */
 | ||
| 		else
 | ||
| 			best_break = breakdot;	/* This is best break so far */
 | ||
| 	  }
 | ||
| 	else
 | ||
| 	  {	e_getc();
 | ||
| 		curr_indent = 0;		/* At line start, no indent */
 | ||
| 		best_break = (chroff)0;		/* Do not have a best break so far */
 | ||
| 	  }
 | ||
| 	ed_setcur();
 | ||
| 	buf_tmat(modstart);			/* Alert to potential changes */
 | ||
| 	this_cmd = INSCMD;			/* Say we know where we are */
 | ||
| 	return(1);
 | ||
| }
 | ||
| 
 | ||
| /* Do lots of magic things for C-mode indent:
 | ||
|  * erase back to BOL iff we are looking back at white space only,
 | ||
|  * returning the indent level of the original dot
 | ||
|  * (< 0 means no erasure done)
 | ||
|  */
 | ||
| /*#define MYDEBUG /* */
 | ||
| #ifdef MYDEBUG
 | ||
| reveal(msg, v1, v2, v3)
 | ||
| char *msg;
 | ||
| {
 | ||
| 	char ahint[128];
 | ||
| 	sprintf(ahint, msg, v1, v2, v3);
 | ||
| 	barf2(ahint);
 | ||
| }
 | ||
| #endif
 | ||
| 
 | ||
| magic_backto_bol()
 | ||
| {
 | ||
| 	chroff savdot;
 | ||
| 	register int c, indent, nc, i;
 | ||
| 
 | ||
| 	savdot = e_dot();
 | ||
|         nc = 0;
 | ||
| 	while ((c = e_rgetc()) != EOF && c != LF)
 | ||
| 	  {	++nc;			/* Count # chars */
 | ||
| 		if (c != SP && c != TAB)
 | ||
| 		  {	e_go(savdot);
 | ||
| #ifdef MYDEBUG
 | ||
| 			reveal("fail: nc: %d", nc);
 | ||
| #endif
 | ||
| 			return -1;
 | ||
|         	  }
 | ||
|     	  }
 | ||
| 	if (c == LF)			/* Go back over the LF */
 | ||
| 		e_getc();
 | ||
|     	indent = 0;			/* (zero-based indent) */
 | ||
|     	savdot = e_dot();		/* BOL is now origin for delete */
 | ||
|     	for (i = 1; i <= nc; ++i)
 | ||
|     		if ((c = e_getc()) == SP)
 | ||
| 			++indent;
 | ||
| 		else 			/* (tab) */
 | ||
| 			indent = (indent + 8) & ~7;
 | ||
|     	if (nc > 0)			/* Don't bother deleting nothing */
 | ||
| 		ed_delete(savdot, e_dot());
 | ||
| #ifdef MYDEBUG
 | ||
| 	reveal("indent: %d, nc: %d, foo: %d", indent, nc, 234);
 | ||
| #endif
 | ||
| 	return(indent);
 | ||
| }
 | ||
| #endif /*IMAGEN*/
 | ||
| 
 | ||
| #if ICONOGRAPHICS
 | ||
| /* Iconographics hack for Auto-Fill mode.  Too big and clumsy, but
 | ||
|  * retained for posterity in case it has some obscure feature.
 | ||
|  */
 | ||
| 
 | ||
| fill_current_line ()
 | ||
| {
 | ||
|         chroff startpos, endpos, savepos, limitpos;
 | ||
|         int i, foundit;
 | ||
|         SBSTR *savep;
 | ||
| 
 | ||
|         foundit = 0;
 | ||
|         while (d_curind() > ev_fcolumn)
 | ||
|            {
 | ||
|             foundit = 1;
 | ||
|             startpos = e_dot ();
 | ||
|             e_bwsp ();
 | ||
|             while (d_curind() > ev_fcolumn) /* back up to ends of wds*/
 | ||
|                {                                /* until <= fill column */
 | ||
|                 while (!c_wsp (e_rgetc ())) ;
 | ||
|                 e_bwsp ();
 | ||
|                }
 | ||
|             if (e_dot () == e_boldot ())
 | ||
|                { /*	ding ("Word does not fit in fill column"); */
 | ||
| 	                return(0);
 | ||
|                }
 | ||
|             savep = e_copyn (startpos - e_dot ());
 | ||
|             e_setcur ();                /* ed_delete does gocur */
 | ||
|             ed_delete (savepos = e_dot (), startpos);
 | ||
| 
 | ||
| 		f_crlf();		/* Now insert newline */
 | ||
| 		e_sputz(fill_prefix);	/* With fill prefix */
 | ||
|             startpos += e_dot () - savepos;
 | ||
|             if (d_curind() > ev_fcolumn)
 | ||
|                {	ed_delete (savepos, e_dot ());
 | ||
| 	                sb_sins (cur_buf, savep);
 | ||
| 	                e_setcur ();
 | ||
|         	        ding ("Fill prefix > fill column???");
 | ||
|                 	return(0);
 | ||
|                }
 | ||
|             savepos = e_dot ();         /* gun inherited initial whitespace */
 | ||
|             sb_sins (cur_buf, savep);
 | ||
|             e_go (savepos);
 | ||
|             e_fwsp ();
 | ||
|             if ((limitpos = e_dot ()) > startpos) limitpos = startpos;
 | ||
|                                         /* in case rest of line was white */
 | ||
|             ed_delete (savepos, limitpos);
 | ||
|             e_gosetcur (startpos + savepos - limitpos);
 | ||
|            }
 | ||
| 
 | ||
|         return foundit;
 | ||
|   }
 | ||
| #endif /*ICONOGRAPHICS*/
 | 
