<div dir="ltr">Dear list,<br><br>I thought it would be an interesting exercise to learn something about Racket and FFI by wrapping libgeos (<a href="http://trac.osgeo.org/geos/">http://trac.osgeo.org/geos/</a>) similar to what the R people have done (<a href="http://cran.r-project.org/web/packages/rgeos/index.html">http://cran.r-project.org/web/packages/rgeos/index.html</a>).<br>
<br>Right out of the gate, I seem to be stuck, and am hoping for a nudge forward. The C library requires initialization before all else, and in turn that initialization function takes two pointers to two callback logging functions (from geos_c.h):<br>
<br><br>/* what a message handler looks like */<br>typedef void (*GEOSMessageHandler)(const char *fmt, ...);<br><br>/* what the call to initGEOS() looks like */<br>extern void GEOS_DLL initGEOS(GEOSMessageHandler notice_function, GEOSMessageHandler error_function);<br>
<br><br>I found examples in Python and in C (included in the R version) where they had created these functions and plumbed them into the logging infrastructure:<br><br># Python<br>NOTICEFUNC = CFUNCTYPE(None, c_char_p, c_char_p)<br>
def notice_h(fmt, lst):<br>    fmt, lst = fmt.decode(), lst.decode()<br>    try:<br>        warn_msg = fmt % lst<br>    except:<br>        warn_msg = fmt<br>    logger.warning(&#39;GEOS_NOTICE: %s\n&#39; % warn_msg)<br>notice_h = NOTICEFUNC(notice_h)<br>
<br><br>/* C - RGeos */<div><div>static void __warningHandler(const char *fmt, ...) {</div><div><br></div><div>    char buf[BUFSIZ], *p;</div><div>    va_list(ap);</div><div>    va_start(ap, fmt);</div><div>    vsprintf(buf, fmt, ap);</div>
<div>    va_end(ap);</div><div>    p = buf + strlen(buf) - 1;</div><div>    if(strlen(buf) &gt; 0 &amp;&amp; *p == &#39;\n&#39;) *p = &#39;\0&#39;;</div><div><br></div><div>    warning(buf);</div><div>    </div><div>    return;</div>
<div>}</div><br><br><br>I&#39;ve found _cprocedure, which says it can be used for callbacks to racket functions. After reading through that section in the docs a couple of times I&#39;m still a bit murky on what that would look like. It would seem I need to create a c-callable function that: <br>
1. receives one or more &#39;char&#39;</div><div>2. converts the char to a racket string<br>3. pass the string to &#39;log-FOO&#39; depending on the severity<br><br>Thank you for any tips/pointers/opinions/examples you can provide. I&#39;m several dimensions of novice here, and hope someone can help point me in the right direction.<br>
<br>Cheers,</div><div>Peter</div></div>