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