9base

revived minimalist port of Plan 9 userland to Unix
git clone git://git.suckless.org/9base
Log | Files | Refs | README | LICENSE

sam.h (9617B)


      1 #include <u.h>
      2 #include <libc.h>
      3 #include <plumb.h>
      4 #include "errors.h"
      5 
      6 #undef waitfor
      7 #define waitfor samwaitfor
      8 
      9 #undef warn
     10 #define warn samwarn
     11 
     12 /*
     13  * BLOCKSIZE is relatively small to keep memory consumption down.
     14  */
     15 
     16 #define	BLOCKSIZE	2048
     17 #define	RUNESIZE	sizeof(Rune)
     18 #define	NDISC		5
     19 #define	NBUFFILES	3+2*NDISC	/* plan 9+undo+snarf+NDISC*(transcript+buf) */
     20 #define NSUBEXP	10
     21 
     22 #define	TRUE		1
     23 #define	FALSE		0
     24 
     25 #undef INFINITY	/* Darwin declares this as HUGE_VAL */
     26 #define	INFINITY	0x7FFFFFFFL
     27 #define	INCR		25
     28 #define	STRSIZE		(2*BLOCKSIZE)
     29 
     30 typedef long		Posn;		/* file position or address */
     31 typedef	ushort		Mod;		/* modification number */
     32 
     33 typedef struct Address	Address;
     34 typedef struct Block	Block;
     35 typedef struct Buffer	Buffer;
     36 typedef struct Disk	Disk;
     37 typedef struct Discdesc	Discdesc;
     38 typedef struct File	File;
     39 typedef struct List	List;
     40 typedef struct Range	Range;
     41 typedef struct Rangeset	Rangeset;
     42 typedef struct String	String;
     43 
     44 enum State
     45 {
     46 	Clean =		' ',
     47 	Dirty =		'\'',
     48 	Unread =	'-'
     49 };
     50 
     51 struct Range
     52 {
     53 	Posn	p1, p2;
     54 };
     55 
     56 struct Rangeset
     57 {
     58 	Range	p[NSUBEXP];
     59 };
     60 
     61 struct Address
     62 {
     63 	Range	r;
     64 	File	*f;
     65 };
     66 
     67 struct String
     68 {
     69 	short	n;
     70 	short	size;
     71 	Rune	*s;
     72 };
     73 
     74 struct List	/* code depends on a long being able to hold a pointer */
     75 {
     76 	int	type;	/* 'p' for pointer, 'P' for Posn */
     77 	int	nalloc;
     78 	int	nused;
     79 	union{
     80 		void*	listp;
     81 		void**	voidp;
     82 		Posn*	posnp;
     83 		String**stringp;
     84 		File**	filep;
     85 	}g;
     86 };
     87 
     88 #define	listptr		g.listp
     89 #define	voidpptr	g.voidp
     90 #define	posnptr		g.posnp
     91 #define	stringpptr	g.stringp
     92 #define	filepptr	g.filep
     93 
     94 enum
     95 {
     96 	Blockincr =	256,
     97 	Maxblock = 	8*1024,
     98 
     99 	BUFSIZE = Maxblock,	/* size from fbufalloc() */
    100 	RBUFSIZE = BUFSIZE/sizeof(Rune)
    101 };
    102 
    103 
    104 enum
    105 {
    106 	Null		= '-',
    107 	Delete		= 'd',
    108 	Insert		= 'i',
    109 	Filename	= 'f',
    110 	Dot		= 'D',
    111 	Mark		= 'm'
    112 };
    113 
    114 struct Block
    115 {
    116 	uint		addr;	/* disk address in bytes */
    117 	union {
    118 		uint	n;	/* number of used runes in block */
    119 		Block	*next;	/* pointer to next in free list */
    120 	} u;
    121 };
    122 
    123 struct Disk
    124 {
    125 	int		fd;
    126 	uint		addr;	/* length of temp file */
    127 	Block		*free[Maxblock/Blockincr+1];
    128 };
    129 
    130 Disk*		diskinit(void);
    131 Block*		disknewblock(Disk*, uint);
    132 void		diskrelease(Disk*, Block*);
    133 void		diskread(Disk*, Block*, Rune*, uint);
    134 void		diskwrite(Disk*, Block**, Rune*, uint);
    135 
    136 struct Buffer
    137 {
    138 	uint		nc;
    139 	Rune		*c;	/* cache */
    140 	uint		cnc;	/* bytes in cache */
    141 	uint		cmax;	/* size of allocated cache */
    142 	uint		cq;	/* position of cache */
    143 	int		cdirty;	/* cache needs to be written */
    144 	uint		cbi;	/* index of cache Block */
    145 	Block		**bl;	/* array of blocks */
    146 	uint		nbl;	/* number of blocks */
    147 };
    148 void		bufinsert(Buffer*, uint, Rune*, uint);
    149 void		bufdelete(Buffer*, uint, uint);
    150 uint		bufload(Buffer*, uint, int, int*);
    151 void		bufread(Buffer*, uint, Rune*, uint);
    152 void		bufclose(Buffer*);
    153 void		bufreset(Buffer*);
    154 
    155 struct File
    156 {
    157 	Buffer 	b;				/* the data */
    158 	Buffer		delta;		/* transcript of changes */
    159 	Buffer		epsilon;	/* inversion of delta for redo */
    160 	String		name;		/* name of associated file */
    161 	uvlong		qidpath;	/* of file when read */
    162 	uint		mtime;		/* of file when read */
    163 	int		dev;		/* of file when read */
    164 	int		unread;		/* file has not been read from disk */
    165 
    166 	long		seq;		/* if seq==0, File acts like Buffer */
    167 	long		cleanseq;	/* f->seq at last read/write of file */
    168 	int		mod;		/* file appears modified in menu */
    169 	char		rescuing;	/* sam exiting; this file unusable */
    170 
    171 #if 0
    172 //	Text		*curtext;	/* most recently used associated text */
    173 //	Text		**text;		/* list of associated texts */
    174 //	int		ntext;
    175 //	int		dumpid;		/* used in dumping zeroxed windows */
    176 #endif
    177 
    178 	Posn		hiposn;		/* highest address touched this Mod */
    179 	Address		dot;		/* current position */
    180 	Address		ndot;		/* new current position after update */
    181 	Range		tdot;		/* what terminal thinks is current range */
    182 	Range		mark;		/* tagged spot in text (don't confuse with Mark) */
    183 	List		*rasp;		/* map of what terminal's got */
    184 	short		tag;		/* for communicating with terminal */
    185 	char		closeok;	/* ok to close file? */
    186 	char		deleted;	/* delete at completion of command */
    187 	Range		prevdot;	/* state before start of change */
    188 	Range		prevmark;
    189 	long		prevseq;
    190 	int		prevmod;
    191 };
    192 /*File*		fileaddtext(File*, Text*); */
    193 void		fileclose(File*);
    194 void		filedelete(File*, uint, uint);
    195 /*void		filedeltext(File*, Text*); */
    196 void		fileinsert(File*, uint, Rune*, uint);
    197 uint		fileload(File*, uint, int, int*);
    198 void		filemark(File*);
    199 void		filereset(File*);
    200 void		filesetname(File*, String*);
    201 void		fileundelete(File*, Buffer*, uint, uint);
    202 void		fileuninsert(File*, Buffer*, uint, uint);
    203 void		fileunsetname(File*, Buffer*);
    204 void		fileundo(File*, int, int, uint*, uint*, int);
    205 int		fileupdate(File*, int, int);
    206 
    207 int		filereadc(File*, uint);
    208 File		*fileopen(void);
    209 void		loginsert(File*, uint, Rune*, uint);
    210 void		logdelete(File*, uint, uint);
    211 void		logsetname(File*, String*);
    212 int		fileisdirty(File*);
    213 long		undoseq(File*, int);
    214 long		prevseq(Buffer*);
    215 
    216 void		raspload(File*);
    217 void		raspstart(File*);
    218 void		raspdelete(File*, uint, uint, int);
    219 void		raspinsert(File*, uint, Rune*, uint, int);
    220 void		raspdone(File*, int);
    221 void		raspflush(File*);
    222 
    223 /*
    224  * acme fns
    225  */
    226 void*	fbufalloc(void);
    227 void	fbuffree(void*);
    228 uint	min(uint, uint);
    229 void	cvttorunes(char*, int, Rune*, int*, int*, int*);
    230 
    231 #define	runemalloc(a)		(Rune*)emalloc((a)*sizeof(Rune))
    232 #define	runerealloc(a, b)	(Rune*)realloc((a), (b)*sizeof(Rune))
    233 #define	runemove(a, b, c)	memmove((a), (b), (c)*sizeof(Rune))
    234 
    235 int	alnum(int);
    236 int	Read(int, void*, int);
    237 void	Seek(int, long, int);
    238 int	plan9(File*, int, String*, int);
    239 int	Write(int, void*, int);
    240 int	bexecute(File*, Posn);
    241 void	cd(String*);
    242 void	closefiles(File*, String*);
    243 void	closeio(Posn);
    244 void	cmdloop(void);
    245 void	cmdupdate(void);
    246 void	compile(String*);
    247 void	copy(File*, Address);
    248 File	*current(File*);
    249 void	delete(File*);
    250 void	delfile(File*);
    251 void	dellist(List*, int);
    252 void	doubleclick(File*, Posn);
    253 void	dprint(char*, ...);
    254 void	edit(File*, int);
    255 void	*emalloc(ulong);
    256 void	*erealloc(void*, ulong);
    257 void	error(Err);
    258 void	error_c(Err, int);
    259 void	error_r(Err, char*);
    260 void	error_s(Err, char*);
    261 int	execute(File*, Posn, Posn);
    262 int	filematch(File*, String*);
    263 void	filename(File*);
    264 void	fixname(String*);
    265 void	fullname(String*);
    266 void	getcurwd(void);
    267 File	*getfile(String*);
    268 int	getname(File*, String*, int);
    269 long	getnum(int);
    270 void	hiccough(char*);
    271 void	inslist(List*, int, ...);
    272 Address	lineaddr(Posn, Address, int);
    273 List	*listalloc(int);
    274 void	listfree(List*);
    275 void	load(File*);
    276 File	*lookfile(String*);
    277 void	lookorigin(File*, Posn, Posn);
    278 int	lookup(int);
    279 void	move(File*, Address);
    280 void	moveto(File*, Range);
    281 File	*newfile(void);
    282 void	nextmatch(File*, String*, Posn, int);
    283 int	newtmp(int);
    284 void	notifyf(void*, char*);
    285 void	panic(char*);
    286 void	printposn(File*, int);
    287 void	print_ss(char*, String*, String*);
    288 void	print_s(char*, String*);
    289 int	rcv(void);
    290 Range	rdata(List*, Posn, Posn);
    291 Posn	readio(File*, int*, int, int);
    292 void	rescue(void);
    293 void	resetcmd(void);
    294 void	resetsys(void);
    295 void	resetxec(void);
    296 void	rgrow(List*, Posn, Posn);
    297 void	samerr(char*);
    298 void	settempfile(void);
    299 int	skipbl(void);
    300 void	snarf(File*, Posn, Posn, Buffer*, int);
    301 void	sortname(File*);
    302 void	startup(char*, int, char**, char**);
    303 void	state(File*, int);
    304 int	statfd(int, ulong*, uvlong*, long*, long*, long*);
    305 int	statfile(char*, ulong*, uvlong*, long*, long*, long*);
    306 void	Straddc(String*, int);
    307 void	Strclose(String*);
    308 int	Strcmp(String*, String*);
    309 void	Strdelete(String*, Posn, Posn);
    310 void	Strdupl(String*, Rune*);
    311 void	Strduplstr(String*, String*);
    312 void	Strinit(String*);
    313 void	Strinit0(String*);
    314 void	Strinsert(String*, String*, Posn);
    315 void	Strinsure(String*, ulong);
    316 int	Strispre(String*, String*);
    317 void	Strzero(String*);
    318 int	Strlen(Rune*);
    319 char	*Strtoc(String*);
    320 void	syserror(char*);
    321 void	telldot(File*);
    322 void	tellpat(void);
    323 String	*tmpcstr(char*);
    324 String	*tmprstr(Rune*, int);
    325 void	freetmpstr(String*);
    326 void	termcommand(void);
    327 void	termwrite(char*);
    328 File	*tofile(String*);
    329 void	trytoclose(File*);
    330 void	trytoquit(void);
    331 int	undo(int);
    332 void	update(void);
    333 int	waitfor(int);
    334 void	warn(Warn);
    335 void	warn_s(Warn, char*);
    336 void	warn_SS(Warn, String*, String*);
    337 void	warn_S(Warn, String*);
    338 int	whichmenu(File*);
    339 void	writef(File*);
    340 Posn	writeio(File*);
    341 Discdesc *Dstart(void);
    342 
    343 extern Rune	samname[];	/* compiler dependent */
    344 extern Rune	*left[];
    345 extern Rune	*right[];
    346 
    347 extern char	RSAM[];		/* system dependent */
    348 extern char	SAMTERM[];
    349 extern char	HOME[];
    350 extern char	TMPDIR[];
    351 extern char	SH[];
    352 extern char	SHPATH[];
    353 extern char	RX[];
    354 extern char	RXPATH[];
    355 
    356 /*
    357  * acme globals
    358  */
    359 extern long		seq;
    360 extern Disk		*disk;
    361 
    362 extern char	*rsamname;	/* globals */
    363 extern char	*samterm;
    364 extern Rune	genbuf[];
    365 extern char	*genc;
    366 extern int	io;
    367 extern int	patset;
    368 extern int	quitok;
    369 extern Address	addr;
    370 extern Buffer	snarfbuf;
    371 extern Buffer	plan9buf;
    372 extern List	file;
    373 extern List	tempfile;
    374 extern File	*cmd;
    375 extern File	*curfile;
    376 extern File	*lastfile;
    377 extern Mod	modnum;
    378 extern Posn	cmdpt;
    379 extern Posn	cmdptadv;
    380 extern Rangeset	sel;
    381 extern String	curwd;
    382 extern String	cmdstr;
    383 extern String	genstr;
    384 extern String	lastpat;
    385 extern String	lastregexp;
    386 extern String	plan9cmd;
    387 extern int	downloaded;
    388 extern int	eof;
    389 extern int	bpipeok;
    390 extern int	panicking;
    391 extern Rune	empty[];
    392 extern int	termlocked;
    393 extern int	outbuffered;
    394 
    395 #include "mesg.h"
    396 
    397 void	outTs(Hmesg, int);
    398 void	outT0(Hmesg);
    399 void	outTl(Hmesg, long);
    400 void	outTslS(Hmesg, int, long, String*);
    401 void	outTS(Hmesg, String*);
    402 void	outTsS(Hmesg, int, String*);
    403 void	outTsllS(Hmesg, int, long, long, String*);
    404 void	outTsll(Hmesg, int, long, long);
    405 void	outTsl(Hmesg, int, long);
    406 void	outTsv(Hmesg, int, vlong);
    407 void	outflush(void);
    408 int needoutflush(void);