Adjusting GLPK for stdcall

Heinrich Schuchardt <[email protected]>
Newsgroups gmane.comp.gnu.glpk
Message-ID <[email protected]>
On 01/05/2017 09:50 PM, Passorelli, Curtis wrote:
> I have the 4.60 source code. Is there any way to compile it to work
with VBA such as adding Gz to the Make File or changing the source code
to __stdcall?

Hello Curtis,

according to
https://msdn.microsoft.com/en-us/en_us/library/zxk0tw93.aspx
__stdcall is only relevant for 32bit and ignored on the amd64/x64
architecture.

/Gz sets the __stdcall convention for all functions
https://msdn.microsoft.com/en-us/library/46t77ak2.aspx

But the code still has to be changed manually where function pointers
are passed that have to be __cdecl. This was the case when calling qsort
under Visual Studio 2008.

Below you find a summary of the changes needed for 4.37. It is a small
number of places.

I think the best way to do it would be to provide a symbol, e.g. CDECL,
everywhere where compiling with /Gz requires __cdecl. This symbol than
can be defined as __cdecl in w32/config.h and as blank in all other
config.h files.

The patch should be sent to Andrew for integration into his upstream code.

@Andrew
LibreOffice supports calling native DLLs on Windows. The MPL license is
compatible with GPL, cf. https://www.gnu.org/licenses/license-list.html
So there is a legitimate reason for compiling with __stdcall convention.

Best regards

Heinrich Schuchardt

diff -ruN glpk-4.37/src/glpini02.c glpk-4.37-stdcall/src/glpini02.c
--- glpk-4.37/src/glpini02.c	2009-03-29 11:00:00.000000000 +0200
+++ glpk-4.37-stdcall/src/glpini02.c	2010-01-04 19:19:14.815755000 +0100
@@ -31,7 +31,7 @@
       /* penalty value */
 };

-static int fcmp(const void *ptr1, const void *ptr2)
+static int __cdecl fcmp(const void *ptr1, const void *ptr2)
 {     /* this routine is passed to the qsort() function */
       struct var *col1 = (void *)ptr1, *col2 = (void *)ptr2;
       if (col1->q < col2->q) return -1;
diff -ruN glpk-4.37/src/glpios03.c glpk-4.37-stdcall/src/glpios03.c
--- glpk-4.37/src/glpios03.c	2009-03-29 11:00:00.000000000 +0200
+++ glpk-4.37-stdcall/src/glpios03.c	2010-01-04 19:19:14.815755000 +0100
@@ -432,7 +432,7 @@
 #if 0
 struct col { int j; double f; };

-static int fcmp(const void *x1, const void *x2)
+static int __cdecl fcmp(const void *x1, const void *x2)
 {     const struct col *c1 = x1, *c2 = x2;
       if (c1->f > c2->f) return -1;
       if (c1->f < c2->f) return +1;
@@ -1811,7 +1811,7 @@

 struct cut { IOSCUT *cut; double eff; };

-static int fcmp(const void *x1, const void *x2)
+static int __cdecl fcmp(const void *x1, const void *x2)
 {     const struct cut *c1 = x1, *c2 = x2;
       if (c1->eff > c2->eff) return -1;
       if (c1->eff < c2->eff) return +1;
diff -ruN glpk-4.37/src/glpios05.c glpk-4.37-stdcall/src/glpios05.c
--- glpk-4.37/src/glpios05.c	2009-03-29 11:00:00.000000000 +0200
+++ glpk-4.37-stdcall/src/glpios05.c	2010-01-04 19:19:14.815755000 +0100
@@ -225,7 +225,7 @@

 struct var { int j; double f; };

-static int fcmp(const void *p1, const void *p2)
+static int __cdecl fcmp(const void *p1, const void *p2)
 {     const struct var *v1 = p1, *v2 = p2;
       if (v1->f > v2->f) return -1;
       if (v1->f < v2->f) return +1;
diff -ruN glpk-4.37/src/glpios06.c glpk-4.37-stdcall/src/glpios06.c
--- glpk-4.37/src/glpios06.c	2009-03-29 11:00:00.000000000 +0200
+++ glpk-4.37-stdcall/src/glpios06.c	2010-01-04 19:19:14.815755000 +0100
@@ -774,7 +774,7 @@

 struct vset { int j; double v; };

-static int cmir_cmp(const void *p1, const void *p2)
+static int __cdecl cmir_cmp(const void *p1, const void *p2)
 {     const struct vset *v1 = p1, *v2 = p2;
       if (v1->v < v2->v) return -1;
       if (v1->v > v2->v) return +1;
diff -ruN glpk-4.37/src/glpios10.c glpk-4.37-stdcall/src/glpios10.c
--- glpk-4.37/src/glpios10.c	2009-03-29 11:00:00.000000000 +0200
+++ glpk-4.37-stdcall/src/glpios10.c	2010-01-04 19:19:14.815755000 +0100
@@ -54,7 +54,7 @@
       /* sorting key */
 };

-static int fcmp(const void *x, const void *y)
+static int __cdecl fcmp(const void *x, const void *y)
 {     /* comparison routine */
       const struct VAR *vx = x, *vy = y;
       if (vx->d > vy->d)
diff -ruN glpk-4.37/w32/Makefile_VC9_DLL
glpk-4.37-stdcall/w32/Makefile_VC9_DLL
--- glpk-4.37/w32/Makefile_VC9_DLL	2009-03-29 11:00:00.000000000 +0200
+++ glpk-4.37-stdcall/w32/Makefile_VC9_DLL	2010-01-04 19:19:14.815755000
+0100
@@ -1,6 +1,6 @@
 # Build GLPK DLL with Microsoft Visual Studio Express 2008

-CFLAGS = /I. /DHAVE_CONFIG_H /nologo /W3 /O2
+CFLAGS = /I. /DHAVE_CONFIG_H /nologo /W3 /O2 /Gz

 OBJSET = \
 ..\src\glpapi01.obj \
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.