mirror of
https://github.com/gentoo-mirror/guru.git
synced 2026-07-21 21:13:27 -04:00
sci-libs/saclib: add stuff from qepcad bundled saclib to saclib
Signed-off-by: Alessandro Barbieri <lssndrbarbieri@gmail.com>
This commit is contained in:
@@ -1,6 +1,5 @@
|
||||
diff -ur a/bin/mklib b/bin/mklib
|
||||
--- a/bin/mklib 2018-01-30 22:09:32.000000000 +0100
|
||||
+++ b/bin/mklib 2020-04-28 21:03:24.823472623 +0200
|
||||
--- a/bin/mklib
|
||||
+++ b/bin/mklib
|
||||
@@ -2,31 +2,17 @@
|
||||
|
||||
# USAGE:
|
||||
@@ -77,9 +76,8 @@ diff -ur a/bin/mklib b/bin/mklib
|
||||
popd >/dev/null
|
||||
pushd >/dev/null $saclib/lib/objo
|
||||
make CC=$CC "SACFLAG=" EXTENSION=o
|
||||
diff -ur a/bin/mkmake b/bin/mkmake
|
||||
--- a/bin/mkmake 2018-01-30 22:09:32.000000000 +0100
|
||||
+++ b/bin/mkmake 2020-04-28 21:29:02.709088176 +0200
|
||||
--- a/bin/mkmake
|
||||
+++ b/bin/mkmake
|
||||
@@ -25,20 +25,16 @@
|
||||
# E.g. if <flag> is -g and <character> is d, the library will be
|
||||
# compiled with the debug option set and the library name will be
|
||||
@@ -126,7 +124,7 @@ diff -ur a/bin/mkmake b/bin/mkmake
|
||||
-# ${AR} ts ${TARGET}
|
||||
-# Use "ranlib" if your system's "ar" does not have the option "s".
|
||||
- ${RANLIB} ${TARGET}
|
||||
+ $(CC) ${OBJS1} ${OBJS2a} ${OBJS2b} ${OBJS3} ${OBJS4} -fPIC -shared ${CFLAGS} -o $@ ${LDFLAGS} -Wl,-soname,${FULLLIBNAME}
|
||||
+ $(CXX) ${OBJS1} ${OBJS2a} ${OBJS2b} ${OBJS3} ${OBJS4} ${saclib}/src/gcword.cc -I${saclib}/include -I${saclib}/src -fPIC -shared ${CXXFLAGS} -o $@ ${LDFLAGS} -Wl,-soname,${FULLLIBNAME}
|
||||
@echo "Created '${TARGET}'."
|
||||
|
||||
EOF
|
||||
|
||||
228
sci-libs/saclib/files/qepcad-compat.patch
Normal file
228
sci-libs/saclib/files/qepcad-compat.patch
Normal file
@@ -0,0 +1,228 @@
|
||||
--- saclib2.2.8-orig/src/FAIL.c
|
||||
+++ saclib2.2.8/src/FAIL.c
|
||||
@@ -1,7 +1,10 @@
|
||||
/*======================================================================
|
||||
FAIL(algName,msg,...)
|
||||
|
||||
-Failure handler.
|
||||
+Failure handler.
|
||||
+** REDEFINED FOR QEPCAD! QepcadB needs to, potentially, kill some child
|
||||
+** processes. That's what this adds. A better long-term solution is to
|
||||
+** change Saclib's FAIL to add an analogue to "atexit".
|
||||
|
||||
Inputs
|
||||
algName : the name of the algorithm which called this algorithm.
|
||||
@@ -20,12 +23,13 @@
|
||||
#ifdef __STDC__
|
||||
void FAIL(const char *algName, const char *msg,...)
|
||||
#else
|
||||
-void FAIL(algName,msg) __noreturn
|
||||
+void FAIL(algName,msg)
|
||||
const char *algName;
|
||||
const char *msg;
|
||||
#endif
|
||||
{
|
||||
va_list argPtr;
|
||||
+ // extern int strcmp();
|
||||
|
||||
Step1: /* Basic message. */
|
||||
SWRITE("\n\n");
|
||||
@@ -187,10 +191,16 @@
|
||||
goto Abort;
|
||||
}
|
||||
|
||||
+ /* TIMEOUT */
|
||||
+ if (!strcmp(algName,"TIMEOUT")) {
|
||||
+ goto Exit;
|
||||
+ }
|
||||
+
|
||||
Abort: /* Prepare for abort. */
|
||||
SWRITE("\n\nNow the FAIL handler is aborting the program ...\n");
|
||||
va_end(argPtr);
|
||||
- abort();
|
||||
+ //abort();
|
||||
+ exit(2);
|
||||
|
||||
Exit: /* Prepare for exit. */
|
||||
SWRITE("\n\nNow the FAIL handler is exiting the program ...\n");
|
||||
--- saclib2.2.8-orig/src/GCSI.c
|
||||
+++ saclib2.2.8/src/GCSI.c
|
||||
@@ -16,17 +16,19 @@
|
||||
occurs.
|
||||
======================================================================*/
|
||||
#include "saclib.h"
|
||||
+extern void gcw_MARK();
|
||||
|
||||
void GCSI(s,EACSTACK)
|
||||
Word s;
|
||||
char *EACSTACK;
|
||||
{
|
||||
- Word I,L,N,N1,Np,Np1,T,T1,c,inc;
|
||||
+ Word I,L,N,N1,Np,Np1,T,T1,c,**i,j,inc;
|
||||
char *a;
|
||||
- /* hide I,L,N,N1,Np,Np1,T,T1,c,inc,a; */
|
||||
+ GCArray *v;
|
||||
+ /* hide I,L,N,N1,Np,Np1,T,T1,c,i,j,inc,a,v; */
|
||||
|
||||
Step1: /* Setup. */
|
||||
- if (GCM == 1) {
|
||||
+ if (GCM == 1) {
|
||||
SWRITE("\nThe "); GWRITE(GCC+1);
|
||||
SWRITE("--th garbage collection....\n");
|
||||
}
|
||||
@@ -48,17 +50,8 @@
|
||||
L = I;
|
||||
}
|
||||
|
||||
-/* Step3: /\* Mark the global variables. *\/ */
|
||||
-/* L = GCGLOBALS; */
|
||||
-/* while (L != NIL) { */
|
||||
-/* c = *(PTRFIRST(L)); */
|
||||
-/* if ((ISLIST(c) || ISGCA(c)) && !ISNIL(c)) MARK(c); */
|
||||
-/* #if __WORDSIZE == 64 */
|
||||
-/* L = -RED(L); L = -RED(L); L = -RED(L); L = -RED(L); */
|
||||
-/* #else /\* Assumes 32-bit pointers. *\/ */
|
||||
-/* L = -RED(L); L = -RED(L); */
|
||||
-/* #endif */
|
||||
-/* } */
|
||||
+Step3b: /* Mark the GCWord variables. */
|
||||
+ gcw_MARK();
|
||||
|
||||
Step4: /* Mark the cells accessible from the system stack. */
|
||||
if (((BACSTACK - EACSTACK) % s) != 0)
|
||||
@@ -113,7 +106,7 @@
|
||||
|
||||
Step8: /* Optional report. */
|
||||
if (GCM == 1 || N <= NU / RHO) {
|
||||
- SWRITE("** ");
|
||||
+ SWRITE("\n** ");
|
||||
GWRITE(N); SWRITE(" cells, ");
|
||||
GWRITE(Np); SWRITE(" arrays in ");
|
||||
GWRITE(T); SWRITE(" milliseconds.\n");
|
||||
--- saclib2.2.8-orig/src/gcword.cc
|
||||
+++ saclib2.2.8/src/gcword.cc
|
||||
@@ -0,0 +1,70 @@
|
||||
+/***************************************************************
|
||||
+***
|
||||
+*** gcword.cc
|
||||
+***
|
||||
+*** This file implements the gcw_MARK() function, which is called
|
||||
+*** by the modified saclib garbage collector in order to account
|
||||
+*** for saclib Words pointed to by GCWord objects.
|
||||
+***
|
||||
+*** This file implements the gcw_register(p) function, which is
|
||||
+*** called upon creation and upon destuction of a GCWord object.
|
||||
+*** Each call adds p, the address of the GCWord, to the vector G,
|
||||
+*** so that if a given address occurs an odd number of times, it
|
||||
+*** contains a live GCWord object ... which the garbage collector
|
||||
+*** needs to consider.
|
||||
+***
|
||||
+*** The clean() function modifies vector G so that an address
|
||||
+*** appears in G after the call if and only if it appeared an odd
|
||||
+*** number of times before the call, and no address appears more
|
||||
+*** than once after the call.
|
||||
+***
|
||||
+*** CWB 5/15/00
|
||||
+***************************************************************/
|
||||
+#include <vector>
|
||||
+#include <algorithm>
|
||||
+#include "gcword.h"
|
||||
+using namespace std;
|
||||
+
|
||||
+extern "C" {
|
||||
+void gcw_MARK();
|
||||
+}
|
||||
+
|
||||
+static vector<Word*> G;
|
||||
+static int lim = 10;
|
||||
+
|
||||
+void clean()
|
||||
+{
|
||||
+ //-- a hack to ensure that lim ends up being NU -------------//
|
||||
+ if (lim < NU) lim = NU;
|
||||
+
|
||||
+ sort(G.begin(),G.end());
|
||||
+
|
||||
+ //-- compacts sorted array by ignoring double values --------//
|
||||
+ int i,j,N = G.size()-1;
|
||||
+ for(i = 0; i < N; i++)
|
||||
+ if (G[i] == G[i+1]) {
|
||||
+ G[i] = G[i+1] = 0;
|
||||
+ i++; }
|
||||
+ for(i = 0, j = 0; j <= N; j++)
|
||||
+ if (G[j] != 0)
|
||||
+ swap(G[i++],G[j]);
|
||||
+ G.resize(i);
|
||||
+}
|
||||
+
|
||||
+void gcw_register(Word *p)
|
||||
+{
|
||||
+ G.push_back(p);
|
||||
+ if (G.size() == lim)
|
||||
+ clean();
|
||||
+}
|
||||
+
|
||||
+void gcw_MARK()
|
||||
+{
|
||||
+ // SWRITE("gcw size is: ");IWRITE(G.size()); SWRITE("\n");
|
||||
+ clean();
|
||||
+ for(int i = 0; i < G.size(); i++)
|
||||
+ if (*G[i] > BETA && *G[i] < BETAp && (*G[i] & 1))
|
||||
+ MARK(*G[i]);
|
||||
+
|
||||
+ return;
|
||||
+}
|
||||
--- saclib2.2.8-orig/src/gcword.h
|
||||
+++ saclib2.2.8/src/gcword.h
|
||||
@@ -0,0 +1,51 @@
|
||||
+/***************************************************************
|
||||
+***
|
||||
+*** gcword.h
|
||||
+***
|
||||
+*** This file defines the class GCWord, or "garbage collected
|
||||
+*** word". It is designed to be used in conjunction with
|
||||
+*** saclib to provide an easy way to incoporate garbage
|
||||
+*** collected saclib lists into class definitions and arrays.
|
||||
+*** It even makes global variables easier to define.
|
||||
+***
|
||||
+*** An object of type GCWord behaves just like a "Word", except
|
||||
+*** that it is visible to the garbage collector even if it is
|
||||
+*** a member of some stucture or class or array or is, for any
|
||||
+*** other reason, not a local variable. Note: garbage
|
||||
+*** collection may be slowed by the presence of GCWord's!
|
||||
+***
|
||||
+*** CWB 5/15/00
|
||||
+***************************************************************/
|
||||
+
|
||||
+#ifndef _GCW_
|
||||
+#define _GCW_
|
||||
+
|
||||
+
|
||||
+extern "C" {
|
||||
+#include "saclib.h"
|
||||
+}
|
||||
+extern void gcw_register(Word *);
|
||||
+
|
||||
+
|
||||
+class GCWord
|
||||
+{
|
||||
+public:
|
||||
+ Word W;
|
||||
+
|
||||
+ //-- Constructors -------------------------------------------//
|
||||
+ GCWord() { W = 0; gcw_register(&W); }
|
||||
+ GCWord(const GCWord &X) { W = X.W; gcw_register(&W); }
|
||||
+ GCWord(const Word &X) { W = X; gcw_register(&W); }
|
||||
+
|
||||
+ //-- Destructor ---------------------------------------------//
|
||||
+ ~GCWord() { gcw_register(&W); }
|
||||
+
|
||||
+ //-- Assignment ---------------------------------------------//
|
||||
+ GCWord& operator=(const GCWord& X) { W = X.W; return *this; }
|
||||
+ GCWord& operator=(const Word& X) { W = X; return *this;}
|
||||
+
|
||||
+ //-- Cast to Word -------------------------------------------//
|
||||
+ operator Word() const { return W; }
|
||||
+};
|
||||
+
|
||||
+#endif
|
||||
@@ -23,7 +23,10 @@ BDEPEND="
|
||||
app-shells/tcsh
|
||||
"
|
||||
|
||||
PATCHES=( "${FILESDIR}/makefile.patch" )
|
||||
PATCHES=(
|
||||
"${FILESDIR}/qepcad-compat.patch"
|
||||
"${FILESDIR}/makefile.patch"
|
||||
)
|
||||
DOCS=( doc/saclib.pdf doc/saclocal.dvi doc/desc.doc )
|
||||
|
||||
src_prepare() {
|
||||
@@ -35,8 +38,8 @@ src_prepare() {
|
||||
export MINMAJLIBNAME="${MAJLIBNAME}.${MINOR}"
|
||||
export FULLLIBNAME="${MINMAJLIBNAME}.${REVISION}"
|
||||
export saclib="${S}"
|
||||
tc-export CC
|
||||
#no main, it's a library
|
||||
tc-export CC CXX
|
||||
# no main, it's a library
|
||||
rm src/main.c || die
|
||||
default
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user