freebsd-skq/contrib/libf2c/libF77/s_cat.c

71 lines
1.2 KiB
C

/* 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
}