ed.h revision 1057
1139826Simp/* ed.h: type and constant definitions for the ed editor. */
253541Sshin/*
353541Sshin * Copyright (c) 1993 Andrew Moore
453541Sshin * All rights reserved.
553541Sshin *
653541Sshin * Redistribution and use in source and binary forms, with or without
753541Sshin * modification, are permitted provided that the following conditions
853541Sshin * are met:
953541Sshin * 1. Redistributions of source code must retain the above copyright
1053541Sshin *    notice, this list of conditions and the following disclaimer.
1153541Sshin * 2. Redistributions in binary form must reproduce the above copyright
1253541Sshin *    notice, this list of conditions and the following disclaimer in the
1353541Sshin *    documentation and/or other materials provided with the distribution.
1453541Sshin *
1553541Sshin * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
1653541Sshin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1753541Sshin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1853541Sshin * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
1953541Sshin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2053541Sshin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2153541Sshin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2253541Sshin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2353541Sshin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2453541Sshin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2553541Sshin * SUCH DAMAGE.
2653541Sshin *
2753541Sshin *	@(#)$Id: ed.h,v 1.4 1993/12/15 15:22:02 alm Exp alm $
28174510Sobrien */
29174510Sobrien
30174510Sobrien#if defined(BSD) && BSD >= 199103 || defined(__386BSD__)
3153541Sshin# include <sys/param.h>		/* for MAXPATHLEN */
3253541Sshin#endif
3353541Sshin#include <errno.h>
3462587Sitojun#ifdef sun
3553541Sshin# include <limits.h>
3662587Sitojun#endif
3762587Sitojun#include <regex.h>
3862587Sitojun#include <signal.h>
3962587Sitojun#include <stdio.h>
4062587Sitojun#include <stdlib.h>
4153541Sshin#include <string.h>
4278064Sume#include <unistd.h>
4353541Sshin
44186119Sqingli#define ERR		(-2)
45151539Ssuz#define EMOD		(-3)
4662587Sitojun#define FATAL		(-4)
4778064Sume
4878064Sume#ifndef MAXPATHLEN
4978064Sume# define MAXPATHLEN 255		/* _POSIX_PATH_MAX */
5078064Sume#endif
5178064Sume
5278064Sume#define MINBUFSZ 512		/* minimum buffer size - must be > 0 */
5378064Sume#define SE_MAX 30		/* max subexpressions in a regular expression */
5478064Sume#ifdef INT_MAX
5562587Sitojun# define LINECHARS INT_MAX	/* max chars per line */
5662587Sitojun#else
5762587Sitojun# define LINECHARS MAXINT	/* max chars per line */
5862587Sitojun#endif
5962587Sitojun
6053541Sshin/* gflags */
6162587Sitojun#define GLB 001		/* global command */
62186119Sqingli#define GPR 002		/* print after command */
6362587Sitojun#define GLS 004		/* list after command */
6453541Sshin#define GNP 010		/* enumerate after command */
6562587Sitojun#define GSG 020		/* global substitute */
6662587Sitojun
6762587Sitojuntypedef regex_t pattern_t;
6862587Sitojun
6962587Sitojun/* Line node */
7062587Sitojuntypedef struct	line {
7162587Sitojun	struct line	*q_forw;
7262587Sitojun	struct line	*q_back;
73121161Sume	off_t		seek;		/* address of line in scratch buffer */
7495023Ssuz	int		len;		/* length of line */
7578064Sume} line_t;
7678064Sume
7778064Sume
7853541Sshintypedef struct undo {
7953541Sshin
8062587Sitojun/* type of undo nodes */
81118498Sume#define UADD	0
82238273Shrs#define UDEL 	1
83151474Ssuz#define UMOV	2
84151474Ssuz#define VMOV	3
85151474Ssuz
86151539Ssuz	int type;			/* command type */
87197138Shrs	line_t	*h;			/* head of list */
88222728Shrs	line_t  *t;			/* tail of list */
89245230Sume} undo_t;
90282805Shrs
9162587Sitojun#ifndef max
92121161Sume# define max(a,b) ((a) > (b) ? (a) : (b))
93121161Sume#endif
94121161Sume#ifndef min
95121161Sume# define min(a,b) ((a) < (b) ? (a) : (b))
96121161Sume#endif
97121161Sume
98121161Sume#define INC_MOD(l, k)	((l) + 1 > (k) ? 0 : (l) + 1)
99121161Sume#define DEC_MOD(l, k)	((l) - 1 < 0 ? (k) : (l) - 1)
100121161Sume
101121161Sume/* SPL1: disable some interrupts (requires reliable signals) */
10253541Sshin#define SPL1() mutex++
10362587Sitojun
10462587Sitojun/* SPL0: enable all interrupts; check sigflags (requires reliable signals) */
10553541Sshin#define SPL0() \
10653541Sshinif (--mutex == 0) { \
10753541Sshin	if (sigflags & (1 << (SIGHUP - 1))) handle_hup(SIGHUP); \
10853541Sshin	if (sigflags & (1 << (SIGINT - 1))) handle_int(SIGINT); \
10953541Sshin}
11053541Sshin
11162587Sitojun/* STRTOL: convert a string to long */
11262587Sitojun#define STRTOL(i, p) { \
11353541Sshin	if (((i = strtol(p, &p, 10)) == LONG_MIN || i == LONG_MAX) && \
11462587Sitojun	    errno == ERANGE) { \
11553541Sshin		sprintf(errmsg, "number out of range"); \
11653541Sshin	    	i = 0; \
11753541Sshin		return ERR; \
11853541Sshin	} \
11953541Sshin}
12062587Sitojun
12153541Sshin#if defined(sun) || defined(NO_REALLOC_NULL)
12253541Sshin/* REALLOC: assure at least a minimum size for buffer b */
12353541Sshin#define REALLOC(b,n,i,err) \
12478064Sumeif ((i) > (n)) { \
12578064Sume	int ti = (n); \
12678064Sume	char *ts; \
12778064Sume	SPL1(); \
12878064Sume	if ((b) != NULL) { \
12978064Sume		if ((ts = (char *) realloc((b), ti += max((i), MINBUFSZ))) == NULL) { \
13081369Ssimokawa			fprintf(stderr, "%s\n", strerror(errno)); \
13178064Sume			sprintf(errmsg, "out of memory"); \
132121472Sume			SPL0(); \
133121472Sume			return err; \
134121472Sume		} \
135121472Sume	} else { \
136121472Sume		if ((ts = (char *) malloc(ti += max((i), MINBUFSZ))) == NULL) { \
137121472Sume			fprintf(stderr, "%s\n", strerror(errno)); \
138121472Sume			sprintf(errmsg, "out of memory"); \
139121472Sume			SPL0(); \
140121472Sume			return err; \
141121472Sume		} \
142121472Sume	} \
143121472Sume	(n) = ti; \
144121472Sume	(b) = ts; \
145121472Sume	SPL0(); \
146121472Sume}
147121472Sume#else /* NO_REALLOC_NULL */
148121472Sume/* REALLOC: assure at least a minimum size for buffer b */
149121472Sume#define REALLOC(b,n,i,err) \
15053541Sshinif ((i) > (n)) { \
15162587Sitojun	int ti = (n); \
15253541Sshin	char *ts; \
15353541Sshin	SPL1(); \
15462587Sitojun	if ((ts = (char *) realloc((b), ti += max((i), MINBUFSZ))) == NULL) { \
15553541Sshin		fprintf(stderr, "%s\n", strerror(errno)); \
15662587Sitojun		sprintf(errmsg, "out of memory"); \
15795023Ssuz		SPL0(); \
15895023Ssuz		return err; \
15995023Ssuz	} \
16062587Sitojun	(n) = ti; \
16162587Sitojun	(b) = ts; \
16253541Sshin	SPL0(); \
16353541Sshin}
16453541Sshin#endif /* NO_REALLOC_NULL */
16553541Sshin
16678064Sume/* REQUE: link pred before succ */
16778064Sume#define REQUE(pred, succ) (pred)->q_forw = (succ), (succ)->q_back = (pred)
16878064Sume
16978064Sume#ifdef NEED_INSQUE
17078064Sume/* insque: insert elem in circular queue after pred */
171121472Sume#define insque(elem, pred) \
172121472Sume{ \
173121472Sume	REQUE((elem), (pred)->q_forw); \
17478064Sume	REQUE((pred), elem); \
17578064Sume}
17678064Sume
17778064Sume/* remque: remove_lines elem from circular queue */
17878064Sume#define remque(elem) REQUE((elem)->q_back, (elem)->q_forw);
17981369Ssimokawa#endif /* NEED_INSQUE */
18078064Sume
18178064Sume/* NUL_TO_NEWLINE: overwrite ASCII NULs with newlines */
18278064Sume#define NUL_TO_NEWLINE(s, l) translit_text(s, l, '\0', '\n')
18378064Sume
18478064Sume/* NEWLINE_TO_NUL: overwrite newlines with ASCII NULs */
18578064Sume#define NEWLINE_TO_NUL(s, l) translit_text(s, l, '\n', '\0')
18678064Sume
18778064Sume#ifndef strerror
18878064Sume# define strerror(n) sys_errlist[n]
18978064Sume#endif
19078064Sume
19178064Sume#ifndef __P
19278064Sume# ifndef __STDC__
19378064Sume#  define __P(proto) ()
19478064Sume# else
19578064Sume#  define __P(proto) proto
19678064Sume# endif
19778064Sume#endif
19853541Sshin
19962587Sitojun/* Local Function Declarations */
20062587Sitojunvoid add_line_node __P((line_t *));
20153541Sshinint append_lines __P((long));
20253541Sshinint apply_subst_template __P((char *, regmatch_t *, int, int));
20362587Sitojunint build_active_list __P((int));
20462587Sitojunint cbc_decode __P((char *, FILE *));
20562587Sitojunint cbc_encode __P((char *, int, FILE *));
20662587Sitojunint check_addr_range __P((long, long));
20762587Sitojunvoid clear_active_list __P((void));
20878064Sumevoid clear_undo_stack __P((void));
20978064Sumeint close_sbuf __P((void));
21078064Sumeint copy_lines __P((long));
21162587Sitojunint delete_lines __P((long, long));
21253541Sshinvoid des_error __P((char *));
21395023Ssuzint display_lines __P((long, long, int));
21495023Ssuzline_t *dup_line_node __P((line_t *));
21562587Sitojunint exec_command __P((void));
21653541Sshinlong exec_global __P((int, int));
21762587Sitojunvoid expand_des_key __P((char *, char *));
21853541Sshinint extract_addr_range __P((void));
21953541Sshinchar *extract_pattern __P((int));
22053541Sshinint extract_subst_tail __P((int *, int *));
22162587Sitojunchar *extract_subst_template __P((void));
22262587Sitojunint filter_lines __P((long, long, char *));
22362587Sitojunint flush_des_file __P((FILE *));
22462587Sitojunline_t *get_addressed_line_node __P((long));
22562587Sitojunpattern_t *get_compiled_pattern __P((void));
22678064Sumeint get_des_char __P((FILE *));
22778064Sumechar *get_extended_line __P((int *, int));
22878064Sumechar *get_filename __P((void));
22978064Sumeint get_keyword __P((void));
23062587Sitojunlong get_line_node_addr __P((line_t *));
231121807Sumelong get_matching_node_addr __P((pattern_t *, int));
23253541Sshinlong get_marked_node_addr __P((int));
23353541Sshinchar *get_sbuf_line __P((line_t *));
23462587Sitojunint get_shell_command __P((void));
235295583Smarkjint get_stream_line __P((FILE *));
23662587Sitojunint get_tty_line __P((void));
237295583Smarkjvoid handle_hup __P((int));
238295583Smarkjvoid handle_int __P((int));
23953541Sshinvoid handle_winch __P((int));
24053541Sshinint has_trailing_escape __P((char *, char *));
241295583Smarkjint hex_to_binary __P((int, int));
242151539Ssuzvoid init_buffers __P((void));
243296063Smarkjvoid init_des_cipher __P((void));
24453541Sshinint is_legal_filename __P((char *));
24553541Sshinint join_lines __P((long, long));
246151539Ssuzint mark_line_node __P((line_t *, int));
247151539Ssuzint move_lines __P((long));
248151539Ssuzline_t *next_active_node __P(());
249151539Ssuzlong next_addr __P((void));
250151539Ssuzint open_sbuf __P((void));
251151539Ssuzchar *parse_char_class __P((char *));
252151539Ssuzint pop_undo_stack __P((void));
253151539Ssuzundo_t *push_undo_stack __P((int, long, long));
254151539Ssuzint put_des_char __P((int, FILE *));
255151539Ssuzchar *put_sbuf_line __P((char *));
256151539Ssuzint put_stream_line __P((FILE *, char *, int));
257151539Ssuzint put_tty_line __P((char *, int, long, int));
258151539Ssuzvoid quit __P((int));
259151539Ssuzlong read_file __P((char *, long));
26053541Sshinlong read_stream __P((FILE *, long));
26162587Sitojunint search_and_replace __P((pattern_t *, int, int));
26260938Sjakeint set_active_node __P((line_t *));
26362587Sitojunvoid set_des_key __P((char *));
26462587Sitojunvoid signal_hup __P((int));
265151539Ssuzvoid signal_int __P((int));
26662587Sitojunchar *strip_escapes __P((char *));
26762587Sitojunint substitute_matching_text __P((pattern_t *, line_t *, int, int));
268151539Ssuzchar *translit_text __P((char *, int, int, int));
26962587Sitojunvoid unmark_line_node __P((line_t *));
27062587Sitojunvoid unset_active_nodes __P((line_t *, line_t *));
271151539Ssuzlong write_file __P((char *, char *, long, long));
272151539Ssuzlong write_stream __P((FILE *, long, long));
27362587Sitojun
27478064Sume/* global buffers */
27553541Sshinextern char stdinbuf[];
27660938Sjakeextern char *ibuf;
27753541Sshinextern char *ibufp;
27878064Sumeextern int ibufsz;
27953541Sshin
28053541Sshin/* global flags */
28162587Sitojunextern int isbinary;
28262587Sitojunextern int isglobal;
28362587Sitojunextern int modified;
284151539Ssuzextern int mutex;
28553541Sshinextern int sigflags;
28653541Sshin
28753541Sshin/* global vars */
28853541Sshinextern long addr_last;
28953541Sshinextern long current_addr;
29053541Sshinextern char errmsg[];
29153541Sshinextern long first_addr;
29272093Sasmodaiextern int lineno;
29353541Sshinextern long second_addr;
29462587Sitojun#ifdef sun
29553541Sshinextern char *sys_errlist[];
29653541Sshin#endif
29753541Sshin