New API call for path conversion

Václav Haisman v.haisman@sh.cvut.cz
Mon Feb 25 21:19:00 GMT 2008


Corinna Vinschen wrote, On 25.2.2008 12:30:
> On Feb 23 18:51, V?clav Haisman wrote:
>> Corinna Vinschen wrote, On 22.2.2008 13:19:
>>> Hi,
>> [...]
>>> Therefore, as a first cut, I'd propose something along the lines of:
>>>   typedef enum
>>>     {
>>>       CCP_WIN_A_TO_POSIX, /* from is char*, to is char*     */
>>>       CCP_WIN_W_TO_POSIX, /* from is wchar_t*, to is char*  */
>>>       CCP_POSIX_TO_WIN_A, /* from is char*, to is char*     */
>>>       CCP_POSIX_TO_WIN_W  /* from is char*, to is wchar_t*  */
>>>     } cygwin_conv_path_t;
>>>   ssize_t cygwin_conv_path (cygwin_conv_path_t what, const void *from,
>>>                             void *to, size_t size);
>>> "size" is the size of the "to" buffer in bytes (not in characters).
>>> If size is 0, cygwin_conv_path returns the required buffer size in
>>> bytes.
>>> Otherwise, it returns 0 on success, or -1 on error and errno is set to
>>> one of the below values:
>> [...]
>>> Does that sound reasonable?
>> I suggest that you use four different functions with different signatures 
>> instead of one with void pointers to buffers. Using just one function like 
>> that seems too error prone.
> 
> The idea was to have not too many new API calls.  One thing which bugged
> me with the old API was the long function names which I never get right
> the first time.  I always have to look the names up in sys/cygwin.h.  If
> you create a lot of different functions you have this problem again.
> OTOH, with my proposal you will have to look up the values for "what", I
> guess...  How should the new functions be named?  Care to make a
> proposal yourself?
> 
> 
> Corinna
> 
Well, personally I am not opposed to longer function names. But if you want 
shorter cygwin_conv_XXX where XXX is one of p2a, p2w, a2p, w2p. That would be 
just generic conversion routines. If you want to keep all the variants that 
are at the top of sys/cygwin.h then you will end up either with longer names 
(though still shorter than they are now) or with cryptic names, if you would 
abbreviate words "full" or "list" into "f" and "l" suffixes. One could even 
use OOish scheme like cygwin_subject_action_modifiers:

cygwin_pid_w2p
cygwin_pathl_{w2p,p2w}
cygwin_pathl_{w2p,p2w}_size
cygwin_path_{p2a,p2w,a2p,w2p}
cygwin_path_{p2a,p2w,a2p,w2p}_full
cygwin_path_p_list_p
cygwin_path_split

etc.

Then there is cygwin_internal(). I do not like the va_args/switch combination 
very much. Nicer interface would be C style OO, returning pointer to 
structure filled with function pointers. That way you can expose many 
functions without having them as DLL exports. You could even do that with the 
conversion routines above and make the DLL exports list even shorter.


--
VH


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 250 bytes
Desc: OpenPGP digital signature
URL: <http://cygwin.com/pipermail/cygwin-developers/attachments/20080225/2ac7135f/attachment.sig>


More information about the Cygwin-developers mailing list