xref: /netbsd/external/bsd/nvi/dist/ex/ex_usage.c (revision 08d478e3)
1*08d478e3Schristos /*	$NetBSD: ex_usage.c,v 1.2 2013/11/22 15:52:05 christos 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 
133a571abcSchristos #ifndef lint
143a571abcSchristos 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 ";
153a571abcSchristos #endif /* not lint */
163a571abcSchristos 
173a571abcSchristos #include <sys/types.h>
183a571abcSchristos #include <sys/queue.h>
193a571abcSchristos #include <sys/time.h>
203a571abcSchristos 
213a571abcSchristos #include <bitstring.h>
223a571abcSchristos #include <ctype.h>
233a571abcSchristos #include <limits.h>
243a571abcSchristos #include <stdio.h>
253a571abcSchristos #include <stdlib.h>
263a571abcSchristos #include <string.h>
273a571abcSchristos 
283a571abcSchristos #include "../common/common.h"
293a571abcSchristos #include "../vi/vi.h"
303a571abcSchristos 
313a571abcSchristos /*
323a571abcSchristos  * ex_help -- :help
333a571abcSchristos  *	Display help message.
343a571abcSchristos  *
353a571abcSchristos  * PUBLIC: int ex_help __P((SCR *, EXCMD *));
363a571abcSchristos  */
373a571abcSchristos int
383a571abcSchristos ex_help(SCR *sp, EXCMD *cmdp)
393a571abcSchristos {
403a571abcSchristos 	(void)ex_puts(sp,
413a571abcSchristos 	    "To see the list of vi commands, enter \":viusage<CR>\"\n");
423a571abcSchristos 	(void)ex_puts(sp,
433a571abcSchristos 	    "To see the list of ex commands, enter \":exusage<CR>\"\n");
443a571abcSchristos 	(void)ex_puts(sp,
453a571abcSchristos 	    "For an ex command usage statement enter \":exusage [cmd]<CR>\"\n");
463a571abcSchristos 	(void)ex_puts(sp,
473a571abcSchristos 	    "For a vi key usage statement enter \":viusage [key]<CR>\"\n");
483a571abcSchristos 	(void)ex_puts(sp, "To exit, enter \":q!\"\n");
493a571abcSchristos 	return (0);
503a571abcSchristos }
513a571abcSchristos 
523a571abcSchristos /*
533a571abcSchristos  * ex_usage -- :exusage [cmd]
543a571abcSchristos  *	Display ex usage strings.
553a571abcSchristos  *
563a571abcSchristos  * PUBLIC: int ex_usage __P((SCR *, EXCMD *));
573a571abcSchristos  */
583a571abcSchristos int
593a571abcSchristos ex_usage(SCR *sp, EXCMD *cmdp)
603a571abcSchristos {
613a571abcSchristos 	ARGS *ap;
623a571abcSchristos 	EXCMDLIST const *cp;
633a571abcSchristos 	int newscreen;
64*08d478e3Schristos 	CHAR_T *p, nb[MAXCMDNAMELEN + 5];
65*08d478e3Schristos 	const CHAR_T *name;
663a571abcSchristos 
673a571abcSchristos 	switch (cmdp->argc) {
683a571abcSchristos 	case 1:
693a571abcSchristos 		ap = cmdp->argv[0];
70*08d478e3Schristos 		if (ISUPPER((UCHAR_T)ap->bp[0])) {
713a571abcSchristos 			newscreen = 1;
72*08d478e3Schristos 			ap->bp[0] = TOLOWER((UCHAR_T)ap->bp[0]);
733a571abcSchristos 		} else
743a571abcSchristos 			newscreen = 0;
753a571abcSchristos 		for (cp = cmds; cp->name != NULL &&
763a571abcSchristos 		    memcmp(ap->bp, cp->name, ap->len); ++cp);
773a571abcSchristos 		if (cp->name == NULL ||
78*08d478e3Schristos 		    (newscreen && !F_ISSET(cp, E_NEWSCREEN))) {
79*08d478e3Schristos 			const char *nstr;
80*08d478e3Schristos 			size_t nlen;
81*08d478e3Schristos 
823a571abcSchristos 			if (newscreen)
83*08d478e3Schristos 				ap->bp[0] = TOUPPER((UCHAR_T)ap->bp[0]);
84*08d478e3Schristos 
85*08d478e3Schristos 			INT2CHAR(sp, ap->bp, ap->len + 1, nstr, nlen);
863a571abcSchristos 			(void)ex_printf(sp, "The %.*s command is unknown\n",
87*08d478e3Schristos 			    (int)ap->len, nstr);
883a571abcSchristos 		} else {
893a571abcSchristos 			(void)ex_printf(sp,
903a571abcSchristos 			    "Command: %s\n  Usage: %s\n", cp->help, cp->usage);
913a571abcSchristos 			/*
923a571abcSchristos 			 * !!!
933a571abcSchristos 			 * The "visual" command has two modes, one from ex,
943a571abcSchristos 			 * one from the vi colon line.  Don't ask.
953a571abcSchristos 			 */
963a571abcSchristos 			if (cp != &cmds[C_VISUAL_EX] &&
973a571abcSchristos 			    cp != &cmds[C_VISUAL_VI])
983a571abcSchristos 				break;
993a571abcSchristos 			if (cp == &cmds[C_VISUAL_EX])
1003a571abcSchristos 				cp = &cmds[C_VISUAL_VI];
1013a571abcSchristos 			else
1023a571abcSchristos 				cp = &cmds[C_VISUAL_EX];
1033a571abcSchristos 			(void)ex_printf(sp,
1043a571abcSchristos 			    "Command: %s\n  Usage: %s\n", cp->help, cp->usage);
1053a571abcSchristos 		}
1063a571abcSchristos 		break;
1073a571abcSchristos 	case 0:
1083a571abcSchristos 		for (cp = cmds; cp->name != NULL && !INTERRUPTED(sp); ++cp) {
1093a571abcSchristos 			/*
1103a571abcSchristos 			 * The ^D command has an unprintable name.
1113a571abcSchristos 			 *
1123a571abcSchristos 			 * XXX
1133a571abcSchristos 			 * We display both capital and lower-case versions of
1143a571abcSchristos 			 * the appropriate commands -- no need to add in extra
1153a571abcSchristos 			 * room, they're all short names.
1163a571abcSchristos 			 */
1173a571abcSchristos 			if (cp == &cmds[C_SCROLL])
1183a571abcSchristos 				name = L("^D");
1193a571abcSchristos 			else if (F_ISSET(cp, E_NEWSCREEN)) {
1203a571abcSchristos 				nb[0] = L('[');
121*08d478e3Schristos 				nb[1] = TOUPPER((UCHAR_T)cp->name[0]);
1223a571abcSchristos 				nb[2] = cp->name[0];
1233a571abcSchristos 				nb[3] = L(']');
1243a571abcSchristos 				for (name = cp->name + 1,
1253a571abcSchristos 				    p = nb + 4; (*p++ = *name++) != '\0';);
1263a571abcSchristos 				name = nb;
1273a571abcSchristos 			} else
1283a571abcSchristos 				name = cp->name;
1293a571abcSchristos 			(void)ex_printf(sp,
1303a571abcSchristos 			    WVS": %s\n", MAXCMDNAMELEN, name, cp->help);
1313a571abcSchristos 		}
1323a571abcSchristos 		break;
1333a571abcSchristos 	default:
1343a571abcSchristos 		abort();
1353a571abcSchristos 	}
1363a571abcSchristos 	return (0);
1373a571abcSchristos }
1383a571abcSchristos 
1393a571abcSchristos /*
1403a571abcSchristos  * ex_viusage -- :viusage [key]
1413a571abcSchristos  *	Display vi usage strings.
1423a571abcSchristos  *
1433a571abcSchristos  * PUBLIC: int ex_viusage __P((SCR *, EXCMD *));
1443a571abcSchristos  */
1453a571abcSchristos int
1463a571abcSchristos ex_viusage(SCR *sp, EXCMD *cmdp)
1473a571abcSchristos {
1483a571abcSchristos 	VIKEYS const *kp;
1493a571abcSchristos 	int key;
1503a571abcSchristos 
1513a571abcSchristos 	switch (cmdp->argc) {
1523a571abcSchristos 	case 1:
1533a571abcSchristos 		if (cmdp->argv[0]->len != 1) {
1543a571abcSchristos 			ex_emsg(sp, cmdp->cmd->usage, EXM_USAGE);
1553a571abcSchristos 			return (1);
1563a571abcSchristos 		}
1573a571abcSchristos 		key = cmdp->argv[0]->bp[0];
1583a571abcSchristos 		if (key > MAXVIKEY)
1593a571abcSchristos 			goto nokey;
1603a571abcSchristos 
1613a571abcSchristos 		/* Special case: '[' and ']' commands. */
1623a571abcSchristos 		if ((key == '[' || key == ']') && cmdp->argv[0]->bp[1] != key)
1633a571abcSchristos 			goto nokey;
1643a571abcSchristos 
1653a571abcSchristos 		/* Special case: ~ command. */
1663a571abcSchristos 		if (key == '~' && O_ISSET(sp, O_TILDEOP))
1673a571abcSchristos 			kp = &tmotion;
1683a571abcSchristos 		else
1693a571abcSchristos 			kp = &vikeys[key];
1703a571abcSchristos 
1713a571abcSchristos 		if (kp->usage == NULL)
1723a571abcSchristos nokey:			(void)ex_printf(sp,
1733a571abcSchristos 			    "The %s key has no current meaning\n",
1743a571abcSchristos 			    KEY_NAME(sp, key));
1753a571abcSchristos 		else
1763a571abcSchristos 			(void)ex_printf(sp,
1773a571abcSchristos 			    "  Key:%s%s\nUsage: %s\n",
178*08d478e3Schristos 			    isblank((unsigned char)*kp->help) ? "" : " ", kp->help, kp->usage);
1793a571abcSchristos 		break;
1803a571abcSchristos 	case 0:
1813a571abcSchristos 		for (key = 0; key <= MAXVIKEY && !INTERRUPTED(sp); ++key) {
1823a571abcSchristos 			/* Special case: ~ command. */
1833a571abcSchristos 			if (key == '~' && O_ISSET(sp, O_TILDEOP))
1843a571abcSchristos 				kp = &tmotion;
1853a571abcSchristos 			else
1863a571abcSchristos 				kp = &vikeys[key];
1873a571abcSchristos 			if (kp->help != NULL)
1883a571abcSchristos 				(void)ex_printf(sp, "%s\n", kp->help);
1893a571abcSchristos 		}
1903a571abcSchristos 		break;
1913a571abcSchristos 	default:
1923a571abcSchristos 		abort();
1933a571abcSchristos 	}
1943a571abcSchristos 	return (0);
1953a571abcSchristos }
196