home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / g77-0.5.15-src.tgz / tar.out / fsf / g77 / f / runtime / libF77 / s_copy.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  957b  |  52 lines

  1. /* Unless compiled with -DNO_OVERWRITE, this variant of s_copy allows the
  2.  * target of an assignment to appear on its right-hand side (contrary
  3.  * to the Fortran 77 Standard, but in accordance with Fortran 90),
  4.  * as in  a(2:5) = a(4:7) .
  5.  */
  6.  
  7. #include "f2c.h"
  8.  
  9. /* assign strings:  a = b */
  10.  
  11. #ifdef KR_headers
  12. VOID s_copy(a, b, la, lb) register char *a, *b; ftnlen la, lb;
  13. #else
  14. void s_copy(register char *a, register char *b, ftnlen la, ftnlen lb)
  15. #endif
  16. {
  17.     register char *aend, *bend;
  18.  
  19.     aend = a + la;
  20.  
  21.     if(la <= lb)
  22. #ifndef NO_OVERWRITE
  23.         if (a <= b || a >= b + la)
  24. #endif
  25.             while(a < aend)
  26.                 *a++ = *b++;
  27. #ifndef NO_OVERWRITE
  28.         else
  29.             for(b += la; a < aend; )
  30.                 *--aend = *--b;
  31. #endif
  32.  
  33.     else {
  34.         bend = b + lb;
  35. #ifndef NO_OVERWRITE
  36.         if (a <= b || a >= bend)
  37. #endif
  38.             while(b < bend)
  39.                 *a++ = *b++;
  40. #ifndef NO_OVERWRITE
  41.         else {
  42.             a += lb;
  43.             while(b < bend)
  44.                 *--a = *--bend;
  45.             a += lb;
  46.             }
  47. #endif
  48.         while(a < aend)
  49.             *a++ = ' ';
  50.         }
  51.     }
  52.