|
|
1.1 ! root 1: #include "errors.h" ! 2: ! 3: #define BLOCKSIZE 4096 ! 4: #define NDISC 5 ! 5: #define NBUFFILES 2+2*NDISC /* undo+snarf+NDISC*(transcript+buf) */ ! 6: ! 7: #define TRUE 1 ! 8: #define FALSE 0 ! 9: ! 10: #define INFINITY ((Posn)0x7FFFFFFFL) ! 11: #define INCR 25 ! 12: #define SS 2 /* shorts are hardwired to two bytes in files */ ! 13: ! 14: #define new(t, n) ((t *)alloc(((ulong)(n)*sizeof(t)))) ! 15: #define gcnew(p, n) ((void)gcalloc((ulong)(n)*sizeof((p)[0]), (long **)&(p))) ! 16: #define gcrenew(p, n) ((void)gcrealloc((uchar *)p, ((ulong)(n)*sizeof((p)[0])))) ! 17: ! 18: typedef unsigned short ushort; ! 19: typedef unsigned long ulong; ! 20: typedef unsigned char uchar; ! 21: typedef long Posn; /* file position or address */ ! 22: typedef ushort Mod; /* modification number */ ! 23: ! 24: #include "mesg.h" ! 25: ! 26: enum State{ ! 27: Clean=' ', ! 28: Dirty='\'', ! 29: Unread='-', ! 30: }; ! 31: typedef struct File File; ! 32: typedef struct Range{ ! 33: Posn p1, p2; ! 34: }Range; ! 35: typedef struct Address{ ! 36: Range r; ! 37: File *f; ! 38: }Address; ! 39: typedef struct List{ ! 40: int nalloc; ! 41: int nused; ! 42: long *ptr; /* code depends on ptrs being same size as Posns */ ! 43: }List; ! 44: typedef struct Block{ ! 45: short bnum; /* absolute number on disk */ ! 46: short nbytes; /* bytes stored in this block */ ! 47: }Block; ! 48: typedef struct Discdesc{ ! 49: int fd; /* unix file descriptor of temp file */ ! 50: int nbk; /* high water mark */ ! 51: List free; /* array of free blocks */ ! 52: }Discdesc; ! 53: typedef struct Disc{ ! 54: Discdesc *desc; /* descriptor of temp file */ ! 55: Posn nbytes; /* bytes on disc file */ ! 56: struct{ ! 57: int nalloc; ! 58: int nused; ! 59: Block *ptr; ! 60: }block; /* array of used blocks (same shape as List) */ ! 61: }Disc; ! 62: typedef struct String{ ! 63: short n; ! 64: short size; ! 65: uchar *s; ! 66: }String; ! 67: typedef struct Buffer{ ! 68: Disc *disc; /* disc storage */ ! 69: Posn nbytes; /* total length of buffer */ ! 70: String cache; /* in-core storage for efficiency */ ! 71: Posn c1, c2; /* cache start and end positions in disc */ ! 72: /* note: if dirty, cache is really c0, c0+cache.n */ ! 73: int dirty; /* cache dirty */ ! 74: }Buffer; ! 75: #define NGETC 128 ! 76: struct File{ ! 77: Buffer *buf; /* cached disc storage */ ! 78: Buffer *transcript; /* what's been done */ ! 79: Posn markp; /* file pointer to start of latest change */ ! 80: Mod mod; /* modification stamp */ ! 81: Posn nbytes; /* total length of file */ ! 82: Posn hiposn; /* highest address touched this Mod */ ! 83: Address dot; /* current position */ ! 84: Range tdot; /* what terminal thinks is current range */ ! 85: Range mark; /* tagged spot in text (don't confuse with Mark) */ ! 86: List *rasp; /* map of what terminal's got */ ! 87: String name; /* file name */ ! 88: short tag; /* for communicating with terminal */ ! 89: char state; /* Clean, Dirty, Unread */ ! 90: char closeok; /* ok to close file? */ ! 91: char marked; /* file has been Fmarked at least once; once ! 92: * set, this will never go off as undo doesn't ! 93: * revert to the dawn of time */ ! 94: long inumber; /* file from which it was read */ ! 95: long date; /* time stamp of unix file */ ! 96: Posn cp1, cp2; /* Write-behind cache positions and */ ! 97: String cache; /* string */ ! 98: uchar getcbuf[NGETC]; ! 99: int ngetc; ! 100: int getci; ! 101: Posn getcp; ! 102: }; ! 103: typedef struct Filelist{ ! 104: int nalloc; ! 105: int nused; ! 106: File **ptr; ! 107: }Filelist; ! 108: typedef struct Mark{ ! 109: Posn p; ! 110: Range dot; ! 111: Range mark; ! 112: Mod m; ! 113: short s1; ! 114: }Mark; ! 115: typedef struct Regexp Regexp; ! 116: struct Regexp{ ! 117: String text; ! 118: }; ! 119: #define Fgetc(f) ((--(f)->ngetc<0)? Fgetcload(f, (f)->getcp) : (f)->getcbuf[(f)->getcp++, (f)->getci++]) ! 120: #define Fbgetc(f) (((f)->getci<=0)? Fbgetcload(f, (f)->getcp) : (f)->getcbuf[--(f)->getcp, --(f)->getci]) ! 121: ! 122: extern uchar *alloc(); ! 123: extern uchar *gcalloc(); ! 124: extern uchar *gcrealloc(); ! 125: extern char *brk(); ! 126: extern char *sbrk(); ! 127: extern Address address(); ! 128: extern Address lineaddr(); ! 129: extern Buffer *Bopen(); ! 130: extern Disc *Dopen(); ! 131: extern Discdesc *Dstart(); ! 132: extern File *Fopen(); ! 133: extern File *newfile(); ! 134: extern File *lookfile(); ! 135: extern File *current(); ! 136: extern Posn getnum(); ! 137: extern Posn readio(); ! 138: extern Posn writeio(); ! 139: extern Range rdata(); ! 140: extern String *tempstr(); ! 141: extern uchar genbuf[]; ! 142: extern char *home; ! 143: extern int io; ! 144: extern int patset; ! 145: extern int quitok; ! 146: extern Address addr; ! 147: extern Buffer *undobuf; ! 148: extern Buffer *snarfbuf; ! 149: extern Filelist file; ! 150: extern Filelist tempfile; ! 151: extern File *cmd; ! 152: extern File *curfile; ! 153: extern Mod modnum; ! 154: extern Posn cmdpt; ! 155: extern Posn cmdptadv; ! 156: extern Range sel; ! 157: extern String cmdstr; ! 158: extern String genstr; ! 159: extern String lastpat; ! 160: extern String lastregexp; ! 161: extern String unixcmd; ! 162: extern int dontcompact; ! 163: extern int downloaded; ! 164: extern int dounlock; ! 165: ! 166: #define compactok() dontcompact=FALSE ! 167: #define nocompact() dontcompact=TRUE ! 168: ! 169: #define strcmp mystrcmp ! 170: #define strncmp mystrncmp ! 171: #define strlen mystrlen ! 172: extern char *strcat(); ! 173: extern char *strchr(); ! 174: ! 175: #if vax|mc68020 /* longs are addressable at byte boundaries */ ! 176: #define PUTPOSN(d,s) *(Posn *)d = *(s), d+=sizeof(Posn) ! 177: #define GETPOSN(p,s) p = *(Posn *)(s) ! 178: #else ! 179: #define PUTPOSN(d,s) { register char *P=(char *)(s);\ ! 180: *d++= *P++;*d++= *P++;*d++= *P++;*d++= *P++; } ! 181: #define GETPOSN(p,s) { long L; register uchar *P1=(s),*P2=(uchar *)&L;\ ! 182: *P2++= *P1++;*P2++= *P1++;*P2++= *P1++;*P2++= *P1++;\ ! 183: p = L; } ! 184: #endif ! 185: extern void exit(); ! 186: ! 187: #define HIGHBIT 0x80 ! 188: #ifdef SUN ! 189: #define strchr(s,c) ((char *)index(s,c)) ! 190: #define bcopy(a,b,c,d) sambcopy(a,b,c,d) ! 191: #define Warning int ! 192: #define Error int ! 193: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.