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