MSVC Portability

Zoltán Sólyom z-ismeretlen at freemail.hu
Sat Mar 30 20:09:12 EDT 2013


On 13/03/31 0:06, Elliott Sales de Andrade wrote:
> FYI, it would be better to send a patch file instead of a list of changes like this.

I just wrote that list up in case somebody is interested and I'm a 
complete beginner when it comes to such things. I'm in the middle of 
making this library work with .NET (learning C# along the way... I'm 
mainly used to C++) so it's not my priority to learn how to make a patch 
file, but I'll eventually get there if it's still needed.

I've made Visual Studio project files (tell me if you need them) that 
will work if you copy things from Pidgin source to the right path. 
(After making all the posted changes of course.) I don't want to meddle 
with the code yet, these are just fast changes to make the library 
compile with VS.

> libpurple/protocols/bonjour/mdns_common.h:
> // Add at the top:
> #ifdef _MSC_VER
> #include "config.h"
> #endif
> libpurple/protocols/irc/irc.h:
> // Add to the top:
> #ifdef _MSC_VER
> #include "config.h"
> #endif
> Why?

Because it works. :) I just searched a bit online and found that for 
someone including config.h "randomly" in sources made it work for them, 
so I tried. This is probably not the correct way to do things, but I 
needed a fast solution. There are a lot of additional defines (also 
defined in "config.h") in \libpurple\win32\global.mak which MinGW uses 
and which were missing. Unfortunately the MinGW make file contains 
"shell" commands to get some values (i.e. version numbers) from other 
files, and that probably needs Cygwin. The correct solution would 
probably be to write some batch file that runs by Visual Studio before 
it starts compiling. Maybe later.

>> libpurple/plugins/ssl/ssl-nss.c:
>> // Add after the includes. I copied this out from a different source
>> // file in libpurple, so hopefully this is what it should be.
>> #ifdef _MSC_VER
>> #ifndef _SSIZE_T_DEFINED
>> #ifdef  _WIN64
>> typedef __int64    ssize_t;
>> #else
>> typedef _W64 int   ssize_t;
>> #endif
>> #define _SSIZE_T_DEFINED
>> #endif
>> #endif
> I don't seem to see that code existing in libpurple. I'm not sure it's
> right either, as ssize_t could be 32-bit depending on the platform
> (though it may always be 64-bit on Windows, I don't know).
>

Oops. You are right, it is not in libpurple. I probably found it online, 
on a site such as this: 
http://permalink.gmane.org/gmane.comp.compilers.llvm.devel/30696 (This 
is not the place where I originally found it.)
I don't know the correct size of the type, just believed what I've read 
from several sources.

> libpurple/protocols/mxit/protocol.c:
> // Add after the includes.
> #ifdef _MSC_VER
> #include "cipher.h"
> #define strtoll _strtoi64;
> #endif
> Again, should use GLib's g_ascii_strtoll. (Plus, you shouldn't have a
> semicolon in a #define.) Also, why would you only need cipher.h on
> MSVC?
>

If I comment out the include I get: "warning C4013: 
'mxit_decrypt_message' undefined; assuming extern returning int"
It is just a warning but I'm not used to missing function calls causing 
mere warnings (not having programmed in C) so I included it just in 
case. It might not be needed, but I don't know what is the standard C 
behavior in this case.

> [...]
>
> #ifdef _MSC_VER
>          free(data);
> #endif
> This looks like a C99-ism or GNU extension and should be removed in
> all cases. But you should use g_malloc and g_free instead. The mxit
> guys do like to use g_alloca though.
>

I'll let anyone who know what they are doing fix this. I don't want to 
break something.

> unistd.h not found in:
> libpurple/protocols/gg/lib/
>      dcc7.c
>      *sha1.c
>      resolver.c
>      pubdir.c
>      libgadu.c
>      handlers.c
>      events.c
>      dcc.c
>      common.c
>      dcc7.c (already mentioned above)
>      http.c
> inttypes.h not found in:
> libpurple/protocols/gg/
>      lib.message.h
> unistd.h is included in internal.h, so the logic for whether to use
> io.h should probably be in there. However, these GG files are part of
> the external GG library, so I'm not sure how Tomasz wants to handle
> it.
>
>> unistd.h not found in:
>> libpurple/protocols/novell/
>>      *nmconn.c:
> See note above.
>

Creating an empty unistd.h file which merely includes io.h and putting 
it in any include path just for VS should fix things. Same with an empty 
inttypes.h. That way no source has to be modified.





More information about the Devel mailing list