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