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