2016-01-06 22:37 GMT+08:00 Marc Feeley <feeley@iro.umontreal.ca>:
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;
    }
   "))

Neat! What is the risk involved with this one - I mean, the Scheme object allocation on the Gambit heap could fail under certain circumstances. But would that only be on malloc() failure?