"SfR Fresh" - the SfR Freeware/Shareware Archive 
Member "less-424/less.h" of archive less-424.tar.gz:
As a special service "SfR Fresh" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting with prefixed line numbers.
Alternatively you can here view or download the uninterpreted source code file.
That can be also achieved for any archive member file by clicking within an archive contents listing on the first character of the file(path) respectively on the according byte size field.
1 /*
2 * Copyright (C) 1984-2008 Mark Nudelman
3 *
4 * You may distribute under the terms of either the GNU General Public
5 * License or the Less License, as specified in the README file.
6 *
7 * For more information about less, or for information on how to
8 * contact the author, see the README file.
9 */
10
11 #define NEWBOT 1
12
13 /*
14 * Standard include file for "less".
15 */
16
17 /*
18 * Defines for MSDOS_COMPILER.
19 */
20 #define MSOFTC 1 /* Microsoft C */
21 #define BORLANDC 2 /* Borland C */
22 #define WIN32C 3 /* Windows (Borland C or Microsoft C) */
23 #define DJGPPC 4 /* DJGPP C */
24
25 /*
26 * Include the file of compile-time options.
27 * The <> make cc search for it in -I., not srcdir.
28 */
29 #include <defines.h>
30
31 #ifdef _SEQUENT_
32 /*
33 * Kludge for Sequent Dynix systems that have sigsetmask, but
34 * it's not compatible with the way less calls it.
35 * {{ Do other systems need this? }}
36 */
37 #undef HAVE_SIGSETMASK
38 #endif
39
40 /*
41 * Language details.
42 */
43 #if HAVE_VOID
44 #define VOID_POINTER void *
45 #else
46 #define VOID_POINTER char *
47 #define void int
48 #endif
49 #if HAVE_CONST
50 #define constant const
51 #else
52 #define constant
53 #endif
54
55 #define public /* PUBLIC FUNCTION */
56
57 /* Library function declarations */
58
59 #if HAVE_SYS_TYPES_H
60 #include <sys/types.h>
61 #endif
62 #if HAVE_STDIO_H
63 #include <stdio.h>
64 #endif
65 #if HAVE_FCNTL_H
66 #include <fcntl.h>
67 #endif
68 #if HAVE_UNISTD_H
69 #include <unistd.h>
70 #endif
71 #if HAVE_CTYPE_H
72 #include <ctype.h>
73 #endif
74 #if HAVE_WCTYPE_H
75 #include <wctype.h>
76 #endif
77 #if HAVE_LIMITS_H
78 #include <limits.h>
79 #endif
80 #if HAVE_STDLIB_H
81 #include <stdlib.h>
82 #endif
83 #if HAVE_STRING_H
84 #include <string.h>
85 #endif
86
87 /* OS-specific includes */
88 #ifdef _OSK
89 #include <modes.h>
90 #include <strings.h>
91 #endif
92
93 #ifdef __TANDEM
94 #include <floss.h>
95 #endif
96
97 #if MSDOS_COMPILER==WIN32C || OS2
98 #include <io.h>
99 #endif
100
101 #if MSDOS_COMPILER==DJGPPC
102 #include <io.h>
103 #include <sys/exceptn.h>
104 #include <conio.h>
105 #include <pc.h>
106 #endif
107
108 #if !HAVE_STDLIB_H
109 char *getenv();
110 off_t lseek();
111 VOID_POINTER calloc();
112 void free();
113 #endif
114
115 /*
116 * Simple lowercase test which can be used during option processing
117 * (before options are parsed which might tell us what charset to use).
118 */
119 #define ASCII_IS_UPPER(c) ((c) >= 'A' && (c) <= 'Z')
120 #define ASCII_IS_LOWER(c) ((c) >= 'a' && (c) <= 'z')
121 #define ASCII_TO_UPPER(c) ((c) - 'a' + 'A')
122 #define ASCII_TO_LOWER(c) ((c) - 'A' + 'a')
123
124 #undef IS_UPPER
125 #undef IS_LOWER
126 #undef TO_UPPER
127 #undef TO_LOWER
128 #undef IS_SPACE
129 #undef IS_DIGIT
130
131 #if HAVE_WCTYPE
132 #define IS_UPPER(c) iswupper(c)
133 #define IS_LOWER(c) iswlower(c)
134 #define TO_UPPER(c) towupper(c)
135 #define TO_LOWER(c) towlower(c)
136 #else
137 #if HAVE_UPPER_LOWER
138 #define IS_UPPER(c) isupper((unsigned char) (c))
139 #define IS_LOWER(c) islower((unsigned char) (c))
140 #define TO_UPPER(c) toupper((unsigned char) (c))
141 #define TO_LOWER(c) tolower((unsigned char) (c))
142 #else
143 #define IS_UPPER(c) ASCII_IS_UPPER(c)
144 #define IS_LOWER(c) ASCII_IS_LOWER(c)
145 #define TO_UPPER(c) ASCII_TO_UPPER(c)
146 #define TO_LOWER(c) ASCII_TO_LOWER(c)
147 #endif
148 #endif
149
150 #ifdef isspace
151 #define IS_SPACE(c) isspace((unsigned char)(c))
152 #else
153 #define IS_SPACE(c) ((c) == ' ' || (c) == '\t' || (c) == '\n' || (c) == '\r' || (c) == '\f')
154 #endif
155
156 #ifdef isdigit
157 #define IS_DIGIT(c) isdigit((unsigned char)(c))
158 #else
159 #define IS_DIGIT(c) ((c) >= '0' && (c) <= '9')
160 #endif
161
162 #define IS_CSI_START(c) (((LWCHAR)(c)) == ESC || (((LWCHAR)(c)) == CSI))
163
164 #ifndef NULL
165 #define NULL 0
166 #endif
167
168 #ifndef TRUE
169 #define TRUE 1
170 #endif
171 #ifndef FALSE
172 #define FALSE 0
173 #endif
174
175 #define OPT_OFF 0
176 #define OPT_ON 1
177 #define OPT_ONPLUS 2
178
179 #if !HAVE_MEMCPY
180 #ifndef memcpy
181 #define memcpy(to,from,len) bcopy((from),(to),(len))
182 #endif
183 #endif
184
185 #if HAVE_SNPRINTF
186 #define SNPRINTF1(str, size, fmt, v1) snprintf((str), (size), (fmt), (v1))
187 #define SNPRINTF2(str, size, fmt, v1, v2) snprintf((str), (size), (fmt), (v1), (v2))
188 #define SNPRINTF3(str, size, fmt, v1, v2, v3) snprintf((str), (size), (fmt), (v1), (v2), (v3))
189 #define SNPRINTF4(str, size, fmt, v1, v2, v3, v4) snprintf((str), (size), (fmt), (v1), (v2), (v3), (v4))
190 #else
191 /* Use unsafe sprintf if we don't have snprintf. */
192 #define SNPRINTF1(str, size, fmt, v1) sprintf((str), (fmt), (v1))
193 #define SNPRINTF2(str, size, fmt, v1, v2) sprintf((str), (fmt), (v1), (v2))
194 #define SNPRINTF3(str, size, fmt, v1, v2, v3) sprintf((str), (fmt), (v1), (v2), (v3))
195 #define SNPRINTF4(str, size, fmt, v1, v2, v3, v4) sprintf((str), (fmt), (v1), (v2), (v3), (v4))
196 #endif
197
198 #define BAD_LSEEK ((off_t)-1)
199
200 #ifndef SEEK_SET
201 #define SEEK_SET 0
202 #endif
203 #ifndef SEEK_END
204 #define SEEK_END 2
205 #endif
206
207 #ifndef CHAR_BIT
208 #define CHAR_BIT 8
209 #endif
210
211 /*
212 * Upper bound on the string length of an integer converted to string.
213 * 302 / 1000 is ceil (log10 (2.0)). Subtract 1 for the sign bit;
214 * add 1 for integer division truncation; add 1 more for a minus sign.
215 */
216 #define INT_STRLEN_BOUND(t) ((sizeof(t) * CHAR_BIT - 1) * 302 / 1000 + 1 + 1)
217
218 /*
219 * Special types and constants.
220 */
221 typedef unsigned long LWCHAR;
222 typedef off_t POSITION;
223 typedef off_t LINENUM;
224 #define MIN_LINENUM_WIDTH 7 /* Min printing width of a line number */
225 #define MAX_UTF_CHAR_LEN 6 /* Max bytes in one UTF-8 char */
226
227 #define NULL_POSITION ((POSITION)(-1))
228
229 /*
230 * Flags for open()
231 */
232 #if MSDOS_COMPILER || OS2
233 #define OPEN_READ (O_RDONLY|O_BINARY)
234 #else
235 #ifdef _OSK
236 #define OPEN_READ (S_IREAD)
237 #else
238 #ifdef O_RDONLY
239 #define OPEN_READ (O_RDONLY)
240 #else
241 #define OPEN_READ (0)
242 #endif
243 #endif
244 #endif
245
246 #if defined(O_WRONLY) && defined(O_APPEND)
247 #define OPEN_APPEND (O_APPEND|O_WRONLY)
248 #else
249 #ifdef _OSK
250 #define OPEN_APPEND (S_IWRITE)
251 #else
252 #define OPEN_APPEND (1)
253 #endif
254 #endif
255
256 /*
257 * Set a file descriptor to binary mode.
258 */
259 #if MSDOS_COMPILER==MSOFTC
260 #define SET_BINARY(f) _setmode(f, _O_BINARY);
261 #else
262 #if MSDOS_COMPILER || OS2
263 #define SET_BINARY(f) setmode(f, O_BINARY)
264 #else
265 #define SET_BINARY(f)
266 #endif
267 #endif
268
269 /*
270 * Does the shell treat "?" as a metacharacter?
271 */
272 #if MSDOS_COMPILER || OS2 || _OSK
273 #define SHELL_META_QUEST 0
274 #else
275 #define SHELL_META_QUEST 1
276 #endif
277
278 #define SPACES_IN_FILENAMES 1
279
280 /*
281 * An IFILE represents an input file.
282 */
283 #define IFILE VOID_POINTER
284 #define NULL_IFILE ((IFILE)NULL)
285
286 /*
287 * The structure used to represent a "screen position".
288 * This consists of a file position, and a screen line number.
289 * The meaning is that the line starting at the given file
290 * position is displayed on the ln-th line of the screen.
291 * (Screen lines before ln are empty.)
292 */
293 struct scrpos
294 {
295 POSITION pos;
296 int ln;
297 };
298
299 typedef union parg
300 {
301 char *p_string;
302 int p_int;
303 LINENUM p_linenum;
304 } PARG;
305
306 #define NULL_PARG ((PARG *)NULL)
307
308 struct textlist
309 {
310 char *string;
311 char *endstring;
312 };
313
314 #define EOI (-1)
315
316 #define READ_INTR (-2)
317
318 /* A fraction is represented by an int n; the fraction is n/NUM_FRAC_DENOM */
319 #define NUM_FRAC_DENOM 1000000
320 #define NUM_LOG_FRAC_DENOM 6
321
322 /* How quiet should we be? */
323 #define NOT_QUIET 0 /* Ring bell at eof and for errors */
324 #define LITTLE_QUIET 1 /* Ring bell only for errors */
325 #define VERY_QUIET 2 /* Never ring bell */
326
327 /* How should we prompt? */
328 #define PR_SHORT 0 /* Prompt with colon */
329 #define PR_MEDIUM 1 /* Prompt with message */
330 #define PR_LONG 2 /* Prompt with longer message */
331
332 /* How should we handle backspaces? */
333 #define BS_SPECIAL 0 /* Do special things for underlining and bold */
334 #define BS_NORMAL 1 /* \b treated as normal char; actually output */
335 #define BS_CONTROL 2 /* \b treated as control char; prints as ^H */
336
337 /* How should we search? */
338 #define SRCH_FORW (1 << 0) /* Search forward from current position */
339 #define SRCH_BACK (1 << 1) /* Search backward from current position */
340 #define SRCH_NO_MOVE (1 << 2) /* Highlight, but don't move */
341 #define SRCH_FIND_ALL (1 << 4) /* Find and highlight all matches */
342 #define SRCH_NO_MATCH (1 << 8) /* Search for non-matching lines */
343 #define SRCH_PAST_EOF (1 << 9) /* Search past end-of-file, into next file */
344 #define SRCH_FIRST_FILE (1 << 10) /* Search starting at the first file */
345 #define SRCH_NO_REGEX (1 << 12) /* Don't use regular expressions */
346 #define SRCH_FILTER (1 << 13) /* Search is for '&' (filter) command */
347
348 #define SRCH_REVERSE(t) (((t) & SRCH_FORW) ? \
349 (((t) & ~SRCH_FORW) | SRCH_BACK) : \
350 (((t) & ~SRCH_BACK) | SRCH_FORW))
351
352 /* */
353 #define NO_MCA 0
354 #define MCA_DONE 1
355 #define MCA_MORE 2
356
357 #define CC_OK 0 /* Char was accepted & processed */
358 #define CC_QUIT 1 /* Char was a request to abort current cmd */
359 #define CC_ERROR 2 /* Char could not be accepted due to error */
360 #define CC_PASS 3 /* Char was rejected (internal) */
361
362 #define CF_QUIT_ON_ERASE 0001 /* Abort cmd if its entirely erased */
363
364 /* Special char bit-flags used to tell put_line() to do something special */
365 #define AT_NORMAL (0)
366 #define AT_UNDERLINE (1 << 0)
367 #define AT_BOLD (1 << 1)
368 #define AT_BLINK (1 << 2)
369 #define AT_STANDOUT (1 << 3)
370 #define AT_ANSI (1 << 4) /* Content-supplied "ANSI" escape sequence */
371 #define AT_BINARY (1 << 5) /* LESS*BINFMT representation */
372 #define AT_HILITE (1 << 6) /* Internal highlights (e.g., for search) */
373
374 #if '0' == 240
375 #define IS_EBCDIC_HOST 1
376 #endif
377
378 #if IS_EBCDIC_HOST
379 /*
380 * Long definition for EBCDIC.
381 * Since the argument is usually a constant, this macro normally compiles
382 * into a constant.
383 */
384 #define CONTROL(c) ( \
385 (c)=='[' ? '\047' : \
386 (c)=='a' ? '\001' : \
387 (c)=='b' ? '\002' : \
388 (c)=='c' ? '\003' : \
389 (c)=='d' ? '\067' : \
390 (c)=='e' ? '\055' : \
391 (c)=='f' ? '\056' : \
392 (c)=='g' ? '\057' : \
393 (c)=='h' ? '\026' : \
394 (c)=='i' ? '\005' : \
395 (c)=='j' ? '\025' : \
396 (c)=='k' ? '\013' : \
397 (c)=='l' ? '\014' : \
398 (c)=='m' ? '\015' : \
399 (c)=='n' ? '\016' : \
400 (c)=='o' ? '\017' : \
401 (c)=='p' ? '\020' : \
402 (c)=='q' ? '\021' : \
403 (c)=='r' ? '\022' : \
404 (c)=='s' ? '\023' : \
405 (c)=='t' ? '\074' : \
406 (c)=='u' ? '\075' : \
407 (c)=='v' ? '\062' : \
408 (c)=='w' ? '\046' : \
409 (c)=='x' ? '\030' : \
410 (c)=='y' ? '\031' : \
411 (c)=='z' ? '\077' : \
412 (c)=='A' ? '\001' : \
413 (c)=='B' ? '\002' : \
414 (c)=='C' ? '\003' : \
415 (c)=='D' ? '\067' : \
416 (c)=='E' ? '\055' : \
417 (c)=='F' ? '\056' : \
418 (c)=='G' ? '\057' : \
419 (c)=='H' ? '\026' : \
420 (c)=='I' ? '\005' : \
421 (c)=='J' ? '\025' : \
422 (c)=='K' ? '\013' : \
423 (c)=='L' ? '\014' : \
424 (c)=='M' ? '\015' : \
425 (c)=='N' ? '\016' : \
426 (c)=='O' ? '\017' : \
427 (c)=='P' ? '\020' : \
428 (c)=='Q' ? '\021' : \
429 (c)=='R' ? '\022' : \
430 (c)=='S' ? '\023' : \
431 (c)=='T' ? '\074' : \
432 (c)=='U' ? '\075' : \
433 (c)=='V' ? '\062' : \
434 (c)=='W' ? '\046' : \
435 (c)=='X' ? '\030' : \
436 (c)=='Y' ? '\031' : \
437 (c)=='Z' ? '\077' : \
438 (c)=='|' ? '\031' : \
439 (c)=='\\' ? '\034' : \
440 (c)=='^' ? '\036' : \
441 (c)&077)
442 #else
443 #define CONTROL(c) ((c)&037)
444 #endif /* IS_EBCDIC_HOST */
445
446 #define ESC CONTROL('[')
447 #define CSI ((unsigned char)'\233')
448
449 #if _OSK_MWC32
450 #define LSIGNAL(sig,func) os9_signal(sig,func)
451 #else
452 #define LSIGNAL(sig,func) signal(sig,func)
453 #endif
454
455 #if HAVE_SIGPROCMASK
456 #if HAVE_SIGSET_T
457 #else
458 #undef HAVE_SIGPROCMASK
459 #endif
460 #endif
461 #if HAVE_SIGPROCMASK
462 #if HAVE_SIGEMPTYSET
463 #else
464 #undef sigemptyset
465 #define sigemptyset(mp) *(mp) = 0
466 #endif
467 #endif
468
469 #define S_INTERRUPT 01
470 #define S_STOP 02
471 #define S_WINCH 04
472 #define ABORT_SIGS() (sigs & (S_INTERRUPT|S_STOP))
473
474 #define QUIT_OK 0
475 #define QUIT_ERROR 1
476 #define QUIT_SAVED_STATUS (-1)
477
478 #define FOLLOW_DESC 0
479 #define FOLLOW_NAME 1
480
481 /* filestate flags */
482 #define CH_CANSEEK 001
483 #define CH_KEEPOPEN 002
484 #define CH_POPENED 004
485 #define CH_HELPFILE 010
486
487 #define ch_zero() ((POSITION)0)
488
489 #define FAKE_HELPFILE "@/\\less/\\help/\\file/\\@"
490
491 #include "funcs.h"
492
493 /* Functions not included in funcs.h */
494 void postoa();
495 void linenumtoa();
496 void inttoa();