Introduction
Introduction Statistics Contact Development Disclaimer Help
sam.h - 9base - revived minimalist port of Plan 9 userland to Unix
git clone git://git.suckless.org/9base
Log
Files
Refs
README
LICENSE
---
sam.h (9617B)
---
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 /*
13 * BLOCKSIZE is relatively small to keep memory consumption down.
14 */
15
16 #define BLOCKSIZE 2048
17 #define RUNESIZE sizeof(Rune)
18 #define NDISC 5
19 #define NBUFFILES 3+2*NDISC /* plan 9+undo+snarf+ND…
20 #define NSUBEXP 10
21
22 #define TRUE 1
23 #define FALSE 0
24
25 #undef INFINITY /* Darwin declares this as HUGE_VAL */
26 #define INFINITY 0x7FFFFFFFL
27 #define INCR 25
28 #define STRSIZE (2*BLOCKSIZE)
29
30 typedef long Posn; /* file position or add…
31 typedef ushort Mod; /* modification…
32
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;
43
44 enum State
45 {
46 Clean = ' ',
47 Dirty = '\'',
48 Unread = '-'
49 };
50
51 struct Range
52 {
53 Posn p1, p2;
54 };
55
56 struct Rangeset
57 {
58 Range p[NSUBEXP];
59 };
60
61 struct Address
62 {
63 Range r;
64 File *f;
65 };
66
67 struct String
68 {
69 short n;
70 short size;
71 Rune *s;
72 };
73
74 struct List /* code depends on a long being able to hold a pointe…
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 };
87
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
93
94 enum
95 {
96 Blockincr = 256,
97 Maxblock = 8*1024,
98
99 BUFSIZE = Maxblock, /* size from fbufalloc() */
100 RBUFSIZE = BUFSIZE/sizeof(Rune)
101 };
102
103
104 enum
105 {
106 Null = '-',
107 Delete = 'd',
108 Insert = 'i',
109 Filename = 'f',
110 Dot = 'D',
111 Mark = 'm'
112 };
113
114 struct Block
115 {
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 li…
120 } u;
121 };
122
123 struct Disk
124 {
125 int fd;
126 uint addr; /* length of temp file */
127 Block *free[Maxblock/Blockincr+1];
128 };
129
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);
135
136 struct Buffer
137 {
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*);
154
155 struct File
156 {
157 Buffer b; /* the data */
158 Buffer delta; /* transcript of cha…
159 Buffer epsilon; /* inversion of delta for …
160 String name; /* name of associated…
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 r…
165
166 long seq; /* if seq==0, File acts …
167 long cleanseq; /* f->seq at last read/writ…
168 int mod; /* file appears modified …
169 char rescuing; /* sam exiting; this file u…
170
171 #if 0
172 // Text *curtext; /* most recently used ass…
173 // Text **text; /* list of associat…
174 // int ntext;
175 // int dumpid; /* used in dumping z…
176 #endif
177
178 Posn hiposn; /* highest address to…
179 Address dot; /* current position */
180 Address ndot; /* new current posit…
181 Range tdot; /* what terminal think…
182 Range mark; /* tagged spot in text…
183 List *rasp; /* map of what termina…
184 short tag; /* for communicating wi…
185 char closeok; /* ok to close file? */
186 char deleted; /* delete at completion of c…
187 Range prevdot; /* state before start of ch…
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);
206
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*);
215
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*);
222
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*);
230
231 #define runemalloc(a) (Rune*)emalloc((a)*sizeof(Ru…
232 #define runerealloc(a, b) (Rune*)realloc((a), (b)*sizeof(R…
233 #define runemove(a, b, c) memmove((a), (b), (c)*sizeof(Run…
234
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);
342
343 extern Rune samname[]; /* compiler dependent */
344 extern Rune *left[];
345 extern Rune *right[];
346
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[];
355
356 /*
357 * acme globals
358 */
359 extern long seq;
360 extern Disk *disk;
361
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;
394
395 #include "mesg.h"
396
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);
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.