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