summaryrefslogtreecommitdiffstats
path: root/contrib/libf2c/libF77/s_cat.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/libf2c/libF77/s_cat.c')
-rw-r--r--contrib/libf2c/libF77/s_cat.c70
1 files changed, 70 insertions, 0 deletions
diff --git a/contrib/libf2c/libF77/s_cat.c b/contrib/libf2c/libF77/s_cat.c
new file mode 100644
index 0000000..4e8da1b
--- /dev/null
+++ b/contrib/libf2c/libF77/s_cat.c
@@ -0,0 +1,70 @@
+/* Unless compiled with -DNO_OVERWRITE, this variant of s_cat allows the
+ * target of a concatenation to appear on its right-hand side (contrary
+ * to the Fortran 77 Standard, but in accordance with Fortran 90).
+ */
+
+#include "f2c.h"
+#ifndef NO_OVERWRITE
+#include <stdio.h>
+#undef abs
+#undef min
+#undef max
+#include <stdlib.h>
+extern char *F77_aloc (ftnlen, char *);
+#include <string.h>
+#endif /* NO_OVERWRITE */
+
+void
+s_cat (char *lp, char *rpp[], ftnint rnp[], ftnint * np, ftnlen ll)
+{
+ ftnlen i, nc;
+ char *rp;
+ ftnlen n = *np;
+#ifndef NO_OVERWRITE
+ ftnlen L, m;
+ char *lp0, *lp1;
+
+ lp0 = 0;
+ lp1 = lp;
+ L = ll;
+ i = 0;
+ while (i < n)
+ {
+ rp = rpp[i];
+ m = rnp[i++];
+ if (rp >= lp1 || rp + m <= lp)
+ {
+ if ((L -= m) <= 0)
+ {
+ n = i;
+ break;
+ }
+ lp1 += m;
+ continue;
+ }
+ lp0 = lp;
+ lp = lp1 = F77_aloc (L = ll, "s_cat");
+ break;
+ }
+ lp1 = lp;
+#endif /* NO_OVERWRITE */
+ for (i = 0; i < n; ++i)
+ {
+ nc = ll;
+ if (rnp[i] < nc)
+ nc = rnp[i];
+ ll -= nc;
+ rp = rpp[i];
+ while (--nc >= 0)
+ *lp++ = *rp++;
+ }
+ while (--ll >= 0)
+ *lp++ = ' ';
+#ifndef NO_OVERWRITE
+ if (lp0)
+ {
+ memcpy (lp0, lp1, L);
+ free (lp1);
+ }
+#endif
+}
OpenPOWER on IntegriCloud