1 /* ed.h: type and constant definitions for the ed editor. */ 2 /* 3 * Copyright (c) 1993 The Regents of the University of California. 4 * All rights reserved. 5 * 6 * This code is derived from software contributed to Berkeley by 7 * Andrew Moore, Talke Studio. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. All advertising materials mentioning features or use of this software 18 * must display the following acknowledgement: 19 * This product includes software developed by the University of 20 * California, Berkeley and its contributors. 21 * 4. Neither the name of the University nor the names of its contributors 22 * may be used to endorse or promote products derived from this software 23 * without specific prior written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 31 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 34 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 35 * SUCH DAMAGE. 36 * 37 * @(#)ed.h 5.5 (Berkeley) 3/28/93 38 */ 39 40 #include <unistd.h> 41 #include <errno.h> 42 #if defined(BSD) && BSD >= 199103 || defined(__386BSD__) 43 # include <sys/param.h> /* for MAXPATHLEN */ 44 #endif 45 #include <regex.h> 46 #include <signal.h> 47 48 #define BITSPERBYTE 8 49 #define BITS(type) (BITSPERBYTE * (int)sizeof(type)) 50 #define CHARBITS BITS(char) 51 #define INTBITS BITS(int) 52 #define INTHIBIT (1 << (INTBITS - 1)) 53 54 #define ERR (-2) 55 #define EMOD (-3) 56 #define FATAL (-4) 57 58 #ifndef MAXPATHLEN 59 # define MAXPATHLEN 255 /* _POSIX_PATH_MAX */ 60 #endif 61 62 #define MAXFNAME MAXPATHLEN /* max file name size */ 63 #define MINBUFSZ 512 /* minimum buffer size - must be > 0 */ 64 #define LINECHARS (INTHIBIT - 1) /* max chars per line */ 65 #define SE_MAX 30 /* max subexpressions in a regular expression */ 66 67 typedef regex_t pattern_t; 68 69 /* Line node */ 70 typedef struct line { 71 struct line *next; 72 struct line *prev; 73 off_t seek; /* address of line in scratch buffer */ 74 75 #define ACTV INTHIBIT /* active bit: high bit of len */ 76 77 int len; /* length of line */ 78 } line_t; 79 80 81 typedef struct undo { 82 83 /* type of undo nodes */ 84 #define UADD 0 85 #define UDEL 1 86 #define UMOV 2 87 #define VMOV 3 88 89 int type; /* command type */ 90 line_t *h; /* head of list */ 91 line_t *t; /* tail of list */ 92 } undo_t; 93 94 #ifndef max 95 # define max(a,b) ((a) > (b) ? (a) : (b)) 96 #endif 97 #ifndef min 98 # define min(a,b) ((a) < (b) ? (a) : (b)) 99 #endif 100 101 /* nextln: return line after l mod k */ 102 #define nextln(l,k) ((l)+1 > (k) ? 0 : (l)+1) 103 104 /* nextln: return line before l mod k */ 105 #define prevln(l,k) ((l)-1 < 0 ? (k) : (l)-1) 106 107 #define skipblanks() while (isspace(*ibufp) && *ibufp != '\n') ibufp++ 108 109 /* spl1: disable some interrupts (requires reliable signals) */ 110 #define spl1() mutex++ 111 112 /* spl0: enable all interrupts; check sigflags (requires reliable signals) */ 113 #define spl0() \ 114 if (--mutex == 0) { \ 115 if (sigflags & (1 << SIGHUP)) dohup(SIGHUP); \ 116 if (sigflags & (1 << SIGINT)) dointr(SIGINT); \ 117 } 118 119 #if defined(sun) || defined(NO_REALLOC_NULL) 120 /* CKBUF: assure at least a minimum size for buffer b */ 121 #define CKBUF(b,n,i,err) \ 122 if ((i) > (n)) { \ 123 int ti = (n); \ 124 char *ts; \ 125 spl1(); \ 126 if ((b) != NULL) { \ 127 if ((ts = (char *) realloc((b), ti += max((i), MINBUFSZ))) == NULL) { \ 128 fprintf(stderr, "%s\n", strerror(errno)); \ 129 sprintf(errmsg, "out of memory"); \ 130 spl0(); \ 131 return err; \ 132 } \ 133 } else { \ 134 if ((ts = (char *) malloc(ti += max((i), MINBUFSZ))) == NULL) { \ 135 fprintf(stderr, "%s\n", strerror(errno)); \ 136 sprintf(errmsg, "out of memory"); \ 137 spl0(); \ 138 return err; \ 139 } \ 140 } \ 141 (n) = ti; \ 142 (b) = ts; \ 143 spl0(); \ 144 } 145 #else /* NO_REALLOC_NULL */ 146 /* CKBUF: assure at least a minimum size for buffer b */ 147 #define CKBUF(b,n,i,err) \ 148 if ((i) > (n)) { \ 149 int ti = (n); \ 150 char *ts; \ 151 spl1(); \ 152 if ((ts = (char *) realloc((b), ti += max((i), MINBUFSZ))) == NULL) { \ 153 fprintf(stderr, "%s\n", strerror(errno)); \ 154 sprintf(errmsg, "out of memory"); \ 155 spl0(); \ 156 return err; \ 157 } \ 158 (n) = ti; \ 159 (b) = ts; \ 160 spl0(); \ 161 } 162 #endif /* NO_REALLOC_NULL */ 163 164 /* requeue: link pred before succ */ 165 #define requeue(pred, succ) (pred)->next = (succ), (succ)->prev = (pred) 166 167 /* insqueue: insert elem in circular queue after pred */ 168 #define insqueue(elem, pred) \ 169 { \ 170 requeue((elem), (pred)->next); \ 171 requeue((pred), elem); \ 172 } 173 174 /* remqueue: remove elem from circular queue */ 175 #define remqueue(elem) requeue((elem)->prev, (elem)->next); 176 177 /* nultonl: overwrite ASCII NULs with newlines */ 178 #define nultonl(s, l) translit(s, l, '\0', '\n') 179 180 /* nltonul: overwrite newlines with ASCII NULs */ 181 #define nltonul(s, l) translit(s, l, '\n', '\0') 182 183 #ifndef strerror 184 # define strerror(n) sys_errlist[n] 185 #endif 186 187 #ifndef __P 188 # ifndef __STDC__ 189 # define __P(proto) () 190 # else 191 # define __P(proto) proto 192 # endif 193 #endif 194 195 /* local function declarations */ 196 int append __P((long, int)); 197 int cbcdec __P((char *, FILE *)); 198 int cbcenc __P((char *, int, FILE *)); 199 char *ckfn __P((char *)); 200 int ckglob __P((void)); 201 int ckrange __P((long, long)); 202 int desflush __P((FILE *)); 203 int desgetc __P((FILE *)); 204 void desinit __P((void)); 205 int desputc __P((int, FILE *)); 206 int docmd __P((int)); 207 void err __P((char *)); 208 char *ccl __P((char *)); 209 void clrmark __P((line_t *)); 210 void cvtkey __P((char *, char *)); 211 long doglob __P((int)); 212 void dohup __P((int)); 213 void dointr __P((int)); 214 void dowinch __P((int)); 215 int doprint __P((long, long, int)); 216 long doread __P((long, char *)); 217 long dowrite __P((long, long, char *, char *)); 218 char *esctos __P((char *)); 219 long patscan __P((pattern_t *, int)); 220 long getaddr __P((line_t *)); 221 char *getcmdv __P((int *, int)); 222 char *getfn __P((void)); 223 int getkey __P((void)); 224 char *getlhs __P((int)); 225 int getline __P((void)); 226 int getlist __P((void)); 227 long getmark __P((int)); 228 long getnum __P((int)); 229 long getone __P((void)); 230 line_t *getlp __P((long)); 231 int getrhs __P((int)); 232 int getshcmd __P((void)); 233 char *gettxt __P((line_t *)); 234 void init_buf __P((void)); 235 int join __P((long, long)); 236 int lndelete __P((long, long)); 237 line_t *lpdup __P((line_t *)); 238 void lpqueue __P((line_t *)); 239 void makekey __P((char *)); 240 char *makesub __P((int)); 241 int move __P((long, int)); 242 int oddesc __P((char *, char *)); 243 void onhup __P((int)); 244 void onintr __P((int)); 245 pattern_t *optpat __P((void)); 246 int putmark __P((int, line_t *)); 247 void putstr __P((char *, int, long, int)); 248 char *puttxt __P((char *)); 249 void quit __P((int)); 250 int regsub __P((pattern_t *, line_t *, int)); 251 int sbclose __P((void)); 252 int sbopen __P((void)); 253 int sgetline __P((FILE *)); 254 int catsub __P((char *, regmatch_t *, int)); 255 int subst __P((pattern_t *, int)); 256 int tobinhex __P((int, int)); 257 int transfer __P((long)); 258 char *translit __P((char *, int, int, int)); 259 int undo __P((int)); 260 undo_t *upush __P((int, long, long)); 261 void ureset __P((void)); 262 263 264 extern char *sys_errlist[]; 265 extern int mutex; 266 extern int sigflags; 267