13e12c5d1SDavid du Colombier #include <u.h> 23e12c5d1SDavid du Colombier #include <libc.h> 33e12c5d1SDavid du Colombier #include "errors.h" 43e12c5d1SDavid du Colombier 53e12c5d1SDavid du Colombier /* 63e12c5d1SDavid du Colombier * BLOCKSIZE is relatively small to keep memory consumption down. 73e12c5d1SDavid du Colombier */ 83e12c5d1SDavid du Colombier 93e12c5d1SDavid du Colombier #define BLOCKSIZE 2048 103e12c5d1SDavid du Colombier #define RUNESIZE sizeof(Rune) 113e12c5d1SDavid du Colombier #define NDISC 5 123e12c5d1SDavid du Colombier #define NBUFFILES 3+2*NDISC /* plan 9+undo+snarf+NDISC*(transcript+buf) */ 133e12c5d1SDavid du Colombier #define NSUBEXP 10 143e12c5d1SDavid du Colombier 153e12c5d1SDavid du Colombier #define TRUE 1 163e12c5d1SDavid du Colombier #define FALSE 0 173e12c5d1SDavid du Colombier 183e12c5d1SDavid du Colombier #define INFINITY 0x7FFFFFFFL 193e12c5d1SDavid du Colombier #define INCR 25 203e12c5d1SDavid du Colombier #define STRSIZE (2*BLOCKSIZE) 213e12c5d1SDavid du Colombier 223e12c5d1SDavid du Colombier typedef long Posn; /* file position or address */ 233e12c5d1SDavid du Colombier typedef ushort Mod; /* modification number */ 243e12c5d1SDavid du Colombier 253e12c5d1SDavid du Colombier typedef struct Address Address; 263e12c5d1SDavid du Colombier typedef struct Block Block; 273e12c5d1SDavid du Colombier typedef struct Buffer Buffer; 283e12c5d1SDavid du Colombier typedef struct Disc Disc; 293e12c5d1SDavid du Colombier typedef struct Discdesc Discdesc; 303e12c5d1SDavid du Colombier typedef struct File File; 313e12c5d1SDavid du Colombier typedef struct List List; 323e12c5d1SDavid du Colombier typedef struct Mark Mark; 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 = '-', 42bd389b36SDavid du Colombier Readerr = '~', 433e12c5d1SDavid du Colombier }; 443e12c5d1SDavid du Colombier 453e12c5d1SDavid du Colombier struct Range 463e12c5d1SDavid du Colombier { 473e12c5d1SDavid du Colombier Posn p1, p2; 483e12c5d1SDavid du Colombier }; 493e12c5d1SDavid du Colombier 503e12c5d1SDavid du Colombier struct Rangeset 513e12c5d1SDavid du Colombier { 523e12c5d1SDavid du Colombier Range p[NSUBEXP]; 533e12c5d1SDavid du Colombier }; 543e12c5d1SDavid du Colombier 553e12c5d1SDavid du Colombier struct Address 563e12c5d1SDavid du Colombier { 573e12c5d1SDavid du Colombier Range r; 583e12c5d1SDavid du Colombier File *f; 593e12c5d1SDavid du Colombier }; 603e12c5d1SDavid du Colombier 613e12c5d1SDavid du Colombier struct List /* code depends on a long being able to hold a pointer */ 623e12c5d1SDavid du Colombier { 633e12c5d1SDavid du Colombier int nalloc; 643e12c5d1SDavid du Colombier int nused; 653e12c5d1SDavid du Colombier union{ 663e12c5d1SDavid du Colombier void *listp; 673e12c5d1SDavid du Colombier Block *blkp; 683e12c5d1SDavid du Colombier long *longp; 693e12c5d1SDavid du Colombier uchar* *ucharp; 703e12c5d1SDavid du Colombier String* *stringp; 713e12c5d1SDavid du Colombier File* *filep; 723e12c5d1SDavid du Colombier long listv; 733e12c5d1SDavid du Colombier }g; 743e12c5d1SDavid du Colombier }; 753e12c5d1SDavid du Colombier 763e12c5d1SDavid du Colombier #define listptr g.listp 773e12c5d1SDavid du Colombier #define blkptr g.blkp 783e12c5d1SDavid du Colombier #define longptr g.longp 793e12c5d1SDavid du Colombier #define ucharpptr g.ucharp 803e12c5d1SDavid du Colombier #define stringpptr g.stringp 813e12c5d1SDavid du Colombier #define filepptr g.filep 823e12c5d1SDavid du Colombier #define listval g.listv 833e12c5d1SDavid du Colombier 843e12c5d1SDavid du Colombier /* 853e12c5d1SDavid du Colombier * Block must fit in a long because the list routines manage arrays of 863e12c5d1SDavid du Colombier * blocks. Two problems: some machines (e.g. Cray) can't pull this off 873e12c5d1SDavid du Colombier * -- on them, use bitfields -- and the ushort bnum limits temp file sizes 883e12c5d1SDavid du Colombier * to about 200 megabytes. Advantages: small, simple code and small 893e12c5d1SDavid du Colombier * memory overhead. If you really want to edit huge files, making BLOCKSIZE 903e12c5d1SDavid du Colombier * bigger is the easiest way. 913e12c5d1SDavid du Colombier */ 923e12c5d1SDavid du Colombier struct Block 933e12c5d1SDavid du Colombier { 943e12c5d1SDavid du Colombier ushort bnum; /* absolute number on disk */ 953e12c5d1SDavid du Colombier short nrunes; /* runes stored in this block */ 963e12c5d1SDavid du Colombier }; 973e12c5d1SDavid du Colombier 983e12c5d1SDavid du Colombier struct Discdesc 993e12c5d1SDavid du Colombier { 1003e12c5d1SDavid du Colombier int fd; /* plan 9 file descriptor of temp file */ 1013e12c5d1SDavid du Colombier ulong nbk; /* high water mark */ 1023e12c5d1SDavid du Colombier List free; /* array of free block indices */ 1033e12c5d1SDavid du Colombier }; 1043e12c5d1SDavid du Colombier 1053e12c5d1SDavid du Colombier struct Disc 1063e12c5d1SDavid du Colombier { 1073e12c5d1SDavid du Colombier Discdesc *desc; /* descriptor of temp file */ 1083e12c5d1SDavid du Colombier Posn nrunes; /* runes on disc file */ 1093e12c5d1SDavid du Colombier List block; /* list of used block indices */ 1103e12c5d1SDavid du Colombier }; 1113e12c5d1SDavid du Colombier 1123e12c5d1SDavid du Colombier struct String 1133e12c5d1SDavid du Colombier { 1143e12c5d1SDavid du Colombier short n; 1153e12c5d1SDavid du Colombier short size; 1163e12c5d1SDavid du Colombier Rune *s; 1173e12c5d1SDavid du Colombier }; 1183e12c5d1SDavid du Colombier 1193e12c5d1SDavid du Colombier struct Buffer 1203e12c5d1SDavid du Colombier { 1213e12c5d1SDavid du Colombier Disc *disc; /* disc storage */ 1223e12c5d1SDavid du Colombier Posn nrunes; /* total length of buffer */ 1233e12c5d1SDavid du Colombier String cache; /* in-core storage for efficiency */ 1243e12c5d1SDavid du Colombier Posn c1, c2; /* cache start and end positions in disc */ 1253e12c5d1SDavid du Colombier /* note: if dirty, cache is really c1, c1+cache.n */ 1263e12c5d1SDavid du Colombier int dirty; /* cache dirty */ 1273e12c5d1SDavid du Colombier }; 1283e12c5d1SDavid du Colombier 1293e12c5d1SDavid du Colombier #define NGETC 128 1303e12c5d1SDavid du Colombier 1313e12c5d1SDavid du Colombier struct File 1323e12c5d1SDavid du Colombier { 1333e12c5d1SDavid du Colombier Buffer *buf; /* cached disc storage */ 1343e12c5d1SDavid du Colombier Buffer *transcript; /* what's been done */ 1353e12c5d1SDavid du Colombier Posn markp; /* file pointer to start of latest change */ 1363e12c5d1SDavid du Colombier Mod mod; /* modification stamp */ 1373e12c5d1SDavid du Colombier Posn nrunes; /* total length of file */ 1383e12c5d1SDavid du Colombier Posn hiposn; /* highest address touched this Mod */ 1393e12c5d1SDavid du Colombier Address dot; /* current position */ 1403e12c5d1SDavid du Colombier Address ndot; /* new current position after update */ 1413e12c5d1SDavid du Colombier Range tdot; /* what terminal thinks is current range */ 1423e12c5d1SDavid du Colombier Range mark; /* tagged spot in text (don't confuse with Mark) */ 1433e12c5d1SDavid du Colombier List *rasp; /* map of what terminal's got */ 1443e12c5d1SDavid du Colombier String name; /* file name */ 1453e12c5d1SDavid du Colombier short tag; /* for communicating with terminal */ 146bd389b36SDavid du Colombier char state; /* Clean, Dirty, Unread, or Readerr*/ 1473e12c5d1SDavid du Colombier char closeok; /* ok to close file? */ 148*219b2ee8SDavid du Colombier char deleted; /* delete at completion of command */ 1493e12c5d1SDavid du Colombier char marked; /* file has been Fmarked at least once; once 1503e12c5d1SDavid du Colombier * set, this will never go off as undo doesn't 1513e12c5d1SDavid du Colombier * revert to the dawn of time */ 152bd389b36SDavid du Colombier long dev; /* file system from which it was read */ 153bd389b36SDavid du Colombier long qid; /* file from which it was read */ 1543e12c5d1SDavid du Colombier long date; /* time stamp of plan9 file */ 1553e12c5d1SDavid du Colombier Posn cp1, cp2; /* Write-behind cache positions and */ 1563e12c5d1SDavid du Colombier String cache; /* string */ 1573e12c5d1SDavid du Colombier Rune getcbuf[NGETC]; 1583e12c5d1SDavid du Colombier int ngetc; 1593e12c5d1SDavid du Colombier int getci; 1603e12c5d1SDavid du Colombier Posn getcp; 1613e12c5d1SDavid du Colombier }; 1623e12c5d1SDavid du Colombier 1633e12c5d1SDavid du Colombier struct Mark 1643e12c5d1SDavid du Colombier { 1653e12c5d1SDavid du Colombier Posn p; 1663e12c5d1SDavid du Colombier Range dot; 1673e12c5d1SDavid du Colombier Range mark; 1683e12c5d1SDavid du Colombier Mod m; 1693e12c5d1SDavid du Colombier short s1; 1703e12c5d1SDavid du Colombier }; 1713e12c5d1SDavid du Colombier 1723e12c5d1SDavid du Colombier /* 1733e12c5d1SDavid du Colombier * The precedent to any message in the transcript. 1743e12c5d1SDavid du Colombier * The component structures must be an integral number of Runes long. 1753e12c5d1SDavid du Colombier */ 1763e12c5d1SDavid du Colombier union Hdr 1773e12c5d1SDavid du Colombier { 1783e12c5d1SDavid du Colombier struct _csl 1793e12c5d1SDavid du Colombier { 1803e12c5d1SDavid du Colombier short c; 1813e12c5d1SDavid du Colombier short s; 1823e12c5d1SDavid du Colombier long l; 1833e12c5d1SDavid du Colombier }csl; 1843e12c5d1SDavid du Colombier struct _cs 1853e12c5d1SDavid du Colombier { 1863e12c5d1SDavid du Colombier short c; 1873e12c5d1SDavid du Colombier short s; 1883e12c5d1SDavid du Colombier }cs; 1893e12c5d1SDavid du Colombier struct _cll 1903e12c5d1SDavid du Colombier { 1913e12c5d1SDavid du Colombier short c; 1923e12c5d1SDavid du Colombier long l; 1933e12c5d1SDavid du Colombier long l1; 1943e12c5d1SDavid du Colombier }cll; 1953e12c5d1SDavid du Colombier Mark mark; 1963e12c5d1SDavid du Colombier }; 1973e12c5d1SDavid du Colombier 1983e12c5d1SDavid du Colombier #define Fgetc(f) ((--(f)->ngetc<0)? Fgetcload(f, (f)->getcp) : (f)->getcbuf[(f)->getcp++, (f)->getci++]) 1993e12c5d1SDavid du Colombier #define Fbgetc(f) (((f)->getci<=0)? Fbgetcload(f, (f)->getcp) : (f)->getcbuf[--(f)->getcp, --(f)->getci]) 2003e12c5d1SDavid du Colombier 2013e12c5d1SDavid du Colombier int alnum(int); 2023e12c5d1SDavid du Colombier void Bclean(Buffer*); 203*219b2ee8SDavid du Colombier void Bterm(Buffer*); 2043e12c5d1SDavid du Colombier void Bdelete(Buffer*, Posn, Posn); 2053e12c5d1SDavid du Colombier void Bflush(Buffer*); 2063e12c5d1SDavid du Colombier void Binsert(Buffer*, String*, Posn); 2073e12c5d1SDavid du Colombier Buffer *Bopen(Discdesc*); 2083e12c5d1SDavid du Colombier int Bread(Buffer*, Rune*, int, Posn); 2093e12c5d1SDavid du Colombier void Dclose(Disc*); 2103e12c5d1SDavid du Colombier void Ddelete(Disc*, Posn, Posn); 2113e12c5d1SDavid du Colombier void Dinsert(Disc*, Rune*, int, Posn); 2123e12c5d1SDavid du Colombier Disc *Dopen(Discdesc*); 2133e12c5d1SDavid du Colombier int Dread(Disc*, Rune*, int, Posn); 2143e12c5d1SDavid du Colombier void Dreplace(Disc*, Posn, Posn, Rune*, int); 2153e12c5d1SDavid du Colombier int Fbgetcload(File*, Posn); 2163e12c5d1SDavid du Colombier int Fbgetcset(File*, Posn); 2173e12c5d1SDavid du Colombier long Fchars(File*, Rune*, Posn, Posn); 2183e12c5d1SDavid du Colombier void Fclose(File*); 2193e12c5d1SDavid du Colombier void Fdelete(File*, Posn, Posn); 2203e12c5d1SDavid du Colombier int Fgetcload(File*, Posn); 2213e12c5d1SDavid du Colombier int Fgetcset(File*, Posn); 2223e12c5d1SDavid du Colombier void Finsert(File*, String*, Posn); 2233e12c5d1SDavid du Colombier File *Fopen(void); 2243e12c5d1SDavid du Colombier void Fsetname(File*, String*); 2253e12c5d1SDavid du Colombier void Fstart(void); 2263e12c5d1SDavid du Colombier int Fupdate(File*, int, int); 2273e12c5d1SDavid du Colombier int Read(int, void*, int); 2283e12c5d1SDavid du Colombier void Seek(int, long, int); 229*219b2ee8SDavid du Colombier int plan9(File*, int, String*, int); 2303e12c5d1SDavid du Colombier int Write(int, void*, int); 2313e12c5d1SDavid du Colombier int bexecute(File*, Posn); 2323e12c5d1SDavid du Colombier void cd(String*); 2333e12c5d1SDavid du Colombier void closefiles(File*, String*); 2343e12c5d1SDavid du Colombier void closeio(Posn); 2353e12c5d1SDavid du Colombier void cmdloop(void); 2363e12c5d1SDavid du Colombier void cmdupdate(void); 2373e12c5d1SDavid du Colombier void compile(String*); 2383e12c5d1SDavid du Colombier void copy(File*, Address); 2393e12c5d1SDavid du Colombier File *current(File*); 240*219b2ee8SDavid du Colombier void delete(File*); 2413e12c5d1SDavid du Colombier void delfile(File*); 2423e12c5d1SDavid du Colombier void dellist(List*, int); 2433e12c5d1SDavid du Colombier void doubleclick(File*, Posn); 2443e12c5d1SDavid du Colombier void dprint(char*, ...); 2453e12c5d1SDavid du Colombier void edit(File*, int); 2463e12c5d1SDavid du Colombier void *emalloc(ulong); 2473e12c5d1SDavid du Colombier void *erealloc(void*, ulong); 2483e12c5d1SDavid du Colombier void error(Err); 2493e12c5d1SDavid du Colombier void error_c(Err, int); 2503e12c5d1SDavid du Colombier void error_s(Err, char*); 2513e12c5d1SDavid du Colombier int execute(File*, Posn, Posn); 2523e12c5d1SDavid du Colombier int filematch(File*, String*); 2533e12c5d1SDavid du Colombier void filename(File*); 2543e12c5d1SDavid du Colombier File *getfile(String*); 2553e12c5d1SDavid du Colombier int getname(File*, String*, int); 2563e12c5d1SDavid du Colombier long getnum(void); 2573e12c5d1SDavid du Colombier void hiccough(char*); 2583e12c5d1SDavid du Colombier void inslist(List*, int, long); 2593e12c5d1SDavid du Colombier Address lineaddr(Posn, Address, int); 2603e12c5d1SDavid du Colombier void listfree(List*); 2613e12c5d1SDavid du Colombier void load(File*); 2623e12c5d1SDavid du Colombier File *lookfile(String*); 2633e12c5d1SDavid du Colombier void lookorigin(File*, Posn, Posn); 2643e12c5d1SDavid du Colombier int lookup(int); 2653e12c5d1SDavid du Colombier void move(File*, Address); 2663e12c5d1SDavid du Colombier void moveto(File*, Range); 2673e12c5d1SDavid du Colombier File *newfile(void); 2683e12c5d1SDavid du Colombier void nextmatch(File*, String*, Posn, int); 2693e12c5d1SDavid du Colombier int newtmp(int); 2703e12c5d1SDavid du Colombier void notifyf(void*, char*); 2713e12c5d1SDavid du Colombier void panic(char*); 2723e12c5d1SDavid du Colombier void printposn(File*, int); 273bd389b36SDavid du Colombier void print_ss(char*, String*, String*); 274bd389b36SDavid du Colombier void print_s(char*, String*); 2753e12c5d1SDavid du Colombier int rcv(void); 2763e12c5d1SDavid du Colombier Range rdata(List*, Posn, Posn); 2773e12c5d1SDavid du Colombier Posn readio(File*, int*, int); 2783e12c5d1SDavid du Colombier void rescue(void); 2793e12c5d1SDavid du Colombier void resetcmd(void); 2803e12c5d1SDavid du Colombier void resetsys(void); 2813e12c5d1SDavid du Colombier void resetxec(void); 2823e12c5d1SDavid du Colombier void rgrow(List*, Posn, Posn); 2833e12c5d1SDavid du Colombier void samerr(char*); 2843e12c5d1SDavid du Colombier void settempfile(void); 2853e12c5d1SDavid du Colombier int skipbl(void); 2863e12c5d1SDavid du Colombier void snarf(File*, Posn, Posn, Buffer*, int); 2873e12c5d1SDavid du Colombier void sortname(File*); 2883e12c5d1SDavid du Colombier void startup(char*, int, char**, char**); 2893e12c5d1SDavid du Colombier void state(File*, int); 290*219b2ee8SDavid du Colombier int statfd(int, ulong*, ulong*, long*, long*, long*); 291*219b2ee8SDavid du Colombier int statfile(char*, ulong*, ulong*, long*, long*, long*); 2923e12c5d1SDavid du Colombier void Straddc(String*, int); 2933e12c5d1SDavid du Colombier void Strclose(String*); 2943e12c5d1SDavid du Colombier int Strcmp(String*, String*); 2953e12c5d1SDavid du Colombier void Strdelete(String*, Posn, Posn); 2963e12c5d1SDavid du Colombier void Strdupl(String*, Rune*); 2973e12c5d1SDavid du Colombier void Strduplstr(String*, String*); 2983e12c5d1SDavid du Colombier void Strinit(String*); 2993e12c5d1SDavid du Colombier void Strinit0(String*); 3003e12c5d1SDavid du Colombier void Strinsert(String*, String*, Posn); 3013e12c5d1SDavid du Colombier void Strinsure(String*, ulong); 3023e12c5d1SDavid du Colombier void Strzero(String*); 3033e12c5d1SDavid du Colombier int Strlen(Rune*); 3043e12c5d1SDavid du Colombier char *Strtoc(String*); 3053e12c5d1SDavid du Colombier void syserror(char*); 3063e12c5d1SDavid du Colombier void telldot(File*); 3073e12c5d1SDavid du Colombier void tellpat(void); 3083e12c5d1SDavid du Colombier String *tmpcstr(char*); 3093e12c5d1SDavid du Colombier String *tmprstr(Rune*, int); 3103e12c5d1SDavid du Colombier void freetmpstr(String*); 3113e12c5d1SDavid du Colombier void termcommand(void); 3123e12c5d1SDavid du Colombier void termwrite(char*); 3133e12c5d1SDavid du Colombier File *tofile(String*); 3143e12c5d1SDavid du Colombier void toterminal(File*, int); 3153e12c5d1SDavid du Colombier void trytoclose(File*); 3163e12c5d1SDavid du Colombier void trytoquit(void); 317bd389b36SDavid du Colombier int undo(void); 3183e12c5d1SDavid du Colombier void update(void); 3193e12c5d1SDavid du Colombier int waitfor(int); 3203e12c5d1SDavid du Colombier void warn(Warn); 3213e12c5d1SDavid du Colombier void warn_s(Warn, char*); 322bd389b36SDavid du Colombier void warn_SS(Warn, String*, String*); 3233e12c5d1SDavid du Colombier void warn_S(Warn, String*); 3243e12c5d1SDavid du Colombier int whichmenu(File*); 3253e12c5d1SDavid du Colombier void writef(File*); 3263e12c5d1SDavid du Colombier Posn writeio(File*); 3273e12c5d1SDavid du Colombier Discdesc *Dstart(void); 3283e12c5d1SDavid du Colombier 3293e12c5d1SDavid du Colombier extern Rune samname[]; /* compiler dependent */ 3303e12c5d1SDavid du Colombier extern Rune *left[]; 3313e12c5d1SDavid du Colombier extern Rune *right[]; 3323e12c5d1SDavid du Colombier 3333e12c5d1SDavid du Colombier extern char RSAM[]; /* system dependent */ 3343e12c5d1SDavid du Colombier extern char SAMTERM[]; 3353e12c5d1SDavid du Colombier extern char HOME[]; 3363e12c5d1SDavid du Colombier extern char TMPDIR[]; 3373e12c5d1SDavid du Colombier extern char SH[]; 3383e12c5d1SDavid du Colombier extern char SHPATH[]; 3393e12c5d1SDavid du Colombier extern char RX[]; 3403e12c5d1SDavid du Colombier extern char RXPATH[]; 341bd389b36SDavid du Colombier extern char SAMSAVECMD[]; 3423e12c5d1SDavid du Colombier 3433e12c5d1SDavid du Colombier extern char *rsamname; /* globals */ 3443e12c5d1SDavid du Colombier extern char *samterm; 3453e12c5d1SDavid du Colombier extern Rune genbuf[]; 3463e12c5d1SDavid du Colombier extern char *genc; 3473e12c5d1SDavid du Colombier extern int io; 3483e12c5d1SDavid du Colombier extern int patset; 3493e12c5d1SDavid du Colombier extern int quitok; 3503e12c5d1SDavid du Colombier extern Address addr; 3513e12c5d1SDavid du Colombier extern Buffer *undobuf; 3523e12c5d1SDavid du Colombier extern Buffer *snarfbuf; 3533e12c5d1SDavid du Colombier extern Buffer *plan9buf; 3543e12c5d1SDavid du Colombier extern List file; 3553e12c5d1SDavid du Colombier extern List tempfile; 3563e12c5d1SDavid du Colombier extern File *cmd; 3573e12c5d1SDavid du Colombier extern File *curfile; 358bd389b36SDavid du Colombier extern File *lastfile; 3593e12c5d1SDavid du Colombier extern Mod modnum; 3603e12c5d1SDavid du Colombier extern Posn cmdpt; 3613e12c5d1SDavid du Colombier extern Posn cmdptadv; 3623e12c5d1SDavid du Colombier extern Rangeset sel; 3633e12c5d1SDavid du Colombier extern String cmdstr; 3643e12c5d1SDavid du Colombier extern String genstr; 3653e12c5d1SDavid du Colombier extern String lastpat; 3663e12c5d1SDavid du Colombier extern String lastregexp; 3673e12c5d1SDavid du Colombier extern String plan9cmd; 3683e12c5d1SDavid du Colombier extern int downloaded; 3693e12c5d1SDavid du Colombier extern int eof; 3703e12c5d1SDavid du Colombier extern int bpipeok; 3713e12c5d1SDavid du Colombier extern int panicking; 3723e12c5d1SDavid du Colombier extern Rune empty[]; 3733e12c5d1SDavid du Colombier extern int termlocked; 3743e12c5d1SDavid du Colombier extern int noflush; 3753e12c5d1SDavid du Colombier 3763e12c5d1SDavid du Colombier #include "mesg.h" 3773e12c5d1SDavid du Colombier 3783e12c5d1SDavid du Colombier void outTs(Hmesg, int); 3793e12c5d1SDavid du Colombier void outT0(Hmesg); 3803e12c5d1SDavid du Colombier void outTl(Hmesg, long); 3813e12c5d1SDavid du Colombier void outTslS(Hmesg, int, long, String*); 3823e12c5d1SDavid du Colombier void outTS(Hmesg, String*); 3833e12c5d1SDavid du Colombier void outTsS(Hmesg, int, String*); 3843e12c5d1SDavid du Colombier void outTsllS(Hmesg, int, long, long, String*); 3853e12c5d1SDavid du Colombier void outTsll(Hmesg, int, long, long); 3863e12c5d1SDavid du Colombier void outTsl(Hmesg, int, long); 387*219b2ee8SDavid du Colombier void outTsv(Hmesg, int, long); 3883e12c5d1SDavid du Colombier void outstart(Hmesg); 3893e12c5d1SDavid du Colombier void outcopy(int, void*); 3903e12c5d1SDavid du Colombier void outshort(int); 3913e12c5d1SDavid du Colombier void outlong(long); 392*219b2ee8SDavid du Colombier void outvlong(void*); 3933e12c5d1SDavid du Colombier void outsend(void); 3943e12c5d1SDavid du Colombier void outflush(void); 395