On 2015-01-30 Gabi Davar wrote:
> There many warnings detected by VS which I'm not sure how to fix.

Maybe I can test with VS Community myself some day.

> >   - Are the casts added in tuklib_integer.h there to silence
> >     warnings? If so, I'll add the casts.

> [GabiD] - They silence a few warnings.

OK, I will change it.

> >   - I don't want "restrict" keywords in the API headers. The headers
> >     need to be C89 and C++98 compatible. There is nothing wrong
> >     having the restricts only in the .c files. Maybe they were added
> >     to silence warnings? The restricts aren't that important so
> >     maybe they could even be removed, but I think the best is to
> >     leave those as is unless MSVC cannot compile it at all now
> >     (maybe add a flag to MSVC to omit that warning).

> [GabiD] - They generate warnings. It's best to keep the definition and
> deceleration of a function identical.  I'll revert this is an
> interface change and there are other places where it's not fixed.

The only sane way to keep them identical would be removing the
"restrict" keywords from the .c files. It wouldn't be a big loss but it
would be a bit silly.

> On a side note, It's unclear to me why the interfaces are to be in C89
> since the implementation requires it (mixing C runtimes in windows
> will caused failures).

liblzma is implemented in C99 but keeping the API headers compatible
with C89 and C++98 allows using the library from those languages too.

I might be wrong, but doesn't it work to mix runtimes if one doesn't
expose runtime-specific stuff via the DLL API? For example, liblzma API
doesn't have any C-library-dependent declarations and it doesn't, for
example, expose file descriptor numbers or throw exceptions. I have
understood that this way it's fine to use MinGW-w64-built liblzma.dll
with other toolchains. Most of time time it doesn't work with static
libraries though, which is why people have been wishing that liblzma
could be built with Visual Studio so that they could create a static
executable that includes liblzma. For non-static uses the existing
binaries should be OK.

> >   - _snprintf isn't a safe replacement for C99 snprintf. Maybe it is
> >     acceptable here since the buffers used in xz should be big
> >     enough, but I have still liked using snprintf. (It's good to
> >     note that snprintf is only needed for the command line tools,
> >     not liblzma.)

> [GabiD] If it's that important I'll add an implementation for pre VS
> 14.

Well, I'm not sure what is reasonable. Note that xz uses vsnprintf too
which is equally non-standard in VS 2013, but since it exists in VS
2013, one doesn't get an error when compiling. The non-standard
implementations don't always null-terminate the string and the return
value is non-standard in some cases. I think it shouldn't be a problem
in the current xz code, yet it leaves a slightly uncomfortable feeling.

Hopefully there aren't other traps like this in VS 2013. On the other
hand it's good to keep in mind that the xz command line tools were
originally written with POSIX-like systems in mind. Getting liblzma to
build should be much simpler (and safer) since it doesn't need much
from the C library. liblzma is also more important than the command
line tools since the command line tools already are available for
Windows, but making them build with VS 2013 is still good, I guess.

> >   - I don't want to commit a second copy of getopt.h. Perhaps just
> >     make windows/msvc2013/getopt.h #include "../../lib/getopt.in.h"?

> [GabiD] - Since they are identical, How about renaming getopt.in.h to
> getopt.h?

The idea of .in.h is that if configure detects that the system getopt.h
isn't good enough, a replacement getopt.h will be created. The "lib"
directory, which might contain getopt.h, is always in the compiler
include path. My understanding is that this is a common way to handle
replacement headers.

As long as there is just a single replacement header, other tricks
could work. Since there might be other replacement headers in the
future, it's no use to change this. It's simplest to add a one-line
wrapper header for VS 2013.

-- 
Lasse Collin  |  IRC: Larhzu @ IRCnet & Freenode

Reply via email to