summaryrefslogtreecommitdiffstats
path: root/contrib
diff options
context:
space:
mode:
authorcwt <cwt@FreeBSD.org>1997-12-15 23:08:46 +0000
committercwt <cwt@FreeBSD.org>1997-12-15 23:08:46 +0000
commitb1200e5a86469f83f9487d32847b49df6f6e8d81 (patch)
tree84ffbd5bfaa52e29af60dccffd70e807e7110a91 /contrib
parentd9973ba95ba5804ff9b4d3b5295bc5126726e474 (diff)
parent2d4696c8a0217d673b65b4f308e71d6ae8f5ebc6 (diff)
downloadFreeBSD-src-b1200e5a86469f83f9487d32847b49df6f6e8d81.zip
FreeBSD-src-b1200e5a86469f83f9487d32847b49df6f6e8d81.tar.gz
This commit was generated by cvs2svn to compensate for changes in r31750,
which included commits to RCS files with non-trunk default branches.
Diffstat (limited to 'contrib')
-rw-r--r--contrib/global/HISTORY122
-rw-r--r--contrib/global/INSTALL62
-rw-r--r--contrib/global/MANIFEST7
-rw-r--r--contrib/global/Makefile2
-rw-r--r--contrib/global/Makefile.generic28
-rw-r--r--contrib/global/Makefile.inc6
-rw-r--r--contrib/global/PROBLEMS38
-rw-r--r--contrib/global/README95
-rw-r--r--contrib/global/VERSION2
-rw-r--r--contrib/global/btreeop/Makefile5
-rw-r--r--contrib/global/btreeop/Makefile.generic16
-rw-r--r--contrib/global/btreeop/btreeop.171
-rw-r--r--contrib/global/gctags/C.c128
-rw-r--r--contrib/global/gctags/Makefile6
-rw-r--r--contrib/global/gctags/Makefile.generic15
-rw-r--r--contrib/global/gctags/assembler.c2
-rw-r--r--contrib/global/gctags/ctags.c135
-rw-r--r--contrib/global/gctags/ctags.h17
-rw-r--r--contrib/global/gctags/gctags.112
-rw-r--r--contrib/global/gctags/print.c60
-rw-r--r--contrib/global/gctags/tree.c12
-rw-r--r--contrib/global/global/Makefile11
-rw-r--r--contrib/global/global/Makefile.generic17
-rw-r--r--contrib/global/global/global.164
-rw-r--r--contrib/global/global/global.c746
-rw-r--r--contrib/global/gozilla/Imakefile12
-rw-r--r--contrib/global/gozilla/gozilla.c194
-rw-r--r--contrib/global/gozilla/gozilla.man141
-rw-r--r--contrib/global/gozilla/remote.c717
-rw-r--r--contrib/global/gozilla/vroot.h119
-rw-r--r--contrib/global/gtags/Makefile11
-rw-r--r--contrib/global/gtags/Makefile.generic17
-rw-r--r--contrib/global/gtags/gtags.150
-rw-r--r--contrib/global/gtags/gtags.c302
-rw-r--r--contrib/global/htags/Makefile4
-rw-r--r--contrib/global/htags/Makefile.generic4
-rw-r--r--contrib/global/htags/htags.pl162
-rw-r--r--contrib/global/lib/Makefile8
-rw-r--r--contrib/global/lib/Makefile.generic14
-rw-r--r--contrib/global/lib/dbio.c322
-rw-r--r--contrib/global/lib/dbio.h89
-rw-r--r--contrib/global/lib/dbname.c48
-rw-r--r--contrib/global/lib/dbname.h53
-rw-r--r--contrib/global/lib/die.h49
-rw-r--r--contrib/global/lib/find.c165
-rw-r--r--contrib/global/lib/find.h51
-rw-r--r--contrib/global/lib/getdbpath.c154
-rw-r--r--contrib/global/lib/getdbpath.h49
-rw-r--r--contrib/global/lib/global.h54
-rw-r--r--contrib/global/lib/gparam.h42
-rw-r--r--contrib/global/lib/gtagsopen.c95
-rw-r--r--contrib/global/lib/gtagsopen.h41
-rw-r--r--contrib/global/lib/locatestring.c70
-rw-r--r--contrib/global/lib/locatestring.h48
-rw-r--r--contrib/global/lib/lookup.c64
-rw-r--r--contrib/global/lib/lookup.h50
-rw-r--r--contrib/global/lib/makepath.c57
-rw-r--r--contrib/global/lib/makepath.h48
-rw-r--r--contrib/global/lib/mgets.c113
-rw-r--r--contrib/global/lib/mgets.h51
-rw-r--r--contrib/global/lib/strop.c117
-rw-r--r--contrib/global/lib/strop.h52
-rw-r--r--contrib/global/lib/tab.c99
-rw-r--r--contrib/global/lib/tab.h49
-rw-r--r--contrib/global/lib/tag.c80
-rw-r--r--contrib/global/lib/tag.h51
-rw-r--r--contrib/global/lib/test.c90
-rw-r--r--contrib/global/lib/test.h48
-rw-r--r--contrib/global/systags/Makefile4
-rw-r--r--contrib/global/systags/Makefile.generic2
-rwxr-xr-xcontrib/global/systags/systags.sh10
71 files changed, 5322 insertions, 427 deletions
diff --git a/contrib/global/HISTORY b/contrib/global/HISTORY
index 6698351..1f26bbb 100644
--- a/contrib/global/HISTORY
+++ b/contrib/global/HISTORY
@@ -3,6 +3,8 @@ GLOBAL history
version 1.0 initial version [21-Apr-96]
+ global, gtags, btreeop, extended ctags.
+
version 1.1 only bugfix [2-May-96]
[fixed bug]
@@ -72,6 +74,12 @@ version 1.6 support of 1.76 nvi and reconstruction for other OS [21-Jan-97]
now GLOBAL includes BSD ctags in it. so no longer has
patch file (ctags.diff).
(I brought original ctags from FreeBSD 2.1.5R)
+
+ Thanks to
+ Gary Kline
+ Hideki Mori
+ for their advice.
+
global - -a option added.
version 1.7 make suitable for large project (mainly FreeBSD kernel) [17-Feb-97]
@@ -143,14 +151,14 @@ version 1.9 support of 1.79 nvi and some additional options [21-Apr-97]
So, changed to convert tabs in source files into spaces.
(expand(1) needed)
- Thanks to Andy Newman.
+ Thanks to Andy Newman for his bug report and fix method.
- cannot print error message correctly.
[changed]
gctags, btreeop
- modify for SunOS 4.1.3.
- Thanks to Yoshiharu Ito.
+ Thanks to Yoshiharu Ito for his information.
[added]
btreeop - META record is available.
@@ -192,12 +200,116 @@ version 2.0 Support of Emacs and CGI Form [7-Jul-97]
[deleted]
nvi-1.76.diff
[added]
- gtags.el- added emacs support (emulation of 1.34 nvi)
- htags - added hyperlink for include files.
- - added checking if GTAGS is the latest one.
+ gtags.el- emacs support (emulation of 1.34 nvi) added.
+ htags - hyperlink for include files added.
+ - check if GTAGS is the latest one.
- -f option added.
With this option, you can use input form and dynamic
index. (You need to setup httpd server for it.)
- -n option added.
global - -f option added.
btreeop - -L option added.
+
+version 2.1 Symbol search, incremental update and gozilla [20-Sep-97]
+
+ [changed]
+ gtags - -e option and -s option were deleted.
+ These options become default, so you need not to specify
+ them. Gtags accepts these options for compatibility but
+ no effect.
+ global - understand not only 'obj'(MAKEOBJDIR) directory but also
+ '/usr/obj'(MAKEOBJDIRPREFIX) directory of BSD build system.
+
+ Thanks to Jordan K. Hubbard. This is his idea.
+
+ gctags, btreeop
+ - remove <err.h> for portability. (Sorry, Philippe...)
+ btreeop - output procedure rewritten.
+ detab() + fprintf -> detab_print()
+ gtags, htags, global
+ - don't restrict PATH to '/bin:/usr/bin' like version 1.9
+ and the former.
+ [fixed bug]
+ gctags - cannot treat files which include '\r'.
+
+ Thanks to Christoph Conrad for his bug report.
+
+ - is disturbed by '_asm' statement.
+ - write buffer beyoned the end when source file doesn't
+ end with '\n'. It brings segmentation fault.
+ gtags.el- ESC-r command doesn't work.
+ htags - has a security hole in global.cgi.
+ btreeop - corrupt database when interrupted.
+ all command
+ - description of exit code in online manual is fixed.
+ [added]
+ gozilla
+ - new command.
+ gtags, gctags, global
+ - can locate specified symbol other than function name
+ using GSYMS tag file.
+ btreeop - support secondary key.
+ Optional key number added to -K option and -D option.
+ - -k option added.(prefix read)
+ global
+ - -g option added.(grep pattern)
+
+ Thanks to Hideaki Okada for his advice.
+
+ - -s option added.(symbol search)
+ - -i option added.(incremental update)
+ - -l option added.(search only under current directory)
+ - -v option added.(verbose mode)
+ gtags - -i option added.(incremental update)
+ - -v option added.(verbose mode)
+ - -o option added.(stop making GSYMS tag file)
+ gtags.el- gtags-find-symbol command (ESC-s) added.
+ It is equal to global's -s option.
+ - gtags-find-pattern command (ESC-g) added.
+ It is equal to global's -g option.
+
+version 2.11 only bugfix [7-Nov-97]
+
+ [fixed bug]
+ htags, gtags
+ - cannot treat symbolic link.
+
+ Thanks to Yoshiharu Ito for his bug report.
+
+ Makefile.generic
+ - doens't work on Debian GNU/Linux.
+
+ Thanks to Y.Yoshinaga for his patch.
+
+version 2.2 Rewritten with C for performance [7-Dec-97]
+
+ [changed]
+ gtags, global, gozilla
+ - rewritten with C.
+ global - adopted POSIX regular expression (extension) instead of
+ perl's one.
+ htags - shape up anchor database.
+ btreeop - some options (-b, -c, -l, -p) were deleted.
+
+version 2.21 bugfix and slightly modified [11-Dec-97]
+
+ [fixed bug]
+ gtags, global
+ - doesn't skip RCS, SCCS, y.tab.c, y.tab.h.
+ global - generates illegal path name when using GTAGSLIBPATH
+ with -a option.
+ [changed]
+ lib/Makefile.generic
+ - MANDIR = /usr/share/man -> MANDIR = /usr/man
+ - replace `lorder $(OBJS) | tsort -q` to already sorted list.
+ for S.u.S.E Linux 5.1.
+
+ Thanks to Christoph Conrad for his information.
+
+ gtags, lib/test.c
+ - some change for Solaris environment.
+
+ Thanks to Yamashita TAKAO for his information.
+
+ htags/Makefile, systags/Makefile
+ - ${DESTDIR}/usr/bin -> ${DESTDIR}${BINDIR}
diff --git a/contrib/global/INSTALL b/contrib/global/INSTALL
index 11b916c..98bd20c 100644
--- a/contrib/global/INSTALL
+++ b/contrib/global/INSTALL
@@ -1,7 +1,7 @@
-Installation of GLOBAL 2.0
+Installation of GLOBAL 2.21
- 3-Jul-1997 Shigio Yamaguchi
+ 11-Dec-1997 Shigio Yamaguchi
---------------------------------------------------------------------------
Guide line (C style)
---------------------------------------------------------------------------
@@ -25,16 +25,17 @@ if (Your system == FreeBSD) {
Use 1.79 nvi available on the Internet.
break;
case 2.2.2R:
+ case 2.2.5R:
Your system inlucdes GLOBAL 1.9. You can overwrite it
- with this 2.0 package.
+ with this 2.2 package.
But skip procedure "3. Extended vi (OPTIONAL)", because
your /usr/bin/nvi is already extended nvi for GLOBAL.
break;
default:
- I don't know. But it semms to be little problem.
+ I don't know. But it seems to be little problem.
}
} else {
- You may some error message to make GLOBAL.
+ You may some error messages to make GLOBAL.
But it seems not so difficult to clear it. If you make a patch for it,
please let me know. I would like to include your patch into new
version of GLOBAL.
@@ -48,8 +49,8 @@ Install procedure
0. Extracting
- % tar xzvf global-2.0.tar.gz
- % cd global-2.0
+ % tar xzvf global-2.21.tar.gz
+ % cd global-2.21
1. Preparation for generic UNIX
@@ -77,10 +78,26 @@ Install procedure
ftp://ftp.cis.ufl.edu/pub/perl/CPAN/src/5.0/latest.tar.gz
- If you install perl into other than /usr/bin, please rewrite the header
- of following commnads.
+ d) Rewrite some files
+
+ If you install GLOBAL into other than /usr/bin, you need rewrite
+ hard coded path in a program. You can find the place by this command.
+
+ % grep '/usr/bin/global' */*.pl
+
+ If you install perl to other than /usr/bin, please rewrite hard coded
+ path in some programs. You can find the places by this command.
- gtags/gtags.pl global/global.pl htags/htags.pl
+ % grep '/usr/bin/perl' */*.pl
+
+ e) POSIX regular expression (extension) library
+
+ If you don't have it, you can use GNU's regex library.
+
+ f) Some UNIX tools
+
+ Find(1), sed(1), sort(1) are needed.
+ If your environment is UNIX, you have them.
2. GLOBAL basic (NEEDED)
@@ -89,8 +106,9 @@ Install procedure
3. Extended vi (OPTIONAL)
- GLOBAL supports two version of nvi. There is a little defference between
- them when a number of functions located. (please see 'README' file.)
+ GLOBAL supports two version of nvi.
+ There is a little defference in behavior between them when a number of
+ functions located. (please see 'README'.)
Version 1.34 nvi is included by FreeBSD 2.0.5R, 2.1.0R and 2.1.5R.
Version 1.79 nvi is available on
@@ -132,17 +150,27 @@ Install procedure
You can get it from
Emacs 19.34b:
- prep.ai.mit.edu/pub/gnu/emacs-19.34b.tar.gz
+ ftp://prep.ai.mit.edu/pub/gnu/emacs-19.34b.tar.gz
Mule 2.3:
ftp://ftp.cs.buffalo.edu/pub/mule/mule-2.3.tar.gz
- If you are a FreeBSD user, install it from package.
+ If you are a FreeBSD user, install it from 'package' (see pkg_add(1)).
- If you have installed it, to use extended emacs, copy gtags.el
- in this package to the emacs lisp library directory or place the file
- in a directory (for example "~/lisp") and write $HOME/.emacs like this.
+ If you have installed it then copy gtags.el in this package to the emacs
+ lisp library directory or place the file in a directory
+ (for example "~/lisp") and write $HOME/.emacs like this.
+-----------------------------------------------
|(setq load-path (cons "~/lisp" load-path))
+5. Gozilla (OPTIONAL)
+
+ You need X(1) to install gozilla.
+
+ % cd gozilla
+ % xmkmf
+ % make
+ # make install
+ # make install.man
+
Good luck!
diff --git a/contrib/global/MANIFEST b/contrib/global/MANIFEST
index 70304df..82354c9 100644
--- a/contrib/global/MANIFEST
+++ b/contrib/global/MANIFEST
@@ -4,15 +4,16 @@ MANIFEST This file.
Makefile Makefile for BSD.
Makefile.inc A part of Makefile for BSD.
Makefile.generic Makefile for generic UNIX(including BSD).
+PROBLEMS Problem report.
README Readme (introduction and usage).
VERSION Version number.
btreeop/ Btreeop command directory.
-gctags/ Gctags command directory (extended ctags).
global/ Global command directory.
+gozilla/ Gozilla command directory.
gtags/ Gtags command directory.
htags/ Htags command directory.
-include/ include files for non BSD system.
systags/ Script for kernel.
-gtags.el Gtags mode for Emacs
+lib/ library.
+gtags.el Gtags mode for Emacs.
nvi-1.34.diff Patch for nvi 1.34.
nvi-1.79.diff Patch for nvi 1.79.
diff --git a/contrib/global/Makefile b/contrib/global/Makefile
index 2eb181e..88b68e0 100644
--- a/contrib/global/Makefile
+++ b/contrib/global/Makefile
@@ -1,3 +1,3 @@
-SUBDIR= gctags global gtags btreeop htags systags
+SUBDIR= lib global gtags gctags btreeop htags systags
.include <bsd.subdir.mk>
diff --git a/contrib/global/Makefile.generic b/contrib/global/Makefile.generic
index a6a4a34..2f947bc 100644
--- a/contrib/global/Makefile.generic
+++ b/contrib/global/Makefile.generic
@@ -1,29 +1,22 @@
-# @(#)Makefile 1-Mar-97
-
-SUBDIR= gctags global gtags btreeop htags systags
+SUBDIR= lib global gtags gctags btreeop htags systags
BINDIR= /usr/bin # EDIT THIS
-MANDIR= /usr/share/man # EDIT THIS
-
-# For FreeBSD contrib
-CONTRIBDIR= /tmp/global
-RMFILES=INSTALL Makefile.generic nvi-1.34.diff nvi-1.79.diff \
- */Makefile.generic */err.c include
+MANDIR= /usr/man # EDIT THIS
all:
@for d in $(SUBDIR); do \
- set -e; (cd $$d; echo '===>' $$d; make $(MFLAGS)) \
+ set -e; (cd $$d; echo '===>' $$d; make $(MFLAGS)) ;\
done
install:
@for d in $(SUBDIR); do \
- set -e; (cd $$d; echo '===>' $$d; make $(MFLAGS) BINDIR=$(BINDIR) MANDIR=$(MANDIR) install) \
+ set -e; (cd $$d; echo '===>' $$d; make $(MFLAGS) BINDIR=$(BINDIR) MANDIR=$(MANDIR) install) ;\
done
gen:
@if [ ! -f Makefile.generic ]; then \
echo "Error: generic makefile not found."; exit 1; \
fi
- mv Makefile Makefile.bsd; mv Makefile.generic Makefile
+ mv Makefile Makefile.bsd && mv Makefile.generic Makefile
for d in $(SUBDIR); do \
- (cd $$d; mv Makefile Makefile.bsd; mv Makefile.generic Makefile) \
+ (cd $$d && mv Makefile Makefile.bsd && mv Makefile.generic Makefile) ;\
done
bsd:
@if [ ! -f Makefile.bsd ]; then \
@@ -31,13 +24,10 @@ bsd:
fi
mv Makefile Makefile.generic; mv Makefile.bsd Makefile
for d in $(SUBDIR); do \
- (cd $$d; mv Makefile Makefile.generic; mv Makefile.bsd Makefile) \
+ (cd $$d && mv Makefile Makefile.generic && mv Makefile.bsd Makefile) ;\
done
-bsdcontrib: clean
- rm -rf $(CONTRIBDIR)
- mkdir $(CONTRIBDIR) && cp -r . $(CONTRIBDIR)
- cd $(CONTRIBDIR) && rm -rf $(RMFILES)
clean:
@for d in $(SUBDIR); do \
- (cd $$d; echo '===>' $$d; make $(MFLAGS) clean) \
+ (cd $$d; echo '===>' $$d; make $(MFLAGS) clean) ;\
done
+
diff --git a/contrib/global/Makefile.inc b/contrib/global/Makefile.inc
index c24c4b1..befa954 100644
--- a/contrib/global/Makefile.inc
+++ b/contrib/global/Makefile.inc
@@ -1 +1,7 @@
BINDIR?= /usr/bin
+MANDIR?= /usr/share/man/man
+.if exists(${.OBJDIR}/../lib)
+LIBUTIL=${.OBJDIR}/../lib/libutil.a
+.else
+LIBUTIL=${.CURDIR}/../lib/libutil.a
+.endif
diff --git a/contrib/global/PROBLEMS b/contrib/global/PROBLEMS
new file mode 100644
index 0000000..e30e7e0
--- /dev/null
+++ b/contrib/global/PROBLEMS
@@ -0,0 +1,38 @@
+GLOBAL cannot recognize following macros and functions.
+
+1. Macro which doesn't end with ';'.
+
+ GLOBAL cannot recognize func() after M(a), because M(a) seems to be
+ function definition.
+
+ #define M(a) static char *string = a;
+
+ M(a)
+
+ func() {
+ ...
+ }
+
+ It should be follows.
+
+ #define M(a) static char *string = a
+
+ M(a);
+
+ func() {
+ ...
+ }
+
+2. Macro which is a renamed function.
+
+ #define func _func
+
+ _func() {
+ ...
+ }
+ main() {
+ func();
+ }
+
+ In fact, main() calls _func() instead of func() but GLOBAL cannot
+ recognize it.
diff --git a/contrib/global/README b/contrib/global/README
index bb1f9e7..f4699f2 100644
--- a/contrib/global/README
+++ b/contrib/global/README
@@ -3,19 +3,30 @@
@= @=
@= @=
@= @= @@@@@= @@@@@@= @@= @=
- @= F o r a l l h a c h e r s. version 2.0
+ @= F o r a l l h a c k e r s. version 2.21
@= @@@@@@=@= @= @= @@@@@= @= @= @=
@= @= @= @= @= @= @= @@@@@= @=
@= @= @= @= @= @= @=@= @= @=
@@@@@@@@= @@@@= @@@@@= @@@@@@=@@@= @@@@= @@@@@@=
- Shigio Yamaguchi 7-Jul-97
+ Shigio Yamaguchi 11-Dec-97
Copyright 1996, 1997 Shigio Yamaguchi All right resereved.
+ ----------------------------------------------------------
+ Note:
+ This version of GLOBAL makes 'GSYMS' tag file for
+ searching symbols other than functions.
+ (Try global(1) with -s option.)
+ But the tag file is very large. If you hope not to
+ make the file, please use gtags with -o (old) option.
+ Htags(1) doesn't use 'GSYMS'.
+ ----------------------------------------------------------
+
GLOBAL is a browsing system for C and Yacc source code.
It brings benefits to all hackers. Enjoy!
+
Contents
--------------------------------
0. Introduction
@@ -40,6 +51,7 @@ It brings benefits to all hackers. Enjoy!
3.2. Preparation
3.3. Usage
3.4. To make hypertext of kernel
+ 3.5. Gozilla
4. Extended emacs using global
@@ -64,7 +76,7 @@ It supports following environments.
o emacs editor(see '4. Emacs using global')
GLOBAL is consist of global(1), gtags(1), btreeop(1), gctags(1), htags(1),
-extended vi(1) and gtags.el.
+extended vi(1), gtags.el and gozilla(1).
* 'extended' means being entended for GLOBAL.
@@ -85,7 +97,7 @@ All the functions for GLOBAL are enabled only in 'gtagsmode'.
o Global allows duplicate entries.
o Global can treat a source tree containing subdirectories and you can
get relative path of objects from anywhere within the tree.
- o Global can understand perl's regular expression.
+ o Global can understand POSIX 1003.2 regular expression (extension).
o Global can search in not only a source tree but also library paths.
o Global can treat yacc source file.
@@ -109,9 +121,6 @@ All the functions for GLOBAL are enabled only in 'gtagsmode'.
GTAGS - database for function definition
GRTAGS - database for function reference
- If you cannot find functions that should exist, please try -e option.
-
- % gtags -e
1.3. Basic usage
@@ -162,7 +171,7 @@ All the functions for GLOBAL are enabled only in 'gtagsmode'.
% global -r func2
../DIR1/fileA.c <- func2() is referred from fileA.c
- You can use perl's regular expression.
+ You can use POSIX regular expression (extension).
% cd ROOT
% global 'func[1-3]'
@@ -182,6 +191,11 @@ All the functions for GLOBAL are enabled only in 'gtagsmode'.
% global -a func1
/home/user/ROOT/DIR1/fileB.c
+ -s option locates any symbols other than function.
+
+ % global -xs X
+ X 1 DIR2/fileC.c #ifdef X
+
You can edit files including specified function directly like this.
% vi `global func1` <- edit fileB.c
@@ -319,8 +333,8 @@ All the functions for GLOBAL are enabled only in 'gtagsmode'.
o Tag function of extended vi can locate not only function definitions
but also function references.
o Extended vi allows duplicate tag entries.
- o Extended vi can understand perl's regular expression as a tag name
- for search.
+ o Extended vi can understand POSIX regular expression (extension)
+ as a tag name for search.
o Extended vi is completely upper compatible with original one.
Above functions are available only in 'gtags mode'.
@@ -488,15 +502,20 @@ All the functions for GLOBAL are enabled only in 'gtagsmode'.
disk space. For example, the source code of FreeBSD kernel needs the
following disk space.
- source code(/usr/src/sys) 14MB
- tag database(GTAGS,GRTAGS) 9MB(!)
- hypertext(HTML/*) 45MB(!!!)
+ source code(/usr/src/sys) 14.0MB
+
+ GTAGS 1.5MB
+ GRTAGS 8.0MB
+ GSYMS 12.0MB
+ HTML/ 55MB(!!!)
+ -------------------------------------------------
+ total 77MB
Please do the followings.
(at your source directory)
- % gtags <- make tag database
- % htags <- make hypertext
+ % gtags <- make tag database(GTAGS,GRTAGS,GSYMS)
+ % htags <- make hypertext(HTML/)
Then you will find 'HTML' directory in the current directory.
@@ -535,6 +554,41 @@ All the functions for GLOBAL are enabled only in 'gtagsmode'.
Of course, you can use above functions without systags.
Please see gtags(1), htags(1).
+3.5. Gozilla
+
+ If you use Netscape Navigator, you can control the browser from command
+ line by gozilla(1).
+
+ % gtags
+ % htags
+ % global -x fork
+ fork 60 kern/kern_fork.c fork(p, uap, retval)
+ % gozilla +60 kern/kern_fork.c
+ %
+
+ Then you can see the hypertext about fork function directly on Netscape
+ Navigator. If the browser has not been loaded, gozilla loads it.
+
+ If you use another browser like lynx, try this.
+
+ % gozilla -b lynx +60 kern/kern_fork.c
+
+ or
+
+ % setenv BROWSER lynx
+ % gozilla +60 kern/kern_fork.c
+
+ You can send remote command to Netscape Navigator too. Try this.
+
+ % gozilla -C pagedown
+ % gozilla -C pageup
+
+ The remote commands are undocumented, but you can see the hint in the
+ resource file. (Netscape.ad file)
+
+ NOTES:
+ Netscape Navigator is a registered trademark of Netscape Communications
+ Corporation in the United States and other countries.
4. Extended emacs using global
@@ -646,9 +700,18 @@ All the functions for GLOBAL are enabled only in 'gtagsmode'.
":rtag <current token>[RETURN]", otherwise ":tag <current token>[RETURN]".
(GLOBAL decides this intelligentlly, but may sometimes misunderstand.)
+ o To go to any symbols other than function, try 'ESC-s'.
+
+ Find symbol: lbolt
+ ~~~~~
+ o To go to any strings other than symbol, try 'ESC-g'.
+
+ Find pattern: Copyright
+ ~~~~~~~~~
+
4.4. Applied usage
- o You can use perl's regular expression.
+ o You can use POSIX regular expression (extension).
:tag ^put_ # locate tags start with 'put_'.
diff --git a/contrib/global/VERSION b/contrib/global/VERSION
index cd5ac03..2ef40bd 100644
--- a/contrib/global/VERSION
+++ b/contrib/global/VERSION
@@ -1 +1 @@
-2.0
+2.21
diff --git a/contrib/global/btreeop/Makefile b/contrib/global/btreeop/Makefile
index c9e0409..13ed84a 100644
--- a/contrib/global/btreeop/Makefile
+++ b/contrib/global/btreeop/Makefile
@@ -1,5 +1,6 @@
-# @(#)Makefile 1.0 (Berkeley) 4/21/96
-
PROG= btreeop
+CFLAGS+=-I${.CURDIR}/../lib
+LDADD= $(LIBUTIL)
+DPADD= $(LIBUTIL)
.include <bsd.prog.mk>
diff --git a/contrib/global/btreeop/Makefile.generic b/contrib/global/btreeop/Makefile.generic
index 52dcc0e..b30213f 100644
--- a/contrib/global/btreeop/Makefile.generic
+++ b/contrib/global/btreeop/Makefile.generic
@@ -1,17 +1,15 @@
-# @(#)Makefile 29-Dec-96
-
PROG = btreeop
CC = gcc
-#WARN = -Wall -Wparentheses -Wstrict-prototypes -Wmissing-prototypes
-LIBS = -ldb
-CFLAGS = -O -I../include
-OBJS = btreeop.o err.o
+LIBS = -L../lib -lutil -ldb
+CFLAGS = -O -I../lib -I/usr/include/db
+DEPLIBS= ../lib/libutil.a
+OBJS = btreeop.o
BINDIR = /usr/bin
-MANDIR = /usr/share/man
+MANDIR = /usr/man
all: $(PROG)
-$(PROG): $(OBJS)
+$(PROG): $(OBJS) $(DEPLIBS)
$(CC) -o $(PROG) $(OBJS) $(LIBS)
install:
cp $(PROG) $(BINDIR)
@@ -19,4 +17,4 @@ install:
cp $(PROG).1 $(MANDIR)/man1
chmod 644 $(MANDIR)/man1/$(PROG).1
clean:
- rm -f $(PROG) $(OBJS) GTAGS GRTAGS
+ rm -f $(PROG) $(OBJS)
diff --git a/contrib/global/btreeop/btreeop.1 b/contrib/global/btreeop/btreeop.1
index 8d42abc..0b2111f 100644
--- a/contrib/global/btreeop/btreeop.1
+++ b/contrib/global/btreeop/btreeop.1
@@ -28,7 +28,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd July 4, 1997
+.Dd Nov 26, 1997
.Dt BTREEOP 1
.Os BSD 4
.Sh NAME
@@ -38,13 +38,10 @@
.Nm btreeop
.Op Fl A
.Op Fl C
-.Op Fl D Ar key
-.Op Fl K Ar key
+.Op Fl D[keyno] Ar key
+.Op Fl K[keyno] Ar key
.Op Fl L
-.Op Fl b
-.Op Fl c Ar cashesize
-.Op Fl l
-.Op Fl p Ar psize
+.Op Fl k Ar prefix
.Op Ar dbname
.Sh DESCRIPTION
.Nm Btreeop
@@ -52,9 +49,11 @@ execute simple operations for
.Xr btree 3
database.
.Nm Btreeop
-can create database, write record, read record (sequential or index) and
+can create database, write record, read record (sequential or indexed) and
delete record from it.
Duplicate entries are allowed.
+Multi-key is available but only primary key can use index of
+.Xr btree 3 .
.Sh OPTIONS
A capital letter means a command. If no command specified
then it assume sequential read operation.
@@ -63,26 +62,25 @@ then it assume sequential read operation.
append records. If database doesn't exist, btreeop creates it.
.It Fl C
create database and write records to it.
-.It Fl D Ar key
-delete records by the key.
-.It Fl K Ar key
-search records by the key.
+.It Fl D[keyno] Ar key
+delete records by the key. By default, keyno is 0 (primary key).
+.It Fl K[keyno] Ar key
+search records by the key. By default, keyno is 0 (primary key).
.It Fl L
-list all keys. It is identical to following command line.
-
- btreeop | awk '{print $1}' | sort | uniq
-.It Fl b
-assume BIG_ENDIAN byte order. default is LITTLE_ENDIAN.
-.It Fl c Ar cashesize
-specify cashesize. It's identical to
-.Nm info.cachesize
-of BTREEINFO. (see btree(3))
-.It Fl l
-assume LITTLE_ENDIAN byte order. (the default)
-.It Fl p Ar psize
-specify page size. It's identical to
-.Nm info.psize
-of BTREEINFO. (see btree(3))
+list all primary keys.
+Following two command lines are identical except that the latter is much faster.
+
+ btreeop | awk '{print $1}' | uniq
+
+ btreeop -L
+.It Fl k Ar prefix
+scan records which have the prefix as a primary key.
+This option is valid only with sequential read operation (-L command or non command).
+Following two command lines are identical except that the latter is much faster.
+
+ btreeop | awk '$1 ~ /^fo/ {print }'
+
+ btreeop -k fo
.It Ar dbname
database name. default is 'btree'.
.Sh DATA FORMAT
@@ -91,8 +89,11 @@ To creat (or append) database,
read data from stdin.
The format of the data is the following.
- Key Data\\n
- Key Data\\n
+ Primary-key Secondary-key-1 Secondary-key-2 Data
+ (keyno = 0) (keyno = 1) (keyno = 2)
+ --------------------------------------------------------------
+ main 246 main.c main (){\\n
+ func 120 library.c func(a1, a2)\\n
.
.
.
@@ -101,16 +102,16 @@ The format of the data is the following.
.Bl -enum -offset indent
.It
-Key and Data are separated by blank('\\t' or ' ').
+All key and data are separated by blank('\\t' or ' ').
.It
Key cannot include blank.
.It
Data can include blank.
.It
-Null Data not allowed.
+Null data not allowed.
.It
Additionally, META record is available. META record has a key that start with
-a blank. You can read this record only by indexed search (with -K option).
+a blank. You can read this record only by indexed read operation (-K option).
Usage is unlimited by btreeop.
.El
.Sh EXAMPLES
@@ -149,7 +150,7 @@ Indexed read.
__.VERSION 2
%
-List kyes.
+List primary keys.
% btreeop -L
key1
@@ -170,7 +171,7 @@ default database name.
.El
.Sh DIAGNOSTICS
.Nm Btreeop
-exits with a value of 1 if an error occurred, 0 otherwise.
+exits with a non 0 value if an error occurred, 0 otherwise.
.Sh SEE ALSO
.Xr btree 3
.Sh AUTHOR
@@ -178,4 +179,4 @@ Shigio Yamaguchi (shigio@wafu.netgate.net)
.Sh HISTORY
The
.Nm
-command appeared in FreeBSD 2.2.
+command appeared in FreeBSD 2.2.2.
diff --git a/contrib/global/gctags/C.c b/contrib/global/gctags/C.c
index 87652b5..df8fd2f 100644
--- a/contrib/global/gctags/C.c
+++ b/contrib/global/gctags/C.c
@@ -46,7 +46,7 @@ static int func_entry __P((void));
static void hash_entry __P((void));
static void skip_string __P((int));
static int str_entry __P((int));
-#ifdef GTAGS
+#ifdef GLOBAL
static int cmp __P((const void *, const void *));
static int isstatement __P((char *));
static void define_line __P((void));
@@ -116,7 +116,7 @@ c_entries()
*/
if (--level < 0)
level = 0;
-#ifdef GTAGS
+#ifdef GLOBAL
/*
* -e flag force a function to end when a '}' appear
* at column 0. If -e flag not specified, all functions
@@ -192,7 +192,7 @@ c_entries()
/*
* if we have a current token, parenthesis on
* level zero indicates a function.
-#ifdef GTAGS
+#ifdef GLOBAL
* in the case of rflag == 1, if we have a current token,
* parenthesis on level > zero indicates a function reference.
#endif
@@ -201,10 +201,14 @@ c_entries()
#endif
*/
case '(':
+#ifdef GLOBAL
+ if (sflag)
+ break;
+#endif
#ifdef YACC
if (inyacc == NO)
#endif
-#ifdef GTAGS
+#ifdef GLOBAL
if (!rflag && !level && token)
#else
if (!level && token)
@@ -222,7 +226,7 @@ c_entries()
*/
getline();
curline = lineno;
-#ifdef GTAGS
+#ifdef GLOBAL
/* to make sure. */
if (!isstatement(tok))
#endif
@@ -232,13 +236,14 @@ c_entries()
}
break;
}
-#ifdef GTAGS
+#ifdef GLOBAL
else if (rflag && level && token) {
if (sp != tok)
*sp = EOS;
- getline();
- if (!isstatement(tok) && isdefined(tok))
+ if (!isstatement(tok) && lookup(tok)) {
+ getline();
pfnote(tok, lineno);
+ }
break;
}
#endif
@@ -305,13 +310,7 @@ c_entries()
* reserved words.
*/
default:
-#ifdef BUGFIX
- /*
- * to treat following function.
- * func (arg) {
- * ....
- * }
- */
+ /* ignore whitespace */
if (c == ' ' || c == '\t') {
int save = c;
while (GETC(!=, EOF) && (c == ' ' || c == '\t'))
@@ -321,12 +320,39 @@ c_entries()
(void)ungetc(c, inf);
c = save;
}
-#endif
storec: if (!intoken(c)) {
if (sp == tok)
break;
*sp = EOS;
-#ifdef GTAGS
+#ifdef GLOBAL
+ /* ignore assembler in C source */
+ if (!memcmp(tok, "_asm",4)) {
+ while (GETC(!=, EOF) && (c == ' ' || c == '\t'))
+ ;
+ if (c == EOF)
+ return;
+ if (c == '{') {
+ while (GETC(!=, EOF) && c != '}') {
+ if (c == '\n')
+ SETLINE;
+ }
+ } else {
+ while (GETC(!=, EOF) && c != '\n')
+ ;
+ if (c == '\n')
+ SETLINE;
+ }
+ if (c == EOF)
+ return;
+ break;
+ }
+ if (sflag) {
+ if (!isstatement(tok)) {
+ getline();
+ pfnote(tok, lineno);
+ }
+ break;
+ }
if (!memcmp(tok, "extern",7)) {
while (GETC(!=, EOF) && c != ';') {
if (c == '\n')
@@ -367,6 +393,18 @@ c_entries()
*sp++ = c;
token = YES;
}
+#ifdef GLOBAL
+ /* skip hex number */
+ else if (sp == tok && c == '0') {
+ if (GETC(==, 'x') || c == 'X') {
+ while (GETC(!=, EOF) && isxdigit(c))
+ ;
+ if (c == EOF)
+ return;
+ }
+ (void)ungetc(c, inf);
+ }
+#endif
continue;
/* end of default */
} /* end of switch */
@@ -454,15 +492,10 @@ hash_entry()
char *sp; /* buffer pointer */
char tok[MAXTOKEN]; /* storage buffer */
-#ifdef BUGFIX
- /*
- * to treat following macro.
- * # macro(arg) ....
- */
+ /* ignore leading whitespace */
while (GETC(!=, EOF) && (c == ' ' || c == '\t'))
;
(void)ungetc(c, inf);
-#endif
curline = lineno;
for (sp = tok;;) { /* get next token */
if (GETC(==, EOF))
@@ -472,8 +505,16 @@ hash_entry()
*sp++ = c;
}
*sp = EOS;
+#ifdef GLOBAL
+ if (sflag && memcmp(tok, "include", 7)) {
+ (void)ungetc(c, inf);
+ define_line();
+ return;
+ }
+#endif
if (memcmp(tok, "define", 6)) /* only interested in #define's */
goto skip;
+
for (;;) { /* this doesn't handle "#define \n" */
if (GETC(==, EOF))
return;
@@ -492,12 +533,12 @@ hash_entry()
break;
}
*sp = EOS;
-#ifdef GTAGS
+#ifdef GLOBAL
if (rflag) {
/*
* #define XXX\n
*/
- if (c == '\n' || (c == '\r' && GETC(==, '\n'))) {
+ if (c == '\n') {
SETLINE;
return;
}
@@ -531,19 +572,13 @@ hash_entry()
}
skip: if (c == '\n') { /* get rid of rest of define */
SETLINE
-#ifdef MODIFY
- if (*(sp - 1) == '\r') {
- if (*(sp - 2) != '\\')
- return;
- } else
-#endif
if (*(sp - 1) != '\\')
return;
}
(void)skip_key('\n');
}
-#ifdef GTAGS
+#ifdef GLOBAL
/* sorted by alphabet */
static struct words {
char *name;
@@ -619,12 +654,20 @@ define_line()
goto endtok;
case '\\':
- if (GETC(==, '\n') || (c == '\r' && GETC(==, '\n'))) {
+ if (GETC(==, '\n')) {
SETLINE;
}
continue;
case '\n':
+ if (sflag && token) {
+ if (sp != tok)
+ *sp = EOS;
+ if (!isstatement(tok)) {
+ getline();
+ pfnote(tok, lineno);
+ }
+ }
SETLINE;
return;
endtok: if (sp > tok) {
@@ -651,11 +694,13 @@ define_line()
goto storec;
case '(':
+ if (sflag)
+ break;
if (token) {
if (sp != tok)
*sp = EOS;
getline();
- if (!isstatement(tok) && isdefined(tok))
+ if (!isstatement(tok) && lookup(tok))
pfnote(tok, lineno);
break;
}
@@ -670,6 +715,13 @@ storec: if (!intoken(c)) {
break;
*sp = EOS;
sp = tok;
+ if (sflag) {
+ if (!isstatement(tok)) {
+ getline();
+ pfnote(tok, lineno);
+ }
+ break;
+ }
}
else if (sp != tok || begtoken(c)) {
*sp++ = c;
@@ -774,10 +826,6 @@ skip_string(key)
case '\\': /* a backslash escapes anything */
skip = !skip; /* we toggle in case it's "\\" */
break;
-#ifdef MODIFY
- case '\r':
- break;
-#endif
case '\n':
SETLINE;
/*FALLTHROUGH*/
@@ -823,10 +871,6 @@ skip_key(key)
(void)ungetc(c, inf);
c = '/';
goto norm;
-#ifdef MODIFY
- case '\r':
- break;
-#endif
case '\n':
SETLINE;
/*FALLTHROUGH*/
diff --git a/contrib/global/gctags/Makefile b/contrib/global/gctags/Makefile
index 2e3401f..e60217f 100644
--- a/contrib/global/gctags/Makefile
+++ b/contrib/global/gctags/Makefile
@@ -1,7 +1,7 @@
-# @(#)Makefile 8.1 (Berkeley) 6/6/93
-
PROG= gctags
-CFLAGS+=-I${.CURDIR} -DGTAGS -DBUGFIX -DMODIFY -DYACC
+CFLAGS+=-I${.CURDIR} -I${.CURDIR}/../lib -DGLOBAL -DYACC
+LDADD= $(LIBUTIL)
+DPADD= $(LIBUTIL)
SRCS= C.c ctags.c fortran.c lisp.c print.c tree.c yacc.c assembler.c
.include <bsd.prog.mk>
diff --git a/contrib/global/gctags/Makefile.generic b/contrib/global/gctags/Makefile.generic
index 59c2172..6505c67 100644
--- a/contrib/global/gctags/Makefile.generic
+++ b/contrib/global/gctags/Makefile.generic
@@ -1,14 +1,11 @@
-# @(#)Makefile 29-Dec-96
-
PROG = gctags
-DEFS = -DGTAGS -DBUGFIX -DMODIFY -DYACC
+DEFS = -DGLOBAL -DYACC
CC = gcc
-#WARN = -Wall -Wparentheses -Wstrict-prototypes -Wmissing-prototypes
-CFLAGS = -O $(DEFS) -I../include
-LIBS = -ldb
-OBJS = C.o ctags.o fortran.o lisp.o print.o tree.o yacc.o assembler.o err.o
+CFLAGS = -O $(DEFS) -I../lib -I/usr/include/db
+LIBS = -L../lib -lutil -ldb
+OBJS = C.o assembler.o ctags.o fortran.o lisp.o print.o tree.o yacc.o
BINDIR = /usr/bin
-MANDIR = /usr/share/man
+MANDIR = /usr/man
all: $(PROG)
@@ -20,4 +17,4 @@ install:
cp $(PROG).1 $(MANDIR)/man1
chmod 644 $(MANDIR)/man1/$(PROG).1
clean:
- rm -f $(PROG) $(OBJS) GTAGS GRTAGS
+ rm -f $(PROG) $(OBJS)
diff --git a/contrib/global/gctags/assembler.c b/contrib/global/gctags/assembler.c
index 2ae468d..2cd2d07 100644
--- a/contrib/global/gctags/assembler.c
+++ b/contrib/global/gctags/assembler.c
@@ -39,7 +39,7 @@ static char sccsid[] = "@(#)assembler.c 8.3 (Berkeley) 6/6/97";
#include <string.h>
#include "ctags.h"
-#ifdef GTAGS
+#ifdef GLOBAL
void
asm_entries()
{
diff --git a/contrib/global/gctags/ctags.c b/contrib/global/gctags/ctags.c
index 5924cca..0253ab5 100644
--- a/contrib/global/gctags/ctags.c
+++ b/contrib/global/gctags/ctags.c
@@ -42,7 +42,6 @@ static const char rcsid[] =
"$Id: ctags.c,v 1.3 1997/07/10 06:43:40 charnier Exp $";
#endif /* LIBC_SCCS and not lint */
-#include <err.h>
#include <limits.h>
#include <stdio.h>
#include <string.h>
@@ -50,6 +49,10 @@ static const char rcsid[] =
#include <unistd.h>
#include "ctags.h"
+#ifdef GLOBAL
+#include "lookup.h"
+#include "die.h"
+#endif
/*
* ctags: create a tags file
@@ -66,17 +69,21 @@ FILE *outf; /* ioptr for tags file */
long lineftell; /* ftell after getc( inf ) == '\n' */
int lineno; /* line number of current line */
+#ifdef GLOBAL
+int cflag; /* -c: compact index */
+#endif
int dflag; /* -d: non-macro defines */
-#ifdef GTAGS
+#ifdef GLOBAL
int eflag; /* -e: '{' at 0 column force function end */
#endif
int tflag; /* -t: create tags for typedefs */
int vflag; /* -v: vgrind style index output */
int wflag; /* -w: suppress warnings */
int xflag; /* -x: cxref style output */
-#ifdef GTAGS
+#ifdef GLOBAL
int Dflag; /* -D: allow duplicate entrys */
int rflag; /* -r: function reference */
+int sflag; /* -s: collect symbols */
#endif
#ifdef YACC
int yaccfile; /* yacc file */
@@ -85,6 +92,7 @@ int yaccfile; /* yacc file */
char *curfile; /* current input file name */
char searchar = '/'; /* use /.../ searches by default */
char lbuf[LINE_MAX];
+char *progname = "gctags"; /* program name */
void init __P((void));
void find_entries __P((char *));
@@ -107,8 +115,8 @@ main(argc, argv)
extern int optind;
aflag = uflag = NO;
-#ifdef GTAGS
- while ((ch = getopt(argc, argv, "BDFadef:rtuwvxy")) != -1)
+#ifdef GLOBAL
+ while ((ch = getopt(argc, argv, "BDFacdef:rstuwvx")) != -1)
#else
while ((ch = getopt(argc, argv, "BFadf:tuwvx")) != -1)
#endif
@@ -116,7 +124,7 @@ main(argc, argv)
case 'B':
searchar = '?';
break;
-#ifdef GTAGS
+#ifdef GLOBAL
case 'D':
Dflag++;
break;
@@ -124,13 +132,23 @@ main(argc, argv)
case 'F':
searchar = '/';
break;
+#ifdef GLOBAL
+ case 's':
+ sflag++;
+ break;
+#endif
case 'a':
aflag++;
break;
+#ifdef GLOBAL
+ case 'c':
+ cflag++;
+ break;
+#endif
case 'd':
dflag++;
break;
-#ifdef GTAGS
+#ifdef GLOBAL
case 'e':
eflag++;
break;
@@ -138,7 +156,7 @@ main(argc, argv)
case 'f':
outfile = optarg;
break;
-#ifdef GTAGS
+#ifdef GLOBAL
case 'r':
rflag++;
break;
@@ -165,15 +183,22 @@ main(argc, argv)
argc -= optind;
if (!argc)
usage();
-#ifdef GTAGS
- if (rflag)
- gtagopen();
+#ifdef GLOBAL
+ if (sflag && rflag)
+ die("-s and -r conflict.");
+ if (rflag) {
+ char *dbpath;
+
+ if (!(dbpath = getenv("GTAGSDBPATH")))
+ dbpath = ".";
+ lookupopen(dbpath);
+ }
#endif
init();
for (exit_val = step = 0; step < argc; ++step)
if (!(inf = fopen(argv[step], "r"))) {
- warnx("%s cannot open", argv[step]);
+ fprintf(stderr, "%s: %s cannot open\n", progname, argv[step]);
exit_val = 1;
}
else {
@@ -183,9 +208,13 @@ main(argc, argv)
}
if (head)
- if (xflag)
+ if (xflag) {
put_entries(head);
- else {
+#ifdef GLOBAL
+ if (cflag)
+ compact_print("", 0, "");/* flush last record */
+#endif
+ } else {
if (uflag) {
for (step = 0; step < argc; step++) {
(void)sprintf(cmd,
@@ -197,7 +226,7 @@ main(argc, argv)
++aflag;
}
if (!(outf = fopen(outfile, aflag ? "a" : "w"))) {
- warnx("%s cannot open", outfile);
+ fprintf(stderr, "%s: %s cannot open\n", progname, outfile);
exit(exit_val);
}
put_entries(head);
@@ -208,9 +237,9 @@ main(argc, argv)
system(cmd);
}
}
-#ifdef GTAGS
+#ifdef GLOBAL
if (rflag)
- gtagclose();
+ lookupclose();
#endif
exit(exit_val);
}
@@ -219,10 +248,10 @@ static void
usage()
{
(void)fprintf(stderr,
-#ifdef GTAGS
- "usage: gctags [-BDFadrtuwvx] [-f tagsfile] file ...\n");
+#ifdef GLOBAL
+ "usage: gctags [-BDFacderstuvwx] [-f tagsfile] file ...\n");
#else
- "usage: gctags [-BFadtuwvx] [-f tagsfile] file ...\n");
+ "usage: ctags [-BFadtuwvx] [-f tagsfile] file ...\n");
#endif
exit(1);
}
@@ -280,7 +309,7 @@ find_entries(file)
if (cp[1] == 'l' && !cp[2]) {
int c;
-#ifdef GTAGS
+#ifdef GLOBAL
if (rflag)
fprintf(stderr, "-r option is ignored in lisp file (Warning only)\n");
#endif
@@ -327,14 +356,14 @@ find_entries(file)
pfnote("yyparse", lineno);
y_entries();
}
-#ifdef GTAGS
+#ifdef GLOBAL
/* assembler */ else if ((cp[1] == 's' || cp[1] == 'S') && !cp[2]) {
asm_entries();
return;
}
#endif
/* fortran */ else if ((cp[1] != 'c' && cp[1] != 'h') && !cp[2]) {
-#ifdef GTAGS
+#ifdef GLOBAL
if (rflag)
fprintf(stderr, "-r option is ignored in fortran file (Warning only)\n");
#endif
@@ -348,63 +377,3 @@ find_entries(file)
#endif
/* C */ c_entries();
}
-
-#ifdef GTAGS
-#include <db.h>
-DB *db;
-
-void
-gtagopen()
-{
- BTREEINFO info;
- char *env;
- char dbname[200];
-
- strcpy(dbname, ".");
- if ((env = getenv("GTAGDBPATH"))) {
- strcpy(dbname, env);
- }
- strcat(dbname, "/GTAGS");
-
- info.flags = 0;
- info.cachesize = 500000;
- info.maxkeypage = 0;
- info.minkeypage = 0;
- info.psize = 0;
- info.compare = 0;
- info.prefix = 0;
- info.lorder = 0;
-
-#define O_RDONLY 0x0000 /* open for reading only */
- db = dbopen(dbname, O_RDONLY, 0, DB_BTREE, &info);
- if (db == 0)
- errx(1, "GTAGS file needed");
-}
-int
-isdefined(skey)
-char *skey;
-{
- DBT dat, key;
- int status;
-
- key.data = skey;
- key.size = strlen(skey)+1;
-
- status = (*db->get)(db, &key, &dat, 0);
- switch (status) {
- case RET_SUCCESS:
- return(1); /* exist */
- case RET_ERROR:
- errx(1, "db->get failed");
- case RET_SPECIAL: /* not exist */
- break;
- }
- return 0;
-}
-void
-gtagclose()
-{
- if (db->close(db))
- errx(1, "GTAGS cannot close.(dbclose)");
-}
-#endif
diff --git a/contrib/global/gctags/ctags.h b/contrib/global/gctags/ctags.h
index b1bb287..7cd3733 100644
--- a/contrib/global/gctags/ctags.h
+++ b/contrib/global/gctags/ctags.h
@@ -47,7 +47,11 @@
#endif
#define SETLINE {++lineno;lineftell = ftell(inf);}
+#ifdef GLOBAL
+#define GETC(op,exp) ((((c = getc(inf)) == '\r') ? (c = getc(inf)) : c) op (int)exp)
+#else
#define GETC(op,exp) ((c = getc(inf)) op (int)exp)
+#endif
#define iswhite(arg) (_wht[(unsigned)arg]) /* T if char is white */
#define begtoken(arg) (_btk[(unsigned)arg]) /* T if char can start token */
@@ -71,11 +75,13 @@ extern FILE *inf; /* ioptr for current input file */
extern FILE *outf; /* ioptr for current output file */
extern long lineftell; /* ftell after getc( inf ) == '\n' */
extern int lineno; /* line number of current line */
-#ifdef GTAGS
+#ifdef GLOBAL
+extern int cflag; /* -c: compact index */
extern int eflag; /* -e: '{' at 0 column force function end */
extern int Dflag; /* -D: allow duplicate entrys */
extern int rflag; /* -r: function reference */
-#endif /* GTAGS */
+extern int sflag; /* -s: collect symbols */
+#endif
extern int dflag; /* -d: non-macro defines */
extern int tflag; /* -t: create tags for typedefs */
extern int vflag; /* -v: vgrind style index output */
@@ -85,6 +91,7 @@ extern bool _wht[], _etk[], _itk[], _btk[], _gd[];
extern char lbuf[LINE_MAX];
extern char *lbp;
extern char searchar; /* ex search character */
+extern char *progname; /* program name */
#ifndef __P
#ifdef __STDC__
@@ -105,9 +112,7 @@ void y_entries __P((void));
int PF_funcs __P((void));
void c_entries __P((void));
void skip_comment __P((void));
-#ifdef GTAGS
+#ifdef GLOBAL
void asm_entries __P((void));
-void gtagopen __P((void));
-int isdefined __P((char *));
-void gtagclose __P((void));
+int portable_getc __P((FILE *));
#endif
diff --git a/contrib/global/gctags/gctags.1 b/contrib/global/gctags/gctags.1
index 2d55d52..ed95875 100644
--- a/contrib/global/gctags/gctags.1
+++ b/contrib/global/gctags/gctags.1
@@ -39,7 +39,7 @@
.Nd create a tags file (special command for GLOBAL)
.Sh SYNOPSIS
.Nm gctags
-.Op Fl BDFadertuwvx
+.Op Fl BDFacderstuvwx
.Op Fl f Ar tagsfile
.Ar name ...
.Sh DESCRIPTION
@@ -77,6 +77,8 @@ use forward searching patterns
append to
.Ar tags
file.
+.It Fl c
+print with compact format. It is valid only with -x option.
.It Fl d
create tags for
.Li #defines
@@ -88,11 +90,13 @@ force a function to end when reach a '}' at the first column. (C source only)
.It Fl f
place the tag descriptions in a file called
.Ar tagsfile .
-The default behavior is to place them in a file called
+The default behaviour is to place them in a file called
.Ar tags .
.It Fl r
locate function references instead of function definitions. GTAGS file is
needed at the current directory. (C source only)
+.It Fl s
+collect symbols except for functions.
.It Fl t
create tags for typedefs, structs, unions, and enums.
.It Fl u
@@ -184,7 +188,7 @@ tags file for GLOBAL
.El
.Sh DIAGNOSTICS
.Nm Gctags
-exits with a value of 1 if an error occurred, 0 otherwise.
+exits with a non 0 value if an error occurred, 0 otherwise.
Duplicate objects are not considered errors.
.Sh SEE ALSO
.Xr btreeop 1 ,
@@ -234,4 +238,4 @@ kernel source.
.Sh HISTORY
The
.Nm
-command appeared in FreeBSD 2.2.
+command appeared in FreeBSD 2.2.2.
diff --git a/contrib/global/gctags/print.c b/contrib/global/gctags/print.c
index 692d36b..ff81a9b3 100644
--- a/contrib/global/gctags/print.c
+++ b/contrib/global/gctags/print.c
@@ -41,6 +41,7 @@ static char sccsid[] = "@(#)print.c 8.3 (Berkeley) 4/2/94";
#include <string.h>
#include <unistd.h>
+#include "die.h"
#include "ctags.h"
/*
@@ -59,7 +60,7 @@ getline()
saveftell = ftell(inf);
(void)fseek(inf, lineftell, SEEK_SET);
if (xflag)
- for (cp = lbuf; GETC(!=, '\n'); *cp++ = c)
+ for (cp = lbuf; GETC(!=, EOF) && c != '\n'; *cp++ = c)
continue;
/*
* do all processing here, so we don't step through the
@@ -89,7 +90,58 @@ getline()
*cp = EOS;
(void)fseek(inf, saveftell, SEEK_SET);
}
+#ifdef GLOBAL
+void
+compact_print(entry, lno, file)
+char *entry;
+int lno;
+char *file;
+{
+ static int first = 1;
+ static char p_entry[128];
+ static char p_file[1024];
+ static int p_lno;
+ static char *buf;
+ static int bufsize = 512;
+ static char *p;
+ if (first) {
+ if (!(buf = (char *)malloc(bufsize)))
+ die("short of memory.");
+ buf[0] = 0;
+ p = buf;
+ first = 0;
+ }
+ if (strcmp(p_entry, entry) || strcmp(p_file, file)) {
+ if (buf[0])
+ printf("%s\n", buf);
+ if (!entry[0]) /* flush */
+ return;
+ strcpy(p_entry, entry);
+ strcpy(p_file, file);
+ p_lno = lno;
+ buf[0] = 0;
+ sprintf(buf, "%s %s %d", entry, file, lno);
+ p = buf;
+ p += strlen(p);
+ } else {
+ if (p_lno > lno)
+ die("impossible!");
+ if (p_lno < lno) {
+ if (buf + bufsize < p + 10) {
+ int offset = p - buf;
+ bufsize *= 2;
+ if (!(buf = (char *)realloc(buf, bufsize)))
+ die("short of memory.");
+ p = buf + offset;
+ }
+ sprintf(p, ",%d", lno);
+ p += strlen(p);
+ p_lno = lno;
+ }
+ }
+}
+#endif
/*
* put_entries --
* write out the tags
@@ -104,8 +156,12 @@ put_entries(node)
if (vflag)
printf("%s %s %d\n",
node->entry, node->file, (node->lno + 63) / 64);
+#ifdef GLOBAL
+ else if (xflag && cflag)
+ compact_print(node->entry, node->lno, node->file);
+#endif
else if (xflag)
-#ifdef MODIFY
+#ifdef GLOBAL
/* separate 'entry' and 'lno' */
if (strlen(node->entry) >= 16 && node->lno >= 1000)
printf("%-16s %4d %-16s %s\n",
diff --git a/contrib/global/gctags/tree.c b/contrib/global/gctags/tree.c
index 4d6f858..94362cd 100644
--- a/contrib/global/gctags/tree.c
+++ b/contrib/global/gctags/tree.c
@@ -35,12 +35,12 @@
static char sccsid[] = "@(#)tree.c 8.3 (Berkeley) 4/2/94";
#endif /* LIBC_SCCS and not lint */
-#include <err.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include "die.h"
#include "ctags.h"
static void add_node __P((NODE *, NODE *));
@@ -61,12 +61,12 @@ pfnote(name, ln)
/*NOSTRICT*/
if (!(np = (NODE *)malloc(sizeof(NODE)))) {
- warnx("too many entries to sort");
+ fprintf(stderr, "too many entries to sort\n");
put_entries(head);
free_tree(head);
/*NOSTRICT*/
if (!(head = np = (NODE *)malloc(sizeof(NODE))))
- errx(1, "out of space");
+ die("out of space");
}
if (!xflag && !strcmp(name, "main")) {
if (!(fp = strrchr(curfile, '/')))
@@ -80,12 +80,12 @@ pfnote(name, ln)
name = nbuf;
}
if (!(np->entry = strdup(name)))
- errx(1, "out of space");
+ die("out of space");
np->file = curfile;
np->lno = ln;
np->left = np->right = 0;
if (!(np->pat = strdup(lbuf)))
- errx(1, "out of space");
+ die("out of space");
if (!head)
head = np;
else
@@ -100,7 +100,7 @@ add_node(node, cur_node)
int dif;
dif = strcmp(node->entry, cur_node->entry);
-#ifdef GTAGS
+#ifdef GLOBAL
if (!Dflag && !dif) /* -D option allows duplicate entries. */
#else
if (!dif)
diff --git a/contrib/global/global/Makefile b/contrib/global/global/Makefile
index 256ea71..ef7a176 100644
--- a/contrib/global/global/Makefile
+++ b/contrib/global/global/Makefile
@@ -1,9 +1,6 @@
-# @(#)Makefile 1.0 (Berkeley) 4/21/96
-
-MAN1= global.1
-
-beforeinstall:
- ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \
- ${.CURDIR}/global.pl ${DESTDIR}/usr/bin/global
+PROG= global
+CFLAGS+=-I${.CURDIR}/../lib
+LDADD= $(LIBUTIL)
+DPADD= $(LIBUTIL)
.include <bsd.prog.mk>
diff --git a/contrib/global/global/Makefile.generic b/contrib/global/global/Makefile.generic
index fe735da..ca10a60 100644
--- a/contrib/global/global/Makefile.generic
+++ b/contrib/global/global/Makefile.generic
@@ -1,13 +1,20 @@
-# @(#)Makefile 29-Dec-96
-
PROG = global
+CC = gcc
+LIBS = -L../lib -lutil -ldb
+CFLAGS = -O -I../lib -I/usr/include/db
+DEPLIBS= ../lib/libutil.a
+OBJS = global.o
BINDIR = /usr/bin
-MANDIR = /usr/share/man
+MANDIR = /usr/man
+
+all: $(PROG)
-all:
+$(PROG): $(OBJS) $(DEPLIBS)
+ $(CC) -o $(PROG) $(OBJS) $(LIBS)
install:
- cp $(PROG).pl $(BINDIR)/$(PROG)
+ cp $(PROG) $(BINDIR)
chmod 755 $(BINDIR)/$(PROG)
cp $(PROG).1 $(MANDIR)/man1
chmod 644 $(MANDIR)/man1/$(PROG).1
clean:
+ rm -f $(PROG) $(OBJS)
diff --git a/contrib/global/global/global.1 b/contrib/global/global/global.1
index be81dd9..3df007e 100644
--- a/contrib/global/global/global.1
+++ b/contrib/global/global/global.1
@@ -28,66 +28,92 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd April 21, 1997
+.Dd Nov 26, 1997
.Dt GLOBAL 1
.Os BSD 4
.Sh NAME
.Nm global
-.Nd print the locations of specified function.
+.Nd print the locations of specified object.
.Sh SYNOPSIS
.Nm global
-.Op Fl arx
-.Ar name
+.Op Fl alrvx
+.Ar pattern
.Nm global -c
-.Op Ar name
+.Op Ar prefix
.Nm global
-.Op Fl a
-.Fl f
+.Fl f[arx]
.Ar file
+.Nm global
+.Fl g[alvx]
+.Ar pattern
+.Nm global
+.Fl i[v]
+.Nm global
+.Fl p
+.Nm global
+.Fl s[alvx]
+.Ar pattern
.Sh DESCRIPTION
.Nm Global
-find the locations of specified function in C and Yacc source files.
+find the locations of specified object in C and Yacc source files.
.Nm Global
can treat a source tree, that is, a directory that has subdirectories and
source files.
You can get the relative path of objects from anywhere within the tree.
-
.Nm Global
can locate not only function definitions but also function references and
-allow duplicate entries too.
+other symbols.
+Duplicate entries are allowed.
.Pp
In advance of using this command, you must execute
.Xr gtags 1
-at the root directory of the source tree.
+at the root directory of the source tree to make tag files.
+Then you can execute
+.Nm
+at anywhere in the source tree.
.Pp
The following options are available:
.Bl -tag -width Ds
+.It Ar pattern
+object pattern. It can include POSIX 1003.2 regular expression.
.It Fl a
print absolute path name. By default, print relative path name.
-.It Fl c Op Ar name
+.It Fl c Op Ar prefix
print candidate function names which start with specified
-.Ar name .
+.Ar prefix .
If
-.Ar name
+.Ar prefix
is not specified, print all function names.
.It Fl f Ar file
print all function definitions in the
.Ar file .
This option implies -x option.
+.It Fl g
+print all lines which match to the pattern.
+.It Fl i
+reconstruct tags files incrementally.
+.It Fl l
+print objects which exist under the current directory.
.It Fl r
print the locations of function references. By default, print function
definitions.
+.It Fl p
+print the location of GTAGS.
+.It Fl s
+print the locations of specified symbol other than function names.
+You need GSYMS tags file. See
+.Xr gtags 1 .
.It Fl x
In addition to the default output, produce the line number and
the line contents.
-.It Ar name
-function name. It can include perl's regular expression.
.Sh FILES
.Bl -tag -width tags -compact
.It Pa GTAGS
tags file for function definitions.
.It Pa GRTAGS
tags file for function references.
+.It Pa GSYMS
+tags file for symbols other then functions.
.El
.Sh ENVIRONMENT
The following environment variables affect the execution of global.
@@ -138,12 +164,12 @@ global search in these path too.
exits with a non 0 value if an error occurred, 0 otherwise.
.Sh SEE ALSO
.Xr btreeop 1 ,
-.Xr gctags 1 ,
.Xr gtags 1 ,
-.Xr htags 1 .
+.Xr htags 1 ,
+.Xr vi 1 .
.Sh AUTHORS
Shigio Yamaguchi (shigio@wafu.netgate.net)
.Sh HISTORY
The
.Nm
-command appeared in FreeBSD 2.2.
+command appeared in FreeBSD 2.2.2.
diff --git a/contrib/global/global/global.c b/contrib/global/global/global.c
new file mode 100644
index 0000000..492aaef
--- /dev/null
+++ b/contrib/global/global/global.c
@@ -0,0 +1,746 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * global.c 7-Nov-97
+ *
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <regex.h>
+#include "global.h"
+
+char *progname = "global"; /* command name */
+
+static void usage __P((void));
+void main __P((int, char **));
+char *outfilter __P(());
+void completelist __P((char *, char *));
+void relative_filter __P((char *, char *, char *));
+void grep __P((char *));
+int printtag __P((FILE *, char *, char *, int));
+int regexp __P((char *));
+int search __P((char *, char *, char *, char *, int));
+char *extractpath __P((char *));
+int includepath __P((char *, char *));
+
+char sortfilter[MAXCOMLINE+1]; /* sort filter */
+char pathfilter[MAXCOMLINE+1]; /* path convert filter */
+char local[MAXPATHLEN+1]; /* local prefix */
+char *localprefix; /* local prefix */
+int aflag; /* [option] */
+int cflag; /* command */
+int fflag; /* command */
+int lflag; /* [option] */
+int gflag; /* command */
+int iflag; /* command */
+int pflag; /* command */
+int rflag; /* [option] */
+int sflag; /* command */
+int vflag; /* [option] */
+int xflag; /* [option] */
+
+static void
+usage()
+{
+ fprintf(stderr, "usage:\t%s\n\t%s\n\t%s\n\t%s\n\t%s\n\t%s\n\t%s\n",
+ "global [-alrvx] pattern",
+ "global -c [prefix]",
+ "global -f[arx] file",
+ "global -g[alvx] pattern",
+ "global -i[v]",
+ "global -p",
+ "global -s[alvx] pattern");
+ exit(1);
+}
+
+void
+main(argc, argv)
+int argc;
+char *argv[];
+{
+ char *p, *av;
+ int count;
+ int db;
+ char cwd[MAXPATHLEN+1]; /* current directory */
+ char root[MAXPATHLEN+1]; /* root of source tree */
+ char dbpath[MAXPATHLEN+1]; /* dbpath directory */
+ char comline[MAXCOMLINE+1];
+
+ while (--argc > 0 && (++argv)[0][0] == '-') {
+ for (p = argv[0] + 1; *p; p++) {
+ switch (*p) {
+ case 'a':
+ aflag++;
+ break;
+ case 'c':
+ cflag++;
+ break;
+ case 'f':
+ fflag++;
+ break;
+ case 'l':
+ lflag++;
+ break;
+ case 'g':
+ gflag++;
+ break;
+ case 'i':
+ iflag++;
+ break;
+ case 'p':
+ pflag++;
+ break;
+ case 'r':
+ rflag++;
+ break;
+ case 's':
+ sflag++;
+ break;
+ case 'v':
+ vflag++;
+ break;
+ case 'x':
+ xflag++;
+ break;
+ default:
+ usage();
+ }
+ }
+ }
+ av = (argc > 0) ? *argv : (char *)0;
+ /*
+ * usage check.
+ */
+ {
+ int commands, options;
+
+ commands = cflag + fflag + gflag + iflag + pflag + sflag;
+ options = aflag + lflag + rflag + xflag;
+ /*
+ * only -c, -i and -p allows no argment.
+ */
+ if (!av && !cflag && !iflag && !pflag)
+ usage();
+ /*
+ * command cannot be duplicated.
+ */
+ if (commands > 1)
+ usage();
+ /*
+ * -c and -i command allows only -v option.
+ */
+ if (cflag + iflag && options)
+ usage();
+ /*
+ * -r is not valid for -g, -i and -s.
+ */
+ if (rflag && (gflag + iflag + sflag))
+ usage();
+ }
+ /*
+ * remove leading blanks.
+ */
+ if (av && !gflag)
+ for (; *av == ' ' || *av == '\t'; av++)
+ ;
+ if (cflag && av && regexp(av))
+ die("regular expression not allowed with -c option.");
+ /*
+ * get path of following directories.
+ * o current directory
+ * o root of source tree
+ * o dbpath directory
+ *
+ * if GTAGS not found, getdbpath doesn't return.
+ */
+ getdbpath(cwd, root, dbpath);
+
+ if (pflag) {
+ fprintf(stdout, "%s\n", dbpath);
+ exit(0);
+ }
+ /*
+ * incremental update of tag files.
+ */
+ if (iflag) {
+ if (chdir(root) < 0)
+ die1("cannot change directory to '%s'.", root);
+ sprintf(comline, "gtags -i%s %s", (vflag) ? "v" : "", dbpath);
+ if (system(comline))
+ exit(1);
+ exit(0);
+ }
+
+ /*
+ * complete function name
+ */
+ if (cflag) {
+ completelist(dbpath, av);
+ exit(0);
+ }
+ /*
+ * make sort filter.
+ */
+ if (sflag && xflag)
+ *sortfilter = 0;
+ else if (fflag)
+ sprintf(sortfilter, "sort +1n -2");
+ else if (xflag) /* print details */
+ sprintf(sortfilter, "sort +0 -1 +2 -3 +1n -2");
+ else /* print just file name */
+ sprintf(sortfilter, "sort | uniq");
+ /*
+ * make path filter.
+ */
+ if (aflag) /* absolute path name */
+ sprintf(pathfilter, "sed -e 's!\\.!%s!'", root);
+ else /* relative path name */
+ relative_filter(root, cwd, pathfilter);
+ /*
+ * make local prefix.
+ */
+ if (lflag) {
+ /*
+ * getdbpath() assure follows.
+ * cwd != "/" and cwd includes root.
+ */
+ strcpy(local, cwd);
+ strcat(local, "/");
+ localprefix = local + strlen(root) - 1;
+ *localprefix = '.';
+ }
+ /*
+ * grep the pattern in a source tree.
+ */
+ if (gflag) {
+ if (!lflag)
+ chdir(root);
+ else if (!aflag)
+ sprintf(pathfilter, "sed -e 's!\\./!!'");
+ grep(av);
+ exit(0);
+ }
+ db = (rflag) ? GRTAGS : ((sflag) ? GSYMS : GTAGS);
+ /*
+ * print function definitions.
+ */
+ if (fflag) {
+ struct stat sb;
+ char pathbuf[MAXPATHLEN+1], *path;
+ char *p;
+ FILE *op;
+ DBIO *dbio;
+
+ /* av !~ /\.[chysS]$/) */
+ p = av + strlen(av) - 1; /* last character */
+ if (stat(av, &sb) || !S_ISREG(sb.st_mode))
+ die1("file '%s' not found.", av);
+ if (*(p - 1) != '.' || !locatestring("chysS", p, 0))
+ die("accept only file name end with '.c .h .y .s .S'.");
+ /*
+ * convert path into relative from root directory of source tree.
+ */
+ path = realpath(av, pathbuf);
+ if (*path != '/')
+ die("realpath(3) is not compatible with BSD version.");
+ if (strncmp(path, root, strlen(root)))
+ die1("file '%s' is out of source tree.", path);
+ path += strlen(root) - 1;
+ *path = '.';
+ if (!(op = popen(outfilter(), "w")))
+ die("cannot open output pipe.");
+ dbio = gtagsopen(dbpath, db, 0);
+ for (p = db_first(dbio, NULL, DBIO_SKIPMETA); p; p = db_next(dbio))
+ if (includepath(p, path))
+ fprintf(op, "%s\n", p);
+ db_close(dbio);
+ pclose(op);
+ exit(0);
+ }
+ /*
+ * search in current source tree.
+ */
+ count = search(av, cwd, root, dbpath, db);
+ /*
+ * search in library path.
+ */
+ if (count == 0 && !rflag && !sflag && !regexp(av) && getenv("GTAGSLIBPATH")) {
+ char envbuf[MAXENVLEN+1];
+ char libdbpath[MAXPATHLEN+1];
+ char *p, *lib;
+
+ strcpy(envbuf, getenv("GTAGSLIBPATH"));
+ p = envbuf;
+ while (p) {
+ lib = p;
+ if (p = locatestring(p, ":", 0))
+ *p++ = 0;
+ if (!strncmp(lib, cwd, strlen(cwd)) || !strncmp(cwd, lib, strlen(lib)))
+ continue;
+ if (!gtagsexist(lib, libdbpath))
+ continue;
+ if (!strcmp(dbpath, libdbpath))
+ continue;
+ if (aflag) /* absolute path name */
+ sprintf(pathfilter, "sed -e 's!\\.!%s!'", lib);
+ else
+ relative_filter(lib, cwd, pathfilter);
+ count = search(av, cwd, lib, libdbpath, GTAGS);
+ if (count > 0) {
+ strcpy(dbpath, libdbpath);
+ break;
+ }
+ }
+ }
+ if (vflag) {
+ if (count) {
+ if (count == 1)
+ fprintf(stderr, "%d object located", count);
+ if (count > 1)
+ fprintf(stderr, "%d objects located", count);
+ fprintf(stderr, " (using '%s').\n", makepath(dbpath, dbname(db)));
+ } else {
+ fprintf(stderr, "'%s' not found.\n", av);
+ }
+ }
+ exit(0);
+}
+/*
+ * outfilter: return output filter.
+ *
+ * gi) pathfilter
+ * gi) sortfilter
+ * r) output filter
+ */
+char *
+outfilter()
+{
+ static char filter[MAXCOMLINE+1];
+
+ /*
+ * make output filter
+ */
+ if (*sortfilter)
+ sprintf(filter, "%s | %s", sortfilter, pathfilter);
+ else
+ strcpy(filter, pathfilter);
+ return filter;
+}
+/*
+ * completelist: print complete list of function
+ *
+ * i) dbpath dbpath directory
+ * i) prefix prefix of primary key
+ */
+void
+completelist(dbpath, prefix)
+char *dbpath;
+char *prefix;
+{
+ char *p;
+ DBIO *dbio;
+
+ dbio = gtagsopen(dbpath, GTAGS, 0);
+ for (p = db_first(dbio, prefix, DBIO_KEY|DBIO_PREFIX|DBIO_SKIPMETA); p; p = db_next(dbio))
+ (void)fprintf(stdout, "%s\n", p);
+ db_close(dbio);
+}
+/*
+ * relative_filter: make relative path filter
+ *
+ * i) root the root directory of source tree
+ * i) argcwd current directory
+ * o) bp result
+ * relative path filter
+ */
+void
+relative_filter(root, cwd, bp)
+char *root;
+char *cwd;
+char *bp;
+{
+ char *p, *c, *branch;
+
+ /*
+ * get branch point.
+ */
+ branch = cwd;
+ for (p = root, c = cwd; *p && *c && *p == *c; p++, c++)
+ if (*c == '/')
+ branch = c;
+ if (*p == 0 && (*c == 0 || *c == '/'))
+ branch = c;
+ if (*c == 0 && *p)
+ die("illegal root.");
+ /*
+ * forward to root.
+ */
+ strcpy(bp, "sed -e 's!\\./!");
+ for (c = branch; *c; c++)
+ if (*c == '/')
+ strcat(bp, "../");
+ p = root + (branch - cwd);
+ /*
+ * backward to leaf.
+ */
+ if (*p) {
+ p++;
+ strcat(bp, p);
+ strcat(bp, "/");
+ }
+ strcat(bp, "!'");
+ /*
+ * remove redundancy.
+ */
+ if (*branch) {
+ char unit[256];
+
+ bp += strlen(bp);
+ p = unit;
+ for (c = branch + 1; ; c++) {
+ if (*c == 0 || *c == '/') {
+ *p = 0;
+ sprintf(bp, " -e 's!\\.\\./%s/!!'", unit);
+ bp += strlen(bp);
+ if (*c == 0)
+ break;
+ p = unit;
+ } else
+ *p++ = *c;
+ }
+ }
+}
+/*
+ * printtag: print a tag's line
+ *
+ * i) op output stream
+ * i) root root of source tree
+ * i) bp tag's line
+ * i) compact 0: standard format, 1: compact format
+ * r) output line count
+ */
+int
+printtag(op, root, bp, compact)
+FILE *op;
+char *root;
+char *bp;
+int compact;
+{
+ int count = 0;
+ char *tag, *file, *lno;
+ int opened = 0;
+ char path[MAXPATHLEN+1];
+ char *buffer;
+ int line, tagline;
+ FILE *ip;
+
+ if (!xflag) {
+ fprintf(op, "%s\n", extractpath(bp));
+ return 1;
+ }
+ if (compact) { /* compact format */
+ char *p = bp;
+
+ tag = p; /* tag = $1 */
+ for (; !isspace(*p) ; p++)
+ ;
+ *p++ = 0;
+ for (; isspace(*p) ; p++)
+ ;
+ file = p; /* file = $2 */
+ for (; !isspace(*p) ; p++)
+ ;
+ *p++ = 0;
+ for (; isspace(*p) ; p++)
+ ;
+ lno = p; /* lno = $3 */
+ sprintf(path, "%s/%s", root, file + 2);
+ if (ip = fopen(path, "r")) {
+ opened = 1;
+ buffer = mgets(ip, 0, NULL);
+ line = 1;
+ } else {
+ buffer = "";
+ }
+ while (*lno) {
+ /* get line number */
+ for (tagline = 0; *lno >= '0' && *lno <= '9'; lno++)
+ tagline = tagline * 10 + *lno - '0';
+ if (*lno == ',')
+ lno++;
+ if (opened) {
+ while (line < tagline) {
+ if (!(buffer = mgets(ip, 0, NULL)))
+ die1("unexpected end of file. '%s'", path);
+ line++;
+ }
+ }
+ if (strlen(tag) >= 16 && tagline >= 1000)
+ fprintf(op, "%-16s %4d %-16s %s\n",
+ tag, tagline, file, buffer);
+ else
+ fprintf(op, "%-16s%4d %-16s %s\n",
+ tag, tagline, file, buffer);
+ count++;
+ }
+ if (opened)
+ fclose(ip);
+ } else { /* standard format */
+ /*
+ * separater in key part must be ' ' to avoid sort(1)'s bug.
+ */
+ detab(op, bp);
+ count++;
+ }
+ return count;
+}
+
+/*
+ * regexp: test whether regular expression included.
+ *
+ * i) s string
+ * r) 0: not included, 1: included
+ *
+ * This function cannot be used for generic purpose.
+ * Any character except '[a-zA-Z_0-9]' is assumed RE char..
+ */
+int
+regexp(s)
+char *s;
+{
+ int c;
+
+ while (c = *s++)
+ if ( (c >= 'a' && c <= 'z') ||
+ (c >= 'A' && c <= 'Z') ||
+ (c >= '0' && c <= '9') ||
+ (c == '_') )
+ ;
+ else
+ return 1;
+ return 0;
+}
+/*
+ * grep: grep pattern
+ *
+ * i) pattern POSIX regular expression
+ */
+void
+grep(pattern)
+char *pattern;
+{
+ FILE *ip, *op, *fp;
+ char *path;
+ char edit[IDENTLEN+1];
+ char *buffer, *p, *e;
+ int linenum, count, editlen;
+ regex_t preg;
+
+ /*
+ * convert spaces into %FF format.
+ */
+ e = edit;
+ for (p = pattern; *p; p++) {
+ if (*p == '%' || *p == ' ' || *p == '\t') {
+ sprintf(e, "%%%02x", *p);
+ e += 3;
+ } else
+ *e++ = *p;
+ }
+ *e = 0;
+ editlen = strlen(edit);
+
+ if (regcomp(&preg, pattern, REG_EXTENDED) != 0)
+ die("illegal regular expression.");
+ if (!(op = popen(outfilter(), "w")))
+ die("cannot open output pipe.");
+ count = 0;
+ for (findopen(); path = findread(NULL); ) {
+ if (!(fp = fopen(path, "r")))
+ die1("cannot open file '%s'.", path);
+ linenum = 0;
+ while (buffer = mgets(fp, 0, NULL)) {
+ linenum++;
+ if (regexec(&preg, buffer, 0, 0, 0) == 0) {
+ count++;
+ if (xflag == 0) {
+ fprintf(op, "%s\n", path);
+ break;
+ }
+ if (editlen >= 16 && linenum >= 1000)
+ fprintf(op, "%-16s %4d %-16s %s\n",
+ edit, linenum, path, buffer);
+ else
+ fprintf(op, "%-16s%4d %-16s %s\n",
+ edit, linenum, path, buffer);
+ }
+ }
+ fclose(fp);
+ }
+ findclose();
+ pclose(op);
+ if (vflag) {
+ if (count == 0)
+ fprintf(stderr, "object not found.\n");
+ if (count == 1)
+ fprintf(stderr, "%d object located.\n", count);
+ if (count > 1)
+ fprintf(stderr, "%d objects located.\n", count);
+ }
+}
+
+/*
+ * search: search specified function
+ *
+ * i) pattern search pattern
+ * i) cwd current directory
+ * i) root root of source tree
+ * i) dbpath database directory
+ * i) db GTAGS,GRTAGS,GSYMS
+ * r) count of output lines
+ */
+int
+search(pattern, cwd, root, dbpath, db)
+char *pattern;
+char *cwd;
+char *root;
+char *dbpath;
+int db;
+{
+ char *p;
+ int count = 0;
+ FILE *op;
+ DBIO *dbio;
+ int compact;
+ regex_t preg;
+
+ /*
+ * open tag file.
+ * currently only GSYMS is compact format.
+ */
+ dbio = gtagsopen(dbpath, db, 0);
+ compact = (db == GSYMS) ? 1 : 0;
+ if (!(op = popen(outfilter(), "w")))
+ die1("filter '%s' failed.", outfilter());
+ /*
+ * regular expression.
+ */
+ if (regexp(pattern) && regcomp(&preg, pattern, REG_EXTENDED) == 0) {
+ char prefix_buf[IDENTLEN+1];
+ char *prefix = (char *)0;
+ int presize;
+
+ if (*pattern == '^' && *(p = pattern + 1) && (isalpha(*p) || *p == '_')) {
+ prefix = prefix_buf;
+ *prefix++ = *p++;
+ while (*p && (isalpha(*p) || isdigit(*p) || *p == '_'))
+ *prefix++ = *p++;
+ *prefix = 0;
+ prefix = prefix_buf;
+ p = db_first(dbio, prefix, DBIO_SKIPMETA|DBIO_PREFIX);
+ } else {
+ p = db_first(dbio, NULL, DBIO_SKIPMETA);
+ }
+ for (; p; p = db_next(dbio)) {
+ if (*p == ' ')
+ continue;
+ if (regexec(&preg, dbio->lastkey, 0, 0, 0) == 0)
+ count += printtag(op, root, p, compact);
+ }
+ } else {
+ for (p = db_first(dbio, pattern, 0); p; p = db_next(dbio)) {
+ if (lflag) {
+ char *q;
+ /* locate start point of a path */
+ q = locatestring(p, "./", 0);
+ if (!locatestring(q, localprefix, 1))
+ continue;
+ }
+ count += printtag(op, root, p, compact);
+ }
+ }
+ pclose(op);
+ db_close(dbio);
+ return count;
+}
+/*
+ * extractpath: extract path string of a tag line
+ *
+ * i) line tag line
+ * r) path
+ *
+ * standard format: main 12 ./xxx/xxx/xxx.c main(argc, argv) {
+ * compact format: main ./xxx/xxx/xxx.c 12,15,55,101
+ */
+char *
+extractpath(line)
+char *line;
+{
+ static char buf[MAXPATHLEN+1];
+ char *p, *b;
+ int c;
+
+ if (!(p = locatestring(line, "./", 0)))
+ die("illegal tag format (path not found).");
+ b = buf;
+ while (c = *b++ = *p++) {
+ if (c == ' ' || c == '\t') {
+ *(b - 1) = 0;
+ break;
+ }
+ }
+ return buf;
+}
+/*
+ * includepath: check if the path included in tag line or not.
+ *
+ * i) line tag line
+ * i) path path
+ * r) 0: doesn't included, 1: included
+ */
+int
+includepath(line, path)
+char *line;
+char *path;
+{
+ char *p;
+ int length;
+
+ if (!(p = locatestring(line, "./", 0)))
+ die("illegal tag format (path not found).");
+ length = strlen(path);
+ if (strncmp(p, path, length))
+ return 0;
+ p += length;
+ if (*p == ' ' || *p == '\t')
+ return 1;
+ return 0;
+}
diff --git a/contrib/global/gozilla/Imakefile b/contrib/global/gozilla/Imakefile
new file mode 100644
index 0000000..5bcbc01
--- /dev/null
+++ b/contrib/global/gozilla/Imakefile
@@ -0,0 +1,12 @@
+XCOMM
+XCOMM Imakefile for gozilla
+XCOMM
+
+LOCAL_LIBRARIES = XawClientLibs -L../lib -lutil
+ DEPLIBS = XawClientDepLibs ../lib/libutil.a
+ DEFINES = -DSTANDALONE -DGLOBAL -I../lib
+
+ SRCS = gozilla.c remote.c
+ OBJS = gozilla.o remote.o
+
+ComplexProgramTarget(gozilla)
diff --git a/contrib/global/gozilla/gozilla.c b/contrib/global/gozilla/gozilla.c
new file mode 100644
index 0000000..fd43bbf
--- /dev/null
+++ b/contrib/global/gozilla/gozilla.c
@@ -0,0 +1,194 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * gozilla.c 27-Oct-97
+ *
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include "global.h"
+
+char *progname = "gozilla"; /* command name */
+
+static void usage __P((void));
+void main __P((int, char **));
+int sendcommand __P((char *));
+
+int bflag;
+int pflag;
+int Cflag;
+
+static void
+usage()
+{
+ fprintf(stderr, "usage:\t%s\n\t%s\n",
+ "gozilla [+no] [-b browser] [-p] file",
+ "gozilla -C command");
+ exit(1);
+}
+
+void
+main(argc, argv)
+int argc;
+char *argv[];
+{
+ char c, *p, *q;
+ char *browser = (char *)0;
+ char *command = (char *)0;
+ char *arg = (char *)0;
+ char URL[MAXPATHLEN+1];
+ char com[MAXCOMLINE+1];
+ int linenumber = 0;
+ int status;
+
+ while (--argc > 0 && (c = (++argv)[0][0]) == '-' || c == '+') {
+ if (c == '+') {
+ linenumber = atoi(argv[0] + 1);
+ continue;
+ }
+ p = argv[0] + 1;
+ switch (*p) {
+ case 'b':
+ browser = argv[1];
+ --argc; ++argv;
+ break;
+ case 'p':
+ pflag++;
+ break;
+ case 'C':
+ command = argv[1];
+ --argc; ++argv;
+ break;
+ default:
+ usage();
+ }
+ }
+ if (!browser && getenv("BROWSER"))
+ browser = getenv("BROWSER");
+ if (command) {
+ if (browser)
+ die("-C option is valid only for mozilla.");
+ if (sendcommand(command) == -1)
+ die("mozilla not found.");
+ exit(0);
+ }
+ if (argc == 0)
+ usage();
+ if (locatestring(argv[0], "http:", 1) || locatestring(argv[0], "file:", 1))
+ strcpy(URL, argv[0]);
+ else {
+ char *abspath;
+ char pathbuf[MAXPATHLEN+1];
+ char htmlpath[MAXPATHLEN+1];
+
+ if (!test("f", argv[0]) && !test("d", argv[0]))
+ die1("path '%s' not found.", argv[0]);
+ if (!(abspath = realpath(argv[0], pathbuf)))
+ die1("cannot make absolute path name. realpath(%s) failed.", argv[0]);
+ if (*abspath != '/')
+ die("realpath(3) is not compatible with BSD version.");
+ if (issource(abspath)) {
+ char cwd[MAXPATHLEN+1];
+ char root[MAXPATHLEN+1];
+ char dbpath[MAXPATHLEN+1];
+ char htmldir[MAXPATHLEN+1];
+ /*
+ * get current, root and dbpath directory.
+ * if GTAGS not found, getdbpath doesn't return.
+ */
+ getdbpath(cwd, root, dbpath);
+ if (test("d", makepath(dbpath, "HTML")))
+ strcpy(htmldir, makepath(dbpath, "HTML"));
+ else if (test("d", makepath(root, "HTML")))
+ strcpy(htmldir, makepath(root, "HTML"));
+ else
+ die("hypertext not found. See htags(1).");
+ /*
+ * convert path into hypertext.
+ */
+ p = abspath + strlen(root);
+ for (q = ++p; *q; q++)
+ if (*q == '/')
+ *q = ' ';
+ if (linenumber)
+ sprintf(URL, "file:%s/S/%s.html#%d", htmldir, p, linenumber);
+ else
+ sprintf(URL, "file:%s/S/%s.html", htmldir, p);
+ } else {
+ sprintf(URL, "file:%s", abspath);
+ }
+ }
+ if (pflag) {
+ fprintf(stdout, "%s\n", URL);
+ exit(0);
+ }
+ /*
+ * execute generic browser.
+ */
+ if (browser && !locatestring(browser, "netscape", 3)) {
+ sprintf(com, "%s '%s'", browser, URL);
+ system(com);
+ exit (0);
+ }
+ /*
+ * send a command to mozilla.
+ */
+ sprintf(com, "openURL(%s)", URL);
+ status = sendcommand(com);
+ /*
+ * load mozilla if not found.
+ */
+ if (status != 0) {
+ int pid;
+
+ if ((pid = fork()) < 0) {
+ die("cannot execute netscape (fork).");
+ } else if (pid == 0) {
+ execlp("netscape", "netscape", URL, (char *)0);
+ die("loading mozilla failed.");
+ }
+ exit(0);
+ }
+ exit(status);
+}
+int
+sendcommand(com)
+char *com;
+{
+ int argc = 3;
+ char *argv[4];
+
+ argv[0] = "netscape-remote";
+ argv[1] = "-remote";
+ argv[2] = com;
+ argv[3] = (char *)0;
+
+ return netscape_remote(argc, argv);
+}
diff --git a/contrib/global/gozilla/gozilla.man b/contrib/global/gozilla/gozilla.man
new file mode 100644
index 0000000..1065529
--- /dev/null
+++ b/contrib/global/gozilla/gozilla.man
@@ -0,0 +1,141 @@
+.\"
+.\" Copyright (c) 1997 Shigio Yamaguchi. All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\" must display the following acknowledgement:
+.\" This product includes software developed by Shigio Yamaguchi.
+.\" 4. Neither the name of the author nor the names of any co-contributors
+.\" may be used to endorse or promote products derived from this software
+.\" without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd Sep 17, 1997
+.Dt GOZILLA 1
+.Os BSD 4
+.Sh NAME
+.Nm gozilla
+.Nd force mozilla to display specified source file
+.Sh SYNOPSIS
+\fBgozilla\fP [\fB+\fP\fIno\fP]
+.Op Fl b Ar browser
+.Op Fl p
+.Ar file
+.Nm gozilla
+.Fl C Ar command
+.Sh DESCRIPTION
+First form:
+.br
+.Nm Gozilla
+force mozilla (Netscape Navigator) to display specified source file
+as a hypertext.
+If mozilla has not loaded then
+.Nm
+loads it.
+.Pp
+In advance of using this command, you must execute
+.Xr gtags 1
+and
+.Xr htags 1
+at the root directory of the source tree to make tag files.
+Then you can execute
+.Nm
+at anywhere in the source tree.
+.br
+You can specify source file and the line number optionally.
+.Pp
+Second form:
+.br
+.Nm Gozilla
+send
+.Ar command
+to mozilla directly.
+.Ar Command
+is undocumented. But the hint is in the resource file of mozilla.
+.Pp
+The following options are available:
+.Bl -tag -width Ds
+.It Ar \fB+\fP\fIno\fP
+line number. It must be a line on which function definition or function
+reference is exist.
+If you execute
+.Xr htags 1
+with -l option, you can specify any line.
+.It Fl b Ar browser
+browser to use. By default, assumes mozilla.
+If you specify another browser,
+.Nm
+waits for exiting of the browser.
+.It Fl p
+just print generated target URL.
+.It Ar file
+path of source file.
+.It Fl C Ar command
+send
+.Ar command
+to mozilla directly.
+.El
+.Sh FILES
+.Bl -tag -width tags -compact
+.It Pa HTML/
+hypertext of source tree.
+.It Pa GTAGS
+tags file for function definitions.
+.El
+.Sh ENVIRONMENT
+The following environment variables affect the execution of gozilla.
+.Pp
+.Bl -tag -width indent
+.It Ev GTAGSROOT
+The directory which is the root of source tree.
+.It Ev GTAGSDBPATH
+The directory on which HTML directory exist. This value is ignored
+when GTAGSROOT is not defined.
+.It Ev BROWSER
+browser to use. By default, assumes mozilla.
+.El
+.Sh EXAMPLES
+
+ % global -x main
+ main 82 ctags.c main(argc, argv)
+ % gozilla +82 ctags.c
+ % gozilla -C pageDown
+ % gozilla -C back
+
+.Sh DIAGNOSTICS
+.Nm Gozilla
+exits with a non 0 value if an error occurred, 0 otherwise.
+.Sh SEE ALSO
+.Xr global 1 ,
+.Xr gtags 1 ,
+.Xr htags 1 .
+.Sh NOTES
+Netscape Navigator is a registered trademark of Netscape Communications Corporation
+in the United States and other countries.
+.Pp
+.Nm Gozilla
+means 'Global for mozilla'.
+.Sh BUGS
+.Nm Gozilla
+can treat not only source file but also normal file, directory, HTML file
+and even URL, because it is omnivorous.
+.Sh AUTHORS
+Shigio Yamaguchi (shigio@wafu.netgate.net)
diff --git a/contrib/global/gozilla/remote.c b/contrib/global/gozilla/remote.c
new file mode 100644
index 0000000..d2e6a34
--- /dev/null
+++ b/contrib/global/gozilla/remote.c
@@ -0,0 +1,717 @@
+/* -*- Mode:C; tab-width: 8 -*-
+ * remote.c --- remote control of Netscape Navigator for Unix.
+ * version 1.1.3, for Netscape Navigator 1.1 and newer.
+ *
+ * Copyright © 1996 Netscape Communications Corporation, all rights reserved.
+ * Created: Jamie Zawinski <jwz@netscape.com>, 24-Dec-94.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * To compile:
+ *
+ * cc -o netscape-remote remote.c -DSTANDALONE -lXmu -lX11
+ *
+ * To use:
+ *
+ * netscape-remote -help
+ *
+ * Documentation for the protocol which this code implements may be found at:
+ *
+ * http://home.netscape.com/newsref/std/x-remote.html
+ *
+ * Bugs and commentary to x_cbug@netscape.com.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/Xmu/WinUtil.h> /* for XmuClientWindow() */
+
+
+/* vroot.h is a header file which lets a client get along with `virtual root'
+ window managers like swm, tvtwm, olvwm, etc. If you don't have this header
+ file, you can find it at "http://home.netscape.com/newsref/std/vroot.h".
+ If you don't care about supporting virtual root window managers, you can
+ comment this line out.
+ */
+#include "vroot.h"
+
+
+#ifdef STANDALONE
+#ifdef GLOBAL
+ extern char *progname;
+#else
+ static const char *progname = 0;
+#endif
+ static const char *expected_mozilla_version = "1.1";
+#else /* !STANDALONE */
+ extern const char *progname;
+ extern const char *expected_mozilla_version;
+#endif /* !STANDALONE */
+
+#define MOZILLA_VERSION_PROP "_MOZILLA_VERSION"
+#define MOZILLA_LOCK_PROP "_MOZILLA_LOCK"
+#define MOZILLA_COMMAND_PROP "_MOZILLA_COMMAND"
+#define MOZILLA_RESPONSE_PROP "_MOZILLA_RESPONSE"
+static Atom XA_MOZILLA_VERSION = 0;
+static Atom XA_MOZILLA_LOCK = 0;
+static Atom XA_MOZILLA_COMMAND = 0;
+static Atom XA_MOZILLA_RESPONSE = 0;
+
+static void
+mozilla_remote_init_atoms (Display *dpy)
+{
+ if (! XA_MOZILLA_VERSION)
+ XA_MOZILLA_VERSION = XInternAtom (dpy, MOZILLA_VERSION_PROP, False);
+ if (! XA_MOZILLA_LOCK)
+ XA_MOZILLA_LOCK = XInternAtom (dpy, MOZILLA_LOCK_PROP, False);
+ if (! XA_MOZILLA_COMMAND)
+ XA_MOZILLA_COMMAND = XInternAtom (dpy, MOZILLA_COMMAND_PROP, False);
+ if (! XA_MOZILLA_RESPONSE)
+ XA_MOZILLA_RESPONSE = XInternAtom (dpy, MOZILLA_RESPONSE_PROP, False);
+}
+
+static Window
+mozilla_remote_find_window (Display *dpy)
+{
+ int i;
+ Window root = RootWindowOfScreen (DefaultScreenOfDisplay (dpy));
+ Window root2, parent, *kids;
+ unsigned int nkids;
+ Window result = 0;
+ Window tenative = 0;
+ unsigned char *tenative_version = 0;
+
+ if (! XQueryTree (dpy, root, &root2, &parent, &kids, &nkids))
+ {
+ fprintf (stderr, "%s: XQueryTree failed on display %s\n", progname,
+ DisplayString (dpy));
+ exit (2);
+ }
+
+ /* root != root2 is possible with virtual root WMs. */
+
+ if (! (kids && nkids))
+ {
+ fprintf (stderr, "%s: root window has no children on display %s\n",
+ progname, DisplayString (dpy));
+ exit (2);
+ }
+
+ for (i = nkids-1; i >= 0; i--)
+ {
+ Atom type;
+ int format;
+ unsigned long nitems, bytesafter;
+ unsigned char *version = 0;
+ Window w = XmuClientWindow (dpy, kids[i]);
+ int status = XGetWindowProperty (dpy, w, XA_MOZILLA_VERSION,
+ 0, (65536 / sizeof (long)),
+ False, XA_STRING,
+ &type, &format, &nitems, &bytesafter,
+ &version);
+ if (! version)
+ continue;
+ if (strcmp ((char *) version, expected_mozilla_version) &&
+ !tenative)
+ {
+ tenative = w;
+ tenative_version = version;
+ continue;
+ }
+ XFree (version);
+ if (status == Success && type != None)
+ {
+ result = w;
+ break;
+ }
+ }
+
+ if (result && tenative)
+ {
+#ifndef GLOBAL
+ fprintf (stderr,
+ "%s: warning: both version %s (0x%x) and version\n"
+ "\t%s (0x%x) are running. Using version %s.\n",
+ progname, tenative_version, (unsigned int) tenative,
+ expected_mozilla_version, (unsigned int) result,
+ expected_mozilla_version);
+#endif
+ XFree (tenative_version);
+ return result;
+ }
+ else if (tenative)
+ {
+#ifndef GLOBAL
+ fprintf (stderr,
+ "%s: warning: expected version %s but found version\n"
+ "\t%s (0x%x) instead.\n",
+ progname, expected_mozilla_version,
+ tenative_version, (unsigned int) tenative);
+#endif
+ XFree (tenative_version);
+ return tenative;
+ }
+ else if (result)
+ {
+ return result;
+ }
+ else
+ {
+#ifdef GLOBAL
+ return 0;
+#else
+ fprintf (stderr, "%s: not running on display %s\n", progname,
+ DisplayString (dpy));
+ exit (1);
+#endif
+ }
+}
+
+static void
+mozilla_remote_check_window (Display *dpy, Window window)
+{
+ Atom type;
+ int format;
+ unsigned long nitems, bytesafter;
+ unsigned char *version = 0;
+ int status = XGetWindowProperty (dpy, window, XA_MOZILLA_VERSION,
+ 0, (65536 / sizeof (long)),
+ False, XA_STRING,
+ &type, &format, &nitems, &bytesafter,
+ &version);
+ if (status != Success || !version)
+ {
+ fprintf (stderr, "%s: window 0x%x is not a Netscape window.\n",
+ progname, (unsigned int) window);
+ exit (6);
+ }
+ else if (strcmp ((char *) version, expected_mozilla_version))
+ {
+ fprintf (stderr,
+ "%s: warning: window 0x%x is Netscape version %s;\n"
+ "\texpected version %s.\n",
+ progname, (unsigned int) window,
+ version, expected_mozilla_version);
+ }
+ XFree (version);
+}
+
+
+static char *lock_data = 0;
+
+static void
+mozilla_remote_obtain_lock (Display *dpy, Window window)
+{
+ Bool locked = False;
+ Bool waited = False;
+
+ if (! lock_data)
+ {
+ lock_data = (char *) malloc (255);
+ sprintf (lock_data, "pid%d@", getpid ());
+ if (gethostname (lock_data + strlen (lock_data), 100))
+ {
+ perror ("gethostname");
+ exit (-1);
+ }
+ }
+
+ do
+ {
+ int result;
+ Atom actual_type;
+ int actual_format;
+ unsigned long nitems, bytes_after;
+ unsigned char *data = 0;
+
+ XGrabServer (dpy); /* ################################# DANGER! */
+
+ result = XGetWindowProperty (dpy, window, XA_MOZILLA_LOCK,
+ 0, (65536 / sizeof (long)),
+ False, /* don't delete */
+ XA_STRING,
+ &actual_type, &actual_format,
+ &nitems, &bytes_after,
+ &data);
+ if (result != Success || actual_type == None)
+ {
+ /* It's not now locked - lock it. */
+#ifdef DEBUG_PROPS
+ fprintf (stderr, "%s: (writing " MOZILLA_LOCK_PROP
+ " \"%s\" to 0x%x)\n",
+ progname, lock_data, (unsigned int) window);
+#endif
+ XChangeProperty (dpy, window, XA_MOZILLA_LOCK, XA_STRING, 8,
+ PropModeReplace, (unsigned char *) lock_data,
+ strlen (lock_data));
+ locked = True;
+ }
+
+ XUngrabServer (dpy); /* ################################# danger over */
+ XSync (dpy, False);
+
+ if (! locked)
+ {
+ /* We tried to grab the lock this time, and failed because someone
+ else is holding it already. So, wait for a PropertyDelete event
+ to come in, and try again. */
+
+ fprintf (stderr, "%s: window 0x%x is locked by %s; waiting...\n",
+ progname, (unsigned int) window, data);
+ waited = True;
+
+ while (1)
+ {
+ XEvent event;
+ XNextEvent (dpy, &event);
+ if (event.xany.type == DestroyNotify &&
+ event.xdestroywindow.window == window)
+ {
+ fprintf (stderr, "%s: window 0x%x unexpectedly destroyed.\n",
+ progname, (unsigned int) window);
+ exit (6);
+ }
+ else if (event.xany.type == PropertyNotify &&
+ event.xproperty.state == PropertyDelete &&
+ event.xproperty.window == window &&
+ event.xproperty.atom == XA_MOZILLA_LOCK)
+ {
+ /* Ok! Someone deleted their lock, so now we can try
+ again. */
+#ifdef DEBUG_PROPS
+ fprintf (stderr, "%s: (0x%x unlocked, trying again...)\n",
+ progname, (unsigned int) window);
+#endif
+ break;
+ }
+ }
+ }
+ if (data)
+ XFree (data);
+ }
+ while (! locked);
+
+ if (waited)
+ fprintf (stderr, "%s: obtained lock.\n", progname);
+}
+
+
+static void
+mozilla_remote_free_lock (Display *dpy, Window window)
+{
+ int result;
+ Atom actual_type;
+ int actual_format;
+ unsigned long nitems, bytes_after;
+ unsigned char *data = 0;
+
+#ifdef DEBUG_PROPS
+ fprintf (stderr, "%s: (deleting " MOZILLA_LOCK_PROP
+ " \"%s\" from 0x%x)\n",
+ progname, lock_data, (unsigned int) window);
+#endif
+
+ result = XGetWindowProperty (dpy, window, XA_MOZILLA_LOCK,
+ 0, (65536 / sizeof (long)),
+ True, /* atomic delete after */
+ XA_STRING,
+ &actual_type, &actual_format,
+ &nitems, &bytes_after,
+ &data);
+ if (result != Success)
+ {
+ fprintf (stderr, "%s: unable to read and delete " MOZILLA_LOCK_PROP
+ " property\n",
+ progname);
+ return;
+ }
+ else if (!data || !*data)
+ {
+ fprintf (stderr, "%s: invalid data on " MOZILLA_LOCK_PROP
+ " of window 0x%x.\n",
+ progname, (unsigned int) window);
+ return;
+ }
+ else if (strcmp ((char *) data, lock_data))
+ {
+ fprintf (stderr, "%s: " MOZILLA_LOCK_PROP
+ " was stolen! Expected \"%s\", saw \"%s\"!\n",
+ progname, lock_data, data);
+ return;
+ }
+
+ if (data)
+ XFree (data);
+}
+
+
+static int
+mozilla_remote_command (Display *dpy, Window window, const char *command,
+ Bool raise_p)
+{
+ int result;
+ Bool done = False;
+ char *new_command = 0;
+
+ /* The -noraise option is implemented by passing a "noraise" argument
+ to each command to which it should apply.
+ */
+ if (! raise_p)
+ {
+ char *close;
+ new_command = (char *) malloc (strlen (command) + 20);
+ strcpy (new_command, command);
+ close = strrchr (new_command, ')');
+ if (close)
+ strcpy (close, ", noraise)");
+ else
+ strcat (new_command, "(noraise)");
+ command = new_command;
+ }
+
+#ifdef DEBUG_PROPS
+ fprintf (stderr, "%s: (writing " MOZILLA_COMMAND_PROP " \"%s\" to 0x%x)\n",
+ progname, command, (unsigned int) window);
+#endif
+
+ XChangeProperty (dpy, window, XA_MOZILLA_COMMAND, XA_STRING, 8,
+ PropModeReplace, (unsigned char *) command,
+ strlen (command));
+
+ while (!done)
+ {
+ XEvent event;
+ XNextEvent (dpy, &event);
+ if (event.xany.type == DestroyNotify &&
+ event.xdestroywindow.window == window)
+ {
+ /* Print to warn user...*/
+ fprintf (stderr, "%s: window 0x%x was destroyed.\n",
+ progname, (unsigned int) window);
+ result = 6;
+ goto DONE;
+ }
+ else if (event.xany.type == PropertyNotify &&
+ event.xproperty.state == PropertyNewValue &&
+ event.xproperty.window == window &&
+ event.xproperty.atom == XA_MOZILLA_RESPONSE)
+ {
+ Atom actual_type;
+ int actual_format;
+ unsigned long nitems, bytes_after;
+ unsigned char *data = 0;
+
+ result = XGetWindowProperty (dpy, window, XA_MOZILLA_RESPONSE,
+ 0, (65536 / sizeof (long)),
+ True, /* atomic delete after */
+ XA_STRING,
+ &actual_type, &actual_format,
+ &nitems, &bytes_after,
+ &data);
+#ifdef DEBUG_PROPS
+ if (result == Success && data && *data)
+ {
+ fprintf (stderr, "%s: (server sent " MOZILLA_RESPONSE_PROP
+ " \"%s\" to 0x%x.)\n",
+ progname, data, (unsigned int) window);
+ }
+#endif
+
+ if (result != Success)
+ {
+ fprintf (stderr, "%s: failed reading " MOZILLA_RESPONSE_PROP
+ " from window 0x%0x.\n",
+ progname, (unsigned int) window);
+ result = 6;
+ done = True;
+ }
+ else if (!data || strlen((char *) data) < 5)
+ {
+ fprintf (stderr, "%s: invalid data on " MOZILLA_RESPONSE_PROP
+ " property of window 0x%0x.\n",
+ progname, (unsigned int) window);
+ result = 6;
+ done = True;
+ }
+ else if (*data == '1') /* positive preliminary reply */
+ {
+ fprintf (stderr, "%s: %s\n", progname, data + 4);
+ /* keep going */
+ done = False;
+ }
+#if 1
+ else if (!strncmp ((char *)data, "200", 3)) /* positive completion */
+ {
+ result = 0;
+ done = True;
+ }
+#endif
+ else if (*data == '2') /* positive completion */
+ {
+ fprintf (stderr, "%s: %s\n", progname, data + 4);
+ result = 0;
+ done = True;
+ }
+ else if (*data == '3') /* positive intermediate reply */
+ {
+ fprintf (stderr, "%s: internal error: "
+ "server wants more information? (%s)\n",
+ progname, data);
+ result = 3;
+ done = True;
+ }
+ else if (*data == '4' || /* transient negative completion */
+ *data == '5') /* permanent negative completion */
+ {
+ fprintf (stderr, "%s: %s\n", progname, data + 4);
+ result = (*data - '0');
+ done = True;
+ }
+ else
+ {
+ fprintf (stderr,
+ "%s: unrecognised " MOZILLA_RESPONSE_PROP
+ " from window 0x%x: %s\n",
+ progname, (unsigned int) window, data);
+ result = 6;
+ done = True;
+ }
+
+ if (data)
+ XFree (data);
+ }
+#ifdef DEBUG_PROPS
+ else if (event.xany.type == PropertyNotify &&
+ event.xproperty.window == window &&
+ event.xproperty.state == PropertyDelete &&
+ event.xproperty.atom == XA_MOZILLA_COMMAND)
+ {
+ fprintf (stderr, "%s: (server 0x%x has accepted "
+ MOZILLA_COMMAND_PROP ".)\n",
+ progname, (unsigned int) window);
+ }
+#endif /* DEBUG_PROPS */
+ }
+
+ DONE:
+
+ if (new_command)
+ free (new_command);
+
+ return result;
+}
+
+int
+mozilla_remote_commands (Display *dpy, Window window, char **commands)
+{
+ Bool raise_p = True;
+ int status = 0;
+ mozilla_remote_init_atoms (dpy);
+
+ if (window == 0)
+ window = mozilla_remote_find_window (dpy);
+ else
+ mozilla_remote_check_window (dpy, window);
+#ifdef GLOBAL
+ if (window == 0)
+ return -1;
+#endif
+
+ XSelectInput (dpy, window, (PropertyChangeMask|StructureNotifyMask));
+
+ mozilla_remote_obtain_lock (dpy, window);
+
+ while (*commands)
+ {
+ if (!strcmp (*commands, "-raise"))
+ raise_p = True;
+ else if (!strcmp (*commands, "-noraise"))
+ raise_p = False;
+ else
+ status = mozilla_remote_command (dpy, window, *commands, raise_p);
+
+ if (status != 0)
+ break;
+ commands++;
+ }
+
+ /* When status = 6, it means the window has been destroyed */
+ /* It is invalid to free the lock when window is destroyed. */
+
+ if ( status != 6 )
+ mozilla_remote_free_lock (dpy, window);
+
+ return status;
+}
+
+
+#ifdef STANDALONE
+
+static void
+usage (void)
+{
+ fprintf (stderr, "usage: %s [ options ... ]\n\
+ where options include:\n\
+\n\
+ -help to show this message.\n\
+ -display <dpy> to specify the X server to use.\n\
+ -remote <remote-command> to execute a command in an already-running\n\
+ Netscape process. See the manual for a\n\
+ list of valid commands.\n\
+ -id <window-id> the id of an X window to which the -remote\n\
+ commands should be sent; if unspecified,\n\
+ the first window found will be used.\n\
+ -raise whether following -remote commands should\n\
+ cause the window to raise itself to the top\n\
+ (this is the default.)\n\
+ -noraise the opposite of -raise: following -remote\n\
+ commands will not auto-raise the window.\n\
+",
+ progname);
+}
+
+
+#ifdef GLOBAL
+int
+netscape_remote(int argc, char **argv)
+#else
+void
+main (int argc, char **argv)
+#endif
+{
+ Display *dpy;
+ char *dpy_string = 0;
+ char **remote_commands = 0;
+ int remote_command_count = 0;
+ int remote_command_size = 0;
+ unsigned long remote_window = 0;
+ Bool sync_p = False;
+ int i;
+
+ progname = strrchr (argv[0], '/');
+ if (progname)
+ progname++;
+ else
+ progname = argv[0];
+
+ /* Hack the -help and -version arguments before opening the display. */
+ for (i = 1; i < argc; i++)
+ {
+ if (!strcasecmp (argv [i], "-h") ||
+ !strcasecmp (argv [i], "-help"))
+ {
+ usage ();
+ exit (0);
+ }
+ else if (!strcmp (argv [i], "-d") ||
+ !strcmp (argv [i], "-dpy") ||
+ !strcmp (argv [i], "-disp") ||
+ !strcmp (argv [i], "-display"))
+ {
+ i++;
+ dpy_string = argv [i];
+ }
+ else if (!strcmp (argv [i], "-sync") ||
+ !strcmp (argv [i], "-synchronize"))
+ {
+ sync_p = True;
+ }
+ else if (!strcmp (argv [i], "-remote"))
+ {
+ if (remote_command_count == remote_command_size)
+ {
+ remote_command_size += 20;
+ remote_commands =
+ (remote_commands
+ ? realloc (remote_commands,
+ remote_command_size * sizeof (char *))
+ : calloc (remote_command_size, sizeof (char *)));
+ }
+ i++;
+ if (!argv[i] || *argv[i] == '-' || *argv[i] == 0)
+ {
+ fprintf (stderr, "%s: invalid `-remote' option \"%s\"\n",
+ progname, argv[i] ? argv[i] : "");
+ usage ();
+ exit (-1);
+ }
+ remote_commands [remote_command_count++] = argv[i];
+ }
+ else if (!strcmp (argv [i], "-raise") ||
+ !strcmp (argv [i], "-noraise"))
+ {
+ char *r = argv [i];
+ if (remote_command_count == remote_command_size)
+ {
+ remote_command_size += 20;
+ remote_commands =
+ (remote_commands
+ ? realloc (remote_commands,
+ remote_command_size * sizeof (char *))
+ : calloc (remote_command_size, sizeof (char *)));
+ }
+ remote_commands [remote_command_count++] = r;
+ }
+ else if (!strcmp (argv [i], "-id"))
+ {
+ char c;
+ if (remote_command_count > 0)
+ {
+ fprintf (stderr,
+ "%s: the `-id' option must preceed all `-remote' options.\n",
+ progname);
+ usage ();
+ exit (-1);
+ }
+ else if (remote_window != 0)
+ {
+ fprintf (stderr, "%s: only one `-id' option may be used.\n",
+ progname);
+ usage ();
+ exit (-1);
+ }
+ i++;
+ if (argv[i] &&
+ 1 == sscanf (argv[i], " %ld %c", &remote_window, &c))
+ ;
+ else if (argv[i] &&
+ 1 == sscanf (argv[i], " 0x%lx %c", &remote_window, &c))
+ ;
+ else
+ {
+ fprintf (stderr, "%s: invalid `-id' option \"%s\"\n",
+ progname, argv[i] ? argv[i] : "");
+ usage ();
+ exit (-1);
+ }
+ }
+ }
+
+ dpy = XOpenDisplay (dpy_string);
+ if (! dpy)
+ exit (-1);
+
+ if (sync_p)
+ XSynchronize (dpy, True);
+
+#ifdef GLOBAL
+ return mozilla_remote_commands (dpy, (Window) remote_window,
+ remote_commands);
+#else
+ exit (mozilla_remote_commands (dpy, (Window) remote_window,
+ remote_commands));
+#endif
+}
+
+#endif /* STANDALONE */
diff --git a/contrib/global/gozilla/vroot.h b/contrib/global/gozilla/vroot.h
new file mode 100644
index 0000000..e06c263
--- /dev/null
+++ b/contrib/global/gozilla/vroot.h
@@ -0,0 +1,119 @@
+/*****************************************************************************/
+/** Copyright 1991 by Andreas Stolcke **/
+/** Copyright 1990 by Solbourne Computer Inc. **/
+/** Longmont, Colorado **/
+/** **/
+/** All Rights Reserved **/
+/** **/
+/** Permission to use, copy, modify, and distribute this software and **/
+/** its documentation for any purpose and without fee is hereby **/
+/** granted, provided that the above copyright notice appear in all **/
+/** copies and that both that copyright notice and this permis- **/
+/** sion notice appear in supporting documentation, and that the **/
+/** name of Solbourne not be used in advertising **/
+/** in publicity pertaining to distribution of the software without **/
+/** specific, written prior permission. **/
+/** **/
+/** ANDREAS STOLCKE AND SOLBOURNE COMPUTER INC. DISCLAIMS ALL WARRANTIES **/
+/** WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF **/
+/** MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL ANDREAS STOLCKE **/
+/** OR SOLBOURNE BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL **/
+/** DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/
+/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/
+/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/
+/** OR PERFORMANCE OF THIS SOFTWARE. **/
+/*****************************************************************************/
+/*
+ * vroot.h -- Virtual Root Window handling header file
+ *
+ * This header file redefines the X11 macros RootWindow and DefaultRootWindow,
+ * making them look for a virtual root window as provided by certain `virtual'
+ * window managers like swm and tvtwm. If none is found, the ordinary root
+ * window is returned, thus retaining backward compatibility with standard
+ * window managers.
+ * The function implementing the virtual root lookup remembers the result of
+ * its last invocation to avoid overhead in the case of repeated calls
+ * on the same display and screen arguments.
+ * The lookup code itself is taken from Tom LaStrange's ssetroot program.
+ *
+ * Most simple root window changing X programs can be converted to using
+ * virtual roots by just including
+ *
+ * #include <X11/vroot.h>
+ *
+ * after all the X11 header files. It has been tested on such popular
+ * X clients as xphoon, xfroot, xloadimage, and xaqua.
+ * It also works with the core clients xprop, xwininfo, xwd, and editres
+ * (and is necessary to get those clients working under tvtwm).
+ * It does NOT work with xsetroot; get the xsetroot replacement included in
+ * the tvtwm distribution instead.
+ *
+ * Andreas Stolcke <stolcke@ICSI.Berkeley.EDU>, 9/7/90
+ * - replaced all NULL's with properly cast 0's, 5/6/91
+ * - free children list (suggested by Mark Martin <mmm@cetia.fr>), 5/16/91
+ * - include X11/Xlib.h and support RootWindowOfScreen, too 9/17/91
+ */
+
+#ifndef _VROOT_H_
+#define _VROOT_H_
+
+#include <X11/X.h>
+#include <X11/Xatom.h>
+#include <X11/Xlib.h>
+
+static Window
+VirtualRootWindowOfScreen(screen)
+ Screen *screen;
+{
+ static Screen *save_screen = (Screen *)0;
+ static Window root = (Window)0;
+
+ if (screen != save_screen) {
+ Display *dpy = DisplayOfScreen(screen);
+ Atom __SWM_VROOT = None;
+ int i;
+ Window rootReturn, parentReturn, *children;
+ unsigned int numChildren;
+
+ root = RootWindowOfScreen(screen);
+
+ /* go look for a virtual root */
+ __SWM_VROOT = XInternAtom(dpy, "__SWM_VROOT", False);
+ if (XQueryTree(dpy, root, &rootReturn, &parentReturn,
+ &children, &numChildren)) {
+ for (i = 0; i < numChildren; i++) {
+ Atom actual_type;
+ int actual_format;
+ unsigned long nitems, bytesafter;
+ Window *newRoot = (Window *)0;
+
+ if (XGetWindowProperty(dpy, children[i],
+ __SWM_VROOT, 0, 1, False, XA_WINDOW,
+ &actual_type, &actual_format,
+ &nitems, &bytesafter,
+ (unsigned char **) &newRoot) == Success
+ && newRoot) {
+ root = *newRoot;
+ break;
+ }
+ }
+ if (children)
+ XFree((char *)children);
+ }
+
+ save_screen = screen;
+ }
+
+ return root;
+}
+
+#undef RootWindowOfScreen
+#define RootWindowOfScreen(s) VirtualRootWindowOfScreen(s)
+
+#undef RootWindow
+#define RootWindow(dpy,screen) VirtualRootWindowOfScreen(ScreenOfDisplay(dpy,screen))
+
+#undef DefaultRootWindow
+#define DefaultRootWindow(dpy) VirtualRootWindowOfScreen(DefaultScreenOfDisplay(dpy))
+
+#endif /* _VROOT_H_ */
diff --git a/contrib/global/gtags/Makefile b/contrib/global/gtags/Makefile
index b45de63..803253c 100644
--- a/contrib/global/gtags/Makefile
+++ b/contrib/global/gtags/Makefile
@@ -1,9 +1,6 @@
-# @(#)Makefile 1.0 (Berkeley) 4/21/96
-
-MAN1= gtags.1
-
-beforeinstall:
- ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \
- ${.CURDIR}/gtags.pl ${DESTDIR}/usr/bin/gtags
+PROG= gtags
+CFLAGS+=-I${.CURDIR}/../lib -DGLOBAL -DYACC
+LDADD= $(LIBUTIL)
+DPADD= $(LIBUTIL)
.include <bsd.prog.mk>
diff --git a/contrib/global/gtags/Makefile.generic b/contrib/global/gtags/Makefile.generic
index 61a5d89..415d30f 100644
--- a/contrib/global/gtags/Makefile.generic
+++ b/contrib/global/gtags/Makefile.generic
@@ -1,13 +1,20 @@
-# @(#)Makefile 29-Dec-96
-
PROG = gtags
+CC = gcc
+LIBS = -L../lib -lutil -ldb
+CFLAGS = -O -I../lib -I/usr/include/db
+DEPLIBS= ../lib/libutil.a
+OBJS = gtags.o
BINDIR = /usr/bin
-MANDIR = /usr/share/man
+MANDIR = /usr/man
+
+all: $(PROG)
-all:
+$(PROG): $(OBJS) $(DEPLIBS)
+ $(CC) -o $(PROG) $(OBJS) $(LIBS)
install:
- cp $(PROG).pl $(BINDIR)/$(PROG)
+ cp $(PROG) $(BINDIR)
chmod 755 $(BINDIR)/$(PROG)
cp $(PROG).1 $(MANDIR)/man1
chmod 644 $(MANDIR)/man1/$(PROG).1
clean:
+ rm -f $(PROG) $(OBJS)
diff --git a/contrib/global/gtags/gtags.1 b/contrib/global/gtags/gtags.1
index c7fddf0..ed18616 100644
--- a/contrib/global/gtags/gtags.1
+++ b/contrib/global/gtags/gtags.1
@@ -28,59 +28,71 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd April 21, 1997
+.Dd Sep 12, 1997
.Dt GTAGS 1
.Os BSD 4
.Sh NAME
.Nm gtags
-.Nd create GTAGS, GRTAGS file
+.Nd create GTAGS, GRTAGS and GSYMS file
.Sh SYNOPSIS
.Nm gtags
-.Op Fl e
-.Op Fl s
+.Op Fl i
+.Op Fl o
+.Op Fl v
.Op Ar dbpath
.Sh DESCRIPTION
.Nm Gtags
-makes GTAGS, GRTAGS files for global(1).
+makes GTAGS, GRTAGS and GSYMS file for
+.Xr global 1 .
.Nm Gtags
trace subdirectories, read source files,
-locate the functions and save the information into tag files.
+locate symbols and save the information into tag files.
C, yacc and assembler source files are supported.
You should execute this command at the root of the source tree.
.Pp
If your source directory is on a read only device like CDROM, specify
.Ar dbpath
-of the directory on which make tags files.
+of the directory on which make tag files.
.Pp
.Bl -tag -width Ds
-.It Fl e
-force a function to end when reach a '}' at the first column in C source file.
-.It Fl s
-treat assembler source file (*.s, *.S).
+.It Fl i
+update tag files incrementally by files which modified after the tag files were
+last updated.
+.It Fl o
+suppress making GSYMS file.
+Use this option if you don't use -s option of
+.Xr global 1 .
+.It Fl v
+verbose mode.
.Sh FILES
.Bl -tag -width tags -compact
.It Pa GTAGS
-tags file for function definitions.
+tag file for function definitions.
.It Pa GRTAGS
-tags file for function references.
+tag file for function references.
+.It Pa GSYMS
+tag file for other symbols.
.El
.Sh DIAGNOSTICS
.Nm Gtags
-exits with a value of 1 if an error occurred, 0 otherwise.
+exits with a non 0 value if an error occurred, 0 otherwise.
.Sh SEE ALSO
.Xr btreeop 1 ,
-.Xr gctags 1 ,
.Xr global 1 ,
-.Xr htags 1 .
+.Xr htags 1 ,
+.Xr vi 1 .
.Sh BUG
-GTAGS, GRTAGS are very large. In advance, check the space of your disk.
-
+GTAGS, GRTAGS and GSYMS are very large.
+In advance of using this command, check the space of your disk.
+.br
Assembler support is far from completeness. It extracts only ENTRY()
and ALTENTRY() from source file. Probably valid only for FreeBSD and Linux
kernel source.
+.br
+There is no concurrency control about tag files.
.Sh AUTHORS
Shigio Yamaguchi (shigio@wafu.netgate.net)
.Sh HISTORY
The
.Nm
-command appeared in FreeBSD 2.2.
+command appeared in FreeBSD 2.2.2.
diff --git a/contrib/global/gtags/gtags.c b/contrib/global/gtags/gtags.c
new file mode 100644
index 0000000..ef4a8e9
--- /dev/null
+++ b/contrib/global/gtags/gtags.c
@@ -0,0 +1,302 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * gtags.c 12-Dec-97
+ *
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include "global.h"
+
+char *progname = "gtags"; /* command name */
+
+static void usage __P((void));
+void main __P((int, char **));
+int incremental __P((char *));
+void tagadd __P((int, char *));
+void createtags __P((char *, int));
+char *current __P(());
+
+static int iflag;
+static int oflag;
+static int vflag;
+static int Dflag;
+static int Rflag;
+
+static void
+usage()
+{
+ fprintf(stderr, "usage:\t%s [-i][-o][-v][dbpath]\n", progname);
+ exit(1);
+}
+
+void
+main(argc, argv)
+int argc;
+char *argv[];
+{
+ char dbpath[MAXPATHLEN+1];
+ char env[MAXENVLEN+1];
+ char *path, *p;
+ FILE *ip;
+ int db;
+
+ while (--argc > 0 && (++argv)[0][0] == '-') {
+ for (p = argv[0] + 1; *p; p++) {
+ switch (*p) {
+ case 'i':
+ iflag++;
+ break;
+ case 'o':
+ oflag++;
+ break;
+ case 'v':
+ vflag++;
+ break;
+ /* for compatibility */
+ case 's':
+ case 'e':
+ break;
+ default:
+ usage();
+ }
+ }
+ }
+ if (argc > 0) {
+ strcpy(dbpath, *argv);
+ } else {
+ if (!getcwd(dbpath, MAXPATHLEN))
+ die("cannot get current directory.");
+ }
+ if (!strcmp(dbpath, "/"))
+ die("It's root directory! What are you doing?");
+ if (!test("d", dbpath))
+ die1("directory '%s' not found.", dbpath);
+ if (vflag)
+ fprintf(stderr, "[%s] Gtags started\n", current());
+ /*
+ * teach gctags(1) where is dbpath.
+ */
+ sprintf(env, "GTAGSDBPATH=%s", dbpath);
+ putenv(env);
+ /*
+ * incremental update.
+ */
+ if (iflag && test("f", makepath(dbpath, dbname(GTAGS))) &&
+ test("f", makepath(dbpath, dbname(GRTAGS))))
+ {
+ (void)incremental(dbpath);
+ exit(0);
+ }
+ if (iflag && vflag)
+ fprintf(stderr, " GTAGS and GRTAGS not found. -i option ignored.\n");
+ /*
+ * create GTAGS, GRTAGS and GSYMS
+ */
+ for (db = GTAGS; db < GTAGLIM; db++) {
+ if (oflag && db == GSYMS)
+ continue;
+ if (vflag)
+ fprintf(stderr, "[%s] Creating '%s'.\n", current(), dbname(db));
+ createtags(dbpath, db);
+ }
+
+ if (vflag)
+ fprintf(stderr, "[%s] Done.\n", current());
+ exit(0);
+}
+/*
+ * incremental: incremental update
+ *
+ * i) dbpath dbpath directory
+ * r) 0: not updated, 1: updated
+ */
+int
+incremental(dbpath)
+char *dbpath;
+{
+ struct stat sb;
+ time_t gtags_mtime;
+ int updated = 0;
+ char *path;
+ int db;
+
+ if (vflag) {
+ fprintf(stderr, " Tag found in '%s'.\n", dbpath);
+ fprintf(stderr, " Incremental update.\n");
+ }
+ /*
+ * get modified time of GTAGS.
+ */
+ path = makepath(dbpath, dbname(GTAGS));
+ if (stat(path, &sb) < 0)
+ die1("stat failed '%s'.", path);
+ gtags_mtime = sb.st_mtime;
+
+ for (findopen(); path = findread(NULL); ) {
+ if (stat(path, &sb) < 0)
+ die1("stat failed '%s'.", path);
+ /*
+ * only the path modified after GTAGS was modified.
+ */
+ if (gtags_mtime < sb.st_mtime) {
+ updated = 1;
+ if (vflag)
+ fprintf(stderr, " Updating tags of '%s' ...", path + 2);
+ for (db = GTAGS; db < GTAGLIM; db++) {
+ if (db == GSYMS && !test("f", makepath(dbpath, dbname(db))))
+ continue;
+ if (vflag)
+ fprintf(stderr, "%s", dbname(db));
+ tagopen(dbpath, db, 2);
+ /*
+ * GTAGS needed to make GRTAGS.
+ */
+ if (db == GRTAGS)
+ lookupopen(dbpath);
+ tagdelete(path);
+ if (vflag)
+ fprintf(stderr, "..");
+ tagadd(db, path);
+ if (db == GRTAGS)
+ lookupclose();
+ tagclose();
+ }
+ if (vflag)
+ fprintf(stderr, " Done.\n");
+ }
+ }
+ findclose();
+ if (vflag) {
+ if (updated)
+ fprintf(stderr, " Global databases have been modified.\n");
+ else
+ fprintf(stderr, " Global databases are up to date.\n");
+ fprintf(stderr, "[%s] Done.\n", current());
+
+ fprintf(stderr, " Done.\n");
+ }
+ return updated;
+}
+/*
+ * tagadd: add records which has specified path.
+ *
+ * i) db 0: GTAGS, 1: GRTAGS, 2: GSYMS
+ * i) path source file
+ */
+void
+tagadd(db, path)
+int db;
+char *path;
+{
+ char *tagline, *p, *q;
+ char key[IDENTLEN+1];
+ FILE *ip;
+
+ stropen();
+ /*
+ * make command line.
+ */
+ strputs("gctags -Dex");
+ if (db == GRTAGS)
+ strputs("r");
+ if (db == GSYMS)
+ strputs("sc");
+ strputc(' ');
+ strputs(path);
+ p = strclose();
+ if (!(ip = popen(p, "r")))
+ die1("cannot execute '%s'.", p);
+ while (tagline = mgets(ip, 0, NULL)) {
+ p = tagline;
+ q = key;
+ while (*p && !isspace(*p))
+ *q++ = *p++;
+ *q = 0;
+ tagput(key, tagline);
+ }
+ pclose(ip);
+}
+/*
+ * createtags: create tags file
+ *
+ * i) dbpath dbpath directory
+ * i) db GTAGS, GRTAGS, GSYMS
+ */
+void
+createtags(dbpath, db)
+char *dbpath;
+int db;
+{
+ char *path;
+
+ /*
+ * GTAGS needed to make GRTAGS.
+ */
+ if (db == GRTAGS)
+ lookupopen(dbpath);
+ tagopen(dbpath, db, 1);
+ for (findopen(); path = findread(NULL); ) {
+ /*
+ * GRTAGS and GSYMS doesn't treat asembler.
+ */
+ if (db != GTAGS) {
+ char *p = path + strlen(path) - 1;
+ if ((*p == 's' || *p == 'S') && *(p - 1) == '.')
+ continue;
+ }
+ if (vflag)
+ fprintf(stderr, " extracting tags of %s.\n", path);
+ tagadd(db, path);
+ }
+ findclose();
+ tagclose();
+ if (db == GRTAGS)
+ lookupclose();
+}
+/*
+ * current: current date and time
+ *
+ * r) date and time
+ */
+#include <time.h>
+char *
+current()
+{
+ static char buf[80];
+ time_t tval;
+
+ if (time(&tval) == -1)
+ die("cannot get current time.");
+ (void)strftime(buf, sizeof(buf), "%+", localtime(&tval));
+
+ return buf;
+}
diff --git a/contrib/global/htags/Makefile b/contrib/global/htags/Makefile
index f53639a..f02d082 100644
--- a/contrib/global/htags/Makefile
+++ b/contrib/global/htags/Makefile
@@ -1,9 +1,7 @@
-# @(#)Makefile 1.0 (Berkeley) 4/21/96
-
MAN1= htags.1
beforeinstall:
${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \
- ${.CURDIR}/htags.pl ${DESTDIR}/usr/bin/htags
+ ${.CURDIR}/htags.pl ${DESTDIR}${BINDIR}/htags
.include <bsd.prog.mk>
diff --git a/contrib/global/htags/Makefile.generic b/contrib/global/htags/Makefile.generic
index 18a584a..d782f43 100644
--- a/contrib/global/htags/Makefile.generic
+++ b/contrib/global/htags/Makefile.generic
@@ -1,8 +1,6 @@
-# @(#)Makefile 29-Dec-96
-
PROG = htags
BINDIR = /usr/bin
-MANDIR = /usr/share/man
+MANDIR = /usr/man
all:
install:
diff --git a/contrib/global/htags/htags.pl b/contrib/global/htags/htags.pl
index 7738f51..3ac1207 100644
--- a/contrib/global/htags/htags.pl
+++ b/contrib/global/htags/htags.pl
@@ -29,12 +29,11 @@
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
-# htags.pl 7-Jul-97
+# htags.pl 31-Oct-97
#
$com = $0;
$com =~ s/.*\///;
-$usage = "usage: $com [-a][-f][-l][-n][-v][-w][-t title][-d tagdir][dir]";
-$ENV{'PATH'} = '/bin:/usr/bin';
+$usage = "usage: $com [-a][-f][-l][-n][-v][-w][-t title][-d tagdir][dir]\n";
#-------------------------------------------------------------------------
# CONFIGURATION
#-------------------------------------------------------------------------
@@ -95,6 +94,7 @@ $rewrite_href_files =
#-------------------------------------------------------------------------
# UTIRITIES
#-------------------------------------------------------------------------
+$findcom = "find . \\( -type f -o -type l \\) -name '*.[chysS]' -print";
sub getcwd {
local($dir) = `/bin/pwd`;
chop($dir);
@@ -106,9 +106,9 @@ sub date {
$date;
}
sub error {
- local($msg) = @_;
&clean();
- die "$com: " . $msg;
+ printf STDERR "$com: $_[0]\n";
+ exit 1;
}
sub clean {
&anchor'finish();
@@ -120,19 +120,14 @@ sub escape {
}
sub usable {
local($com) = @_;
-
- foreach $path (split(/:/, $ENV{'PATH'})) {
- if (-x "$path/$com") {
- return 1;
- }
+ foreach (split(/:/, $ENV{'PATH'})) {
+ return 1 if (-x "$_/$com");
}
return 0;
}
sub copy {
local($from, $to) = @_;
- local($ret);
-
- $ret = system("cp $from $to");
+ local($ret) = system("cp $from $to");
$ret = $ret / 256;
$ret = ($ret == 0) ? 1 : 0;
$ret;
@@ -141,21 +136,21 @@ sub copy {
# PROCESS START
#-------------------------------------------------------------------------
#
-# options check ($sflag is set internally)
+# options check.
#
-$aflag = $cflag = $fflag = $lflag = $nflag = $vflag = $wflag = $sflag = '';
+$aflag = $fflag = $lflag = $nflag = $vflag = $wflag = '';
while ($ARGV[0] =~ /^-/) {
$opt = shift;
if ($opt =~ /[^-aflnvwtd]/) {
- print STDERR "$usage\n";
+ print STDERR $usage;
exit 1;
}
- if ($opt =~ /a/) { $aflag = 1; }
- if ($opt =~ /f/) { $fflag = 1; }
- if ($opt =~ /l/) { $lflag = 1; }
- if ($opt =~ /n/) { $nflag = 1; }
- if ($opt =~ /v/) { $vflag = 1; }
- if ($opt =~ /w/) { $wflag = 1; }
+ if ($opt =~ /a/) { $aflag = 'a'; }
+ if ($opt =~ /f/) { $fflag = 'f'; }
+ if ($opt =~ /l/) { $lflag = 'l'; }
+ if ($opt =~ /n/) { $nflag = 'n'; }
+ if ($opt =~ /v/) { $vflag = 'v'; }
+ if ($opt =~ /w/) { $wflag = 'w'; }
if ($opt =~ /t/) {
$opt = shift;
last if ($opt eq '');
@@ -170,11 +165,9 @@ if (!$title) {
@cwd = split('/', &getcwd);
$title = $cwd[$#cwd];
}
-if (!$dbpath) {
- $dbpath = &getcwd();
-}
+$dbpath = &getcwd() if (!$dbpath);
unless (-r "$dbpath/GTAGS" && -r "$dbpath/GRTAGS") {
- &error("GTAGS and GRTAGS not found. please type 'gtags[RET]'\n");
+ &error("GTAGS and GRTAGS not found. please type 'gtags[RET]'");
}
#
# recognize format version
@@ -182,7 +175,7 @@ unless (-r "$dbpath/GTAGS" && -r "$dbpath/GRTAGS") {
#
$support_version = 1; # I can understand this format version
#
-open(GTAGS, "btreeop -K ' __.VERSION' $dbpath/GTAGS |") || die "$com: GTAGS not found.\n";
+open(GTAGS, "btreeop -K ' __.VERSION' $dbpath/GTAGS |") || &error("GTAGS not found.");
$rec = <GTAGS>;
close(GTAGS);
if ($rec =~ /^ __\.VERSION[ \t]+([0-9]+)$/) {
@@ -191,7 +184,7 @@ if ($rec =~ /^ __\.VERSION[ \t]+([0-9]+)$/) {
$format_version = 1;
}
if ($format_version != $support_version) {
- die "$com: GTAGS format version unmatched. Please remake it.\n";
+ &error("GTAGS format version unmatched. Please remake it.");
}
#
# check directories
@@ -200,36 +193,23 @@ $html = &getcwd() . '/HTML';
if ($ARGV[0]) {
$cwd = &getcwd();
unless (-w $ARGV[0]) {
- &error("$ARGV[0] is not writable directory.\n");
+ &error("'$ARGV[0]' is not writable directory.");
}
- chdir($ARGV[0]) || &error("directory $ARGV[0] not found.\n");
+ chdir($ARGV[0]) || &error("directory '$ARGV[0]' not found.");
$html = &getcwd() . '/HTML';
- chdir($cwd) || &error("cannot return directory.\n");
-}
-#
-# set sflag if *.[sS] are included.
-#
-open(CHECK, "btreeop $dbpath/GTAGS |") || &error("btreeop $dbpath/GTAGS failed.\n");
-while (<CHECK>) {
- local($tag, $lno, $filename) = split;
- if ($filename =~ /\.[sS]$/) {
- $'sflag = 1;
- last;
- }
+ chdir($cwd) || &error("cannot return to original directory.");
}
-close(CHECK);
#
# check if GTAGS, GRTAGS is the latest.
#
$gtags_ctime = (stat("$dbpath/GTAGS"))[10];
-open(FIND, "find . -type f -name '*.[chysS]' -print |") || &error("cannot exec find.\n");
+open(FIND, "$findcom |") || &error("cannot exec find.");
while (<FIND>) {
chop;
next if /(y\.tab\.c|y\.tab\.h)$/;
- next if (!$'sflag && /\.[sS]$/);
next if /(\/SCCS\/|\/RCS\/)/;
if ($gtags_ctime < (stat($_))[10]) {
- print STDERR "Caution: GTAGS is not the latest one. You had better make new one.\n";
+ &error("GTAGS is not the latest one. Please remake it.");
}
}
close(FIND);
@@ -253,24 +233,24 @@ print STDERR "[", &date, "] ", "Htags started\n" if ($vflag);
#
# (0) make directories
#
-print STDERR "[", &date, "] ", "(1) making directories ...\n" if ($vflag);
-mkdir($html, 0777) || &error("cannot make directory <$html>.\n") if (! -d $html);
+print STDERR "[", &date, "] ", "(0) making directories ...\n" if ($vflag);
+mkdir($html, 0777) || &error("cannot make directory '$html'.") if (! -d $html);
foreach $d ($SRCS, $INCS, $DEFS, $REFS, files, funcs) {
- mkdir("$html/$d", 0775) || &error("cannot make HTML directory\n") if (! -d "$html/$d");
+ mkdir("$html/$d", 0775) || &error("cannot make HTML directory") if (! -d "$html/$d");
}
if ($fflag) {
- mkdir("$html/cgi-bin", 0775) || &error("cannot make cgi-bin directory\n") if (! -d "$html/cgi-bin");
+ mkdir("$html/cgi-bin", 0775) || &error("cannot make cgi-bin directory") if (! -d "$html/cgi-bin");
}
#
# (1) make CGI program
#
if ($fflag) {
print STDERR "[", &date, "] ", "(1) making CGI program ...\n" if ($vflag);
- &makeprogram("$html/cgi-bin/global.cgi") || &error("cannot make CGI program.\n");
- chmod(0755, "$html/cgi-bin/global.cgi") || &error("cannot chmod CGI program.\n");
+ &makeprogram("$html/cgi-bin/global.cgi") || &error("cannot make CGI program.");
+ chmod(0755, "$html/cgi-bin/global.cgi") || &error("cannot chmod CGI program.");
unlink("$html/cgi-bin/GTAGS", "$html/cgi-bin/GRTAGS");
- link("$dbpath/GTAGS", "$html/cgi-bin/GTAGS") || &copy("$dbpath/GTAGS", "$html/cgi-bin/GTAGS") || &error("cannot copy GTAGS.\n");;
- link("$dbpath/GRTAGS", "$html/cgi-bin/GRTAGS") || &copy("$dbpath/GRTAGS", "$html/cgi-bin/GRTAGS") || &error("cannot copy GRTAGS.\n");;
+ link("$dbpath/GTAGS", "$html/cgi-bin/GTAGS") || &copy("$dbpath/GTAGS", "$html/cgi-bin/GTAGS") || &error("cannot copy GTAGS.");
+ link("$dbpath/GRTAGS", "$html/cgi-bin/GRTAGS") || &copy("$dbpath/GRTAGS", "$html/cgi-bin/GRTAGS") || &error("cannot copy GRTAGS.");
}
#
# (2) make help file
@@ -342,7 +322,7 @@ exit 0;
sub makeprogram {
local($file) = @_;
- open(PROGRAM, ">$file") || &error("cannot make CGI program.\n");
+ open(PROGRAM, ">$file") || &error("cannot make CGI program.");
$program = <<'END_OF_SCRIPT';
#!/usr/bin/perl
#------------------------------------------------------------------
@@ -377,6 +357,7 @@ $flag = ($form{'type'} eq 'definition') ? '' : 'r';
$words = ($form{'type'} eq 'definition') ? 'definitions' : 'referencies';
print "<H1><FONT COLOR=#cc0000>\"$pattern\"</FONT></H1>\n";
print "Following $words are matched to above pattern.<HR>\n";
+$pattern =~ s/'//g; # to shut security hole
unless (open(PIPE, "/usr/bin/global -x$flag '$pattern' |")) {
print "<H3>Cannot execute global. <A HREF=../mains.html>[return]</A></H3>\n";
print "</HTML>\n";
@@ -415,7 +396,7 @@ END_OF_SCRIPT
sub makehelp {
local($file) = @_;
- open(HELP, ">$file") || &error("cannot make help file.\n");
+ open(HELP, ">$file") || &error("cannot make help file.");
print HELP "<HTML>\n<HEAD><TITLE>HELP</TITLE></HEAD>\n<BODY>\n";
print HELP "<H2>Usage of Links</H2>\n";
print HELP "<PRE>/* [&lt;][&gt;][^][v] [top][bottom][index][help] */</PRE>\n";
@@ -458,7 +439,7 @@ sub makedupindex {
local($writing) = 0;
$count = 0;
- open(LIST, "btreeop $dbpath/$db | sort +0 -1 +2 -3 +1n -2|") || &error("btreeop $dbpath/$db | sort +0 -1 +2 -3 +1n -2 failed.\n");
+ open(LIST, "btreeop $dbpath/$db | sort +0 -1 +2 -3 +1n -2|") || &error("btreeop $dbpath/$db | sort +0 -1 +2 -3 +1n -2 failed.");
while (<LIST>) {
chop;
local($tag, $lno, $filename) = split;
@@ -481,7 +462,7 @@ sub makedupindex {
if ($first_line) {
&cache'put($db, $tag, '');
local($type) = ($db eq 'GTAGS') ? $DEFS : $REFS;
- open(FILE, ">$html/$type/$tag.html") || &error("cannot make file <$html/$type/$tag.html>.\n");
+ open(FILE, ">$html/$type/$tag.html") || &error("cannot make file '$html/$type/$tag.html'.");
$writing = 1;
print FILE "<HTML>\n<HEAD><TITLE>$tag</TITLE></HEAD>\n<BODY>\n";
print FILE "<PRE>\n";
@@ -516,13 +497,13 @@ sub makefuncindex {
local($file, $total) = @_;
local($count) = 0;
- open(FUNCTIONS, ">$file") || &error("cannot make function index <$file>.\n");
+ open(FUNCTIONS, ">$file") || &error("cannot make function index '$file'.");
print FUNCTIONS "<HTML>\n<HEAD><TITLE>FUNCTION INDEX</TITLE>\n";
print FUNCTIONS "$begin_script$defaultview$end_script</HEAD>\n<BODY>\n";
print FUNCTIONS "<H2>FUNCTION INDEX</H2>\n";
print FUNCTIONS "<OL>\n" if (!$aflag);
local($old) = select(FUNCTIONS);
- open(TAGS, "btreeop -L $dbpath/GTAGS |") || &error("btreeop -L $dbpath/GTAGS failed.\n");
+ open(TAGS, "btreeop -L $dbpath/GTAGS |") || &error("btreeop -L $dbpath/GTAGS failed.");
local($alpha) = '';
@funcs = (); # [A][B][C]...
while (<TAGS>) {
@@ -540,7 +521,7 @@ sub makefuncindex {
}
$alpha = substr($tag, 0, 1);
push(@funcs, "<A HREF=funcs/$alpha.html TARGET=_self>[$alpha]</A>\n");
- open(ALPHA, ">$html/funcs/$alpha.html") || &error("cannot make alphabetical function index.\n");
+ open(ALPHA, ">$html/funcs/$alpha.html") || &error("cannot make alphabetical function index.");
print ALPHA "<HTML>\n<HEAD><TITLE>$alpha</TITLE>\n";
print ALPHA "$begin_script$defaultview$end_script";
print ALPHA "</HEAD>\n<BODY>\n<H2>[$alpha]</H2>\n";
@@ -586,18 +567,17 @@ sub makefileindex {
local($file, $incdir) = @_;
local($count) = 0;
- open(FILES, ">$file") || &error("cannot make file <$file>.\n");
+ open(FILES, ">$file") || &error("cannot make file '$file'.");
print FILES "<HTML>\n<HEAD><TITLE>FILES</TITLE>\n";
print FILES "$begin_script$defaultview$end_script";
print FILES "</HEAD>\n<BODY>\n<H2>FILE INDEX</H2>\n";
print FILES "<OL>\n";
local($old) = select(FILES);
- open(FIND, "find . -type f -name '*.[chysS]' -print | sort |") || &error("cannot exec find.\n");
+ open(FIND, "$findcom | sort |") || &error("cannot exec find.");
local($lastdir) = '';
@files = ();
while (<FIND>) {
next if /(y\.tab\.c|y\.tab\.h)$/;
- next if (!$'sflag && /\.[sS]$/);
next if /(\/SCCS\/|\/RCS\/)/;
$count++;
@@ -623,7 +603,7 @@ sub makefileindex {
}
if ($dir) {
push(@files, "<LI><A HREF=files/$dir.html TARGET=_self>$dir/</A>\n");
- open(DIR, ">$html/files/$dir.html") || &error("cannot make directory index.\n");
+ open(DIR, ">$html/files/$dir.html") || &error("cannot make directory index.");
print DIR "<HTML>\n<HEAD><TITLE>$dir/</TITLE>\n";
print DIR "$begin_script$defaultview$end_script";
print DIR "</HEAD>\n<BODY>\n<H2>$dir/</H2>\n";
@@ -668,7 +648,7 @@ sub makefileindex {
foreach $last (keys %includes) {
local(@incs) = split(/\n/, $includes{$last});
if (@incs > 1) {
- open(INCLUDE, ">$incdir/$last.html") || &error("cannot open file '$incdir/$last.html'.\n");
+ open(INCLUDE, ">$incdir/$last.html") || &error("cannot open file '$incdir/$last.html'.");
print INCLUDE "<HTML>\n<HEAD><TITLE>$last</TITLE></HEAD>\n<BODY>\n<PRE>\n";
foreach $filename (@incs) {
local($path) = $filename;
@@ -715,7 +695,7 @@ sub makecommonpart {
}
$index .= "<H2>MAINS</H2>\n";
$index .= "<PRE>\n";
- open(PIPE, "btreeop -K main $dbpath/GTAGS | sort +0 -1 +2 -3 +1n -2|") || &error("btreeop -K main $dbpath/GTAGS failed.\n");
+ open(PIPE, "btreeop -K main $dbpath/GTAGS | sort +0 -1 +2 -3 +1n -2|") || &error("btreeop -K main $dbpath/GTAGS failed.");
while (<PIPE>) {
local($nouse, $lno, $filename) = split;
$nouse = ''; # to make perl quiet
@@ -751,7 +731,7 @@ sub makecommonpart {
sub makeindex {
local($file, $title, $index) = @_;
- open(FRAME, ">$file") || &error("cannot open file <$file>.\n");
+ open(FRAME, ">$file") || &error("cannot open file '$file'.");
print FRAME "<HTML>\n<HEAD><TITLE>$title</TITLE></HEAD>\n";
print FRAME "<FRAMESET COLS='200,*'>\n";
print FRAME "<NOFRAME>\n$index</NOFRAME>\n";
@@ -773,7 +753,7 @@ sub makeindex {
sub makemainindex {
local($file, $index) = @_;
- open(INDEX, ">$file") || &error("cannot create file <$file>.\n");
+ open(INDEX, ">$file") || &error("cannot create file '$file'.");
print INDEX "<HTML>\n<HEAD><TITLE>MAINS</TITLE></HEAD>\n";
print INDEX "<BODY>\n$index</BODY>\n</HTML>\n";
close(INDEX);
@@ -787,10 +767,9 @@ sub makehtml {
local($total) = @_;
local($count) = 0;
- open(FIND, "find . -type f -name '*.[chysS]' -print|") || &error("cannot exec find.\n");
+ open(FIND, "$findcom |") || &error("cannot exec find.");
while (<FIND>) {
next if /y\.tab\.c|y\.tab\.h/;
- next if (!$'sflag && /\.[sS]$/);
next if /(\/SCCS\/|\/RCS\/)/;
$count++;
@@ -821,14 +800,14 @@ sub src2html {
local($expand) = &'usable('expand') ? 'expand' : 'cat';
local(%ctab) = ('&', '&amp;', '<', '&lt;', '>', '&gt;');
- open(HTML, ">$html") || &'error("cannot create file <$html>.\n");
+ open(HTML, ">$html") || &'error("cannot create file '$html'.");
local($old) = select(HTML);
#
# load tags belonging to this file.
#
$file =~ s/^\.\///;
&anchor'load($file);
- open(C, "$expand '$file' |") || &'error("cannot open file <$file>.\n");
+ open(C, "$expand '$file' |") || &'error("cannot open file '$file'.");
#
# print the header
#
@@ -1053,18 +1032,26 @@ package anchor;
#
# create: create anchors temporary database
#
+# go) %PATHLIST
+#
sub create {
$ANCH = "$'tmp/ANCH$$";
- open(ANCH, ">$ANCH") || &'error("cannot create file $ANCH.\n");
+ open(ANCH, ">$ANCH") || &'error("cannot create file '$ANCH'.");
close(ANCH);
chmod ($ANCH, 0600);
- open(ANCH, "| btreeop -C $ANCH") || &'error("btreeop -C $ANCH failed.\n");
+ open(ANCH, "| btreeop -C $ANCH") || &'error("btreeop -C $ANCH failed.");
+ local($fcount) = 1;
+ local($fnumber);
foreach $db ('GTAGS', 'GRTAGS') {
local($type) = ($db eq 'GTAGS') ? 'D' : 'R';
- open(PIPE, "btreeop $'dbpath/$db |") || &'error("btreeop $'dbpath/$db failed.\n");
+ open(PIPE, "btreeop $'dbpath/$db |") || &'error("btreeop $'dbpath/$db failed.");
while (<PIPE>) {
local($tag, $lno, $filename) = split;
- print ANCH "$filename $lno $tag $type\n";
+ $fnumber = $PATHLIST{$filename};
+ if (!$fnumber) {
+ $PATHLIST{$filename} = $fnumber = $fcount++;
+ }
+ print ANCH "$fnumber $lno $tag $type\n";
}
close(PIPE);
}
@@ -1080,25 +1067,31 @@ sub finish {
# load: load anchors in a file from database
#
# i) $file source file
+# gi) %PATHLIST
# go) FIRST first definition
# go) LAST last definition
#
sub load {
local($file) = @_;
-
- $file = './' . $file if ($file !~ /^\.\//);
+ local($fnumber);
@ANCHORS = ();
- open(ANCH, "btreeop -K $file $ANCH |") || &'error("btreeop -K $file $ANCH failed.\n");
+ $FIRST = $LAST = 0;
+
+ $file = './' . $file if ($file !~ /^\.\//);
+ if (!($fnumber = $PATHLIST{$file})) {
+ return;
+ }
+ open(ANCH, "btreeop -K $fnumber $ANCH |") || &'error("btreeop -K $file $ANCH failed.");
$n = 0;
while (<ANCH>) {
- local($filename, $lno, $tag, $type) = split;
+ local($fnumber, $lno, $tag, $type) = split;
local($line);
# don't refer to macros which is defined in other C source.
if ($type eq 'R' && ($line = &cache'get('GTAGS', $tag))) {
local($nouse1, $nouse2, $f, $def) = split(/[ \t]+/, $line);
- if ($f !~ /\.h$/ && $f !~ $filename && $def =~ /^#/) {
- print STDERR "Information: $filename $lno $tag($type) skipped, because this is a macro which is defined in other C source.\n" if ($'wflag);
+ if ($f !~ /\.h$/ && $f !~ $file && $def =~ /^#/) {
+ print STDERR "Information: $file $lno $tag($type) skipped, because this is a macro which is defined in other C source.\n" if ($'wflag);
next;
}
}
@@ -1112,7 +1105,6 @@ $n = 0;
sub compare { $keys[$a] <=> $keys[$b]; }
@ANCHORS = @ANCHORS[sort compare 0 .. $#keys];
local($c);
- $FIRST = $LAST = 0;
for ($c = 0; $c < @ANCHORS; $c++) {
local($lno, $tag, $type) = split(/,/, $ANCHORS[$c]);
if ($type eq 'D') {
@@ -1244,7 +1236,7 @@ sub put {
$cachecount++;
if ($cachesize >= 0 && $cachecount > $cachesize) {
$CACH = "$'tmp/CACH$$";
- dbmopen(%CACH, $CACH, 0600) || &'error("make cache database.\n");
+ dbmopen(%CACH, $CACH, 0600) || &'error("make cache database.");
$cachesize = -1;
}
$CACH{$label.$tag} = $line;
diff --git a/contrib/global/lib/Makefile b/contrib/global/lib/Makefile
new file mode 100644
index 0000000..99d49ef
--- /dev/null
+++ b/contrib/global/lib/Makefile
@@ -0,0 +1,8 @@
+LIB= util
+SRCS= tag.o tab.o strop.o mgets.o lookup.o gtagsopen.o getdbpath.o \
+ find.o dbname.o dbio.o test.o makepath.o locatestring.o
+NOPROFILE= yes
+install:
+ @echo -n
+
+.include <bsd.lib.mk>
diff --git a/contrib/global/lib/Makefile.generic b/contrib/global/lib/Makefile.generic
new file mode 100644
index 0000000..2cd87fb
--- /dev/null
+++ b/contrib/global/lib/Makefile.generic
@@ -0,0 +1,14 @@
+LIB = libutil.a
+CC = gcc
+AR = ar
+CFLAGS = -O -I../lib -I/usr/include/db
+OBJS = tag.o tab.o strop.o mgets.o lookup.o gtagsopen.o getdbpath.o \
+ find.o dbname.o dbio.o test.o makepath.o locatestring.o
+all: $(LIB)
+
+$(LIB): $(OBJS)
+ $(AR) cq $(LIB) $(OBJS)
+install:
+ @echo -n
+clean:
+ rm -f $(LIB) $(OBJS)
diff --git a/contrib/global/lib/dbio.c b/contrib/global/lib/dbio.c
new file mode 100644
index 0000000..c569782
--- /dev/null
+++ b/contrib/global/lib/dbio.c
@@ -0,0 +1,322 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redilogibution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redilogibutions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redilogibutions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the dilogibution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * dbio.c 14-Dec-97
+ *
+ */
+#include <stdlib.h>
+#include <fcntl.h>
+#include "dbio.h"
+#include "die.h"
+
+DBT key; /* key of record */
+DBT dat; /* data of record */
+/*
+ * db_open: open db database.
+ *
+ * i) dbname database name
+ * i) mode 0: read only, 1: write only, 2: read & write
+ * i) perm file permission
+ * i) flags
+ * DBIO_DUP: allow duplicate records.
+ * DBIO_REMOVE: remove on closed.
+ * r) descripter for db_xxx()
+ *
+ * db_open leaves database permission 0600. please chmod(2) to make public.
+ */
+DBIO *
+db_open(dbname, mode, perm, flags)
+char *dbname;
+int mode;
+int perm;
+int flags;
+{
+ DB *db;
+ int rw;
+ BTREEINFO info;
+ DBIO *dbio;
+
+ /*
+ * setup argments.
+ */
+ if (mode == 0)
+ rw = O_RDONLY;
+ else if (mode == 1)
+ rw = O_RDWR|O_CREAT|O_TRUNC;
+ else if (mode == 2)
+ rw = O_RDWR;
+ else
+ die("db_open illegal mode.");
+ info.flags = (flags & DBIO_DUP) ? R_DUP : 0;
+ info.cachesize = 500000;
+ info.maxkeypage = 0;
+ info.minkeypage = 0;
+ info.psize = 0;
+ info.compare = NULL;
+ info.prefix = NULL;
+ info.lorder = LITTLE_ENDIAN;
+
+ /*
+ * if unlink do job normally, those who already open tag file can use
+ * it until closing.
+ */
+ if (mode == 1 && test("f", dbname))
+ (void)unlink(dbname);
+ db = dbopen(dbname, rw, 0600, DB_BTREE, &info);
+ if (!db)
+ die1("db_open failed (dbname = %s).", dbname);
+ if (!(dbio = (DBIO *)malloc(sizeof(DBIO))))
+ die("short of memory.");
+ strcpy(dbio->dbname, dbname);
+ dbio->db = db;
+ dbio->openflags = flags;
+ dbio->perm = (mode == 1) ? perm : 0;
+ dbio->lastkey = (char *)0;
+ dbio->lastdat = (char *)0;
+
+ return dbio;
+}
+/*
+ * db_get: get data by a key.
+ *
+ * i) dbio descripter
+ * i) k key
+ * r) pointer to data
+ */
+char *
+db_get(dbio, k)
+DBIO *dbio;
+char *k;
+{
+ DB *db = dbio->db;
+ int status;
+
+ key.data = k;
+ key.size = strlen(k)+1;
+
+ status = (*db->get)(db, &key, &dat, 0);
+ dbio->lastkey = (char *)key.data;
+ dbio->lastdat = (char *)dat.data;
+ switch (status) {
+ case RET_SUCCESS:
+ break;
+ case RET_ERROR:
+ die("db_get failed.");
+ case RET_SPECIAL:
+ return((char *)0);
+ }
+ return((char *)dat.data);
+}
+/*
+ * db_put: put data by a key.
+ *
+ * i) dbio descripter
+ * i) k key
+ * i) d data
+ */
+void
+db_put(dbio, k, d)
+DBIO *dbio;
+char *k;
+char *d;
+{
+ DB *db = dbio->db;
+ int status;
+
+ if (strlen(k) > MAXKEYLEN)
+ die("primary key too long.");
+ key.data = k;
+ key.size = strlen(k)+1;
+ dat.data = d;
+ dat.size = strlen(d)+1;
+
+ status = (*db->put)(db, &key, &dat, 0);
+ switch (status) {
+ case RET_SUCCESS:
+ break;
+ case RET_ERROR:
+ case RET_SPECIAL:
+ die("db_put failed.");
+ }
+}
+/*
+ * db_del: delete record by a key.
+ *
+ * i) dbio descripter
+ * i) k key
+ */
+void
+db_del(dbio, k)
+DBIO *dbio;
+char *k;
+{
+ DB *db = dbio->db;
+ int status;
+
+ if (k) {
+ key.data = k;
+ key.size = strlen(k)+1;
+ status = (*db->del)(db, &key, 0);
+ } else
+ status = (*db->del)(db, &key, R_CURSOR);
+ if (status == RET_ERROR)
+ die("db_del failed.");
+}
+/*
+ * db_first: get first record.
+ *
+ * i) dbio dbio descripter
+ * i) k key
+ * !=NULL: indexed read by key
+ * ==NULL: sequential read
+ * i) flags following db_next call take over this.
+ * DBIO_KEY read key part
+ * DBIO_PREFIX prefix read
+ * DBIO_SKIPMETA skip META record
+ * only valied when sequential read
+ * r) data
+ */
+char *
+db_first(dbio, k, flags)
+DBIO *dbio;
+char *k;
+int flags;
+{
+ DB *db = dbio->db;
+ int status;
+
+ if (flags & DBIO_PREFIX && !k)
+ flags &= ~DBIO_PREFIX;
+ if (flags & DBIO_SKIPMETA && k)
+ flags &= ~DBIO_SKIPMETA;
+ if (k) {
+ if (strlen(k) > MAXKEYLEN)
+ die("primary key too long.");
+ strcpy(dbio->key, k);
+ key.data = k;
+ key.size = strlen(k);
+ /*
+ * includes NULL character unless prefix read.
+ */
+ if (!(flags & DBIO_PREFIX))
+ key.size++;
+ dbio->keylen = key.size;
+ status = (*db->seq)(db, &key, &dat, R_CURSOR);
+ } else {
+ dbio->keylen = dbio->key[0] = 0;
+ for (status = (*db->seq)(db, &key, &dat, R_FIRST);
+ status == RET_SUCCESS &&
+ flags & DBIO_SKIPMETA &&
+ *((char *)dat.data) == ' ';
+ status = (*db->seq)(db, &key, &dat, R_NEXT))
+ ;
+ }
+ dbio->lastkey = (char *)key.data;
+ dbio->lastdat = (char *)dat.data;
+ switch (status) {
+ case RET_SUCCESS:
+ break;
+ case RET_ERROR:
+ die("db_first failed.");
+ case RET_SPECIAL:
+ return ((char *)0);
+ }
+ dbio->ioflags = flags;
+ if (flags & DBIO_PREFIX) {
+ if (strncmp((char *)key.data, dbio->key, dbio->keylen))
+ return (char *)0;
+ } else if (dbio->keylen) {
+ if (strcmp((char *)key.data, dbio->key))
+ return (char *)0;
+ }
+ if (flags & DBIO_KEY) {
+ strcpy(dbio->prev, (char *)key.data);
+ return (char *)key.data;
+ }
+ return ((char *)dat.data);
+}
+/*
+ * db_next: get next record.
+ *
+ * i) dbio dbio descripter
+ * r) data
+ */
+char *
+db_next(dbio)
+DBIO *dbio;
+{
+ DB *db = dbio->db;
+ int flags = dbio->ioflags;
+ int status;
+
+ while ((status = (*db->seq)(db, &key, &dat, R_NEXT)) == RET_SUCCESS) {
+ if (flags & DBIO_SKIPMETA) {
+ if (*((char *)dat.data) == ' ')
+ continue;
+ }
+ if (flags & DBIO_KEY) {
+ if (!strcmp(dbio->prev, (char *)key.data))
+ continue;
+ if (strlen((char *)key.data) > MAXKEYLEN)
+ die("primary key too long.");
+ strcpy(dbio->prev, (char *)key.data);
+ }
+ dbio->lastkey = (char *)key.data;
+ dbio->lastdat = (char *)dat.data;
+ if (flags & DBIO_PREFIX) {
+ if (strncmp((char *)key.data, dbio->key, dbio->keylen))
+ return (char *)0;
+ } else if (dbio->keylen) {
+ if (strcmp((char *)key.data, dbio->key))
+ return (char *)0;
+ }
+ return (flags & DBIO_KEY) ? (char *)key.data : (char *)dat.data;
+ }
+ if (status == RET_ERROR)
+ die("db_next failed.");
+ return (char *)0;
+}
+/*
+ * db_close: close db
+ *
+ * i) dbio dbio descripter
+ */
+void
+db_close(dbio)
+DBIO *dbio;
+{
+ DB *db = dbio->db;
+ (void)db->close(db);
+ if (dbio->openflags & DBIO_REMOVE)
+ (void)unlink(dbio->dbname);
+ else if (dbio->perm && chmod(dbio->dbname, dbio->perm) < 0)
+ die("cannot change file mode.");
+ (void)free(dbio);
+}
diff --git a/contrib/global/lib/dbio.h b/contrib/global/lib/dbio.h
new file mode 100644
index 0000000..bc0abf4
--- /dev/null
+++ b/contrib/global/lib/dbio.h
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redilogibution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redilogibutions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redilogibutions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the dilogibution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * dbio.h 14-Dec-97
+ *
+ */
+#ifndef _DBIO_H_
+#define _DBIO_H_
+
+#include <db.h>
+#include <sys/param.h>
+
+#ifndef LITTLE_ENDIAN
+#define LITTLE_ENDIAN 1234
+#endif
+#ifndef BIG_ENDIAN
+#define BIG_ENDIAN 4321
+#endif
+
+#define MAXKEYLEN 300
+
+typedef struct {
+ DB *db; /* descripter of DB */
+ char dbname[MAXPATHLEN+1]; /* dbname */
+ char key[MAXKEYLEN+1]; /* key */
+ int keylen; /* key length */
+ char prev[MAXKEYLEN+1]; /* previous key value */
+ char *lastkey; /* the key of last located record */
+ char *lastdat; /* the data of last located record */
+ int openflags; /* flags of db_open() */
+ int ioflags; /* flags of db_first() */
+ int perm; /* file permission */
+} DBIO;
+
+/*
+ * openflags
+ */
+#define DBIO_DUP 1 /* allow duplicate records */
+#define DBIO_REMOVE 2 /* remove file when closed */
+/*
+ * ioflags
+ */
+#define DBIO_KEY 1 /* read key part */
+#define DBIO_PREFIX 2 /* prefixed read */
+#define DBIO_SKIPMETA 4 /* skip META record */
+
+#ifndef __P
+#if defined(__STDC__)
+#define __P(protos) protos
+#else
+#define __P(protos) ()
+#endif
+#endif
+
+DBIO *db_open __P((char *, int, int, int));
+char *db_get __P((DBIO *, char *));
+void db_put __P((DBIO *, char *, char *));
+void de_del __P((DBIO *, char *));
+char *db_first __P((DBIO *, char *, int));
+char *db_next __P((DBIO *));
+void db_close __P((DBIO *));
+#endif /* _DBIO_H_ */
diff --git a/contrib/global/lib/dbname.c b/contrib/global/lib/dbname.c
new file mode 100644
index 0000000..1e68b3a
--- /dev/null
+++ b/contrib/global/lib/dbname.c
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * dbname.c 20-Oct-97
+ *
+ */
+#include "dbname.h"
+
+static char *tagslist[] = {"GTAGS", "GRTAGS", "GSYMS"};
+/*
+ * dbname: return db name
+ *
+ * i) db 0: GTAGS, 1: GRTAGS, 2: GSYMS
+ * r) dbname
+ */
+char *
+dbname(db)
+int db;
+{
+ return tagslist[db];
+}
diff --git a/contrib/global/lib/dbname.h b/contrib/global/lib/dbname.h
new file mode 100644
index 0000000..17eba36
--- /dev/null
+++ b/contrib/global/lib/dbname.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * dbname.h 16-Oct-97
+ *
+ */
+
+#ifndef _DBNAME_H_
+#define _DBNAME_H_
+
+#ifndef __P
+#if defined(__STDC__)
+#define __P(protos) protos
+#else
+#define __P(protos) ()
+#endif
+#endif
+
+#define GTAGS 0
+#define GRTAGS 1
+#define GSYMS 2
+#define GTAGLIM 3
+
+char *dbname __P((int));
+
+#endif /* ! _DBNAME_H_ */
diff --git a/contrib/global/lib/die.h b/contrib/global/lib/die.h
new file mode 100644
index 0000000..46813d4
--- /dev/null
+++ b/contrib/global/lib/die.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * die.h 16-Oct-97
+ *
+ */
+#ifndef _DIE_H_
+#define _DIE_H_
+#include <stdio.h>
+
+extern char *progname;
+
+#define die(a) fprintf(stderr, "%s: ", progname),\
+ fprintf(stderr, a),\
+ fputs("\n", stderr),\
+ exit(1)
+
+#define die1(a,b) fprintf(stderr, "%s: ", progname),\
+ fprintf(stderr, a, b),\
+ fputs("\n", stderr),\
+ exit(1)
+#endif /* ! _DIE_H_ */
diff --git a/contrib/global/lib/find.c b/contrib/global/lib/find.c
new file mode 100644
index 0000000..fd3537c
--- /dev/null
+++ b/contrib/global/lib/find.c
@@ -0,0 +1,165 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * find.c 20-Oct-97
+ *
+ */
+#include <stdio.h>
+#include <sys/types.h>
+#include <regex.h>
+#include <sys/param.h>
+#include "gparam.h"
+#include "find.h"
+#include "die.h"
+#include "locatestring.h"
+
+/*
+ * usage of findxxx()
+ *
+ * findopen();
+ * while (path = findread(&length)) {
+ * ...
+ * }
+ * findclose();
+ *
+ */
+static char *skippath[] = {
+ "y.tab.c",
+ "y.tab.h",
+ "SCCS/",
+ "RCS/",
+};
+static char *ext[] = {
+ "c",
+ "h",
+ "y",
+ "s",
+ "S",
+};
+static char findcom[MAXCOMLINE+1];
+static regex_t skip_area;
+static regex_t *skip;
+static FILE *ip;
+static int opened;
+
+int
+issource(path)
+char *path;
+{
+ char c, *p, *q;
+
+ if (!(p = locatestring(path, ".", 2)))
+ return 0;
+ ++p;
+ if (sizeof(ext) != 0) {
+ int i, lim = sizeof(ext)/sizeof(char *);
+ for (i = 0; i < lim; i++)
+ if (*ext[i] == *p && !strcmp(ext[i], p))
+ return 1;
+ }
+ return 0;
+}
+
+void
+findopen()
+{
+ char edit[512], *p, *q;
+ int i, lim;
+
+ if (opened)
+ die("nested call to findopen.");
+ opened = 1;
+ p = findcom;
+ strcpy(p, "find . \\( -type f -o -type l \\) \\(");
+ p += strlen(p);
+ lim = sizeof(ext)/sizeof(char *);
+ for (i = 0; i < lim; i++) {
+ sprintf(p, " -name '*.%s'%s", ext[i], (i + 1 < lim) ? " -o" : "");
+ p += strlen(p);
+ }
+ sprintf(p, " \\) -print");
+ if (sizeof(skippath) != 0) {
+ int i, lim = sizeof(skippath)/sizeof(char *);
+ /*
+ * construct regular expression.
+ */
+ p = edit;
+ *p++ = '(';
+ for (i = 0; i < lim; i++) {
+ *p++ = '/';
+ for (q = skippath[i]; *q; q++) {
+ if (*q == '.')
+ *p++ = '\\';
+ *p++ = *q;
+ }
+ if (*(q - 1) != '/')
+ *p++ = '$';
+ *p++ = '|';
+ }
+ *(p - 1) = ')';
+ *p = 0;
+ /*
+ * compile regular expression.
+ */
+ skip = &skip_area;
+ if (regcomp(skip, edit, REG_EXTENDED|REG_NEWLINE) != 0)
+ die("cannot compile regular expression.");
+ } else {
+ skip = (regex_t *)0;
+ }
+ if (!(ip = popen(findcom, "r")))
+ die("cannot execute find.");
+}
+char *
+findread(length)
+int *length;
+{
+ static char path[MAXPATHLEN+1];
+ char *p;
+
+ while (fgets(path, MAXPATHLEN, ip)) {
+ if (!skip || regexec(skip, path, 0, 0, 0) != 0) {
+ p = path + strlen(path) - 1;
+ if (*p != '\n')
+ die("output of find(1) is wrong (findread).");
+ *p = 0;
+ if (length)
+ *length = p - path;
+ return path;
+ }
+ }
+ return (char *)0;
+}
+void
+findclose()
+{
+ pclose(ip);
+ opened = 0;
+}
diff --git a/contrib/global/lib/find.h b/contrib/global/lib/find.h
new file mode 100644
index 0000000..c745a19
--- /dev/null
+++ b/contrib/global/lib/find.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * find.h 16-Oct-97
+ *
+ */
+
+#ifndef _FIND_H_
+#define _FIND_H_
+
+#ifndef __P
+#if defined(__STDC__)
+#define __P(protos) protos
+#else
+#define __P(protos) ()
+#endif
+#endif
+
+int issource __P((char *));
+void findopen __P(());
+char *findread __P((int *));
+void findclose __P(());
+
+#endif /* ! _FIND_H_ */
diff --git a/contrib/global/lib/getdbpath.c b/contrib/global/lib/getdbpath.c
new file mode 100644
index 0000000..9c689da
--- /dev/null
+++ b/contrib/global/lib/getdbpath.c
@@ -0,0 +1,154 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * getdbpath.c 20-Oct-97
+ *
+ */
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdlib.h>
+#include "die.h"
+#include "locatestring.h"
+
+static char *makeobjdirprefix; /* obj partition */
+static char *makeobjdir; /* obj directory */
+static int bsd; /* if BSD */
+
+/*
+ * gtagsexist: test whether GTAGS's existence.
+ *
+ * i) candidate candidate root directory
+ * o) dbpath directory which GTAGS exist
+ * r) 0: not found, 1: found
+ */
+int
+gtagsexist(candidate, dbpath)
+char *candidate;
+char *dbpath;
+{
+ char path[MAXPATHLEN+1];
+
+ sprintf(path, "%s/GTAGS", candidate);
+ if (test("fr", path)) {
+ strcpy(dbpath, candidate);
+ return 1;
+ }
+ if (bsd) {
+ sprintf(path, "%s/%s/GTAGS", candidate, makeobjdir);
+ if (test("fr", path)) {
+ sprintf(dbpath, "%s%s", candidate, makeobjdir);
+ return 1;
+ }
+ sprintf(path, "%s%s/GTAGS", makeobjdirprefix, candidate);
+ if (test("fr", path)) {
+ sprintf(dbpath, "%s%s", makeobjdirprefix, candidate);
+ return 1;
+ }
+ }
+ return 0;
+}
+/*
+ * getdbpath: get dbpath directory
+ *
+ * o) cwd current directory
+ * o) root root of source tree
+ * o) dbpath directory which GTAGS exist
+ *
+ * root and dbpath assumed as
+ * char cwd[MAXPATHLEN+1];
+ * char root[MAXPATHLEN+1];
+ * char dbpath[MAXPATHLEN+1];
+ */
+void
+getdbpath(cwd, root, dbpath)
+char *cwd;
+char *root;
+char *dbpath;
+{
+ struct stat sb;
+ char *p;
+
+ if (!getcwd(cwd, MAXPATHLEN))
+ die("cannot get current directory.");
+ /*
+ * GLOBAL never think '/' is the root of source tree.
+ */
+ if (!strcmp(cwd, "/"))
+ die("It's root directory! What are you doing?");
+
+ if (getenv("OSTYPE") && locatestring(getenv("OSTYPE"), "BSD", 0)) {
+ if (p = getenv("MAKEOBJDIRPREFIX"))
+ makeobjdirprefix = p;
+ else
+ makeobjdirprefix = "/usr/obj";
+ if (p = getenv("MAKEOBJDIR"))
+ makeobjdir = p;
+ else
+ makeobjdir = "obj";
+ bsd = 1;
+ }
+
+ if (p = getenv("GTAGSROOT")) {
+ if (*p != '/')
+ die("GTAGSROOT must be an absolute path.");
+ if (stat(p, &sb) || !S_ISDIR(sb.st_mode))
+ die1("directory '%s' not found.", p);
+ strcpy(root, p);
+ /*
+ * GTAGSDBPATH is meaningful only when GTAGSROOT exist.
+ */
+ if (p = getenv("GTAGSDBPATH")) {
+ if (*p != '/')
+ die("GTAGSDBPATH must be an absolute path.");
+ if (stat(p, &sb) || !S_ISDIR(sb.st_mode))
+ die1("directory '%s' not found.", p);
+ strcpy(dbpath, getenv("GTAGSDBPATH"));
+ } else {
+ if (!gtagsexist(root, dbpath))
+ die("GTAGS not found.");
+ }
+ } else {
+ /*
+ * start from current directory to '/' directory.
+ */
+ strcpy(root, cwd);
+ p = root + strlen(root);
+ while (!gtagsexist(root, dbpath)) {
+ while (*--p != '/')
+ ;
+ *p = 0;
+ if (root == p) /* reached root directory */
+ break;
+ }
+ if (*root == 0)
+ die("GTAGS not found.");
+ }
+}
diff --git a/contrib/global/lib/getdbpath.h b/contrib/global/lib/getdbpath.h
new file mode 100644
index 0000000..193dfff
--- /dev/null
+++ b/contrib/global/lib/getdbpath.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * getdbpath.h 16-Oct-97
+ *
+ */
+
+#ifndef _GETDBPATH_H_
+#define _GETDBPATH_H_
+
+#ifndef __P
+#if defined(__STDC__)
+#define __P(protos) protos
+#else
+#define __P(protos) ()
+#endif
+#endif
+
+int gtagsexist __P((char *, char *));
+void getdbpath __P((char *, char *, char *));
+
+#endif /* ! _GETDBPATH_H_ */
diff --git a/contrib/global/lib/global.h b/contrib/global/lib/global.h
new file mode 100644
index 0000000..7fbc2b8
--- /dev/null
+++ b/contrib/global/lib/global.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * global.h 16-Oct-97
+ *
+ */
+
+#ifndef _GLOBAL_H_
+#define _GLOBAL_H_
+
+#include "gparam.h"
+#include "dbname.h"
+#include "makepath.h"
+#include "dbio.h"
+#include "locatestring.h"
+#include "mgets.h"
+#include "die.h"
+#include "find.h"
+#include "getdbpath.h"
+#include "strop.h"
+#include "gtagsopen.h"
+#include "lookup.h"
+#include "tab.h"
+#include "tag.h"
+#include "test.h"
+
+#endif /* ! _GLOBAL_H_ */
diff --git a/contrib/global/lib/gparam.h b/contrib/global/lib/gparam.h
new file mode 100644
index 0000000..8a506c4
--- /dev/null
+++ b/contrib/global/lib/gparam.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * gparam.h 16-Oct-97
+ *
+ */
+#ifndef _GPARAM_H_
+#define _GPARAM_H_
+
+#define MAXCOMLINE 1024 /* max length of filter */
+#define IDENTLEN 512 /* max length of ident */
+#define MAXENVLEN 1024 /* max length of env */
+#define MAXBUFLEN 1024 /* max length of buffer */
+
+#endif /* ! _GPARAM_H_ */
diff --git a/contrib/global/lib/gtagsopen.c b/contrib/global/lib/gtagsopen.c
new file mode 100644
index 0000000..2331c4b
--- /dev/null
+++ b/contrib/global/lib/gtagsopen.c
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * gtagsopen.c 20-Oct-97
+ *
+ */
+#include <sys/param.h>
+#include <fcntl.h>
+#include <db.h>
+#include "dbio.h"
+#include "die.h"
+#include "makepath.h"
+#include "dbname.h"
+
+#define VERSIONKEY " __.VERSION"
+static int support_version = 1; /* accept this format version */
+
+/*
+ * gtagsopen: open global database.
+ *
+ * i) dbpath dbpath directory
+ * i) db GTAGS, GRTAGS, GSYMS
+ * i) mode 0: read only
+ * 1: write only
+ * 2: read and write
+ * r) DB structure
+ *
+ * when error occurred, gtagopen doesn't return.
+ */
+DBIO *
+gtagsopen(dbpath, db, mode)
+char *dbpath;
+int db;
+int mode;
+{
+ DBIO *dbio;
+ int version_number;
+ char *p;
+
+ /*
+ * allow duplicate records.
+ */
+ dbio = db_open(makepath(dbpath, dbname(db)), mode, 0644, DBIO_DUP);
+ if (dbio == NULL) {
+ if (mode == 1)
+ die1("cannot make database (%s).", makepath(dbpath, dbname(db)));
+ die1("database not found (%s).", makepath(dbpath, dbname(db)));
+ }
+ if (mode == 1) {
+ /* nothing to do now */
+ } else {
+ /*
+ * recognize format version of GTAGS. 'format version record'
+ * is saved as a META record in GTAGS and GRTAGS.
+ * if 'format version record' is not found, it's assumed
+ * version 1.
+ */
+ if (p = db_get(dbio, VERSIONKEY)) {
+ for (p += strlen(VERSIONKEY); *p && isspace(*p); p++)
+ ;
+ version_number = atoi(p);
+ } else
+ version_number = 1;
+ if (version_number > support_version)
+ die("GTAGS seems new format. Please install the latest GLOBAL.");
+ }
+ return dbio;
+}
diff --git a/contrib/global/lib/gtagsopen.h b/contrib/global/lib/gtagsopen.h
new file mode 100644
index 0000000..2afb2ab
--- /dev/null
+++ b/contrib/global/lib/gtagsopen.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * gtagsopen.h 16-Oct-97
+ *
+ */
+
+#ifndef _GTAGSOPEN_H_
+#define _GTAGSOPEN_H_
+#include "dbio.h"
+
+DBIO *gtagsopen __P((char *, int, int));
+
+#endif /* ! _GTAGSOPEN_H_ */
diff --git a/contrib/global/lib/locatestring.c b/contrib/global/lib/locatestring.c
new file mode 100644
index 0000000..f2aeecf
--- /dev/null
+++ b/contrib/global/lib/locatestring.c
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * locatestring.c 20-Oct-97
+ *
+ */
+/*
+ * locatestring: locate pattern from string
+ *
+ * i) string string
+ * i) pattern pattern
+ * i) flag 0: match first
+ * 1: match only at first column
+ * 2: match last
+ * 3: match only at last column
+ * r) pointer or NULL
+ *
+ * This function is made to avoid compatibility problems.
+ */
+char *
+locatestring(string, pattern, flag)
+char *string;
+char *pattern;
+int flag;
+{
+ int c = *pattern;
+ char *p = (char *)0;
+
+ if (flag == 3 && strlen(string) > strlen(pattern)) {
+ string += strlen(string) - strlen(pattern);
+ }
+ for (; *string; string++) {
+ if (*string == c)
+ if (!strncmp(string, pattern, strlen(pattern))) {
+ p = string;
+ if (flag == 0)
+ break;
+ }
+ if (flag == 1 || flag == 3)
+ break;
+ }
+ return p;
+}
diff --git a/contrib/global/lib/locatestring.h b/contrib/global/lib/locatestring.h
new file mode 100644
index 0000000..cdaeedb
--- /dev/null
+++ b/contrib/global/lib/locatestring.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * locatestring.h 16-Oct-97
+ *
+ */
+
+#ifndef _LOCATESTRING_H_
+#define _LOCATESTRING_H_
+
+#ifndef __P
+#if defined(__STDC__)
+#define __P(protos) protos
+#else
+#define __P(protos) ()
+#endif
+#endif
+
+char *locatestring __P((char *, char *, int));
+
+#endif /* ! _LOCATESTRING_H_ */
diff --git a/contrib/global/lib/lookup.c b/contrib/global/lib/lookup.c
new file mode 100644
index 0000000..0583d6b
--- /dev/null
+++ b/contrib/global/lib/lookup.c
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * lookup.c 20-Oct-97
+ *
+ */
+#include "gtagsopen.h"
+#include "lookup.h"
+#include "dbio.h"
+#include "die.h"
+#include "dbname.h"
+
+static DBIO *dbio;
+static int opened;
+
+void
+lookupopen(dbpath)
+char *dbpath;
+{
+ if (opened)
+ die("nested call to lookupopen.");
+ opened = 1;
+ dbio = gtagsopen(dbpath, GTAGS, 0);
+}
+int
+lookup(name)
+char *name;
+{
+ char *p = db_get(dbio, name);
+ return (p) ? 1 : 0;
+}
+void
+lookupclose()
+{
+ db_close(dbio);
+ opened = 0;
+}
diff --git a/contrib/global/lib/lookup.h b/contrib/global/lib/lookup.h
new file mode 100644
index 0000000..cfe8c8e
--- /dev/null
+++ b/contrib/global/lib/lookup.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * lookup.h 16-Oct-97
+ *
+ */
+
+#ifndef _LOOKUP_H_
+#define _LOOKUP_H_
+
+#ifndef __P
+#if defined(__STDC__)
+#define __P(protos) protos
+#else
+#define __P(protos) ()
+#endif
+#endif
+
+void lookupopen __P((char *));
+int lookup __P((char *));
+void lookupclose __P(());
+
+#endif /* ! _LOOKUP_H_ */
diff --git a/contrib/global/lib/makepath.c b/contrib/global/lib/makepath.c
new file mode 100644
index 0000000..ba00ecf
--- /dev/null
+++ b/contrib/global/lib/makepath.c
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * makepath.c 20-Oct-97
+ *
+ */
+#include <sys/param.h>
+#include "makepath.h"
+/*
+ * makepath: make path from directory and file.
+ *
+ * i) dir directory
+ * i) file file
+ * r) path
+ */
+char *
+makepath(dir, file)
+char *dir;
+char *file;
+{
+ static char path[MAXPATHLEN+1];
+ char *p;
+
+ strcpy(path, dir);
+ p = path + strlen(path);
+ if (*(p - 1) != '/')
+ *p++ = '/';
+ strcpy(p, file);
+ return path;
+}
diff --git a/contrib/global/lib/makepath.h b/contrib/global/lib/makepath.h
new file mode 100644
index 0000000..47d292d
--- /dev/null
+++ b/contrib/global/lib/makepath.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * makepath.h 16-Oct-97
+ *
+ */
+
+#ifndef _MAKEPATH_H_
+#define _MAKEPATH_H_
+
+#ifndef __P
+#if defined(__STDC__)
+#define __P(protos) protos
+#else
+#define __P(protos) ()
+#endif
+#endif
+
+char *makepath __P((char *, char *));
+
+#endif /* ! _MAKEPATH_H_ */
diff --git a/contrib/global/lib/mgets.c b/contrib/global/lib/mgets.c
new file mode 100644
index 0000000..880338e
--- /dev/null
+++ b/contrib/global/lib/mgets.c
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * mgets.c 8-Nov-97
+ *
+ */
+#include <stdio.h>
+#include "mgets.h"
+#include "die.h"
+
+#define EXPANDSIZE 512
+static int mbufsize = EXPANDSIZE;
+static char *mbuf;
+
+/*
+ * mgets: read whole record into allocated buffer
+ *
+ * i) ip input stream
+ * i) flags flags
+ * MGETS_CONT \\ + \n -> \n
+ * MGETS_SKIPCOM skip line which start with '#'.
+ * o) length length of record
+ * r) record buffer (NULL at end of file)
+ *
+ * Returned buffer has whole record.
+ * The buffer end with '\0' and doesn't include '\r' and '\n'.
+ */
+char *
+mgets(ip, flags, length)
+FILE *ip;
+int flags;
+int *length;
+{
+ char *p;
+
+ /*
+ * allocate initial buffer.
+ */
+ if (!mbuf)
+ if (!(mbuf = (char *)malloc(mbufsize + 1)))
+ die("short of memory.");
+ /*
+ * read whole record.
+ */
+ if (!fgets(mbuf, mbufsize, ip))
+ return (char *)0;
+ if (flags & MGETS_SKIPCOM)
+ while (*mbuf == '#')
+ if (!fgets(mbuf, mbufsize, ip))
+ return (char *)0;
+ p = mbuf + strlen(mbuf);
+ for (;;) {
+ /*
+ * get a line.
+ */
+ while (*(p - 1) != '\n') {
+ /*
+ * expand and read additionally.
+ */
+ int count = p - mbuf;
+ mbufsize += EXPANDSIZE;
+ if (!(mbuf = (char *)realloc(mbuf, mbufsize + 1)))
+ die("short of memory.");
+ p = mbuf + count;
+ if (!fgets(p, mbufsize - count, ip))
+ die("illegal end of file.");
+ p += strlen(p);
+ }
+ /*
+ * chop(mbuf)
+ */
+ *(--p) = 0;
+ if (*(p - 1) == '\r')
+ *(--p) = 0;
+ /*
+ * continue?
+ */
+ if ((flags & MGETS_CONT) && *(p - 1) == '\\')
+ *(--p) = 0;
+ else
+ break;
+ }
+ if (length)
+ *length = p - mbuf;
+ return mbuf;
+}
diff --git a/contrib/global/lib/mgets.h b/contrib/global/lib/mgets.h
new file mode 100644
index 0000000..ea3aef2
--- /dev/null
+++ b/contrib/global/lib/mgets.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redilogibution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redilogibutions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redilogibutions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the dilogibution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * mgets.h 20-Oct-97
+ *
+ */
+#ifndef _MGETS_H_
+#define _MGETS_H_
+
+#include <stdio.h>
+#define MGETS_CONT 1
+#define MGETS_SKIPCOM 2
+
+#ifndef __P
+#if defined(__STDC__)
+#define __P(protos) protos
+#else
+#define __P(protos) ()
+#endif
+#endif
+
+char *mgets __P((FILE *, int, int *));
+
+#endif /* ! _MGETS_H_ */
diff --git a/contrib/global/lib/strop.c b/contrib/global/lib/strop.c
new file mode 100644
index 0000000..e15db16
--- /dev/null
+++ b/contrib/global/lib/strop.c
@@ -0,0 +1,117 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * strop.c 20-Oct-97
+ *
+ */
+#include "strop.h"
+#include "die.h"
+/*
+ * usage: string buffer
+ *
+ * stropen();
+ * for (s = string; *s; s++)
+ * strputc(*s);
+ * s = strclose();
+ */
+#define EXPANDSIZE 80
+static char *sbuf;
+static char *endp;
+static char *curp;
+static int sbufsize;
+static int opened;
+
+void
+stropen()
+{
+ if (opened)
+ die("nested call to stropen.");
+ opened = 1;
+ /*
+ * allocate initial buffer.
+ */
+ if (!sbuf)
+ if (!(sbuf = (char *)malloc(sbufsize + 1)))
+ die("short of memory.");
+ curp = sbuf;
+ endp = sbuf + sbufsize;
+ *curp = 0;
+}
+void
+strputs(s)
+char *s;
+{
+ int length = strlen(s);
+
+ strnputs(s, length);
+}
+void
+strnputs(s, length)
+char *s;
+int length;
+{
+ if (curp + length > endp) {
+ int count = curp - sbuf;
+
+ sbufsize += (length > EXPANDSIZE) ? length : EXPANDSIZE;
+ if (!(sbuf = (char *)realloc(sbuf, sbufsize + 1)))
+ die("short of memory.");
+ curp = sbuf + count;
+ endp = sbuf + sbufsize;
+ }
+ strncpy(curp, s, length);
+ curp += length;
+ *curp = 0;
+}
+void
+strputc(c)
+int c;
+{
+ if (curp + 1 > endp) {
+ int count = curp - sbuf;
+
+ sbufsize += EXPANDSIZE;
+ if (!(sbuf = (char *)realloc(sbuf, sbufsize + 1)))
+ die("short of memory.");
+ curp = sbuf + count;
+ endp = sbuf + sbufsize;
+ }
+ *curp++ = c;
+ *curp = 0;
+}
+char *
+strclose()
+{
+ opened = 0;
+ /*
+ * doesn't free area in current implementation.
+ */
+ return sbuf;
+}
diff --git a/contrib/global/lib/strop.h b/contrib/global/lib/strop.h
new file mode 100644
index 0000000..aa9fa68
--- /dev/null
+++ b/contrib/global/lib/strop.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * strop.h 16-Oct-97
+ *
+ */
+
+#ifndef _STROP_H_
+#define _STROP_H_
+
+#ifndef __P
+#if defined(__STDC__)
+#define __P(protos) protos
+#else
+#define __P(protos) ()
+#endif
+#endif
+
+void stropen __P(());
+void strputs __P((char *));
+void strnputs __P((char *, int));
+void strputc __P((int));
+char *strclose __P(());
+
+#endif /* ! _STROP_H_ */
diff --git a/contrib/global/lib/tab.c b/contrib/global/lib/tab.c
new file mode 100644
index 0000000..8f5adbf
--- /dev/null
+++ b/contrib/global/lib/tab.c
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * tab.c 20-Oct-97
+ *
+ */
+#include <stdio.h>
+
+#define TABPOS(i) ((i)%8 == 0)
+/*
+ * detab: convert tabs into spaces and print
+ *
+ * i) op FILE *
+ * i) buf string including tabs
+ */
+void
+detab(op, buf)
+FILE *op;
+char *buf;
+{
+ int src, dst;
+ char c;
+
+ src = dst = 0;
+ while ((c = buf[src++]) != 0) {
+ if (c == '\t') {
+ do {
+ (void)putc(' ', op);
+ dst++;
+ } while (!TABPOS(dst));
+ } else {
+ (void)putc(c, op);
+ dst++;
+ }
+ }
+ (void)putc('\n', op);
+}
+/*
+ * entab: convert spaces into tabs
+ *
+ * io) buf string buffer
+ */
+void
+entab(buf)
+char *buf;
+{
+ int blanks = 0;
+ int pos, src, dst;
+ char c;
+
+ pos = src = dst = 0;
+ while ((c = buf[src++]) != 0) {
+ if (c == ' ') {
+ if (!TABPOS(++pos)) {
+ blanks++; /* count blanks */
+ continue;
+ }
+ buf[dst++] = '\t';
+ } else if (c == '\t') {
+ while (!TABPOS(++pos))
+ ;
+ buf[dst++] = '\t';
+ } else {
+ ++pos;
+ while (blanks--)
+ buf[dst++] = ' ';
+ buf[dst++] = c;
+ }
+ blanks = 0;
+ }
+ buf[dst] = 0;
+}
diff --git a/contrib/global/lib/tab.h b/contrib/global/lib/tab.h
new file mode 100644
index 0000000..c2b5079
--- /dev/null
+++ b/contrib/global/lib/tab.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * tab.h 16-Oct-97
+ *
+ */
+
+#ifndef _TAB
+#define _TAB_H_
+
+#ifndef __P
+#if defined(__STDC__)
+#define __P(protos) protos
+#else
+#define __P(protos) ()
+#endif
+#endif
+
+void detab __P((FILE *, char *));
+void entab __P((char *));
+
+#endif /* ! _TAB_H_ */
diff --git a/contrib/global/lib/tag.c b/contrib/global/lib/tag.c
new file mode 100644
index 0000000..81d9aae
--- /dev/null
+++ b/contrib/global/lib/tag.c
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * tag.c 20-Oct-97
+ *
+ */
+#include "dbio.h"
+#include "die.h"
+#include "gtagsopen.h"
+#include "tag.h"
+#include "locatestring.h"
+
+static DBIO *dbio;
+static int opened;
+
+void
+tagopen(dbpath, db, mode)
+char *dbpath;
+int db;
+int mode;
+{
+ if (opened)
+ die("nested call to tagopen.");
+ opened = 1;
+ dbio = gtagsopen(dbpath, db, mode);
+}
+void
+tagput(entry, record)
+char *entry;
+char *record;
+{
+ entab(record);
+ db_put(dbio, entry, record);
+}
+void
+tagdelete(path)
+char *path;
+{
+ char *p;
+ int length = strlen(path);
+
+ for (p = db_first(dbio, NULL, DBIO_SKIPMETA); p; p = db_next(dbio)) {
+ p = locatestring(p, "./", 0);
+ if (!strncmp(p, path, length) && isspace(*(p + length)))
+ db_del(dbio, NULL);
+ }
+}
+void
+tagclose()
+{
+ db_close(dbio);
+ opened = 0;
+}
diff --git a/contrib/global/lib/tag.h b/contrib/global/lib/tag.h
new file mode 100644
index 0000000..b12caaa
--- /dev/null
+++ b/contrib/global/lib/tag.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * tag.h 16-Oct-97
+ *
+ */
+
+#ifndef _TAG_H_
+#define _TAG_H_
+
+#ifndef __P
+#if defined(__STDC__)
+#define __P(protos) protos
+#else
+#define __P(protos) ()
+#endif
+#endif
+
+void tagopen __P((char *, int, int));
+void tagput __P((char *, char *));
+void tagdelete __P((char *));
+void tagclose __P(());
+
+#endif /* ! _TAG_H_ */
diff --git a/contrib/global/lib/test.c b/contrib/global/lib/test.c
new file mode 100644
index 0000000..99aae9d
--- /dev/null
+++ b/contrib/global/lib/test.c
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * test.c 12-Dec-97
+ *
+ */
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/*
+ * test:
+ *
+ * i) flags file flags
+ *
+ * "f" [ -f path ]
+ * "d" [ -d path ]
+ * "r" [ -r path ]
+ * "w" [ -w path ]
+ * "x" [ -x path ]
+ *
+ * i) path path
+ * r) 0: no, 1: ok
+ *
+ * You can specify more than one character. It assumed 'and' test.
+ */
+int
+test(flags, path)
+char *flags;
+char *path;
+{
+ struct stat sb;
+ int c;
+
+ if (stat(path, &sb) < 0)
+ return 0;
+ while (c = *flags++) {
+ switch (c) {
+ case 'f':
+ if (!S_ISREG(sb.st_mode))
+ return 0;
+ break;
+ case 'd':
+ if (!S_ISDIR(sb.st_mode))
+ return 0;
+ break;
+ case 'r':
+ if (access(path, R_OK) < 0)
+ return 0;
+ break;
+ case 'w':
+ if (access(path, W_OK) < 0)
+ return 0;
+ break;
+ case 'x':
+ if (access(path, X_OK) < 0)
+ return 0;
+ break;
+ default:
+ break;
+ }
+ }
+ return 1;
+}
diff --git a/contrib/global/lib/test.h b/contrib/global/lib/test.h
new file mode 100644
index 0000000..edadbda
--- /dev/null
+++ b/contrib/global/lib/test.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Shigio Yamaguchi.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * test.h 16-Oct-97
+ *
+ */
+
+#ifndef _TEST_H_
+#define _TEST_H_
+
+#ifndef __P
+#if defined(__STDC__)
+#define __P(protos) protos
+#else
+#define __P(protos) ()
+#endif
+#endif
+
+int test __P((char *, char *));
+
+#endif /* ! _TEST_H_ */
diff --git a/contrib/global/systags/Makefile b/contrib/global/systags/Makefile
index 49c9806..08d4040 100644
--- a/contrib/global/systags/Makefile
+++ b/contrib/global/systags/Makefile
@@ -1,7 +1,5 @@
-# @(#)Makefile 1.0 (Berkeley) 4/21/96
-
beforeinstall:
${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \
- ${.CURDIR}/systags.sh ${DESTDIR}/usr/bin/systags
+ ${.CURDIR}/systags.sh ${DESTDIR}${BINDIR}/systags
.include <bsd.prog.mk>
diff --git a/contrib/global/systags/Makefile.generic b/contrib/global/systags/Makefile.generic
index 140046f..a1a5ca6 100644
--- a/contrib/global/systags/Makefile.generic
+++ b/contrib/global/systags/Makefile.generic
@@ -1,5 +1,3 @@
-# @(#)Makefile 29-Dec-96
-
PROG = systags
BINDIR = /usr/bin
diff --git a/contrib/global/systags/systags.sh b/contrib/global/systags/systags.sh
index f14c4ad..09fa205 100755
--- a/contrib/global/systags/systags.sh
+++ b/contrib/global/systags/systags.sh
@@ -58,15 +58,15 @@ fi
# remove old files
#
case $nflag in
-1) echo "rm -rf $dir/htags.log $dir/GTAGS $dir/GRTAGS $dir/HTML";;
-*) rm -rf $dir/htags.log $dir/GTAGS $dir/GRTAGS $dir/HTML;;
+1) echo "rm -rf $dir/htags.log $dir/gtags.log $dir/GTAGS $dir/GRTAGS $dir/GSYMS $dir/HTML";;
+*) rm -rf $dir/htags.log $dir/gtags.log $dir/GTAGS $dir/GRTAGS $dir/GSYMS $dir/HTML;;
esac
#
-# make global database(GTAGS, GRTAGS).
+# make global database(GTAGS, GRTAGS, GSYMS).
#
case $nflag in
-1) echo "gtags -se $dir";;
-*) gtags -se $dir;;
+1) echo "gtags -v $dir > $dir/gtags.log 2>&1";;
+*) gtags -v $dir > $dir/gtags.log 2>&1;;
esac
case $? in
0) ;;
OpenPOWER on IntegriCloud