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