Re: C-FFI, results, conditions

Bruce Mitchener <[email protected]>
Newsgroups gmane.comp.lang.dylan.gwydion.devel
Message-ID <CA+esKjOqtNzxDzgh2s33WqJ=kPhuMA5L=6Tcgutv=nW-74QF-g@mail.gmail.com>
Thanks!

This appears to work beautifully, even when using melange. :)

Will have to work this into my blog post explaining C-FFI stuff ...

 - Bruce



On Thu, Jan 17, 2013 at 2:53 AM, Thomas Chust <[email protected]> wrote:

> On Wed, 16 Jan 2013, Bruce Mitchener wrote:
>
>  [...]
>>
>> When wrapping an API with C-FFI (either directly or via melange
>> generating C-FFI), I often run into a situation where I have a function
>> that returns 0 or an error code.
>> I'd like to be able to have the C-FFI know how to pass the result to a
>> mapping function which would check for non-zero and then signal a
>> condition as appropriate.
>> [...]
>>
>
> Hello,
>
> if there are many functions returning the same type of result that needs
> to be checked, wouldn't a C-mapped-subtype for the results make sense?
>
> For all those C library functions that return positive integer handles or
> a negative number to indicate failure I would probably write code like this:
>
>   define C-variable C-errno :: <C-int>
>     c-name: "errno";
>   end;
>
>   define C-function C-strerror
>     parameter errno :: <C-int>;
>     result message :: <C-string>;
>     c-name: "strerror";
>   end;
>
>   define class <syscall-error> (<error>)
>     constant slot status :: <integer>, required-init-keyword: status:;
>     constant slot message :: <string>, init-keyword: message:, init-value:
> "Unknown error";
>   end;
>
>   define constant <nonnegative-integer> = limited(<integer>, min: 0);
>
>   define C-mapped-subtype <C-int-or-error> (<C-int>)
>     import-map <nonnegative-integer>, import-function:
>       method (result :: <integer>) => (checked :: <nonnegative-integer>)
>         if (result < 0)
>           let errno = C-errno();
>           error(make(<syscall-error>, status: errno, message:
> C-strerror(errno)));
>         else
>           result;
>         end;
>       end;
>   end;
>
>   define C-function C-open
>     parameter path :: <C-string>;
>     parameter flags :: <C-int>;
>     result handle :: <C-int-or-error>;
>     c-name: "open";
>   end;
>
>   ...
>
> I would probably also take an analogous route in SWIG and define a special
> type map for these return values which would include the error handling
> code.
>
> If this solution sucks for some reason, my next idea would be to just
> write a macro wrapping C-function-definer with additional syntactic sugar
> for the generation of complex wrapper functions.
>
> But it's been a while since I actually wrote something in Dylan, so I
> wouldn't be surprised if my code didn't meet the style guidelines or if
> there were much better solutions I overlooked ;-)
>
> Ciao,
> Thomas
>
>
> --
> When C++ is your hammer, every problem looks like your thumb.
> ______________________________**_________________
> hackers mailing list
> [email protected]
> https://lists.opendylan.org/**mailman/listinfo/hackers<https://lists.opendylan.org/mailman/listinfo/hackers>
>

_______________________________________________
hackers mailing list
[email protected]
https://lists.opendylan.org/mailman/listinfo/hackers
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.