| 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); |