s_copy.c   [plain text]


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

void
s_copy (register char *a, register char *b, ftnlen la, ftnlen lb)
{
  register char *aend, *bend;

  aend = a + la;

  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;
#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++ = ' ';
    }
}