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