xref: /plan9-contrib/sys/src/cmd/sam/sam.h (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
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