Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <plumb.h>
4 #include "errors.h"
6 #undef waitfor
7 #define waitfor samwaitfor
9 #undef warn
10 #define warn samwarn
12 /*
13 * BLOCKSIZE is relatively small to keep memory consumption down.
14 */
16 #define BLOCKSIZE 2048
17 #define RUNESIZE sizeof(Rune)
18 #define NDISC 5
19 #define NBUFFILES 3+2*NDISC /* plan 9+undo+snarf+NDISC*(transcript+buf) */
20 #define NSUBEXP 10
22 #define TRUE 1
23 #define FALSE 0
25 #undef INFINITY /* Darwin declares this as HUGE_VAL */
26 #define INFINITY 0x7FFFFFFFL
27 #define INCR 25
28 #define STRSIZE (2*BLOCKSIZE)
30 typedef long Posn; /* file position or address */
31 typedef ushort Mod; /* modification number */
33 typedef struct Address Address;
34 typedef struct Block Block;
35 typedef struct Buffer Buffer;
36 typedef struct Disk Disk;
37 typedef struct Discdesc Discdesc;
38 typedef struct File File;
39 typedef struct List List;
40 typedef struct Range Range;
41 typedef struct Rangeset Rangeset;
42 typedef struct String String;
44 enum State
45 {
46 Clean = ' ',
47 Dirty = '\'',
48 Unread = '-'
49 };
51 struct Range
52 {
53 Posn p1, p2;
54 };
56 struct Rangeset
57 {
58 Range p[NSUBEXP];
59 };
61 struct Address
62 {
63 Range r;
64 File *f;
65 };
67 struct String
68 {
69 short n;
70 short size;
71 Rune *s;
72 };
74 struct List /* code depends on a long being able to hold a pointer */
75 {
76 int type; /* 'p' for pointer, 'P' for Posn */
77 int nalloc;
78 int nused;
79 union{
80 void* listp;
81 void** voidp;
82 Posn* posnp;
83 String**stringp;
84 File** filep;
85 }g;
86 };
88 #define listptr g.listp
89 #define voidpptr g.voidp
90 #define posnptr g.posnp
91 #define stringpptr g.stringp
92 #define filepptr g.filep
94 enum
95 {
96 Blockincr = 256,
97 Maxblock = 8*1024,
99 BUFSIZE = Maxblock, /* size from fbufalloc() */
100 RBUFSIZE = BUFSIZE/sizeof(Rune)
101 };
104 enum
106 Null = '-',
107 Delete = 'd',
108 Insert = 'i',
109 Filename = 'f',
110 Dot = 'D',
111 Mark = 'm'
112 };
114 struct Block
116 uint addr; /* disk address in bytes */
117 union {
118 uint n; /* number of used runes in block */
119 Block *next; /* pointer to next in free list */
120 } u;
121 };
123 struct Disk
125 int fd;
126 uint addr; /* length of temp file */
127 Block *free[Maxblock/Blockincr+1];
128 };
130 Disk* diskinit(void);
131 Block* disknewblock(Disk*, uint);
132 void diskrelease(Disk*, Block*);
133 void diskread(Disk*, Block*, Rune*, uint);
134 void diskwrite(Disk*, Block**, Rune*, uint);
136 struct Buffer
138 uint nc;
139 Rune *c; /* cache */
140 uint cnc; /* bytes in cache */
141 uint cmax; /* size of allocated cache */
142 uint cq; /* position of cache */
143 int cdirty; /* cache needs to be written */
144 uint cbi; /* index of cache Block */
145 Block **bl; /* array of blocks */
146 uint nbl; /* number of blocks */
147 };
148 void bufinsert(Buffer*, uint, Rune*, uint);
149 void bufdelete(Buffer*, uint, uint);
150 uint bufload(Buffer*, uint, int, int*);
151 void bufread(Buffer*, uint, Rune*, uint);
152 void bufclose(Buffer*);
153 void bufreset(Buffer*);
155 struct File
157 Buffer b; /* the data */
158 Buffer delta; /* transcript of changes */
159 Buffer epsilon; /* inversion of delta for redo */
160 String name; /* name of associated file */
161 uvlong qidpath; /* of file when read */
162 uint mtime; /* of file when read */
163 int dev; /* of file when read */
164 int unread; /* file has not been read from disk */
166 long seq; /* if seq==0, File acts like Buffer */
167 long cleanseq; /* f->seq at last read/write of file */
168 int mod; /* file appears modified in menu */
169 char rescuing; /* sam exiting; this file unusable */
171 #if 0
172 // Text *curtext; /* most recently used associated text */
173 // Text **text; /* list of associated texts */
174 // int ntext;
175 // int dumpid; /* used in dumping zeroxed windows */
176 #endif
178 Posn hiposn; /* highest address touched this Mod */
179 Address dot; /* current position */
180 Address ndot; /* new current position after update */
181 Range tdot; /* what terminal thinks is current range */
182 Range mark; /* tagged spot in text (don't confuse with Mark) */
183 List *rasp; /* map of what terminal's got */
184 short tag; /* for communicating with terminal */
185 char closeok; /* ok to close file? */
186 char deleted; /* delete at completion of command */
187 Range prevdot; /* state before start of change */
188 Range prevmark;
189 long prevseq;
190 int prevmod;
191 };
192 /*File* fileaddtext(File*, Text*); */
193 void fileclose(File*);
194 void filedelete(File*, uint, uint);
195 /*void filedeltext(File*, Text*); */
196 void fileinsert(File*, uint, Rune*, uint);
197 uint fileload(File*, uint, int, int*);
198 void filemark(File*);
199 void filereset(File*);
200 void filesetname(File*, String*);
201 void fileundelete(File*, Buffer*, uint, uint);
202 void fileuninsert(File*, Buffer*, uint, uint);
203 void fileunsetname(File*, Buffer*);
204 void fileundo(File*, int, int, uint*, uint*, int);
205 int fileupdate(File*, int, int);
207 int filereadc(File*, uint);
208 File *fileopen(void);
209 void loginsert(File*, uint, Rune*, uint);
210 void logdelete(File*, uint, uint);
211 void logsetname(File*, String*);
212 int fileisdirty(File*);
213 long undoseq(File*, int);
214 long prevseq(Buffer*);
216 void raspload(File*);
217 void raspstart(File*);
218 void raspdelete(File*, uint, uint, int);
219 void raspinsert(File*, uint, Rune*, uint, int);
220 void raspdone(File*, int);
221 void raspflush(File*);
223 /*
224 * acme fns
225 */
226 void* fbufalloc(void);
227 void fbuffree(void*);
228 uint min(uint, uint);
229 void cvttorunes(char*, int, Rune*, int*, int*, int*);
231 #define runemalloc(a) (Rune*)emalloc((a)*sizeof(Rune))
232 #define runerealloc(a, b) (Rune*)realloc((a), (b)*sizeof(Rune))
233 #define runemove(a, b, c) memmove((a), (b), (c)*sizeof(Rune))
235 int alnum(int);
236 int Read(int, void*, int);
237 void Seek(int, long, int);
238 int plan9(File*, int, String*, int);
239 int Write(int, void*, int);
240 int bexecute(File*, Posn);
241 void cd(String*);
242 void closefiles(File*, String*);
243 void closeio(Posn);
244 void cmdloop(void);
245 void cmdupdate(void);
246 void compile(String*);
247 void copy(File*, Address);
248 File *current(File*);
249 void delete(File*);
250 void delfile(File*);
251 void dellist(List*, int);
252 void doubleclick(File*, Posn);
253 void dprint(char*, ...);
254 void edit(File*, int);
255 void *emalloc(ulong);
256 void *erealloc(void*, ulong);
257 void error(Err);
258 void error_c(Err, int);
259 void error_r(Err, char*);
260 void error_s(Err, char*);
261 int execute(File*, Posn, Posn);
262 int filematch(File*, String*);
263 void filename(File*);
264 void fixname(String*);
265 void fullname(String*);
266 void getcurwd(void);
267 File *getfile(String*);
268 int getname(File*, String*, int);
269 long getnum(int);
270 void hiccough(char*);
271 void inslist(List*, int, ...);
272 Address lineaddr(Posn, Address, int);
273 List *listalloc(int);
274 void listfree(List*);
275 void load(File*);
276 File *lookfile(String*);
277 void lookorigin(File*, Posn, Posn);
278 int lookup(int);
279 void move(File*, Address);
280 void moveto(File*, Range);
281 File *newfile(void);
282 void nextmatch(File*, String*, Posn, int);
283 int newtmp(int);
284 void notifyf(void*, char*);
285 void panic(char*);
286 void printposn(File*, int);
287 void print_ss(char*, String*, String*);
288 void print_s(char*, String*);
289 int rcv(void);
290 Range rdata(List*, Posn, Posn);
291 Posn readio(File*, int*, int, int);
292 void rescue(void);
293 void resetcmd(void);
294 void resetsys(void);
295 void resetxec(void);
296 void rgrow(List*, Posn, Posn);
297 void samerr(char*);
298 void settempfile(void);
299 int skipbl(void);
300 void snarf(File*, Posn, Posn, Buffer*, int);
301 void sortname(File*);
302 void startup(char*, int, char**, char**);
303 void state(File*, int);
304 int statfd(int, ulong*, uvlong*, long*, long*, long*);
305 int statfile(char*, ulong*, uvlong*, long*, long*, long*);
306 void Straddc(String*, int);
307 void Strclose(String*);
308 int Strcmp(String*, String*);
309 void Strdelete(String*, Posn, Posn);
310 void Strdupl(String*, Rune*);
311 void Strduplstr(String*, String*);
312 void Strinit(String*);
313 void Strinit0(String*);
314 void Strinsert(String*, String*, Posn);
315 void Strinsure(String*, ulong);
316 int Strispre(String*, String*);
317 void Strzero(String*);
318 int Strlen(Rune*);
319 char *Strtoc(String*);
320 void syserror(char*);
321 void telldot(File*);
322 void tellpat(void);
323 String *tmpcstr(char*);
324 String *tmprstr(Rune*, int);
325 void freetmpstr(String*);
326 void termcommand(void);
327 void termwrite(char*);
328 File *tofile(String*);
329 void trytoclose(File*);
330 void trytoquit(void);
331 int undo(int);
332 void update(void);
333 int waitfor(int);
334 void warn(Warn);
335 void warn_s(Warn, char*);
336 void warn_SS(Warn, String*, String*);
337 void warn_S(Warn, String*);
338 int whichmenu(File*);
339 void writef(File*);
340 Posn writeio(File*);
341 Discdesc *Dstart(void);
343 extern Rune samname[]; /* compiler dependent */
344 extern Rune *left[];
345 extern Rune *right[];
347 extern char RSAM[]; /* system dependent */
348 extern char SAMTERM[];
349 extern char HOME[];
350 extern char TMPDIR[];
351 extern char SH[];
352 extern char SHPATH[];
353 extern char RX[];
354 extern char RXPATH[];
356 /*
357 * acme globals
358 */
359 extern long seq;
360 extern Disk *disk;
362 extern char *rsamname; /* globals */
363 extern char *samterm;
364 extern Rune genbuf[];
365 extern char *genc;
366 extern int io;
367 extern int patset;
368 extern int quitok;
369 extern Address addr;
370 extern Buffer snarfbuf;
371 extern Buffer plan9buf;
372 extern List file;
373 extern List tempfile;
374 extern File *cmd;
375 extern File *curfile;
376 extern File *lastfile;
377 extern Mod modnum;
378 extern Posn cmdpt;
379 extern Posn cmdptadv;
380 extern Rangeset sel;
381 extern String curwd;
382 extern String cmdstr;
383 extern String genstr;
384 extern String lastpat;
385 extern String lastregexp;
386 extern String plan9cmd;
387 extern int downloaded;
388 extern int eof;
389 extern int bpipeok;
390 extern int panicking;
391 extern Rune empty[];
392 extern int termlocked;
393 extern int outbuffered;
395 #include "mesg.h"
397 void outTs(Hmesg, int);
398 void outT0(Hmesg);
399 void outTl(Hmesg, long);
400 void outTslS(Hmesg, int, long, String*);
401 void outTS(Hmesg, String*);
402 void outTsS(Hmesg, int, String*);
403 void outTsllS(Hmesg, int, long, long, String*);
404 void outTsll(Hmesg, int, long, long);
405 void outTsl(Hmesg, int, long);
406 void outTsv(Hmesg, int, vlong);
407 void outflush(void);
408 int needoutflush(void);