⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 work.c

📁 teco编辑器源码
💻 C
字号:
#include <ctype.h>
#include <stdio.h>
#include <string.h>

work()
{
#include "teco.h"

	int iter;				/* Iteration  < > count */
	int prefix;				/* Non-zero if prefix   */
	int sign;				/* Sign  of number      */
	int tmp;				/* Scratch variable     */
	int value;				/* Value of number      */
	int wrk;				/* Another scratch var. */

	append();				/* Read in first buffer */

	bufptx=0;				/* Start at head of bfr */
loop:	cancel=0;				/* Show output  allowed */
	comand();				/* Get the comand strng */
	getptx=0;				/* Start of command buf */
	iter=0;					/* Not any <> iteration */
next:	if (++getptx > getptr) {		/* Any more commands?   */
		if (iter) fprintf(stderr,"?UTC, Unterminated command\n\7");
		goto loop;			/*  ..yes then go again */
	}
	if (getbuf[getptx] == 27) goto next;	/* Punt Delimiter */
	prefix=0;				/* No numeric arg */
	sign=1; 				/* Default  sign  */
	value=1;				/* Default  value */
	if (getbuf[getptx] == '+') {
		sign=1;				/* Positive sign  */
		getptx++;
	} else {
		if (getbuf[getptx] == '-') {
			sign=-1;		/* Negative sign  */
			getptx++;
		}
	}
	tmp=getptx;				/* Start  parse   */
	if (isdigit(getbuf[tmp])) {		/*  ...is number  */
		prefix=1;			/*  ...not deflt  */
		value=0;			/*  ...initialize */
		while (isdigit(getbuf[tmp])) {
			value=value*10+(getbuf[tmp++]-'0');
			}
	} else {
		if (getbuf[tmp] == '.'){	/* Dot means THIS */
			prefix=1;		/*  ....not deflt */
			value=bufptx;		/* Value is  THIS */
			tmp++;			/* Accept it      */
		}
		if (toupper(getbuf[tmp]) == 'B'){
			prefix=1;		/*  ....not deflt */
			value=0;		/* Always is zero */
			tmp++;			/* Accept it      */
		}
		if (toupper(getbuf[tmp]) == 'Z'){
			prefix=1;		/*  ....not deflt */
			value=bufptr;		/* Value is   END */
			tmp++;			/* Accept it      */
		}
	}
	number=sign*value;			/* Specific value */
	getptx=tmp;				/* getptx --> Cmd */

	verb=toupper(getbuf[getptx]);		/* VERB is action */
	if (verb == 27 ) goto next;		/* Missing  verb  */
	if (verb == '=') {			/* Show our globl */
		if (prefix) {
			fprintf(stderr,"%d\n",number);
		} else {
			fprintf(stderr,"?NAE, No arg before =\n\7");
		}
		goto next;			/* punt, all done */
	} else {
	      adverb=toupper(getbuf[getptx+1]);	/* verb qualifier */
	}					/*   ...is adverb */

	if (verb == '>') {			/* End iteration */
		if (!iter)  {			/*  ..must exist */
			fprintf(stderr,"?BNI, Not in iteration\n\7");
			goto loop;		/*  ...flush buf */
		}
		if (--iter) {			/*  ..find start */
			while (getbuf[--getptx] != '<');
		}				/*  ..must exist */
		goto next;			/*  ...continue  */
	}
	if (verb == '<') {			/* Iteration mode */
		if (iter)  {			/*  ...norecursiv */
			fprintf(stderr,"?PDO, Push-down list overflow\n\7");
			goto loop;
		}
		if (!prefix) {			/*  ...no limits  */
			iter=32766;		/*  ...big enuff  */
		} else {			/*  ...use his v  */
			iter=value;		/*  ...supplied   */
		}				/*  ...finished   */
		goto next;			/*  ...have more  */
	}
	if (verb == 'A') {			/* Append a  page */
		while (0 < number--) append();	/*  ...with call  */
		goto next;			/*  ...punt this  */
	}

	if (verb == 'C') {			/* Advance char   */
		bufptx=bufptx+number;		/*  on  request   */
		if (bufptx<0) {			/* Insane request */
			fprintf(stderr,"?POP, pointer off page\n\7");
			bufptx=0;		/* Minimum place  */
			goto loop;		/*  ...abort this */
			}
		if (bufptx>bufptr) {		/* More  insanity */
			fprintf(stderr,"?POP, pointer off page\n\7");
			bufptx=bufptr;		/* Maximum place  */
			goto loop;		/*  ...abort this */
		}
		goto next;			/* Eat some more  */
	}

	if (verb == 'D') {			/* Delete char    */
		if (number == 0) goto next;	/* Must exist     */
		if (number <  0) {		/* Delete backwds */
			bufptx=bufptx+number;	/*  ...back up    */
			number=abs(number);	/*  ...magnitude  */
		}				/*  ...delete for */
		if (bufptx < 0) {		/* Sanity chk #1  */
			fprintf(stderr,"?DTB, Delete too big\n\7");
			goto loop;		/*  ...flush all  */
		}				/*  ...of buffer  */
		if (bufptx+number > bufptr) {	/* Sanity chk #2  */
			fprintf(stderr,"?DTB, Delete too big\n\7");
			goto loop;		/*  ...flush all  */
		}				/*  ...of buffer  */
		memcpy(&buffer[bufptx+1],&buffer[bufptx+number+1],bufptr-bufptx);
		bufptr=bufptr-number;		/* Show deleted.. */
		if (bufptr < bufptx) {		/*  ..not past nd */
			bufptx=bufptr;		/* Impose  sanity */
		}				/*  ..stop  this  */
		goto next;			/*  ...punt this  */
	}
	if (verb == 'E' ) {			/* Buffer  exits  */
		getptx++;			/* Advance pointr */
		if (adverb == 'F') return;	/* Terminate file */
		if (adverb == 'X') {		/* Orderly   exit */
			while (bufptr) page();	/* Write out page */
			return;			/*  ...and leave  */
		}
	      fprintf(stderr,"?IEC, Illegal character '%c' after E\n\7",adverb);	
		goto loop;			/* Punt commands  */
	}
	if (verb == 'F' ) {			/* Replaqe string */
		getptx++;			/* Advance pointr */
		if (adverb=='S' | adverb=='N') {/* ...replace cmd */
			if (1 > number) {
				fprintf(stderr,"?ISA, Illegal search arg\n\7");
				goto loop;
			}
			if (getbuf[++getptx] == 27) goto next;

			while (number--) {	/* Scan from here */
				if (adverb == 'S'){/* Local in scope */
					search();
				} else {	/* Global replace */
					next();
				}
				if (!bufptx) {	/*  ...not  found */
				      tmp=getptx;
				      while (getbuf[++getptx] != 27);
				      getbuf[getptx]='\0';
				      fprintf(stderr,"?SRH, Search failure ");
				      fprintf(stderr,"'%s'\n\7",&getbuf[tmp]);
				      goto loop;
				}
		     tmp=0;
		     while (getbuf[getptx + ++tmp] != 27);
		     memcpy(&buffer[bufptx],&buffer[bufptx+tmp],bufptr-bufptx);
		     bufptr=bufptr-tmp;

		     wrk=0;
		     while (getbuf[getptx + tmp + ++wrk] != 27);
		     wrk--;
		     bufptr++;
		     if (bufptr+wrk > bufsiz) {
			fprintf(stderr,"?MEM, Memory overflow\n\7");
			goto loop;
		     }
		     if (bufptr > bufptx) {
		      memcpy(&buffer[bufptx+wrk],&buffer[bufptx],bufptr-bufptx);
		     }
		     if (wrk > 0) {
			memcpy(&buffer[bufptx],&getbuf[getptx+tmp+1],wrk);
		     }
		     bufptx--;
		     bufptr--;
		     bufptr=bufptr+wrk;
		     bufptx=bufptx+wrk;
		     }
		     while (getbuf[++getptx] != 27);
		     while (getbuf[++getptx] != 27);
		     goto next;
		}
	fprintf(stderr,"?ILL, Illegal command '%c%c'\n\7",verb,adverb);
	goto loop;
	}
	if (verb == 'H' ) {			/* Hole   thingy  */
		getptx++;			/* Advance pointr */
		if (adverb == 'T') {		/* Type the buffr */
			tmp=0;			/* Start at begin */
			while (++tmp<=bufptr ){	/*  ...start list */
				echo(buffer[tmp]);
			}			/*  ...all done   */
			goto next;		/*  ...fetch next */
		}
		if (adverb == 'K') {		/* Kill the bufer */
			bufptr=0;		/* Nothing in it  */
			bufptx=0;		/* Force at end   */
			goto next;		/* Fetch next com */
		}
		fprintf(stderr,"?ILL, Illegal command '%c%c'\n\7",verb,adverb);
		goto loop;			/* Punt the error */
	}

	if (verb == 'I' | verb == 9) {		/* Insert    text */
		if (verb == 'I') ++getptx;	/* Skip 'I'  only */
		tmp=getptx;			/* Grab a pointer */
		if (prefix) {			/* Character inst */
			if (getbuf[tmp] != 27) {
				fprintf(stderr,"?IIA, Illegal insert arg\n\7");
				goto loop;
			}
			bufptr++;
			bufptx++;
			if (bufptr > bufsiz) {
				fprintf(stderr,"?MEM, Memory overflow\n\7");
				goto loop;
			}
			if (bufptr > bufptx) {	/* Sanity  check  */
			memcpy(&buffer[bufptx+1],&buffer[bufptx],bufptr-bufptx);
			}			/* ..only if sane */
			buffer[bufptx]=toascii(number);
			goto next;		/* Eat some  more */
		}
		while (getbuf[++tmp] != 27);	/* Find string nd */
		bufptr++;
		bufptx++;
		if (bufptr+tmp > bufsiz) {
			fprintf(stderr,"?MEM, Memory overflow\n\7");
			goto loop;
		}
		if (bufptr > bufptx) {		/* Sanity  check  */
		memcpy(&buffer[bufptx+tmp-getptx],&buffer[bufptx],bufptr-bufptx);
		}				/* ..only if sane */
		memcpy(&buffer[bufptx],&getbuf[getptx],tmp-getptx);
		bufptx--;			/* Undo the fudge */
		bufptr--;			/*  ...also fudge */
		bufptr=bufptr+tmp-getptx;	/* New buffer siz */
		bufptx=bufptx+tmp-getptx;	/* Position AFTER */
		getptx=tmp;			/* Skip insertion */
		goto next;			/*  ...fetch next */
		}

	if (verb == 'J') {			/* Jump  defaults */
		bufptx=0;			/* ...to zero !!! */
		if (prefix) {			/* Explicit  jump */
			if (number < 0) {	/* Sanity chk  #1 */
				fprintf(stderr,"?POP, Pointer off page\n\7");
				goto loop;	/*  ..insane, abt */
			}
			if (number > bufptr) {	/* Sanity chk  #2 */
				fprintf(stderr,"?POP, Pointer off page\n\7");
				bufptx=bufptr-1;/* Maximum place  */
				goto loop;	/*  ...abort  cmd */
			}
			bufptx=number;		/* Jump  location */
		}
		goto next;			/* punt, all done */
	}
	if (verb == 'K' ) {			/* delete lines   */
		kill();				/*  ...as desired */
		goto next;			/* Eat some more */
	}
	if (verb == 'L') {			/* Line  position */
		line();				/*   ...go for it */
		goto next;			/*   ...work more */
	}
	if (verb == 'N') {			/* Global  search */
		if (1 > number) {
			fprintf(stderr,"?ISA, Illegal search arg\n\7");
			goto loop;
		}
		if (getbuf[++getptx] == 27) {	/* Scan from here */
			goto next;		/*  ..null search */
		}
		while (number--) {		/* Search  counts */
			next();			/* Execute search */
			if (!bufptx) {		/*  ...not found  */
				tmp=getptx;
				while (getbuf[++getptx] != 27);
				getbuf[getptx]='\0';
				fprintf(stderr,"?SRH, Search failure ");
				fprintf(stderr,"'%s'\n\7",&getbuf[tmp]);
				goto loop;
			}
		}
		while (getbuf[++getptx] != 27) {
			bufptx++;
		}
		goto next;
	}
	if (verb == 'P') {			/* Page in buffer */
		if (number < 1) {		/* Illegal  count */
			fprintf(stderr,"?NPA, Negative page argument\n\7");
			goto loop;		/*  ...abort this */
		}
		while(number-- && bufptr)page();/*  ...do   pages */
		goto next;			/* Eat some more  */
	}
	if (verb == 'R') {			/* Backspace char */
		bufptx=bufptx-number;		/*  on  request   */
		if (bufptx<0) {			/* Insane request */
			fprintf(stderr,"?POP, pointer off page\n\7");
			bufptx=0;		/* Minimum place  */
			goto loop;		/*  ...abort this */
		}
		if (bufptx>bufptr) {		/* More insanity  */
			fprintf(stderr,"?POP, Pointer off page\n\7");
			bufptx=bufptr;		/* Maximum place  */
			goto loop;		/*  ...abort this */
		}
		goto next;			/* Eat some more  */
	}
	if (verb == 'S') {			/* Local   search */
		if (1 > number) {
			fprintf(stderr,"?ISA, Illegal search arg\n\7");
			goto loop;
		}
		if (getbuf[++getptx] == 27) {	/* Scan from here */
			goto next;		/*  ..null search */
		}
		while (number--) {		/* Search  counts */
			search();		/* Execute search */
			if (!bufptx) {		/*  ...not found  */
				tmp=getptx;
				while (getbuf[++getptx] != 27);
				getbuf[getptx]='\0';
				fprintf(stderr,"?SRH, Search failure ");
				fprintf(stderr,"'%s'\n\7",&getbuf[tmp]);
				goto loop;
			}
		}
		while (getbuf[++getptx] != 27) {
			bufptx++;
		}
		goto next;
	}
	if (verb == 'T') {			/* Type out stuff */
		type();				/*  ...get typist */
		goto next;			/* Eat more stuff */
	}
	if (verb == 'V') {			/* Verify  lines  */
		verify();			/*  ..verify type */
		goto next;			/* Eat more stuff */
	}
	if (verb == '^' & adverb == 'C') {	/* Flush politely */
		abort();			/*  ..and go away */
	}
	fprintf(stderr,"?ILL, Illegal command '%c'\n\7",verb);
	goto loop;				/* Flush command  */

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -