diff options
Diffstat (limited to 'lib/libF77/s_copy.c')
-rw-r--r-- | lib/libF77/s_copy.c | 50 |
1 files changed, 37 insertions, 13 deletions
diff --git a/lib/libF77/s_copy.c b/lib/libF77/s_copy.c index 989f5dd..d167351 100644 --- a/lib/libF77/s_copy.c +++ b/lib/libF77/s_copy.c @@ -1,3 +1,9 @@ +/* Unless compiled with -DNO_OVERWRITE, this variant of s_copy allows the + * target of an assignment to appear on its right-hand side (contrary + * to the Fortran 77 Standard, but in accordance with Fortran 90), + * as in a(2:5) = a(4:7) . + */ + #include "f2c.h" /* assign strings: a = b */ @@ -8,20 +14,38 @@ VOID s_copy(a, b, la, lb) register char *a, *b; ftnlen la, lb; void s_copy(register char *a, register char *b, ftnlen la, ftnlen lb) #endif { -register char *aend, *bend; + register char *aend, *bend; -aend = a + la; + aend = a + la; -if(la <= lb) - while(a < aend) - *a++ = *b++; + if(la <= lb) +#ifndef NO_OVERWRITE + if (a <= b || a >= b + la) +#endif + while(a < aend) + *a++ = *b++; +#ifndef NO_OVERWRITE + else + for(b += la; a < aend; ) + *--aend = *--b; +#endif -else - { - bend = b + lb; - while(b < bend) - *a++ = *b++; - while(a < aend) - *a++ = ' '; + else { + bend = b + lb; +#ifndef NO_OVERWRITE + if (a <= b || a >= bend) +#endif + while(b < bend) + *a++ = *b++; +#ifndef NO_OVERWRITE + else { + a += lb; + while(b < bend) + *--a = *--bend; + a += lb; + } +#endif + while(a < aend) + *a++ = ' '; + } } -} |