Thank you!
2016-05-24 23:27 GMT+03:00 Phil Clayton <phil.clayton at lineone.net>:
Hi Kostirya,
On 24/05/2016 09:07, Kostirya wrote:
Hello.
I have some questions about Foreign.
- How to convert OS.IO.iodesc (from socket) into cUint (uintptr_t)?
The Basis Library docs explain about converting iodesc values and portability issues: http://sml-family.org/Basis/os-io.html#SIG:OS_IO.iodesc:TY
With Poly/ML, if you want to pass an iodesc value to/from a C function you probably want to create your own conversion by building on cUint. See (untested) code below that creates cIoDescConv. Note that valOf may raise an exception.
- C function is need 'const struct timespec *timeout' argument.
Where struct timespec is:
struct timespec { time_t tv_sec; long tv_nsec; };
Do I understand correctly that this is cOptionPtr (cStruct2 (cInt32, cLong)) ?
But how can I call this from polyml? I call as SAME (3, 0) and got error: Exception- Foreign "cOptionPtr must be applied to a pointer type" raised
You need to use cStar or cConstStar for the dereferencing. It looks like you want cConstStar (cStruct2 (cInt32, cLong)) Whether you use cOptionPtr around that depends on whether you want to be able to pass a null/non-null pointer for an optional value.
Phil
fun convMap (fromC, toC) conv = let open Foreign val {ctype, load, store} = breakConversion conv in makeConversion { ctype = ctype, load = fromC o load, store = fn (p, x) => store (p, toC x) } end
val cFileDescConv = convMap ( Posix.FileSys.wordToFD o SysWord.fromInt, SysWord.toInt o Posix.FileSys.fdToWord ) Foreign.cUint
val cIoDescConv = convMap (Posix.FileSys.fdToIOD, valOf o Posix.FileSys.iodToFD) cFileDescConv
polyml mailing list polyml at inf.ed.ac.uk http://lists.inf.ed.ac.uk/mailman/listinfo/polyml