xref: /netbsd-src/external/bsd/nvi/dist/ex/ex_display.c (revision 2f698edb5c1cb2dcd9e762b0abb50c41dde8b6b7)
1*2f698edbSchristos /*	$NetBSD: ex_display.c,v 1.4 2014/01/26 21:43:45 christos Exp $ */
2dbd550edSchristos /*-
3dbd550edSchristos  * Copyright (c) 1992, 1993, 1994
4dbd550edSchristos  *	The Regents of the University of California.  All rights reserved.
5dbd550edSchristos  * Copyright (c) 1992, 1993, 1994, 1995, 1996
6dbd550edSchristos  *	Keith Bostic.  All rights reserved.
7dbd550edSchristos  *
8dbd550edSchristos  * See the LICENSE file for redistribution information.
9dbd550edSchristos  */
10dbd550edSchristos 
11dbd550edSchristos #include "config.h"
12dbd550edSchristos 
13*2f698edbSchristos #include <sys/cdefs.h>
14*2f698edbSchristos #if 0
15dbd550edSchristos #ifndef lint
16dbd550edSchristos static const char sccsid[] = "Id: ex_display.c,v 10.15 2001/06/25 15:19:15 skimo Exp  (Berkeley) Date: 2001/06/25 15:19:15 ";
17dbd550edSchristos #endif /* not lint */
18*2f698edbSchristos #else
19*2f698edbSchristos __RCSID("$NetBSD: ex_display.c,v 1.4 2014/01/26 21:43:45 christos Exp $");
20*2f698edbSchristos #endif
21dbd550edSchristos 
22dbd550edSchristos #include <sys/types.h>
23dbd550edSchristos #include <sys/queue.h>
24dbd550edSchristos 
25dbd550edSchristos #include <bitstring.h>
26dbd550edSchristos #include <ctype.h>
27dbd550edSchristos #include <limits.h>
28dbd550edSchristos #include <stdio.h>
29dbd550edSchristos #include <string.h>
30dbd550edSchristos 
31dbd550edSchristos #include "../common/common.h"
32dbd550edSchristos #include "tag.h"
33dbd550edSchristos 
348d01a27eSchristos static int	is_prefix __P((ARGS *, const CHAR_T *));
35dbd550edSchristos static int	bdisplay __P((SCR *));
368d01a27eSchristos static void	db __P((SCR *, CB *, const char *));
37dbd550edSchristos 
38dbd550edSchristos /*
39dbd550edSchristos  * ex_display -- :display b[uffers] | c[onnections] | s[creens] | t[ags]
40dbd550edSchristos  *
41dbd550edSchristos  *	Display cscope connections, buffers, tags or screens.
42dbd550edSchristos  *
43dbd550edSchristos  * PUBLIC: int ex_display __P((SCR *, EXCMD *));
44dbd550edSchristos  */
45dbd550edSchristos int
ex_display(SCR * sp,EXCMD * cmdp)46dbd550edSchristos ex_display(SCR *sp, EXCMD *cmdp)
47dbd550edSchristos {
48dbd550edSchristos 	ARGS *arg;
49dbd550edSchristos 
50dbd550edSchristos 	arg = cmdp->argv[0];
51dbd550edSchristos 
52dbd550edSchristos 	switch (arg->bp[0]) {
53dbd550edSchristos 	case L('b'):
54dbd550edSchristos 		if (!is_prefix(arg, L("buffers")))
55dbd550edSchristos 			break;
56dbd550edSchristos 		return (bdisplay(sp));
57dbd550edSchristos 	case L('c'):
58dbd550edSchristos 		if (!is_prefix(arg, L("connections")))
59dbd550edSchristos 			break;
60dbd550edSchristos 		return (cscope_display(sp));
61dbd550edSchristos 	case L('s'):
62dbd550edSchristos 		if (!is_prefix(arg, L("screens")))
63dbd550edSchristos 			break;
64dbd550edSchristos 		return (ex_sdisplay(sp));
65dbd550edSchristos 	case L('t'):
66dbd550edSchristos 		if (!is_prefix(arg, L("tags")))
67dbd550edSchristos 			break;
68dbd550edSchristos 		return (ex_tag_display(sp));
69dbd550edSchristos 	}
70dbd550edSchristos 	ex_emsg(sp, cmdp->cmd->usage, EXM_USAGE);
71dbd550edSchristos 	return (1);
72dbd550edSchristos }
73dbd550edSchristos 
74dbd550edSchristos /*
75dbd550edSchristos  * is_prefix --
76dbd550edSchristos  *
77dbd550edSchristos  *	Check that a command argument matches a prefix of a given string.
78dbd550edSchristos  */
79dbd550edSchristos static int
is_prefix(ARGS * arg,const CHAR_T * str)808d01a27eSchristos is_prefix(ARGS *arg, const CHAR_T *str)
81dbd550edSchristos {
82dbd550edSchristos 	return arg->len <= STRLEN(str) && !MEMCMP(arg->bp, str, arg->len);
83dbd550edSchristos }
84dbd550edSchristos 
85dbd550edSchristos /*
86dbd550edSchristos  * bdisplay --
87dbd550edSchristos  *
88dbd550edSchristos  *	Display buffers.
89dbd550edSchristos  */
90dbd550edSchristos static int
bdisplay(SCR * sp)91dbd550edSchristos bdisplay(SCR *sp)
92dbd550edSchristos {
93dbd550edSchristos 	CB *cbp;
94dbd550edSchristos 
95d89691f9Schristos 	if (LIST_EMPTY(&sp->wp->cutq) && sp->wp->dcbp == NULL) {
96dbd550edSchristos 		msgq(sp, M_INFO, "123|No cut buffers to display");
97dbd550edSchristos 		return (0);
98dbd550edSchristos 	}
99dbd550edSchristos 
100dbd550edSchristos 	/* Display regular cut buffers. */
101d89691f9Schristos 	LIST_FOREACH(cbp, &sp->wp->cutq, q) {
1028d01a27eSchristos 		if (ISDIGIT(cbp->name))
103dbd550edSchristos 			continue;
104d89691f9Schristos 		if (!TAILQ_EMPTY(&cbp->textq))
105dbd550edSchristos 			db(sp, cbp, NULL);
106dbd550edSchristos 		if (INTERRUPTED(sp))
107dbd550edSchristos 			return (0);
108dbd550edSchristos 	}
109dbd550edSchristos 	/* Display numbered buffers. */
110d89691f9Schristos 	LIST_FOREACH(cbp, &sp->wp->cutq, q) {
1118d01a27eSchristos 		if (!ISDIGIT(cbp->name))
112dbd550edSchristos 			continue;
113d89691f9Schristos 		if (!TAILQ_EMPTY(&cbp->textq))
114dbd550edSchristos 			db(sp, cbp, NULL);
115dbd550edSchristos 		if (INTERRUPTED(sp))
116dbd550edSchristos 			return (0);
117dbd550edSchristos 	}
118dbd550edSchristos 	/* Display default buffer. */
119dbd550edSchristos 	if ((cbp = sp->wp->dcbp) != NULL)
120dbd550edSchristos 		db(sp, cbp, "default buffer");
121dbd550edSchristos 	return (0);
122dbd550edSchristos }
123dbd550edSchristos 
124dbd550edSchristos /*
125dbd550edSchristos  * db --
126dbd550edSchristos  *	Display a buffer.
127dbd550edSchristos  */
128dbd550edSchristos static void
db(SCR * sp,CB * cbp,const char * np)1298d01a27eSchristos db(SCR *sp, CB *cbp, const char *np)
130dbd550edSchristos {
131dbd550edSchristos 	CHAR_T *p;
132dbd550edSchristos 	TEXT *tp;
133dbd550edSchristos 	size_t len;
1348d01a27eSchristos 	const unsigned char *name = (const void *)np;
135dbd550edSchristos 
136dbd550edSchristos 	(void)ex_printf(sp, "********** %s%s\n",
137dbd550edSchristos 	    name == NULL ? KEY_NAME(sp, cbp->name) : name,
138dbd550edSchristos 	    F_ISSET(cbp, CB_LMODE) ? " (line mode)" : " (character mode)");
139d89691f9Schristos 	TAILQ_FOREACH(tp, &cbp->textq, q) {
140dbd550edSchristos 		for (len = tp->len, p = tp->lb; len--; ++p) {
1418d01a27eSchristos 			(void)ex_puts(sp, (char *)KEY_NAME(sp, *p));
142dbd550edSchristos 			if (INTERRUPTED(sp))
143dbd550edSchristos 				return;
144dbd550edSchristos 		}
145dbd550edSchristos 		(void)ex_puts(sp, "\n");
146dbd550edSchristos 	}
147dbd550edSchristos }
148