This is cmd.c in view mode; [Download] [Up]
/* Command execution */ #include "config.h" #include "vs.h" #include "va.h" #include "w.h" #include "tw.h" #include "bw.h" #include "pw.h" #include "tab.h" #include "qw.h" #include "menu.h" #include "help.h" #include "ublock.h" #include "uedit.h" #include "ufile.h" #include "uformat.h" #include "undo.h" #include "usearch.h" #include "uisrch.h" #include "ushell.h" #include "utag.h" #include "poshist.h" #include "macro.h" #include "hash.h" #include "rc.h" #include "umath.h" #include "uerror.h" #include "path.h" #include "zstr.h" #include "cmd.h" extern int smode; int beep=0; int uexecmd(); /* Command table */ CMD cmds[]= { { "abort", TYPETW+TYPEPW+TYPEMENU+TYPEQW, uabort, 0, 0, 0 }, { "abortbuf", TYPETW, uabortbuf, 0, 0, 0 }, { "arg", TYPETW+TYPEPW+TYPEMENU+TYPEQW, uarg, 0, 0, 0 }, { "ask", TYPETW+TYPEPW, uask, 0, 0, 0 }, { "uarg", TYPETW+TYPEPW+TYPEMENU+TYPEQW, uuarg, 0, 0, 0 }, { "backs", TYPETW+TYPEPW+ECHKXCOL+EFIXXCOL+EMINOR+EKILL+EMOD, ubacks, 0, 1, "delch" }, { "backsmenu", TYPEMENU, umbacks, 0, 1, 0 }, { "backw", TYPETW+TYPEPW+ECHKXCOL+EFIXXCOL+EKILL+EMOD, ubackw, 0, 1, "delw" }, { "bknd", TYPETW+TYPEPW, ubknd, 0, 0, 0 }, { "bkwdc", TYPETW+TYPEPW+EFIXXCOL, ubkwdc, 0, 1, "fwrdc" }, { "blkcpy", TYPETW+TYPEPW+EFIXXCOL+EMOD, ublkcpy, 0, 1, 0 }, { "blkdel", TYPETW+TYPEPW+EFIXXCOL+EKILL+EMOD, ublkdel, 0, 0, 0 }, { "blkmove", TYPETW+TYPEPW+EFIXXCOL+EMOD, ublkmove, 0, 0, 0 }, { "blksave", TYPETW+TYPEPW+0, ublksave, 0, 0, 0 }, { "bof", TYPETW+TYPEPW+EMOVE+EFIXXCOL, ubof, 0, 0, 0 }, { "bofmenu", TYPEMENU, umbof, 0, 0, 0 }, { "bol", TYPETW+TYPEPW+EFIXXCOL, ubol, 0, 0, 0 }, { "bolmenu", TYPEMENU, umbol, 0, 0, 0 }, { "bop", TYPETW+TYPEPW+EFIXXCOL, ubop, 0, 1, "eop" }, { "bos", TYPETW+TYPEPW+EMOVE, ubos, 0, 0, 0 }, { "bufed", TYPETW, ubufed, 0, 0, 0 }, { "byte", TYPETW+TYPEPW, ubyte, 0, 0, 0 }, { "center", TYPETW+TYPEPW+EFIXXCOL+EMOD, ucenter, 0, 1, 0 }, { "ctrl", TYPETW+TYPEPW+EMOD, uctrl, 0, 0, 0 }, { "col", TYPETW+TYPEPW, ucol, 0, 0, 0 }, { "complete", TYPETW+TYPEPW+EMINOR+EMOD, ucmplt, 0, 0, 0 }, { "copy", TYPETW+TYPEPW, ucopy, 0, 0, 0 }, { "crawll", TYPETW+TYPEPW, ucrawll, 0, 1, "crawlr" }, { "crawlr", TYPETW+TYPEPW, ucrawlr, 0, 1, "crawll" }, { "delbol", TYPETW+TYPEPW+EFIXXCOL+EKILL+EMOD, udelbl, 0, 1, "deleol" }, { "delch", TYPETW+TYPEPW+ECHKXCOL+EFIXXCOL+EMINOR+EKILL+EMOD, udelch, 0, 1, "backs" }, { "deleol", TYPETW+TYPEPW+EKILL+EMOD, udelel, 0, 1, "delbol" }, { "dellin", TYPETW+TYPEPW+EFIXXCOL+EKILL+EMOD, udelln, 0, 1, 0 }, { "delw", TYPETW+TYPEPW+EFIXXCOL+ECHKXCOL+EKILL+EMOD, udelw, 0, 1, "backw" }, { "dnarw", TYPETW+TYPEPW+EMOVE, udnarw, 0, 1, "uparw" }, { "dnarwmenu", TYPEMENU, umdnarw, 0, 1, "uparwmenu" }, { "dnslide", TYPETW+TYPEPW+TYPEMENU+TYPEQW+EMOVE, udnslide, 0, 1, "upslide" }, { "drop", TYPETW+TYPEPW, udrop, 0, 0, 0 }, { "dupw", TYPETW, uduptw, 0, 0, 0 }, { "edit", TYPETW+TYPEPW, uedit, 0, 0, 0 }, { "eof", TYPETW+TYPEPW+EFIXXCOL+EMOVE, ueof, 0, 0, 0 }, { "eofmenu", TYPEMENU, umeof, 0, 0, 0 }, { "eol", TYPETW+TYPEPW+EFIXXCOL, ueol, 0, 0, 0 }, { "eolmenu", TYPEMENU, umeol, 0, 0, 0 }, { "eop", TYPETW+TYPEPW+EFIXXCOL, ueop, 0, 1, "bop" }, { "execmd", TYPETW+TYPEPW, uexecmd, 0, 0, 0 }, { "explode", TYPETW+TYPEPW+TYPEMENU+TYPEQW, uexpld, 0, 0, 0 }, { "exsave", TYPETW+TYPEPW, uexsve, 0, 0, 0 }, { "ffirst", TYPETW+TYPEPW, pffirst, 0, 0, 0 }, { "filt", TYPETW+TYPEPW+EMOD, ufilt, 0, 0, 0 }, { "fnext", TYPETW+TYPEPW, pfnext, 0, 1, 0 }, { "format", TYPETW+TYPEPW+EFIXXCOL+EMOD, uformat, 0, 1, 0 }, { "fmtblk", TYPETW+EMOD+EFIXXCOL, ufmtblk, 0, 1, 0 }, { "fwrdc", TYPETW+TYPEPW+EFIXXCOL, ufwrdc, 0, 1, "bkwdc" }, { "gomark", TYPETW+TYPEPW+EMOVE, ugomark, 0, 0, 0 }, { "groww", TYPETW, ugroww, 0, 1, "shrinkw" }, { "isrch", TYPETW+TYPEPW, uisrch, 0, 0, 0 }, { "killproc", TYPETW+TYPEPW, ukillpid, 0, 0, 0 }, { "help", TYPETW+TYPEPW+TYPEQW, uhelp, 0, 0, 0 }, { "hnext", TYPETW+TYPEPW+TYPEQW, uhnext, 0, 0, 0 }, { "hprev", TYPETW+TYPEPW+TYPEQW, uhprev, 0, 0, 0 }, { "insc", TYPETW+TYPEPW+EFIXXCOL+EMOD, uinsc, 0, 1, "delch" }, { "insf", TYPETW+TYPEPW+EMOD, uinsf, 0, 0, 0 }, { "lindent", TYPETW+TYPEPW+EFIXXCOL+EMOD, ulindent, 0, 1, "rindent" }, { "line", TYPETW+TYPEPW, uline, 0, 0, 0 }, { "lose", TYPETW+TYPEPW, ulose, 0, 0, 0 }, { "ltarw", TYPETW+TYPEPW+EFIXXCOL+ECHKXCOL, ultarw, 0, 1, "rtarw" }, { "ltarwmenu", TYPEMENU, umltarw, 0, 1, "rtarwmenu" }, { "macros", TYPETW+EFIXXCOL, umacros, 0, 0, 0 }, { "markb", TYPETW+TYPEPW+0, umarkb, 0, 0, 0 }, { "markk", TYPETW+TYPEPW+0, umarkk, 0, 0, 0 }, { "markl", TYPETW+TYPEPW, umarkl, 0, 0, 0 }, { "math", TYPETW+TYPEPW, umath, 0, 0, 0 }, { "mode", TYPETW+TYPEPW+TYPEQW, umode, 0, 0, 0 }, { "msg", TYPETW+TYPEPW+TYPEQW+TYPEMENU, umsg, 0, 0, 0 }, { "nbuf", TYPETW, unbuf, 0, 1, "upbuf" }, { "nedge", TYPETW+TYPEPW+EFIXXCOL, unedge, 0, 1, "pedge" }, { "nextpos", TYPETW+TYPEPW+EFIXXCOL+EMID+EPOS, unextpos, 0, 1, "prevpos" }, { "nextw", TYPETW+TYPEPW+TYPEMENU+TYPEQW, unextw, 0, 1, "prevw" }, { "nextword", TYPETW+TYPEPW+EFIXXCOL, unxtwrd, 0, 1, "prevword" }, { "nmark", TYPETW+TYPEPW, unmark, 0, 0, 0 }, { "notmod", TYPETW, unotmod, 0, 0, 0 }, { "nxterr", TYPETW, unxterr, 0, 1, "prverr" }, { "open", TYPETW+TYPEPW+EFIXXCOL+EMOD, uopen, 0, 1, "deleol" }, { "parserr", TYPETW, uparserr, 0, 0, 0 }, { "pbuf", TYPETW, upbuf, 0, 1, "unbuf" }, { "pedge", TYPETW+TYPEPW+EFIXXCOL, upedge, 0, 1, "nedge" }, { "pgdn", TYPETW+TYPEPW+TYPEMENU+TYPEQW+EMOVE, upgdn, 0, 1, "pgup" }, { "pgup", TYPETW+TYPEPW+TYPEMENU+TYPEQW+EMOVE, upgup, 0, 1, "pgdn" }, { "play", TYPETW+TYPEPW+TYPEMENU+TYPEQW, uplay, 0, 1, 0 }, /* EFIXX? */ { "prevpos", TYPETW+TYPEPW+EPOS+EMID+EFIXXCOL, uprevpos, 0, 1, "nextpos" }, { "prevw", TYPETW+TYPEPW+TYPEMENU+TYPEQW, uprevw, 0, 1, "nextw" }, { "prevword", TYPETW+TYPEPW+EFIXXCOL+ECHKXCOL, uprvwrd, 0, 1, "nextword" }, { "prverr", TYPETW, uprverr, 0, 1, "nxterr" }, { "psh", TYPETW+TYPEPW+TYPEMENU+TYPEQW, upsh, 0, 0, 0 }, { "pop", TYPETW+TYPEPW+TYPEMENU+TYPEQW, upop, 0, 0, 0 }, { "qrepl", TYPETW+TYPEPW+EMOD, pqrepl, 0, 0, 0 }, { "query", TYPETW+TYPEPW+TYPEMENU+TYPEQW, uquery, 0, 0, 0 }, { "quote", TYPETW+TYPEPW+EMOD, uquote, 0, 0, 0 }, { "quote8", TYPETW+TYPEPW+EMOD, uquote8, 0, 0, 0 }, { "record", TYPETW+TYPEPW+TYPEMENU+TYPEQW, urecord, 0, 0, 0 }, { "redo", TYPETW+TYPEPW+EFIXXCOL, uredo, 0, 1, "undo" }, { "retype", TYPETW+TYPEPW+TYPEMENU+TYPEQW, uretyp, 0, 0, 0 }, { "rfirst", TYPETW+TYPEPW, prfirst, 0, 0, 0 }, { "rindent", TYPETW+TYPEPW+EFIXXCOL+EMOD, urindent, 0, 1, "lindent" }, { "run", TYPETW+TYPEPW, urun, 0, 0, 0 }, { "rsrch", TYPETW+TYPEPW, ursrch, 0, 0, 0 }, { "rtarw", TYPETW+TYPEPW+EFIXXCOL, urtarw, 0, 1, "ltarw" }, { "rtarwmenu", TYPEMENU, umrtarw, 0, 1, "ltarwmenu" }, { "rtn", TYPETW+TYPEPW+TYPEMENU+TYPEQW+EMOD, urtn, 0, 1, 0 }, { "save", TYPETW+TYPEPW, usave, 0, 0, 0 }, { "setmark", TYPETW+TYPEPW, usetmark, 0, 0, 0 }, { "shell", TYPETW+TYPEPW+TYPEMENU+TYPEQW, ushell, 0, 0, 0 }, { "shrinkw", TYPETW, ushrnk, 0, 1, "groww" }, { "splitw", TYPETW, usplitw, 0, 0, 0 }, { "stat", TYPETW+TYPEPW, ustat, 0, 0, 0 }, { "stop", TYPETW+TYPEPW+TYPEMENU+TYPEQW, ustop, 0, 0, 0 }, { "swap", TYPETW+TYPEPW+EFIXXCOL, uswap, 0, 0, 0 }, { "tag", TYPETW+TYPEPW, utag, 0, 0, 0 }, { "tomarkb", TYPETW+TYPEPW+EFIXXCOL, utomarkb, 0, 0, 0 }, { "tomarkbk", TYPETW+TYPEPW+EFIXXCOL, utomarkbk, 0, 0, 0 }, { "tomarkk", TYPETW+TYPEPW+EFIXXCOL, utomarkk, 0, 0, 0 }, { "tomatch", TYPETW+TYPEPW+EFIXXCOL, utomatch, 0, 0, 0 }, { "tos", TYPETW+TYPEPW+EMOVE, utos, 0, 0, 0 }, { "tw0", TYPETW+TYPEPW+TYPEQW+TYPEMENU, utw0, 0, 0, 0 }, { "tw1", TYPETW+TYPEPW+TYPEQW+TYPEMENU, utw1, 0, 0, 0 }, { "txt", TYPETW+TYPEPW, utxt, 0, 0, 0 }, { "type", TYPETW+TYPEPW+TYPEQW+TYPEMENU+EMINOR+EMOD, utype, 0, 1, "backs" }, { "undo", TYPETW+TYPEPW+EFIXXCOL, uundo, 0, 1, "redo" }, { "uparw", TYPETW+TYPEPW+EMOVE, uuparw, 0, 1, "dnarw" }, { "uparwmenu", TYPEMENU, umuparw, 0, 1, "dnarwmenu" }, { "upslide", TYPETW+TYPEPW+TYPEMENU+TYPEQW+EMOVE, uupslide, 0, 1, "dnslide" }, { "yank", TYPETW+TYPEPW+EFIXXCOL+EMOD, uyank, 0, 1, 0 }, { "yapp", TYPETW+TYPEPW+EKILL, uyapp, 0, 0, 0 }, { "yankpop", TYPETW+TYPEPW+EFIXXCOL+EMOD, uyankpop, 0, 1, 0 } }; /* Execute a command n with key k */ int execmd(cmd,k) CMD *cmd; { BW *bw=(BW *)maint->curwin->object; int ret= -1; if(cmd->m) return exmacro(cmd->m,0); /* We don't execute if we have to fix the column position first * (i.e., left arrow when cursor is in middle of nowhere) */ if((cmd->flag&ECHKXCOL) && bw->cursor->xcol!=piscol(bw->cursor)) goto skip; /* Don't execute command if we're in wrong type of window */ if(!(cmd->flag&maint->curwin->watom->what)) goto skip; if((maint->curwin->watom->what&TYPETW) && bw->b->rdonly && (cmd->flag&EMOD)) { msgnw(bw,"Read only"); if(beep) ttputc(7); goto skip; } /* Execute command */ ret=cmd->func(maint->curwin->object,k); if(smode) --smode; /* Don't update anything if we're going to leave */ if(leave) return 0; bw=(BW *)maint->curwin->object; /* Maintain position history */ /* If command was not a positioning command */ if(!(cmd->flag&EPOS) && (maint->curwin->watom->what&(TYPETW|TYPEPW))) afterpos(); /* If command was not a movement */ if(!(cmd->flag&(EMOVE|EPOS)) && (maint->curwin->watom->what&(TYPETW|TYPEPW))) aftermove(maint->curwin,bw->cursor); if(cmd->flag&EKILL) justkilled=1; else justkilled=0; skip: /* Make dislayed cursor column equal the actual cursor column * for commands which arn't simple vertical movements */ if(cmd->flag&EFIXXCOL) bw->cursor->xcol=piscol(bw->cursor); /* Recenter cursor to middle of screen */ if(cmd->flag&EMID) { int omid=mid; mid=1; dofollows(); mid=omid; } if(beep && ret) ttputc(7); return ret; } /* Return command table index for given command name */ HASH *cmdhash=0; void izcmds() { int x; cmdhash=htmk(256); for(x=0;x!=sizeof(cmds)/sizeof(CMD);++x) htadd(cmdhash,cmds[x].name,cmds+x); } CMD *findcmd(s) char *s; { if(!cmdhash) izcmds(); return (CMD *)htfind(cmdhash,s); } void addcmd(s,m) char *s; MACRO *m; { CMD *cmd=(CMD *)malloc(sizeof(CMD)); if(!cmdhash) izcmds(); cmd->name=zdup(s); cmd->flag=0; cmd->func=0; cmd->m=m; cmd->arg=1; cmd->negarg=0; htadd(cmdhash,cmd->name,cmd); } char **getcmds() { char **s=vaensure(NULL,sizeof(cmds)/sizeof(CMD)); int x; HENTRY *e; for(x=0;x!=cmdhash->len;++x) for(e=cmdhash->tab[x];e;e=e->next) s=vaadd(s,vsncpy(NULL,0,sz(e->name))); vasort(s,aLen(s)); return s; } /* Command line */ char **scmds=0; char **regsub(z,len,s) char **z; char *s; { char **lst=0; int x; for(x=0;x!=len;++x) if(rmatch(s,z[x])) lst=vaadd(lst,vsncpy(NULL,0,sz(z[x]))); return lst; } void inscmd(bw,line) BW *bw; char *line; { P *p=pdup(bw->cursor); pbol(p); peol(bw->cursor); bdel(p,bw->cursor); binsm(bw->cursor,sv(line)); peol(bw->cursor); prm(p); bw->cursor->xcol=piscol(bw->cursor); } int cmdabrt(bw,x,line) BW *bw; char *line; { if(line) inscmd(bw,line), vsrm(line); return -1; } int cmdrtn(m,x,line) MENU *m; char *line; { inscmd(m->parent->win->object,m->list[x]); vsrm(line); m->object=0; wabort(m->parent); return 0; } int cmdcmplt(bw) BW *bw; { MENU *m; P *p, *q; char *line; char *line1; char **lst; if(!scmds) scmds=getcmds(); p=pdup(bw->cursor); pbol(p); q=pdup(bw->cursor); peol(q); line=brvs(p,(int)(q->byte-p->byte)); /* Assumes short lines :-) */ prm(p); prm(q); m=mkmenu(bw,NULL,cmdrtn,cmdabrt,NULL,0,line,NULL); if(!m) return -1; line1=vsncpy(NULL,0,sv(line)); line1=vsadd(line1,'*'); lst=regsub(scmds,aLEN(scmds),line1); vsrm(line1); ldmenu(m,lst,0); if(!lst) { wabort(m->parent); ttputc(7); return -1; } else { if(aLEN(lst)==1) return cmdrtn(m,0,line); else if(smode || isreg(line)) return 0; else { char *com=mcomplete(m); vsrm(m->object); m->object=com; wabort(m->parent); smode=2; ttputc(7); return 0; } } } int docmd(bw,s,object,notify) BW *bw; char *s; void *object; int *notify; { MACRO *mac; int ret= -1; CMD *cmd=findcmd(s); if(!cmd) msgnw(bw,"No such command"); else { mac=mkmacro(MAXINT,0,0,cmd); ret=exmacro(mac,1); rmmacro(mac); } if(notify) *notify=1; return ret; } B *cmdhist=0; int uexecmd(bw) BW *bw; { if(wmkpw(bw,"cmd: ",&cmdhist,docmd,"cmd",NULL,cmdcmplt,NULL,NULL)) return 0; else return -1; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.