[Gdal-dev] RFC 7: API Change for the VSIxxxL family of file functions

Eric Dönges eric.doenges at gmx.net
Wed Nov 1 06:10:37 EST 2006


Am 31.10.2006 um 16:32 schrieb Frank Warmerdam:

> VSIFOpenL() is not an across the board replacement for VSIFOpen().
> The non-L version of the functions continue to exist because
> some drivers use stdio functions that are not implemented for in
> the "L" api, such as VSIFGets().  In some cases driver code directly
> calls stdio functions using the FILE *.

I see. After looking at what VSIVirtualHandle provides, and what the  
drivers
in frmts and ogr need, what seems to be missing is equivalent  
functionality to fgets,
fgetc, ungetc, fprintf and fscanf. The first three would be fairly  
trivial to add, but
the next two ...

> Agreed.  One approach might be to make VSILFILE* a void pointer for  
> now
> with the intention of making it something else that would trigger type
> checking failures later - perhaps when we switch to GDAL 2.0 and are
> willing to sacrifice some backwards compatibility anyways.
>
> In the meantime applications can upgrade to the new mechanisms without
> too much disruption.

I reluctantly agree. I've updated the RFC accordingly. The short-term  
solution
should be much less work to do, since initially only two files need  
to be changed
(cpl_vsil.cpp and cpl_vsi.h).

--- snip ---

RFC 7: API Change for the VSIxxxL family of file functions

Author: Eric Dönges
Contact: Eric.Doenges at gmx.net
Status: Proposed


Purpose

To change the API for the VSIxxxL family of functions to use a new  
data-type
VSILFILE instead of the current FILE.

Background, Rationale

Currently, GDAL offers two APIs to abstract file access functions  
(referred to
as VSIxxx and VSIxxxL in this document). Both APIs claim to operate  
on FILE*;
however, the VSIxxxL functions can only operate on FILE* created by the
VSIOpenL function. This is because VSIOpenL returns a pointer to an  
internal
C++ class typecast to FILE*, not an actual FILE*. This makes it  
impossible
for the compiler to warn when the VSIxxx and VSIxxxL functions are
inappropriately mixed.

Proposed Fix

A new opaque data-type VSILFILE shall be declared. All VSIxxxL  
functions shall
be changed to use this new type instead of FILE. Additionally, any  
GDAL code
that uses the VSIxxxL functions must be changed to use this data-type  
as well.

Compatibility Issues, Transition timeline

In order to allow the compiler to detect inappropriate parameters  
passed to
any of the VSIxxxL functions, VSILFILE would have to be declared with  
the help
of an empty forward declaration, i.e. "typedef struct VSILFILE  
VSILFILE", with
the struct VSILFILE itself left undefined. However, this would break  
source
compatibility for any existing code using the VSIxxxL API.

Therefore, VSILFILE* will be declared as a void pointer for now, and  
the change
to a distinct pointer type deferred to a future release of gdal that  
is not
constrained with backward compatibility issues. While this will not  
solve the
primary issue (no warnings/errors from the compiler), looking at the  
declarations
of the VSIxxxL functions will at least make it immediately clear that  
these
functions cannot be expected to work if passed a FILE pointer.

--- snip ---

With kind regards,
Eric



More information about the Gdal-dev mailing list