/*************************************************************************** * This program is Copyright (C) 1986, 1987, 1988 by Jonathan Payne. JOVE * * is provided to you without charge, and with no warranty. You may give * * away copies of JOVE, including sources, provided that this notice is * * included in all the files. * ***************************************************************************/ #include "jove.h" #include "ctype.h" #if !defined(TXT_TO_C) extern void EscPrefix(), CtlxPrefix(), MiscPrefix(), UnbindC(), ShowVersion(), WVisSpace(), #ifdef ANSICODES AnsiCodes(), #endif AppReg(), Apropos(), BackChar(), BList(), FList(), BUpList(), FDownList(), BSexpr(), BackWord(), Bof(), Bol(), Bos(), Bow(), BindAKey(), BindMac(), BufPos(), #ifdef MSDOS Buf1Select(), Buf2Select(), Buf3Select(), Buf4Select(), Buf5Select(), Buf6Select(), Buf7Select(), Buf8Select(), Buf9Select(), Buf10Select(), #endif /* MSDOS */ CasRegLower(), CasRegUpper(), CapChar(), CapWord(), LowWord(), UppWord(), #ifdef CHDIR Chdir(), prCWD(), prDIRS(), Pushd(), Popd(), #endif prCTIME(), ChrToOct(), ClAndRedraw(), #ifndef MAC MakeErrors(), #endif CopyRegion(), BufSelect(), DelBlnkLines(), DelNChar(), DelNWord(), OneWindow(), DelPChar(), DelPWord(), DelReg(), KillSome(), DelWtSpace(), DelCurWindow(), KeyDesc(), Digit(), Digit0(), Digit1(), Digit2(), Digit3(), Digit4(), Digit5(), Digit6(), Digit7(), Digit8(), Digit9(), DescBindings(), DescCom(), Eof(), Eol(), Eos(), Eow(), ForPara(), BackPara(), BufErase(), PtToMark(), Extend(), ExecMacro(), RunMacro(), Leave(), FindFile(), WindFind(), FindTag(), FDotTag(), ToIndent(), ForChar(), FSexpr(), ForWord(), TimesFour(), GoLine(), GrowWindow(), IncFSearch(), IncRSearch(), InsFile(), Justify(), RegJustify(), SetLMargin(), SetRMargin(), BufKill(), KillBos(), KillEos(), KillEOL(), KillExpr(), BufList(), NotModified(), NameMac(), DelMacro(), Newline(), OpenLine(), LineAI(), #ifndef MAC ShowErr(), NextError(), #endif /* MAC */ #ifdef MSDOS PageScrollUp(), PageScrollDown(), #endif /* MSDOS */ #ifndef MAC PrevError(), #endif /* MAC */ NextLine(), NextPage(), NextWindow(), Recur(), PopMark(), PageNWind(), Tab(), DoParen(), #ifndef MAC ParseAll(), #endif #ifdef SPELL SpelWords(), #endif #ifdef JOB_CONTROL PauseJove(), #endif PrevLine(), PrevPage(), PrevWindow(), #ifndef MAC Push(), #endif RegReplace(), QRepSearch(), QuotChar(), ReadFile(), DefKBDMac(), RedrawDisplay(), ReNamBuf(), RepSearch(), DownScroll(), UpScroll(), ForSearch(), FSrchND(), RevSearch(), RSrchND(), SelfInsert(), SetVar(), SetMark(), #ifndef MAC ShellCom(), ShNoBuf(), Shtypeout(), ShToBuf(), #endif ShrWindow(), Source(), #ifdef SPELL SpelBuffer(), #endif SplitWind(), GotoWind(), Remember(), Forget(), StrLength(), TransChar(), TransLines(), SaveFile(), WtModBuf(), WriteFile(), WriteMacs(), WrtReg(), Yank(), YankPop(), PrVar(), #ifndef MAC FilterRegion(), #endif WNumLines(), #ifdef IPROCS ShellProc(), ProcInt(), ProcQuit(), ProcKill(), # ifndef PIPEPROCS ProcEof(), ProcStop(), ProcCont(), ProcDStop(), # endif ProcSendData(), ProcNewline(), ProcList(), ProcBind(), Iprocess(), #endif #ifdef LISP GSexpr(), /* Grind S Expression. */ AddSpecial(), /* add lisp special form */ #endif CAutoExec(), MAutoExec(), DefMAbbrev(), DefGAbbrev(), SaveAbbrevs(), RestAbbrevs(), EditAbbrevs(), BindMtoW(), #ifdef CMT_FMT Comment(), #endif ScrollLeft(), ScrollRight(), MacInter(); /* This is the last one. */ #ifdef MAC # define WIRED_CMD(c) c,'\0','\0' /* for About Jove... */ #else # define WIRED_CMD(c) c #endif /* MAC */ #else /* TXT_TO_C */ #ifdef MAC # define WIRED_CMD(c) 0,'\0','\0' #else # define WIRED_CMD(c) 0 #endif #endif /* TXT_TO_C */ struct cmd commands[] = { #ifdef LISP FUNCTION, "add-lisp-special", WIRED_CMD(AddSpecial), #endif #ifdef ANSICODES FUNCTION, "ansi-codes", WIRED_CMD(AnsiCodes), #endif FUNCTION, "append-region", WIRED_CMD(AppReg), FUNCTION, "apropos", WIRED_CMD(Apropos), FUNCTION, "auto-execute-command", WIRED_CMD(CAutoExec), FUNCTION, "auto-execute-macro", WIRED_CMD(MAutoExec), DefMinor(Fill), "auto-fill-mode", WIRED_CMD(0), DefMinor(Indent), "auto-indent-mode", WIRED_CMD(0), FUNCTION, "backward-character", WIRED_CMD(BackChar), FUNCTION, "backward-list", WIRED_CMD(BList), FUNCTION, "backward-paragraph", WIRED_CMD(BackPara), FUNCTION, "backward-s-expression", WIRED_CMD(BSexpr), FUNCTION, "backward-sentence", WIRED_CMD(Bos), FUNCTION, "backward-up-list", WIRED_CMD(BUpList), FUNCTION, "backward-word", WIRED_CMD(BackWord), FUNCTION, "begin-kbd-macro", WIRED_CMD(Remember), FUNCTION, "beginning-of-file", WIRED_CMD(Bof), FUNCTION, "beginning-of-line", WIRED_CMD(Bol), FUNCTION, "beginning-of-window", WIRED_CMD(Bow), FUNCTION, "bind-to-key", WIRED_CMD(BindAKey), FUNCTION, "bind-macro-to-key", WIRED_CMD(BindMac), #ifdef ABBREV FUNCTION, "bind-macro-to-word-abbrev", WIRED_CMD(BindMtoW), #endif FUNCTION, "buffer-position", WIRED_CMD(BufPos), DefMajor(CMODE), "c-mode", WIRED_CMD(0), FUNCTION, "case-character-capitalize", WIRED_CMD(CapChar), FUNCTION, "case-region-lower", WIRED_CMD(CasRegLower), FUNCTION, "case-region-upper", WIRED_CMD(CasRegUpper), FUNCTION, "case-word-capitalize", WIRED_CMD(CapWord), FUNCTION, "case-word-lower", WIRED_CMD(LowWord), FUNCTION, "case-word-upper", WIRED_CMD(UppWord), FUNCTION, "character-to-octal-insert", WIRED_CMD(ChrToOct), #ifdef CHDIR FUNCTION, "cd", WIRED_CMD(Chdir), #endif FUNCTION, "clear-and-redraw", WIRED_CMD(ClAndRedraw), #ifndef MAC FUNCTION, "compile-it", WIRED_CMD(MakeErrors), #endif #ifdef IPROCS # ifndef PIPEPROCS # ifdef TIOCSLTC FUNCTION, "continue-process", WIRED_CMD(ProcCont), # endif # endif #endif FUNCTION, "copy-region", WIRED_CMD(CopyRegion), #ifndef MAC FUNCTION, "current-error", WIRED_CMD(ShowErr), #endif FUNCTION, "date", WIRED_CMD(prCTIME), #ifdef ABBREV FUNCTION, "define-global-word-abbrev", WIRED_CMD(DefGAbbrev), FUNCTION, "define-mode-word-abbrev", WIRED_CMD(DefMAbbrev), #endif FUNCTION, "define-macro", WIRED_CMD(DefKBDMac), FUNCTION, "delete-blank-lines", WIRED_CMD(DelBlnkLines), FUNCTION, "delete-buffer", WIRED_CMD(BufKill), FUNCTION, "delete-macro", WIRED_CMD(DelMacro), FUNCTION, "delete-next-character", WIRED_CMD(DelNChar), FUNCTION, "delete-other-windows", WIRED_CMD(OneWindow), FUNCTION, "delete-previous-character", WIRED_CMD(DelPChar), FUNCTION, "delete-white-space", WIRED_CMD(DelWtSpace), FUNCTION, "delete-current-window", WIRED_CMD(DelCurWindow), FUNCTION, "describe-bindings", WIRED_CMD(DescBindings), FUNCTION, "describe-command", WIRED_CMD(DescCom), FUNCTION, "describe-key", WIRED_CMD(KeyDesc), FUNCTION, "describe-variable", WIRED_CMD(DescCom), FUNCTION, "digit", WIRED_CMD(Digit), FUNCTION, "digit-1", WIRED_CMD(Digit1), FUNCTION, "digit-2", WIRED_CMD(Digit2), FUNCTION, "digit-3", WIRED_CMD(Digit3), FUNCTION, "digit-4", WIRED_CMD(Digit4), FUNCTION, "digit-5", WIRED_CMD(Digit5), FUNCTION, "digit-6", WIRED_CMD(Digit6), FUNCTION, "digit-7", WIRED_CMD(Digit7), FUNCTION, "digit-8", WIRED_CMD(Digit8), FUNCTION, "digit-9", WIRED_CMD(Digit9), FUNCTION, "digit-0", WIRED_CMD(Digit0), #ifdef CHDIR FUNCTION, "dirs", WIRED_CMD(prDIRS), #endif FUNCTION, "down-list", WIRED_CMD(FDownList), #ifdef IPROCS # ifndef PIPEPROCS # ifdef TIOCSLTC FUNCTION, "dstop-process", WIRED_CMD(ProcDStop), # endif # endif #endif #ifdef ABBREV FUNCTION, "edit-word-abbrevs", WIRED_CMD(EditAbbrevs), #endif FUNCTION, "end-kbd-macro", WIRED_CMD(Forget), FUNCTION, "end-of-file", WIRED_CMD(Eof), FUNCTION, "end-of-line", WIRED_CMD(Eol), FUNCTION, "end-of-window", WIRED_CMD(Eow), #ifdef IPROCS # ifndef PIPEPROCS FUNCTION, "eof-process", WIRED_CMD(ProcEof), # endif #endif FUNCTION, "erase-buffer", WIRED_CMD(BufErase), FUNCTION, "exchange-point-and-mark", WIRED_CMD(PtToMark), FUNCTION, "execute-named-command", WIRED_CMD(Extend), FUNCTION, "execute-kbd-macro", WIRED_CMD(ExecMacro), FUNCTION, "execute-macro", WIRED_CMD(RunMacro), FUNCTION, "exit-jove", WIRED_CMD(Leave), #ifdef CMT_FMT FUNCTION, "fill-comment", WIRED_CMD(Comment), #endif /* CMT_FMT */ FUNCTION, "fill-paragraph", WIRED_CMD(Justify), FUNCTION, "fill-region", WIRED_CMD(RegJustify), #ifndef MAC FUNCTION, "filter-region", WIRED_CMD(FilterRegion), #endif FUNCTION, "find-file", WIRED_CMD(FindFile), FUNCTION, "find-tag", WIRED_CMD(FindTag), FUNCTION, "find-tag-at-point", WIRED_CMD(FDotTag), FUNCTION, "first-non-blank", WIRED_CMD(ToIndent), FUNCTION, "forward-character", WIRED_CMD(ForChar), FUNCTION, "forward-list", WIRED_CMD(FList), FUNCTION, "forward-paragraph", WIRED_CMD(ForPara), FUNCTION, "forward-s-expression", WIRED_CMD(FSexpr), FUNCTION, "forward-sentence", WIRED_CMD(Eos), FUNCTION, "forward-word", WIRED_CMD(ForWord), DefMajor(FUNDAMENTAL), "fundamental-mode", WIRED_CMD(0), FUNCTION, "gather-numeric-argument", WIRED_CMD(TimesFour), #ifdef LISP FUNCTION, "grind-s-expr", WIRED_CMD(GSexpr), #endif FUNCTION, "goto-line", WIRED_CMD(GoLine), FUNCTION, "goto-window-with-buffer", WIRED_CMD(GotoWind), FUNCTION, "grow-window", WIRED_CMD(GrowWindow), FUNCTION, "handle-tab", WIRED_CMD(Tab), FUNCTION, "i-search-forward", WIRED_CMD(IncFSearch), FUNCTION, "i-search-reverse", WIRED_CMD(IncRSearch), FUNCTION, "insert-file", WIRED_CMD(InsFile), #ifdef IPROCS FUNCTION, "interrupt-process", WIRED_CMD(ProcInt), FUNCTION, "i-shell-command", WIRED_CMD(Iprocess), #endif FUNCTION, "kill-next-word", WIRED_CMD(DelNWord), FUNCTION, "kill-previous-word", WIRED_CMD(DelPWord), #ifdef IPROCS FUNCTION, "kill-process", WIRED_CMD(ProcKill), #endif FUNCTION, "kill-region", WIRED_CMD(DelReg), FUNCTION, "kill-s-expression", WIRED_CMD(KillExpr), FUNCTION, "kill-some-buffers", WIRED_CMD(KillSome), FUNCTION, "kill-to-beginning-of-sentence", WIRED_CMD(KillBos), FUNCTION, "kill-to-end-of-line", WIRED_CMD(KillEOL), FUNCTION, "kill-to-end-of-sentence", WIRED_CMD(KillEos), FUNCTION, "left-margin-here", WIRED_CMD(SetLMargin), #ifdef LISP DefMajor(LISPMODE), "lisp-mode", WIRED_CMD(0), #endif FUNCTION, "list-buffers", WIRED_CMD(BufList), #ifdef IPROCS FUNCTION, "list-processes", WIRED_CMD(ProcList), #endif FUNCTION, "make-buffer-unmodified", WIRED_CMD(NotModified), FUNCTION, "make-macro-interactive", WIRED_CMD(MacInter), FUNCTION, "name-kbd-macro", WIRED_CMD(NameMac), FUNCTION, "newline", WIRED_CMD(Newline), FUNCTION, "newline-and-backup", WIRED_CMD(OpenLine), FUNCTION, "newline-and-indent", WIRED_CMD(LineAI), #ifndef MAC FUNCTION, "next-error", WIRED_CMD(NextError), #endif FUNCTION, "next-line", WIRED_CMD(NextLine), FUNCTION, "next-page", WIRED_CMD(NextPage), FUNCTION, "next-window", WIRED_CMD(NextWindow), FUNCTION, "number-lines-in-window", WIRED_CMD(WNumLines), DefMinor(OverWrite), "over-write-mode", WIRED_CMD(0), FUNCTION, "page-next-window", WIRED_CMD(PageNWind), FUNCTION, "paren-flash", WIRED_CMD(DoParen), #ifndef MAC FUNCTION, "parse-errors", WIRED_CMD(ErrParse), #endif #ifdef SPELL FUNCTION, "parse-spelling-errors-in-buffer", WIRED_CMD(SpelWords), #endif #ifdef JOB_CONTROL FUNCTION, "pause-jove", WIRED_CMD(PauseJove), #else # ifndef MAC FUNCTION, "pause-jove", WIRED_CMD(Push), # endif #endif FUNCTION, "pop-mark", WIRED_CMD(PopMark), #ifdef CHDIR FUNCTION, "popd", WIRED_CMD(Popd), #endif FUNCTION, "prefix-1", WIRED_CMD(EscPrefix), FUNCTION, "prefix-2", WIRED_CMD(CtlxPrefix), FUNCTION, "prefix-3", WIRED_CMD(MiscPrefix), #ifndef MAC FUNCTION, "previous-error", WIRED_CMD(PrevError), #endif FUNCTION, "previous-line", WIRED_CMD(PrevLine), FUNCTION, "previous-page", WIRED_CMD(PrevPage), FUNCTION, "previous-window", WIRED_CMD(PrevWindow), FUNCTION, "print", WIRED_CMD(PrVar), #ifdef IPROCS FUNCTION, "process-bind-to-key", WIRED_CMD(ProcBind), FUNCTION, "process-newline", WIRED_CMD(ProcNewline), FUNCTION, "process-send-data-no-return", WIRED_CMD(ProcSendData), #endif #ifndef MAC FUNCTION, "push-shell", WIRED_CMD(Push), #endif #ifdef CHDIR FUNCTION, "pushd", WIRED_CMD(Pushd), FUNCTION, "pwd", WIRED_CMD(prCWD), #endif FUNCTION, "query-replace-string", WIRED_CMD(QRepSearch), #ifdef IPROCS FUNCTION, "quit-process", WIRED_CMD(ProcQuit), #endif FUNCTION, "quoted-insert", WIRED_CMD(QuotChar), #ifdef ABBREV FUNCTION, "read-word-abbrev-file", WIRED_CMD(RestAbbrevs), #endif FUNCTION, "redraw-display", WIRED_CMD(RedrawDisplay), FUNCTION, "recursive-edit", WIRED_CMD(Recur), FUNCTION, "rename-buffer", WIRED_CMD(ReNamBuf), FUNCTION, "replace-in-region", WIRED_CMD(RegReplace), FUNCTION, "replace-string", WIRED_CMD(RepSearch), FUNCTION, "right-margin-here", WIRED_CMD(SetRMargin), FUNCTION, "save-file", WIRED_CMD(SaveFile), FUNCTION, "scroll-down", WIRED_CMD(DownScroll), FUNCTION, "scroll-left", WIRED_CMD(ScrollLeft), #ifdef MSDOS FUNCTION, "scroll-next-page", WIRED_CMD(PageScrollUp), FUNCTION, "scroll-previous-page", WIRED_CMD(PageScrollDown), #endif /* MSDOS */ FUNCTION, "scroll-right", WIRED_CMD(ScrollRight), FUNCTION, "scroll-up", WIRED_CMD(UpScroll), FUNCTION, "search-forward", WIRED_CMD(ForSearch), FUNCTION, "search-forward-nd", WIRED_CMD(FSrchND), FUNCTION, "search-reverse", WIRED_CMD(RevSearch), FUNCTION, "search-reverse-nd", WIRED_CMD(RSrchND), FUNCTION, "select-buffer", WIRED_CMD(BufSelect), #ifdef MSDOS FUNCTION, "select-buffer-1", WIRED_CMD(Buf1Select), FUNCTION, "select-buffer-2", WIRED_CMD(Buf2Select), FUNCTION, "select-buffer-3", WIRED_CMD(Buf3Select), FUNCTION, "select-buffer-4", WIRED_CMD(Buf4Select), FUNCTION, "select-buffer-5", WIRED_CMD(Buf5Select), FUNCTION, "select-buffer-6", WIRED_CMD(Buf6Select), FUNCTION, "select-buffer-7", WIRED_CMD(Buf7Select), FUNCTION, "select-buffer-8", WIRED_CMD(Buf8Select), FUNCTION, "select-buffer-9", WIRED_CMD(Buf9Select), FUNCTION, "select-buffer-10", WIRED_CMD(Buf10Select), #endif /* MSDOS */ FUNCTION, "self-insert", WIRED_CMD(SelfInsert), FUNCTION, "set", WIRED_CMD(SetVar), FUNCTION, "set-mark", WIRED_CMD(SetMark), #ifdef IPROCS /* for GNU compatibility */ FUNCTION, "shell", WIRED_CMD(ShellProc), #endif #ifndef MAC FUNCTION, "shell-command", WIRED_CMD(ShellCom), FUNCTION, "shell-command-no-buffer", WIRED_CMD(ShNoBuf), FUNCTION, "shell-command-to-buffer", WIRED_CMD(ShToBuf), FUNCTION, "shell-command-with-typeout", WIRED_CMD(Shtypeout), #endif DefMinor(ShowMatch), "show-match-mode", WIRED_CMD(0), FUNCTION, "shrink-window", WIRED_CMD(ShrWindow), FUNCTION, "source", WIRED_CMD(Source), #ifdef SPELL FUNCTION, "spell-buffer", WIRED_CMD(SpelBuffer), #endif FUNCTION, "split-current-window", WIRED_CMD(SplitWind), FUNCTION, "start-remembering", WIRED_CMD(Remember), #ifdef IPROCS # ifndef PIPEPROCS FUNCTION, "stop-process", WIRED_CMD(ProcStop), # endif #endif FUNCTION, "stop-remembering", WIRED_CMD(Forget), FUNCTION, "string-length", WIRED_CMD(StrLength), #ifdef JOB_CONTROL FUNCTION, "suspend-jove", WIRED_CMD(PauseJove), #endif DefMajor(TEXT), "text-mode", WIRED_CMD(0), FUNCTION, "transpose-characters", WIRED_CMD(TransChar), FUNCTION, "transpose-lines", WIRED_CMD(TransLines), FUNCTION, "unbind-key", WIRED_CMD(UnbindC), FUNCTION, "version", WIRED_CMD(ShowVersion), FUNCTION, "visible-spaces-in-window", WIRED_CMD(WVisSpace), FUNCTION, "visit-file", WIRED_CMD(ReadFile), FUNCTION, "window-find", WIRED_CMD(WindFind), #ifdef ABBREV DefMinor(Abbrev), "word-abbrev-mode", WIRED_CMD(0), FUNCTION, "write-word-abbrev-file", WIRED_CMD(SaveAbbrevs), #endif FUNCTION, "write-file", WIRED_CMD(WriteFile), FUNCTION, "write-macros-to-file", WIRED_CMD(WriteMacs), FUNCTION, "write-modified-files", WIRED_CMD(WtModBuf), FUNCTION, "write-region", WIRED_CMD(WrtReg), FUNCTION, "yank", WIRED_CMD(Yank), FUNCTION, "yank-pop", WIRED_CMD(YankPop), FUNCTION, 0, 0 }; #ifndef TXT_TO_C data_obj * findcom(prompt) char *prompt; { /* This is for faster startup. This just reads until a space or a tab or a newline character is reached, and then does a semi-hashed lookup on that string. This should be much faster than initializing the minibuffer for each line. */ if (InJoverc) { char cmdbuf[128]; register struct cmd *cmd; register char *cp = cmdbuf; #if !(defined(IBMPC) || defined(MAC)) register int c; #else int c; #endif struct cmd *which; int cmdlen, found = 0; static struct cmd *cmdhash[26]; static int beenhere = NO; /* special case for prefix commands--only upper case ones */ #define hash(c) (c - 'a') /* initialize the hash table */ if (beenhere == NO) { int lastc = 0; for (cmd = commands; cmd->Name != 0; cmd++) if (lastc != cmd->Name[0]) { lastc = cmd->Name[0]; cmdhash[hash(lastc)] = cmd; } beenhere = YES; } #ifdef MAC menus_off(); /* Block menu choices during input */ #endif /* gather the cmd name */ while (((c = getch()) != EOF) && !index(" \t\r\n", c)) { #if (defined(IBMPC) || defined(MAC)) lower(&c); #else if (isupper(c)) c = tolower(c); #endif *cp++ = c; } if (c == EOF) return 0; *cp = '\0'; cmdlen = cp - cmdbuf; if (cmdlen == 0) return 0; /* look it up (in the reduced search space) */ if (islower(cmdbuf[0])) for (cmd = cmdhash[hash(cmdbuf[0])]; cmd != 0 && cmd->Name[0] == cmdbuf[0]; cmd++) { if (strncmp(cmd->Name, cmdbuf, cmdlen) == 0) { if (strcmp(cmd->Name, cmdbuf) == 0) return (data_obj *) cmd; found += 1; which = cmd; } } if (found > 1) complain("[\"%s\" ambiguous]", cmdbuf); else if (found == 0) complain("[\"%s\" unknown]", cmdbuf); else return (data_obj *) which; } else { static char *strings[(sizeof commands) / sizeof (commands[0])]; static int beenhere = NO; register int com; if (beenhere == NO) { register char **strs = strings; register struct cmd *c; for (c = commands; c->Name != 0; c++) *strs++ = c->Name; *strs = 0; beenhere = YES; } if ((com = complete(strings, prompt, CASEIND)) < 0) return 0; return (data_obj *) &commands[com]; } /* NOTREACHED */ } #endif