Description: upstream: refresh: plugins: maple
 It appears that the machinery to build `tm_maple_9` is broken
 and the C source to interface with OpenMaple emits numerous
 warnings and errors at compile time. This patch fixes the
 machinery and refreshes the C source.
Origin: vendor, Debian
Forwarded: https://github.com/texmacs/texmacs/pull/93
Author: Jerome Benoit <calculus@rezozer.net>
Last-Update: 2024-08-13

--- a/plugins/maple/bin/tm_maple
+++ b/plugins/maple/bin/tm_maple
@@ -1,43 +1,65 @@
 #!/bin/sh
+##set -x
+
+TEXMACS_HOME_PLUGINS_MAPLE_DIR="$TEXMACS_HOME_PATH/plugins/maple"
+if [ ! -d $TEXMACS_HOME_PLUGINS_MAPLE_DIR ]; then
+	mkdir $TEXMACS_HOME_PLUGINS_MAPLE_DIR
+fi
+TEXMACS_HOME_PLUGINS_MAPLE_CONF="$TEXMACS_HOME_PLUGINS_MAPLE_DIR/tm_maple.conf"
 
 TEXMACS_MAPLE_BIN=`which maple`
-TEXMACS_MAPLE_BIN=`realpath "$TEXMACS_MAPLE_BIN"`
-#if [ $? -ne 0 ]
-#then
-#    TEXMACS_MAPLE_BIN=`which maple`
-#    TEXMACS_MAPLE_BIN=`realpath.py "$TEXMACS_MAPLE_BIN"`
-#fi
-if [ $? -ne 0 ]
-then
-    TEXMACS_MAPLE_BIN=`which maple`
+TEXMACS_HOME_PLUGINS_MAPLE_DO_SYMLINK="no"
+if [ -r $TEXMACS_HOME_PLUGINS_MAPLE_CONF ]; then
+	. $TEXMACS_HOME_PLUGINS_MAPLE_CONF
 fi
-#TEXMACS_MAPLE_DIR=`echo -n "$TEXMACS_MAPLE_BIN" | sed -e 's%/bin/maple$%%'`
-TEXMACS_MAPLE_DIR=`echo "$TEXMACS_MAPLE_BIN" | sed -e 's%/bin/maple$%%'`
+
+TEXMACS_MAPLE_DIR=`echo "printf(kernelopts(mapledir));" | $TEXMACS_MAPLE_BIN -q`
 export TEXMACS_MAPLE_BIN
 export TEXMACS_MAPLE_DIR
 
-MAPLE_CPPFLAGS="-I$TEXMACS_MAPLE_DIR/extern/include"
-MAPLE_SYS_BIN=""
-if test -e "$TEXMACS_MAPLE_DIR/bin/maple.system.type"; then
-  MAPLE_SYS_BIN=$("$TEXMACS_MAPLE_DIR/bin/maple.system.type")
-fi
-MAPLE_LDFLAGS="-L$TEXMACS_MAPLE_DIR/$MAPLE_SYS_BIN -lmaplec"
-if [ "$MAPLE_SYS_BIN" -eq "bin.IBM_INTEL_LINUX" ]; then
-  MAPLE_LDFLAGS="-L$TEXMACS_MAPLE_DIR/$MAPLE_SYS_BIN -Wl,-rpath,$(TEXMACS_MAPLE_DIR)/$MAPLE_SYS_BIN -lmaplec"
-fi
-export MAPLE_CPPFLAGS
-export MAPLE_LDFLAGS
-
-if [ -d "$TEXMACS_MAPLE_DIR/extern" ]
-then
-    if [ -f "$TEXMACS_HOME_PATH/bin/tm_maple_9.sh" ]
-    then
-        DUMMY="dummy"
-    else
-        cd $TEXMACS_PATH/plugins/maple; make -f Makefile.9 TEXMACS_HOME_PATH="$TEXMACS_HOME_PATH"
-    fi
-    exec "${HOME}/.TeXmacs/bin/tm_maple_9.sh"
-elif [ -f "$TEXMACS_MAPLE_DIR/mwshelp" ]
-then
-    exec tm_maple_5
+if [ -d "$TEXMACS_MAPLE_DIR/extern" ]; then
+	TEXMACS_MAPLE_STAMP="$TEXMACS_MAPLE_DIR/license/version.txt"
+	if [ ! -f $TEXMACS_MAPLE_STAMP ]; then
+		TEXMACS_MAPLE_STAMP="$TEXMACS_MAPLE_DIR/license/license.dat"
+		if [ ! -f $TEXMACS_MAPLE_STAMP ]; then
+			TEXMACS_MAPLE_STAMP="$TEXMACS_HOME_PLUGINS_MAPLE_DIR/maple-stamp"
+			MAPLE_KERNEL_BUILD_DATE=`echo "printf(op(3,sscanf(kernelopts(version),\"%[^,],%[^,],%[^,]\")));" | $TEXMACS_MAPLE_BIN -q`
+			touch -d "$MAPLE_KERNEL_BUILD_DATE" $TEXMACS_MAPLE_STAMP
+		fi
+	fi
+	if [ ! -x "$TEXMACS_HOME_PATH/bin/tm_maple_9" -o "$TEXMACS_MAPLE_STAMP" -nt "$TEXMACS_HOME_PATH/bin/tm_maple_9" ] || \
+			[ ! -x "$TEXMACS_HOME_PATH/bin/tm_maple_9.sh" -o "$TEXMACS_MAPLE_STAMP" -nt "$TEXMACS_HOME_PATH/bin/tm_maple_9.sh" ]; then
+		MAPLE_SYS_BIN=`echo "printf(kernelopts(bindir));" | $TEXMACS_MAPLE_BIN -q`
+		MAPLE_LIBRARY_PATH=$MAPLE_SYS_BIN
+		if [ -d "$MAPLE_SYS_BIN/system" -a -x "$MAPLE_SYS_BIN/cppcheck" ]; then
+			if ! ( LD_LIBRARY_PATH=$MAPLE_SYS_BIN $MAPLE_SYS_BIN/cppcheck > /dev/null 2>&1 ; ) then
+				MAPLE_LIBRARY_PATH="$MAPLE_SYS_BIN/system:$MAPLE_LIBRARY_PATH"
+			fi
+		fi
+		MAPLE_CPPFLAGS="-I$TEXMACS_MAPLE_DIR/extern/include"
+		MAPLE_LDFLAGS="-L$MAPLE_LIBRARY_PATH"
+		MAPLE_LIBADD="-lmaplec"
+		case "${MAPLE_SYS_BIN##*bin.}" in
+			IBM_INTEL_LINUX|X86_64_LINUX)
+				MAPLE_LDFLAGS="$MAPLE_LDFLAGS -Wl,-rpath,$MAPLE_LIBRARY_PATH" ;;
+			*) ;;
+		esac
+		export MAPLE_CPPFLAGS
+		export MAPLE_LDFLAGS
+		export MAPLE_LIBADD
+		make -s -C $TEXMACS_PATH/plugins/maple -f Makefile.9 TEXMACS_HOME_PATH="$TEXMACS_HOME_PATH" TEXMACS_MAPLE_STAMP="$TEXMACS_MAPLE_STAMP"
+		if [ $? -ne 0 ]; then
+			echo "cannot build $TEXMACS_HOME_PATH/bin/tm_maple_9*" 1>&2
+			exit 1
+		fi
+		if [ "$TEXMACS_HOME_PLUGINS_MAPLE_DO_SYMLINK" != "no" -a ! -f $TEXMACS_HOME_PATH/bin/tm_maple ]; then
+			{ cd $TEXMACS_HOME_PATH/bin && ln -s tm_maple_9.sh tm_maple ; }
+		fi
+	fi
+	exec "$TEXMACS_HOME_PATH/bin/tm_maple_9.sh"
+elif [ -f "$TEXMACS_MAPLE_DIR/mwshelp" ]; then
+	exec tm_maple_5
+else
+	echo "Maple version not yet supported" 1>&2
 fi
+exit 126
--- a/plugins/maple/src.9/tm_maple_9.c
+++ b/plugins/maple/src.9/tm_maple_9.c
@@ -1,8 +1,8 @@
 
 /******************************************************************************
 * MODULE     : tm_maple_9.c
-* DESCRIPTION: Interface with Maple
-* COPYRIGHT  : (C) 2005 Joris van der Hoeven
+* DESCRIPTION: Interface with OpenMaple/Maple
+* COPYRIGHT  : (C) 2005-2024 Joris van der Hoeven
 *******************************************************************************
 * This software falls under the GNU general public license version 3 or later.
 * It comes WITHOUT ANY WARRANTY WHATSOEVER. For details, see the file LICENSE
@@ -14,6 +14,8 @@
 #include <signal.h>
 #include <sys/types.h>
 #include <time.h>
+#include <unistd.h>
+#include <string.h>
 #include "maplec.h"
 
 #define DATA_BEGIN   ((char) 2)
@@ -23,16 +25,13 @@
 //#define DATA_END     "[END]"
 //#define DATA_ESCAPE  "[ESCAPE]"
 
-static int counter= 0;
-static char in [2148];
-static char err[2048];
-
 /******************************************************************************
 * Handling maple output
 ******************************************************************************/
 
 void
 next_input () {
+  static int counter = 0;
   counter++;
   printf ("\2channel:prompt\5");
   printf ("\2scheme:(with \"color\" \"brown\" \"");
@@ -81,21 +80,22 @@
 }
 
 /* callback used for directing result output */
-static void M_DECL textCallBack( void *data, int tag, char *output )
+static void M_DECL textCallBack( void *data, int tag, const char *output )
 {
   if (tag != MAPLE_TEXT_STATUS)
     printf ("%s\n", output);
 }
 
-static void M_DECL errorCallBack( void *data, M_INT offset, char *msg )
+static void M_DECL errorCallBack( void *data, M_INT offset, const char *msg )
 {
+  char* in=(char *)data;
   M_INT i;
   /* TODO: too wide (>= 80 characters) user input */
 
   if (offset < 0)
     fprintf (stderr, "%s\n", msg);
   else {
-    /* put ^^^ under the original input to indicate where 
+    /* put ^^^ under the original input to indicate where
        the syntax error probably was
     */
     fprintf (stderr, "Syntax Error, %s\n> %s\n", msg, in);
@@ -111,18 +111,32 @@
 
 int
 main (int argc, char *argv[]) {
+  const char* tm_path=getenv("TEXMACS_PATH");
+  char in [2148];
+  char err[2048];
+	char tmmplinit [2048];
   MKernelVector kv;  /* Maple kernel handle */
-  MCallBackVectorDesc cb = {  textCallBack, 
+  MCallBackVectorDesc cb = {
+			      textCallBack,
 			      errorCallBack,
 			      0,   /* statusCallBack not used */
 			      0,   /* readLineCallBack not used */
 			      0,   /* redirectCallBack not used */
 			      0,   /* streamCallBack not used */
-			      queryInterrupt, 
+			      queryInterrupt,
 			      0    /* callBackCallBack not used */
                            };
   ALGEB r, l;  /* Maple data-structures */
 
+  (void) r;  /* silence unused-but-set-variable warning */
+  (void) l;  /* silence unused-variable warning */
+
+	snprintf(tmmplinit,sizeof(tmmplinit),"%s/plugins/maple/maple/init-maple.mpl",tm_path);
+	if (access(tmmplinit,R_OK)) {
+		printf("Fatal error, unable to read `%s`\n",tmmplinit);
+		return( 1 );
+	}
+
   signal(SIGINT,catch_intr);
   printf("\2verbatim:");
   printf("    |\\^/|     Maple\n");
@@ -131,20 +145,16 @@
   printf(" <____ ____>  Waterloo Maple Inc.\n");
   printf("      |       Type ? for help.\n");
   printf("\nTeXmacs interface by Joris van der Hoeven\n");
-  
+
   /* initialize Maple */
-  if( (kv=StartMaple(argc,argv,&cb,NULL,NULL,err)) == NULL ) {
+  if( (kv=StartMaple(argc,argv,&cb,(void *)in,NULL,err)) == NULL) {
     printf("Fatal error, %s\n",err);
     return( 1 );
   }
 
-  r= EvalMapleStatement (kv, "tmmaple:=9:");
-  char* tm_path= getenv ("TEXMACS_PATH");
-  char init[1000];
-  strcpy (init, "read (`");
-  strcat (init, tm_path);
-  strcat (init, "/plugins/maple/maple/init-maple.mpl`);");
-  r= EvalMapleStatement (kv, init);
+  r= EvalMapleStatement (kv, "tmmaple:=9:protect('tmmaple'):");
+	snprintf(in,sizeof(in),"read(`%s`);",tmmplinit);
+  r= EvalMapleStatement (kv, in);
 
   while (1) {
     next_input ();
--- a/plugins/maple/Makefile.9
+++ b/plugins/maple/Makefile.9
@@ -1,7 +1,7 @@
 
 ###############################################################################
 # MODULE     : Make file for maple plugin
-# COPYRIGHT  : (C) 1999-2008  Joris van der Hoeven
+# COPYRIGHT  : (C) 1999-2024  Joris van der Hoeven
 ###############################################################################
 # This software falls under the GNU general public license version 3 or later.
 # It comes WITHOUT ANY WARRANTY WHATSOEVER. For details, see the file LICENSE
@@ -10,17 +10,27 @@
 
 CC = gcc
 
-#TEXMACS_HOME_PATH = $(HOME)/.TeXmacs
-#TEXMACS_MAPLE_DIR = $(shell realpath `which maple` | sed -e 's%/bin/maple$$%%')
-
-#MAPLE_CPPFLAGS = -I$(TEXMACS_MAPLE_DIR)/extern/include
-#MAPLE_LDFLAGS = -L$(TEXMACS_MAPLE_DIR)/bin.IBM_INTEL_LINUX -Wl,-rpath,$(TEXMACS_MAPLE_DIR)/bin.IBM_INTEL_LINUX -lmaplec
+TEXMACS_HOME_PATH ?= $(HOME)/.TeXmacs
+TEXMACS_MAPLE_BIN ?= $(shell which maple)
+TEXMACS_MAPLE_DIR ?= $(shell echo 'printf(kernelopts(mapledir));' | $(TEXMACS_MAPLE_BIN) -q)
+MAPLE_SYS_BIN     ?= $(shell echo 'printf(kernelopts(bindir));' | $(TEXMACS_MAPLE_BIN) -q)
+
+TEXMACS_MAPLE_STAMP ?= $(TEXMACS_MAPLE_DIR)/license/version.txt
+
+MAPLE_CPPFLAGS ?= -I$(TEXMACS_MAPLE_DIR)/extern/include
+MAPLE_LDFLAGS  ?= -L$(MAPLE_SYS_BIN) -Wl,-rpath,$(MAPLE_SYS_BIN)
+MAPLE_LIBADD   ?= -lmaplec
 
 all: $(TEXMACS_HOME_PATH)/bin/tm_maple_9.sh $(TEXMACS_HOME_PATH)/bin/tm_maple_9
 
 $(TEXMACS_HOME_PATH)/bin/tm_maple_9.sh: $(TEXMACS_MAPLE_DIR)/bin/maple
-	cat $(TEXMACS_MAPLE_DIR)/bin/maple | sed 's%$${MAPLE}/$$MAPLE_SYS_BIN/cmaple%$${HOME}/.TeXmacs/bin/tm_maple_9%' | sed 's%$${MAPLE}/$$MAPLE_SYS_BIN/maplew%$${HOME}/.TeXmacs/bin/tm_maple_9%' > $(TEXMACS_HOME_PATH)/bin/tm_maple_9.sh
-	chmod a+x $(TEXMACS_HOME_PATH)/bin/tm_maple_9.sh
+	sed \
+			-e 's%$${MAPLE}/$$MAPLE_SYS_BIN/cmaple%$(TEXMACS_HOME_PATH)/bin/tm_maple_9%' \
+			-e 's%$${MAPLE}/$$MAPLE_SYS_BIN/maplew%$(TEXMACS_HOME_PATH)/bin/tm_maple_9%' \
+		$< > $@ && chmod a+x $@
+
+$(TEXMACS_HOME_PATH)/bin/tm_maple_9: src.9/tm_maple_9.c $(TEXMACS_MAPLE_STAMP)
+	$(CC) $(MAPLE_LDFLAGS) $(MAPLE_CPPFLAGS) $< -o $@ $(MAPLE_LIBADD)
 
-$(TEXMACS_HOME_PATH)/bin/tm_maple_9: src.9/tm_maple_9.c
-	$(CC) $(MAPLE_LDFLAGS) $(MAPLE_CPPFLAGS) src.9/tm_maple_9.c -o $(TEXMACS_HOME_PATH)/bin/tm_maple_9
+clean:
+	rm -f $(TEXMACS_HOME_PATH)/bin/tm_maple_9 $(TEXMACS_HOME_PATH)/bin/tm_maple_9.sh
