www.pudn.com > c_editor.rar > ED2.C
/* ED2.C */ #include "ed0.c" #include "ed1.ccc" #define SIGNON "E.K. Ream/Dr Dobb's Editor - IBM PC enhancement: Mar. 10, 1984" #define SIGNNN " Modified by Alan D. Howard" #define HELP1 "open| name | rename | delname " #define HELP2 "load | append | rest | read | write | save" #define HELP3 "extract [ ] | closeread | closewrite" #define HELP4 "clear | delete [ ] | move [ ] | copy [ ]" #define HELP5 "find | search [ ] | change [ ] | list [ ]" #define HELP6 "tabs | showtab | hidetab | help | dos | g | count " #define CMNDMODE 1 #define INSMODE 2 #define EDITMODE 3 #define EXITMODE 4 int begin_line, end_line, buf_picked; main(argc,argv) char *argv[]; { int mode; int i; sysinit(); fmtassn(NO); fmtset(8); fmtntab(); outclr(); outxy(0,SCRNL1); message(SIGNON); message(SIGNNN); outxy(0,1); fileclear(); /* make sure no read or write files indicated */ bufnew(); begin_line=(-1); /* imaginary to start with */ end_line=(-1); buf_picked=NO; mode=CMNDMODE; if (argc>1) { openf(argv[1],NO); rest(argv[0]); outxy(0,1); } edgetln(); while(1){ if (mode ==EXITMODE) { sysfinish(); break; } else if (mode==CMNDMODE) { mode=command(); } else if (mode==EDITMODE) { mode=edit(); } else if (mode==INSMODE) { mode=insert(); } else { syserr("main: no mode"); mode=EDITMODE; } } } edit() { char c; pmtedit(); while(1){ c=syscin(); /* tolower eliminated */ if (c==ESC1) { /* enter command mode */ return(CMNDMODE); } else if (c==INS1) { /* enter insert mode */ return(INSMODE); } else if (special(c)==YES) { if (c==UP1){ /* DOWN1 now treated separately */ return(INSMODE); } else { continue; } } else if (c==DOWN1) { /* DOWN1 now does not */ eddn(); /* enter insert mode but */ pmtline(); /* just advances to next line */ edbegin(); pmtcol(); } else if (c==DTOCH){ /* kill to character entered */ pmtmode("edit: kill"); c=syscin(); if ((special(c)==NO) & (control(c)==NO)) { edkill(c); } pmtedit(); } else if (c==GTOCH){ /* search to character entered */ pmtmode("edit: search"); c=syscin(); if ((special(c)==NO) & (control(c)==NO)) { edsrch(c); } pmtedit(); } else { /* editor now exchanges any other character */ if ((special(c)==NO) & /* with cursor */ (control(c)==NO)) { edchng(c); } pmtcol(); } } } insert() { char c; pmtmode("insert"); while(1) { c=syscin(); if (c==ESC1) { return(CMNDMODE); } else if (c==EDIT1) { return(EDITMODE); } else if (c==INS1) { ; } else if (c==DOWN1) { /* in insert mode DOWN1 treated */ ednewdn(); /* differently from edit mode */ pmtline(); /* inserts new line */ continue; } else if (c==DTOCH){ /* kill to character entered */ pmtmode("Insert: kill"); c=syscin(); if ((special(c)==NO) & (control(c)==NO)) { edkill(c); } } else if (c==GTOCH){ /* search to character entered */ pmtmode("Insert: search"); c=syscin(); if ((special(c)==NO) & (control(c)==NO)) { edsrch(c); } } else if (special(c)==YES) { continue; } else if (control(c)==YES) { continue; } else { edins(c); pmtcol(); } } } control(c) char c; { if (c==TAB) { return(NO); } else if (c>=127) { return(YES); } else if (c<32) { return(YES); } else { return(NO); } } special(c) char c; { char sbuffer[SCRNW1]; int v,x,y; int k; if (c==JOIN1) { edjoin(); pmtline(); return(YES); } if (c==SPLT1) { edsplit(); pmtline(); return(YES); } if (c==ABT1) { edabt(); pmtcol(); return(YES); } else if (c==LFTDEL) { /* delete to left of cursor */ edldel(); pmtcol(); return(YES); } else if (c==DEL1) { /* delete at cursor */ edcdel(); pmtcol(); return(YES); } else if (c==ZAP1) { edzap(); pmtline(); return(YES); } else if (c==UP2) { edup(); pmtline(); return(YES); } else if (c==UP1) { ednewup(); pmtline(); return(YES); } /* DOWN1 (CR) is no longer a special character */ else if (c==DOWN2) { eddn(); pmtline(); return(YES); } else if (c==ABSLEFT) { /* left one column */ edabsleft(); pmtcol(); return(YES); } else if (c==ABSRGHT) { /* right one column */ edabsright(); pmtcol(); return(YES); } else if (c==LEFT1) { /* left one character */ edleft(); pmtcol(); return(YES); } else if (c==RIGHT1) { /* right one character */ edright(); pmtcol(); return(YES); } else if (c==BEGINPL) { /* mark beginning line */ begin_line=bufln(); pmtmode("marked buff top"); return(YES); } else if (c==ENDPL) { /* mark ending line */ end_line=bufln(); pmtmode("marked buff end"); return(YES); } else if (c==PICKIT) { /* pick marked lines to buffer */ if (edpick(begin_line,end_line)!=ERR) { pmtmode("buffer picked"); buf_picked=YES; } return(YES); } else if (c==RIGHT1) { /* go to end of line */ edright(); pmtcol(); return(YES); } else if (c==ERASE) { /* erase to end of line */ ederase(); pmtcol(); return(YES); } else if (c==HOME) { /* move cursor alternatingly to */ edhome(); /* top and bottom of screen */ pmtline(); sysabort(); return(YES); } else if (c==LSTRT) { /* move to beginning of line */ edbegin(); pmtcol(); return(YES); } else if (c==PUTIT) { /* put buffer before line*/ if (buf_picked==YES) { edput(); begin_line=(-1); end_line=(-1); } pmtline(); return(YES); } else if (c==DSCROL) { /* scroll down */ pmtmode("Scroll down"); while (bufnrbot()==NO) { if (chkkey()==YES) { break; } if (eddn()==ERR) { break; } } pmtline(); return(YES); } else if (c==LEND){ /* move to end of line */ edend(); pmtcol(); return(YES); } else if (c==PAGEUP) { /* move up 20 lines */ y=bufln(); y=max(y-20,1); if (bufattop()!=YES) { edgo(y,0); } pmtline(); return(YES); } else if (c==PAGEDN) { /*move down 20 lines */ y=bufln(); y=y+20; if (bufnrbot()!=YES) { edgo(y,0); } pmtline(); return(YES); } else if (c==GOTO){ /* go to line entered */ x=outxget(); y=outyget(); pmtcmnd("Goto: ",sbuffer); if(number(sbuffer,&v)) { edgo(v,0); } else { outxy(x,y); } return(YES); } else if (c==USCROL) { /* scroll up */ pmtmode("Scroll up"); while (bufattop()==NO) { if (chkkey()==YES) { break; } if (edup()==ERR) { break; } } pmtline(); return(YES); } else { return(NO); } } command() { int v; char c; char args[SCRNW1]; char *argp; int topline; int ypos; int oldline; int k; edrepl(); oldline=bufln(); ypos=outyget(); topline=oldline-ypos+1; while(1) { outxy(0,SCRNL1); fmtcrlf(); pmtmode("command:"); getcmnd(args,0); fmtcrlf(); pmtline(); c=args[0]; if ((c==EDIT1)|(c==INS1)) { if (oldline==bufln()) { edgetln(); bufout(topline,1,SCRNL1); outxy(0,ypos); } else { edgo(bufln(),0); } if (c==EDIT1) { return(EDITMODE); } else { return(INSMODE); } } else if (tolower(args[0])=='g'){ argp=skipbl(args+1); if (argp[0]==EOS) { edgo(oldline,0); return(EDITMODE); } else if (number(argp,&v)==YES) { edgo(v,0); return(EDITMODE); } else { message("bad line number"); } } else if (lookup(args,"append")) { append(args); } else if (lookup(args,"change")) { change(args,begin_line,end_line); } else if (lookup(args,"clear")) { sysabort(); clear(); } else if (lookup(args,"count")) { /* repeat count for replay */ count(args); } else if (lookup(args,"delete")) { delete(args,begin_line,end_line); begin_line=(-1); end_line=(-1); buf_picked=YES; } else if (lookup(args,"dos")) { sysabort(); if (chkbuf()==YES) { closewrite(); /* write file closed on exit */ return(EXITMODE); } } else if (lookup(args,"find")) { if ((k=find()) >= 0) { edgo(bufln(),k); return(EDITMODE); } else { bufgo(oldline); edgetln(); message("pattern not found"); } } else if (lookup(args,"list")) { list(args,begin_line,end_line); } else if (lookup(args,"open")) { /* new */ sysabort(); openf(args,YES); } else if (lookup(args,"load")) { /* changed */ sysabort(); openf(args,YES); rest(args); } else if (lookup(args,"name")) { sysabort(); name(args); } else if (lookup(args,"write")) { /* new */ sysabort(); writel(args); } else if (lookup(args,"rename")) { /* new */ sysabort(); rename(args); } else if (lookup(args,"delname")) { /* new */ sysabort(); delname(args); } else if (lookup(args,"closewrite")) { /* new */ sysabort(); closewrite(args); } else if (lookup(args,"showtab")) { /* new */ fmtytab(); } else if (lookup(args,"hidetab")) { /* new */ fmtntab(); } else if (lookup(args,"closeread")) { /* new */ sysabort(); closeread(args); } else if (lookup(args,"help")) { /* new */ sysabort(); outclr(); outxy(0,SCRNL1); message(HELP1); message(HELP2); message(HELP3); message(HELP4); message(HELP5); message(HELP6); } else if (lookup(args,"save")) { sysabort(); save(args); } else if (lookup(args,"read")) { /* new */ sysabort(); getit(args); } else if (lookup(args,"move")) { /* new */ moveit(args,begin_line,end_line,bufln()); begin_line=(-1); end_line=(-1); } else if (lookup(args,"copy")) { /* new */ copyit(args,begin_line,end_line,bufln()); begin_line=(-1); end_line=(-1); } else if (lookup(args,"search")) { sysabort(); search(args,begin_line,end_line); } else if (lookup(args,"tabs")) { tabs(args); } else if (lookup(args,"rest")) { /* new */ sysabort(); rest(args); } else if (lookup(args,"extract")) { /* new */ sysabort(); extract(args); } else { sysabort(); message("command not found"); } } } lookup(line,command) char *line, *command; { while(*command) { if (tolower(*line++)!=*command++) { return(NO); } } if((*line==EOS)|(*line==' ')|(*line==TAB)) { return(YES); } else { return(NO); } } getcmnd(args,offset) char *args; int offset; { int j,k; char c; outxy(offset++,outyget()); outdeol(); scr_chr_attr(SETINTENSE); /* set up prompt */ scr_chr_attr(SETBLINK); syscout('>'); scr_chr_attr(NOBLINK); k=0; while ((c=syscin())!=CR) { if ((c==EDIT1)|(c==INS1)) { args[0]=c; return; } if ((c==DEL1)|(c==LEFT1)) { if (k>0) { outxy(offset,outyget()); outdeol(); k--; j=0; while (j