1 /*
2  * Copyright (c) 1984,1985,1989,1994,1995  Mark Nudelman
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice in the documentation and/or other materials provided with
12  *    the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
20  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
21  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
22  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
23  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
24  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26 
27 
28 /*
29  * Standard include file for "less".
30  */
31 
32 /*
33  * Include the file of compile-time options.
34  * The <> make cc search for it in -I., not srcdir.
35  */
36 #include <defines.h>
37 
38 #ifdef _SEQUENT_
39 /*
40  * Kludge for Sequent Dynix systems that have sigsetmask, but
41  * it's not compatible with the way less calls it.
42  * {{ Do other systems need this? }}
43  */
44 #undef HAVE_SIGSETMASK
45 #endif
46 
47 /*
48  * Language details.
49  */
50 #if HAVE_VOID
51 #define	VOID_POINTER	void *
52 #else
53 #define	VOID_POINTER	char *
54 #define	void  int
55 #endif
56 
57 #define	public		/* PUBLIC FUNCTION */
58 
59 /* Library function declarations */
60 
61 #if HAVE_SYS_TYPES_H
62 #include <sys/types.h>
63 #endif
64 #if HAVE_STDIO_H
65 #include <stdio.h>
66 #endif
67 #if HAVE_FCNTL_H
68 #include <fcntl.h>
69 #endif
70 #if HAVE_UNISTD_H
71 #include <unistd.h>
72 #endif
73 #if HAVE_CTYPE_H
74 #include <ctype.h>
75 #endif
76 #if STDC_HEADERS
77 #include <stdlib.h>
78 #include <string.h>
79 #endif
80 
81 #if !STDC_HEADERS
82 char *getenv();
83 off_t lseek();
84 VOID_POINTER calloc();
85 void free();
86 #endif
87 
88 #if !HAVE_UPPER_LOWER
89 #define	isupper(c)	((c) >= 'A' && (c) <= 'Z')
90 #define	islower(c)	((c) >= 'a' && (c) <= 'z')
91 #define	toupper(c)	((c) - 'a' + 'A')
92 #define	tolower(c)	((c) - 'A' + 'a')
93 #endif
94 
95 #ifndef NULL
96 #define	NULL	0
97 #endif
98 
99 #ifndef TRUE
100 #define	TRUE		1
101 #endif
102 #ifndef FALSE
103 #define	FALSE		0
104 #endif
105 
106 #define	OPT_OFF		0
107 #define	OPT_ON		1
108 #define	OPT_ONPLUS	2
109 
110 #ifndef HAVE_MEMCPY
111 #ifndef memcpy
112 #define	memcpy(to,from,len)	bcopy((from),(to),(len))
113 #endif
114 #endif
115 
116 #define	BAD_LSEEK	((off_t)-1)
117 
118 /*
119  * Special types and constants.
120  */
121 typedef long		POSITION;
122 /*
123  * {{ Warning: if POSITION is changed to other than "long",
124  *    you may have to change some of the printfs which use "%ld"
125  *    to print a variable of type POSITION. }}
126  */
127 
128 #define	NULL_POSITION	((POSITION)(-1))
129 
130 /*
131  * Flags for open()
132  */
133 #if MSOFTC || OS2
134 #define	OPEN_READ	(O_RDONLY|O_BINARY)
135 #else
136 #define	OPEN_READ	(0)
137 #endif
138 #if MSOFTC || OS2
139 #define	OPEN_APPEND	(O_APPEND|O_WRONLY)
140 #else
141 #define	OPEN_APPEND	(1)
142 #endif
143 
144 #if MSOFTC || OS2
145 #define	OPEN_TTYIN()	open("CON", O_BINARY|O_RDONLY)
146 #else
147 #define	OPEN_TTYIN()	open("/dev/tty", 0)
148 #endif
149 
150 /*
151  * An IFILE represents an input file.
152  */
153 #define	IFILE		VOID_POINTER
154 #define	NULL_IFILE	((IFILE)NULL)
155 
156 /*
157  * The structure used to represent a "screen position".
158  * This consists of a file position, and a screen line number.
159  * The meaning is that the line starting at the given file
160  * position is displayed on the ln-th line of the screen.
161  * (Screen lines before ln are empty.)
162  */
163 struct scrpos
164 {
165 	POSITION pos;
166 	int ln;
167 };
168 
169 typedef union parg
170 {
171 	char *p_string;
172 	int p_int;
173 } PARG;
174 
175 #define	NULL_PARG	((PARG *)NULL)
176 
177 struct textlist
178 {
179 	char *string;
180 	char *endstring;
181 };
182 
183 #define	EOI		(-1)
184 
185 #define	READ_INTR	(-2)
186 
187 /* How quiet should we be? */
188 #define	NOT_QUIET	0	/* Ring bell at eof and for errors */
189 #define	LITTLE_QUIET	1	/* Ring bell only for errors */
190 #define	VERY_QUIET	2	/* Never ring bell */
191 
192 /* How should we prompt? */
193 #define	PR_SHORT	0	/* Prompt with colon */
194 #define	PR_MEDIUM	1	/* Prompt with message */
195 #define	PR_LONG		2	/* Prompt with longer message */
196 
197 /* How should we handle backspaces? */
198 #define	BS_SPECIAL	0	/* Do special things for underlining and bold */
199 #define	BS_NORMAL	1	/* \b treated as normal char; actually output */
200 #define	BS_CONTROL	2	/* \b treated as control char; prints as ^H */
201 
202 /* How should we search? */
203 #define	SRCH_FORW	0001	/* Search forward from current position */
204 #define	SRCH_BACK	0002	/* Search backward from current position */
205 #define	SRCH_FIND_ALL	0010	/* Find and highlight all matches */
206 #define	SRCH_NOMATCH	0100	/* Search for non-matching lines */
207 #define	SRCH_PAST_EOF	0200	/* Search past end-of-file, into next file */
208 #define	SRCH_FIRST_FILE	0400	/* Search starting at the first file */
209 
210 #define	SRCH_REVERSE(t)	(((t) & SRCH_FORW) ? \
211 				(((t) & ~SRCH_FORW) | SRCH_BACK) : \
212 				(((t) & ~SRCH_BACK) | SRCH_FORW))
213 
214 /* */
215 #define	NO_MCA		0
216 #define	MCA_DONE	1
217 #define	MCA_MORE	2
218 
219 #define	CC_OK		0	/* Char was accepted & processed */
220 #define	CC_QUIT		1	/* Char was a request to abort current cmd */
221 #define	CC_ERROR	2	/* Char could not be accepted due to error */
222 #define	CC_PASS		3	/* Char was rejected (internal) */
223 
224 /* Special chars used to tell put_line() to do something special */
225 #define	AT_NORMAL	(0)
226 #define	AT_UNDERLINE	(1)
227 #define	AT_BOLD		(2)
228 #define	AT_BLINK	(3)
229 #define	AT_INVIS	(4)
230 #define	AT_STANDOUT	(5)
231 
232 #define	CONTROL(c)	((c)&037)
233 #define	ESC		CONTROL('[')
234 
235 #define	SIGNAL(sig,func)	signal(sig,func)
236 
237 #define	S_INTERRUPT	01
238 #define	S_STOP		02
239 #define S_WINCH		04
240 #define	ABORT_SIGS()	(sigs & (S_INTERRUPT|S_STOP))
241 
242 #define	QUIT_OK		0
243 #define	QUIT_ERROR	1
244 #define	QUIT_SAVED_STATUS (-1)
245 
246 /* filestate flags */
247 #define	CH_CANSEEK	001
248 #define	CH_KEEPOPEN	002
249 #define	CH_POPENED	004
250 
251 #define	ch_zero()	((POSITION)0)
252 
253 #include "funcs.h"
254