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