--- /dev/null
+/* Unless compiled with -DNO_OVERWRITE, this variant of s_copy allows the
+ * target of an assignment to appear on its right-hand side (contrary
+ * to the Fortran 77 Standard, but in accordance with Fortran 90),
+ * as in a(2:5) = a(4:7) .
+ */
+
+#include "clapack.h"
+
+/* assign strings: a = b */
+
+void s_copy(register char *a, register char *b, ftnlen la, ftnlen lb)
+{
+ register char *aend, *bend;
+
+ aend = a + la;
+
+ if(la <= lb)
+ if (a <= b || a >= b + la)
+ while(a < aend)
+ *a++ = *b++;
+ else
+ for(b += la; a < aend; )
+ *--aend = *--b;
+ else {
+ bend = b + lb;
+ if (a <= b || a >= bend)
+ while(b < bend)
+ *a++ = *b++;
+ else {
+ a += lb;
+ while(b < bend)
+ *--a = *--bend;
+ a += lb;
+ }
+ while(a < aend)
+ *a++ = ' ';
+ }
+}