summaryrefslogtreecommitdiffstats
path: root/lib/libF77/s_copy.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libF77/s_copy.c')
-rw-r--r--lib/libF77/s_copy.c50
1 files changed, 37 insertions, 13 deletions
diff --git a/lib/libF77/s_copy.c b/lib/libF77/s_copy.c
index 989f5dd..d167351 100644
--- a/lib/libF77/s_copy.c
+++ b/lib/libF77/s_copy.c
@@ -1,3 +1,9 @@
+/* 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 "f2c.h"
/* assign strings: a = b */
@@ -8,20 +14,38 @@ VOID s_copy(a, b, la, lb) register char *a, *b; ftnlen la, lb;
void s_copy(register char *a, register char *b, ftnlen la, ftnlen lb)
#endif
{
-register char *aend, *bend;
+ register char *aend, *bend;
-aend = a + la;
+ aend = a + la;
-if(la <= lb)
- while(a < aend)
- *a++ = *b++;
+ if(la <= lb)
+#ifndef NO_OVERWRITE
+ if (a <= b || a >= b + la)
+#endif
+ while(a < aend)
+ *a++ = *b++;
+#ifndef NO_OVERWRITE
+ else
+ for(b += la; a < aend; )
+ *--aend = *--b;
+#endif
-else
- {
- bend = b + lb;
- while(b < bend)
- *a++ = *b++;
- while(a < aend)
- *a++ = ' ';
+ else {
+ bend = b + lb;
+#ifndef NO_OVERWRITE
+ if (a <= b || a >= bend)
+#endif
+ while(b < bend)
+ *a++ = *b++;
+#ifndef NO_OVERWRITE
+ else {
+ a += lb;
+ while(b < bend)
+ *--a = *--bend;
+ a += lb;
+ }
+#endif
+ while(a < aend)
+ *a++ = ' ';
+ }
}
-}
OpenPOWER on IntegriCloud