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