summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcwt <cwt@FreeBSD.org>1997-12-15 23:13:53 +0000
committercwt <cwt@FreeBSD.org>1997-12-15 23:13:53 +0000
commit4fda3be4508d5e4d5cebf2deac98f970dba97f16 (patch)
tree6a7dc54f1b1cd292ca0d1608994097e3c50edf96
parentb1200e5a86469f83f9487d32847b49df6f6e8d81 (diff)
downloadFreeBSD-src-4fda3be4508d5e4d5cebf2deac98f970dba97f16.zip
FreeBSD-src-4fda3be4508d5e4d5cebf2deac98f970dba97f16.tar.gz
Merge and resolve conflicts...
-rw-r--r--contrib/global/btreeop/btreeop.c417
-rw-r--r--contrib/global/gtags.el94
-rw-r--r--contrib/global/htags/htags.15
3 files changed, 250 insertions, 266 deletions
diff --git a/contrib/global/btreeop/btreeop.c b/contrib/global/btreeop/btreeop.c
index df3ce7d..b82ff58 100644
--- a/contrib/global/btreeop/btreeop.c
+++ b/contrib/global/btreeop/btreeop.c
@@ -28,132 +28,58 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * btreeop.c 6-Jul-97
+ * btreeop.c 6-Nov-97
*
*/
-#include <err.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <sys/types.h>
-#include <ctype.h>
-#include <db.h>
-#include <fcntl.h>
+#include <sys/stat.h>
+#include <signal.h>
+#include "global.h"
char *dbdefault = "btree"; /* default database name */
-char *dbname;
-char buf[BUFSIZ+1];
-char out[BUFSIZ+1];
+char *progname = "btreeop"; /* command name */
-#ifndef __P
-#if defined(__STDC__)
-#define __P(protos) protos
-#else
-#define __P(protos) ()
-#endif
-#endif
-
-void die __P((char *));
static void usage __P((void));
-void entab __P((char *));
-void detab __P((char *, char *));
+void signal_setup __P((void));
+void onintr __P((int));
void main __P((int, char **));
-void dbwrite __P((DB *));
-void dbkey __P((DB *, char *));
-void dbscan __P((DB *, int));
-void dbdel __P((DB *, char *));
-DB *db;
-char *key;
+void dbwrite __P((DBIO *));
+void dbkey __P((DBIO *, char *, int));
+void dbscan __P((DBIO *, char *, int));
+void dbdel __P((DBIO *, char *, int));
+void dbbysecondkey __P((DBIO *, int, char *, int));
-#ifndef LITTLE_ENDIAN
-#define LITTLE_ENDIAN 1234
-#endif
-#ifndef BIG_ENDIAN
-#define BIG_ENDIAN 4321
-#endif
-
-void
-die(s)
-char *s;
-{
- errx(1, "%s", s);
-}
+#define F_KEY 0
+#define F_DEL 1
static void
usage()
{
- fprintf(stderr, "%s\n%s\n",
- "usage: btreeop [-A][-C][-D key][-K key][-L][-b][-c cachesize]",
- " [-l][-p psize][dbname]");
+ fprintf(stderr, "%s\n",
+ "usage: btreeop [-A][-C][-D[n] key][-K[n] key][-L][-k prefix][dbname]");
exit(1);
}
-#define TABPOS(i) ((i)%8 == 0)
/*
- * entab: convert spaces into tabs
- *
- * io) buf string buffer
+ * Btreeop catch signal even if the parent ignore it.
*/
+int exitflag = 0;
+
void
-entab(buf)
-char *buf;
+onintr(signo)
+int signo;
{
- 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;
+ exitflag = 1;
}
-/*
- * detab: convert tabs into spaces
- *
- * i) buf string including tabs
- * o) out output
- */
+
void
-detab(buf, out)
-char *buf;
-char *out;
+signal_setup()
{
- int src, dst;
- char c;
-
- src = dst = 0;
- while ((c = buf[src++]) != 0) {
- if (c == '\t') {
- do {
- out[dst++] = ' ';
- } while (!TABPOS(dst));
- } else {
- out[dst++] = c;
- }
- }
- out[dst] = 0;
+ signal(SIGHUP, onintr);
+ signal(SIGINT, onintr);
+ signal(SIGQUIT, onintr);
+ signal(SIGTERM, onintr);
}
-#include <errno.h>
void
main(argc, argv)
int argc;
@@ -161,27 +87,20 @@ char *argv[];
{
char command = 'R';
char *key = NULL;
- DB *db;
- BTREEINFO info;
- int c;
- int flags = 0;
- extern char *optarg;
- extern int optind;
-
- info.flags = R_DUP; /* allow duplicate entries */
- info.cachesize = 500000;
- info.maxkeypage = 0;
- info.minkeypage = 0;
- info.psize = 0;
- info.compare = NULL;
- info.prefix = NULL;
- info.lorder = LITTLE_ENDIAN;
+ int mode;
+ char *dbname;
+ DBIO *dbio;
+ int i, c;
+ int secondkey = 0;
+ char *prefix = (char *)0;
- while ((c = getopt(argc, argv, "ACD:K:Lbc:lp:")) != -1) {
- switch (c) {
- case 'K':
+ for (i = 1; i < argc && argv[i][0] == '-'; ++i) {
+ switch (c = argv[i][1]) {
case 'D':
- key = optarg;
+ case 'K':
+ if (argv[i][2] && isdigit(argv[i][2]))
+ secondkey = atoi(&argv[i][2]);
+ key = argv[++i];
case 'A':
case 'C':
case 'L':
@@ -189,89 +108,79 @@ char *argv[];
usage();
command = c;
break;
- case 'b':
- info.lorder = BIG_ENDIAN;
- break;
- case 'c':
- info.cachesize = atoi(optarg);
- break;
- case 'l':
- info.lorder = LITTLE_ENDIAN;
- break;
- case 'p':
- info.psize = atoi(optarg);
+ case 'k':
+ prefix = argv[++i];
break;
default:
usage();
}
}
-
- dbname = (optind < argc) ? argv[optind] : dbdefault;
+ dbname = (i < argc) ? argv[i] : dbdefault;
switch (command) {
case 'A':
case 'D':
- flags = O_RDWR|O_CREAT;
+ mode = 2;
break;
case 'C':
- flags = O_RDWR|O_CREAT|O_TRUNC;
+ mode = 1;
break;
case 'K':
case 'L':
case 'R':
- flags = O_RDONLY;
+ mode = 0;
break;
}
- db = dbopen(dbname, flags, 0644, DB_BTREE, &info);
- if (db == NULL) {
- die("dbopen failed.");
- }
+ dbio = db_open(dbname, mode, 0644, DBIO_DUP);
+ if (dbio == NULL)
+ die1("db_open failed (dbname = %s).", dbname);
+
switch (command) {
case 'A': /* Append records */
case 'C': /* Create database */
- dbwrite(db);
+ dbwrite(dbio);
break;
case 'D': /* Delete records */
- dbdel(db, key);
+ dbdel(dbio, key, secondkey);
break;
case 'K': /* Keyed (indexed) read */
- dbkey(db, key);
+ dbkey(dbio, key, secondkey);
break;
case 'R': /* sequencial Read */
- case 'L': /* key's List */
- dbscan(db, (command == 'L') ? 1 : 0);
+ case 'L': /* primary key List */
+ dbscan(dbio, prefix, (command == 'L') ? 1 : 0);
break;
}
- if (db->close(db)) {
- die("db->close failed.");
- }
+ db_close(dbio);
+ if (exitflag)
+ exit(1);
exit(0);
}
/*
* dbwrite: write to database
*
- * i) db
+ * i) dbio database
*/
void
-dbwrite(db)
-DB *db;
+dbwrite(dbio)
+DBIO *dbio;
{
- DBT key, dat;
- int status;
-#define IDENTLEN 300
- char keybuf[IDENTLEN+1];
+ char *p;
+ char keybuf[MAXKEYLEN+1];
char *c;
+ signal_setup();
/*
* Input file format:
- * +------------------
- * |Key Data\n
- * |Key Data\n
+ * +--------------------------------------------------
+ * |Primary-key secondary-key-1 secondary-key-2 Data\n
+ * |Primary-key secondary-key-1 secondary-key-2 Data\n
* .
* .
- * - Key and Data are separated by blank('\t' or ' ').
- * - Key cannot include blank.
+ * - Keys and Data are separated by blank('\t' or ' ').
+ * - Keys cannot include blank.
* - Data can include blank.
- * - Null Data not allowed.
+ * - Null record not allowed.
+ * - Secondary-key is assumed as a part of data by db(3).
*
* META record:
* You can write meta record by making key start with a ' '.
@@ -279,127 +188,151 @@ DB *db;
* +------------------
* | __.VERSION 2
*/
- while (fgets(buf, BUFSIZ, stdin)) {
- if (buf[strlen(buf)-1] == '\n') /* chop(buf) */
- buf[strlen(buf)-1] = 0;
- else
- while (fgetc(stdin) != '\n')
- ;
- c = buf;
+ while (p = mgets(stdin, 0, NULL)) {
+ if (exitflag)
+ break;
+ c = p;
if (*c == ' ') { /* META record */
if (*++c == ' ')
- die("illegal format.");
+ die("key cannot include blanks.");
}
for (; *c && !isspace(*c); c++) /* skip key part */
;
if (*c == 0)
die("data part not found.");
- if (c - buf > IDENTLEN)
- die("key too long.");
- strncpy(keybuf, buf, c - buf); /* make key string */
- keybuf[c - buf] = 0;
+ if (c - p > MAXKEYLEN)
+ die("primary key too long.");
+ strncpy(keybuf, p, c - p); /* make key string */
+ keybuf[c - p] = 0;
for (; *c && isspace(*c); c++) /* skip blanks */
;
if (*c == 0)
die("data part is null.");
- entab(buf);
- key.data = keybuf;
- key.size = strlen(keybuf)+1;
- dat.data = buf;
- dat.size = strlen(buf)+1;
-
- status = (db->put)(db, &key, &dat, 0);
- switch (status) {
- case RET_SUCCESS:
- break;
- case RET_ERROR:
- case RET_SPECIAL:
- die("db->put: failed.");
- }
+ entab(p);
+ db_put(dbio, keybuf, p);
}
}
/*
* dbkey: Keyed search
*
- * i) db
- * i) skey
+ * i) dbio database
+ * i) skey key for search
+ * i) secondkey 0: primary key, >0: secondary key
*/
void
-dbkey(db, skey)
-DB *db;
+dbkey(dbio, skey, secondkey)
+DBIO *dbio;
char *skey;
+int secondkey;
{
- DBT dat, key;
- int status;
+ char *p;
- key.data = skey;
- key.size = strlen(skey)+1;
-
- for (status = (*db->seq)(db, &key, &dat, R_CURSOR);
- status == RET_SUCCESS && !strcmp(key.data, skey);
- status = (*db->seq)(db, &key, &dat, R_NEXT)) {
- detab((char *)dat.data, out);
- (void)fprintf(stdout, "%s\n", out);
+ if (!secondkey) {
+ for (p = db_first(dbio, skey, 0); p; p = db_next(dbio))
+ detab(stdout, p);
+ return;
}
- if (status == RET_ERROR)
- die("db->seq failed.");
+ dbbysecondkey(dbio, F_KEY, skey, secondkey);
}
/*
- * dbscan: Scan all records
+ * dbscan: Scan records
*
- * i) db
- * i) keylist
+ * i) dbio database
+ * i) prefix prefix of primary key
+ * i) keylist 0: key and data, 1: primary key only
*/
void
-dbscan(db, keylist)
-DB *db;
+dbscan(dbio, prefix, keylist)
+DBIO *dbio;
+char *prefix;
int keylist;
{
- DBT dat, key;
- int status;
- char prev[IDENTLEN+1];
+ char *p;
+ int flags = DBIO_SKIPMETA;
- prev[0] = 0;
- for (status = (*db->seq)(db, &key, &dat, R_FIRST);
- status == RET_SUCCESS;
- status = (*db->seq)(db, &key, &dat, R_NEXT)) {
- /* skip META record */
- if (*(char *)key.data == ' ')
- continue;
- if (keylist) {
- if (!strcmp(prev, (char *)key.data))
- continue;
- strcpy(prev, (char *)key.data);
- (void)fprintf(stdout, "%s\n", (char *)key.data);
- continue;
- }
- detab((char *)dat.data, out);
- (void)fprintf(stdout, "%s\n", out);
- }
- if (status == RET_ERROR)
- die("db->seq failed.");
+ if (prefix)
+ flags |= DBIO_PREFIX;
+ if (keylist)
+ flags |= DBIO_KEY;
+
+ for (p = db_first(dbio, prefix, flags); p; p = db_next(dbio))
+ detab(stdout, p);
}
/*
* dbdel: Delete records
*
- * i) db
- * i) skey key
+ * i) dbio database
+ * i) skey key for search
+ * i) secondkey 0: primary key, >0: secondary key
*/
void
-dbdel(db, skey)
-DB *db;
+dbdel(dbio, skey, secondkey)
+DBIO *dbio;
char *skey;
+int secondkey;
{
- DBT key;
- int status;
+ signal_setup();
+ if (!secondkey) {
+ db_del(dbio, skey);
+ return;
+ }
+ dbbysecondkey(dbio, F_DEL, skey, secondkey);
+}
+/*
+ * dbbysecondkey: proc by second key
+ *
+ * i) dbio database
+ * i) func F_KEY, F_DEL
+ * i) skey
+ * i) secondkey
+ */
+void
+dbbysecondkey(dbio, func, skey, secondkey)
+DBIO *dbio;
+int func;
+char *skey;
+int secondkey;
+{
+ char *c, *p;
+ int i;
- key.data = skey;
- key.size = strlen(skey)+1;
+ /* trim skey */
+ for (c = skey; *c && isspace(*c); c++)
+ ;
+ skey = c;
+ for (c = skey+strlen(skey)-1; *c && isspace(*c); c--)
+ *c = 0;
- status = (*db->del)(db, &key, 0);
- if (status == RET_ERROR)
- die("db->del failed.");
+ for (p = db_first(dbio, NULL, DBIO_SKIPMETA); p; p = db_next(dbio)) {
+ if (exitflag)
+ break;
+ c = p;
+ /* reach to specified key */
+ for (i = secondkey; i; i--) {
+ for (; *c && !isspace(*c); c++)
+ ;
+ if (*c == 0)
+ die("specified key not found.");
+ for (; *c && isspace(*c); c++)
+ ;
+ if (*c == 0)
+ die("specified key not found.");
+ }
+ i = strlen(skey);
+ if (!strncmp(c, skey, i) && (*(c+i) == 0 || isspace(*(c+i)))) {
+ switch (func) {
+ case F_KEY:
+ detab(stdout, p);
+ break;
+ case F_DEL:
+ db_del(dbio, NULL);
+ break;
+ }
+ }
+ if (exitflag)
+ break;
+ }
}
diff --git a/contrib/global/gtags.el b/contrib/global/gtags.el
index 2f6eda0..2a8de79 100644
--- a/contrib/global/gtags.el
+++ b/contrib/global/gtags.el
@@ -30,12 +30,12 @@
;; OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
;; SUCH DAMAGE.
;;
-;; gtags.el 6-Jul-97
+;; gtags.el 31-Aug-97
;;
;; This file is part of GLOBAL.
;; Author: Shigio Yamaguchi <shigio@wafu.netgate.net>
-;; Version: 1.0
+;; Version: 1.1
;; Keywords: tools
;;; Code
@@ -56,6 +56,8 @@
"Keymap used in gtags mode.")
(define-key gtags-mode-map "\et" 'gtags-find-tag)
(define-key gtags-mode-map "\er" 'gtags-find-rtag)
+(define-key gtags-mode-map "\es" 'gtags-find-symbol)
+(define-key gtags-mode-map "\eg" 'gtags-find-pattern)
(define-key gtags-mode-map "\C-]" 'gtags-find-tag-from-here)
(define-key gtags-mode-map "\C-t" 'gtags-pop-stack)
(define-key gtags-mode-map "\e." 'etags-style-find-tag)
@@ -69,13 +71,17 @@
(define-key gtags-select-mode-map "\C-m" 'gtags-select-tag)
(define-key gtags-select-mode-map " " 'scroll-up)
(define-key gtags-select-mode-map "\^?" 'scroll-down)
+(define-key gtags-select-mode-map "\C-f" 'scroll-up)
+(define-key gtags-select-mode-map "\C-b" 'scroll-down)
(define-key gtags-select-mode-map "n" 'next-line)
(define-key gtags-select-mode-map "p" 'previous-line)
+(define-key gtags-select-mode-map "j" 'next-line)
+(define-key gtags-select-mode-map "k" 'previous-line)
(define-key gtags-select-mode-map [mouse-2] 'gtags-select-tag-by-event)
(define-key gtags-select-mode-map [mouse-3] 'gtags-pop-stack)
;;
-;; utirity
+;; utility
;;
(defun match-string (n)
(buffer-substring (match-beginning n) (match-end n)))
@@ -114,6 +120,15 @@
(defun exist-in-stack (buffer)
(memq buffer gtags-buffer-stack))
+;; is it a function?
+(defun is-function ()
+ (save-excursion
+ (while (and (not (eolp)) (looking-at "[0-9A-Za-z_]"))
+ (forward-char 1))
+ (while (and (not (eolp)) (looking-at "[ \t]"))
+ (forward-char 1))
+ (if (looking-at "(") t nil)))
+
;; is it a definition?
(defun is-definition ()
(save-excursion
@@ -139,7 +154,7 @@
(let (tagname)
(setq tagname (completing-read ":tag " gtags-complete-list))
(push-context)
- (gtags-goto-tag tagname t)))
+ (gtags-goto-tag tagname "")))
(defun etags-style-find-tag ()
"Input tag name and move to the definition.(etags style)"
@@ -152,7 +167,33 @@
(setq input (completing-read prompt gtags-complete-list))
(if (not (equal "" input)) (setq tagname input))
(push-context)
- (gtags-goto-tag tagname t)))
+ (gtags-goto-tag tagname "")))
+
+(defun gtags-find-symbol ()
+ "Input symbol and move to the locations."
+ (interactive)
+ (let (tagname prompt input)
+ (setq tagname (gtags-current-token))
+ (if tagname
+ (setq prompt (concat "Find symbol: (default " tagname ") "))
+ (setq prompt "Find symbol: "))
+ (setq input (read-string prompt))
+ (if (not (equal "" input)) (setq tagname input))
+ (push-context)
+ (gtags-goto-tag tagname "s")))
+
+(defun gtags-find-pattern ()
+ "Input pattern and move to the locations."
+ (interactive)
+ (let (tagname prompt input)
+ (setq tagname (gtags-current-token))
+ (if tagname
+ (setq prompt (concat "Find pattern: (default " tagname ") "))
+ (setq prompt "Find pattern: "))
+ (setq input (read-string prompt))
+ (if (not (equal "" input)) (setq tagname input))
+ (push-context)
+ (gtags-goto-tag tagname "g")))
(defun gtags-find-rtag ()
"Input tag name and move to the referenced point."
@@ -160,17 +201,20 @@
(let (tagname)
(setq tagname (completing-read ":rtag " gtags-complete-list))
(push-context)
- (gtags-goto-tag tagname nil)))
+ (gtags-goto-tag tagname "r")))
(defun gtags-find-tag-from-here ()
"Get the expression as a tagname around here and move there."
(interactive)
- (let (tagname)
+ (let (tagname flag)
(setq tagname (gtags-current-token))
+ (if (is-function)
+ (if (is-definition) (setq flag "r") (setq flag ""))
+ (setq flag "s"))
(if (not tagname)
nil
(push-context)
- (gtags-goto-tag tagname (not (is-definition))))))
+ (gtags-goto-tag tagname flag))))
(defun gtags-find-tag-by-event (event)
"Get the expression as a tagname around here and move there."
@@ -178,16 +222,17 @@
(select-window (posn-window (event-end event)))
(set-buffer (window-buffer (posn-window (event-end event))))
(goto-char (posn-point (event-end event)))
- (let (tagname definition)
- (setq definition nil)
+ (let (tagname flag)
(if (= 0 (count-lines (point-min) (point-max)))
- (setq tagname "main")
+ (progn (setq tagname "main") (setq flag ""))
(setq tagname (gtags-current-token))
- (setq definition (is-definition)))
+ (if (is-function)
+ (if (is-definition) (setq flag "r") (setq flag ""))
+ (setq flag "s")))
(if (not tagname)
nil
(push-context)
- (gtags-goto-tag tagname (not definition)))))
+ (gtags-goto-tag tagname flag))))
(defun gtags-select-tag ()
"Select a tagname in [GTAGS SELECT MODE] and move there."
@@ -223,16 +268,22 @@
;;
;; goto tag's point
-(defun gtags-goto-tag (tagname definition)
- (let (save flags buffer lines)
+(defun gtags-goto-tag (tagname flag)
+ (let (save prefix buffer lines)
(setq save (current-buffer))
- (if definition
- (setq flags "") (setq flags "r"))
+ (cond
+ ((equal flag "g")
+ (setq prefix "(G)"))
+ ((equal flag "s")
+ (setq prefix "(S)"))
+ ((equal flag "r")
+ (setq prefix "(R)"))
+ (t (setq prefix "(D)")))
;; load tag
- (setq buffer (generate-new-buffer (generate-new-buffer-name (concat (if (equal flags "") "(D)" "(R)") tagname))))
+ (setq buffer (generate-new-buffer (generate-new-buffer-name (concat prefix tagname))))
(set-buffer buffer)
- (if (not (= 0 (call-process "global" nil t nil (concat "-ax" flags) tagname)))
- (progn (message "cannot execute global.")
+ (if (not (= 0 (call-process "global" nil t nil (concat "-ax" flag) tagname)))
+ (progn (message (buffer-substring (point-min)(1- (point-max))))
(pop-context))
(goto-char (point-min))
(setq lines (count-lines (point-min) (point-max)))
@@ -253,7 +304,8 @@
(let (line file)
;; get context from current tag line
(beginning-of-line)
- (if (not (looking-at "[A-Za-z_][A-Za-z_0-9]*[ \t]+\\([0-9]+\\)[ \t]\\([^ \t]+\\)[ \t]"))
+;; (if (not (looking-at "[A-Za-z_][A-Za-z_0-9]*[ \t]+\\([0-9]+\\)[ \t]\\([^ \t]+\\)[ \t]"))
+ (if (not (looking-at "[^ \t]+[ \t]+\\([0-9]+\\)[ \t]\\([^ \t]+\\)[ \t]"))
(pop-context)
(setq line (string-to-number (match-string 1)))
(setq file (match-string 2))
diff --git a/contrib/global/htags/htags.1 b/contrib/global/htags/htags.1
index b256eb8..e2f0355 100644
--- a/contrib/global/htags/htags.1
+++ b/contrib/global/htags/htags.1
@@ -108,10 +108,9 @@ If this variable is set, its value is used as the directory to make temporary fi
Default is /tmp.
.Sh DIAGNOSTICS
.Nm Htags
-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 gtags 1 .
.Sh BUG
@@ -121,4 +120,4 @@ Shigio Yamaguchi (shigio@wafu.netgate.net)
.Sh HISTORY
The
.Nm
-command appeared in FreeBSD 2.2.
+command appeared in FreeBSD 2.2.2.
OpenPOWER on IntegriCloud