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;
}
"))