less.h revision 191930
1172302Spjd/* $FreeBSD: head/contrib/less/less.h 191930 2009-05-09 01:35:27Z delphij $ */
2172302Spjd/*
3172302Spjd * Copyright (C) 1984-2008  Mark Nudelman
4172302Spjd *
5172302Spjd * You may distribute under the terms of either the GNU General Public
6172302Spjd * License or the Less License, as specified in the README file.
7172302Spjd *
8172302Spjd * For more information about less, or for information on how to
9172302Spjd * contact the author, see the README file.
10172302Spjd */
11172302Spjd
12172302Spjd#define NEWBOT 1
13172302Spjd
14172302Spjd/*
15172302Spjd * Standard include file for "less".
16172302Spjd */
17172302Spjd
18172302Spjd/*
19172302Spjd * Defines for MSDOS_COMPILER.
20172302Spjd */
21172302Spjd#define	MSOFTC		1	/* Microsoft C */
22172302Spjd#define	BORLANDC	2	/* Borland C */
23172302Spjd#define	WIN32C		3	/* Windows (Borland C or Microsoft C) */
24172302Spjd#define	DJGPPC		4	/* DJGPP C */
25172302Spjd
26172302Spjd/*
27172302Spjd * Include the file of compile-time options.
28172302Spjd * The <> make cc search for it in -I., not srcdir.
29172302Spjd */
30172302Spjd#include <defines.h>
31172302Spjd
32172302Spjd#ifdef _SEQUENT_
33172302Spjd/*
34172302Spjd * Kludge for Sequent Dynix systems that have sigsetmask, but
35172302Spjd * it's not compatible with the way less calls it.
36172302Spjd * {{ Do other systems need this? }}
37172302Spjd */
38172302Spjd#undef HAVE_SIGSETMASK
39172302Spjd#endif
40172302Spjd
41172302Spjd/*
42172302Spjd * Language details.
43172302Spjd */
44172302Spjd#if HAVE_VOID
45172302Spjd#define	VOID_POINTER	void *
46172302Spjd#else
47172302Spjd#define	VOID_POINTER	char *
48172302Spjd#define	void  int
49172302Spjd#endif
50172302Spjd#if HAVE_CONST
51172302Spjd#define	constant	const
52172302Spjd#else
53172302Spjd#define	constant
54172302Spjd#endif
55172302Spjd
56172302Spjd#define	public		/* PUBLIC FUNCTION */
57172302Spjd
58172302Spjd/* Library function declarations */
59172302Spjd
60172302Spjd#if HAVE_SYS_TYPES_H
61172302Spjd#include <sys/types.h>
62172302Spjd#endif
63172302Spjd#if HAVE_STDIO_H
64172302Spjd#include <stdio.h>
65172302Spjd#endif
66172302Spjd#if HAVE_FCNTL_H
67172302Spjd#include <fcntl.h>
68172302Spjd#endif
69172302Spjd#if HAVE_UNISTD_H
70172302Spjd#include <unistd.h>
71172302Spjd#endif
72172302Spjd#if HAVE_CTYPE_H
73172302Spjd#include <ctype.h>
74172302Spjd#endif
75172302Spjd#if HAVE_WCTYPE_H
76172302Spjd#include <wctype.h>
77172302Spjd#endif
78172302Spjd#if HAVE_LIMITS_H
79172302Spjd#include <limits.h>
80172302Spjd#endif
81172302Spjd#if HAVE_STDLIB_H
82172302Spjd#include <stdlib.h>
83172302Spjd#endif
84172302Spjd#if HAVE_STRING_H
85172302Spjd#include <string.h>
86172302Spjd#endif
87172302Spjd
88172302Spjd/* OS-specific includes */
89172302Spjd#ifdef _OSK
90172302Spjd#include <modes.h>
91172302Spjd#include <strings.h>
92172302Spjd#endif
93172302Spjd
94172302Spjd#ifdef __TANDEM
95172302Spjd#include <floss.h>
96172302Spjd#endif
97172302Spjd
98172302Spjd#if MSDOS_COMPILER==WIN32C || OS2
99172302Spjd#include <io.h>
100172302Spjd#endif
101202987Sivoras
102172302Spjd#if MSDOS_COMPILER==DJGPPC
103172302Spjd#include <io.h>
104172302Spjd#include <sys/exceptn.h>
105172302Spjd#include <conio.h>
106172302Spjd#include <pc.h>
107172302Spjd#endif
108172302Spjd
109172302Spjd#if !HAVE_STDLIB_H
110172302Spjdchar *getenv();
111172302Spjdoff_t lseek();
112172302SpjdVOID_POINTER calloc();
113172302Spjdvoid free();
114172302Spjd#endif
115172302Spjd
116172302Spjd/*
117172302Spjd * Simple lowercase test which can be used during option processing
118172302Spjd * (before options are parsed which might tell us what charset to use).
119172302Spjd */
120172302Spjd#define ASCII_IS_UPPER(c)	((c) >= 'A' && (c) <= 'Z')
121172302Spjd#define ASCII_IS_LOWER(c)	((c) >= 'a' && (c) <= 'z')
122172302Spjd#define	ASCII_TO_UPPER(c)	((c) - 'a' + 'A')
123172302Spjd#define	ASCII_TO_LOWER(c)	((c) - 'A' + 'a')
124172302Spjd
125172302Spjd#undef IS_UPPER
126172302Spjd#undef IS_LOWER
127172302Spjd#undef TO_UPPER
128172302Spjd#undef TO_LOWER
129172302Spjd#undef IS_SPACE
130172302Spjd#undef IS_DIGIT
131172302Spjd
132172302Spjd#if HAVE_WCTYPE
133172302Spjd#define	IS_UPPER(c)	iswupper(c)
134172302Spjd#define	IS_LOWER(c)	iswlower(c)
135172302Spjd#define	TO_UPPER(c)	towupper(c)
136172302Spjd#define	TO_LOWER(c)	towlower(c)
137172302Spjd#else
138172302Spjd#if HAVE_UPPER_LOWER
139172302Spjd#define	IS_UPPER(c)	isupper((unsigned char) (c))
140172302Spjd#define	IS_LOWER(c)	islower((unsigned char) (c))
141172302Spjd#define	TO_UPPER(c)	toupper((unsigned char) (c))
142172302Spjd#define	TO_LOWER(c)	tolower((unsigned char) (c))
143172302Spjd#else
144172302Spjd#define	IS_UPPER(c)	ASCII_IS_UPPER(c)
145172302Spjd#define	IS_LOWER(c)	ASCII_IS_LOWER(c)
146172302Spjd#define	TO_UPPER(c)	ASCII_TO_UPPER(c)
147172302Spjd#define	TO_LOWER(c)	ASCII_TO_LOWER(c)
148172302Spjd#endif
149172302Spjd#endif
150172302Spjd
151172302Spjd#ifdef isspace
152172302Spjd#define IS_SPACE(c)	isspace((unsigned char)(c))
153172302Spjd#else
154172302Spjd#define IS_SPACE(c)	((c) == ' ' || (c) == '\t' || (c) == '\n' || (c) == '\r' || (c) == '\f')
155172302Spjd#endif
156172302Spjd
157172302Spjd#ifdef isdigit
158172302Spjd#define IS_DIGIT(c)	isdigit((unsigned char)(c))
159172302Spjd#else
160172302Spjd#define IS_DIGIT(c)	((c) >= '0' && (c) <= '9')
161172302Spjd#endif
162172302Spjd
163172302Spjd#define IS_CSI_START(c)	(((LWCHAR)(c)) == ESC || (((LWCHAR)(c)) == CSI))
164172302Spjd
165172302Spjd#ifndef NULL
166172302Spjd#define	NULL	0
167172302Spjd#endif
168172302Spjd
169172302Spjd#ifndef TRUE
170172302Spjd#define	TRUE		1
171172302Spjd#endif
172172302Spjd#ifndef FALSE
173172302Spjd#define	FALSE		0
174172302Spjd#endif
175172302Spjd
176172302Spjd#define	OPT_OFF		0
177172302Spjd#define	OPT_ON		1
178172302Spjd#define	OPT_ONPLUS	2
179172302Spjd
180172302Spjd#if !HAVE_MEMCPY
181172302Spjd#ifndef memcpy
182172302Spjd#define	memcpy(to,from,len)	bcopy((from),(to),(len))
183172302Spjd#endif
184172302Spjd#endif
185172302Spjd
186172302Spjd#if HAVE_SNPRINTF
187172302Spjd#define SNPRINTF1(str, size, fmt, v1)             snprintf((str), (size), (fmt), (v1))
188172302Spjd#define SNPRINTF2(str, size, fmt, v1, v2)         snprintf((str), (size), (fmt), (v1), (v2))
189172302Spjd#define SNPRINTF3(str, size, fmt, v1, v2, v3)     snprintf((str), (size), (fmt), (v1), (v2), (v3))
190172302Spjd#define SNPRINTF4(str, size, fmt, v1, v2, v3, v4) snprintf((str), (size), (fmt), (v1), (v2), (v3), (v4))
191172302Spjd#else
192172302Spjd/* Use unsafe sprintf if we don't have snprintf. */
193172302Spjd#define SNPRINTF1(str, size, fmt, v1)             sprintf((str), (fmt), (v1))
194172302Spjd#define SNPRINTF2(str, size, fmt, v1, v2)         sprintf((str), (fmt), (v1), (v2))
195172302Spjd#define SNPRINTF3(str, size, fmt, v1, v2, v3)     sprintf((str), (fmt), (v1), (v2), (v3))
196172302Spjd#define SNPRINTF4(str, size, fmt, v1, v2, v3, v4) sprintf((str), (fmt), (v1), (v2), (v3), (v4))
197172302Spjd#endif
198172302Spjd
199172302Spjd#define	BAD_LSEEK	((off_t)-1)
200172302Spjd
201172302Spjd#ifndef SEEK_SET
202172302Spjd#define SEEK_SET 0
203172302Spjd#endif
204172302Spjd#ifndef SEEK_END
205172302Spjd#define SEEK_END 2
206172302Spjd#endif
207172302Spjd
208172302Spjd#ifndef CHAR_BIT
209172302Spjd#define CHAR_BIT 8
210172302Spjd#endif
211172302Spjd
212172302Spjd/*
213172302Spjd * Upper bound on the string length of an integer converted to string.
214172302Spjd * 302 / 1000 is ceil (log10 (2.0)).  Subtract 1 for the sign bit;
215172302Spjd * add 1 for integer division truncation; add 1 more for a minus sign.
216172302Spjd */
217172302Spjd#define INT_STRLEN_BOUND(t) ((sizeof(t) * CHAR_BIT - 1) * 302 / 1000 + 1 + 1)
218172302Spjd
219172302Spjd/*
220172302Spjd * Special types and constants.
221172302Spjd */
222172302Spjdtypedef unsigned long LWCHAR;
223172302Spjdtypedef off_t		POSITION;
224172302Spjdtypedef off_t		LINENUM;
225172302Spjd#define MIN_LINENUM_WIDTH  7	/* Min printing width of a line number */
226172302Spjd#define MAX_UTF_CHAR_LEN   6	/* Max bytes in one UTF-8 char */
227172302Spjd
228180120Sdelphij#define	NULL_POSITION	((POSITION)(-1))
229180120Sdelphij
230180120Sdelphij/*
231180120Sdelphij * Flags for open()
232180120Sdelphij */
233172302Spjd#if MSDOS_COMPILER || OS2
234172302Spjd#define	OPEN_READ	(O_RDONLY|O_BINARY)
235172302Spjd#else
236172302Spjd#ifdef _OSK
237172302Spjd#define	OPEN_READ	(S_IREAD)
238172302Spjd#else
239172302Spjd#ifdef O_RDONLY
240172302Spjd#define	OPEN_READ	(O_RDONLY)
241172302Spjd#else
242172302Spjd#define	OPEN_READ	(0)
243172302Spjd#endif
244172302Spjd#endif
245172302Spjd#endif
246172302Spjd
247172302Spjd#if defined(O_WRONLY) && defined(O_APPEND)
248172302Spjd#define	OPEN_APPEND	(O_APPEND|O_WRONLY)
249172302Spjd#else
250172302Spjd#ifdef _OSK
251172302Spjd#define OPEN_APPEND	(S_IWRITE)
252172302Spjd#else
253172302Spjd#define	OPEN_APPEND	(1)
254172302Spjd#endif
255172302Spjd#endif
256172302Spjd
257172302Spjd/*
258172302Spjd * Set a file descriptor to binary mode.
259172302Spjd */
260172302Spjd#if MSDOS_COMPILER==MSOFTC
261172302Spjd#define	SET_BINARY(f)	_setmode(f, _O_BINARY);
262172302Spjd#else
263172302Spjd#if MSDOS_COMPILER || OS2
264172302Spjd#define	SET_BINARY(f)	setmode(f, O_BINARY)
265172302Spjd#else
266172302Spjd#define	SET_BINARY(f)
267172302Spjd#endif
268172302Spjd#endif
269172302Spjd
270172302Spjd/*
271172302Spjd * Does the shell treat "?" as a metacharacter?
272172302Spjd */
273172302Spjd#if MSDOS_COMPILER || OS2 || _OSK
274172302Spjd#define	SHELL_META_QUEST 0
275172302Spjd#else
276172302Spjd#define	SHELL_META_QUEST 1
277172302Spjd#endif
278172302Spjd
279172302Spjd#define	SPACES_IN_FILENAMES 1
280172302Spjd
281172302Spjd/*
282172302Spjd * An IFILE represents an input file.
283172302Spjd */
284172302Spjd#define	IFILE		VOID_POINTER
285172302Spjd#define	NULL_IFILE	((IFILE)NULL)
286172302Spjd
287172302Spjd/*
288172302Spjd * The structure used to represent a "screen position".
289172302Spjd * This consists of a file position, and a screen line number.
290172302Spjd * The meaning is that the line starting at the given file
291172302Spjd * position is displayed on the ln-th line of the screen.
292172302Spjd * (Screen lines before ln are empty.)
293172302Spjd */
294172302Spjdstruct scrpos
295172302Spjd{
296172302Spjd	POSITION pos;
297172302Spjd	int ln;
298172302Spjd};
299172302Spjd
300172302Spjdtypedef union parg
301172302Spjd{
302172302Spjd	char *p_string;
303172302Spjd	int p_int;
304172302Spjd	LINENUM p_linenum;
305172302Spjd} PARG;
306172302Spjd
307172302Spjd#define	NULL_PARG	((PARG *)NULL)
308172302Spjd
309172302Spjdstruct textlist
310172302Spjd{
311172302Spjd	char *string;
312172302Spjd	char *endstring;
313172302Spjd};
314203408Sdelphij
315203408Sdelphij#define	EOI		(-1)
316203408Sdelphij
317203408Sdelphij#define	READ_INTR	(-2)
318203408Sdelphij
319213662Sae/* A fraction is represented by an int n; the fraction is n/NUM_FRAC_DENOM */
320213662Sae#define NUM_FRAC_DENOM			1000000
321172302Spjd#define NUM_LOG_FRAC_DENOM		6
322172302Spjd
323172302Spjd/* How quiet should we be? */
324172302Spjd#define	NOT_QUIET	0	/* Ring bell at eof and for errors */
325172302Spjd#define	LITTLE_QUIET	1	/* Ring bell only for errors */
326172302Spjd#define	VERY_QUIET	2	/* Never ring bell */
327172302Spjd
328172302Spjd/* How should we prompt? */
329172302Spjd#define	PR_SHORT	0	/* Prompt with colon */
330172302Spjd#define	PR_MEDIUM	1	/* Prompt with message */
331172302Spjd#define	PR_LONG		2	/* Prompt with longer message */
332172302Spjd
333172302Spjd/* How should we handle backspaces? */
334172302Spjd#define	BS_SPECIAL	0	/* Do special things for underlining and bold */
335172302Spjd#define	BS_NORMAL	1	/* \b treated as normal char; actually output */
336172302Spjd#define	BS_CONTROL	2	/* \b treated as control char; prints as ^H */
337172302Spjd
338172302Spjd/* How should we search? */
339172302Spjd#define	SRCH_FORW       (1 << 0)  /* Search forward from current position */
340172302Spjd#define	SRCH_BACK       (1 << 1)  /* Search backward from current position */
341172302Spjd#define SRCH_NO_MOVE    (1 << 2)  /* Highlight, but don't move */
342172302Spjd#define SRCH_FIND_ALL   (1 << 4)  /* Find and highlight all matches */
343172302Spjd#define SRCH_NO_MATCH   (1 << 8)  /* Search for non-matching lines */
344172302Spjd#define SRCH_PAST_EOF   (1 << 9)  /* Search past end-of-file, into next file */
345172302Spjd#define SRCH_FIRST_FILE (1 << 10) /* Search starting at the first file */
346172302Spjd#define SRCH_NO_REGEX   (1 << 12) /* Don't use regular expressions */
347172302Spjd#define SRCH_FILTER     (1 << 13) /* Search is for '&' (filter) command */
348172302Spjd
349172302Spjd#define	SRCH_REVERSE(t)	(((t) & SRCH_FORW) ? \
350172302Spjd				(((t) & ~SRCH_FORW) | SRCH_BACK) : \
351172302Spjd				(((t) & ~SRCH_BACK) | SRCH_FORW))
352172302Spjd
353172302Spjd/* */
354172302Spjd#define	NO_MCA		0
355172302Spjd#define	MCA_DONE	1
356172302Spjd#define	MCA_MORE	2
357172302Spjd
358172302Spjd#define	CC_OK		0	/* Char was accepted & processed */
359172302Spjd#define	CC_QUIT		1	/* Char was a request to abort current cmd */
360172302Spjd#define	CC_ERROR	2	/* Char could not be accepted due to error */
361172302Spjd#define	CC_PASS		3	/* Char was rejected (internal) */
362172302Spjd
363172302Spjd#define CF_QUIT_ON_ERASE 0001   /* Abort cmd if its entirely erased */
364172302Spjd
365172302Spjd/* Special char bit-flags used to tell put_line() to do something special */
366172302Spjd#define	AT_NORMAL	(0)
367172302Spjd#define	AT_UNDERLINE	(1 << 0)
368172302Spjd#define	AT_BOLD		(1 << 1)
369172302Spjd#define	AT_BLINK	(1 << 2)
370172302Spjd#define	AT_STANDOUT	(1 << 3)
371172302Spjd#define	AT_ANSI		(1 << 4)  /* Content-supplied "ANSI" escape sequence */
372172302Spjd#define	AT_BINARY	(1 << 5)  /* LESS*BINFMT representation */
373172302Spjd#define	AT_HILITE	(1 << 6)  /* Internal highlights (e.g., for search) */
374172302Spjd
375172302Spjd#if '0' == 240
376172302Spjd#define IS_EBCDIC_HOST 1
377172302Spjd#endif
378172302Spjd
379172302Spjd#if IS_EBCDIC_HOST
380172302Spjd/*
381172302Spjd * Long definition for EBCDIC.
382172302Spjd * Since the argument is usually a constant, this macro normally compiles
383172302Spjd * into a constant.
384172302Spjd */
385172302Spjd#define CONTROL(c) ( \
386172302Spjd	(c)=='[' ? '\047' : \
387172302Spjd	(c)=='a' ? '\001' : \
388172302Spjd	(c)=='b' ? '\002' : \
389172302Spjd	(c)=='c' ? '\003' : \
390172302Spjd	(c)=='d' ? '\067' : \
391172302Spjd	(c)=='e' ? '\055' : \
392172302Spjd	(c)=='f' ? '\056' : \
393172302Spjd	(c)=='g' ? '\057' : \
394172302Spjd	(c)=='h' ? '\026' : \
395172302Spjd	(c)=='i' ? '\005' : \
396172302Spjd	(c)=='j' ? '\025' : \
397172302Spjd	(c)=='k' ? '\013' : \
398172302Spjd	(c)=='l' ? '\014' : \
399172302Spjd	(c)=='m' ? '\015' : \
400172302Spjd	(c)=='n' ? '\016' : \
401172302Spjd	(c)=='o' ? '\017' : \
402172302Spjd	(c)=='p' ? '\020' : \
403172302Spjd	(c)=='q' ? '\021' : \
404172302Spjd	(c)=='r' ? '\022' : \
405172302Spjd	(c)=='s' ? '\023' : \
406172302Spjd	(c)=='t' ? '\074' : \
407172302Spjd	(c)=='u' ? '\075' : \
408172302Spjd	(c)=='v' ? '\062' : \
409172302Spjd	(c)=='w' ? '\046' : \
410172302Spjd	(c)=='x' ? '\030' : \
411172302Spjd	(c)=='y' ? '\031' : \
412172302Spjd	(c)=='z' ? '\077' : \
413172302Spjd	(c)=='A' ? '\001' : \
414172302Spjd	(c)=='B' ? '\002' : \
415172302Spjd	(c)=='C' ? '\003' : \
416172302Spjd	(c)=='D' ? '\067' : \
417172302Spjd	(c)=='E' ? '\055' : \
418172302Spjd	(c)=='F' ? '\056' : \
419172302Spjd	(c)=='G' ? '\057' : \
420172302Spjd	(c)=='H' ? '\026' : \
421172302Spjd	(c)=='I' ? '\005' : \
422172302Spjd	(c)=='J' ? '\025' : \
423172302Spjd	(c)=='K' ? '\013' : \
424172302Spjd	(c)=='L' ? '\014' : \
425172302Spjd	(c)=='M' ? '\015' : \
426172302Spjd	(c)=='N' ? '\016' : \
427172302Spjd	(c)=='O' ? '\017' : \
428172302Spjd	(c)=='P' ? '\020' : \
429172302Spjd	(c)=='Q' ? '\021' : \
430172302Spjd	(c)=='R' ? '\022' : \
431172302Spjd	(c)=='S' ? '\023' : \
432172302Spjd	(c)=='T' ? '\074' : \
433172302Spjd	(c)=='U' ? '\075' : \
434172302Spjd	(c)=='V' ? '\062' : \
435172302Spjd	(c)=='W' ? '\046' : \
436172302Spjd	(c)=='X' ? '\030' : \
437172302Spjd	(c)=='Y' ? '\031' : \
438172302Spjd	(c)=='Z' ? '\077' : \
439172302Spjd	(c)=='|' ? '\031' : \
440172302Spjd	(c)=='\\' ? '\034' : \
441172302Spjd	(c)=='^' ? '\036' : \
442172302Spjd	(c)&077)
443172302Spjd#else
444172302Spjd#define	CONTROL(c)	((c)&037)
445172302Spjd#endif /* IS_EBCDIC_HOST */
446172302Spjd
447172302Spjd#define	ESC		CONTROL('[')
448172302Spjd#define	CSI		((unsigned char)'\233')
449172302Spjd
450172302Spjd#if _OSK_MWC32
451172302Spjd#define	LSIGNAL(sig,func)	os9_signal(sig,func)
452172302Spjd#else
453172302Spjd#define	LSIGNAL(sig,func)	signal(sig,func)
454172302Spjd#endif
455172302Spjd
456172302Spjd#if HAVE_SIGPROCMASK
457172302Spjd#if HAVE_SIGSET_T
458172302Spjd#else
459172302Spjd#undef HAVE_SIGPROCMASK
460172302Spjd#endif
461172302Spjd#endif
462172302Spjd#if HAVE_SIGPROCMASK
463172302Spjd#if HAVE_SIGEMPTYSET
464172302Spjd#else
465172302Spjd#undef  sigemptyset
466172302Spjd#define sigemptyset(mp) *(mp) = 0
467172302Spjd#endif
468172302Spjd#endif
469172302Spjd
470172302Spjd#define	S_INTERRUPT	01
471172302Spjd#define	S_STOP		02
472172302Spjd#define S_WINCH		04
473172302Spjd#define	ABORT_SIGS()	(sigs & (S_INTERRUPT|S_STOP))
474172302Spjd
475172302Spjd#define	QUIT_OK		0
476172302Spjd#define	QUIT_ERROR	1
477172302Spjd#define	QUIT_SAVED_STATUS (-1)
478172302Spjd
479172302Spjd#define FOLLOW_DESC     0
480172302Spjd#define FOLLOW_NAME     1
481172302Spjd
482172302Spjd/* filestate flags */
483172302Spjd#define	CH_CANSEEK	001
484172302Spjd#define	CH_KEEPOPEN	002
485172302Spjd#define	CH_POPENED	004
486172302Spjd#define	CH_HELPFILE	010
487172302Spjd
488172302Spjd#define	ch_zero()	((POSITION)0)
489172302Spjd
490172302Spjd#define	FAKE_HELPFILE	"@/\\less/\\help/\\file/\\@"
491172302Spjd
492172302Spjd#include "funcs.h"
493172302Spjd
494172302Spjd/* Functions not included in funcs.h */
495172302Spjdvoid postoa();
496172302Spjdvoid linenumtoa();
497172302Spjdvoid inttoa();
498172302Spjd