void execmd(n,k) { BW *bw=(BW *)maint->curwin->object; if((cmdtab.cmd[n].flag&ECHKXCOL) && bw->cursor->xcol!=bw->cursor->col) goto skip; if(!(cmdtab.cmd[n].flag&maint->curwin->watom->what)) goto skip; cmdtab.cmd[n].func(maint->curwin,k); if(leave) return; bw=(BW *)maint->curwin->object; if(!(cmdtab.cmd[n].flag&EPOS) && (maint->curwin->watom->what&(TYPETW|TYPEPW))) afterpos(maint->curwin,bw->cursor); if(!(cmdtab.cmd[n].flag&(EMOVE|EPOS)) && (maint->curwin->watom->what&(TYPETW|TYPEPW))) aftermove(maint->curwin,bw->cursor); skip: if(cmdtab.cmd[n].flag&EFIXXCOL) bw->cursor->xcol=bw->cursor->col; if(cmdtab.cmd[n].flag&EMID) { int omid=mid; mid=1; dofollows(); mid=omid; } }
int execmd(CMD *cmd, int k) { BW *bw = (BW *) maint->curwin->object; int ret = -1; /* Warning: bw is a BW * only if maint->curwin->watom->what & (TYPETW|TYPEPW) */ #if junk /* Send data to shell window: this is broken ^K ^H (help) sends its ^H to shell */ if ((maint->curwin->watom->what & TYPETW) && bw->b->pid && !bw->b->vt && piseof(bw->cursor) && (k==3 || k==9 || k==13 || k==8 || k==127 || k==4 || (cmd->func==utype /* && k>=32 && k<256 */))) { unsigned char c = k; joe_write(bw->b->out, &c, 1); return 0; } #endif 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) { if (bw->o.hex) bw->cursor->xcol = piscol(bw->cursor); else if (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; /* Complete selection for block commands */ if ((cmd->flag & EBLOCK) && nowmarking) utoggle_marking(maint->curwin->object); /* We are about to modify the file */ if ((maint->curwin->watom->what & TYPETW) && (cmd->flag & EMOD)) { if (!modify_logic(bw,bw->b)) 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; /* cmd->func could have changed bw on us */ /* This is bad: maint->curwin might not be the same window */ /* Safer would be to attach a pointer to curwin- if curwin gets clobbered, so does pointer. */ 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) && (maint->curwin->watom->what & (TYPETW | TYPEPW))) 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 (joe_beep && ret) ttputc(7); return ret; }