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