119304Speter/*- 219304Speter * Copyright (c) 1992, 1993, 1994 319304Speter * The Regents of the University of California. All rights reserved. 419304Speter * Copyright (c) 1992, 1993, 1994, 1995, 1996 519304Speter * Keith Bostic. All rights reserved. 619304Speter * 719304Speter * See the LICENSE file for redistribution information. 819304Speter */ 919304Speter 1019304Speter#include "config.h" 1119304Speter 1219304Speter#ifndef lint 13254225Speterstatic const char sccsid[] = "$Id: ex_display.c,v 10.15 2001/06/25 15:19:15 skimo Exp $"; 1419304Speter#endif /* not lint */ 1519304Speter 1619304Speter#include <sys/types.h> 1719304Speter#include <sys/queue.h> 18254225Speter#include <sys/time.h> 1919304Speter 2019304Speter#include <bitstring.h> 2119304Speter#include <ctype.h> 2219304Speter#include <limits.h> 2319304Speter#include <stdio.h> 2419304Speter#include <string.h> 2519304Speter 2619304Speter#include "../common/common.h" 2719304Speter#include "tag.h" 2819304Speter 29254225Speterstatic int is_prefix __P((ARGS *, CHAR_T *)); 3019304Speterstatic int bdisplay __P((SCR *)); 31254225Speterstatic void db __P((SCR *, CB *, const char *)); 3219304Speter 3319304Speter/* 3419304Speter * ex_display -- :display b[uffers] | c[onnections] | s[creens] | t[ags] 3519304Speter * 3619304Speter * Display cscope connections, buffers, tags or screens. 3719304Speter * 3819304Speter * PUBLIC: int ex_display __P((SCR *, EXCMD *)); 3919304Speter */ 4019304Speterint 41254225Speterex_display(SCR *sp, EXCMD *cmdp) 4219304Speter{ 43254225Speter ARGS *arg; 44254225Speter 45254225Speter arg = cmdp->argv[0]; 46254225Speter 47254225Speter switch (arg->bp[0]) { 4819304Speter case 'b': 49254225Speter if (!is_prefix(arg, L("buffers"))) 5019304Speter break; 5119304Speter return (bdisplay(sp)); 5219304Speter case 'c': 53254225Speter if (!is_prefix(arg, L("connections"))) 5419304Speter break; 5519304Speter return (cscope_display(sp)); 5619304Speter case 's': 57254225Speter if (!is_prefix(arg, L("screens"))) 5819304Speter break; 5919304Speter return (ex_sdisplay(sp)); 6019304Speter case 't': 61254225Speter if (!is_prefix(arg, L("tags"))) 6219304Speter break; 6319304Speter return (ex_tag_display(sp)); 6419304Speter } 6519304Speter ex_emsg(sp, cmdp->cmd->usage, EXM_USAGE); 6619304Speter return (1); 6719304Speter} 6819304Speter 6919304Speter/* 70254225Speter * is_prefix -- 71254225Speter * 72254225Speter * Check that a command argument matches a prefix of a given string. 73254225Speter */ 74254225Speterstatic int 75254225Speteris_prefix(ARGS *arg, CHAR_T *str) 76254225Speter{ 77254225Speter return arg->len <= STRLEN(str) && !MEMCMP(arg->bp, str, arg->len); 78254225Speter} 79254225Speter 80254225Speter/* 8119304Speter * bdisplay -- 8219304Speter * 8319304Speter * Display buffers. 8419304Speter */ 8519304Speterstatic int 86254225Speterbdisplay(SCR *sp) 8719304Speter{ 8819304Speter CB *cbp; 8919304Speter 90254225Speter if (SLIST_EMPTY(sp->gp->cutq) && sp->gp->dcbp == NULL) { 9119304Speter msgq(sp, M_INFO, "123|No cut buffers to display"); 9219304Speter return (0); 9319304Speter } 9419304Speter 9519304Speter /* Display regular cut buffers. */ 96254225Speter SLIST_FOREACH(cbp, sp->gp->cutq, q) { 9719304Speter if (isdigit(cbp->name)) 9819304Speter continue; 99254225Speter if (!TAILQ_EMPTY(cbp->textq)) 10019304Speter db(sp, cbp, NULL); 10119304Speter if (INTERRUPTED(sp)) 10219304Speter return (0); 10319304Speter } 10419304Speter /* Display numbered buffers. */ 105254225Speter SLIST_FOREACH(cbp, sp->gp->cutq, q) { 10619304Speter if (!isdigit(cbp->name)) 10719304Speter continue; 108254225Speter if (!TAILQ_EMPTY(cbp->textq)) 10919304Speter db(sp, cbp, NULL); 11019304Speter if (INTERRUPTED(sp)) 11119304Speter return (0); 11219304Speter } 11319304Speter /* Display default buffer. */ 11419304Speter if ((cbp = sp->gp->dcbp) != NULL) 11519304Speter db(sp, cbp, "default buffer"); 11619304Speter return (0); 11719304Speter} 11819304Speter 11919304Speter/* 12019304Speter * db -- 12119304Speter * Display a buffer. 12219304Speter */ 12319304Speterstatic void 124254225Speterdb(SCR *sp, CB *cbp, const char *name) 12519304Speter{ 12619304Speter CHAR_T *p; 12719304Speter GS *gp; 12819304Speter TEXT *tp; 12919304Speter size_t len; 13019304Speter 13119304Speter gp = sp->gp; 13219304Speter (void)ex_printf(sp, "********** %s%s\n", 13319304Speter name == NULL ? KEY_NAME(sp, cbp->name) : name, 13419304Speter F_ISSET(cbp, CB_LMODE) ? " (line mode)" : " (character mode)"); 135254225Speter TAILQ_FOREACH(tp, cbp->textq, q) { 13619304Speter for (len = tp->len, p = tp->lb; len--; ++p) { 13719304Speter (void)ex_puts(sp, KEY_NAME(sp, *p)); 13819304Speter if (INTERRUPTED(sp)) 13919304Speter return; 14019304Speter } 14119304Speter (void)ex_puts(sp, "\n"); 14219304Speter } 14319304Speter} 144