1/*-
2 * Copyright (c) 1992 Diomidis Spinellis.
3 * Copyright (c) 1992, 1993
4 *	The Regents of the University of California.  All rights reserved.
5 *
6 * This code is derived from software contributed to Berkeley by
7 * Diomidis Spinellis of Imperial College, University of London.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 *    notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 *    notice, this list of conditions and the following disclaimer in the
16 *    documentation and/or other materials provided with the distribution.
17 * 4. Neither the name of the University nor the names of its contributors
18 *    may be used to endorse or promote products derived from this software
19 *    without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 *	@(#)defs.h	8.1 (Berkeley) 6/6/93
34 * $FreeBSD$
35 */
36
37/*
38 * Types of address specifications
39 */
40enum e_atype {
41	AT_RE	    = 1,			/* Line that match RE */
42	AT_LINE,				/* Specific line */
43	AT_RELLINE,				/* Relative line */
44	AT_LAST,				/* Last line */
45};
46
47/*
48 * Format of an address
49 */
50struct s_addr {
51	enum e_atype type;			/* Address type */
52	union {
53		u_long l;			/* Line number */
54		regex_t *r;			/* Regular expression */
55	} u;
56};
57
58/*
59 * Substitution command
60 */
61struct s_subst {
62	int n;					/* Occurrence to subst. */
63	int p;					/* True if p flag */
64	int icase;				/* True if I flag */
65	char *wfile;				/* NULL if no wfile */
66	int wfd;				/* Cached file descriptor */
67	regex_t *re;				/* Regular expression */
68	unsigned int maxbref;			/* Largest backreference. */
69	u_long linenum;				/* Line number. */
70	char *new;				/* Replacement text */
71};
72
73/*
74 * Translate command.
75 */
76struct s_tr {
77	unsigned char bytetab[256];
78	struct trmulti {
79		size_t fromlen;
80		char from[MB_LEN_MAX];
81		size_t tolen;
82		char to[MB_LEN_MAX];
83	} *multis;
84	int nmultis;
85};
86
87/*
88 * An internally compiled command.
89 * Initialy, label references are stored in t, on a second pass they
90 * are updated to pointers.
91 */
92struct s_command {
93	struct s_command *next;			/* Pointer to next command */
94	struct s_addr *a1, *a2;			/* Start and end address */
95	u_long startline;			/* Start line number or zero */
96	char *t;				/* Text for : a c i r w */
97	union {
98		struct s_command *c;		/* Command(s) for b t { */
99		struct s_subst *s;		/* Substitute command */
100		struct s_tr *y;			/* Replace command array */
101		int fd;				/* File descriptor for w */
102	} u;
103	char code;				/* Command code */
104	u_int nonsel:1;				/* True if ! */
105};
106
107/*
108 * Types of command arguments recognised by the parser
109 */
110enum e_args {
111	EMPTY,			/* d D g G h H l n N p P q x = \0 */
112	TEXT,			/* a c i */
113	NONSEL,			/* ! */
114	GROUP,			/* { */
115	ENDGROUP,		/* } */
116	COMMENT,		/* # */
117	BRANCH,			/* b t */
118	LABEL,			/* : */
119	RFILE,			/* r */
120	WFILE,			/* w */
121	SUBST,			/* s */
122	TR			/* y */
123};
124
125/*
126 * Structure containing things to append before a line is read
127 */
128struct s_appends {
129	enum {AP_STRING, AP_FILE} type;
130	char *s;
131	size_t len;
132};
133
134enum e_spflag {
135	APPEND,					/* Append to the contents. */
136	REPLACE,				/* Replace the contents. */
137};
138
139/*
140 * Structure for a space (process, hold, otherwise).
141 */
142typedef struct {
143	char *space;		/* Current space pointer. */
144	size_t len;		/* Current length. */
145	int deleted;		/* If deleted. */
146	int append_newline;	/* If originally terminated by \n. */
147	char *back;		/* Backing memory. */
148	size_t blen;		/* Backing memory length. */
149} SPACE;
150