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 673e12c5d1SDavid du Colombier struct List /* code depends on a long being able to hold a pointer */ 683e12c5d1SDavid du Colombier { 693e12c5d1SDavid du Colombier int nalloc; 703e12c5d1SDavid du Colombier int nused; 713e12c5d1SDavid du Colombier union{ 723e12c5d1SDavid du Colombier void *listp; 733e12c5d1SDavid du Colombier Block *blkp; 743e12c5d1SDavid du Colombier long *longp; 753e12c5d1SDavid du Colombier uchar* *ucharp; 763e12c5d1SDavid du Colombier String* *stringp; 773e12c5d1SDavid du Colombier File* *filep; 783e12c5d1SDavid du Colombier long listv; 793e12c5d1SDavid du Colombier }g; 803e12c5d1SDavid du Colombier }; 813e12c5d1SDavid du Colombier 823e12c5d1SDavid du Colombier #define listptr g.listp 833e12c5d1SDavid du Colombier #define blkptr g.blkp 843e12c5d1SDavid du Colombier #define longptr g.longp 853e12c5d1SDavid du Colombier #define ucharpptr g.ucharp 863e12c5d1SDavid du Colombier #define stringpptr g.stringp 873e12c5d1SDavid du Colombier #define filepptr g.filep 883e12c5d1SDavid du Colombier #define listval g.listv 893e12c5d1SDavid du Colombier 907dd7cddfSDavid du Colombier enum 917dd7cddfSDavid du Colombier { 927dd7cddfSDavid du Colombier Blockincr = 256, 937dd7cddfSDavid du Colombier Maxblock = 8*1024, 947dd7cddfSDavid du Colombier 957dd7cddfSDavid du Colombier BUFSIZE = Maxblock, /* size from fbufalloc() */ 967dd7cddfSDavid du Colombier RBUFSIZE = BUFSIZE/sizeof(Rune), 977dd7cddfSDavid du Colombier }; 987dd7cddfSDavid du Colombier 997dd7cddfSDavid du Colombier 1007dd7cddfSDavid du Colombier enum 1017dd7cddfSDavid du Colombier { 1027dd7cddfSDavid du Colombier Null = '-', 1037dd7cddfSDavid du Colombier Delete = 'd', 1047dd7cddfSDavid du Colombier Insert = 'i', 1057dd7cddfSDavid du Colombier Filename = 'f', 1067dd7cddfSDavid du Colombier Dot = 'D', 1077dd7cddfSDavid du Colombier Mark = 'm', 1087dd7cddfSDavid du Colombier }; 1097dd7cddfSDavid du Colombier 1103e12c5d1SDavid du Colombier struct Block 1113e12c5d1SDavid du Colombier { 1127dd7cddfSDavid du Colombier uint addr; /* disk address in bytes */ 1137dd7cddfSDavid du Colombier union 1147dd7cddfSDavid du Colombier { 1157dd7cddfSDavid du Colombier uint n; /* number of used runes in block */ 1167dd7cddfSDavid du Colombier Block *next; /* pointer to next in free list */ 1177dd7cddfSDavid du Colombier }; 1183e12c5d1SDavid du Colombier }; 1193e12c5d1SDavid du Colombier 1207dd7cddfSDavid du Colombier struct Disk 1213e12c5d1SDavid du Colombier { 1227dd7cddfSDavid du Colombier int fd; 1237dd7cddfSDavid du Colombier uint addr; /* length of temp file */ 1247dd7cddfSDavid du Colombier Block *free[Maxblock/Blockincr+1]; 1253e12c5d1SDavid du Colombier }; 1263e12c5d1SDavid du Colombier 1277dd7cddfSDavid du Colombier Disk* diskinit(void); 1287dd7cddfSDavid du Colombier Block* disknewblock(Disk*, uint); 1297dd7cddfSDavid du Colombier void diskrelease(Disk*, Block*); 1307dd7cddfSDavid du Colombier void diskread(Disk*, Block*, Rune*, uint); 1317dd7cddfSDavid du Colombier void diskwrite(Disk*, Block**, Rune*, uint); 1323e12c5d1SDavid du Colombier 1333e12c5d1SDavid du Colombier struct Buffer 1343e12c5d1SDavid du Colombier { 1357dd7cddfSDavid du Colombier uint nc; 1367dd7cddfSDavid du Colombier Rune *c; /* cache */ 1377dd7cddfSDavid du Colombier uint cnc; /* bytes in cache */ 1387dd7cddfSDavid du Colombier uint cmax; /* size of allocated cache */ 1397dd7cddfSDavid du Colombier uint cq; /* position of cache */ 1407dd7cddfSDavid du Colombier int cdirty; /* cache needs to be written */ 1417dd7cddfSDavid du Colombier uint cbi; /* index of cache Block */ 1427dd7cddfSDavid du Colombier Block **bl; /* array of blocks */ 1437dd7cddfSDavid du Colombier uint nbl; /* number of blocks */ 1443e12c5d1SDavid du Colombier }; 1457dd7cddfSDavid du Colombier void bufinsert(Buffer*, uint, Rune*, uint); 1467dd7cddfSDavid du Colombier void bufdelete(Buffer*, uint, uint); 1477dd7cddfSDavid du Colombier uint bufload(Buffer*, uint, int, int*); 1487dd7cddfSDavid du Colombier void bufread(Buffer*, uint, Rune*, uint); 1497dd7cddfSDavid du Colombier void bufclose(Buffer*); 1507dd7cddfSDavid du Colombier void bufreset(Buffer*); 1513e12c5d1SDavid du Colombier 1523e12c5d1SDavid du Colombier struct File 1533e12c5d1SDavid du Colombier { 1547dd7cddfSDavid du Colombier Buffer; /* the data */ 1557dd7cddfSDavid du Colombier Buffer delta; /* transcript of changes */ 1567dd7cddfSDavid du Colombier Buffer epsilon; /* inversion of delta for redo */ 1577dd7cddfSDavid du Colombier String name; /* name of associated file */ 158*9a747e4fSDavid du Colombier uvlong qidpath; /* of file when read */ 1597dd7cddfSDavid du Colombier uint mtime; /* of file when read */ 1607dd7cddfSDavid du Colombier int dev; /* of file when read */ 1617dd7cddfSDavid du Colombier int unread; /* file has not been read from disk */ 1627dd7cddfSDavid du Colombier 1637dd7cddfSDavid du Colombier long seq; /* if seq==0, File acts like Buffer */ 1647dd7cddfSDavid du Colombier long cleanseq; /* f->seq at last read/write of file */ 1657dd7cddfSDavid du Colombier int mod; /* file appears modified in menu */ 1667dd7cddfSDavid du Colombier char rescuing; /* sam exiting; this file unusable */ 1677dd7cddfSDavid du Colombier 1687dd7cddfSDavid du Colombier // Text *curtext; /* most recently used associated text */ 1697dd7cddfSDavid du Colombier // Text **text; /* list of associated texts */ 1707dd7cddfSDavid du Colombier // int ntext; 1717dd7cddfSDavid du Colombier // int dumpid; /* used in dumping zeroxed windows */ 1727dd7cddfSDavid du Colombier 1733e12c5d1SDavid du Colombier Posn hiposn; /* highest address touched this Mod */ 1743e12c5d1SDavid du Colombier Address dot; /* current position */ 1753e12c5d1SDavid du Colombier Address ndot; /* new current position after update */ 1763e12c5d1SDavid du Colombier Range tdot; /* what terminal thinks is current range */ 1773e12c5d1SDavid du Colombier Range mark; /* tagged spot in text (don't confuse with Mark) */ 1783e12c5d1SDavid du Colombier List *rasp; /* map of what terminal's got */ 1793e12c5d1SDavid du Colombier short tag; /* for communicating with terminal */ 1803e12c5d1SDavid du Colombier char closeok; /* ok to close file? */ 181219b2ee8SDavid du Colombier char deleted; /* delete at completion of command */ 1827dd7cddfSDavid du Colombier Range prevdot; /* state before start of change */ 1837dd7cddfSDavid du Colombier Range prevmark; 1847dd7cddfSDavid du Colombier long prevseq; 1857dd7cddfSDavid du Colombier int prevmod; 1863e12c5d1SDavid du Colombier }; 1877dd7cddfSDavid du Colombier //File* fileaddtext(File*, Text*); 1887dd7cddfSDavid du Colombier void fileclose(File*); 1897dd7cddfSDavid du Colombier void filedelete(File*, uint, uint); 1907dd7cddfSDavid du Colombier //void filedeltext(File*, Text*); 1917dd7cddfSDavid du Colombier void fileinsert(File*, uint, Rune*, uint); 1927dd7cddfSDavid du Colombier uint fileload(File*, uint, int, int*); 1937dd7cddfSDavid du Colombier void filemark(File*); 1947dd7cddfSDavid du Colombier void filereset(File*); 1957dd7cddfSDavid du Colombier void filesetname(File*, String*); 1967dd7cddfSDavid du Colombier void fileundelete(File*, Buffer*, uint, uint); 1977dd7cddfSDavid du Colombier void fileuninsert(File*, Buffer*, uint, uint); 1987dd7cddfSDavid du Colombier void fileunsetname(File*, Buffer*); 1997dd7cddfSDavid du Colombier void fileundo(File*, int, int, uint*, uint*, int); 2007dd7cddfSDavid du Colombier int fileupdate(File*, int, int); 2013e12c5d1SDavid du Colombier 2027dd7cddfSDavid du Colombier int filereadc(File*, uint); 2037dd7cddfSDavid du Colombier File *fileopen(void); 2047dd7cddfSDavid du Colombier void loginsert(File*, uint, Rune*, uint); 2057dd7cddfSDavid du Colombier void logdelete(File*, uint, uint); 2067dd7cddfSDavid du Colombier void logsetname(File*, String*); 2077dd7cddfSDavid du Colombier int fileisdirty(File*); 2087dd7cddfSDavid du Colombier long undoseq(File*, int); 2097dd7cddfSDavid du Colombier long prevseq(Buffer*); 2107dd7cddfSDavid du Colombier 2117dd7cddfSDavid du Colombier void raspload(File*); 2127dd7cddfSDavid du Colombier void raspstart(File*); 2137dd7cddfSDavid du Colombier void raspdelete(File*, uint, uint, int); 2147dd7cddfSDavid du Colombier void raspinsert(File*, uint, Rune*, uint, int); 2157dd7cddfSDavid du Colombier void raspdone(File*, int); 2163e12c5d1SDavid du Colombier 2173e12c5d1SDavid du Colombier /* 2187dd7cddfSDavid du Colombier * acme fns 2193e12c5d1SDavid du Colombier */ 2207dd7cddfSDavid du Colombier void* fbufalloc(void); 2217dd7cddfSDavid du Colombier void fbuffree(void*); 2227dd7cddfSDavid du Colombier uint min(uint, uint); 2237dd7cddfSDavid du Colombier void cvttorunes(char*, int, Rune*, int*, int*, int*); 2243e12c5d1SDavid du Colombier 2257dd7cddfSDavid du Colombier #define runemalloc(a) (Rune*)emalloc((a)*sizeof(Rune)) 2267dd7cddfSDavid du Colombier #define runerealloc(a, b) (Rune*)realloc((a), (b)*sizeof(Rune)) 2277dd7cddfSDavid du Colombier #define runemove(a, b, c) memmove((a), (b), (c)*sizeof(Rune)) 2283e12c5d1SDavid du Colombier 2293e12c5d1SDavid du Colombier int alnum(int); 2303e12c5d1SDavid du Colombier int Read(int, void*, int); 2313e12c5d1SDavid du Colombier void Seek(int, long, int); 232219b2ee8SDavid du Colombier int plan9(File*, int, String*, int); 2333e12c5d1SDavid du Colombier int Write(int, void*, int); 2343e12c5d1SDavid du Colombier int bexecute(File*, Posn); 2353e12c5d1SDavid du Colombier void cd(String*); 2363e12c5d1SDavid du Colombier void closefiles(File*, String*); 2373e12c5d1SDavid du Colombier void closeio(Posn); 2383e12c5d1SDavid du Colombier void cmdloop(void); 2393e12c5d1SDavid du Colombier void cmdupdate(void); 2403e12c5d1SDavid du Colombier void compile(String*); 2413e12c5d1SDavid du Colombier void copy(File*, Address); 2423e12c5d1SDavid du Colombier File *current(File*); 243219b2ee8SDavid du Colombier void delete(File*); 2443e12c5d1SDavid du Colombier void delfile(File*); 2453e12c5d1SDavid du Colombier void dellist(List*, int); 2463e12c5d1SDavid du Colombier void doubleclick(File*, Posn); 2473e12c5d1SDavid du Colombier void dprint(char*, ...); 2483e12c5d1SDavid du Colombier void edit(File*, int); 2493e12c5d1SDavid du Colombier void *emalloc(ulong); 2503e12c5d1SDavid du Colombier void *erealloc(void*, ulong); 2513e12c5d1SDavid du Colombier void error(Err); 2523e12c5d1SDavid du Colombier void error_c(Err, int); 253*9a747e4fSDavid du Colombier void error_r(Err, char*); 2543e12c5d1SDavid du Colombier void error_s(Err, char*); 2553e12c5d1SDavid du Colombier int execute(File*, Posn, Posn); 2563e12c5d1SDavid du Colombier int filematch(File*, String*); 2573e12c5d1SDavid du Colombier void filename(File*); 2587dd7cddfSDavid du Colombier void fixname(String*); 2597dd7cddfSDavid du Colombier void fullname(String*); 2607dd7cddfSDavid du Colombier void getcurwd(void); 2613e12c5d1SDavid du Colombier File *getfile(String*); 2623e12c5d1SDavid du Colombier int getname(File*, String*, int); 2637dd7cddfSDavid du Colombier long getnum(int); 2643e12c5d1SDavid du Colombier void hiccough(char*); 2653e12c5d1SDavid du Colombier void inslist(List*, int, long); 2663e12c5d1SDavid du Colombier Address lineaddr(Posn, Address, int); 2673e12c5d1SDavid du Colombier void listfree(List*); 2683e12c5d1SDavid du Colombier void load(File*); 2693e12c5d1SDavid du Colombier File *lookfile(String*); 2703e12c5d1SDavid du Colombier void lookorigin(File*, Posn, Posn); 2713e12c5d1SDavid du Colombier int lookup(int); 2723e12c5d1SDavid du Colombier void move(File*, Address); 2733e12c5d1SDavid du Colombier void moveto(File*, Range); 2743e12c5d1SDavid du Colombier File *newfile(void); 2753e12c5d1SDavid du Colombier void nextmatch(File*, String*, Posn, int); 2763e12c5d1SDavid du Colombier int newtmp(int); 2773e12c5d1SDavid du Colombier void notifyf(void*, char*); 2783e12c5d1SDavid du Colombier void panic(char*); 2793e12c5d1SDavid du Colombier void printposn(File*, int); 280bd389b36SDavid du Colombier void print_ss(char*, String*, String*); 281bd389b36SDavid du Colombier void print_s(char*, String*); 2823e12c5d1SDavid du Colombier int rcv(void); 2833e12c5d1SDavid du Colombier Range rdata(List*, Posn, Posn); 2847dd7cddfSDavid du Colombier Posn readio(File*, int*, int, int); 2853e12c5d1SDavid du Colombier void rescue(void); 2863e12c5d1SDavid du Colombier void resetcmd(void); 2873e12c5d1SDavid du Colombier void resetsys(void); 2883e12c5d1SDavid du Colombier void resetxec(void); 2893e12c5d1SDavid du Colombier void rgrow(List*, Posn, Posn); 2903e12c5d1SDavid du Colombier void samerr(char*); 2913e12c5d1SDavid du Colombier void settempfile(void); 2923e12c5d1SDavid du Colombier int skipbl(void); 2933e12c5d1SDavid du Colombier void snarf(File*, Posn, Posn, Buffer*, int); 2943e12c5d1SDavid du Colombier void sortname(File*); 2953e12c5d1SDavid du Colombier void startup(char*, int, char**, char**); 2963e12c5d1SDavid du Colombier void state(File*, int); 297*9a747e4fSDavid du Colombier int statfd(int, ulong*, uvlong*, long*, long*, long*); 298*9a747e4fSDavid du Colombier int statfile(char*, ulong*, uvlong*, long*, long*, long*); 2993e12c5d1SDavid du Colombier void Straddc(String*, int); 3003e12c5d1SDavid du Colombier void Strclose(String*); 3013e12c5d1SDavid du Colombier int Strcmp(String*, String*); 3023e12c5d1SDavid du Colombier void Strdelete(String*, Posn, Posn); 3033e12c5d1SDavid du Colombier void Strdupl(String*, Rune*); 3043e12c5d1SDavid du Colombier void Strduplstr(String*, String*); 3053e12c5d1SDavid du Colombier void Strinit(String*); 3063e12c5d1SDavid du Colombier void Strinit0(String*); 3073e12c5d1SDavid du Colombier void Strinsert(String*, String*, Posn); 3083e12c5d1SDavid du Colombier void Strinsure(String*, ulong); 3097dd7cddfSDavid du Colombier int Strispre(String*, String*); 3103e12c5d1SDavid du Colombier void Strzero(String*); 3113e12c5d1SDavid du Colombier int Strlen(Rune*); 3123e12c5d1SDavid du Colombier char *Strtoc(String*); 3133e12c5d1SDavid du Colombier void syserror(char*); 3143e12c5d1SDavid du Colombier void telldot(File*); 3153e12c5d1SDavid du Colombier void tellpat(void); 3163e12c5d1SDavid du Colombier String *tmpcstr(char*); 3173e12c5d1SDavid du Colombier String *tmprstr(Rune*, int); 3183e12c5d1SDavid du Colombier void freetmpstr(String*); 3193e12c5d1SDavid du Colombier void termcommand(void); 3203e12c5d1SDavid du Colombier void termwrite(char*); 3213e12c5d1SDavid du Colombier File *tofile(String*); 3223e12c5d1SDavid du Colombier void trytoclose(File*); 3233e12c5d1SDavid du Colombier void trytoquit(void); 3247dd7cddfSDavid du Colombier int undo(int); 3253e12c5d1SDavid du Colombier void update(void); 3263e12c5d1SDavid du Colombier int waitfor(int); 3273e12c5d1SDavid du Colombier void warn(Warn); 3283e12c5d1SDavid du Colombier void warn_s(Warn, char*); 329bd389b36SDavid du Colombier void warn_SS(Warn, String*, String*); 3303e12c5d1SDavid du Colombier void warn_S(Warn, String*); 3313e12c5d1SDavid du Colombier int whichmenu(File*); 3323e12c5d1SDavid du Colombier void writef(File*); 3333e12c5d1SDavid du Colombier Posn writeio(File*); 3343e12c5d1SDavid du Colombier Discdesc *Dstart(void); 3353e12c5d1SDavid du Colombier 3363e12c5d1SDavid du Colombier extern Rune samname[]; /* compiler dependent */ 3373e12c5d1SDavid du Colombier extern Rune *left[]; 3383e12c5d1SDavid du Colombier extern Rune *right[]; 3393e12c5d1SDavid du Colombier 3403e12c5d1SDavid du Colombier extern char RSAM[]; /* system dependent */ 3413e12c5d1SDavid du Colombier extern char SAMTERM[]; 3423e12c5d1SDavid du Colombier extern char HOME[]; 3433e12c5d1SDavid du Colombier extern char TMPDIR[]; 3443e12c5d1SDavid du Colombier extern char SH[]; 3453e12c5d1SDavid du Colombier extern char SHPATH[]; 3463e12c5d1SDavid du Colombier extern char RX[]; 3473e12c5d1SDavid du Colombier extern char RXPATH[]; 348bd389b36SDavid du Colombier extern char SAMSAVECMD[]; 3493e12c5d1SDavid du Colombier 3507dd7cddfSDavid du Colombier /* 3517dd7cddfSDavid du Colombier * acme globals 3527dd7cddfSDavid du Colombier */ 3537dd7cddfSDavid du Colombier extern long seq; 3547dd7cddfSDavid du Colombier extern Disk *disk; 3557dd7cddfSDavid du Colombier 3563e12c5d1SDavid du Colombier extern char *rsamname; /* globals */ 3573e12c5d1SDavid du Colombier extern char *samterm; 3583e12c5d1SDavid du Colombier extern Rune genbuf[]; 3593e12c5d1SDavid du Colombier extern char *genc; 3603e12c5d1SDavid du Colombier extern int io; 3613e12c5d1SDavid du Colombier extern int patset; 3623e12c5d1SDavid du Colombier extern int quitok; 3633e12c5d1SDavid du Colombier extern Address addr; 3647dd7cddfSDavid du Colombier extern Buffer snarfbuf; 3657dd7cddfSDavid du Colombier extern Buffer plan9buf; 3663e12c5d1SDavid du Colombier extern List file; 3673e12c5d1SDavid du Colombier extern List tempfile; 3683e12c5d1SDavid du Colombier extern File *cmd; 3693e12c5d1SDavid du Colombier extern File *curfile; 370bd389b36SDavid du Colombier extern File *lastfile; 3713e12c5d1SDavid du Colombier extern Mod modnum; 3723e12c5d1SDavid du Colombier extern Posn cmdpt; 3733e12c5d1SDavid du Colombier extern Posn cmdptadv; 3743e12c5d1SDavid du Colombier extern Rangeset sel; 3757dd7cddfSDavid du Colombier extern String curwd; 3763e12c5d1SDavid du Colombier extern String cmdstr; 3773e12c5d1SDavid du Colombier extern String genstr; 3783e12c5d1SDavid du Colombier extern String lastpat; 3793e12c5d1SDavid du Colombier extern String lastregexp; 3803e12c5d1SDavid du Colombier extern String plan9cmd; 3813e12c5d1SDavid du Colombier extern int downloaded; 3823e12c5d1SDavid du Colombier extern int eof; 3833e12c5d1SDavid du Colombier extern int bpipeok; 3843e12c5d1SDavid du Colombier extern int panicking; 3853e12c5d1SDavid du Colombier extern Rune empty[]; 3863e12c5d1SDavid du Colombier extern int termlocked; 3873e12c5d1SDavid du Colombier extern int noflush; 3883e12c5d1SDavid du Colombier 3893e12c5d1SDavid du Colombier #include "mesg.h" 3903e12c5d1SDavid du Colombier 3913e12c5d1SDavid du Colombier void outTs(Hmesg, int); 3923e12c5d1SDavid du Colombier void outT0(Hmesg); 3933e12c5d1SDavid du Colombier void outTl(Hmesg, long); 3943e12c5d1SDavid du Colombier void outTslS(Hmesg, int, long, String*); 3953e12c5d1SDavid du Colombier void outTS(Hmesg, String*); 3963e12c5d1SDavid du Colombier void outTsS(Hmesg, int, String*); 3973e12c5d1SDavid du Colombier void outTsllS(Hmesg, int, long, long, String*); 3983e12c5d1SDavid du Colombier void outTsll(Hmesg, int, long, long); 3993e12c5d1SDavid du Colombier void outTsl(Hmesg, int, long); 400219b2ee8SDavid du Colombier void outTsv(Hmesg, int, long); 4013e12c5d1SDavid du Colombier void outstart(Hmesg); 4023e12c5d1SDavid du Colombier void outcopy(int, void*); 4033e12c5d1SDavid du Colombier void outshort(int); 4043e12c5d1SDavid du Colombier void outlong(long); 405219b2ee8SDavid du Colombier void outvlong(void*); 4063e12c5d1SDavid du Colombier void outsend(void); 4073e12c5d1SDavid du Colombier void outflush(void); 408