[gambit-list] Converting uint32 to scheme object
Alex Silva
asandroq at gmail.com
Thu Jan 7 11:24:26 EST 2016
Hallo,
On 06/01/16 15:37, Marc Feeley wrote:
> Of course one way would be to return a double (which has 53 bits of precision) and use NaN to encode “missing tag”. I’m not kidding!
>
> If you don’t like this approach, and I can understand why you wouldn’t, then you have to do the conversion to ___SCMOBJ by directly calling the conversion macros. Something like this:
>
> (define uint32_tag
> (c-lambda
> (TIFF* ttag_t)
> scheme-object
> "
> ___U32 val;
> if (TIFFGetField(___arg1, ___arg2, &val) == 1) {
> if ((___err = ___U32_to_SCMOBJ (___PSTATE, val, &___result, ___RETURN_POS)) == ___FIX(___NO_ERR)) {
> ___release_scmobj (___result);
> }
> } else {
> ___result = ___FAL;
> }
> "))
>
I ended up mimicking Lua and passing the state:
tiff.scm.c:
```
static ___SCMOBJ uint32_tag(___processor_state ps, TIFF *tiff, ttag_t
tag, ___SCMOBJ *err)
{
uint32 val;
if(TIFFGetField(tiff, tag, &val) == 1)
{
___SCMOBJ ret;
if((*err = ___U32_to_SCMOBJ(ps, val, &ret, ___RETURN_POS)) ==
___FIX(___NO_ERR))
{
___release_scmobj(ret);
}
return ret;
}
else
{
return ___FAL;
}
}
// example usage
static ___SCMOBJ tag_badfaxlines(___processor_state ps, TIFF *tiff,
___SCMOBJ *err)
{
return uint32_tag(ps, tiff, TIFFTAG_BADFAXLINES, err);
}
```
tiff.scm:
```
;; example usage
(define tiff:tag-badfaxlines (c-lambda (TIFF) scheme-object "___result =
tag_badfaxlines(___PSTATE, ___arg1, &___err);"))
```
I usually split the code into two files because I really dislike to
write C code inside strings.
Cheers,
--
-alex
http://unendli.ch/
More information about the Gambit-list
mailing list