xref: /openbsd-src/usr.bin/less/less.h (revision 897fc685943471cf985a0fe38ba076ea6fe74fa5)
1 /*
2  * Copyright (C) 1984-2012  Mark Nudelman
3  * Modified for use with illumos by Garrett D'Amore.
4  * Copyright 2014 Garrett D'Amore <garrett@damore.org>
5  *
6  * You may distribute under the terms of either the GNU General Public
7  * License or the Less License, as specified in the README file.
8  *
9  * For more information, see the README file.
10  */
11 
12 /*
13  * Standard include file for "less".
14  */
15 
16 #include "defines.h"
17 
18 #include <sys/types.h>
19 
20 #include <ctype.h>
21 #include <fcntl.h>
22 #include <libgen.h>
23 #include <limits.h>
24 #include <signal.h>
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <string.h>
28 #include <unistd.h>
29 #include <wctype.h>
30 
31 /*
32  * Simple lowercase test which can be used during option processing
33  * (before options are parsed which might tell us what charset to use).
34  */
35 
36 #undef IS_SPACE
37 #undef IS_DIGIT
38 
39 #define	IS_SPACE(c)	isspace((unsigned char)(c))
40 #define	IS_DIGIT(c)	isdigit((unsigned char)(c))
41 
42 #define	IS_CSI_START(c)	(((LWCHAR)(c)) == ESC || (((LWCHAR)(c)) == CSI))
43 
44 #ifndef TRUE
45 #define	TRUE		1
46 #endif
47 #ifndef FALSE
48 #define	FALSE		0
49 #endif
50 
51 #define	OPT_OFF		0
52 #define	OPT_ON		1
53 #define	OPT_ONPLUS	2
54 
55 /*
56  * Special types and constants.
57  */
58 typedef unsigned long LWCHAR;
59 #define	MIN_LINENUM_WIDTH  7	/* Min printing width of a line number */
60 #define	MAX_UTF_CHAR_LEN   6	/* Max bytes in one UTF-8 char */
61 
62 #define	SHELL_META_QUEST 1
63 
64 /*
65  * An IFILE represents an input file.
66  */
67 #define	IFILE		void *
68 
69 /*
70  * The structure used to represent a "screen position".
71  * This consists of a file position, and a screen line number.
72  * The meaning is that the line starting at the given file
73  * position is displayed on the ln-th line of the screen.
74  * (Screen lines before ln are empty.)
75  */
76 struct scrpos {
77 	off_t pos;
78 	int ln;
79 };
80 
81 typedef union parg {
82 	char *p_string;
83 	int p_int;
84 	off_t p_linenum;
85 } PARG;
86 
87 struct textlist {
88 	char *string;
89 	char *endstring;
90 };
91 
92 #define	EOI		(-1)
93 
94 #define	READ_INTR	(-2)
95 
96 /* A fraction is represented by an int n; the fraction is n/NUM_FRAC_DENOM */
97 #define	NUM_FRAC_DENOM			1000000
98 #define	NUM_LOG_FRAC_DENOM		6
99 
100 /* How quiet should we be? */
101 #define	NOT_QUIET	0	/* Ring bell at eof and for errors */
102 #define	LITTLE_QUIET	1	/* Ring bell only for errors */
103 #define	VERY_QUIET	2	/* Never ring bell */
104 
105 /* How should we prompt? */
106 #define	PR_SHORT	0	/* Prompt with colon */
107 #define	PR_MEDIUM	1	/* Prompt with message */
108 #define	PR_LONG		2	/* Prompt with longer message */
109 
110 /* How should we handle backspaces? */
111 #define	BS_SPECIAL	0	/* Do special things for underlining and bold */
112 #define	BS_NORMAL	1	/* \b treated as normal char; actually output */
113 #define	BS_CONTROL	2	/* \b treated as control char; prints as ^H */
114 
115 /* How should we search? */
116 #define	SRCH_FORW	(1 << 0)  /* Search forward from current position */
117 #define	SRCH_BACK	(1 << 1)  /* Search backward from current position */
118 #define	SRCH_NO_MOVE	(1 << 2)  /* Highlight, but don't move */
119 #define	SRCH_FIND_ALL	(1 << 4)  /* Find and highlight all matches */
120 #define	SRCH_NO_MATCH	(1 << 8)  /* Search for non-matching lines */
121 #define	SRCH_PAST_EOF	(1 << 9)  /* Search past end-of-file, into next file */
122 #define	SRCH_FIRST_FILE	(1 << 10) /* Search starting at the first file */
123 #define	SRCH_NO_REGEX	(1 << 12) /* Don't use regular expressions */
124 #define	SRCH_FILTER	(1 << 13) /* Search is for '&' (filter) command */
125 #define	SRCH_AFTER_TARGET (1 << 14) /* Start search after the target line */
126 
127 #define	SRCH_REVERSE(t)	(((t) & SRCH_FORW) ? \
128 				(((t) & ~SRCH_FORW) | SRCH_BACK) : \
129 				(((t) & ~SRCH_BACK) | SRCH_FORW))
130 
131 /* */
132 #define	NO_MCA		0
133 #define	MCA_DONE	1
134 #define	MCA_MORE	2
135 
136 #define	CC_OK		0	/* Char was accepted & processed */
137 #define	CC_QUIT		1	/* Char was a request to abort current cmd */
138 #define	CC_ERROR	2	/* Char could not be accepted due to error */
139 #define	CC_PASS		3	/* Char was rejected (internal) */
140 
141 #define	CF_QUIT_ON_ERASE 0001   /* Abort cmd if its entirely erased */
142 
143 /* Special char bit-flags used to tell put_line() to do something special */
144 #define	AT_NORMAL	(0)
145 #define	AT_UNDERLINE	(1 << 0)
146 #define	AT_BOLD		(1 << 1)
147 #define	AT_BLINK	(1 << 2)
148 #define	AT_STANDOUT	(1 << 3)
149 #define	AT_ANSI		(1 << 4)  /* Content-supplied "ANSI" escape sequence */
150 #define	AT_BINARY	(1 << 5)  /* LESS*BINFMT representation */
151 #define	AT_HILITE	(1 << 6)  /* Internal highlights (e.g., for search) */
152 #define	AT_INDET	(1 << 7)  /* Indeterminate: either bold or underline */
153 
154 #define	CONTROL(c)	((c)&037)
155 
156 #define	ESC		CONTROL('[')
157 #define	CSI		((unsigned char)'\233')
158 
159 #define	S_INTERRUPT	01
160 #define	S_STOP		02
161 #define	S_WINCH		04
162 #define	ABORT_SIGS()	(sigs & (S_INTERRUPT|S_STOP))
163 
164 #define	QUIT_OK		0
165 #define	QUIT_ERROR	1
166 #define	QUIT_INTERRUPT	2
167 #define	QUIT_SAVED_STATUS (-1)
168 
169 #define	FOLLOW_DESC	0
170 #define	FOLLOW_NAME	1
171 
172 /* filestate flags */
173 #define	CH_CANSEEK	001
174 #define	CH_KEEPOPEN	002
175 #define	CH_POPENED	004
176 #define	CH_HELPFILE	010
177 #define	CH_NODATA	020	/* Special case for zero length files */
178 
179 
180 #define	ch_zero()	(0)
181 
182 #define	FAKE_EMPTYFILE	"@/\\less/\\empty/\\file/\\@"
183 
184 /* Flags for cvt_text */
185 #define	CVT_TO_LC	01	/* Convert upper-case to lower-case */
186 #define	CVT_BS		02	/* Do backspace processing */
187 #define	CVT_CRLF	04	/* Remove CR after LF */
188 #define	CVT_ANSI	010	/* Remove ANSI escape sequences */
189 
190 #include "funcs.h"
191 
192 /* Functions not included in funcs.h */
193 void postoa(off_t, char *, size_t);
194 void inttoa(int, char *, size_t);
195