2008/7/6 Ron <[EMAIL PROTECTED]>:

> I have been discussing improvements to "libcall" with Bram, and I would
> like to get feedback from you.
>  My specific issue is I want to interface with SQLite directly.  I
> wrote some new functions in my personal version of vim, but they are
> not general enough to satisfy Bram, and he's right in this case :)
>

Is there a reason why you can't interface with SQLite via Vim's Python or
Perl interfaces?


> Basically, this is what is desired:
> 1. The ability to demand-load an arbitrary function from an arbitrary
> DLL/SO, and deal with the parameters in an easy way.
> 2. The ability to write a 'callback' function in vimscript, also
> dealing with parameters etc. in a reasonable way.
>  The 'callback' functionality is necessary for interfacing with lots of
> DLLs - SQLite, expat and many others.  Of course it is possible to
> write a wrapper dll and use the existing 'libcall' interface -- and in
> fact, I was doing that for years -- but the existing libcall loads and
> unloads the DLL every time it's called, making stateful usage very
> difficult.
>  I propose a demand-loading mechanism like:
>      call libfunc('dll_function', 'dll_name', "isi",
> 'VimNameForFunction')
>

Under Win32, there are multiple calling conventions, __stdcall, __cdecl and
so on:
http://www.devarticles.com/c/a/Cplusplus/DLL-Conventions-Issues-and-Solutions-Part-II/
You can corrupt the process if you call a function using the wrong
convention.


> (anyone have a better syntax in mind?)
> So when 'VimNameForFunction' is called, it expects three paramters
> (isi) to be passed to it, an integer a string and another integer. It
> will then call the 'dll_function' in 'dll_name' (loading dll_name if
> it is not already loaded).  I use something similar in my Reva Forth.
> This way, the dll is not loaded unless it is needed, and the binding
> takes place dynamically.  When vim quits, the libraries loaded would
> be unloaded.
>  Parameter conversion should be done behind the scenes, and vim can
> warn of improper parameter types or missing parameters.
>

Do you propose to support anything more complicated than strings and ints?
Even strings are potentially complicated: ascii, utf-8, utf-16, utf-32,
dbcs, BSTRs, etc.


> Likewise, a 'callback' might be declared like:
>    callback MyCallback ( "ssi" )
>         let a = callback_param(0)
>         ...
>    endcallback
>  I think the syntax is reasonable - what do you think?
>

How about
  callback "ssi" MyCallback(firstName, lastName, age)

What does a callback return? Is there any notion of out-parameters or
ref-parameters?


>  Bigger question in my mind is how to implement callbacks in vim-
> script.  In Reva it's not a huge problem, as it generates native
> code.  But vimscript is completely interpreted, so I am guessing we
> need to have a way to have a "thunk" which is passed to the C code in
> the DLL, but which when called knows where to vector to.
>

It's certainly how I'd do it in Windows. I don't know enough about SO's
under Linux/Mac.


> It may be reasonable to have a limited number of callbacks available, though
> that would be an unfortunate restriction.  Any ideas on this?
>  Oh, one last thing.  in the callback example mentioned above, typing
> "MyCallback" should provide the address of the callback to be passed
> to calling code.  Vim code should never call a 'callback' directly, of
> course.
>

-- 
/George V. Reilly [EMAIL PROTECTED]
http://www.georgevreilly.com/blog http://blogs.cozi.com/tech

--~--~---------~--~----~------------~-------~--~----~
You received this message from the "vim_dev" maillist.
For more information, visit http://www.vim.org/maillist.php
-~----------~----~----~----~------~----~------~--~---

Raspunde prin e-mail lui