|
|
1.1 ! root 1: /* Copyright (c) 1981 Regents of the University of California */ ! 2: /* sccs id: @(#)ex.h 7.4 9/3/81 */ ! 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/types.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: #define CTRL(c) ('c' & 037) ! 154: #define NL CTRL(j) ! 155: #define CR CTRL(m) ! 156: #define DELETE 0177 /* See also ATTN, QUIT in ex_tune.h */ ! 157: #define ESCAPE 033 ! 158: ! 159: /* ! 160: * Miscellaneous random variables used in more than one place ! 161: */ ! 162: var bool aiflag; /* Append/change/insert with autoindent */ ! 163: var bool anymarks; /* We have used '[a-z] */ ! 164: var int chng; /* Warn "No write" */ ! 165: var char *Command; ! 166: var short defwind; /* -w# change default window size */ ! 167: var int dirtcnt; /* When >= MAXDIRT, should sync temporary */ ! 168: #ifdef SIGTSTP ! 169: var bool dosusp; /* Do SIGTSTP in visual when ^Z typed */ ! 170: #endif ! 171: var bool edited; /* Current file is [Edited] */ ! 172: var line *endcore; /* Last available core location */ ! 173: extern bool endline; /* Last cmd mode command ended with \n */ ! 174: #ifndef VMUNIX ! 175: var short erfile; /* Error message file unit */ ! 176: #endif ! 177: var line *fendcore; /* First address in line pointer space */ ! 178: var char file[FNSIZE]; /* Working file name */ ! 179: var char genbuf[LBSIZE]; /* Working buffer when manipulating linebuf */ ! 180: var bool hush; /* Command line option - was given, hush up! */ ! 181: var char *globp; /* (Untyped) input string to command mode */ ! 182: var bool holdcm; /* Don't cursor address */ ! 183: var bool inappend; /* in ex command append mode */ ! 184: var bool inglobal; /* Inside g//... or v//... */ ! 185: var char *initev; /* Initial : escape for visual */ ! 186: var bool inopen; /* Inside open or visual */ ! 187: var char *input; /* Current position in cmd line input buffer */ ! 188: var bool intty; /* Input is a tty */ ! 189: var short io; /* General i/o unit (auto-closed on error!) */ ! 190: extern short lastc; /* Last character ret'd from cmd input */ ! 191: var bool laste; /* Last command was an "e" (or "rec") */ ! 192: var char lastmac; /* Last macro called for ** */ ! 193: var char lasttag[TAGSIZE]; /* Last argument to a tag command */ ! 194: var char *linebp; /* Used in substituting in \n */ ! 195: var char linebuf[LBSIZE]; /* The primary line buffer */ ! 196: var bool listf; /* Command should run in list mode */ ! 197: var char *loc1; /* Where re began to match (in linebuf) */ ! 198: var char *loc2; /* First char after re match (") */ ! 199: var line names['z'-'a'+2]; /* Mark registers a-z,' */ ! 200: var int notecnt; /* Count for notify (to visual from cmd) */ ! 201: var bool numberf; /* Command should run in number mode */ ! 202: var char obuf[BUFSIZ]; /* Buffer for tty output */ ! 203: var short oprompt; /* Saved during source */ ! 204: extern short ospeed; /* Output speed (from gtty) */ ! 205: var int otchng; /* Backup tchng to find changes in macros */ ! 206: var short peekc; /* Peek ahead character (cmd mode input) */ ! 207: var char *pkill[2]; /* Trim for put with ragged (LISP) delete */ ! 208: var bool pfast; /* Have stty -nl'ed to go faster */ ! 209: var int pid; /* Process id of child */ ! 210: var int ppid; /* Process id of parent (e.g. main ex proc) */ ! 211: var jmp_buf resetlab; /* For error throws to top level (cmd mode) */ ! 212: var int rpid; /* Pid returned from wait() */ ! 213: var bool ruptible; /* Interruptible is normal state */ ! 214: var bool seenprompt; /* 1 if have gotten user input */ ! 215: var bool shudclob; /* Have a prompt to clobber (e.g. on ^D) */ ! 216: var int status; /* Status returned from wait() */ ! 217: var int tchng; /* If nonzero, then [Modified] */ ! 218: extern short tfile; /* Temporary file unit */ ! 219: var bool vcatch; /* Want to catch an error (open/visual) */ ! 220: var jmp_buf vreslab; /* For error throws to a visual catch */ ! 221: var bool writing; /* 1 if in middle of a file write */ ! 222: var int xchng; /* Suppresses multiple "No writes" in !cmd */ ! 223: ! 224: /* ! 225: * Macros ! 226: */ ! 227: #define CP(a, b) (ignore(strcpy(a, b))) ! 228: /* ! 229: * FIXUNDO: do we want to mung undo vars? ! 230: * Usually yes unless in a macro or global. ! 231: */ ! 232: #define FIXUNDO (inopen >= 0 && (inopen || !inglobal)) ! 233: #define ckaw() {if (chng && value(AUTOWRITE)) wop(0);} ! 234: #define copy(a,b,c) Copy((char *) a, (char *) b, c) ! 235: #define eq(a, b) ((a) && (b) && strcmp(a, b) == 0) ! 236: #define getexit(a) copy(a, resetlab, sizeof (jmp_buf)) ! 237: #define lastchar() lastc ! 238: #define outchar(c) (*Outchar)(c) ! 239: #define pastwh() (ignore(skipwh())) ! 240: #define pline(no) (*Pline)(no) ! 241: #define reset() longjmp(resetlab,1) ! 242: #define resexit(a) copy(resetlab, a, sizeof (jmp_buf)) ! 243: #define setexit() setjmp(resetlab) ! 244: #define setlastchar(c) lastc = c ! 245: #define ungetchar(c) peekc = c ! 246: ! 247: #define CATCH vcatch = 1; if (setjmp(vreslab) == 0) { ! 248: #define ONERR } else { vcatch = 0; ! 249: #define ENDCATCH } vcatch = 0; ! 250: ! 251: /* ! 252: * Environment like memory ! 253: */ ! 254: var char altfile[FNSIZE]; /* Alternate file name */ ! 255: extern char direct[ONMSZ]; /* Temp file goes here */ ! 256: extern char shell[ONMSZ]; /* Copied to be settable */ ! 257: extern char ttytype[ONMSZ]; /* A long and pretty name */ ! 258: var char uxb[UXBSIZE + 2]; /* Last !command for !! */ ! 259: ! 260: /* ! 261: * The editor data structure for accessing the current file consists ! 262: * of an incore array of pointers into the temporary file tfile. ! 263: * Each pointer is 15 bits (the low bit is used by global) and is ! 264: * padded with zeroes to make an index into the temp file where the ! 265: * actual text of the line is stored. ! 266: * ! 267: * To effect undo, copies of affected lines are saved after the last ! 268: * line considered to be in the buffer, between dol and unddol. ! 269: * During an open or visual, which uses the command mode undo between ! 270: * dol and unddol, a copy of the entire, pre-command buffer state ! 271: * is saved between unddol and truedol. ! 272: */ ! 273: var line *addr1; /* First addressed line in a command */ ! 274: var line *addr2; /* Second addressed line */ ! 275: var line *dol; /* Last line in buffer */ ! 276: var line *dot; /* Current line */ ! 277: var line *one; /* First line */ ! 278: var line *truedol; /* End of all lines, including saves */ ! 279: var line *unddol; /* End of undo saved lines */ ! 280: var line *zero; /* Points to empty slot before one */ ! 281: ! 282: /* ! 283: * Undo information ! 284: * ! 285: * For most commands we save lines changed by salting them away between ! 286: * dol and unddol before they are changed (i.e. we save the descriptors ! 287: * into the temp file tfile which is never garbage collected). The ! 288: * lines put here go back after unddel, and to complete the undo ! 289: * we delete the lines [undap1,undap2). ! 290: * ! 291: * Undoing a move is much easier and we treat this as a special case. ! 292: * Similarly undoing a "put" is a special case for although there ! 293: * are lines saved between dol and unddol we don't stick these back ! 294: * into the buffer. ! 295: */ ! 296: var short undkind; ! 297: ! 298: var line *unddel; /* Saved deleted lines go after here */ ! 299: var line *undap1; /* Beginning of new lines */ ! 300: var line *undap2; /* New lines end before undap2 */ ! 301: var line *undadot; /* If we saved all lines, dot reverts here */ ! 302: ! 303: #define UNDCHANGE 0 ! 304: #define UNDMOVE 1 ! 305: #define UNDALL 2 ! 306: #define UNDNONE 3 ! 307: #define UNDPUT 4 ! 308: ! 309: #ifdef CRYPT ! 310: /* ! 311: * Various miscellaneous flags and buffers needed by the encryption routines. ! 312: */ ! 313: #define KSIZE 9 /* key size for encryption */ ! 314: #define KEYPROMPT "Key: " ! 315: var int xflag; /* True if we are in encryption mode */ ! 316: var int xtflag; /* True if the temp file is being encrypted */ ! 317: var int kflag; /* True if the key has been accepted */ ! 318: var char perm[1024]; ! 319: var char tperm[1024]; ! 320: var char *key; ! 321: var char crbuf[CRSIZE]; ! 322: char *getpass(); ! 323: #endif ! 324: ! 325: /* ! 326: * Function type definitions ! 327: */ ! 328: #define NOSTR (char *) 0 ! 329: #define NOLINE (line *) 0 ! 330: ! 331: extern int (*Outchar)(); ! 332: extern int (*Pline)(); ! 333: extern int (*Putchar)(); ! 334: var int (*oldhup)(); ! 335: int (*setlist())(); ! 336: int (*setnorm())(); ! 337: int (*setnorm())(); ! 338: int (*setnumb())(); ! 339: line *address(); ! 340: char *cgoto(); ! 341: char *genindent(); ! 342: char *getblock(); ! 343: char *getenv(); ! 344: line *getmark(); ! 345: char *longname(); ! 346: char *mesg(); ! 347: char *place(); ! 348: char *plural(); ! 349: line *scanfor(); ! 350: line *setin(); ! 351: char *strcat(); ! 352: char *strcpy(); ! 353: char *strend(); ! 354: char *tailpath(); ! 355: char *tgetstr(); ! 356: char *tgoto(); ! 357: char *ttyname(); ! 358: line *vback(); ! 359: char *vfindcol(); ! 360: char *vgetline(); ! 361: char *vinit(); ! 362: char *vpastwh(); ! 363: char *vskipwh(); ! 364: int put(); ! 365: int putreg(); ! 366: int YANKreg(); ! 367: int delete(); ! 368: int execl(); ! 369: int filter(); ! 370: int getfile(); ! 371: int getsub(); ! 372: int gettty(); ! 373: int join(); ! 374: int listchar(); ! 375: off_t lseek(); ! 376: int normchar(); ! 377: int normline(); ! 378: int numbline(); ! 379: var int (*oldquit)(); ! 380: int onhup(); ! 381: int onintr(); ! 382: int onsusp(); ! 383: int putch(); ! 384: int shift(); ! 385: int termchar(); ! 386: int vfilter(); ! 387: #ifdef CBREAK ! 388: int vintr(); ! 389: #endif ! 390: int vputch(); ! 391: int vshftop(); ! 392: int yank(); ! 393: ! 394: /* ! 395: * C doesn't have a (void) cast, so we have to fake it for lint's sake. ! 396: */ ! 397: #ifdef lint ! 398: # define ignore(a) Ignore((char *) (a)) ! 399: # define ignorf(a) Ignorf((int (*) ()) (a)) ! 400: #else ! 401: # define ignore(a) a ! 402: # define ignorf(a) a ! 403: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.