xref: /openbsd-src/usr.bin/vi/ex/tag.h (revision 2d8e1df37d8148ce4bec21e889338197aa6e3adb)
1 /*	$OpenBSD: tag.h,v 1.7 2015/11/19 07:53:31 bentley Exp $	*/
2 
3 /*-
4  * Copyright (c) 1992, 1993, 1994
5  *	The Regents of the University of California.  All rights reserved.
6  * Copyright (c) 1992, 1993, 1994, 1995, 1996
7  *	Keith Bostic.  All rights reserved.
8  * Copyright (c) 1994, 1996
9  *	Rob Mayoff.  All rights reserved.
10  *
11  * See the LICENSE file for redistribution information.
12  *
13  *	@(#)tag.h	10.5 (Berkeley) 5/15/96
14  */
15 
16 /*
17  * Tag file information.  One of these is maintained per tag file, linked
18  * from the EXPRIVATE structure.
19  */
20 struct _tagf {			/* Tag files. */
21 	TAILQ_ENTRY(_tagf) q;	/* Linked list of tag files. */
22 	char	*name;		/* Tag file name. */
23 	int	 errnum;	/* Errno. */
24 
25 #define	TAGF_ERR	0x01	/* Error occurred. */
26 #define	TAGF_ERR_WARN	0x02	/* Error reported. */
27 	u_int8_t flags;
28 };
29 
30 /*
31  * Tags are structured internally as follows:
32  *
33  * +----+    +----+	+----+     +----+
34  * | EP | -> | Q1 | <-- | T1 | <-- | T2 |
35  * +----+    +----+ --> +----+ --> +----+
36  *	     |
37  *	     +----+     +----+
38  *	     | Q2 | <-- | T1 |
39  *	     +----+ --> +----+
40  *	     |
41  *	     +----+	+----+
42  *	     | Q3 | <-- | T1 |
43  *	     +----+ --> +----+
44  *
45  * Each Q is a TAGQ, or tag "query", which is the result of one tag.
46  * Each Q references one or more TAG's, or tagged file locations.
47  *
48  * tag:		put a new Q at the head	(^])
49  * tagnext:	T1 -> T2 inside Q	(^N)
50  * tagprev:	T2 -> T1 inside Q	(^P)
51  * tagpop:	discard Q		(^T)
52  * tagtop:	discard all Q
53  */
54 struct _tag {			/* Tag list. */
55 	TAILQ_ENTRY(_tag) q;	/* Linked list of tags. */
56 
57 				/* Tag pop/return information. */
58 	FREF	*frp;		/* Saved file. */
59 	recno_t	 lno;		/* Saved line number. */
60 	size_t	 cno;		/* Saved column number. */
61 
62 	char	*fname;		/* Filename. */
63 	size_t	 fnlen;		/* Filename length. */
64 	recno_t	 slno;		/* Search line number. */
65 	char	*search;	/* Search string. */
66 	size_t	 slen;		/* Search string length. */
67 
68 	char	 buf[1];	/* Variable length buffer. */
69 };
70 
71 struct _tagq {			/* Tag queue. */
72 	TAILQ_ENTRY(_tagq) q;	/* Linked list of tag queues. */
73 				/* This queue's tag list. */
74 	TAILQ_HEAD(_tagqh, _tag) tagq;
75 
76 	TAG	*current;	/* Current TAG within the queue. */
77 
78 	char	*tag;		/* Tag string. */
79 	size_t	 tlen;		/* Tag string length. */
80 
81 	u_int8_t flags;
82 
83 	char	 buf[1];	/* Variable length buffer. */
84 };
85