/* 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 "FLA_f2c.h"

#ifdef __cplusplus
extern "C" {
#endif

  /* 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++ = ' ';
    }
  }
#ifdef __cplusplus
}
#endif
