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,