13e12c5d1SDavid du Colombier #include <u.h> 23e12c5d1SDavid du Colombier #include <libc.h> 37dd7cddfSDavid du Colombier #include <plumb.h> 43e12c5d1SDavid du Colombier #include "errors.h" 53e12c5d1SDavid du Colombier 63e12c5d1SDavid du Colombier /* 73e12c5d1SDavid du Colombier * BLOCKSIZE is relatively small to keep memory consumption down. 83e12c5d1SDavid du Colombier */ 93e12c5d1SDavid du Colombier 103e12c5d1SDavid du Colombier #define BLOCKSIZE 2048 113e12c5d1SDavid du Colombier #define RUNESIZE sizeof(Rune) 123e12c5d1SDavid du Colombier #define NDISC 5 133e12c5d1SDavid du Colombier #define NBUFFILES 3+2*NDISC /* plan 9+undo+snarf+NDISC*(transcript+buf) */ 143e12c5d1SDavid du Colombier #define NSUBEXP 10 153e12c5d1SDavid du Colombier 163e12c5d1SDavid du Colombier #define TRUE 1 173e12c5d1SDavid du Colombier #define FALSE 0 183e12c5d1SDavid du Colombier 193e12c5d1SDavid du Colombier #define INFINITY 0x7FFFFFFFL 203e12c5d1SDavid du Colombier #define INCR 25 213e12c5d1SDavid du Colombier #define STRSIZE (2*BLOCKSIZE) 223e12c5d1SDavid du Colombier 233e12c5d1SDavid du Colombier typedef long Posn; /* file position or address */ 243e12c5d1SDavid du Colombier typedef ushort Mod; /* modification number */ 253e12c5d1SDavid du Colombier 263e12c5d1SDavid du Colombier typedef struct Address Address; 273e12c5d1SDavid du Colombier typedef struct Block Block; 283e12c5d1SDavid du Colombier typedef struct Buffer Buffer; 297dd7cddfSDavid du Colombier typedef struct Disk Disk; 303e12c5d1SDavid du Colombier typedef struct Discdesc Discdesc; 313e12c5d1SDavid du Colombier typedef struct File File; 323e12c5d1SDavid du Colombier typedef struct List List; 333e12c5d1SDavid du Colombier typedef struct Range Range; 343e12c5d1SDavid du Colombier typedef struct Rangeset Rangeset; 353e12c5d1SDavid du Colombier typedef struct String String; 363e12c5d1SDavid du Colombier 373e12c5d1SDavid du Colombier enum State 383e12c5d1SDavid du Colombier { 393e12c5d1SDavid du Colombier Clean = ' ', 403e12c5d1SDavid du Colombier Dirty = '\'', 413e12c5d1SDavid du Colombier Unread = '-', 423e12c5d1SDavid du Colombier }; 433e12c5d1SDavid du Colombier 443e12c5d1SDavid du Colombier struct Range 453e12c5d1SDavid du Colombier { 463e12c5d1SDavid du Colombier Posn p1, p2; 473e12c5d1SDavid du Colombier }; 483e12c5d1SDavid du Colombier 493e12c5d1SDavid du Colombier struct Rangeset 503e12c5d1SDavid du Colombier { 513e12c5d1SDavid du Colombier Range p[NSUBEXP]; 523e12c5d1SDavid du Colombier }; 533e12c5d1SDavid du Colombier 543e12c5d1SDavid du Colombier struct Address 553e12c5d1SDavid du Colombier { 563e12c5d1SDavid du Colombier Range r; 573e12c5d1SDavid du Colombier File *f; 583e12c5d1SDavid du Colombier }; 593e12c5d1SDavid du Colombier 607dd7cddfSDavid du Colombier struct String 617dd7cddfSDavid du Colombier { 627dd7cddfSDavid du Colombier short n; 637dd7cddfSDavid du Colombier short size; 647dd7cddfSDavid du Colombier Rune *s; 657dd7cddfSDavid du Colombier }; 667dd7cddfSDavid du Colombier 6773e742d7SDavid du Colombier struct List 683e12c5d1SDavid du Colombier { 69fe778198SDavid du Colombier int type; /* 'p' for pointer, 'P' for Posn */ 703e12c5d1SDavid du Colombier int nalloc; 713e12c5d1SDavid du Colombier int nused; 723e12c5d1SDavid du Colombier union{ 733e12c5d1SDavid du Colombier void* listp; 7473e742d7SDavid du Colombier void** voidp; 7573e742d7SDavid du Colombier Posn* posnp; 763e12c5d1SDavid du Colombier String**stringp; 773e12c5d1SDavid du Colombier File** filep; 783e12c5d1SDavid du Colombier }g; 793e12c5d1SDavid du Colombier }; 803e12c5d1SDavid du Colombier 813e12c5d1SDavid du Colombier #define listptr g.listp 8273e742d7SDavid du Colombier #define voidpptr g.voidp 8373e742d7SDavid du Colombier #define posnptr g.posnp 843e12c5d1SDavid du Colombier #define stringpptr g.stringp 853e12c5d1SDavid du Colombier #define filepptr g.filep 863e12c5d1SDavid du Colombier 877dd7cddfSDavid du Colombier enum 887dd7cddfSDavid du Colombier { 897dd7cddfSDavid du Colombier Blockincr = 256, 907dd7cddfSDavid du Colombier Maxblock = 8*1024, 917dd7cddfSDavid du Colombier 927dd7cddfSDavid du Colombier BUFSIZE = Maxblock, /* size from fbufalloc() */ 937dd7cddfSDavid du Colombier RBUFSIZE = BUFSIZE/sizeof(Rune), 947dd7cddfSDavid du Colombier }; 957dd7cddfSDavid du Colombier 967dd7cddfSDavid du Colombier 977dd7cddfSDavid du Colombier enum 987dd7cddfSDavid du Colombier { 997dd7cddfSDavid du Colombier Null = '-', 1007dd7cddfSDavid du Colombier Delete = 'd', 1017dd7cddfSDavid du Colombier Insert = 'i', 1027dd7cddfSDavid du Colombier Filename = 'f', 1037dd7cddfSDavid du Colombier Dot = 'D', 1047dd7cddfSDavid du Colombier Mark = 'm', 1057dd7cddfSDavid du Colombier }; 1067dd7cddfSDavid du Colombier 1073e12c5d1SDavid du Colombier struct Block 1083e12c5d1SDavid du Colombier { 1097dd7cddfSDavid du Colombier uint addr; /* disk address in bytes */ 1107dd7cddfSDavid du Colombier union 1117dd7cddfSDavid du Colombier { 1127dd7cddfSDavid du Colombier uint n; /* number of used runes in block */ 1137dd7cddfSDavid du Colombier Block *next; /* pointer to next in free list */ 1147dd7cddfSDavid du Colombier }; 1153e12c5d1SDavid du Colombier }; 1163e12c5d1SDavid du Colombier 1177dd7cddfSDavid du Colombier struct Disk 1183e12c5d1SDavid du Colombier { 1197dd7cddfSDavid du Colombier int fd; 1207dd7cddfSDavid du Colombier uint addr; /* length of temp file */ 1217dd7cddfSDavid du Colombier Block *free[Maxblock/Blockincr+1]; 1223e12c5d1SDavid du Colombier }; 1233e12c5d1SDavid du Colombier 1247dd7cddfSDavid du Colombier Disk* diskinit(void); 1257dd7cddfSDavid du Colombier Block* disknewblock(Disk*, uint); 1267dd7cddfSDavid du Colombier void diskrelease(Disk*, Block*); 1277dd7cddfSDavid du Colombier void diskread(Disk*, Block*, Rune*, uint); 1287dd7cddfSDavid du Colombier void diskwrite(Disk*, Block**, Rune*, uint); 1293e12c5d1SDavid du Colombier 1303e12c5d1SDavid du Colombier struct Buffer 1313e12c5d1SDavid du Colombier { 1327dd7cddfSDavid du Colombier uint nc; 1337dd7cddfSDavid du Colombier Rune *c; /* cache */ 1347dd7cddfSDavid du Colombier uint cnc; /* bytes in cache */ 1357dd7cddfSDavid du Colombier uint cmax; /* size of allocated cache */ 1367dd7cddfSDavid du Colombier uint cq; /* position of cache */ 1377dd7cddfSDavid du Colombier int cdirty; /* cache needs to be written */ 1387dd7cddfSDavid du Colombier uint cbi; /* index of cache Block */ 1397dd7cddfSDavid du Colombier Block **bl; /* array of blocks */ 1407dd7cddfSDavid du Colombier uint nbl; /* number of blocks */ 1413e12c5d1SDavid du Colombier }; 1427dd7cddfSDavid du Colombier void bufinsert(Buffer*, uint, Rune*, uint); 1437dd7cddfSDavid du Colombier void bufdelete(Buffer*, uint, uint); 1447dd7cddfSDavid du Colombier uint bufload(Buffer*, uint, int, int*); 1457dd7cddfSDavid du Colombier void bufread(Buffer*, uint, Rune*, uint); 1467dd7cddfSDavid du Colombier void bufclose(Buffer*); 1477dd7cddfSDavid du Colombier void bufreset(Buffer*); 1483e12c5d1SDavid du Colombier 1493e12c5d1SDavid du Colombier struct File 1503e12c5d1SDavid du Colombier { 1517dd7cddfSDavid du Colombier Buffer; /* the data */ 1527dd7cddfSDavid du Colombier Buffer delta; /* transcript of changes */ 1537dd7cddfSDavid du Colombier Buffer epsilon; /* inversion of delta for redo */ 1547dd7cddfSDavid du Colombier String name; /* name of associated file */ 1559a747e4fSDavid du Colombier uvlong qidpath; /* of file when read */ 1567dd7cddfSDavid du Colombier uint mtime; /* of file when read */ 1577dd7cddfSDavid du Colombier int dev; /* of file when read */ 1587dd7cddfSDavid du Colombier int unread; /* file has not been read from disk */ 1597dd7cddfSDavid du Colombier 1607dd7cddfSDavid du Colombier long seq; /* if seq==0, File acts like Buffer */ 1617dd7cddfSDavid du Colombier long cleanseq; /* f->seq at last read/write of file */ 1627dd7cddfSDavid du Colombier int mod; /* file appears modified in menu */ 1637dd7cddfSDavid du Colombier char rescuing; /* sam exiting; this file unusable */ 1647dd7cddfSDavid du Colombier 1657dd7cddfSDavid du Colombier // Text *curtext; /* most recently used associated text */ 1667dd7cddfSDavid du Colombier // Text **text; /* list of associated texts */ 1677dd7cddfSDavid du Colombier // int ntext; 1687dd7cddfSDavid du Colombier // int dumpid; /* used in dumping zeroxed windows */ 1697dd7cddfSDavid du Colombier 1703e12c5d1SDavid du Colombier Posn hiposn; /* highest address touched this Mod */ 1713e12c5d1SDavid du Colombier Address dot; /* current position */ 1723e12c5d1SDavid du Colombier Address ndot; /* new current position after update */ 1733e12c5d1SDavid du Colombier Range tdot; /* what terminal thinks is current range */ 1743e12c5d1SDavid du Colombier Range mark; /* tagged spot in text (don't confuse with Mark) */ 1753e12c5d1SDavid du Colombier List *rasp; /* map of what terminal's got */ 1763e12c5d1SDavid du Colombier short tag; /* for communicating with terminal */ 1773e12c5d1SDavid du Colombier char closeok; /* ok to close file? */ 178219b2ee8SDavid du Colombier char deleted; /* delete at completion of command */ 1797dd7cddfSDavid du Colombier Range prevdot; /* state before start of change */ 1807dd7cddfSDavid du Colombier Range prevmark; 1817dd7cddfSDavid du Colombier long prevseq; 1827dd7cddfSDavid du Colombier int prevmod; 1833e12c5d1SDavid du Colombier }; 1847dd7cddfSDavid du Colombier //File* fileaddtext(File*, Text*); 1857dd7cddfSDavid du Colombier void fileclose(File*); 1867dd7cddfSDavid du Colombier void filedelete(File*, uint, uint); 1877dd7cddfSDavid du Colombier //void filedeltext(File*, Text*); 1887dd7cddfSDavid du Colombier void fileinsert(File*, uint, Rune*, uint); 1897dd7cddfSDavid du Colombier uint fileload(File*, uint, int, int*); 1907dd7cddfSDavid du Colombier void filemark(File*); 1917dd7cddfSDavid du Colombier void filereset(File*); 1927dd7cddfSDavid du Colombier void filesetname(File*, String*); 1937dd7cddfSDavid du Colombier void fileundelete(File*, Buffer*, uint, uint); 1947dd7cddfSDavid du Colombier void fileuninsert(File*, Buffer*, uint, uint); 1957dd7cddfSDavid du Colombier void fileunsetname(File*, Buffer*); 1967dd7cddfSDavid du Colombier void fileundo(File*, int, int, uint*, uint*, int); 1977dd7cddfSDavid du Colombier int fileupdate(File*, int, int); 1983e12c5d1SDavid du Colombier 1997dd7cddfSDavid du Colombier int filereadc(File*, uint); 2007dd7cddfSDavid du Colombier File *fileopen(void); 2017dd7cddfSDavid du Colombier void loginsert(File*, uint, Rune*, uint); 2027dd7cddfSDavid du Colombier void logdelete(File*, uint, uint); 2037dd7cddfSDavid du Colombier void logsetname(File*, String*); 2047dd7cddfSDavid du Colombier int fileisdirty(File*); 2057dd7cddfSDavid du Colombier long undoseq(File*, int); 2067dd7cddfSDavid du Colombier long prevseq(Buffer*); 2077dd7cddfSDavid du Colombier 2087dd7cddfSDavid du Colombier void raspload(File*); 2097dd7cddfSDavid du Colombier void raspstart(File*); 2107dd7cddfSDavid du Colombier void raspdelete(File*, uint, uint, int); 2117dd7cddfSDavid du Colombier void raspinsert(File*, uint, Rune*, uint, int); 2127dd7cddfSDavid du Colombier void raspdone(File*, int); 213*54d47c71SDavid du Colombier void raspflush(File*); 2143e12c5d1SDavid du Colombier 2153e12c5d1SDavid du Colombier /* 2167dd7cddfSDavid du Colombier * acme fns 2173e12c5d1SDavid du Colombier */ 2187dd7cddfSDavid du Colombier void* fbufalloc(void); 2197dd7cddfSDavid du Colombier void fbuffree(void*); 2207dd7cddfSDavid du Colombier uint min(uint, uint); 2217dd7cddfSDavid du Colombier void cvttorunes(char*, int, Rune*, int*, int*, int*); 2223e12c5d1SDavid du Colombier 2237dd7cddfSDavid du Colombier #define runemalloc(a) (Rune*)emalloc((a)*sizeof(Rune)) 2247dd7cddfSDavid du Colombier #define runerealloc(a, b) (Rune*)realloc((a), (b)*sizeof(Rune)) 2257dd7cddfSDavid du Colombier #define runemove(a, b, c) memmove((a), (b), (c)*sizeof(Rune)) 2263e12c5d1SDavid du Colombier 2273e12c5d1SDavid du Colombier int alnum(int); 2283e12c5d1SDavid du Colombier int Read(int, void*, int); 2293e12c5d1SDavid du Colombier void Seek(int, long, int); 230219b2ee8SDavid du Colombier int plan9(File*, int, String*, int); 2313e12c5d1SDavid du Colombier int Write(int, void*, int); 2323e12c5d1SDavid du Colombier int bexecute(File*, Posn); 2333e12c5d1SDavid du Colombier void cd(String*); 2343e12c5d1SDavid du Colombier void closefiles(File*, String*); 2353e12c5d1SDavid du Colombier void closeio(Posn); 2363e12c5d1SDavid du Colombier void cmdloop(void); 2373e12c5d1SDavid du Colombier void cmdupdate(void); 2383e12c5d1SDavid du Colombier void compile(String*); 2393e12c5d1SDavid du Colombier void copy(File*, Address); 2403e12c5d1SDavid du Colombier File *current(File*); 241219b2ee8SDavid du Colombier void delete(File*); 2423e12c5d1SDavid du Colombier void delfile(File*); 2433e12c5d1SDavid du Colombier void dellist(List*, int); 2443e12c5d1SDavid du Colombier void doubleclick(File*, Posn); 2453e12c5d1SDavid du Colombier void dprint(char*, ...); 2463e12c5d1SDavid du Colombier void edit(File*, int); 2473e12c5d1SDavid du Colombier void *emalloc(ulong); 2483e12c5d1SDavid du Colombier void *erealloc(void*, ulong); 2493e12c5d1SDavid du Colombier void error(Err); 2503e12c5d1SDavid du Colombier void error_c(Err, int); 2519a747e4fSDavid du Colombier void error_r(Err, char*); 2523e12c5d1SDavid du Colombier void error_s(Err, char*); 2533e12c5d1SDavid du Colombier int execute(File*, Posn, Posn); 2543e12c5d1SDavid du Colombier int filematch(File*, String*); 2553e12c5d1SDavid du Colombier void filename(File*); 2567dd7cddfSDavid du Colombier void fixname(String*); 2577dd7cddfSDavid du Colombier void fullname(String*); 2587dd7cddfSDavid du Colombier void getcurwd(void); 2593e12c5d1SDavid du Colombier File *getfile(String*); 2603e12c5d1SDavid du Colombier int getname(File*, String*, int); 2617dd7cddfSDavid du Colombier long getnum(int); 2623e12c5d1SDavid du Colombier void hiccough(char*); 26373e742d7SDavid du Colombier void inslist(List*, int, ...); 2643e12c5d1SDavid du Colombier Address lineaddr(Posn, Address, int); 26573e742d7SDavid du Colombier List *listalloc(int); 2663e12c5d1SDavid du Colombier void listfree(List*); 2673e12c5d1SDavid du Colombier void load(File*); 2683e12c5d1SDavid du Colombier File *lookfile(String*); 2693e12c5d1SDavid du Colombier void lookorigin(File*, Posn, Posn); 2703e12c5d1SDavid du Colombier int lookup(int); 2713e12c5d1SDavid du Colombier void move(File*, Address); 2723e12c5d1SDavid du Colombier void moveto(File*, Range); 2733e12c5d1SDavid du Colombier File *newfile(void); 2743e12c5d1SDavid du Colombier void nextmatch(File*, String*, Posn, int); 2753e12c5d1SDavid du Colombier void notifyf(void*, char*); 2763e12c5d1SDavid du Colombier void panic(char*); 2773e12c5d1SDavid du Colombier void printposn(File*, int); 278bd389b36SDavid du Colombier void print_ss(char*, String*, String*); 279bd389b36SDavid du Colombier void print_s(char*, String*); 2803e12c5d1SDavid du Colombier int rcv(void); 2813e12c5d1SDavid du Colombier Range rdata(List*, Posn, Posn); 2827dd7cddfSDavid du Colombier Posn readio(File*, int*, int, int); 2833e12c5d1SDavid du Colombier void rescue(void); 2843e12c5d1SDavid du Colombier void resetcmd(void); 2853e12c5d1SDavid du Colombier void resetsys(void); 2863e12c5d1SDavid du Colombier void resetxec(void); 2873e12c5d1SDavid du Colombier void rgrow(List*, Posn, Posn); 2883e12c5d1SDavid du Colombier void samerr(char*); 2893e12c5d1SDavid du Colombier void settempfile(void); 2903e12c5d1SDavid du Colombier int skipbl(void); 2913e12c5d1SDavid du Colombier void snarf(File*, Posn, Posn, Buffer*, int); 2923e12c5d1SDavid du Colombier void sortname(File*); 2933e12c5d1SDavid du Colombier void startup(char*, int, char**, char**); 2943e12c5d1SDavid du Colombier void state(File*, int); 2959a747e4fSDavid du Colombier int statfd(int, ulong*, uvlong*, long*, long*, long*); 2969a747e4fSDavid du Colombier int statfile(char*, ulong*, uvlong*, long*, long*, long*); 2973e12c5d1SDavid du Colombier void Straddc(String*, int); 2983e12c5d1SDavid du Colombier void Strclose(String*); 2993e12c5d1SDavid du Colombier int Strcmp(String*, String*); 3003e12c5d1SDavid du Colombier void Strdelete(String*, Posn, Posn); 3013e12c5d1SDavid du Colombier void Strdupl(String*, Rune*); 3023e12c5d1SDavid du Colombier void Strduplstr(String*, String*); 3033e12c5d1SDavid du Colombier void Strinit(String*); 3043e12c5d1SDavid du Colombier void Strinit0(String*); 3053e12c5d1SDavid du Colombier void Strinsert(String*, String*, Posn); 3063e12c5d1SDavid du Colombier void Strinsure(String*, ulong); 3077dd7cddfSDavid du Colombier int Strispre(String*, String*); 3083e12c5d1SDavid du Colombier void Strzero(String*); 3093e12c5d1SDavid du Colombier int Strlen(Rune*); 3103e12c5d1SDavid du Colombier char *Strtoc(String*); 3113e12c5d1SDavid du Colombier void syserror(char*); 3123e12c5d1SDavid du Colombier void telldot(File*); 3133e12c5d1SDavid du Colombier void tellpat(void); 3143e12c5d1SDavid du Colombier String *tmpcstr(char*); 3153e12c5d1SDavid du Colombier String *tmprstr(Rune*, int); 3163e12c5d1SDavid du Colombier void freetmpstr(String*); 3173e12c5d1SDavid du Colombier void termcommand(void); 3183e12c5d1SDavid du Colombier void termwrite(char*); 3193e12c5d1SDavid du Colombier File *tofile(String*); 3203e12c5d1SDavid du Colombier void trytoclose(File*); 3213e12c5d1SDavid du Colombier void trytoquit(void); 3227dd7cddfSDavid du Colombier int undo(int); 3233e12c5d1SDavid du Colombier void update(void); 324c35931e2SDavid du Colombier char *waitfor(int); 3253e12c5d1SDavid du Colombier void warn(Warn); 3263e12c5d1SDavid du Colombier void warn_s(Warn, char*); 327bd389b36SDavid du Colombier void warn_SS(Warn, String*, String*); 3283e12c5d1SDavid du Colombier void warn_S(Warn, String*); 3293e12c5d1SDavid du Colombier int whichmenu(File*); 3303e12c5d1SDavid du Colombier void writef(File*); 3313e12c5d1SDavid du Colombier Posn writeio(File*); 3323e12c5d1SDavid du Colombier Discdesc *Dstart(void); 3333e12c5d1SDavid du Colombier 3343e12c5d1SDavid du Colombier extern Rune samname[]; /* compiler dependent */ 3353e12c5d1SDavid du Colombier extern Rune *left[]; 3363e12c5d1SDavid du Colombier extern Rune *right[]; 3373e12c5d1SDavid du Colombier 3383e12c5d1SDavid du Colombier extern char RSAM[]; /* system dependent */ 3393e12c5d1SDavid du Colombier extern char SAMTERM[]; 3403e12c5d1SDavid du Colombier extern char HOME[]; 3413e12c5d1SDavid du Colombier extern char TMPDIR[]; 3423e12c5d1SDavid du Colombier extern char SH[]; 3433e12c5d1SDavid du Colombier extern char SHPATH[]; 3443e12c5d1SDavid du Colombier extern char RX[]; 3453e12c5d1SDavid du Colombier extern char RXPATH[]; 346bd389b36SDavid du Colombier extern char SAMSAVECMD[]; 3473e12c5d1SDavid du Colombier 3487dd7cddfSDavid du Colombier /* 3497dd7cddfSDavid du Colombier * acme globals 3507dd7cddfSDavid du Colombier */ 3517dd7cddfSDavid du Colombier extern long seq; 3527dd7cddfSDavid du Colombier extern Disk *disk; 3537dd7cddfSDavid du Colombier 3543e12c5d1SDavid du Colombier extern char *rsamname; /* globals */ 3553e12c5d1SDavid du Colombier extern char *samterm; 3563e12c5d1SDavid du Colombier extern Rune genbuf[]; 3573e12c5d1SDavid du Colombier extern char *genc; 3583e12c5d1SDavid du Colombier extern int io; 3593e12c5d1SDavid du Colombier extern int patset; 3603e12c5d1SDavid du Colombier extern int quitok; 3613e12c5d1SDavid du Colombier extern Address addr; 3627dd7cddfSDavid du Colombier extern Buffer snarfbuf; 3637dd7cddfSDavid du Colombier extern Buffer plan9buf; 3643e12c5d1SDavid du Colombier extern List file; 3653e12c5d1SDavid du Colombier extern List tempfile; 3663e12c5d1SDavid du Colombier extern File *cmd; 3673e12c5d1SDavid du Colombier extern File *curfile; 368bd389b36SDavid du Colombier extern File *lastfile; 3693e12c5d1SDavid du Colombier extern Mod modnum; 3703e12c5d1SDavid du Colombier extern Posn cmdpt; 3713e12c5d1SDavid du Colombier extern Posn cmdptadv; 3723e12c5d1SDavid du Colombier extern Rangeset sel; 3737dd7cddfSDavid du Colombier extern String curwd; 3743e12c5d1SDavid du Colombier extern String cmdstr; 3753e12c5d1SDavid du Colombier extern String genstr; 3763e12c5d1SDavid du Colombier extern String lastpat; 3773e12c5d1SDavid du Colombier extern String lastregexp; 3783e12c5d1SDavid du Colombier extern String plan9cmd; 3793e12c5d1SDavid du Colombier extern int downloaded; 3803e12c5d1SDavid du Colombier extern int eof; 3813e12c5d1SDavid du Colombier extern int bpipeok; 3823e12c5d1SDavid du Colombier extern int panicking; 3833e12c5d1SDavid du Colombier extern Rune empty[]; 3843e12c5d1SDavid du Colombier extern int termlocked; 385*54d47c71SDavid du Colombier extern int outbuffered; 3863e12c5d1SDavid du Colombier 3873e12c5d1SDavid du Colombier #include "mesg.h" 3883e12c5d1SDavid du Colombier 3893e12c5d1SDavid du Colombier void outTs(Hmesg, int); 3903e12c5d1SDavid du Colombier void outT0(Hmesg); 3913e12c5d1SDavid du Colombier void outTl(Hmesg, long); 3923e12c5d1SDavid du Colombier void outTslS(Hmesg, int, long, String*); 3933e12c5d1SDavid du Colombier void outTS(Hmesg, String*); 3943e12c5d1SDavid du Colombier void outTsS(Hmesg, int, String*); 3953e12c5d1SDavid du Colombier void outTsllS(Hmesg, int, long, long, String*); 3963e12c5d1SDavid du Colombier void outTsll(Hmesg, int, long, long); 3973e12c5d1SDavid du Colombier void outTsl(Hmesg, int, long); 39873e742d7SDavid du Colombier void outTsv(Hmesg, int, vlong); 3993e12c5d1SDavid du Colombier void outflush(void); 400*54d47c71SDavid du Colombier int needoutflush(void); 401