home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / jove414s.zip / funcdefs.c < prev    next >
C/C++ Source or Header  |  1991-07-06  |  16KB  |  429 lines

  1. /***************************************************************************
  2.  * This program is Copyright (C) 1986, 1987, 1988 by Jonathan Payne.  JOVE *
  3.  * is provided to you without charge, and with no warranty.  You may give  *
  4.  * away copies of JOVE, including sources, provided that this notice is    *
  5.  * included in all the files.                                              *
  6.  ***************************************************************************/
  7.  
  8. #define FUNCDEFS
  9. #include "jove.h"
  10. #include "ctype.h"
  11. #include <conio.h>
  12.  
  13. #if !defined(MSDOS) && !defined(SYSV) && !defined(MAC)
  14. # include <sgtty.h>
  15. #endif
  16.  
  17. #if !defined(TXT_TO_C)
  18.  
  19. #if defined(MAC)
  20. #    define WIRED_CMD(c) (c),'\0','\0'    /* for About Jove... */
  21. #else
  22. #    define WIRED_CMD(c)    (c)
  23. #endif /* MAC */
  24.  
  25. #else /* TXT_TO_C */
  26.  
  27. #if defined(MAC)
  28. #    define WIRED_CMD(c) 0,'\0','\0'
  29. #else
  30. #    define WIRED_CMD(c)    0
  31. #endif
  32. #endif /* TXT_TO_C */
  33.  
  34. const struct cmd    commands[] = {
  35. #if defined(LISP)
  36.     FUNCTION, "add-lisp-special", WIRED_CMD(AddSpecial),
  37. #endif
  38.     FUNCTION, "append-region", WIRED_CMD(AppReg),
  39.     FUNCTION, "apropos", WIRED_CMD(Apropos),
  40.     FUNCTION, "auto-execute-command", WIRED_CMD(CAutoExec),
  41.     FUNCTION, "auto-execute-macro", WIRED_CMD(MAutoExec),
  42.     DefMinor(Fill), "auto-fill-mode", WIRED_CMD(0),
  43.     DefMinor(Indent), "auto-indent-mode", WIRED_CMD(0),
  44.     FUNCTION, "backward-character", WIRED_CMD(BackChar),
  45.     FUNCTION, "backward-list", WIRED_CMD(BList),
  46.     FUNCTION, "backward-paragraph", WIRED_CMD(BackPara),
  47.     FUNCTION, "backward-s-expression", WIRED_CMD(BSexpr),
  48.     FUNCTION, "backward-sentence", WIRED_CMD(Bos),
  49.     FUNCTION, "backward-up-list", WIRED_CMD(BUpList),
  50.     FUNCTION, "backward-word", WIRED_CMD(BackWord),
  51.     FUNCTION, "begin-kbd-macro", WIRED_CMD(Remember),
  52.     FUNCTION, "beginning-of-file", WIRED_CMD(Bof),
  53.     FUNCTION, "beginning-of-line", WIRED_CMD(Bol),
  54.     FUNCTION, "beginning-of-window", WIRED_CMD(Bow),
  55.     FUNCTION, "bind-to-key", WIRED_CMD(BindAKey),
  56.     FUNCTION, "bind-keymap-to-key", WIRED_CMD(KmBind),
  57.     FUNCTION, "bind-macro-to-key", WIRED_CMD(BindMac),
  58. #if defined(ABBREV)
  59.     FUNCTION, "bind-macro-to-word-abbrev", WIRED_CMD(BindMtoW),
  60. #endif
  61.     FUNCTION, "buffer-position", WIRED_CMD(BufPos),
  62.     DefMajor(CMODE), "c-mode", WIRED_CMD(0),
  63.     MODFUNC, "case-character-capitalize", WIRED_CMD(CapChar),
  64.     MODFUNC, "case-region-lower", WIRED_CMD(CasRegLower),
  65.     MODFUNC, "case-region-upper", WIRED_CMD(CasRegUpper),
  66.     MODFUNC, "case-word-capitalize", WIRED_CMD(CapWord),
  67.     MODFUNC, "case-word-lower", WIRED_CMD(LowWord),
  68.     MODFUNC, "case-word-upper", WIRED_CMD(UppWord),
  69.     MODFUNC, "character-to-octal-insert", WIRED_CMD(ChrToOct),
  70.     FUNCTION, "cd", WIRED_CMD(Chdir),
  71.     FUNCTION, "clear-and-redraw", WIRED_CMD(ClAndRedraw),
  72. #if !defined(MAC)
  73.     FUNCTION, "compile-it", WIRED_CMD(MakeErrors),
  74. #endif
  75. #if defined(IPROCS) && !defined(PIPEPROCS) && defined(TIOCSLTC)
  76.     FUNCTION, "continue-process", WIRED_CMD(ProcCont),
  77. #endif
  78.     FUNCTION, "copy-region", WIRED_CMD(CopyRegion),
  79. #if !defined(MAC)
  80.     FUNCTION, "current-error", WIRED_CMD(ShowErr),
  81. #endif
  82.     FUNCTION, "date", WIRED_CMD(prCTIME),
  83. #if defined(IPROCS) || defined (OS2IPROCS)
  84.     FUNCTION, "process-dbx-output", WIRED_CMD(DBXpoutput),
  85. #endif
  86. #if defined(ABBREV)
  87.     FUNCTION, "define-global-word-abbrev", WIRED_CMD(DefGAbbrev),
  88.     FUNCTION, "define-mode-word-abbrev", WIRED_CMD(DefMAbbrev),
  89. #endif
  90.     FUNCTION, "define-macro", WIRED_CMD(DefKBDMac),
  91.     MODFUNC, "delete-blank-lines", WIRED_CMD(DelBlnkLines),
  92.     FUNCTION, "delete-buffer", WIRED_CMD(BufKill),
  93.     FUNCTION, "delete-macro", WIRED_CMD(DelMacro),
  94.     MODFUNC, "delete-next-character", WIRED_CMD(DelNChar),
  95.     FUNCTION, "delete-other-windows", WIRED_CMD(OneWindow),
  96.     MODFUNC, "delete-previous-character", WIRED_CMD(DelPChar),
  97.     MODFUNC, "delete-white-space", WIRED_CMD(DelWtSpace),
  98.     FUNCTION, "delete-current-window", WIRED_CMD(DelCurWindow),
  99.     FUNCTION, "describe-bindings", WIRED_CMD(DescBindings),
  100.     FUNCTION, "describe-command", WIRED_CMD(DescCom),
  101.     FUNCTION, "describe-key", WIRED_CMD(KeyDesc),
  102.     FUNCTION, "describe-variable", WIRED_CMD(DescCom),
  103.     FUNCTION, "digit", WIRED_CMD(Digit),
  104.     FUNCTION, "digit-1", WIRED_CMD(Digit1),
  105.     FUNCTION, "digit-2", WIRED_CMD(Digit2),
  106.     FUNCTION, "digit-3", WIRED_CMD(Digit3),
  107.     FUNCTION, "digit-4", WIRED_CMD(Digit4),
  108.     FUNCTION, "digit-5", WIRED_CMD(Digit5),
  109.     FUNCTION, "digit-6", WIRED_CMD(Digit6),
  110.     FUNCTION, "digit-7", WIRED_CMD(Digit7),
  111.     FUNCTION, "digit-8", WIRED_CMD(Digit8),
  112.     FUNCTION, "digit-9", WIRED_CMD(Digit9),
  113.     FUNCTION, "digit-0", WIRED_CMD(Digit0),
  114.     FUNCTION, "dirs", WIRED_CMD(prDIRS),
  115.     FUNCTION, "down-list", WIRED_CMD(FDownList),
  116. #if defined(IPROCS) && !defined(PIPEPROCS) && defined(TIOCSLTC)
  117.     FUNCTION, "dstop-process", WIRED_CMD(ProcDStop),
  118. #endif
  119. #if defined(ABBREV)
  120.     FUNCTION, "edit-word-abbrevs", WIRED_CMD(EditAbbrevs),
  121. #endif
  122.     FUNCTION, "end-kbd-macro", WIRED_CMD(Forget),
  123.     FUNCTION, "end-of-file", WIRED_CMD(Eof),
  124.     FUNCTION, "end-of-line", WIRED_CMD(Eol),
  125.     FUNCTION, "end-of-window", WIRED_CMD(Eow),
  126. #if defined(IPROCS) && !defined(PIPEPROCS)
  127.     FUNCTION, "eof-process", WIRED_CMD(ProcEof),
  128. #endif
  129.     FUNCTION, "erase-buffer", WIRED_CMD(BufErase),
  130.     FUNCTION, "exchange-point-and-mark", WIRED_CMD(PtToMark),
  131.     FUNCTION, "execute-named-command", WIRED_CMD(Extend),
  132.     FUNCTION, "execute-kbd-macro", WIRED_CMD(ExecMacro),
  133.     FUNCTION, "execute-macro", WIRED_CMD(RunMacro),
  134.     FUNCTION, "exit-jove", WIRED_CMD(Leave),
  135. #if defined(CMT_FMT)
  136.     MODFUNC, "fill-comment", WIRED_CMD(Comment),
  137. #endif /* CMT_FMT */
  138.     MODFUNC, "fill-paragraph", WIRED_CMD(Justify),
  139.     MODFUNC, "fill-region", WIRED_CMD(RegJustify),
  140. #if !defined(MAC)
  141.     MODFUNC, "filter-region", WIRED_CMD(FilterRegion),
  142. #endif
  143.     FUNCTION, "find-file", WIRED_CMD(FindFile),
  144.     FUNCTION, "find-tag", WIRED_CMD(FindTag),
  145.     FUNCTION, "find-tag-at-point", WIRED_CMD(FDotTag),
  146.     FUNCTION, "first-non-blank", WIRED_CMD(ToIndent),
  147.     FUNCTION, "forward-character", WIRED_CMD(ForChar),
  148.     FUNCTION, "forward-list", WIRED_CMD(FList),
  149.     FUNCTION, "forward-paragraph", WIRED_CMD(ForPara),
  150.     FUNCTION, "forward-s-expression", WIRED_CMD(FSexpr),
  151.     FUNCTION, "forward-sentence", WIRED_CMD(Eos),
  152.     FUNCTION, "forward-word", WIRED_CMD(ForWord),
  153.     DefMajor(FUNDAMENTAL), "fundamental-mode", WIRED_CMD(0),
  154.     FUNCTION, "gather-numeric-argument", WIRED_CMD(TimesFour),
  155. #if defined(LISP)
  156.     MODFUNC, "grind-s-expr", WIRED_CMD(GSexpr),
  157. #endif
  158.     FUNCTION, "goto-line", WIRED_CMD(GoLine),
  159.     FUNCTION, "goto-window-with-buffer", WIRED_CMD(GotoWind),
  160.     FUNCTION, "grow-window", WIRED_CMD(GrowWindow),
  161.     MODFUNC, "handle-tab", WIRED_CMD(Tab),
  162.     FUNCTION, "i-search-forward", WIRED_CMD(IncFSearch),
  163.     FUNCTION, "i-search-reverse", WIRED_CMD(IncRSearch),
  164.     MODFUNC, "insert-file", WIRED_CMD(InsFile),
  165. #if defined(IPROCS) || defined (OS2IPROCS)
  166.     FUNCTION, "interrupt-process", WIRED_CMD(ProcInt),
  167.     FUNCTION, "i-shell-command", WIRED_CMD(Iprocess),
  168. #endif
  169.     MODFUNC, "kill-next-word", WIRED_CMD(DelNWord),
  170.     MODFUNC, "kill-previous-word", WIRED_CMD(DelPWord),
  171. #if defined(IPROCS) || defined (OS2IPROCS)
  172.     FUNCTION, "kill-process", WIRED_CMD(ProcKill),
  173. #endif
  174.     MODFUNC, "kill-region", WIRED_CMD(DelReg),
  175.     MODFUNC, "kill-s-expression", WIRED_CMD(KillExpr),
  176.     FUNCTION, "kill-some-buffers", WIRED_CMD(KillSome),
  177.     MODFUNC, "kill-to-beginning-of-sentence", WIRED_CMD(KillBos),
  178.     MODFUNC, "kill-to-end-of-line", WIRED_CMD(KillEOL),
  179.     MODFUNC, "kill-to-end-of-sentence", WIRED_CMD(KillEos),
  180.     FUNCTION, "left-margin-here", WIRED_CMD(SetLMargin),
  181. #if defined(LISP)
  182.     DefMajor(LISPMODE), "lisp-mode", WIRED_CMD(0),
  183. #endif
  184.     FUNCTION, "list-buffers", WIRED_CMD(BufList),
  185. #if defined(IPROCS) || defined (OS2IPROCS)
  186.     FUNCTION, "list-processes", WIRED_CMD(ProcList),
  187. #endif
  188.     FUNCTION, "make-buffer-unmodified", WIRED_CMD(NotModified),
  189.     FUNCTION, "make-keymap", WIRED_CMD(MakeKMap),
  190.     FUNCTION, "make-macro-interactive", WIRED_CMD(MacInter),
  191.     FUNCTION, "name-kbd-macro", WIRED_CMD(NameMac),
  192.     MODFUNC, "newline", WIRED_CMD(Newline),
  193.     MODFUNC, "newline-and-backup", WIRED_CMD(OpenLine),
  194.     MODFUNC, "newline-and-indent", WIRED_CMD(LineAI),
  195. #if !defined(MAC)
  196.     FUNCTION, "next-error", WIRED_CMD(NextError),
  197. #endif
  198.     FUNCTION, "next-line", WIRED_CMD(NextLine),
  199.     FUNCTION, "next-page", WIRED_CMD(NextPage),
  200.     FUNCTION, "next-window", WIRED_CMD(NextWindow),
  201.     FUNCTION, "number-lines-in-window", WIRED_CMD(WNumLines),
  202.     DefMinor(OverWrite), "over-write-mode", WIRED_CMD(0),
  203.     FUNCTION, "page-next-window", WIRED_CMD(PageNWind),
  204.     MODFUNC, "paren-flash", WIRED_CMD(DoParen),
  205. #if !defined(MAC)
  206.     FUNCTION, "parse-errors", WIRED_CMD(ErrParse),
  207. #endif
  208. #if defined(SPELL)
  209.     FUNCTION, "parse-spelling-errors-in-buffer", WIRED_CMD(SpelWords),
  210. #endif
  211. #if defined(JOB_CONTROL)
  212.     FUNCTION, "pause-jove", WIRED_CMD(PauseJove),
  213. #else
  214. #    ifndef MAC
  215.     FUNCTION, "pause-jove", WIRED_CMD(Push),
  216. #    endif
  217. #endif
  218.     FUNCTION, "pop-mark", WIRED_CMD(PopMark),
  219.     FUNCTION, "popd", WIRED_CMD(Popd),
  220. #if !defined(MAC)
  221.     FUNCTION, "previous-error", WIRED_CMD(PrevError),
  222. #endif
  223.     FUNCTION, "previous-line", WIRED_CMD(PrevLine),
  224.     FUNCTION, "previous-page", WIRED_CMD(PrevPage),
  225.     FUNCTION, "previous-window", WIRED_CMD(PrevWindow),
  226.     FUNCTION, "print", WIRED_CMD(PrVar),
  227. #if defined(IPROCS) || defined (OS2IPROCS)
  228.     FUNCTION, "process-bind-keymap-to-key", WIRED_CMD(ProcKmBind),
  229.     FUNCTION, "process-bind-to-key", WIRED_CMD(ProcBind),
  230.     MODFUNC, "process-newline", WIRED_CMD(ProcNewline),
  231.     FUNCTION, "process-send-data-no-return", WIRED_CMD(ProcSendData),
  232. #endif
  233. #if !defined(MAC)
  234.     FUNCTION, "push-shell", WIRED_CMD(Push),
  235. #endif
  236.     FUNCTION, "pushd", WIRED_CMD(Pushd),
  237.     FUNCTION, "pwd", WIRED_CMD(prCWD),
  238.     MODFUNC, "query-replace-string", WIRED_CMD(QRepSearch),
  239. #if defined(IPROCS) || defined (OS2IPROCS)
  240.     FUNCTION, "quit-process", WIRED_CMD(ProcQuit),
  241. #endif
  242.     MODFUNC, "quoted-insert", WIRED_CMD(QuotChar),
  243.     DefMinor(ReadOnly), "read-only-mode", WIRED_CMD(0),
  244. #if defined(ABBREV)
  245.     FUNCTION, "read-word-abbrev-file", WIRED_CMD(RestAbbrevs),
  246. #endif
  247.     FUNCTION, "redraw-display", WIRED_CMD(RedrawDisplay),
  248.     FUNCTION, "recursive-edit", WIRED_CMD(Recur),
  249.     FUNCTION, "rename-buffer", WIRED_CMD(ReNamBuf),
  250.     MODFUNC, "replace-in-region", WIRED_CMD(RegReplace),
  251.     MODFUNC, "replace-string", WIRED_CMD(RepSearch),
  252.     FUNCTION, "right-margin-here", WIRED_CMD(SetRMargin),
  253.     FUNCTION, "save-file", WIRED_CMD(SaveFile),
  254.     FUNCTION, "scroll-down", WIRED_CMD(DownScroll),
  255.     FUNCTION, "scroll-left", WIRED_CMD(ScrollLeft),
  256. #if defined(MSDOS)
  257.     FUNCTION, "scroll-next-page", WIRED_CMD(PageScrollUp),
  258.     FUNCTION, "scroll-previous-page", WIRED_CMD(PageScrollDown),
  259. #endif /* MSDOS */
  260.     FUNCTION, "scroll-right", WIRED_CMD(ScrollRight),
  261.     FUNCTION, "scroll-up", WIRED_CMD(UpScroll),
  262.     FUNCTION, "search-forward", WIRED_CMD(ForSearch),
  263.     FUNCTION, "search-forward-nd", WIRED_CMD(FSrchND),
  264.     FUNCTION, "search-reverse", WIRED_CMD(RevSearch),
  265.     FUNCTION, "search-reverse-nd", WIRED_CMD(RSrchND),
  266.     FUNCTION, "select-buffer", WIRED_CMD(BufSelect),
  267. #if defined(MSDOS)
  268.     FUNCTION, "select-buffer-1", WIRED_CMD(Buf1Select),
  269.     FUNCTION, "select-buffer-2", WIRED_CMD(Buf2Select),
  270.     FUNCTION, "select-buffer-3", WIRED_CMD(Buf3Select),
  271.     FUNCTION, "select-buffer-4", WIRED_CMD(Buf4Select),
  272.     FUNCTION, "select-buffer-5", WIRED_CMD(Buf5Select),
  273.     FUNCTION, "select-buffer-6", WIRED_CMD(Buf6Select),
  274.     FUNCTION, "select-buffer-7", WIRED_CMD(Buf7Select),
  275.     FUNCTION, "select-buffer-8", WIRED_CMD(Buf8Select),
  276.     FUNCTION, "select-buffer-9", WIRED_CMD(Buf9Select),
  277.     FUNCTION, "select-buffer-10", WIRED_CMD(Buf10Select),
  278. #endif /* MSDOS */
  279.     MODFUNC, "self-insert", WIRED_CMD(SelfInsert),
  280.     FUNCTION, "set", WIRED_CMD(SetVar),
  281.     FUNCTION, "set-mark", WIRED_CMD(SetMark),
  282. #if defined(IPROCS) || defined (OS2IPROCS)    /* for GNU compatibility */
  283.     FUNCTION, "shell", WIRED_CMD(ShellProc),
  284. #endif
  285. #if !defined(MAC)
  286.     FUNCTION, "shell-command", WIRED_CMD(ShellCom),
  287.     FUNCTION, "shell-command-no-buffer", WIRED_CMD(ShNoBuf),
  288.     FUNCTION, "shell-command-to-buffer", WIRED_CMD(ShToBuf),
  289.     FUNCTION, "shell-command-with-typeout", WIRED_CMD(Shtypeout),
  290. #endif
  291.     MODFUNC, "shift-region-left", WIRED_CMD(LRShift),
  292.     MODFUNC, "shift-region-right", WIRED_CMD(RRShift),
  293.     DefMinor(ShowMatch), "show-match-mode", WIRED_CMD(0),
  294.     FUNCTION, "shrink-window", WIRED_CMD(ShrWindow),
  295.     FUNCTION, "source", WIRED_CMD(Source),
  296. #if defined(SPELL)
  297.     FUNCTION, "spell-buffer", WIRED_CMD(SpelBuffer),
  298. #endif
  299.     FUNCTION, "split-current-window", WIRED_CMD(SplitWind),
  300.     FUNCTION, "start-remembering", WIRED_CMD(Remember),
  301. #if defined(IPROCS) && !defined(PIPEPROCS)
  302.     FUNCTION, "stop-process", WIRED_CMD(ProcStop),
  303. #endif
  304.     FUNCTION, "stop-remembering", WIRED_CMD(Forget),
  305.     FUNCTION, "string-length", WIRED_CMD(StrLength),
  306. #if defined(JOB_CONTROL)
  307.     FUNCTION, "suspend-jove", WIRED_CMD(PauseJove),
  308. #endif
  309.     DefMajor(TEXT), "text-mode", WIRED_CMD(0),
  310.     MODFUNC, "transpose-characters", WIRED_CMD(TransChar),
  311.     MODFUNC, "transpose-lines", WIRED_CMD(TransLines),
  312.     FUNCTION, "unbind-key", WIRED_CMD(UnbindC),
  313.     FUNCTION, "version", WIRED_CMD(ShowVersion),
  314.     FUNCTION, "visible-spaces-in-window", WIRED_CMD(WVisSpace),
  315.     FUNCTION, "visit-file", WIRED_CMD(ReadFile),
  316.     FUNCTION, "window-find", WIRED_CMD(WindFind),
  317. #if defined(ABBREV)
  318.     DefMinor(Abbrev), "word-abbrev-mode", WIRED_CMD(0),
  319.     FUNCTION, "write-word-abbrev-file", WIRED_CMD(SaveAbbrevs),
  320. #endif
  321.     FUNCTION, "write-file", WIRED_CMD(WriteFile),
  322.     FUNCTION, "write-macros-to-file", WIRED_CMD(WriteMacs),
  323.     FUNCTION, "write-modified-files", WIRED_CMD(WtModBuf),
  324.     FUNCTION, "write-region", WIRED_CMD(WrtReg),
  325.     MODFUNC, "yank", WIRED_CMD(Yank),
  326.     MODFUNC, "yank-pop", WIRED_CMD(YankPop),
  327.     FUNCTION, 0, 0
  328. };
  329.  
  330. #if !defined(TXT_TO_C)
  331. data_obj *
  332. findcom(prompt)
  333. char    *prompt;
  334. {
  335.     /* This is for faster startup.  This just reads until a space or a
  336.        tab or a newline character is reached, and then does a
  337.        semi-hashed lookup on that string.  This should be much faster
  338.        than initializing the minibuffer for each line. */
  339.     int _fastcall get_ch(void);
  340.     if (InJoverc) {
  341.         char    cmdbuf[128];
  342.         register  const struct cmd    *cmd;
  343.         register  char    *cp = cmdbuf;
  344. #if !(defined(IBMPC) || defined(MAC))
  345.         register  int    c;
  346. #else
  347.         int c;
  348. #endif
  349.         const struct cmd    *which;
  350.         size_t    cmdlen;
  351.         int    found = 0;
  352.         static    struct cmd *cmdhash[26];
  353.         static int    beenhere = NO;
  354.  
  355. /* special case for prefix commands--only upper case ones */
  356. #define hash(c)    ((c) - 'a')
  357.  
  358.         /* initialize the hash table */
  359.         if (beenhere == NO) {
  360.             int    lastc = 0;
  361.  
  362.             for (cmd = commands; cmd->Name != 0; cmd++)
  363.                 if (lastc != cmd->Name[0]) {
  364.                     lastc = cmd->Name[0];
  365.                     cmdhash[hash(lastc)] = cmd;
  366.                 }
  367.             beenhere = YES;
  368.         }
  369. #ifdef MAC
  370.         menus_off();    /* Block menu choices during input */
  371. #endif
  372.         /* gather the cmd name */
  373.         while (((c = get_ch()) != EOF) && !strchr(" \t\r\n", c)) {
  374. #if (defined(IBMPC) || defined(MAC))
  375.             lower((char *) &c);
  376. #else
  377.             if (isupper(c))
  378.                 c = tolower(c);
  379. #endif
  380.             *cp++ = c;
  381.         }
  382.         if (c == EOF)
  383.             return 0;
  384.         *cp = '\0';
  385.         cmdlen = cp - cmdbuf;
  386.         if (cmdlen == 0)
  387.             return 0;
  388.  
  389.         /* look it up (in the reduced search space) */
  390.         if (islower(cmdbuf[0]))
  391.             for (cmd = cmdhash[hash(cmdbuf[0])]; cmd != 0 && cmd->Name[0] == cmdbuf[0]; cmd++) {
  392.             if (strncmp(cmd->Name, cmdbuf, cmdlen) == 0) {
  393.                 if (strcmp(cmd->Name, cmdbuf) == 0)
  394.                     return (data_obj *) cmd;
  395.                 found += 1;
  396.                 which = cmd;
  397.             }
  398.             }
  399.         if (found > 1) {
  400.             complain("[\"%s\" ambiguous]", cmdbuf);
  401.             /* NOTREACHED */
  402.         } else if (found == 0) {
  403.             complain("[\"%s\" unknown]", cmdbuf);
  404.             /* NOTREACHED */
  405.         }else
  406.             return (data_obj *) which;
  407.     } else {
  408.         static char    *strings[(sizeof commands) / sizeof (commands[0])];
  409.         static int    beenhere = NO;
  410.         register  int    com;
  411.  
  412.         if (beenhere == NO) {
  413.             register  char    **strs = strings;
  414.             register  const struct cmd    *c;
  415.  
  416.             for (c = commands; c->Name != 0; c++)
  417.                 *strs++ = c->Name;
  418.             *strs = 0;
  419.             beenhere = YES;
  420.         }
  421.  
  422.         if ((com = complete(strings, prompt, CASEIND)) < 0)
  423.             return 0;
  424.         return (data_obj *) &commands[com];
  425.     }
  426. #undef    hash
  427. }
  428. #endif
  429.