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

71 lines
1.2 KiB
C
Raw Normal View History

1999-09-18 10:51:31 +00:00
/* 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>
2003-07-11 03:42:19 +00:00
extern char *F77_aloc (ftnlen, char *);
1999-09-18 10:51:31 +00:00
#include <string.h>
#endif /* NO_OVERWRITE */
2003-07-11 03:42:19 +00:00
void
s_cat (char *lp, char *rpp[], ftnint rnp[], ftnint * np, ftnlen ll)
1999-09-18 10:51:31 +00:00
{
2003-07-11 03:42:19 +00:00
ftnlen i, nc;
char *rp;
ftnlen n = *np;
1999-09-18 10:51:31 +00:00
#ifndef NO_OVERWRITE
2003-07-11 03:42:19 +00:00
ftnlen L, m;
char *lp0, *lp1;
1999-09-18 10:51:31 +00:00
2003-07-11 03:42:19 +00:00
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;
1999-09-18 10:51:31 +00:00
#endif /* NO_OVERWRITE */
2003-07-11 03:42:19 +00:00
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++ = ' ';
1999-09-18 10:51:31 +00:00
#ifndef NO_OVERWRITE
2003-07-11 03:42:19 +00:00
if (lp0)
{
memcpy (lp0, lp1, L);
free (lp1);
}
1999-09-18 10:51:31 +00:00
#endif
2003-07-11 03:42:19 +00:00
}