sam.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+NDISC*(transcript+buf) */ 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 address */ 34 typedef ushort Mod; /* modification number */ 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 pointer */ 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 list */ 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 changes */ 161 Buffer epsilon; /* inversion of delta for redo */ 162 String name; /* name of associated file */ 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 read from disk */ 167 168 long seq; /* if seq==0, File acts like Buffer */ 169 long cleanseq; /* f->seq at last read/write of file */ 170 int mod; /* file appears modified in menu */ 171 char rescuing; /* sam exiting; this file unusable */ 172 173 #if 0 174 // Text *curtext; /* most recently used associated text */ 175 // Text **text; /* list of associated texts */ 176 // int ntext; 177 // int dumpid; /* used in dumping zeroxed windows */ 178 #endif 179 180 Posn hiposn; /* highest address touched this Mod */ 181 Address dot; /* current position */ 182 Address ndot; /* new current position after update */ 183 Range tdot; /* what terminal thinks is current range */ 184 Range mark; /* tagged spot in text (don't confuse with Mark) */ 185 List *rasp; /* map of what terminal's got */ 186 short tag; /* for communicating with terminal */ 187 char closeok; /* ok to close file? */ 188 char deleted; /* delete at completion of command */ 189 Range prevdot; /* state before start of change */ 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(Rune)) 234 #define runerealloc(a, b) (Rune*)realloc((a), (b)*sizeof(Rune)) 235 #define runemove(a, b, c) memmove((a), (b), (c)*sizeof(Rune)) 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);