unofficial mirror of guile-devel@gnu.org 
 help / color / mirror / Atom feed
From: "Kjetil S. Matheussen" <k.s.matheussen@notam02.no>
To: guile-devel@gnu.org
Subject: Re: Passing C pointers through guile
Date: Wed, 9 Jul 2008 18:50:51 +0200 (CEST)	[thread overview]
Message-ID: <Pine.LNX.4.58.0807091836560.3261@notam02.uio.no> (raw)
In-Reply-To: <cmu-lmtpd-29205-1215446748-1@mail-imap1.uio.no>

[-- Attachment #1: Type: TEXT/PLAIN, Size: 1707 bytes --]


Ludovic Court?s:
> scenes.
> 
> > I agree with Maciek that it would at least be mind-comforting to have
> > functions like scm_to_ptr/etc, although not strictly necessary,
> > since using integers works just fine.
> 
> `scm_{to,from}_uintptr ()' could be handy (patches welcome!).
> 

I gave it a try. Unfortunately, I was completely unable to create
the configure file right now, so the patch is against 1.8.5 (sorry
if this creats trouble against git repository), and
it's also untested, since I couldn't build configure. However,
the patches are trivial, so I think they work anyway. (crossing fingers)

The only thing I'm not too sure about is whether
the new SCM_I_GSC_T_UINTPTR type in configure.in will actually be
optional or not. I just copied the checking code for the optional
SCM_I_GSC_T_UINT64 type though:


"
### Optional type scm_t_uintptr
if test "$scm_stdint_has_uintptr"; then
  SCM_I_GSC_T_UINTPTR='"uintptr_t"'
  SCM_I_GSC_NEEDS_STDINT_H=1
elif test "$scm_inttypes_has_uintptr"; then
  SCM_I_GSC_T_UINTPTR='"uintptr_t"'
  SCM_I_GSC_NEEDS_INTTYPES_H=1
else
  AC_MSG_ERROR([Can't find appropriate type for scm_t_uintptr.])
fi
AC_SUBST([SCM_I_GSC_T_UINTPTR])
"



Patch for configure.in:
http://www.notam02.no/~kjetism/configure.in.diff

Patch for libguile/Makefile.in, libguile/__scm.h, 
libguile/gen-scmconfig.c, libguile/gen-scmconfig.h.in and 
libguile/numbers.c:
http://www.notam02.no/~kjetism/libguile.diff

The two patches are also attached.


> That said, using a Scheme integer to represent a pointer wouldn't be
> efficient (pointers would likely translate to bignums).
> 

I think cleaner code would usually be more important in this case,
but at least there will be a choice.

[-- Attachment #2: Type: TEXT/PLAIN, Size: 4162 bytes --]

diff -ur libguile_org/Makefile.in libguile/Makefile.in
--- libguile_org/Makefile.in	2008-05-07 20:08:34.000000000 +0200
+++ libguile/Makefile.in	2008-07-09 17:59:52.000000000 +0200
@@ -298,6 +298,7 @@
 SCM_I_GSC_T_UINT64 = @SCM_I_GSC_T_UINT64@
 SCM_I_GSC_T_UINT8 = @SCM_I_GSC_T_UINT8@
 SCM_I_GSC_T_UINTMAX = @SCM_I_GSC_T_UINTMAX@
+SCM_I_GSC_T_UINTPTR = @SCM_I_GSC_T_UINTPTR@
 SCM_I_GSC_USE_NULL_THREADS = @SCM_I_GSC_USE_NULL_THREADS@
 SCM_I_GSC_USE_PTHREAD_THREADS = @SCM_I_GSC_USE_PTHREAD_THREADS@
 SED = @SED@
diff -ur libguile_org/__scm.h libguile/__scm.h
--- libguile_org/__scm.h	2008-04-07 23:30:03.000000000 +0200
+++ libguile/__scm.h	2008-07-09 18:27:57.000000000 +0200
@@ -365,6 +365,12 @@
 #define SCM_T_INT64_MAX   SCM_I_TYPE_MAX(scm_t_int64,SCM_T_UINT64_MAX)
 #endif
 
+#if SCM_HAVE_T_UINTPTR
+#define SCM_T_UINTPTR_MAX  SCM_I_UTYPE_MAX(scm_t_uintptr)
+#define SCM_T_UINTPTR_MIN   SCM_I_TYPE_MIN(scm_t_uintptr,SCM_T_UINTPTR_MAX)
+#define SCM_T_UINTPTR_MAX   SCM_I_TYPE_MAX(scm_t_uintptr,SCM_T_UINTPTR_MAX)
+#endif
+
 #if SCM_SIZEOF_LONG_LONG
 #define SCM_I_ULLONG_MAX  SCM_I_UTYPE_MAX(unsigned long long)
 #define SCM_I_LLONG_MIN   SCM_I_TYPE_MIN(long long,SCM_I_ULLONG_MAX)
diff -ur libguile_org/gen-scmconfig.c libguile/gen-scmconfig.c
--- libguile_org/gen-scmconfig.c	2008-04-24 19:35:57.000000000 +0200
+++ libguile/gen-scmconfig.c	2008-07-09 18:24:22.000000000 +0200
@@ -339,6 +339,19 @@
     pf ("#define SCM_HAVE_T_UINT64 0 /* 0 or 1 */\n");
 
   pf ("\n");
+  pf ("/* unsigned integer large enough to hold pointer -- if available SCM_HAVE_T_UINTPTR will\n"
+      "   be 1 and scm_t_uintptr will be a suitable type, otherwise\n"
+      "   SCM_HAVE_T_UINTPTR will be 0. */\n");
+  if (SCM_I_GSC_T_UINTPTR)
+  {
+    pf ("#define SCM_HAVE_T_UINTPTR 1 /* 0 or 1 */\n");
+    pf ("typedef %s scm_t_intptr;\n", SCM_I_GSC_T_UINTPTR);
+  }
+  else
+    pf ("#define SCM_HAVE_T_UINTPTR 0 /* 0 or 1 */\n");
+
+
+  pf ("\n");
   pf ("/* scm_t_ptrdiff_t and size, always defined -- defined to long if\n"
       "   platform doesn't have ptrdiff_t. */\n");
   pf ("typedef %s scm_t_ptrdiff;\n", SCM_I_GSC_T_PTRDIFF);
@@ -353,6 +366,7 @@
   pf ("/* Size of uintptr_t or 0 if not available */\n");
   pf ("#define SCM_SIZEOF_UINTPTR_T %d\n", SIZEOF_UINTPTR_T);
 
+
   pf ("\n");
   pf ("/* same as POSIX \"struct timespec\" -- always defined */\n");
 #ifdef HAVE_STRUCT_TIMESPEC
diff -ur libguile_org/gen-scmconfig.h.in libguile/gen-scmconfig.h.in
--- libguile_org/gen-scmconfig.h.in	2008-04-07 23:30:03.000000000 +0200
+++ libguile/gen-scmconfig.h.in	2008-07-09 17:59:00.000000000 +0200
@@ -25,6 +25,7 @@
 #define SCM_I_GSC_T_UINT64 @SCM_I_GSC_T_UINT64@
 #define SCM_I_GSC_T_INTMAX @SCM_I_GSC_T_INTMAX@
 #define SCM_I_GSC_T_UINTMAX @SCM_I_GSC_T_UINTMAX@
+#define SCM_I_GSC_T_UINTPTR @SCM_I_GSC_T_UINTPTR@
 #define SCM_I_GSC_T_PTRDIFF @SCM_I_GSC_T_PTRDIFF@
 #define SCM_I_GSC_USE_PTHREAD_THREADS @SCM_I_GSC_USE_PTHREAD_THREADS@
 #define SCM_I_GSC_USE_NULL_THREADS @SCM_I_GSC_USE_NULL_THREADS@
diff -ur libguile_org/numbers.c libguile/numbers.c
--- libguile_org/numbers.c	2008-05-07 17:29:55.000000000 +0200
+++ libguile/numbers.c	2008-07-09 18:25:29.000000000 +0200
@@ -5863,6 +5863,19 @@
 
 #endif
 
+
+#if SCM_HAVE_T_UINTPTR
+
+#define TYPE                     scm_t_uintptr
+#define TYPE_MIN                 0
+#define TYPE_MAX                 SCM_T_UINTPTR_MAX
+#define SIZEOF_TYPE              8
+#define SCM_TO_TYPE_PROTO(arg)   scm_to_uintptr (arg)
+#define SCM_FROM_TYPE_PROTO(arg) scm_from_uintptr (arg)
+#include "libguile/conv-uinteger.i.c"
+
+#endif
+
 void
 scm_to_mpz (SCM val, mpz_t rop)
 {
diff -ur libguile_org/numbers.h libguile/numbers.h
--- libguile_org/numbers.h	2008-04-07 23:30:03.000000000 +0200
+++ libguile/numbers.h	2008-07-09 18:31:06.000000000 +0200
@@ -331,6 +331,13 @@
 
 #endif
 
+#if SCM_HAVE_T_UINTPTR
+
+SCM_API scm_t_uintptr scm_to_uintptr    (SCM x);
+SCM_API SCM           scm_from_uintptr  (scm_t_uintptr x);
+
+#endif
+
 SCM_API void scm_to_mpz (SCM x, mpz_t rop);
 SCM_API SCM  scm_from_mpz (mpz_t rop);
 

[-- Attachment #3: Type: TEXT/PLAIN, Size: 2069 bytes --]

--- configure.in.org	2008-07-09 18:32:53.000000000 +0200
+++ configure.in	2008-07-09 18:46:38.000000000 +0200
@@ -352,6 +352,7 @@
    AC_CHECK_TYPE([uint32_t],[scm_stdint_has_uint32=1],,[#include <stdint.h>])
    AC_CHECK_TYPE([int64_t],[scm_stdint_has_int64=1],,[#include <stdint.h>])
    AC_CHECK_TYPE([uint64_t],[scm_stdint_has_uint64=1],,[#include <stdint.h>])
+   AC_CHECK_TYPE([uintptr_t],[scm_stdint_has_uintptr=1],,[#include <stdint.h>])
    AC_CHECK_TYPE([intmax_t],[scm_stdint_has_intmax=1],,[#include <stdint.h>])
    AC_CHECK_TYPE([uintmax_t],[scm_stdint_has_uintmax=1],,[#include <stdint.h>])
 fi
@@ -367,6 +368,7 @@
 unset ac_cv_type_uint32_t
 unset ac_cv_type_int64_t
 unset ac_cv_type_uint64_t
+unset ac_cv_type_uintptr_t
 unset ac_cv_type_intmax_t
 unset ac_cv_type_uintmax_t
 
@@ -380,6 +382,7 @@
   AC_CHECK_TYPE([uint32_t],[scm_inttypes_has_uint32=1],,[#include <inttypes.h>])
   AC_CHECK_TYPE([int64_t],[scm_inttypes_has_int64=1],,[#include <inttypes.h>])
   AC_CHECK_TYPE([uint64_t],[scm_inttypes_has_uint64=1],,[#include <inttypes.h>])
+  AC_CHECK_TYPE([uintptr_t],[scm_inttypes_has_uintptr=1],,[#include <inttypes.h>])
   AC_CHECK_TYPE([intmax_t],[scm_inttypes_has_intmax=1],,[#include <inttypes.h>])
   AC_CHECK_TYPE([uintmax_t],[scm_inttypes_has_uintmax=1],,[#include <inttypes.h>])
 fi
@@ -532,6 +535,20 @@
 fi
 AC_SUBST([SCM_I_GSC_T_UINT64])
 
+
+### Optional type scm_t_uintptr
+if test "$scm_stdint_has_uintptr"; then
+  SCM_I_GSC_T_UINTPTR='"uintptr_t"'
+  SCM_I_GSC_NEEDS_STDINT_H=1
+elif test "$scm_inttypes_has_uintptr"; then
+  SCM_I_GSC_T_UINTPTR='"uintptr_t"'
+  SCM_I_GSC_NEEDS_INTTYPES_H=1
+else
+  AC_MSG_ERROR([Can't find appropriate type for scm_t_uintptr.])
+fi
+AC_SUBST([SCM_I_GSC_T_UINTPTR])
+
+
 ### Required type scm_t_intmax
 ###
 ### We try 'intmax_t', '__int64', 'long long' in this order.  When
@@ -553,6 +570,7 @@
 fi
 AC_SUBST([SCM_I_GSC_T_INTMAX])
 
+
 ### Required type scm_t_uintmax
 ###
 ### We try 'uintmax_t', 'unsigned __int64', 'unsigned long long' in

       reply	other threads:[~2008-07-09 16:50 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <cmu-lmtpd-29205-1215446748-1@mail-imap1.uio.no>
2008-07-09 16:50 ` Kjetil S. Matheussen [this message]
2008-07-09 18:32   ` Passing C pointers through guile Kjetil S. Matheussen
2008-07-09 19:37     ` Ludovic Courtès
2008-07-09 19:35   ` Ludovic Courtès
2008-07-09 19:58 Kjetil S. Matheussen
  -- strict thread matches above, loose matches on Subject: below --
2008-07-09 20:09 Kjetil S. Matheussen
2008-07-09 20:43 ` Ludovic Courtès
2008-07-11 13:05 ` Greg Troxel
2008-07-11 13:12   ` Kjetil S. Matheussen
2008-07-11 14:42     ` Ludovic Courtès
2008-07-10 12:49 Kjetil S. Matheussen
2008-07-10 13:01 ` Ludovic Courtès
     [not found] <cmu-lmtpd-26382-1215792388-9@mail-imap1.uio.no>
2008-07-11 17:22 ` Kjetil S. Matheussen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/guile/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Pine.LNX.4.58.0807091836560.3261@notam02.uio.no \
    --to=k.s.matheussen@notam02.no \
    --cc=guile-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).