Hi Manuel,
You can compile the files I copy/paste in the email, below = "bigloo -c
failc.c ; bigloo fail.scm failc.o -o toto"
Then execute, and see the result:
> toto
dataOK1 = 12346789-123456789-123456789-, len is: 30
dataOK2 = 12346789-123456789-123456789-, len is: 30
data-not-KO = 1234, len is: 30
Let me comment:
- we have a C structure, a kind of buffer with 2 fields 'data' and 'length'
And we have a C function that set 'data' to a buf (filled) in the global area,
and set 'len' to 30.
In the scheme part, we construct an instance of c-struct and call the
c-function that initialize it; in a 'let*'
then, we try to retrieve the data content in the scheme, thanks to 3 bindings,
corresponding to 3 trials.
I would expect 3 identical results. I can't explain why the latest trial is
not ok.
It looks like the 'if' says 'true' in the 3rd binding , but we expect 'false'
that leads to a correct bind of the data.
...at the same time , a similar 'if' in the 2nd binding works fine ... that's
even more strange.
Tell me if you need more info.
Thanks, regards,
Michel
::::::::::::::
fail.h
::::::::::::::
typedef struct {
int len;
char* data;
} c_struct;
::::::::::::::
fail.scm
::::::::::::::
(module main
(main main)
(extern
(include "fail.h")
(type c_struct
(struct (len::int "len")
(data::string "data"))
"c_struct")
(c_fill_struct::int (c_struct*) "c_fill_struct"))
)
(define (main argv)
(let ((my-struct (c_struct* 0 "old")))
(process my-struct)))
(define (process my-struct)
(let* ((my-struct (c_struct* -1 "init-content"))
(res (c_fill_struct my-struct))
(dataOK1 (pragma::bstring "string_to_bstring_len( $1, $2 )"
(c_struct*-data my-struct) (c_struct*-len my-struct)))
(dataOK2 (if (equal? (c_struct*-len my-struct) 999)
"we should not get this because -len is not 999"
(pragma::bstring "string_to_bstring_len( $1, $2
)" (c_struct*-data my-struct) (c_struct*-len my-struct))))
(data-not-KO (if (equal? (c_struct*-len my-struct) 999)
(c_struct*-data my-struct) ;; we should not get
this, ...but it looks we get it !!
(pragma::bstring "string_to_bstring_len( $1, $2
)" (c_struct*-data my-struct) (c_struct*-len my-struct))))
)
(print "dataOK1 = " dataOK1 ", len is: " (c_struct*-len my-struct) )
(print "dataOK2 = " dataOK2 ", len is: " (c_struct*-len my-struct) )
(print "data-not-KO = " data-not-KO ", len is: " (c_struct*-len my-struct) )
))
::::::::::::::
failc.c
::::::::::::::
#include <stdlib.h>
#include "./fail.h"
char buf[100] = "123456789-123456789-123456789-zzzzzz.....";
int c_fill_struct (c_struct * my_c_struct) {
buf[4] = 0;
// return 'buf' , declare 30 bytes are significant,
my_c_struct->len = 30 ;
my_c_struct->data = buf;
return 0;
}
-----Original Message-----
From: [email protected] [mailto:[email protected]]
Sent: Friday, October 21, 2016 8:43 AM
To: Bruant, Michel
Cc: [email protected]
Subject: RE: [bigloo] let binding with c
> If few lines can illustrate it, then that may be manageable.
Yes. That will help a lot.
Thanks in advance,
--
Manuel