1*99d6554dSrin /* $NetBSD: ex_usage.c,v 1.4 2017/12/01 20:01:31 rin Exp $ */
23a571abcSchristos /*-
33a571abcSchristos * Copyright (c) 1992, 1993, 1994
43a571abcSchristos * The Regents of the University of California. All rights reserved.
53a571abcSchristos * Copyright (c) 1992, 1993, 1994, 1995, 1996
63a571abcSchristos * Keith Bostic. All rights reserved.
73a571abcSchristos *
83a571abcSchristos * See the LICENSE file for redistribution information.
93a571abcSchristos */
103a571abcSchristos
113a571abcSchristos #include "config.h"
123a571abcSchristos
13cc73507aSchristos #include <sys/cdefs.h>
14cc73507aSchristos #if 0
153a571abcSchristos #ifndef lint
163a571abcSchristos static const char sccsid[] = "Id: ex_usage.c,v 10.15 2001/06/25 15:19:21 skimo Exp (Berkeley) Date: 2001/06/25 15:19:21 ";
173a571abcSchristos #endif /* not lint */
18cc73507aSchristos #else
19*99d6554dSrin __RCSID("$NetBSD: ex_usage.c,v 1.4 2017/12/01 20:01:31 rin Exp $");
20cc73507aSchristos #endif
213a571abcSchristos
223a571abcSchristos #include <sys/types.h>
233a571abcSchristos #include <sys/queue.h>
243a571abcSchristos #include <sys/time.h>
253a571abcSchristos
263a571abcSchristos #include <bitstring.h>
273a571abcSchristos #include <ctype.h>
283a571abcSchristos #include <limits.h>
293a571abcSchristos #include <stdio.h>
303a571abcSchristos #include <stdlib.h>
313a571abcSchristos #include <string.h>
323a571abcSchristos
333a571abcSchristos #include "../common/common.h"
343a571abcSchristos #include "../vi/vi.h"
353a571abcSchristos
363a571abcSchristos /*
373a571abcSchristos * ex_help -- :help
383a571abcSchristos * Display help message.
393a571abcSchristos *
403a571abcSchristos * PUBLIC: int ex_help __P((SCR *, EXCMD *));
413a571abcSchristos */
423a571abcSchristos int
ex_help(SCR * sp,EXCMD * cmdp)433a571abcSchristos ex_help(SCR *sp, EXCMD *cmdp)
443a571abcSchristos {
453a571abcSchristos (void)ex_puts(sp,
463a571abcSchristos "To see the list of vi commands, enter \":viusage<CR>\"\n");
473a571abcSchristos (void)ex_puts(sp,
483a571abcSchristos "To see the list of ex commands, enter \":exusage<CR>\"\n");
493a571abcSchristos (void)ex_puts(sp,
503a571abcSchristos "For an ex command usage statement enter \":exusage [cmd]<CR>\"\n");
513a571abcSchristos (void)ex_puts(sp,
523a571abcSchristos "For a vi key usage statement enter \":viusage [key]<CR>\"\n");
533a571abcSchristos (void)ex_puts(sp, "To exit, enter \":q!\"\n");
543a571abcSchristos return (0);
553a571abcSchristos }
563a571abcSchristos
573a571abcSchristos /*
583a571abcSchristos * ex_usage -- :exusage [cmd]
593a571abcSchristos * Display ex usage strings.
603a571abcSchristos *
613a571abcSchristos * PUBLIC: int ex_usage __P((SCR *, EXCMD *));
623a571abcSchristos */
633a571abcSchristos int
ex_usage(SCR * sp,EXCMD * cmdp)643a571abcSchristos ex_usage(SCR *sp, EXCMD *cmdp)
653a571abcSchristos {
663a571abcSchristos ARGS *ap;
673a571abcSchristos EXCMDLIST const *cp;
683a571abcSchristos int newscreen;
6908d478e3Schristos CHAR_T *p, nb[MAXCMDNAMELEN + 5];
7008d478e3Schristos const CHAR_T *name;
713a571abcSchristos
723a571abcSchristos switch (cmdp->argc) {
733a571abcSchristos case 1:
743a571abcSchristos ap = cmdp->argv[0];
7508d478e3Schristos if (ISUPPER((UCHAR_T)ap->bp[0])) {
763a571abcSchristos newscreen = 1;
7708d478e3Schristos ap->bp[0] = TOLOWER((UCHAR_T)ap->bp[0]);
783a571abcSchristos } else
793a571abcSchristos newscreen = 0;
803a571abcSchristos for (cp = cmds; cp->name != NULL &&
81*99d6554dSrin MEMCMP(ap->bp, cp->name, ap->len); ++cp);
823a571abcSchristos if (cp->name == NULL ||
8308d478e3Schristos (newscreen && !F_ISSET(cp, E_NEWSCREEN))) {
8408d478e3Schristos const char *nstr;
8508d478e3Schristos size_t nlen;
8608d478e3Schristos
873a571abcSchristos if (newscreen)
8808d478e3Schristos ap->bp[0] = TOUPPER((UCHAR_T)ap->bp[0]);
8908d478e3Schristos
9008d478e3Schristos INT2CHAR(sp, ap->bp, ap->len + 1, nstr, nlen);
913a571abcSchristos (void)ex_printf(sp, "The %.*s command is unknown\n",
9208d478e3Schristos (int)ap->len, nstr);
933a571abcSchristos } else {
943a571abcSchristos (void)ex_printf(sp,
953a571abcSchristos "Command: %s\n Usage: %s\n", cp->help, cp->usage);
963a571abcSchristos /*
973a571abcSchristos * !!!
983a571abcSchristos * The "visual" command has two modes, one from ex,
993a571abcSchristos * one from the vi colon line. Don't ask.
1003a571abcSchristos */
1013a571abcSchristos if (cp != &cmds[C_VISUAL_EX] &&
1023a571abcSchristos cp != &cmds[C_VISUAL_VI])
1033a571abcSchristos break;
1043a571abcSchristos if (cp == &cmds[C_VISUAL_EX])
1053a571abcSchristos cp = &cmds[C_VISUAL_VI];
1063a571abcSchristos else
1073a571abcSchristos cp = &cmds[C_VISUAL_EX];
1083a571abcSchristos (void)ex_printf(sp,
1093a571abcSchristos "Command: %s\n Usage: %s\n", cp->help, cp->usage);
1103a571abcSchristos }
1113a571abcSchristos break;
1123a571abcSchristos case 0:
1133a571abcSchristos for (cp = cmds; cp->name != NULL && !INTERRUPTED(sp); ++cp) {
1143a571abcSchristos /*
1153a571abcSchristos * The ^D command has an unprintable name.
1163a571abcSchristos *
1173a571abcSchristos * XXX
1183a571abcSchristos * We display both capital and lower-case versions of
1193a571abcSchristos * the appropriate commands -- no need to add in extra
1203a571abcSchristos * room, they're all short names.
1213a571abcSchristos */
1223a571abcSchristos if (cp == &cmds[C_SCROLL])
1233a571abcSchristos name = L("^D");
1243a571abcSchristos else if (F_ISSET(cp, E_NEWSCREEN)) {
1253a571abcSchristos nb[0] = L('[');
12608d478e3Schristos nb[1] = TOUPPER((UCHAR_T)cp->name[0]);
1273a571abcSchristos nb[2] = cp->name[0];
1283a571abcSchristos nb[3] = L(']');
1293a571abcSchristos for (name = cp->name + 1,
1303a571abcSchristos p = nb + 4; (*p++ = *name++) != '\0';);
1313a571abcSchristos name = nb;
1323a571abcSchristos } else
1333a571abcSchristos name = cp->name;
1343a571abcSchristos (void)ex_printf(sp,
1353a571abcSchristos WVS": %s\n", MAXCMDNAMELEN, name, cp->help);
1363a571abcSchristos }
1373a571abcSchristos break;
1383a571abcSchristos default:
1393a571abcSchristos abort();
1403a571abcSchristos }
1413a571abcSchristos return (0);
1423a571abcSchristos }
1433a571abcSchristos
1443a571abcSchristos /*
1453a571abcSchristos * ex_viusage -- :viusage [key]
1463a571abcSchristos * Display vi usage strings.
1473a571abcSchristos *
1483a571abcSchristos * PUBLIC: int ex_viusage __P((SCR *, EXCMD *));
1493a571abcSchristos */
1503a571abcSchristos int
ex_viusage(SCR * sp,EXCMD * cmdp)1513a571abcSchristos ex_viusage(SCR *sp, EXCMD *cmdp)
1523a571abcSchristos {
1533a571abcSchristos VIKEYS const *kp;
1543a571abcSchristos int key;
1553a571abcSchristos
1563a571abcSchristos switch (cmdp->argc) {
1573a571abcSchristos case 1:
1583a571abcSchristos if (cmdp->argv[0]->len != 1) {
1593a571abcSchristos ex_emsg(sp, cmdp->cmd->usage, EXM_USAGE);
1603a571abcSchristos return (1);
1613a571abcSchristos }
1623a571abcSchristos key = cmdp->argv[0]->bp[0];
1633a571abcSchristos if (key > MAXVIKEY)
1643a571abcSchristos goto nokey;
1653a571abcSchristos
1663a571abcSchristos /* Special case: '[' and ']' commands. */
1673a571abcSchristos if ((key == '[' || key == ']') && cmdp->argv[0]->bp[1] != key)
1683a571abcSchristos goto nokey;
1693a571abcSchristos
1703a571abcSchristos /* Special case: ~ command. */
1713a571abcSchristos if (key == '~' && O_ISSET(sp, O_TILDEOP))
1723a571abcSchristos kp = &tmotion;
1733a571abcSchristos else
1743a571abcSchristos kp = &vikeys[key];
1753a571abcSchristos
1763a571abcSchristos if (kp->usage == NULL)
1773a571abcSchristos nokey: (void)ex_printf(sp,
1783a571abcSchristos "The %s key has no current meaning\n",
1793a571abcSchristos KEY_NAME(sp, key));
1803a571abcSchristos else
1813a571abcSchristos (void)ex_printf(sp,
1823a571abcSchristos " Key:%s%s\nUsage: %s\n",
18308d478e3Schristos isblank((unsigned char)*kp->help) ? "" : " ", kp->help, kp->usage);
1843a571abcSchristos break;
1853a571abcSchristos case 0:
1863a571abcSchristos for (key = 0; key <= MAXVIKEY && !INTERRUPTED(sp); ++key) {
1873a571abcSchristos /* Special case: ~ command. */
1883a571abcSchristos if (key == '~' && O_ISSET(sp, O_TILDEOP))
1893a571abcSchristos kp = &tmotion;
1903a571abcSchristos else
1913a571abcSchristos kp = &vikeys[key];
1923a571abcSchristos if (kp->help != NULL)
1933a571abcSchristos (void)ex_printf(sp, "%s\n", kp->help);
1943a571abcSchristos }
1953a571abcSchristos break;
1963a571abcSchristos default:
1973a571abcSchristos abort();
1983a571abcSchristos }
1993a571abcSchristos return (0);
2003a571abcSchristos }
201