I've been experimenting with ways to call C and COBOL functions without need 
for a wrapper.

Tests are working out well with (a very platform specific) inline assembly 
layer.

The test COBOL

       identification division.
       program-id. sample.

       data division.
       linkage section.
       01 one usage binary-long.
       01 two usage binary-long.

       procedure division using by value one two.
       sample-main.
       display "GnuCOBOL got " one ", " two
       compute return-code = one + two
       goback.
       end program sample.

And the test Unicon

#
# testcob.icn, test calling COBOL without wrapper
#
$include "natives.inc"

procedure main()
    # will be RTLD_LAZY | RTLD_GLOBAL (so add to the search path)
    addLibrary := loadfunc("./uninative.so", "addLibrary")

    # allow arbitrary C functions, marshalled by a small piece of assembler
    native := loadfunc("./uninative.so", "native")

    # add the testing functions to the dlsym search path,
    #  the handle is somewhat irrelevant, but won't be soonish
    dlHandle := addLibrary("./cobolnative.so")

    # initialize GnuCOBOL
    native("cob_init", TYPEVOID)

    # pass two integers, get back a sum
    ans := native("sample", TYPEINT, 40, 2)
    write("Unicon: called sample and got ", ans)

    # rundown the libcob runtime
    native("cob_tidy", TYPEVOID)
end

Result pass

prompt$ cobc -m cobolnative.cob
prompt$ unicon -s testcob.icn -x
GnuCOBOL got +0000000040, +0000000002
Unicon: called sample and got 42 
Sad part, the inline assembly is only x86_64 System V ABI at the moment.  
(about 70 lines of inline extended assembler code, some 17 instructions, to 
manage both integral and double sized reals, input (freely mixed types) and 
return).  That code needs to change to handle floats (versus double) another 17 
instructions, without any refactoring.  At this point in time, a single 
function can't have mixed C float and double data, all other type mixes are 
testing well, but this is only a few hours in to the experiments.  Somewhat 
cherry picked testing, but integer, pointer/handle, real, and string data is 
functional.  There will be edge cases to find and work out, and details 
regarding memory ownership and the like.  This builds on the existing loadfunc 
feature but most details are then managed by a single entry point, 
"native(...)".

Windows 64 and 32 and other operating environments should be in the same range 
of instruction counts, but I'll know a little more once 32bit GNU/Linux is 
tackled, with the different call frame rules.  It might be upwards of 30 
instructions that need to be hand coded, not an overly burdensome burden for 
the powers that it provides to Unicon, in my biased opinion.  No wrappers 
required to get at C library functions.

Jafar, Clinton;  I need a little education on the new mkExternal feature in 
icall.h, as I could not get a working sample. Currently, pointer data is just 
sent back as an integer handle (which will break on some platforms), and I'd 
like to extend the supported types to C structs and pointers to memory blocks, 
etc.  I hope that just a short working example on what the actual C data type 
declaration is to start running with it; could not tell from the macro, so I 
thought I'd just ask instead of flailing about.

More at 
https://sourceforge.net/p/unicon/discussion/contributions/thread/4f3103fc/ 
(https://sourceforge.net/p/unicon/discussion/contributions/thread/4f3103fc/)

And an initial usage sample that embeds libharu for PDF generation at

https://sourceforge.net/p/unicon/discussion/general/thread/5e5d4ab1/ 
(https://sourceforge.net/p/unicon/discussion/general/thread/5e5d4ab1/)

If this seems like a want-able thing by the Unicon community, it'll require a 
small piece of assembler for each platform that wants to take part.  Getting 
cross-platform, by writing to each platform.  ;-)  If that happens, there will 
be a call out for volunteers that have access to various C compiler versions 
and OS releases on various chipsets.  Expect less than a page of code per 
platform.

Have good, make well, happiest of 2017s,
Brian
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most 
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Unicon-group mailing list
Unicon-group@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/unicon-group

Reply via email to