wget-for-windows icon indicating copy to clipboard operation
wget-for-windows copied to clipboard

Building with MSVC

Open gvanem opened this issue 5 months ago • 4 comments

I was amazed that building with the latest MSVC, gave me these errors:

http.c(645): error C2036: 'void *': unknown size
http.c(674): error C2036: 'void *': unknown size
url.c(1424): error C2036: 'void *': unknown size
url.c(1434): error C2036: 'void *': unknown size
url.c(1450): error C2036: 'void *': unknown size
url.c(1621): error C2036: 'void *': unknown size

This is due to how the DO_REALLOC() macro disregards pointer addition in places like:

 if (basevar_new != resp->headers)
        {
          memset (basevar_new + sizevar_old * sizeof (const char *), 0, (DR_newsize - sizevar_old) * sizeof (const char *));

Should be:

 if (basevar_new != resp->headers)
        {
          memset ((const char*) basevar_new + sizevar_old * sizeof (const char *), 0, (DR_newsize - sizevar_old) * sizeof (const char *));

to suite the brain-dead MSVC compiler. Hence:

--- a/src/wget.h 2025-07-02 11:54:09
+++ b/src/wget.h 2025-07-02 12:10:10
@@ -223,7 +223,7 @@
     void *basevar_new = xrealloc (basevar, DR_newsize * sizeof (type)); \
     assert(basevar_new);                                        \
     if (basevar_new != basevar) {                               \
-      memset (basevar_new + sizevar_old * sizeof (type), 0, (DR_newsize - sizevar_old) * sizeof (type)); \
+      memset ((type)basevar_new + sizevar_old * sizeof (type), 0, (DR_newsize - sizevar_old) * sizeof (type)); \
       basevar = basevar_new;                                    \
     }                                                           \
   }                                                             \

gvanem avatar Jul 02 '25 10:07 gvanem

Wait, that gave a new warning. Maybe this is better:

--- a/src/wget.h 2025-07-02 11:54:09
+++ b/src/wget.h 2025-07-02 12:23:11
@@ -220,11 +220,11 @@
     (sizevar) = DR_newsize;                                     \
   }                                                             \
   if (DR_newsize) {                                             \
-    void *basevar_new = xrealloc (basevar, DR_newsize * sizeof (type)); \
+    char *basevar_new = xrealloc (basevar, DR_newsize * sizeof (type)); \
     assert(basevar_new);                                        \
     if (basevar_new != basevar) {                               \
       memset (basevar_new + sizevar_old * sizeof (type), 0, (DR_newsize - sizevar_old) * sizeof (type)); \
-      basevar = basevar_new;                                    \
+      basevar = (type) basevar_new;                             \
     }                                                           \
   }                                                             \
 } while (0)

gvanem avatar Jul 02 '25 10:07 gvanem

Thanks for your feedback! But frankly, I never tried MSVC, as it heavily relying on the GCC tool chain, libgnu and others. They were not developed for MSVC.

lifenjoiner avatar Jul 02 '25 12:07 lifenjoiner

libgnu and others. They were not developed for MSVC.

You mean gnulib? It works with MSVC just fine.

gvanem avatar Jul 02 '25 12:07 gvanem

These codes are from the upstream. I prefer you contribute there first. It will be merged into my mod later. My mod part will be fixed here.

lifenjoiner avatar Jul 03 '25 11:07 lifenjoiner