xref: /inferno-os/appl/charon/chutils.m (revision 62d7827bc358c000db9ff48fe61bd28ac352a884)
137da2899SCharles.ForsythCharonUtils: module
237da2899SCharles.Forsyth{
337da2899SCharles.Forsyth	PATH: con "/dis/charon/chutils.dis";
437da2899SCharles.Forsyth
537da2899SCharles.Forsyth	# Modules for everyone to share
637da2899SCharles.Forsyth	C: Ctype;
737da2899SCharles.Forsyth	E: Events;
837da2899SCharles.Forsyth	G: Gui;
937da2899SCharles.Forsyth	L: Layout;
1037da2899SCharles.Forsyth	I: Img;
1137da2899SCharles.Forsyth	B: Build;
1237da2899SCharles.Forsyth	LX: Lex;
1337da2899SCharles.Forsyth	J: Script;
1437da2899SCharles.Forsyth	CH: Charon;
1537da2899SCharles.Forsyth	CK: Cookiesrv;
16*62d7827bScharles forsyth	DI: Dial;
1737da2899SCharles.Forsyth
1837da2899SCharles.Forsyth	# HTTP methods
1937da2899SCharles.Forsyth	HGet, HPost : con iota;
2037da2899SCharles.Forsyth	hmeth: array of string;
2137da2899SCharles.Forsyth
2237da2899SCharles.Forsyth	# Media types (must track mnames in chutils.b)
2337da2899SCharles.Forsyth	ApplMsword, ApplOctets, ApplPdf, ApplPostscript, ApplRtf,
2437da2899SCharles.Forsyth	ApplFramemaker, ApplMsexcel, ApplMspowerpoint, UnknownType,
2537da2899SCharles.Forsyth
2637da2899SCharles.Forsyth	Audio32kadpcm, AudioBasic,
2737da2899SCharles.Forsyth
2837da2899SCharles.Forsyth	ImageCgm, ImageG3fax, ImageGif, ImageIef, ImageJpeg, ImagePng, ImageTiff,
2937da2899SCharles.Forsyth	ImageXBit, ImageXBit2, ImageXBitmulti, ImageXInfernoBit, ImageXXBitmap,
3037da2899SCharles.Forsyth
3137da2899SCharles.Forsyth	ModelVrml,
3237da2899SCharles.Forsyth
3337da2899SCharles.Forsyth	MultiDigest, MultiMixed,
3437da2899SCharles.Forsyth
3537da2899SCharles.Forsyth	TextCss, TextEnriched, TextHtml, TextJavascript, TextPlain, TextRichtext,
3637da2899SCharles.Forsyth	TextSgml, TextTabSeparatedValues, TextXml,
3737da2899SCharles.Forsyth
3837da2899SCharles.Forsyth	VideoMpeg, VideoQuicktime : con iota;
3937da2899SCharles.Forsyth
4037da2899SCharles.Forsyth	mnames: array of string;
4137da2899SCharles.Forsyth
4237da2899SCharles.Forsyth	# Netconn states
4337da2899SCharles.Forsyth	NCfree, NCidle, NCconnect, NCgethdr, NCgetdata,
4437da2899SCharles.Forsyth	NCdone, NCerr : con iota;
4537da2899SCharles.Forsyth
4637da2899SCharles.Forsyth	ncstatenames: array of string;
4737da2899SCharles.Forsyth
4837da2899SCharles.Forsyth	# Netcomm synch protocol values
4937da2899SCharles.Forsyth	NGstartreq, NGwaitreq, NGstatechg, NGfreebs : con iota;
5037da2899SCharles.Forsyth
5137da2899SCharles.Forsyth	# Colors
5237da2899SCharles.Forsyth	White: con 16rFFFFFF;
5337da2899SCharles.Forsyth	Black: con 16r000000;
5437da2899SCharles.Forsyth	Grey: con 16rdddddd;
5537da2899SCharles.Forsyth	DarkGrey: con 16r9d9d9d;
5637da2899SCharles.Forsyth	LightGrey: con 16rededed;
5737da2899SCharles.Forsyth	Blue: con 16r0000CC;
5837da2899SCharles.Forsyth	Navy: con 16r000080;
5937da2899SCharles.Forsyth	Red: con 16rFF0000;
6037da2899SCharles.Forsyth	Green: con 16r00FF00;
6137da2899SCharles.Forsyth	DarkRed: con 16r9d0000;
6237da2899SCharles.Forsyth
6337da2899SCharles.Forsyth	# Header major status values (code/100)
6437da2899SCharles.Forsyth	HSNone, HSInformation, HSOk, HSRedirect, HSError, HSServererr : con iota;
6537da2899SCharles.Forsyth	hsnames: array of string;
6637da2899SCharles.Forsyth
6737da2899SCharles.Forsyth	# Individual status code values (HTTP, but use for other transports too)
6837da2899SCharles.Forsyth	HCContinue:		con 100;
6937da2899SCharles.Forsyth	HCSwitchProto:		con 101;
7037da2899SCharles.Forsyth	HCOk:			con 200;
7137da2899SCharles.Forsyth	HCCreated:		con 201;
7237da2899SCharles.Forsyth	HCAccepted:		con 202;
7337da2899SCharles.Forsyth	HCOkNonAuthoritative:	con 203;
7437da2899SCharles.Forsyth	HCNoContent:		con 204;
7537da2899SCharles.Forsyth	HCResetContent:		con 205;
7637da2899SCharles.Forsyth	HCPartialContent:	con 206;
7737da2899SCharles.Forsyth	HCMultipleChoices:	con 300;
7837da2899SCharles.Forsyth	HCMovedPerm:		con 301;
7937da2899SCharles.Forsyth	HCMovedTemp:		con 302;
8037da2899SCharles.Forsyth	HCSeeOther:		con 303;
8137da2899SCharles.Forsyth	HCNotModified:		con 304;
8237da2899SCharles.Forsyth	HCUseProxy:		con 305;
8337da2899SCharles.Forsyth	HCBadRequest:		con 400;
8437da2899SCharles.Forsyth	HCUnauthorized:		con 401;
8537da2899SCharles.Forsyth	HCPaymentRequired:	con 402;
8637da2899SCharles.Forsyth	HCForbidden:		con 403;
8737da2899SCharles.Forsyth	HCNotFound:		con 404;
8837da2899SCharles.Forsyth	HCMethodNotAllowed:	con 405;
8937da2899SCharles.Forsyth	HCNotAcceptable:	con 406;
9037da2899SCharles.Forsyth	HCProxyAuthRequired:	con 407;
9137da2899SCharles.Forsyth	HCRequestTimeout:	con 408;
9237da2899SCharles.Forsyth	HCConflict:		con 409;
9337da2899SCharles.Forsyth	HCGone:			con 410;
9437da2899SCharles.Forsyth	HCLengthRequired:	con 411;
9537da2899SCharles.Forsyth	HCPreconditionFailed:	con 412;
9637da2899SCharles.Forsyth	HCRequestTooLarge:	con 413;
9737da2899SCharles.Forsyth	HCRequestURITooLarge:	con 414;
9837da2899SCharles.Forsyth	HCUnsupportedMedia:	con 415;
9937da2899SCharles.Forsyth	HCRangeInvalid:		con 416;
10037da2899SCharles.Forsyth	HCExpectFailed:		con 419;
10137da2899SCharles.Forsyth	HCServerError:		con 500;
10237da2899SCharles.Forsyth	HCNotImplemented:	con 501;
10337da2899SCharles.Forsyth	HCBadGateway:		con 502;
10437da2899SCharles.Forsyth	HCServiceUnavailable:	con 503;
10537da2899SCharles.Forsyth	HCGatewayTimeout:	con 504;
10637da2899SCharles.Forsyth	HCVersionUnsupported:	con 505;
10737da2899SCharles.Forsyth	HCRedirectionFailed:	con 506;
10837da2899SCharles.Forsyth
10937da2899SCharles.Forsyth	# Max number of redirections tolerated
11037da2899SCharles.Forsyth	Maxredir : con 10;
11137da2899SCharles.Forsyth
11237da2899SCharles.Forsyth	# Image Level config options
11337da2899SCharles.Forsyth	ImgNone, ImgNoAnim, ImgProgressive, ImgFull: con iota;
11437da2899SCharles.Forsyth
11537da2899SCharles.Forsyth 	# SSL connection version
11637da2899SCharles.Forsyth 	NOSSL, SSLV2, SSLV3, SSLV23: con iota;
11737da2899SCharles.Forsyth
11837da2899SCharles.Forsyth	# User Configuration Information (Options)
11937da2899SCharles.Forsyth	# Debug option letters:
12037da2899SCharles.Forsyth	# 'd' -> Basic operation info (navigation, etc.)
12137da2899SCharles.Forsyth	# 'e' -> Events (timing of progress through get/layout/image conversion)
12237da2899SCharles.Forsyth	# 'h' -> Build layout items from lex tokens
12337da2899SCharles.Forsyth	# 'i' -> Image conversion
12437da2899SCharles.Forsyth	# 'l' -> Layout
12537da2899SCharles.Forsyth	# 'n' -> transport (Network access)
12637da2899SCharles.Forsyth	# 'o' -> always use old http (http/1.0)
12737da2899SCharles.Forsyth	# 'p' -> synch Protocol between ByteSource/Netconn
12837da2899SCharles.Forsyth	# 'r' -> Resource usage
12937da2899SCharles.Forsyth	# 's' -> Scripts
13037da2899SCharles.Forsyth	# 't' -> Table layout
13137da2899SCharles.Forsyth	# 'u' -> use Uninstalled dis modules
13237da2899SCharles.Forsyth	# 'w' -> Warn about recoverable problems in retrieved pages
13337da2899SCharles.Forsyth	# 'x -> lex Html tokens
13437da2899SCharles.Forsyth	Config: adt
13537da2899SCharles.Forsyth	{
13637da2899SCharles.Forsyth		userdir:	string;		# where to find bookmarks, cache, etc.
13737da2899SCharles.Forsyth		srcdir:		string;		# where to find charon src (for debugging)
13837da2899SCharles.Forsyth		starturl:	string;# never nil (could be last of command args)
13937da2899SCharles.Forsyth		change_homeurl:	int;
14037da2899SCharles.Forsyth		homeurl:	string;# never nil
14137da2899SCharles.Forsyth		helpurl:	string;
14237da2899SCharles.Forsyth 		usessl:		int; # use ssl version 2, 3 or both
14337da2899SCharles.Forsyth 		devssl:		int; # use devssl
14437da2899SCharles.Forsyth		custbkurl:	string; # where are customized bookmarks-never nil
14537da2899SCharles.Forsyth		dualbkurl:	string; # where is the dual bookmark page-never nil
14637da2899SCharles.Forsyth		httpproxy:	ref Url->Parsedurl;# nil, if no proxy
14737da2899SCharles.Forsyth		noproxydoms:	list of string; # domains that don't require proxy
14837da2899SCharles.Forsyth		buttons:	string;		# customized buttons
14937da2899SCharles.Forsyth		framework: string;		# customized gui framework
15037da2899SCharles.Forsyth		defaultwidth:	int;		# of entire browser
15137da2899SCharles.Forsyth		defaultheight:	int;		# of entire browser
15237da2899SCharles.Forsyth		x:			int;		# initial x position for browser
15337da2899SCharles.Forsyth		y:			int;		# initial y position for browser
15437da2899SCharles.Forsyth		nocache:	int;		# true if shouldn't retrieve from or store to
15537da2899SCharles.Forsyth		maxstale:	int;		# allow cache hit even if exceed expiration by maxstale
15637da2899SCharles.Forsyth		imagelvl:	int;		# ImgNone, etc.
15737da2899SCharles.Forsyth		imagecachenum: int;	# imcache.nlimit
15837da2899SCharles.Forsyth		imagecachemem: int;	# imcache.memlimit
15937da2899SCharles.Forsyth		docookies:	int;		# allow cookie storage/sending?
16037da2899SCharles.Forsyth		doscripts:		int;		# allow scripts to execute?
16137da2899SCharles.Forsyth		httpminor:	int;		# use HTTP 1.httpminor
16237da2899SCharles.Forsyth		agentname:	string;	# what to send in HTTP header
16337da2899SCharles.Forsyth		nthreads:		int;		# number of simultaneous gets allowed
16437da2899SCharles.Forsyth		offersave:	int;		# offer to save a file of a type that can't be handled
16537da2899SCharles.Forsyth		charset: string;			# default character set
16637da2899SCharles.Forsyth		plumbport: string;		# from/to plumbing port name (default = "web")
16737da2899SCharles.Forsyth		wintitle: string;
16837da2899SCharles.Forsyth		dbgfile:		string;	# file to write debug messages to
16937da2899SCharles.Forsyth		dbg:		array of byte;	# ascii letters for different debugging kinds
17037da2899SCharles.Forsyth	};
17137da2899SCharles.Forsyth
17237da2899SCharles.Forsyth	# Information for fulfilling HTTP request
17337da2899SCharles.Forsyth	ReqInfo : adt
17437da2899SCharles.Forsyth	{
17537da2899SCharles.Forsyth		url:	ref Url->Parsedurl;	# should be absolute
17637da2899SCharles.Forsyth		method:	int;			# HGet or HPost
17737da2899SCharles.Forsyth		body:	array of byte;		# used for HPost
17837da2899SCharles.Forsyth		auth:	string;			# optional auth info
17937da2899SCharles.Forsyth		target:	string;			# target frame name
18037da2899SCharles.Forsyth	};
18137da2899SCharles.Forsyth
18237da2899SCharles.Forsyth	MaskedImage: adt {
18337da2899SCharles.Forsyth		im:		ref Draw->Image;		# the image
18437da2899SCharles.Forsyth		mask:	ref Draw->Image;		# if non-nil, a mask for the image
18537da2899SCharles.Forsyth		delay:	int;			# if animated, delay in millisec before next frame
18637da2899SCharles.Forsyth		more:	int;			# true if more frames follow
18737da2899SCharles.Forsyth		bgcolor:	int;			# if not -1, restore to this (RGB) color before next frame
18837da2899SCharles.Forsyth		origin:	Draw->Point;		# origin of im relative to first frame of an animation
18937da2899SCharles.Forsyth
19037da2899SCharles.Forsyth		free: fn(mim: self ref MaskedImage);
19137da2899SCharles.Forsyth	};
19237da2899SCharles.Forsyth
19337da2899SCharles.Forsyth	# Charon Image info.
19437da2899SCharles.Forsyth	# If this is an animated image then len mims > 1
19537da2899SCharles.Forsyth	CImage: adt
19637da2899SCharles.Forsyth	{
19737da2899SCharles.Forsyth		src:	ref Url->Parsedurl;	# source of image
19837da2899SCharles.Forsyth		lowsrc:	ref Url->Parsedurl;	# for low-resolution devices
19937da2899SCharles.Forsyth		actual: ref Url->Parsedurl;	# what came back as actual source of image
20037da2899SCharles.Forsyth		imhash:	int;			# hash of src, for fast comparison
20137da2899SCharles.Forsyth		width:	int;
20237da2899SCharles.Forsyth		height:	int;
20337da2899SCharles.Forsyth		next:	cyclic ref CImage;	# next (newer) image in cache
20437da2899SCharles.Forsyth		mims: array of ref MaskedImage;
20537da2899SCharles.Forsyth		complete: int;			# JavaScript Image.complete
20637da2899SCharles.Forsyth
20737da2899SCharles.Forsyth		new: fn(src: ref Url->Parsedurl, lowsrc: ref Url->Parsedurl, width, height: int) : ref CImage;
20837da2899SCharles.Forsyth		match: fn(a: self ref CImage, b: ref CImage) : int;
20937da2899SCharles.Forsyth		bytes: fn(ci: self ref CImage) : int;
21037da2899SCharles.Forsyth	};
21137da2899SCharles.Forsyth
21237da2899SCharles.Forsyth	# In-memory cache of CImages
21337da2899SCharles.Forsyth	ImageCache: adt
21437da2899SCharles.Forsyth	{
21537da2899SCharles.Forsyth		imhd:	ref CImage;	# head (LRU) of cache chain (linked through CImage.next)
21637da2899SCharles.Forsyth		imtl:		ref CImage;	# tail MRU) of cache chain
21737da2899SCharles.Forsyth		n:	int;			# size of chain
21837da2899SCharles.Forsyth		memused: int;		# current total of image mem used by cached images
21937da2899SCharles.Forsyth		memlimit: int;		# keep memused less than this
22037da2899SCharles.Forsyth		nlimit: int;			# keep n less than this
22137da2899SCharles.Forsyth
22237da2899SCharles.Forsyth		init: fn(ic: self ref ImageCache);
22337da2899SCharles.Forsyth		resetlimits: fn(ic: self ref ImageCache);
22437da2899SCharles.Forsyth		look: fn(ic: self ref ImageCache, ci: ref CImage) : ref CImage;
22537da2899SCharles.Forsyth		add: fn(ic: self ref ImageCache, ci: ref CImage);
22637da2899SCharles.Forsyth		deletelru: fn(ic: self ref ImageCache);
22737da2899SCharles.Forsyth		clear: fn(ic: self ref ImageCache);
22837da2899SCharles.Forsyth		need: fn(ic: self ref ImageCache, nbytes: int) : int;
22937da2899SCharles.Forsyth	};
23037da2899SCharles.Forsyth
23137da2899SCharles.Forsyth	# An connection to some host
23237da2899SCharles.Forsyth	Netconn: adt
23337da2899SCharles.Forsyth	{
23437da2899SCharles.Forsyth		id:		 int;			# for debugging
23537da2899SCharles.Forsyth		host:	string;			# host name
23637da2899SCharles.Forsyth		port:	int;			# port number
23737da2899SCharles.Forsyth		scheme: string;		# Url scheme ("http", "file", etc.)
238*62d7827bScharles forsyth		conn:	ref Dial->Connection;	# fds, etc.
23937da2899SCharles.Forsyth 		sslx:	ref SSL3->Context;	# ssl connection
24037da2899SCharles.Forsyth 		vers:	int;			# ssl version
24137da2899SCharles.Forsyth		state:	int;			# NCfree, etc.
24237da2899SCharles.Forsyth		queue:	cyclic array of ref ByteSource;
24337da2899SCharles.Forsyth						# following are indexes into queue
24437da2899SCharles.Forsyth		qlen:		int;		# queue[0:qlen] is queue of requests
24537da2899SCharles.Forsyth		gocur:	int;		# go thread currently processing
24637da2899SCharles.Forsyth		ngcur:	int;		# ng threads currently processing
24737da2899SCharles.Forsyth		reqsent:	int;		# next to send request for
24837da2899SCharles.Forsyth		pipeline:	int;		# are requests being pipelined?
24937da2899SCharles.Forsyth		connected:	int;	# are we connected to host?
25037da2899SCharles.Forsyth		tstate:	int;		# for use by transport
25137da2899SCharles.Forsyth		tbuf: 	array of byte;	# for use by transport
25237da2899SCharles.Forsyth		idlestart:	int;		# timestamp when went Idle
25337da2899SCharles.Forsyth
25437da2899SCharles.Forsyth		new: fn(id: int) : ref Netconn;
25537da2899SCharles.Forsyth		makefree: fn(nc: self ref Netconn);
25637da2899SCharles.Forsyth	};
25737da2899SCharles.Forsyth
25837da2899SCharles.Forsyth	# Info from an HTTP response header
25937da2899SCharles.Forsyth	Header: adt
26037da2899SCharles.Forsyth	{
26137da2899SCharles.Forsyth		code:	int;			# HC... (detailed response code)
26237da2899SCharles.Forsyth		actual:	ref Url->Parsedurl;	# actual request url (may be result of redir)
26337da2899SCharles.Forsyth		base:	ref Url->Parsedurl;	# Content-Base or request url
26437da2899SCharles.Forsyth		location:	ref Url->Parsedurl;	# Content-Location
26537da2899SCharles.Forsyth		length:	int;			# -1 if unknown
26637da2899SCharles.Forsyth		mtype:	int;			# TextHtml, etc.
26737da2899SCharles.Forsyth		chset:	string;		# charset encoding
26837da2899SCharles.Forsyth		msg:	string;			# possible message explaining status
26937da2899SCharles.Forsyth		refresh:string;			# used for server push
27037da2899SCharles.Forsyth		chal:	string;			# used if code is HSneedauth
27137da2899SCharles.Forsyth		warn:	string;			# should show this to user
27237da2899SCharles.Forsyth		lastModified:	string;		# last-modified field
27337da2899SCharles.Forsyth
27437da2899SCharles.Forsyth		new: fn() : ref Header;
27537da2899SCharles.Forsyth		setmediatype: fn(h: self ref Header, name: string, first: array of byte);
27637da2899SCharles.Forsyth		print: fn(h: self ref Header);
27737da2899SCharles.Forsyth	};
27837da2899SCharles.Forsyth
27937da2899SCharles.Forsyth	# A source of raw bytes (with HTTP info)
28037da2899SCharles.Forsyth	ByteSource: adt
28137da2899SCharles.Forsyth	{
28237da2899SCharles.Forsyth		id: int;				# for debugging
28337da2899SCharles.Forsyth		req:	ref ReqInfo;
28437da2899SCharles.Forsyth		hdr:	ref Header;		# filled in from headers
28537da2899SCharles.Forsyth		data:	array of byte;		# all the data, maybe partially filled
28637da2899SCharles.Forsyth		edata: int;				# data[0:edata] is valid
28737da2899SCharles.Forsyth		err: string;			# there was an error
28837da2899SCharles.Forsyth		net:	cyclic ref Netconn;	# servicing fd, etc.
28937da2899SCharles.Forsyth		refgo: int;				# go proc is still using
29037da2899SCharles.Forsyth		refnc: int;				# netconn proc is still using
29137da2899SCharles.Forsyth
29237da2899SCharles.Forsyth		# producer sets eof upon finalising data & edata
29337da2899SCharles.Forsyth		eof: int;
29437da2899SCharles.Forsyth
29537da2899SCharles.Forsyth		# consumer changes only these fields:
29637da2899SCharles.Forsyth		lim: int;				# consumer has seen data[0:lim]
29737da2899SCharles.Forsyth		seenhdr: int;			# consumer has seen hdr
29837da2899SCharles.Forsyth
29937da2899SCharles.Forsyth		free: fn(bs: self ref ByteSource);
30037da2899SCharles.Forsyth		stringsource: fn(s: string) : ref ByteSource;
30137da2899SCharles.Forsyth	};
30237da2899SCharles.Forsyth
30337da2899SCharles.Forsyth	# Snapshot of current system resources
30437da2899SCharles.Forsyth	ResourceState: adt
30537da2899SCharles.Forsyth	{
30637da2899SCharles.Forsyth		ms: int;		# a millisecond time stamp
30737da2899SCharles.Forsyth		main: int;		# main memory
30837da2899SCharles.Forsyth		mainlim: int;		# max main memory
30937da2899SCharles.Forsyth		heap: int;		# heap memory
31037da2899SCharles.Forsyth		heaplim: int;		# max heap memory
31137da2899SCharles.Forsyth		image: int;		# used image memory
31237da2899SCharles.Forsyth		imagelim: int;		# max image memory
31337da2899SCharles.Forsyth
31437da2899SCharles.Forsyth		cur: fn() : ResourceState;
31537da2899SCharles.Forsyth		since: fn(rnew: self ResourceState, rold: ResourceState) : ResourceState;
31637da2899SCharles.Forsyth		print: fn(r: self ResourceState, msg: string);
31737da2899SCharles.Forsyth	};
31837da2899SCharles.Forsyth
31937da2899SCharles.Forsyth
32037da2899SCharles.Forsyth	Nameval: adt {
32137da2899SCharles.Forsyth		key: string;
32237da2899SCharles.Forsyth		val: string;
32337da2899SCharles.Forsyth
32437da2899SCharles.Forsyth		namevals: fn(s: string, sep: int) : list of Nameval;
32537da2899SCharles.Forsyth		find: fn(l: list of Nameval, key: string) : (int, string);
32637da2899SCharles.Forsyth	};
32737da2899SCharles.Forsyth
32837da2899SCharles.Forsyth
32937da2899SCharles.Forsyth	# Globals
33037da2899SCharles.Forsyth	config: Config;
33137da2899SCharles.Forsyth	startres: ResourceState;
33237da2899SCharles.Forsyth	imcache: ref ImageCache;
33337da2899SCharles.Forsyth	progresschan: chan of (int, int, int, string);
33437da2899SCharles.Forsyth	gen: int;	# go generation number
33537da2899SCharles.Forsyth	ckclient: ref Cookiesrv->Client;
33637da2899SCharles.Forsyth
33737da2899SCharles.Forsyth	init: fn(ch: Charon, me: CharonUtils, argl: list of string, evch: chan of ref E->Event, cksrv: Cookiesrv, ckclient: ref Cookiesrv->Client) : string;
33837da2899SCharles.Forsyth
33937da2899SCharles.Forsyth	# Dispatcher functions
34037da2899SCharles.Forsyth	stringreq: fn(s : string) : ref ByteSource;
34137da2899SCharles.Forsyth	startreq: fn(req: ref ReqInfo) : ref ByteSource;
34237da2899SCharles.Forsyth	waitreq: fn(bsl : list of ref ByteSource) : ref ByteSource;
34337da2899SCharles.Forsyth	freebs: fn(bs: ref ByteSource);
34437da2899SCharles.Forsyth	abortgo: fn(gopgrp: int);
34537da2899SCharles.Forsyth	netget: fn();
34637da2899SCharles.Forsyth
34737da2899SCharles.Forsyth	# Miscellaneous utility functions
34837da2899SCharles.Forsyth	kill: fn(pid: int, dogroup: int);
34937da2899SCharles.Forsyth	getline: fn(fd: ref Sys->FD, buf: array of byte, bstart, bend: int) :
35037da2899SCharles.Forsyth		(array of byte, int, int, int);
35137da2899SCharles.Forsyth	saveconfig: fn() : int;
35237da2899SCharles.Forsyth	strlookup: fn(a: array of string, s: string) : int;
35337da2899SCharles.Forsyth	realloc: fn(a: array of byte, incr: int) : array of byte;
35437da2899SCharles.Forsyth	hcphrase: fn(code: int) : string;
35537da2899SCharles.Forsyth	hdraction: fn(bs: ref ByteSource, ismain: int, nredirs: int) : (int, string, string, ref Url->Parsedurl);
35637da2899SCharles.Forsyth	makestrinttab: fn(a: array of string) : array of StringIntTab->StringInt;
35737da2899SCharles.Forsyth	urlequal: fn(a, b: ref Url->Parsedurl) : int;
35837da2899SCharles.Forsyth	makeabsurl: fn(s: string) : ref Url->Parsedurl;
35937da2899SCharles.Forsyth	loadpath: fn(s: string) : string;
36037da2899SCharles.Forsyth	event: fn(s: string, data: int);
36137da2899SCharles.Forsyth	color: fn(s: string, dflt: int) : int;
36237da2899SCharles.Forsyth	max: fn(a, b : int) : int;
36337da2899SCharles.Forsyth	min: fn(a, b : int) : int;
36437da2899SCharles.Forsyth	assert: fn(i: int);
36537da2899SCharles.Forsyth	stripscript: fn(s: string) : string;	# strip HTML comments from Script
36637da2899SCharles.Forsyth	getconv: fn(chset : string) : Btos;
36737da2899SCharles.Forsyth	setcookie: fn(host, path, cookie: string);
36837da2899SCharles.Forsyth	getcookies: fn(host, path: string, secure: int): string;
36937da2899SCharles.Forsyth	schemeok: fn(scheme: string): int;	# is URL scheme supported?
37037da2899SCharles.Forsyth	X: fn(s, note : string) : string;
37137da2899SCharles.Forsyth};
372