Chris@202: /* Unless compiled with -DNO_OVERWRITE, this variant of s_cat allows the Chris@202: * target of a concatenation to appear on its right-hand side (contrary Chris@202: * to the Fortran 77 Standard, but in accordance with Fortran 90). Chris@202: */ Chris@202: Chris@202: #include "f2c.h" Chris@202: #ifndef NO_OVERWRITE Chris@202: #include "stdio.h" Chris@202: #undef abs Chris@202: #ifdef KR_headers Chris@202: extern char *F77_aloc(); Chris@202: extern void free(); Chris@202: extern void exit_(); Chris@202: #else Chris@202: #undef min Chris@202: #undef max Chris@202: #include "stdlib.h" Chris@202: extern Chris@202: #ifdef __cplusplus Chris@202: "C" Chris@202: #endif Chris@202: char *F77_aloc(ftnlen, const char*); Chris@202: #endif Chris@202: #include "string.h" Chris@202: #endif /* NO_OVERWRITE */ Chris@202: Chris@202: #ifdef __cplusplus Chris@202: extern "C" { Chris@202: #endif Chris@202: Chris@202: VOID Chris@202: #ifdef KR_headers Chris@202: s_cat(lp, rpp, rnp, np, ll) char *lp, *rpp[]; ftnint rnp[], *np; ftnlen ll; Chris@202: #else Chris@202: s_cat(char *lp, char *rpp[], ftnint rnp[], ftnint *np, ftnlen ll) Chris@202: #endif Chris@202: { Chris@202: ftnlen i, nc; Chris@202: char *rp; Chris@202: ftnlen n = *np; Chris@202: #ifndef NO_OVERWRITE Chris@202: ftnlen L, m; Chris@202: char *lp0, *lp1; Chris@202: Chris@202: lp0 = 0; Chris@202: lp1 = lp; Chris@202: L = ll; Chris@202: i = 0; Chris@202: while(i < n) { Chris@202: rp = rpp[i]; Chris@202: m = rnp[i++]; Chris@202: if (rp >= lp1 || rp + m <= lp) { Chris@202: if ((L -= m) <= 0) { Chris@202: n = i; Chris@202: break; Chris@202: } Chris@202: lp1 += m; Chris@202: continue; Chris@202: } Chris@202: lp0 = lp; Chris@202: lp = lp1 = F77_aloc(L = ll, "s_cat"); Chris@202: break; Chris@202: } Chris@202: lp1 = lp; Chris@202: #endif /* NO_OVERWRITE */ Chris@202: for(i = 0 ; i < n ; ++i) { Chris@202: nc = ll; Chris@202: if(rnp[i] < nc) Chris@202: nc = rnp[i]; Chris@202: ll -= nc; Chris@202: rp = rpp[i]; Chris@202: while(--nc >= 0) Chris@202: *lp++ = *rp++; Chris@202: } Chris@202: while(--ll >= 0) Chris@202: *lp++ = ' '; Chris@202: #ifndef NO_OVERWRITE Chris@202: if (lp0) { Chris@202: memcpy(lp0, lp1, L); Chris@202: free(lp1); Chris@202: } Chris@202: #endif Chris@202: } Chris@202: #ifdef __cplusplus Chris@202: } Chris@202: #endif