WORK.C
上传用户:xiantiandi
上传日期:2007-01-06
资源大小:21k
文件大小:11k
- #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 commandn7");
- 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,"%dn",number);
- } else {
- fprintf(stderr,"?NAE, No arg before =n7");
- }
- 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 iterationn7");
- 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 overflown7");
- 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 pagen7");
- bufptx=0; /* Minimum place */
- goto loop; /* ...abort this */
- }
- if (bufptx>bufptr) { /* More insanity */
- fprintf(stderr,"?POP, pointer off pagen7");
- 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 bign7");
- goto loop; /* ...flush all */
- } /* ...of buffer */
- if (bufptx+number > bufptr) { /* Sanity chk #2 */
- fprintf(stderr,"?DTB, Delete too bign7");
- 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 En7",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 argn7");
- 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]=' ';
- fprintf(stderr,"?SRH, Search failure ");
- fprintf(stderr,"'%s'n7",&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 overflown7");
- 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'n7",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'n7",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 argn7");
- goto loop;
- }
- bufptr++;
- bufptx++;
- if (bufptr > bufsiz) {
- fprintf(stderr,"?MEM, Memory overflown7");
- 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 overflown7");
- 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 pagen7");
- goto loop; /* ..insane, abt */
- }
- if (number > bufptr) { /* Sanity chk #2 */
- fprintf(stderr,"?POP, Pointer off pagen7");
- 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 argn7");
- 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]=' ';
- fprintf(stderr,"?SRH, Search failure ");
- fprintf(stderr,"'%s'n7",&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 argumentn7");
- 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 pagen7");
- bufptx=0; /* Minimum place */
- goto loop; /* ...abort this */
- }
- if (bufptx>bufptr) { /* More insanity */
- fprintf(stderr,"?POP, Pointer off pagen7");
- 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 argn7");
- 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]=' ';
- fprintf(stderr,"?SRH, Search failure ");
- fprintf(stderr,"'%s'n7",&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'n7",verb);
- goto loop; /* Flush command */
- }