[Initial version, ad-hoc from many projects Tony Garnock-Jones **20051011124936] [Split into portable core and implementation-specific wrappers. Tony Garnock-Jones **20051011131503]