"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();