1 /* Copyright (c) 1981 Regents of the University of California */ 2 /* sccs id: @(#)ex.h 7.6 03/27/85 */ 3 #ifdef V6 4 #include <retrofit.h> 5 #endif 6 7 /* 8 * Ex version 3 (see exact version in ex_cmds.c, search for /Version/) 9 * 10 * Mark Horton, UC Berkeley 11 * Bill Joy, UC Berkeley 12 * November 1979 13 * 14 * This file contains most of the declarations common to a large number 15 * of routines. The file ex_vis.h contains declarations 16 * which are used only inside the screen editor. 17 * The file ex_tune.h contains parameters which can be diddled per installation. 18 * 19 * The declarations relating to the argument list, regular expressions, 20 * the temporary file data structure used by the editor 21 * and the data describing terminals are each fairly substantial and 22 * are kept in the files ex_{argv,re,temp,tty}.h which 23 * we #include separately. 24 * 25 * If you are going to dig into ex, you should look at the outline of the 26 * distribution of the code into files at the beginning of ex.c and ex_v.c. 27 * Code which is similar to that of ed is lightly or undocumented in spots 28 * (e.g. the regular expression code). Newer code (e.g. open and visual) 29 * is much more carefully documented, and still rough in spots. 30 * 31 * Please forward bug reports to 32 * 33 * Mark Horton 34 * Computer Science Division, EECS 35 * EVANS HALL 36 * U.C. Berkeley 94704 37 * (415) 642-4948 38 * (415) 642-1024 (dept. office) 39 * 40 * or to csvax.mark@berkeley on the ARPA-net. I would particularly like to hear 41 * of additional terminal descriptions you add to the termcap data base. 42 */ 43 44 #include <sys/param.h> 45 #include <ctype.h> 46 #include <errno.h> 47 #include <signal.h> 48 #include <setjmp.h> 49 #include <sys/stat.h> 50 51 #ifndef var 52 #define var extern 53 #endif 54 /* 55 * The following little dance copes with the new USG tty handling. 56 * This stuff has the advantage of considerable flexibility, and 57 * the disadvantage of being incompatible with anything else. 58 * The presence of the symbol USG3TTY will indicate the new code: 59 * in this case, we define CBREAK (because we can simulate it exactly), 60 * but we won't actually use it, so we set it to a value that will 61 * probably blow the compilation if we goof up. 62 */ 63 #ifdef USG3TTY 64 #include <termio.h> 65 #define CBREAK xxxxx 66 #else 67 #include <sgtty.h> 68 #endif 69 70 extern int errno; 71 72 #ifndef VMUNIX 73 typedef short line; 74 #else 75 typedef int line; 76 #endif 77 typedef short bool; 78 79 #include "ex_tune.h" 80 #include "ex_vars.h" 81 /* 82 * Options in the editor are referred to usually by "value(name)" where 83 * name is all uppercase, i.e. "value(PROMPT)". This is actually a macro 84 * which expands to a fixed field in a static structure and so generates 85 * very little code. The offsets for the option names in the structure 86 * are generated automagically from the structure initializing them in 87 * ex_data.c... see the shell script "makeoptions". 88 */ 89 struct option { 90 char *oname; 91 char *oabbrev; 92 short otype; /* Types -- see below */ 93 short odefault; /* Default value */ 94 short ovalue; /* Current value */ 95 char *osvalue; 96 }; 97 98 #define ONOFF 0 99 #define NUMERIC 1 100 #define STRING 2 /* SHELL or DIRECTORY */ 101 #define OTERM 3 102 103 #define value(a) options[a].ovalue 104 #define svalue(a) options[a].osvalue 105 106 extern struct option options[NOPTS + 1]; 107 108 109 /* 110 * The editor does not normally use the standard i/o library. Because 111 * we expect the editor to be a heavily used program and because it 112 * does a substantial amount of input/output processing it is appropriate 113 * for it to call low level read/write primitives directly. In fact, 114 * when debugging the editor we use the standard i/o library. In any 115 * case the editor needs a printf which prints through "putchar" ala the 116 * old version 6 printf. Thus we normally steal a copy of the "printf.c" 117 * and "strout" code from the standard i/o library and mung it for our 118 * purposes to avoid dragging in the stdio library headers, etc if we 119 * are not debugging. Such a modified printf exists in "printf.c" here. 120 */ 121 #ifdef TRACE 122 # include <stdio.h> 123 var FILE *trace; 124 var bool trubble; 125 var bool techoin; 126 var char tracbuf[BUFSIZ]; 127 # undef putchar 128 # undef getchar 129 #else 130 # ifdef VMUNIX 131 # define BUFSIZ 1024 132 # else 133 # ifdef u370 134 # define BUFSIZ 4096 135 # else 136 # define BUFSIZ 512 137 # endif 138 # endif 139 # define NULL 0 140 # define EOF -1 141 #endif 142 143 /* 144 * Character constants and bits 145 * 146 * The editor uses the QUOTE bit as a flag to pass on with characters 147 * e.g. to the putchar routine. The editor never uses a simple char variable. 148 * Only arrays of and pointers to characters are used and parameters and 149 * registers are never declared character. 150 */ 151 #define QUOTE 0200 152 #define TRIM 0177 153 #undef CTRL 154 #define CTRL(c) ('c' & 037) 155 #define NL CTRL(j) 156 #define CR CTRL(m) 157 #define DELETE 0177 /* See also ATTN, QUIT in ex_tune.h */ 158 #define ESCAPE 033 159 160 /* 161 * Miscellaneous random variables used in more than one place 162 */ 163 var bool aiflag; /* Append/change/insert with autoindent */ 164 var bool anymarks; /* We have used '[a-z] */ 165 var int chng; /* Warn "No write" */ 166 var char *Command; 167 var short defwind; /* -w# change default window size */ 168 var int dirtcnt; /* When >= MAXDIRT, should sync temporary */ 169 #ifdef TIOCLGET 170 var bool dosusp; /* Do SIGTSTP in visual when ^Z typed */ 171 #endif 172 var bool edited; /* Current file is [Edited] */ 173 var line *endcore; /* Last available core location */ 174 extern bool endline; /* Last cmd mode command ended with \n */ 175 #ifndef VMUNIX 176 var short erfile; /* Error message file unit */ 177 #endif 178 var line *fendcore; /* First address in line pointer space */ 179 var char file[FNSIZE]; /* Working file name */ 180 var char genbuf[MAXBSIZE]; /* Working buffer when manipulating linebuf */ 181 var bool hush; /* Command line option - was given, hush up! */ 182 var char *globp; /* (Untyped) input string to command mode */ 183 var bool holdcm; /* Don't cursor address */ 184 var bool inappend; /* in ex command append mode */ 185 var bool inglobal; /* Inside g//... or v//... */ 186 var char *initev; /* Initial : escape for visual */ 187 var bool inopen; /* Inside open or visual */ 188 var char *input; /* Current position in cmd line input buffer */ 189 var bool intty; /* Input is a tty */ 190 var short io; /* General i/o unit (auto-closed on error!) */ 191 extern short lastc; /* Last character ret'd from cmd input */ 192 var bool laste; /* Last command was an "e" (or "rec") */ 193 var char lastmac; /* Last macro called for ** */ 194 var char lasttag[TAGSIZE]; /* Last argument to a tag command */ 195 var char *linebp; /* Used in substituting in \n */ 196 var char linebuf[LBSIZE]; /* The primary line buffer */ 197 var bool listf; /* Command should run in list mode */ 198 var char *loc1; /* Where re began to match (in linebuf) */ 199 var char *loc2; /* First char after re match (") */ 200 var line names['z'-'a'+2]; /* Mark registers a-z,' */ 201 var int notecnt; /* Count for notify (to visual from cmd) */ 202 var bool numberf; /* Command should run in number mode */ 203 var char obuf[BUFSIZ]; /* Buffer for tty output */ 204 var short oprompt; /* Saved during source */ 205 extern short ospeed; /* Output speed (from gtty) */ 206 var int otchng; /* Backup tchng to find changes in macros */ 207 var short peekc; /* Peek ahead character (cmd mode input) */ 208 var char *pkill[2]; /* Trim for put with ragged (LISP) delete */ 209 var bool pfast; /* Have stty -nl'ed to go faster */ 210 var int pid; /* Process id of child */ 211 var int ppid; /* Process id of parent (e.g. main ex proc) */ 212 var jmp_buf resetlab; /* For error throws to top level (cmd mode) */ 213 var int rpid; /* Pid returned from wait() */ 214 var bool ruptible; /* Interruptible is normal state */ 215 var bool seenprompt; /* 1 if have gotten user input */ 216 var bool shudclob; /* Have a prompt to clobber (e.g. on ^D) */ 217 var int status; /* Status returned from wait() */ 218 var int tchng; /* If nonzero, then [Modified] */ 219 extern short tfile; /* Temporary file unit */ 220 var bool vcatch; /* Want to catch an error (open/visual) */ 221 var jmp_buf vreslab; /* For error throws to a visual catch */ 222 var bool writing; /* 1 if in middle of a file write */ 223 var int xchng; /* Suppresses multiple "No writes" in !cmd */ 224 var long bsize; /* Block size for disk i/o */ 225 226 /* 227 * Macros 228 */ 229 #define CP(a, b) (ignore(strcpy(a, b))) 230 /* 231 * FIXUNDO: do we want to mung undo vars? 232 * Usually yes unless in a macro or global. 233 */ 234 #define FIXUNDO (inopen >= 0 && (inopen || !inglobal)) 235 #define ckaw() {if (chng && value(AUTOWRITE)) wop(0);} 236 #define copy(a,b,c) Copy((char *) a, (char *) b, c) 237 #define eq(a, b) ((a) && (b) && strcmp(a, b) == 0) 238 #define getexit(a) copy(a, resetlab, sizeof (jmp_buf)) 239 #define lastchar() lastc 240 #define outchar(c) (*Outchar)(c) 241 #define pastwh() (ignore(skipwh())) 242 #define pline(no) (*Pline)(no) 243 #define reset() longjmp(resetlab,1) 244 #define resexit(a) copy(resetlab, a, sizeof (jmp_buf)) 245 #define setexit() setjmp(resetlab) 246 #define setlastchar(c) lastc = c 247 #define ungetchar(c) peekc = c 248 249 #define CATCH vcatch = 1; if (setjmp(vreslab) == 0) { 250 #define ONERR } else { vcatch = 0; 251 #define ENDCATCH } vcatch = 0; 252 253 /* 254 * Environment like memory 255 */ 256 var char altfile[FNSIZE]; /* Alternate file name */ 257 extern char direct[ONMSZ]; /* Temp file goes here */ 258 extern char shell[ONMSZ]; /* Copied to be settable */ 259 extern char ttytype[ONMSZ]; /* A long and pretty name */ 260 var char uxb[UXBSIZE + 2]; /* Last !command for !! */ 261 262 /* 263 * The editor data structure for accessing the current file consists 264 * of an incore array of pointers into the temporary file tfile. 265 * Each pointer is 15 bits (the low bit is used by global) and is 266 * padded with zeroes to make an index into the temp file where the 267 * actual text of the line is stored. 268 * 269 * To effect undo, copies of affected lines are saved after the last 270 * line considered to be in the buffer, between dol and unddol. 271 * During an open or visual, which uses the command mode undo between 272 * dol and unddol, a copy of the entire, pre-command buffer state 273 * is saved between unddol and truedol. 274 */ 275 var line *addr1; /* First addressed line in a command */ 276 var line *addr2; /* Second addressed line */ 277 var line *dol; /* Last line in buffer */ 278 var line *dot; /* Current line */ 279 var line *one; /* First line */ 280 var line *truedol; /* End of all lines, including saves */ 281 var line *unddol; /* End of undo saved lines */ 282 var line *zero; /* Points to empty slot before one */ 283 284 /* 285 * Undo information 286 * 287 * For most commands we save lines changed by salting them away between 288 * dol and unddol before they are changed (i.e. we save the descriptors 289 * into the temp file tfile which is never garbage collected). The 290 * lines put here go back after unddel, and to complete the undo 291 * we delete the lines [undap1,undap2). 292 * 293 * Undoing a move is much easier and we treat this as a special case. 294 * Similarly undoing a "put" is a special case for although there 295 * are lines saved between dol and unddol we don't stick these back 296 * into the buffer. 297 */ 298 var short undkind; 299 300 var line *unddel; /* Saved deleted lines go after here */ 301 var line *undap1; /* Beginning of new lines */ 302 var line *undap2; /* New lines end before undap2 */ 303 var line *undadot; /* If we saved all lines, dot reverts here */ 304 305 #define UNDCHANGE 0 306 #define UNDMOVE 1 307 #define UNDALL 2 308 #define UNDNONE 3 309 #define UNDPUT 4 310 311 #ifdef CRYPT 312 /* 313 * Various miscellaneous flags and buffers needed by the encryption routines. 314 */ 315 #define KSIZE 9 /* key size for encryption */ 316 #define KEYPROMPT "Key: " 317 var int xflag; /* True if we are in encryption mode */ 318 var int xtflag; /* True if the temp file is being encrypted */ 319 var int kflag; /* True if the key has been accepted */ 320 var char perm[768]; 321 var char tperm[768]; 322 var char *key; 323 var char crbuf[CRSIZE]; 324 char *getpass(); 325 #endif 326 327 /* 328 * Function type definitions 329 */ 330 #define NOSTR (char *) 0 331 #define NOLINE (line *) 0 332 333 extern int (*Outchar)(); 334 extern int (*Pline)(); 335 extern int (*Putchar)(); 336 var int (*oldhup)(); 337 int (*setlist())(); 338 int (*setnorm())(); 339 int (*setnorm())(); 340 int (*setnumb())(); 341 line *address(); 342 char *cgoto(); 343 char *genindent(); 344 char *getblock(); 345 char *getenv(); 346 line *getmark(); 347 char *longname(); 348 char *mesg(); 349 char *place(); 350 char *plural(); 351 line *scanfor(); 352 line *setin(); 353 char *strcat(); 354 char *strcpy(); 355 char *strend(); 356 char *tailpath(); 357 char *tgetstr(); 358 char *tgoto(); 359 char *ttyname(); 360 line *vback(); 361 char *vfindcol(); 362 char *vgetline(); 363 char *vinit(); 364 char *vpastwh(); 365 char *vskipwh(); 366 int put(); 367 int putreg(); 368 int YANKreg(); 369 int delete(); 370 int execl(); 371 int filter(); 372 int getfile(); 373 int getsub(); 374 int gettty(); 375 int join(); 376 int listchar(); 377 off_t lseek(); 378 int normchar(); 379 int normline(); 380 int numbline(); 381 var int (*oldquit)(); 382 int onhup(); 383 int onintr(); 384 int onsusp(); 385 int putch(); 386 int shift(); 387 int termchar(); 388 int vfilter(); 389 #ifdef CBREAK 390 int vintr(); 391 #endif 392 int vputch(); 393 int vshftop(); 394 int yank(); 395 396 /* 397 * C doesn't have a (void) cast, so we have to fake it for lint's sake. 398 */ 399 #ifdef lint 400 # define ignore(a) Ignore((char *) (a)) 401 # define ignorf(a) Ignorf((int (*) ()) (a)) 402 #else 403 # define ignore(a) a 404 # define ignorf(a) a 405 #endif 406