|
|
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.