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 <limits.h> 23 #include <signal.h> 24 #include <stdio.h> 25 #include <stdlib.h> 26 #include <string.h> 27 #include <unistd.h> 28 #include <wctype.h> 29 30 /* 31 * Simple lowercase test which can be used during option processing 32 * (before options are parsed which might tell us what charset to use). 33 */ 34 35 #undef IS_SPACE 36 #undef IS_DIGIT 37 38 #define IS_SPACE(c) isspace((unsigned char)(c)) 39 #define IS_DIGIT(c) isdigit((unsigned char)(c)) 40 41 #ifndef TRUE 42 #define TRUE 1 43 #endif 44 #ifndef FALSE 45 #define FALSE 0 46 #endif 47 48 #define OPT_OFF 0 49 #define OPT_ON 1 50 #define OPT_ONPLUS 2 51 52 /* 53 * Special types and constants. 54 */ 55 typedef unsigned long LWCHAR; 56 #define MIN_LINENUM_WIDTH 7 /* Min printing width of a line number */ 57 #define MAX_UTF_CHAR_LEN 6 /* Max bytes in one UTF-8 char */ 58 59 #define SHELL_META_QUEST 1 60 61 /* 62 * An IFILE represents an input file. 63 */ 64 #define IFILE void * 65 66 /* 67 * The structure used to represent a "screen position". 68 * This consists of a file position, and a screen line number. 69 * The meaning is that the line starting at the given file 70 * position is displayed on the ln-th line of the screen. 71 * (Screen lines before ln are empty.) 72 */ 73 struct scrpos { 74 off_t pos; 75 int ln; 76 }; 77 78 typedef union parg { 79 char *p_string; 80 int p_int; 81 off_t p_linenum; 82 } PARG; 83 84 struct textlist { 85 char *string; 86 char *endstring; 87 }; 88 89 #define EOI (-1) 90 91 #define READ_INTR (-2) 92 93 /* A fraction is represented by an int n; the fraction is n/NUM_FRAC_DENOM */ 94 #define NUM_FRAC_DENOM 1000000 95 #define NUM_LOG_FRAC_DENOM 6 96 97 /* How quiet should we be? */ 98 #define NOT_QUIET 0 /* Ring bell at eof and for errors */ 99 #define LITTLE_QUIET 1 /* Ring bell only for errors */ 100 #define VERY_QUIET 2 /* Never ring bell */ 101 102 /* How should we prompt? */ 103 #define PR_SHORT 0 /* Prompt with colon */ 104 #define PR_MEDIUM 1 /* Prompt with message */ 105 #define PR_LONG 2 /* Prompt with longer message */ 106 107 /* How should we handle backspaces? */ 108 #define BS_SPECIAL 0 /* Do special things for underlining and bold */ 109 #define BS_NORMAL 1 /* \b treated as normal char; actually output */ 110 #define BS_CONTROL 2 /* \b treated as control char; prints as ^H */ 111 112 /* How should we search? */ 113 #define SRCH_FORW (1 << 0) /* Search forward from current position */ 114 #define SRCH_BACK (1 << 1) /* Search backward from current position */ 115 #define SRCH_NO_MOVE (1 << 2) /* Highlight, but don't move */ 116 #define SRCH_FIND_ALL (1 << 4) /* Find and highlight all matches */ 117 #define SRCH_NO_MATCH (1 << 8) /* Search for non-matching lines */ 118 #define SRCH_PAST_EOF (1 << 9) /* Search past end-of-file, into next file */ 119 #define SRCH_FIRST_FILE (1 << 10) /* Search starting at the first file */ 120 #define SRCH_NO_REGEX (1 << 12) /* Don't use regular expressions */ 121 #define SRCH_FILTER (1 << 13) /* Search is for '&' (filter) command */ 122 #define SRCH_AFTER_TARGET (1 << 14) /* Start search after the target line */ 123 124 #define SRCH_REVERSE(t) (((t) & SRCH_FORW) ? \ 125 (((t) & ~SRCH_FORW) | SRCH_BACK) : \ 126 (((t) & ~SRCH_BACK) | SRCH_FORW)) 127 128 /* */ 129 #define NO_MCA 0 130 #define MCA_DONE 1 131 #define MCA_MORE 2 132 133 #define CC_OK 0 /* Char was accepted & processed */ 134 #define CC_QUIT 1 /* Char was a request to abort current cmd */ 135 #define CC_ERROR 2 /* Char could not be accepted due to error */ 136 #define CC_PASS 3 /* Char was rejected (internal) */ 137 138 #define CF_QUIT_ON_ERASE 0001 /* Abort cmd if its entirely erased */ 139 140 /* Special char bit-flags used to tell put_line() to do something special */ 141 #define AT_NORMAL (0) 142 #define AT_UNDERLINE (1 << 0) 143 #define AT_BOLD (1 << 1) 144 #define AT_BLINK (1 << 2) 145 #define AT_STANDOUT (1 << 3) 146 #define AT_ANSI (1 << 4) /* Content-supplied "ANSI" escape sequence */ 147 #define AT_BINARY (1 << 5) /* LESS*BINFMT representation */ 148 #define AT_HILITE (1 << 6) /* Internal highlights (e.g., for search) */ 149 #define AT_INDET (1 << 7) /* Indeterminate: either bold or underline */ 150 151 #define CONTROL(c) ((c)&037) 152 #define ESC CONTROL('[') 153 154 extern int any_sigs(void); 155 extern int abort_sigs(void); 156 157 #define QUIT_OK 0 158 #define QUIT_ERROR 1 159 #define QUIT_INTERRUPT 2 160 #define QUIT_SAVED_STATUS (-1) 161 162 #define FOLLOW_DESC 0 163 #define FOLLOW_NAME 1 164 165 /* filestate flags */ 166 #define CH_CANSEEK 001 167 #define CH_KEEPOPEN 002 168 #define CH_HELPFILE 010 169 #define CH_NODATA 020 /* Special case for zero length files */ 170 171 172 #define ch_zero() (0) 173 174 #define FAKE_EMPTYFILE "@/\\less/\\empty/\\file/\\@" 175 176 /* Flags for cvt_text */ 177 #define CVT_TO_LC 01 /* Convert upper-case to lower-case */ 178 #define CVT_BS 02 /* Do backspace processing */ 179 #define CVT_CRLF 04 /* Remove CR after LF */ 180 #define CVT_ANSI 010 /* Remove ANSI escape sequences */ 181 182 #include "funcs.h" 183 184 /* Functions not included in funcs.h */ 185 void postoa(off_t, char *, size_t); 186 void inttoa(int, char *, size_t); 187