Subject: bin/5978: patches to add gtags support to nvi
To: None <gnats-bugs@gnats.netbsd.org>
From: None <abs@mono.org>
List: netbsd-bugs
Date: 08/15/1998 15:22:47
>Number:         5978
>Category:       bin
>Synopsis:       patches to add gtags support to nvi
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    bin-bug-people (Utility Bug People)
>State:          open
>Class:          change-request
>Submitter-Id:   net
>Arrival-Date:   Sat Aug 15 15:35:00 1998
>Last-Modified:
>Originator:     David Brownlee
>Organization:
	<a href="http://www.mono.org">Monochrome</a>
>Release:        NetBSD 1.3.2 (or NetBSD-current 1998-08-15)
>Environment:
System: NetBSD filter 1.3.2 NetBSD 1.3.2 (_FILTER_) #0: Fri Jun 5 12:04:39 PDT 1998 root@filter:/usr/src/sys/arch/i386/compile/_FILTER_ i386

>Description:
        I've been talking to Shigio Yamaguchi - the developer of GLOBAL,
	a common source code tag system which among other uses can produce
	a very nice web browsable listing - see:
                http://wafu.netgate.net/tama/netbsd/

        FreeBSD ship with global in their base tree, but the command to
        produce a browsable HTML tree from global's gtags is written in
        perl, so from our viewpoint thats a non starter - I'll submit
        a package.

        One issue is that he has a set of patches to add gtags support
	to nvi (via -G, or 'set gt'). I've tested out the patches (Well,
	vi compiles and seems to run fine, and the gtags stuff works).
	They're for 1.3.2, though apply to -current bar the getopt()
	change, that needs to be applied manually.

>How-To-Repeat:
	Need global support in vi
>Fix:

From: Shigio Yamaguchi <shigio@wafu.netgate.net>

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 "<control-]>"
  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 "<control-^>"
  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 <newline>. */
  #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.
+  * <tag>   <lineno>  <file>         <image>
+  *
+  * 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'", 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));
--
Shigio Yamaguchi (Freelance programmer)
	Mail: shigio@wafu.netgate.net, WWW: http://wafu.netgate.net/tama/
	
>Audit-Trail:
>Unformatted: