|  | sizeof_1_ = 8; | 
|  | aggr _1_ | 
|  | { | 
|  | 'D' 0 hlength; | 
|  | 'D' 4 llength; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | _1_(addr) { | 
|  | complex _1_ addr; | 
|  | print("	hlength	", addr.hlength, "\n"); | 
|  | print("	llength	", addr.llength, "\n"); | 
|  | }; | 
|  |  | 
|  | sizeof_2_ = 8; | 
|  | aggr _2_ | 
|  | { | 
|  | 'V' 0 length; | 
|  | { | 
|  | 'D' 0 hlength; | 
|  | 'D' 4 llength; | 
|  | }; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | _2_(addr) { | 
|  | complex _2_ addr; | 
|  | print("	length	", addr.length, "\n"); | 
|  | print("_1_ {\n"); | 
|  | _1_(addr+0); | 
|  | print("}\n"); | 
|  | }; | 
|  |  | 
|  | UTFmax = 3; | 
|  | Runesync = 128; | 
|  | Runeself = 128; | 
|  | Runeerror = 128; | 
|  | sizeofFconv = 24; | 
|  | aggr Fconv | 
|  | { | 
|  | 'X' 0 out; | 
|  | 'X' 4 eout; | 
|  | 'D' 8 f1; | 
|  | 'D' 12 f2; | 
|  | 'D' 16 f3; | 
|  | 'D' 20 chr; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Fconv(addr) { | 
|  | complex Fconv addr; | 
|  | print("	out	", addr.out\X, "\n"); | 
|  | print("	eout	", addr.eout\X, "\n"); | 
|  | print("	f1	", addr.f1, "\n"); | 
|  | print("	f2	", addr.f2, "\n"); | 
|  | print("	f3	", addr.f3, "\n"); | 
|  | print("	chr	", addr.chr, "\n"); | 
|  | }; | 
|  |  | 
|  | sizeofTm = 40; | 
|  | aggr Tm | 
|  | { | 
|  | 'D' 0 sec; | 
|  | 'D' 4 min; | 
|  | 'D' 8 hour; | 
|  | 'D' 12 mday; | 
|  | 'D' 16 mon; | 
|  | 'D' 20 year; | 
|  | 'D' 24 wday; | 
|  | 'D' 28 yday; | 
|  | 'a' 32 zone; | 
|  | 'D' 36 tzoff; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Tm(addr) { | 
|  | complex Tm addr; | 
|  | print("	sec	", addr.sec, "\n"); | 
|  | print("	min	", addr.min, "\n"); | 
|  | print("	hour	", addr.hour, "\n"); | 
|  | print("	mday	", addr.mday, "\n"); | 
|  | print("	mon	", addr.mon, "\n"); | 
|  | print("	year	", addr.year, "\n"); | 
|  | print("	wday	", addr.wday, "\n"); | 
|  | print("	yday	", addr.yday, "\n"); | 
|  | print("	zone	", addr.zone, "\n"); | 
|  | print("	tzoff	", addr.tzoff, "\n"); | 
|  | }; | 
|  |  | 
|  | PNPROC = 1; | 
|  | PNGROUP = 2; | 
|  | sizeofLock = 4; | 
|  | aggr Lock | 
|  | { | 
|  | 'D' 0 val; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Lock(addr) { | 
|  | complex Lock addr; | 
|  | print("	val	", addr.val, "\n"); | 
|  | }; | 
|  |  | 
|  | sizeofQLp = 12; | 
|  | aggr QLp | 
|  | { | 
|  | 'D' 0 inuse; | 
|  | 'A' QLp 4 next; | 
|  | 'C' 8 state; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | QLp(addr) { | 
|  | complex QLp addr; | 
|  | print("	inuse	", addr.inuse, "\n"); | 
|  | print("	next	", addr.next\X, "\n"); | 
|  | print("	state	", addr.state, "\n"); | 
|  | }; | 
|  |  | 
|  | sizeofQLock = 16; | 
|  | aggr QLock | 
|  | { | 
|  | Lock 0 lock; | 
|  | 'D' 4 locked; | 
|  | 'A' QLp 8 $head; | 
|  | 'A' QLp 12 $tail; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | QLock(addr) { | 
|  | complex QLock addr; | 
|  | print("Lock lock {\n"); | 
|  | Lock(addr.lock); | 
|  | print("}\n"); | 
|  | print("	locked	", addr.locked, "\n"); | 
|  | print("	$head	", addr.$head\X, "\n"); | 
|  | print("	$tail	", addr.$tail\X, "\n"); | 
|  | }; | 
|  |  | 
|  | sizeofRWLock = 20; | 
|  | aggr RWLock | 
|  | { | 
|  | Lock 0 lock; | 
|  | 'D' 4 readers; | 
|  | 'D' 8 writer; | 
|  | 'A' QLp 12 $head; | 
|  | 'A' QLp 16 $tail; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | RWLock(addr) { | 
|  | complex RWLock addr; | 
|  | print("Lock lock {\n"); | 
|  | Lock(addr.lock); | 
|  | print("}\n"); | 
|  | print("	readers	", addr.readers, "\n"); | 
|  | print("	writer	", addr.writer, "\n"); | 
|  | print("	$head	", addr.$head\X, "\n"); | 
|  | print("	$tail	", addr.$tail\X, "\n"); | 
|  | }; | 
|  |  | 
|  | RFNAMEG = 1; | 
|  | RFENVG = 2; | 
|  | RFFDG = 4; | 
|  | RFNOTEG = 8; | 
|  | RFPROC = 16; | 
|  | RFMEM = 32; | 
|  | RFNOWAIT = 64; | 
|  | RFCNAMEG = 1024; | 
|  | RFCENVG = 2048; | 
|  | RFCFDG = 4096; | 
|  | RFREND = 8192; | 
|  | sizeofQid = 8; | 
|  | aggr Qid | 
|  | { | 
|  | 'U' 0 path; | 
|  | 'U' 4 vers; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Qid(addr) { | 
|  | complex Qid addr; | 
|  | print("	path	", addr.path, "\n"); | 
|  | print("	vers	", addr.vers, "\n"); | 
|  | }; | 
|  |  | 
|  | sizeofDir = 116; | 
|  | aggr Dir | 
|  | { | 
|  | 'a' 0 name; | 
|  | 'a' 28 uid; | 
|  | 'a' 56 gid; | 
|  | Qid 84 qid; | 
|  | 'U' 92 mode; | 
|  | 'D' 96 atime; | 
|  | 'D' 100 mtime; | 
|  | { | 
|  | 'V' 104 length; | 
|  | { | 
|  | 'D' 104 hlength; | 
|  | 'D' 108 llength; | 
|  | }; | 
|  | }; | 
|  | 'u' 112 type; | 
|  | 'u' 114 dev; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Dir(addr) { | 
|  | complex Dir addr; | 
|  | print("	name	", addr.name, "\n"); | 
|  | print("	uid	", addr.uid, "\n"); | 
|  | print("	gid	", addr.gid, "\n"); | 
|  | print("Qid qid {\n"); | 
|  | Qid(addr.qid); | 
|  | print("}\n"); | 
|  | print("	mode	", addr.mode, "\n"); | 
|  | print("	atime	", addr.atime, "\n"); | 
|  | print("	mtime	", addr.mtime, "\n"); | 
|  | print("_2_ {\n"); | 
|  | _2_(addr+104); | 
|  | print("}\n"); | 
|  | print("	type	", addr.type, "\n"); | 
|  | print("	dev	", addr.dev, "\n"); | 
|  | }; | 
|  |  | 
|  | sizeofWaitmsg = 112; | 
|  | aggr Waitmsg | 
|  | { | 
|  | 'a' 0 pid; | 
|  | 'a' 12 time; | 
|  | 'a' 48 msg; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Waitmsg(addr) { | 
|  | complex Waitmsg addr; | 
|  | print("	pid	", addr.pid, "\n"); | 
|  | print("	time	", addr.time, "\n"); | 
|  | print("	msg	", addr.msg, "\n"); | 
|  | }; | 
|  |  | 
|  | DBlack = 255; | 
|  | DBlue = 201; | 
|  | DRed = 15; | 
|  | DYellow = 3; | 
|  | DGreen = 192; | 
|  | DWhite = 0; | 
|  | Displaybufsize = 8000; | 
|  | ICOSSCALE = 1024; | 
|  | Borderwidth = 4; | 
|  | Refbackup = 0; | 
|  | Refnone = 1; | 
|  | Refmesg = 2; | 
|  | Endsquare = 0; | 
|  | Enddisc = 1; | 
|  | Endarrow = 2; | 
|  | Endmask = 31; | 
|  | sizeofPoint = 8; | 
|  | aggr Point | 
|  | { | 
|  | 'D' 0 x; | 
|  | 'D' 4 y; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Point(addr) { | 
|  | complex Point addr; | 
|  | print("	x	", addr.x, "\n"); | 
|  | print("	y	", addr.y, "\n"); | 
|  | }; | 
|  |  | 
|  | sizeofRectangle = 16; | 
|  | aggr Rectangle | 
|  | { | 
|  | Point 0 min; | 
|  | Point 8 max; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Rectangle(addr) { | 
|  | complex Rectangle addr; | 
|  | print("Point min {\n"); | 
|  | Point(addr.min); | 
|  | print("}\n"); | 
|  | print("Point max {\n"); | 
|  | Point(addr.max); | 
|  | print("}\n"); | 
|  | }; | 
|  |  | 
|  | sizeofScreen = 16; | 
|  | aggr Screen | 
|  | { | 
|  | 'X' 0 display; | 
|  | 'D' 4 id; | 
|  | 'X' 8 image; | 
|  | 'X' 12 fill; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Screen(addr) { | 
|  | complex Screen addr; | 
|  | print("	display	", addr.display\X, "\n"); | 
|  | print("	id	", addr.id, "\n"); | 
|  | print("	image	", addr.image\X, "\n"); | 
|  | print("	fill	", addr.fill\X, "\n"); | 
|  | }; | 
|  |  | 
|  | sizeofDisplay = 8156; | 
|  | aggr Display | 
|  | { | 
|  | QLock 0 qlock; | 
|  | 'D' 16 dirno; | 
|  | 'D' 20 fd; | 
|  | 'D' 24 reffd; | 
|  | 'D' 28 ctlfd; | 
|  | 'D' 32 imageid; | 
|  | 'D' 36 $local; | 
|  | 'D' 40 ldepth; | 
|  | 'X' 44 error; | 
|  | 'X' 48 devdir; | 
|  | 'X' 52 windir; | 
|  | 'a' 56 oldlabel; | 
|  | 'U' 120 dataqid; | 
|  | 'X' 124 ones; | 
|  | 'X' 128 zeros; | 
|  | 'X' 132 image; | 
|  | 'a' 136 buf; | 
|  | 'X' 8140 bufp; | 
|  | 'X' 8144 defaultfont; | 
|  | 'X' 8148 defaultsubfont; | 
|  | 'X' 8152 windows; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Display(addr) { | 
|  | complex Display addr; | 
|  | print("QLock qlock {\n"); | 
|  | QLock(addr.qlock); | 
|  | print("}\n"); | 
|  | print("	dirno	", addr.dirno, "\n"); | 
|  | print("	fd	", addr.fd, "\n"); | 
|  | print("	reffd	", addr.reffd, "\n"); | 
|  | print("	ctlfd	", addr.ctlfd, "\n"); | 
|  | print("	imageid	", addr.imageid, "\n"); | 
|  | print("	$local	", addr.$local, "\n"); | 
|  | print("	ldepth	", addr.ldepth, "\n"); | 
|  | print("	error	", addr.error\X, "\n"); | 
|  | print("	devdir	", addr.devdir\X, "\n"); | 
|  | print("	windir	", addr.windir\X, "\n"); | 
|  | print("	oldlabel	", addr.oldlabel, "\n"); | 
|  | print("	dataqid	", addr.dataqid, "\n"); | 
|  | print("	ones	", addr.ones\X, "\n"); | 
|  | print("	zeros	", addr.zeros\X, "\n"); | 
|  | print("	image	", addr.image\X, "\n"); | 
|  | print("	buf	", addr.buf, "\n"); | 
|  | print("	bufp	", addr.bufp\X, "\n"); | 
|  | print("	defaultfont	", addr.defaultfont\X, "\n"); | 
|  | print("	defaultsubfont	", addr.defaultsubfont\X, "\n"); | 
|  | print("	windows	", addr.windows\X, "\n"); | 
|  | }; | 
|  |  | 
|  | sizeofImage = 56; | 
|  | aggr Image | 
|  | { | 
|  | 'A' Display 0 display; | 
|  | 'D' 4 id; | 
|  | Rectangle 8 r; | 
|  | Rectangle 24 clipr; | 
|  | 'D' 40 ldepth; | 
|  | 'D' 44 repl; | 
|  | 'A' Screen 48 screen; | 
|  | 'A' Image 52 next; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Image(addr) { | 
|  | complex Image addr; | 
|  | print("	display	", addr.display\X, "\n"); | 
|  | print("	id	", addr.id, "\n"); | 
|  | print("Rectangle r {\n"); | 
|  | Rectangle(addr.r); | 
|  | print("}\n"); | 
|  | print("Rectangle clipr {\n"); | 
|  | Rectangle(addr.clipr); | 
|  | print("}\n"); | 
|  | print("	ldepth	", addr.ldepth, "\n"); | 
|  | print("	repl	", addr.repl, "\n"); | 
|  | print("	screen	", addr.screen\X, "\n"); | 
|  | print("	next	", addr.next\X, "\n"); | 
|  | }; | 
|  |  | 
|  | sizeofRGB = 12; | 
|  | aggr RGB | 
|  | { | 
|  | 'U' 0 red; | 
|  | 'U' 4 green; | 
|  | 'U' 8 blue; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | RGB(addr) { | 
|  | complex RGB addr; | 
|  | print("	red	", addr.red, "\n"); | 
|  | print("	green	", addr.green, "\n"); | 
|  | print("	blue	", addr.blue, "\n"); | 
|  | }; | 
|  |  | 
|  | sizeofFontchar = 8; | 
|  | aggr Fontchar | 
|  | { | 
|  | 'D' 0 x; | 
|  | 'b' 4 top; | 
|  | 'b' 5 bottom; | 
|  | 'C' 6 left; | 
|  | 'b' 7 width; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Fontchar(addr) { | 
|  | complex Fontchar addr; | 
|  | print("	x	", addr.x, "\n"); | 
|  | print("	top	", addr.top, "\n"); | 
|  | print("	bottom	", addr.bottom, "\n"); | 
|  | print("	left	", addr.left, "\n"); | 
|  | print("	width	", addr.width, "\n"); | 
|  | }; | 
|  |  | 
|  | sizeofSubfont = 16; | 
|  | aggr Subfont | 
|  | { | 
|  | 'X' 0 name; | 
|  | 'd' 4 n; | 
|  | 'b' 6 height; | 
|  | 'C' 7 ascent; | 
|  | 'A' Fontchar 8 info; | 
|  | 'A' Image 12 bits; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Subfont(addr) { | 
|  | complex Subfont addr; | 
|  | print("	name	", addr.name\X, "\n"); | 
|  | print("	n	", addr.n, "\n"); | 
|  | print("	height	", addr.height, "\n"); | 
|  | print("	ascent	", addr.ascent, "\n"); | 
|  | print("	info	", addr.info\X, "\n"); | 
|  | print("	bits	", addr.bits\X, "\n"); | 
|  | }; | 
|  |  | 
|  | LOG2NFCACHE = 6; | 
|  | NFCACHE = 64; | 
|  | NFLOOK = 5; | 
|  | NFSUBF = 2; | 
|  | MAXFCACHE = 1029; | 
|  | MAXSUBF = 50; | 
|  | DSUBF = 4; | 
|  | SUBFAGE = 10000; | 
|  | CACHEAGE = 10000; | 
|  | sizeofCachefont = 16; | 
|  | aggr Cachefont | 
|  | { | 
|  | 'u' 0 min; | 
|  | 'u' 2 max; | 
|  | 'D' 4 offset; | 
|  | 'X' 8 name; | 
|  | 'X' 12 subfontname; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Cachefont(addr) { | 
|  | complex Cachefont addr; | 
|  | print("	min	", addr.min, "\n"); | 
|  | print("	max	", addr.max, "\n"); | 
|  | print("	offset	", addr.offset, "\n"); | 
|  | print("	name	", addr.name\X, "\n"); | 
|  | print("	subfontname	", addr.subfontname\X, "\n"); | 
|  | }; | 
|  |  | 
|  | sizeofCacheinfo = 8; | 
|  | aggr Cacheinfo | 
|  | { | 
|  | 'u' 0 x; | 
|  | 'b' 2 width; | 
|  | 'C' 3 left; | 
|  | 'u' 4 value; | 
|  | 'u' 6 age; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Cacheinfo(addr) { | 
|  | complex Cacheinfo addr; | 
|  | print("	x	", addr.x, "\n"); | 
|  | print("	width	", addr.width, "\n"); | 
|  | print("	left	", addr.left, "\n"); | 
|  | print("	value	", addr.value, "\n"); | 
|  | print("	age	", addr.age, "\n"); | 
|  | }; | 
|  |  | 
|  | sizeofCachesubf = 12; | 
|  | aggr Cachesubf | 
|  | { | 
|  | 'U' 0 age; | 
|  | 'A' Cachefont 4 cf; | 
|  | 'A' Subfont 8 f; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Cachesubf(addr) { | 
|  | complex Cachesubf addr; | 
|  | print("	age	", addr.age, "\n"); | 
|  | print("	cf	", addr.cf\X, "\n"); | 
|  | print("	f	", addr.f\X, "\n"); | 
|  | }; | 
|  |  | 
|  | sizeofFont = 52; | 
|  | aggr Font | 
|  | { | 
|  | 'X' 0 name; | 
|  | 'A' Display 4 display; | 
|  | 'd' 8 height; | 
|  | 'd' 10 ascent; | 
|  | 'D' 12 maxldepth; | 
|  | 'd' 16 width; | 
|  | 'd' 18 ldepth; | 
|  | 'd' 20 nsub; | 
|  | 'U' 24 age; | 
|  | 'D' 28 ncache; | 
|  | 'D' 32 nsubf; | 
|  | 'A' Cacheinfo 36 cache; | 
|  | 'A' Cachesubf 40 subf; | 
|  | 'A' Cachefont 44 sub; | 
|  | 'A' Image 48 cacheimage; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Font(addr) { | 
|  | complex Font addr; | 
|  | print("	name	", addr.name\X, "\n"); | 
|  | print("	display	", addr.display\X, "\n"); | 
|  | print("	height	", addr.height, "\n"); | 
|  | print("	ascent	", addr.ascent, "\n"); | 
|  | print("	maxldepth	", addr.maxldepth, "\n"); | 
|  | print("	width	", addr.width, "\n"); | 
|  | print("	ldepth	", addr.ldepth, "\n"); | 
|  | print("	nsub	", addr.nsub, "\n"); | 
|  | print("	age	", addr.age, "\n"); | 
|  | print("	ncache	", addr.ncache, "\n"); | 
|  | print("	nsubf	", addr.nsubf, "\n"); | 
|  | print("	cache	", addr.cache\X, "\n"); | 
|  | print("	subf	", addr.subf\X, "\n"); | 
|  | print("	sub	", addr.sub\X, "\n"); | 
|  | print("	cacheimage	", addr.cacheimage\X, "\n"); | 
|  | }; | 
|  |  | 
|  | complex Point ZP; | 
|  | complex Rectangle ZR; | 
|  | complex Display display; | 
|  | complex Font font; | 
|  | complex Image screen; | 
|  | sizeofAlt = 20; | 
|  | aggr Alt | 
|  | { | 
|  | 'X' 0 c; | 
|  | 'X' 4 v; | 
|  | 'D' 8 op; | 
|  | 'X' 12 tag; | 
|  | 'U' 16 q; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Alt(addr) { | 
|  | complex Alt addr; | 
|  | print("	c	", addr.c\X, "\n"); | 
|  | print("	v	", addr.v\X, "\n"); | 
|  | print("	op	", addr.op, "\n"); | 
|  | print("	tag	", addr.tag\X, "\n"); | 
|  | print("	q	", addr.q, "\n"); | 
|  | }; | 
|  |  | 
|  | sizeofRef = 4; | 
|  | aggr Ref | 
|  | { | 
|  | 'D' 0 ref; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Ref(addr) { | 
|  | complex Ref addr; | 
|  | print("	ref	", addr.ref, "\n"); | 
|  | }; | 
|  |  | 
|  | sizeofCursor = 72; | 
|  | aggr Cursor | 
|  | { | 
|  | Point 0 offset; | 
|  | 'a' 8 clr; | 
|  | 'a' 40 set; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Cursor(addr) { | 
|  | complex Cursor addr; | 
|  | print("Point offset {\n"); | 
|  | Point(addr.offset); | 
|  | print("}\n"); | 
|  | print("	clr	", addr.clr, "\n"); | 
|  | print("	set	", addr.set, "\n"); | 
|  | }; | 
|  |  | 
|  | sizeofMouse = 16; | 
|  | aggr Mouse | 
|  | { | 
|  | 'D' 0 buttons; | 
|  | Point 4 xy; | 
|  | 'U' 12 msec; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Mouse(addr) { | 
|  | complex Mouse addr; | 
|  | print("	buttons	", addr.buttons, "\n"); | 
|  | print("Point xy {\n"); | 
|  | Point(addr.xy); | 
|  | print("}\n"); | 
|  | print("	msec	", addr.msec, "\n"); | 
|  | }; | 
|  |  | 
|  | sizeofMousectl = 44; | 
|  | aggr Mousectl | 
|  | { | 
|  | { | 
|  | 'D' 0 buttons; | 
|  | Point 4 xy; | 
|  | 'U' 12 msec; | 
|  | }; | 
|  | 'X' 16 c; | 
|  | 'X' 20 reshapec; | 
|  | 'X' 24 file; | 
|  | 'D' 28 mfd; | 
|  | 'D' 32 cfd; | 
|  | 'D' 36 pid; | 
|  | 'A' Image 40 image; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Mousectl(addr) { | 
|  | complex Mousectl addr; | 
|  | print("Mouse {\n"); | 
|  | Mouse(addr+0); | 
|  | print("}\n"); | 
|  | print("	c	", addr.c\X, "\n"); | 
|  | print("	reshapec	", addr.reshapec\X, "\n"); | 
|  | print("	file	", addr.file\X, "\n"); | 
|  | print("	mfd	", addr.mfd, "\n"); | 
|  | print("	cfd	", addr.cfd, "\n"); | 
|  | print("	pid	", addr.pid, "\n"); | 
|  | print("	image	", addr.image\X, "\n"); | 
|  | }; | 
|  |  | 
|  | sizeofMenu = 12; | 
|  | aggr Menu | 
|  | { | 
|  | 'X' 0 item; | 
|  | 'X' 4 gen; | 
|  | 'D' 8 lasthit; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Menu(addr) { | 
|  | complex Menu addr; | 
|  | print("	item	", addr.item\X, "\n"); | 
|  | print("	gen	", addr.gen\X, "\n"); | 
|  | print("	lasthit	", addr.lasthit, "\n"); | 
|  | }; | 
|  |  | 
|  | sizeofKeyboardctl = 20; | 
|  | aggr Keyboardctl | 
|  | { | 
|  | 'X' 0 c; | 
|  | 'X' 4 file; | 
|  | 'D' 8 consfd; | 
|  | 'D' 12 ctlfd; | 
|  | 'D' 16 pid; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Keyboardctl(addr) { | 
|  | complex Keyboardctl addr; | 
|  | print("	c	", addr.c\X, "\n"); | 
|  | print("	file	", addr.file\X, "\n"); | 
|  | print("	consfd	", addr.consfd, "\n"); | 
|  | print("	ctlfd	", addr.ctlfd, "\n"); | 
|  | print("	pid	", addr.pid, "\n"); | 
|  | }; | 
|  |  | 
|  | BACK = 0; | 
|  | HIGH = 1; | 
|  | BORD = 2; | 
|  | TEXT = 3; | 
|  | HTEXT = 4; | 
|  | NCOL = 5; | 
|  | sizeof_3_ = 4; | 
|  | aggr _3_ | 
|  | { | 
|  | 'd' 0 bc; | 
|  | 'd' 2 minwid; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | _3_(addr) { | 
|  | complex _3_ addr; | 
|  | print("	bc	", addr.bc, "\n"); | 
|  | print("	minwid	", addr.minwid, "\n"); | 
|  | }; | 
|  |  | 
|  | sizeof_4_ = 4; | 
|  | aggr _4_ | 
|  | { | 
|  | 'X' 0 ptr; | 
|  | { | 
|  | 'd' 0 bc; | 
|  | 'd' 2 minwid; | 
|  | }; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | _4_(addr) { | 
|  | complex _4_ addr; | 
|  | print("	ptr	", addr.ptr\X, "\n"); | 
|  | print("_3_ {\n"); | 
|  | _3_(addr+0); | 
|  | print("}\n"); | 
|  | }; | 
|  |  | 
|  | sizeofFrbox = 12; | 
|  | aggr Frbox | 
|  | { | 
|  | 'D' 0 wid; | 
|  | 'D' 4 nrune; | 
|  | { | 
|  | 'X' 8 ptr; | 
|  | { | 
|  | 'd' 8 bc; | 
|  | 'd' 10 minwid; | 
|  | }; | 
|  | }; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Frbox(addr) { | 
|  | complex Frbox addr; | 
|  | print("	wid	", addr.wid, "\n"); | 
|  | print("	nrune	", addr.nrune, "\n"); | 
|  | print("_4_ {\n"); | 
|  | _4_(addr+8); | 
|  | print("}\n"); | 
|  | }; | 
|  |  | 
|  | complex Font font; | 
|  | complex Display display; | 
|  | sizeofFrame = 108; | 
|  | aggr Frame | 
|  | { | 
|  | 'A' Font 0 font; | 
|  | 'A' Display 4 display; | 
|  | 'A' Image 8 b; | 
|  | 'a' 12 cols; | 
|  | Rectangle 32 r; | 
|  | Rectangle 48 entire; | 
|  | 'X' 64 scroll; | 
|  | 'A' Frbox 68 box; | 
|  | 'U' 72 p0; | 
|  | 'U' 76 p1; | 
|  | 'u' 80 nbox; | 
|  | 'u' 82 nalloc; | 
|  | 'u' 84 maxtab; | 
|  | 'u' 86 nchars; | 
|  | 'u' 88 nlines; | 
|  | 'u' 90 maxlines; | 
|  | 'u' 92 lastlinefull; | 
|  | 'u' 94 modified; | 
|  | 'A' Image 96 tick; | 
|  | 'A' Image 100 tickback; | 
|  | 'D' 104 ticked; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Frame(addr) { | 
|  | complex Frame addr; | 
|  | print("	font	", addr.font\X, "\n"); | 
|  | print("	display	", addr.display\X, "\n"); | 
|  | print("	b	", addr.b\X, "\n"); | 
|  | print("	cols	", addr.cols, "\n"); | 
|  | print("Rectangle r {\n"); | 
|  | Rectangle(addr.r); | 
|  | print("}\n"); | 
|  | print("Rectangle entire {\n"); | 
|  | Rectangle(addr.entire); | 
|  | print("}\n"); | 
|  | print("	scroll	", addr.scroll\X, "\n"); | 
|  | print("	box	", addr.box\X, "\n"); | 
|  | print("	p0	", addr.p0, "\n"); | 
|  | print("	p1	", addr.p1, "\n"); | 
|  | print("	nbox	", addr.nbox, "\n"); | 
|  | print("	nalloc	", addr.nalloc, "\n"); | 
|  | print("	maxtab	", addr.maxtab, "\n"); | 
|  | print("	nchars	", addr.nchars, "\n"); | 
|  | print("	nlines	", addr.nlines, "\n"); | 
|  | print("	maxlines	", addr.maxlines, "\n"); | 
|  | print("	lastlinefull	", addr.lastlinefull, "\n"); | 
|  | print("	modified	", addr.modified, "\n"); | 
|  | print("	tick	", addr.tick\X, "\n"); | 
|  | print("	tickback	", addr.tickback\X, "\n"); | 
|  | print("	ticked	", addr.ticked, "\n"); | 
|  | }; | 
|  |  | 
|  | None = 0; | 
|  | Some = 1; | 
|  | All = 2; | 
|  | Clicktime = 1000; | 
|  | sizeofFlayer = 172; | 
|  | aggr Flayer | 
|  | { | 
|  | Frame 0 f; | 
|  | 'D' 108 origin; | 
|  | 'D' 112 p0; | 
|  | 'D' 116 p1; | 
|  | 'D' 120 click; | 
|  | 'X' 124 textfn; | 
|  | 'D' 128 user0; | 
|  | 'X' 132 user1; | 
|  | Rectangle 136 entire; | 
|  | Rectangle 152 scroll; | 
|  | 'D' 168 visible; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Flayer(addr) { | 
|  | complex Flayer addr; | 
|  | print("Frame f {\n"); | 
|  | Frame(addr.f); | 
|  | print("}\n"); | 
|  | print("	origin	", addr.origin, "\n"); | 
|  | print("	p0	", addr.p0, "\n"); | 
|  | print("	p1	", addr.p1, "\n"); | 
|  | print("	click	", addr.click, "\n"); | 
|  | print("	textfn	", addr.textfn\X, "\n"); | 
|  | print("	user0	", addr.user0, "\n"); | 
|  | print("	user1	", addr.user1\X, "\n"); | 
|  | print("Rectangle entire {\n"); | 
|  | Rectangle(addr.entire); | 
|  | print("}\n"); | 
|  | print("Rectangle scroll {\n"); | 
|  | Rectangle(addr.scroll); | 
|  | print("}\n"); | 
|  | print("	visible	", addr.visible, "\n"); | 
|  | }; | 
|  |  | 
|  | Up = 0; | 
|  | Down = 1; | 
|  | sizeofSection = 12; | 
|  | aggr Section | 
|  | { | 
|  | 'D' 0 nrunes; | 
|  | 'X' 4 text; | 
|  | 'A' Section 8 next; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Section(addr) { | 
|  | complex Section addr; | 
|  | print("	nrunes	", addr.nrunes, "\n"); | 
|  | print("	text	", addr.text\X, "\n"); | 
|  | print("	next	", addr.next\X, "\n"); | 
|  | }; | 
|  |  | 
|  | sizeofRasp = 8; | 
|  | aggr Rasp | 
|  | { | 
|  | 'D' 0 nrunes; | 
|  | 'A' Section 4 sect; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Rasp(addr) { | 
|  | complex Rasp addr; | 
|  | print("	nrunes	", addr.nrunes, "\n"); | 
|  | print("	sect	", addr.sect\X, "\n"); | 
|  | }; | 
|  |  | 
|  | sizeofText = 876; | 
|  | aggr Text | 
|  | { | 
|  | Rasp 0 rasp; | 
|  | 'd' 8 nwin; | 
|  | 'd' 10 front; | 
|  | 'u' 12 tag; | 
|  | 'C' 14 lock; | 
|  | 'a' 16 l; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Text(addr) { | 
|  | complex Text addr; | 
|  | print("Rasp rasp {\n"); | 
|  | Rasp(addr.rasp); | 
|  | print("}\n"); | 
|  | print("	nwin	", addr.nwin, "\n"); | 
|  | print("	front	", addr.front, "\n"); | 
|  | print("	tag	", addr.tag, "\n"); | 
|  | print("	lock	", addr.lock, "\n"); | 
|  | print("	l	", addr.l, "\n"); | 
|  | }; | 
|  |  | 
|  | sizeofReadbuf = 8196; | 
|  | aggr Readbuf | 
|  | { | 
|  | 'd' 0 n; | 
|  | 'a' 2 data; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Readbuf(addr) { | 
|  | complex Readbuf addr; | 
|  | print("	n	", addr.n, "\n"); | 
|  | print("	data	", addr.data, "\n"); | 
|  | }; | 
|  |  | 
|  | RHost = 0; | 
|  | RKeyboard = 1; | 
|  | RMouse = 2; | 
|  | RPlumb = 3; | 
|  | RReshape = 4; | 
|  | NRes = 5; | 
|  | complex Cursor bullseye; | 
|  | complex Cursor deadmouse; | 
|  | complex Cursor lockarrow; | 
|  | complex Cursor cursor; | 
|  | complex Flayer which; | 
|  | complex Flayer work; | 
|  | complex Text cmd; | 
|  | complex Mousectl mousectl; | 
|  | complex Keyboardctl keyboardctl; | 
|  | complex Mouse mousep; | 
|  | Tversion = 0; | 
|  | Tstartcmdfile = 1; | 
|  | Tcheck = 2; | 
|  | Trequest = 3; | 
|  | Torigin = 4; | 
|  | Tstartfile = 5; | 
|  | Tworkfile = 6; | 
|  | Ttype = 7; | 
|  | Tcut = 8; | 
|  | Tpaste = 9; | 
|  | Tsnarf = 10; | 
|  | Tstartnewfile = 11; | 
|  | Twrite = 12; | 
|  | Tclose = 13; | 
|  | Tlook = 14; | 
|  | Tsearch = 15; | 
|  | Tsend = 16; | 
|  | Tdclick = 17; | 
|  | Tstartsnarf = 18; | 
|  | Tsetsnarf = 19; | 
|  | Tack = 20; | 
|  | Texit = 21; | 
|  | Tplumb = 22; | 
|  | TMAX = 23; | 
|  | Hversion = 0; | 
|  | Hbindname = 1; | 
|  | Hcurrent = 2; | 
|  | Hnewname = 3; | 
|  | Hmovname = 4; | 
|  | Hgrow = 5; | 
|  | Hcheck0 = 6; | 
|  | Hcheck = 7; | 
|  | Hunlock = 8; | 
|  | Hdata = 9; | 
|  | Horigin = 10; | 
|  | Hunlockfile = 11; | 
|  | Hsetdot = 12; | 
|  | Hgrowdata = 13; | 
|  | Hmoveto = 14; | 
|  | Hclean = 15; | 
|  | Hdirty = 16; | 
|  | Hcut = 17; | 
|  | Hsetpat = 18; | 
|  | Hdelname = 19; | 
|  | Hclose = 20; | 
|  | Hsetsnarf = 21; | 
|  | Hsnarflen = 22; | 
|  | Hack = 23; | 
|  | Hexit = 24; | 
|  | Hplumb = 25; | 
|  | HMAX = 26; | 
|  | sizeofHeader = 4; | 
|  | aggr Header | 
|  | { | 
|  | 'b' 0 type; | 
|  | 'b' 1 count0; | 
|  | 'b' 2 count1; | 
|  | 'a' 3 data; | 
|  | }; | 
|  |  | 
|  | defn | 
|  | Header(addr) { | 
|  | complex Header addr; | 
|  | print("	type	", addr.type, "\n"); | 
|  | print("	count0	", addr.count0, "\n"); | 
|  | print("	count1	", addr.count1, "\n"); | 
|  | print("	data	", addr.data, "\n"); | 
|  | }; | 
|  |  | 
|  | complex Text cmd; | 
|  | complex Cursor cursor; | 
|  | complex Flayer which; | 
|  | complex Flayer work; | 
|  | complex Text threadmain:t; | 
|  | complex Rectangle threadmain:r; | 
|  | complex Flayer threadmain:nwhich; | 
|  | complex Flayer current:nw; | 
|  | complex Text current:t; | 
|  | complex Flayer closeup:l; | 
|  | complex Text closeup:t; | 
|  | complex Text findl:t; | 
|  | complex Flayer duplicate:l; | 
|  | complex Rectangle duplicate:r; | 
|  | complex Font duplicate:f; | 
|  | complex Text duplicate:t; | 
|  | complex Flayer duplicate:nl; | 
|  | complex Rectangle getr:rp; | 
|  | complex Point getr:p; | 
|  | complex Rectangle getr:r; | 
|  | complex Text snarf:t; | 
|  | complex Flayer snarf:l; | 
|  | complex Text cut:t; | 
|  | complex Flayer cut:l; | 
|  | complex Text paste:t; | 
|  | complex Flayer scrorigin:l; | 
|  | complex Text scrorigin:t; | 
|  | complex Rasp raspc:r; | 
|  | complex Rasp ctlw:r; | 
|  | complex Rasp ctlu:r; | 
|  | complex Flayer center:l; | 
|  | complex Text center:t; | 
|  | complex Flayer onethird:l; | 
|  | complex Text onethird:t; | 
|  | complex Rectangle onethird:s; | 
|  | complex Text flushtyping:t; | 
|  | complex Flayer type:l; | 
|  | complex Text type:t; | 
|  | complex Flayer gettext:l; | 
|  | complex Text gettext:t; | 
|  | complex Flayer scrtotal:l; |