⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sam.h

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 H
字号:
#include <u.h>#include <libc.h>#include <plumb.h>#include "errors.h"/* * BLOCKSIZE is relatively small to keep memory consumption down. */#define	BLOCKSIZE	2048#define	RUNESIZE	sizeof(Rune)#define	NDISC		5#define	NBUFFILES	3+2*NDISC	/* plan 9+undo+snarf+NDISC*(transcript+buf) */#define NSUBEXP	10#define	TRUE		1#define	FALSE		0#define	INFINITY	0x7FFFFFFFL#define	INCR		25#define	STRSIZE		(2*BLOCKSIZE)typedef long		Posn;		/* file position or address */typedef	ushort		Mod;		/* modification number */typedef struct Address	Address;typedef struct Block	Block;typedef struct Buffer	Buffer;typedef struct Disk	Disk;typedef struct Discdesc	Discdesc;typedef struct File	File;typedef struct List	List;typedef struct Range	Range;typedef struct Rangeset	Rangeset;typedef struct String	String;enum State{	Clean =		' ',	Dirty =		'\'',	Unread =	'-',};struct Range{	Posn	p1, p2;};struct Rangeset{	Range	p[NSUBEXP];};struct Address{	Range	r;	File	*f;};struct String{	short	n;	short	size;	Rune	*s;};struct List{	int	type;	/* 'p' for pointer, 'P' for Posn */	int	nalloc;	int	nused;	union{		void*	listp;		void**	voidp;		Posn*	posnp;		String**stringp;		File**	filep;	}g;};#define	listptr		g.listp#define	voidpptr	g.voidp#define	posnptr		g.posnp#define	stringpptr	g.stringp#define	filepptr	g.filepenum{	Blockincr =	256,	Maxblock = 	8*1024,	BUFSIZE = Maxblock,	/* size from fbufalloc() */	RBUFSIZE = BUFSIZE/sizeof(Rune),};enum{	Null		= '-',	Delete		= 'd',	Insert		= 'i',	Filename	= 'f',	Dot		= 'D',	Mark		= 'm',};struct Block{	uint		addr;	/* disk address in bytes */	union	{		uint	n;	/* number of used runes in block */		Block	*next;	/* pointer to next in free list */	};};struct Disk{	int		fd;	uint		addr;	/* length of temp file */	Block		*free[Maxblock/Blockincr+1];};Disk*		diskinit(void);Block*		disknewblock(Disk*, uint);void		diskrelease(Disk*, Block*);void		diskread(Disk*, Block*, Rune*, uint);void		diskwrite(Disk*, Block**, Rune*, uint);struct Buffer{	uint		nc;	Rune		*c;	/* cache */	uint		cnc;	/* bytes in cache */	uint		cmax;	/* size of allocated cache */	uint		cq;	/* position of cache */	int		cdirty;	/* cache needs to be written */	uint		cbi;	/* index of cache Block */	Block		**bl;	/* array of blocks */	uint		nbl;	/* number of blocks */};void		bufinsert(Buffer*, uint, Rune*, uint);void		bufdelete(Buffer*, uint, uint);uint		bufload(Buffer*, uint, int, int*);void		bufread(Buffer*, uint, Rune*, uint);void		bufclose(Buffer*);void		bufreset(Buffer*);struct File{	Buffer;				/* the data */	Buffer		delta;		/* transcript of changes */	Buffer		epsilon;	/* inversion of delta for redo */	String		name;		/* name of associated file */	uvlong		qidpath;	/* of file when read */	uint		mtime;		/* of file when read */	int		dev;		/* of file when read */	int		unread;		/* file has not been read from disk */	long		seq;		/* if seq==0, File acts like Buffer */	long		cleanseq;	/* f->seq at last read/write of file */	int		mod;		/* file appears modified in menu */	char		rescuing;	/* sam exiting; this file unusable *///	Text		*curtext;	/* most recently used associated text *///	Text		**text;		/* list of associated texts *///	int		ntext;//	int		dumpid;		/* used in dumping zeroxed windows */	Posn		hiposn;		/* highest address touched this Mod */	Address		dot;		/* current position */	Address		ndot;		/* new current position after update */	Range		tdot;		/* what terminal thinks is current range */	Range		mark;		/* tagged spot in text (don't confuse with Mark) */	List		*rasp;		/* map of what terminal's got */	short		tag;		/* for communicating with terminal */	char		closeok;	/* ok to close file? */	char		deleted;	/* delete at completion of command */	Range		prevdot;	/* state before start of change */	Range		prevmark;	long		prevseq;	int		prevmod;};//File*		fileaddtext(File*, Text*);void		fileclose(File*);void		filedelete(File*, uint, uint);//void		filedeltext(File*, Text*);void		fileinsert(File*, uint, Rune*, uint);uint		fileload(File*, uint, int, int*);void		filemark(File*);void		filereset(File*);void		filesetname(File*, String*);void		fileundelete(File*, Buffer*, uint, uint);void		fileuninsert(File*, Buffer*, uint, uint);void		fileunsetname(File*, Buffer*);void		fileundo(File*, int, int, uint*, uint*, int);int		fileupdate(File*, int, int);int		filereadc(File*, uint);File		*fileopen(void);void		loginsert(File*, uint, Rune*, uint);void		logdelete(File*, uint, uint);void		logsetname(File*, String*);int		fileisdirty(File*);long		undoseq(File*, int);long		prevseq(Buffer*);void		raspload(File*);void		raspstart(File*);void		raspdelete(File*, uint, uint, int);void		raspinsert(File*, uint, Rune*, uint, int);void		raspdone(File*, int);/* * acme fns */void*	fbufalloc(void);void	fbuffree(void*);uint	min(uint, uint);void	cvttorunes(char*, int, Rune*, int*, int*, int*);#define	runemalloc(a)		(Rune*)emalloc((a)*sizeof(Rune))#define	runerealloc(a, b)	(Rune*)realloc((a), (b)*sizeof(Rune))#define	runemove(a, b, c)	memmove((a), (b), (c)*sizeof(Rune))int	alnum(int);int	Read(int, void*, int);void	Seek(int, long, int);int	plan9(File*, int, String*, int);int	Write(int, void*, int);int	bexecute(File*, Posn);void	cd(String*);void	closefiles(File*, String*);void	closeio(Posn);void	cmdloop(void);void	cmdupdate(void);void	compile(String*);void	copy(File*, Address);File	*current(File*);void	delete(File*);void	delfile(File*);void	dellist(List*, int);void	doubleclick(File*, Posn);void	dprint(char*, ...);void	edit(File*, int);void	*emalloc(ulong);void	*erealloc(void*, ulong);void	error(Err);void	error_c(Err, int);void	error_r(Err, char*);void	error_s(Err, char*);int	execute(File*, Posn, Posn);int	filematch(File*, String*);void	filename(File*);void	fixname(String*);void	fullname(String*);void	getcurwd(void);File	*getfile(String*);int	getname(File*, String*, int);long	getnum(int);void	hiccough(char*);void	inslist(List*, int, ...);Address	lineaddr(Posn, Address, int);List	*listalloc(int);void	listfree(List*);void	load(File*);File	*lookfile(String*);void	lookorigin(File*, Posn, Posn);int	lookup(int);void	move(File*, Address);void	moveto(File*, Range);File	*newfile(void);void	nextmatch(File*, String*, Posn, int);void	notifyf(void*, char*);void	panic(char*);void	printposn(File*, int);void	print_ss(char*, String*, String*);void	print_s(char*, String*);int	rcv(void);Range	rdata(List*, Posn, Posn);Posn	readio(File*, int*, int, int);void	rescue(void);void	resetcmd(void);void	resetsys(void);void	resetxec(void);void	rgrow(List*, Posn, Posn);void	samerr(char*);void	settempfile(void);int	skipbl(void);void	snarf(File*, Posn, Posn, Buffer*, int);void	sortname(File*);void	startup(char*, int, char**, char**);void	state(File*, int);int	statfd(int, ulong*, uvlong*, long*, long*, long*);int	statfile(char*, ulong*, uvlong*, long*, long*, long*);void	Straddc(String*, int);void	Strclose(String*);int	Strcmp(String*, String*);void	Strdelete(String*, Posn, Posn);void	Strdupl(String*, Rune*);void	Strduplstr(String*, String*);void	Strinit(String*);void	Strinit0(String*);void	Strinsert(String*, String*, Posn);void	Strinsure(String*, ulong);int	Strispre(String*, String*);void	Strzero(String*);int	Strlen(Rune*);char	*Strtoc(String*);void	syserror(char*);void	telldot(File*);void	tellpat(void);String	*tmpcstr(char*);String	*tmprstr(Rune*, int);void	freetmpstr(String*);void	termcommand(void);void	termwrite(char*);File	*tofile(String*);void	trytoclose(File*);void	trytoquit(void);int	undo(int);void	update(void);char	*waitfor(int);void	warn(Warn);void	warn_s(Warn, char*);void	warn_SS(Warn, String*, String*);void	warn_S(Warn, String*);int	whichmenu(File*);void	writef(File*);Posn	writeio(File*);Discdesc *Dstart(void);extern Rune	samname[];	/* compiler dependent */extern Rune	*left[];extern Rune	*right[];extern char	RSAM[];		/* system dependent */extern char	SAMTERM[];extern char	HOME[];extern char	TMPDIR[];extern char	SH[];extern char	SHPATH[];extern char	RX[];extern char	RXPATH[];extern char	SAMSAVECMD[];/* * acme globals */extern long		seq;extern Disk		*disk;extern char	*rsamname;	/* globals */extern char	*samterm;extern Rune	genbuf[];extern char	*genc;extern int	io;extern int	patset;extern int	quitok;extern Address	addr;extern Buffer	snarfbuf;extern Buffer	plan9buf;extern List	file;extern List	tempfile;extern File	*cmd;extern File	*curfile;extern File	*lastfile;extern Mod	modnum;extern Posn	cmdpt;extern Posn	cmdptadv;extern Rangeset	sel;extern String	curwd;extern String	cmdstr;extern String	genstr;extern String	lastpat;extern String	lastregexp;extern String	plan9cmd;extern int	downloaded;extern int	eof;extern int	bpipeok;extern int	panicking;extern Rune	empty[];extern int	termlocked;extern int	noflush;#include "mesg.h"void	outTs(Hmesg, int);void	outT0(Hmesg);void	outTl(Hmesg, long);void	outTslS(Hmesg, int, long, String*);void	outTS(Hmesg, String*);void	outTsS(Hmesg, int, String*);void	outTsllS(Hmesg, int, long, long, String*);void	outTsll(Hmesg, int, long, long);void	outTsl(Hmesg, int, long);void	outTsv(Hmesg, int, vlong);void	outflush(void);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -