From d8dfb24efb0f899e565b99b81c7a723e15776b95 Mon Sep 17 00:00:00 2001
From: Jonathan Wilkes <jon.w.wilkes@gmail.com>
Date: Tue, 25 Jul 2017 00:53:49 -0400
Subject: [PATCH] triage iem16's lack of shared lib with statically declared
 copy/pasta functions

It appears iem16 is supposed to be built as a single binary. Unfortunately
Pd-extended broke these up into separate binaries without setting up a
sensible cross-platform shared library.

Thus Pd-extended had creation-order problems where, for example, the tab16
classes depended on a table16 to already exist so that the relevant symbols
could resolve properly.

We have no way of knowing how people were using these classes in the wild with
Pd-extended. To support old Pd-extended patches we just use copy/pasta for a
few functions so that any of the classes can get their objects instantiated
without depending on any of the other classes already existing.
---
 externals/iem16/src/del16read~.c    | 13 ++++++++
 externals/iem16/src/del16write~.c   |  2 +-
 externals/iem16/src/iem16_delay.h   | 51 +++++++++++++++++++++++++++++
 externals/iem16/src/iem16_table.h   |  4 +--
 externals/iem16/src/tab16play~.c    | 11 +++++++
 externals/iem16/src/tab16read.c     |  8 +++++
 externals/iem16/src/tab16read4.c    |  8 +++++
 externals/iem16/src/tab16read4~.c   | 11 +++++++
 externals/iem16/src/tab16read~.c    | 11 +++++++
 externals/iem16/src/tab16receive~.c | 12 +++++++
 externals/iem16/src/tab16send~.c    | 11 +++++++
 externals/iem16/src/tab16write~.c   | 13 ++++++++
 externals/iem16/src/vd16~.c         | 14 ++++++++
 13 files changed, 166 insertions(+), 3 deletions(-)
 create mode 100644 externals/iem16/src/iem16_delay.h

diff --git a/externals/iem16/src/del16read~.c b/externals/iem16/src/del16read~.c
index 99f71b8eb..cc148a9d5 100644
--- a/externals/iem16/src/del16read~.c
+++ b/externals/iem16/src/del16read~.c
@@ -21,6 +21,19 @@ typedef struct _sigdel16read{
   int x_zerodel;  	/* 0 or vecsize depending on read/write order */
 } t_sigdel16read;
 
+/* routine to check that all del16writes/del16reads/vds have same vecsize */
+/* copied from del16write~.c so that there's no dependency on del16write~
+   existing before we instantiate an object from this class. (Also because
+   I don't feel like adding and bugfixing a shared library across platforms */
+static void sigdel16write_checkvecsize(t_sigdel16write *x, int vecsize){
+  if (x->x_rsortno != ugen_getsortno())    {
+    x->x_vecsize = vecsize;
+    x->x_rsortno = ugen_getsortno();
+  }
+  else if (vecsize != x->x_vecsize)
+    pd_error(x, "del16read/del16write/vd vector size mismatch");
+}
+
 static void sigdel16read_16bit(t_sigdel16read *x, t_float f);
 
 static void *sigdel16read_new(t_symbol *s, t_floatarg f){
diff --git a/externals/iem16/src/del16write~.c b/externals/iem16/src/del16write~.c
index f3b447ef2..56f63237b 100644
--- a/externals/iem16/src/del16write~.c
+++ b/externals/iem16/src/del16write~.c
@@ -13,7 +13,7 @@
 /* ----------------------------- del16write~ ----------------------------- */
 
 /* routine to check that all del16writes/del16reads/vds have same vecsize */
-void sigdel16write_checkvecsize(t_sigdel16write *x, int vecsize){
+static void sigdel16write_checkvecsize(t_sigdel16write *x, int vecsize){
   if (x->x_rsortno != ugen_getsortno())    {
     x->x_vecsize = vecsize;
     x->x_rsortno = ugen_getsortno();
diff --git a/externals/iem16/src/iem16_delay.h b/externals/iem16/src/iem16_delay.h
new file mode 100644
index 000000000..acb58b3e6
--- /dev/null
+++ b/externals/iem16/src/iem16_delay.h
@@ -0,0 +1,51 @@
+/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM
+ * based on d_array.c from pd:
+ * Copyright (c) 1997-1999 Miller Puckette and others.
+ * For information on usage and redistribution, and for a DISCLAIMER OF ALL
+ * WARRANTIES, see the file, "LICENSE.txt," in this distribution.  */
+
+#ifndef INCLUDE_IEM16_DELAY_H__
+#define INCLUDE_IEM16_DELAY_H__
+
+/* sampling */
+
+#include "iem16.h"
+#include <string.h>
+
+
+#if defined __WIN32 || defined __WIN32__
+static int ugen_getsortno(void){return 0;}
+#else
+extern int ugen_getsortno(void);
+#endif
+
+
+t_class *sigdel16write_class;
+
+typedef struct del16writectl{
+  int c_n;
+  t_iem16_16bit *c_vec;
+  int c_phase;
+} t_del16writectl;
+
+typedef struct _sigdel16write{
+  t_object x_obj;
+  t_symbol *x_sym;
+  t_del16writectl x_cspace;
+  int x_sortno;   /* DSP sort number at which this was last put on chain */
+  int x_rsortno;  /* DSP sort # for first del16read or write in chain */
+  int x_vecsize;  /* vector size for del16read~ to use */
+  float x_f;
+} t_sigdel16write;
+
+
+//void sigdel16write_checkvecsize(t_sigdel16write *x, int vecsize);
+
+
+# define XTRASAMPS 4
+# define SAMPBLK 4
+
+
+#define DEFDELVS 64	    	/* LATER get this from canvas at DSP time */
+
+#endif
diff --git a/externals/iem16/src/iem16_table.h b/externals/iem16/src/iem16_table.h
index 506fd8ae3..fb3d179c3 100644
--- a/externals/iem16/src/iem16_table.h
+++ b/externals/iem16/src/iem16_table.h
@@ -27,8 +27,8 @@ typedef struct _table16 {
 } t_table16;
 
 
-EXTERN int table16_getarray16(t_table16*x, int*size,t_iem16_16bit**vec);
-EXTERN void table16_usedindsp(t_table16*x);
+//EXTERN int table16_getarray16(t_table16*x, int*size,t_iem16_16bit**vec);
+//EXTERN void table16_usedindsp(t_table16*x);
 
 
 
diff --git a/externals/iem16/src/tab16play~.c b/externals/iem16/src/tab16play~.c
index 0fd1049bd..4af5df75d 100644
--- a/externals/iem16/src/tab16play~.c
+++ b/externals/iem16/src/tab16play~.c
@@ -8,6 +8,17 @@
 
 #include "iem16_table.h"
 
+/* the following two functions are copied from table16.c so that each class can
+   be instantiated without a dependency on table16 already existing */
+static int table16_getarray16(t_table16*x, int*size,t_iem16_16bit**vec){
+  *size=x->x_size;
+  *vec =x->x_table;
+  return 1;
+}
+
+static void table16_usedindsp(t_table16*x){
+  x->x_usedindsp=1;
+}
 
 /* ------------ tab16play~ - non-transposing sample playback --------------- */
 
diff --git a/externals/iem16/src/tab16read.c b/externals/iem16/src/tab16read.c
index 17b6c5c84..20a2e865f 100644
--- a/externals/iem16/src/tab16read.c
+++ b/externals/iem16/src/tab16read.c
@@ -8,6 +8,14 @@
 
 #include "iem16_table.h"
 
+/* the following function is copied from table16.c so that each class can
+   be instantiated without a dependency on table16 already existing */
+static int table16_getarray16(t_table16*x, int*size,t_iem16_16bit**vec){
+  *size=x->x_size;
+  *vec =x->x_table;
+  return 1;
+}
+
 /* ---------- tab16read: control, non-interpolating ------------------------ */
 
 static t_class *tab16read_class;
diff --git a/externals/iem16/src/tab16read4.c b/externals/iem16/src/tab16read4.c
index 0d379791a..cebcf8413 100644
--- a/externals/iem16/src/tab16read4.c
+++ b/externals/iem16/src/tab16read4.c
@@ -8,6 +8,14 @@
 
 #include "iem16_table.h"
 
+/* the following function is copied from table16.c so that each class can
+   be instantiated without a dependency on table16 already existing */
+static int table16_getarray16(t_table16*x, int*size,t_iem16_16bit**vec){
+  *size=x->x_size;
+  *vec =x->x_table;
+  return 1;
+}
+
 /* ---------- tab16read4: control, non-interpolating ------------------------ */
 
 static t_class *tab16read4_class;
diff --git a/externals/iem16/src/tab16read4~.c b/externals/iem16/src/tab16read4~.c
index 7f2ed85f6..c85ea0e55 100644
--- a/externals/iem16/src/tab16read4~.c
+++ b/externals/iem16/src/tab16read4~.c
@@ -8,6 +8,17 @@
 
 #include "iem16_table.h"
 
+/* the following two functions are copied from table16.c so that each class can
+   be instantiated without a dependency on table16 already existing */
+static int table16_getarray16(t_table16*x, int*size,t_iem16_16bit**vec){
+  *size=x->x_size;
+  *vec =x->x_table;
+  return 1;
+}
+
+static void table16_usedindsp(t_table16*x){
+  x->x_usedindsp=1;
+}
 
 /******************** tab16read4~ ***********************/
 
diff --git a/externals/iem16/src/tab16read~.c b/externals/iem16/src/tab16read~.c
index 9f5657587..e384bb806 100644
--- a/externals/iem16/src/tab16read~.c
+++ b/externals/iem16/src/tab16read~.c
@@ -8,6 +8,17 @@
 
 #include "iem16_table.h"
 
+/* the following two functions are copied from table16.c so that each class can
+   be instantiated without a dependency on table16 already existing */
+static int table16_getarray16(t_table16*x, int*size,t_iem16_16bit**vec){
+  *size=x->x_size;
+  *vec =x->x_table;
+  return 1;
+}
+
+static void table16_usedindsp(t_table16*x){
+  x->x_usedindsp=1;
+}
 
 /******************** tab16read~ ***********************/
 
diff --git a/externals/iem16/src/tab16receive~.c b/externals/iem16/src/tab16receive~.c
index 2aaf0a8ef..6eaa8d698 100644
--- a/externals/iem16/src/tab16receive~.c
+++ b/externals/iem16/src/tab16receive~.c
@@ -8,6 +8,18 @@
 
 #include "iem16_table.h"
 
+/* the following two functions are copied from table16.c so that each class can
+   be instantiated without a dependency on table16 already existing */
+static int table16_getarray16(t_table16*x, int*size,t_iem16_16bit**vec){
+  *size=x->x_size;
+  *vec =x->x_table;
+  return 1;
+}
+
+static void table16_usedindsp(t_table16*x){
+  x->x_usedindsp=1;
+}
+
 /* ------------------------ tab16receive~ ------------------------- */
 
 static t_class *tab16receive_class;
diff --git a/externals/iem16/src/tab16send~.c b/externals/iem16/src/tab16send~.c
index 50105a06f..9e8ede542 100644
--- a/externals/iem16/src/tab16send~.c
+++ b/externals/iem16/src/tab16send~.c
@@ -8,6 +8,17 @@
 
 #include "iem16_table.h"
 
+/* the following two functions are copied from table16.c so that each class can
+   be instantiated without a dependency on table16 already existing */
+static int table16_getarray16(t_table16*x, int*size,t_iem16_16bit**vec){
+  *size=x->x_size;
+  *vec =x->x_table;
+  return 1;
+}
+
+static void table16_usedindsp(t_table16*x){
+  x->x_usedindsp=1;
+}
 
 /* ------------------------ tab16send~ ------------------------- */
 
diff --git a/externals/iem16/src/tab16write~.c b/externals/iem16/src/tab16write~.c
index dc3f47018..f88574311 100644
--- a/externals/iem16/src/tab16write~.c
+++ b/externals/iem16/src/tab16write~.c
@@ -8,6 +8,19 @@
 
 #include "iem16_table.h"
 
+/* the following two functions are copied from table16.c so that each class can
+   be instantiated without a dependency on table16 already existing */
+static int table16_getarray16(t_table16*x, int*size,t_iem16_16bit**vec){
+  *size=x->x_size;
+  *vec =x->x_table;
+  return 1;
+}
+
+static void table16_usedindsp(t_table16*x){
+  x->x_usedindsp=1;
+}
+
+
 /* ------------------------- tab16write~ -------------------------- */
 
 static t_class *tab16write_tilde_class;
diff --git a/externals/iem16/src/vd16~.c b/externals/iem16/src/vd16~.c
index c3387fec5..7a85eefb0 100644
--- a/externals/iem16/src/vd16~.c
+++ b/externals/iem16/src/vd16~.c
@@ -19,6 +19,20 @@ typedef struct _sig16vd{
   float x_f;
 } t_sig16vd;
 
+
+/* routine to check that all del16writes/del16reads/vds have same vecsize */
+/* copied from del16write~.c so that there's no dependency on del16write~
+   existing before we instantiate an object from this class. (Also because
+   I don't feel like adding and bugfixing a shared library across platforms */
+static void sigdel16write_checkvecsize(t_sigdel16write *x, int vecsize){
+  if (x->x_rsortno != ugen_getsortno())    {
+    x->x_vecsize = vecsize;
+    x->x_rsortno = ugen_getsortno();
+  }
+  else if (vecsize != x->x_vecsize)
+    pd_error(x, "del16read/del16write/vd vector size mismatch");
+}
+
 static void *sig16vd_new(t_symbol *s){
   t_sig16vd *x = (t_sig16vd *)pd_new(sig16vd_class);
   if (!*s->s_name) s = gensym("vd~");
-- 
GitLab