diff options
Diffstat (limited to 'contrib/libf2c/libF77/s_cat.c')
-rw-r--r-- | contrib/libf2c/libF77/s_cat.c | 70 |
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 +} |