chicken-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Chicken-users] Re: FFI with XQueryTree


From: Jim Ursetto
Subject: Re: [Chicken-users] Re: FFI with XQueryTree
Date: Fri, 13 Mar 2009 03:16:20 -0500

You can use locations for your other vars as well -- in this case it
should work even for 64-bit values.

 (let-location
  ((root unsigned-long)
   (parent unsigned-long)
   (children (c-pointer unsigned-long))
   (nchildren unsigned-long))

   (XQueryTree dpy win
               (location root)
               (location parent)
               (location children)
               (location nchildren))
   ...)

You still have, I think, the issue with the width of Window in the
children array.  Perhaps you could write a little helper function
which indexes into an array of unsigned longs.  I have done that below
building on my last message; I also defined a new foreign type
"Window" but you can just use unsigned-long directly if desired.

#>
typedef unsigned long Window;
Window buf[] = { 0xdeadbeefL, 0x12345678L };
void foo(Window **ret) {
  *ret = buf;
  }
<#

(define foo (foreign-lambda void "foo"
                            (c-pointer (c-pointer Window))))

(define-foreign-type Window unsigned-long)
(define window-array-ref
  (foreign-lambda* Window (((c-pointer Window) array) (int n))
                    "return(array[n]);"))

(let-location ((ptr (c-pointer Window)))
   (foo (location ptr))
   (printf "~x ~x\n"
           (window-array-ref ptr 0)
           (window-array-ref ptr 1)))   ; deadbeef 12345678




reply via email to

[Prev in Thread] Current Thread [Next in Thread]