diff -c -r -N /usr/src/usr.bin/nvi-1.66.org/build/Makefile ./build/Makefile *** /usr/src/usr.bin/nvi-1.66.org/build/Makefile Tue May 5 15:57:21 1998 --- ./build/Makefile Sun Aug 16 03:22:53 1998 *************** *** 3,9 **** # from: @(#)Makefile.in 8.56 (Berkeley) 5/18/96 WARNS= 0 ! CPPFLAGS+=-I${.CURDIR} -I${.CURDIR}/../include LDADD+= -lcurses -ltermcap DPADD+= ${LIBCURSES} ${LIBTERMCAP} --- 3,9 ---- # from: @(#)Makefile.in 8.56 (Berkeley) 5/18/96 WARNS= 0 ! CPPFLAGS+=-I${.CURDIR} -I${.CURDIR}/../include -DGTAGS LDADD+= -lcurses -ltermcap DPADD+= ${LIBCURSES} ${LIBTERMCAP} diff -c -r -N /usr/src/usr.bin/nvi-1.66.org/common/main.c ./common/main.c *** /usr/src/usr.bin/nvi-1.66.org/common/main.c Tue May 5 15:57:26 1998 --- ./common/main.c Sun Aug 16 03:27:19 1998 *************** *** 63,68 **** --- 63,71 ---- size_t len; u_int flags; int ch, fd, flagchk, lflag, startup, readonly, rval, silent; + #ifdef GTAGS + int gtags = 0; + #endif char *tag_f, *wsizearg; char path[256]; *************** *** 113,123 **** --- 116,135 ---- /* Set the file snapshot flag. */ F_SET(gp, G_SNAPSHOT); + #ifdef GTAGS + #ifdef DEBUG + while ((ch = getopt(argc, argv, "c:D:eFGlRrsT:t:vw:")) != EOF) + #else + while ((ch = getopt(argc, argv, "c:eFGlRrst:vw:")) != EOF) + #endif + #else #ifdef DEBUG while ((ch = getopt(argc, argv, "c:D:eFlRrsT:t:vw:")) != EOF) #else while ((ch = getopt(argc, argv, "c:eFlRrst:vw:")) != EOF) #endif + #endif + switch (ch) { case 'c': /* Run the command. */ /* *************** *** 167,172 **** --- 179,189 ---- case 'F': /* No snapshot. */ F_CLR(gp, G_SNAPSHOT); break; + #ifdef GTAGS + case 'G': /* gtags mode. */ + gtags = 1; + break; + #endif case 'l': /* Set lisp, showmatch options. */ lflag = 1; break; *************** *** 258,263 **** --- 275,284 ---- { int oargs[4], *oargp = oargs; if (readonly) /* Command-line options. */ *oargp++ = O_READONLY; + #ifdef GTAGS + if (gtags) + *oargp++ = O_GTAGSMODE; + #endif if (lflag) { *oargp++ = O_LISP; *oargp++ = O_SHOWMATCH; diff -c -r -N /usr/src/usr.bin/nvi-1.66.org/common/options.c ./common/options.c *** /usr/src/usr.bin/nvi-1.66.org/common/options.c Tue May 5 15:57:26 1998 --- ./common/options.c Sun Aug 16 03:29:51 1998 *************** *** 80,85 **** --- 80,89 ---- {"filec", NULL, OPT_STR, 0}, /* O_FLASH HPUX */ {"flash", NULL, OPT_1BOOL, 0}, + #ifdef GTAGS + /* O_GTAGSMODE FreeBSD, NetBSD */ + {"gtagsmode", NULL, OPT_0BOOL, 0}, + #endif /* O_HARDTABS 4BSD */ {"hardtabs", NULL, OPT_NUM, 0}, /* O_ICLOWER 4.4BSD */ *************** *** 240,245 **** --- 244,252 ---- {"eb", O_ERRORBELLS}, /* 4BSD */ {"ed", O_EDCOMPATIBLE}, /* 4BSD */ {"ex", O_EXRC}, /* System V (undocumented) */ + #ifdef GTAGS + {"gt", O_GTAGSMODE}, /* FreeBSD, NetBSD */ + #endif {"ht", O_HARDTABS}, /* 4BSD */ {"ic", O_IGNORECASE}, /* 4BSD */ {"li", O_LINES}, /* 4.4BSD */ diff -c -r -N /usr/src/usr.bin/nvi-1.66.org/docs/USD.doc/vi.man/vi.1 ./docs/USD.doc/vi.man/vi.1 *** /usr/src/usr.bin/nvi-1.66.org/docs/USD.doc/vi.man/vi.1 Tue May 5 15:57:31 1998 --- ./docs/USD.doc/vi.man/vi.1 Sun Aug 16 03:34:12 1998 *************** *** 40,46 **** .SH SYNOPSIS .B ex [\c ! .B -eFRrsv\c ] [\c .BI -c " cmd"\c ] [\c --- 40,46 ---- .SH SYNOPSIS .B ex [\c ! .B -eFGRrsv\c ] [\c .BI -c " cmd"\c ] [\c *************** *** 51,57 **** .br .B vi [\c ! .B -eFlRrv\c ] [\c .BI -c " cmd"\c ] [\c --- 51,57 ---- .br .B vi [\c ! .B -eFGlRrv\c ] [\c .BI -c " cmd"\c ] [\c *************** *** 62,68 **** .br .B view [\c ! .B -eFRrv\c ] [\c .BI -c " cmd"\c ] [\c --- 62,68 ---- .br .B view [\c ! .B -eFGRrv\c ] [\c .BI -c " cmd"\c ] [\c *************** *** 135,140 **** --- 135,143 ---- (The default is to make a copy in case someone else modifies the file during your edit session.) .TP + .B \-G + Start editing in gtags mode, as if the gtagsmode option was set. + .TP .B \-l Start editing with the lisp and showmatch options set. .TP *************** *** 441,446 **** --- 444,451 ---- .TP .B "" Push a tag reference onto the tag stack. + In gtagsmode, if at the first column of line, + locate function references otherwise function definitions. .TP .B "" Switch to the most recently edited file. *************** *** 952,957 **** --- 957,965 ---- .B "rew[ind][!]" Rewind the argument list. .TP + .B "rta[g][!] tagstring" + Edit the file refering the specified tag. (Only in gtagsmode) + .TP .B "se[t] [option[=[value]] ...] [nooption ...] [option? ...] [all]" Display or set editor options. .TP *************** *** 1121,1126 **** --- 1129,1137 ---- .TP .B "flash [on]" Flash the screen instead of beeping the keyboard on error. + .TP + .B "gtagsmode, gt [off]" + Use GTAGS and GRTAGS instead of tags. .TP .B "hardtabs, ht [8]" Set the spacing between hardware tab settings. diff -c -r -N /usr/src/usr.bin/nvi-1.66.org/ex/ex.h ./ex/ex.h *** /usr/src/usr.bin/nvi-1.66.org/ex/ex.h Tue May 5 15:57:37 1998 --- ./ex/ex.h Sun Aug 16 03:35:58 1998 *************** *** 162,167 **** --- 162,170 ---- #define E_NEWLINE 0x00800000 /* Found ending . */ #define E_USELASTCMD 0x01000000 /* Use the last command. */ #define E_VISEARCH 0x02000000 /* It's really a vi search command. */ + #ifdef GTAGS + #define E_REFERENCE 0x04000000 /* locate function references */ + #endif u_int32_t flags; /* Current flags. */ }; diff -c -r -N /usr/src/usr.bin/nvi-1.66.org/ex/ex_cmd.c ./ex/ex_cmd.c *** /usr/src/usr.bin/nvi-1.66.org/ex/ex_cmd.c Tue May 5 15:57:37 1998 --- ./ex/ex_cmd.c Sun Aug 16 03:38:03 1998 *************** *** 302,307 **** --- 302,314 ---- "!", "rew[ind][!]", "re-edit all the files in the file argument list"}, + #ifdef GTAGS + /* C_RTAG */ + {"rtag", ex_rtag_push, E_NEWSCREEN, + "!w1o", + "rta[g][!] [string]", + "edit the file containing the tag"}, + #endif /* * !!! * Adding new commands starting with 's' may break the substitute command code diff -c -r -N /usr/src/usr.bin/nvi-1.66.org/ex/ex_tag.c ./ex/ex_tag.c *** /usr/src/usr.bin/nvi-1.66.org/ex/ex_tag.c Tue May 5 15:57:41 1998 --- ./ex/ex_tag.c Sun Aug 16 03:46:43 1998 *************** *** 46,51 **** --- 46,55 ---- static int compare __P((char *, char *, char *)); static void ctag_file __P((SCR *, TAGF *, char *, char **, size_t *)); static int ctag_search __P((SCR *, char *, char *)); + #ifdef GTAGS + static int getentry __P((char *, char **, char **, char **)); + static TAGQ *gtag_slist __P((SCR *, char *, int)); + #endif static int ctag_sfile __P((SCR *, TAGF *, TAGQ *, char *)); static TAGQ *ctag_slist __P((SCR *, char *)); static char *linear_search __P((char *, char *, char *)); *************** *** 89,94 **** --- 93,117 ---- return (0); } + #ifdef GTAGS + /* + * ex_rtag_push -- ^] + * :rtag[!] [string] + * + * Enter a new TAGQ context based on a ctag string. + * + * PUBLIC: int ex_rtag_push __P((SCR *, EXCMD *)); + */ + int + ex_rtag_push(sp, cmdp) + SCR *sp; + EXCMD *cmdp; + { + F_SET(cmdp, E_REFERENCE); + return ex_tag_push(sp, cmdp); + } + #endif + /* * ex_tag_push -- ^] * :tag[!] [string] *************** *** 138,143 **** --- 161,172 ---- } /* Get the tag information. */ + #ifdef GTAGS + if (O_ISSET(sp, O_GTAGSMODE)) { + if ((tqp = gtag_slist(sp, exp->tag_last, F_ISSET(cmdp, E_REFERENCE))) == NULL) + return (1); + } else + #endif if ((tqp = ctag_slist(sp, exp->tag_last)) == NULL) return (1); *************** *** 963,969 **** --- 992,1120 ---- (void)nonblank(sp, sp->lno, &sp->cno); return (0); } + #ifdef GTAGS + /* + * getentry -- + * get tag information from current line. + * + * gtags temporary file format. + * + * + * sample. + * +------------------------------------------------ + * |main 30 main.c main(argc, argv) + * |func 21 subr.c func(arg) + */ + static int + getentry(buf, tag, file, line) + char *buf, **tag, **file, **line; + { + char *p = buf; + + for (*tag = p; *p && !isspace(*p); p++) /* tag name */ + ; + if (*p == 0) + goto err; + *p++ = 0; + for (; *p && isspace(*p); p++) /* (skip blanks) */ + ; + if (*p == 0) + goto err; + *line = p; /* line no */ + for (*line = p; *p && !isspace(*p); p++) + ; + if (*p == 0) + goto err; + *p++ = 0; + for (; *p && isspace(*p); p++) /* (skip blanks) */ + ; + if (*p == 0) + goto err; + *file = p; /* file name */ + for (*file = p; *p && !isspace(*p); p++) + ; + if (*p == 0) + goto err; + *p = 0; + + /* value check */ + if (strlen(*tag) && strlen(*line) && strlen(*file) && atoi(*line) > 0) + return 1; /* OK */ + err: + return 0; /* ERROR */ + } + + /* + * gtag_slist -- + * Search the list of tags files for a tag, and return tag queue. + */ + static TAGQ * + gtag_slist(sp, tag, ref) + SCR *sp; + char *tag; + int ref; + { + EX_PRIVATE *exp; + TAGF *tfp; + TAGQ *tqp; + size_t len; + int echk; + TAG *tp; + char *name, *file, *line; + char command[BUFSIZ]; + char buf[BUFSIZ]; + FILE *fp; + + /* Allocate and initialize the tag queue structure. */ + len = strlen(tag); + CALLOC_GOTO(sp, tqp, TAGQ *, 1, sizeof(TAGQ) + len + 1); + CIRCLEQ_INIT(&tqp->tagq); + tqp->tag = tqp->buf; + memcpy(tqp->tag, tag, (tqp->tlen = len) + 1); + + /* + * Find the tag, only display missing file messages once, and + * then only if we didn't find the tag. + */ + snprintf(command, sizeof(command), "global -%s '%s' 2>/dev/null", ref ? "rx" : "x", tag); + if (fp = popen(command, "r")) { + while (fgets(buf, sizeof(buf), fp)) { + if (buf[strlen(buf)-1] == '\n') /* chop(buf) */ + buf[strlen(buf)-1] = 0; + else + while (fgetc(fp) != '\n') + ; + if (getentry(buf, &name, &file, &line) == 0) { + echk = 1; + F_SET(tfp, TAGF_ERR); + break; + } + CALLOC_GOTO(sp, tp, + TAG *, 1, sizeof(TAG) + strlen(file) + 1 + strlen(line) + 1); + tp->fname = tp->buf; + strcpy(tp->fname, file); + tp->fnlen = strlen(file); + tp->search = tp->fname + tp->fnlen + 1; + strcpy(tp->search, line); + CIRCLEQ_INSERT_TAIL(&tqp->tagq, tp, q); + } + pclose(fp); + } + + /* Check to see if we found anything. */ + if (tqp->tagq.cqh_first == (void *)&tqp->tagq) { + msgq_str(sp, M_ERR, tag, "162|%s: tag not found"); + free(tqp); + return (NULL); + } + tqp->current = tqp->tagq.cqh_first; + return (tqp); + + alloc_err: + return (NULL); + } + #endif /* * ctag_slist -- * Search the list of tags files for a tag, and return tag queue. diff -c -r -N /usr/src/usr.bin/nvi-1.66.org/include/ex_def.h ./include/ex_def.h *** /usr/src/usr.bin/nvi-1.66.org/include/ex_def.h Tue May 5 15:57:42 1998 --- ./include/ex_def.h Sun Aug 16 03:49:40 1998 *************** *** 47,78 **** #define C_RECOVER 46 #define C_RESIZE 47 #define C_REWIND 48 ! #define C_SUBSTITUTE 49 ! #define C_SCRIPT 50 ! #define C_SET 51 ! #define C_SHELL 52 ! #define C_SOURCE 53 ! #define C_STOP 54 ! #define C_SUSPEND 55 ! #define C_T 56 ! #define C_TAG 57 ! #define C_TAGNEXT 58 ! #define C_TAGPOP 59 ! #define C_TAGPREV 60 ! #define C_TAGTOP 61 ! #define C_TCLCMD 62 ! #define C_UNDO 63 ! #define C_UNABBREVIATE 64 ! #define C_UNMAP 65 ! #define C_V 66 ! #define C_VERSION 67 ! #define C_VISUAL_EX 68 ! #define C_VISUAL_VI 69 ! #define C_VIUSAGE 70 ! #define C_WRITE 71 ! #define C_WN 72 ! #define C_WQ 73 ! #define C_XIT 74 ! #define C_YANK 75 ! #define C_Z 76 ! #define C_SUBTILDE 77 --- 47,79 ---- #define C_RECOVER 46 #define C_RESIZE 47 #define C_REWIND 48 ! #define C_RTAG 49 ! #define C_SUBSTITUTE 50 ! #define C_SCRIPT 51 ! #define C_SET 52 ! #define C_SHELL 53 ! #define C_SOURCE 54 ! #define C_STOP 55 ! #define C_SUSPEND 56 ! #define C_T 57 ! #define C_TAG 58 ! #define C_TAGNEXT 59 ! #define C_TAGPOP 60 ! #define C_TAGPREV 61 ! #define C_TAGTOP 62 ! #define C_TCLCMD 63 ! #define C_UNDO 64 ! #define C_UNABBREVIATE 65 ! #define C_UNMAP 66 ! #define C_V 67 ! #define C_VERSION 68 ! #define C_VISUAL_EX 69 ! #define C_VISUAL_VI 70 ! #define C_VIUSAGE 71 ! #define C_WRITE 72 ! #define C_WN 73 ! #define C_WQ 74 ! #define C_XIT 75 ! #define C_YANK 76 ! #define C_Z 77 ! #define C_SUBTILDE 78 diff -c -r -N /usr/src/usr.bin/nvi-1.66.org/include/ex_extern.h ./include/ex_extern.h *** /usr/src/usr.bin/nvi-1.66.org/include/ex_extern.h Tue May 5 15:57:42 1998 --- ./include/ex_extern.h Sun Aug 16 03:50:24 1998 *************** *** 92,97 **** --- 92,100 ---- char *, char **, size_t *, regex_t *, u_int)); void re_error __P((SCR *, int, regex_t *)); int ex_tag_first __P((SCR *, char *)); + #ifdef GTAGS + int ex_rtag_push __P((SCR *, EXCMD *)); + #endif int ex_tag_push __P((SCR *, EXCMD *)); int ex_tag_next __P((SCR *, EXCMD *)); int ex_tag_prev __P((SCR *, EXCMD *)); diff -c -r -N /usr/src/usr.bin/nvi-1.66.org/include/options_def.h ./include/options_def.h *** /usr/src/usr.bin/nvi-1.66.org/include/options_def.h Tue May 5 15:57:42 1998 --- ./include/options_def.h Sun Aug 16 03:54:45 1998 *************** *** 16,77 **** #define O_EXTENDED 15 #define O_FILEC 16 #define O_FLASH 17 ! #define O_HARDTABS 18 ! #define O_ICLOWER 19 ! #define O_IGNORECASE 20 ! #define O_KEYTIME 21 ! #define O_LEFTRIGHT 22 ! #define O_LINES 23 ! #define O_LISP 24 ! #define O_LIST 25 ! #define O_LOCKFILES 26 ! #define O_MAGIC 27 ! #define O_MATCHTIME 28 ! #define O_MESG 29 ! #define O_MODELINE 30 ! #define O_MSGCAT 31 ! #define O_NOPRINT 32 ! #define O_NUMBER 33 ! #define O_OCTAL 34 ! #define O_OPEN 35 ! #define O_OPTIMIZE 36 ! #define O_PARAGRAPHS 37 ! #define O_PRINT 38 ! #define O_PROMPT 39 ! #define O_READONLY 40 ! #define O_RECDIR 41 ! #define O_REDRAW 42 ! #define O_REMAP 43 ! #define O_REPORT 44 ! #define O_RULER 45 ! #define O_SCROLL 46 ! #define O_SEARCHINCR 47 ! #define O_SECTIONS 48 ! #define O_SECURE 49 ! #define O_SHELL 50 ! #define O_SHELLMETA 51 ! #define O_SHIFTWIDTH 52 ! #define O_SHOWMATCH 53 ! #define O_SHOWMODE 54 ! #define O_SIDESCROLL 55 ! #define O_SLOWOPEN 56 ! #define O_SOURCEANY 57 ! #define O_TABSTOP 58 ! #define O_TAGLENGTH 59 ! #define O_TAGS 60 ! #define O_TERM 61 ! #define O_TERSE 62 ! #define O_TILDEOP 63 ! #define O_TIMEOUT 64 ! #define O_TTYWERASE 65 ! #define O_VERBOSE 66 ! #define O_W1200 67 ! #define O_W300 68 ! #define O_W9600 69 ! #define O_WARN 70 ! #define O_WINDOW 71 ! #define O_WRAPLEN 72 ! #define O_WRAPMARGIN 73 ! #define O_WRAPSCAN 74 ! #define O_WRITEANY 75 ! #define O_OPTIONCOUNT 76 --- 16,78 ---- #define O_EXTENDED 15 #define O_FILEC 16 #define O_FLASH 17 ! #define O_GTAGSMODE 18 ! #define O_HARDTABS 19 ! #define O_ICLOWER 20 ! #define O_IGNORECASE 21 ! #define O_KEYTIME 22 ! #define O_LEFTRIGHT 23 ! #define O_LINES 24 ! #define O_LISP 25 ! #define O_LIST 26 ! #define O_LOCKFILES 27 ! #define O_MAGIC 28 ! #define O_MATCHTIME 29 ! #define O_MESG 30 ! #define O_MODELINE 31 ! #define O_MSGCAT 32 ! #define O_NOPRINT 33 ! #define O_NUMBER 34 ! #define O_OCTAL 35 ! #define O_OPEN 36 ! #define O_OPTIMIZE 37 ! #define O_PARAGRAPHS 38 ! #define O_PRINT 39 ! #define O_PROMPT 40 ! #define O_READONLY 41 ! #define O_RECDIR 42 ! #define O_REDRAW 43 ! #define O_REMAP 44 ! #define O_REPORT 45 ! #define O_RULER 46 ! #define O_SCROLL 47 ! #define O_SEARCHINCR 48 ! #define O_SECTIONS 49 ! #define O_SECURE 50 ! #define O_SHELL 51 ! #define O_SHELLMETA 52 ! #define O_SHIFTWIDTH 53 ! #define O_SHOWMATCH 54 ! #define O_SHOWMODE 55 ! #define O_SIDESCROLL 56 ! #define O_SLOWOPEN 57 ! #define O_SOURCEANY 58 ! #define O_TABSTOP 59 ! #define O_TAGLENGTH 60 ! #define O_TAGS 61 ! #define O_TERM 62 ! #define O_TERSE 63 ! #define O_TILDEOP 64 ! #define O_TIMEOUT 65 ! #define O_TTYWERASE 66 ! #define O_VERBOSE 67 ! #define O_W1200 68 ! #define O_W300 69 ! #define O_W9600 70 ! #define O_WARN 71 ! #define O_WINDOW 72 ! #define O_WRAPLEN 73 ! #define O_WRAPMARGIN 74 ! #define O_WRAPSCAN 75 ! #define O_WRITEANY 76 ! #define O_OPTIONCOUNT 77 diff -c -r -N /usr/src/usr.bin/nvi-1.66.org/vi/v_ex.c ./vi/v_ex.c *** /usr/src/usr.bin/nvi-1.66.org/vi/v_ex.c Tue May 5 15:57:45 1998 --- ./vi/v_ex.c Sun Aug 16 03:55:38 1998 *************** *** 221,226 **** --- 221,231 ---- ARGS *ap[2], a; EXCMD cmd; + #ifdef GTAGS + if (O_ISSET(sp, O_GTAGSMODE) && vp->m_start.cno == 0) + ex_cinit(&cmd, C_RTAG, 0, OOBLNO, 0, 0, ap); + else + #endif ex_cinit(&cmd, C_TAG, 0, OOBLNO, 0, 0, ap); ex_cadd(&cmd, &a, VIP(sp)->keyw, strlen(VIP(sp)->keyw)); return (v_exec_ex(sp, vp, &cmd));