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_cat.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  1KB  |  69 lines

  1. /* Unless compiled with -DNO_OVERWRITE, this variant of s_cat allows the
  2.  * target of a concatenation to appear on its right-hand side (contrary
  3.  * to the Fortran 77 Standard, but in accordance with Fortran 90).
  4.  */
  5.  
  6. #include "f2c.h"
  7. #ifndef NO_OVERWRITE
  8. #undef abs
  9. #ifdef KR_headers
  10.  extern char *malloc();
  11.  extern void free();
  12. #else
  13. #include "stdlib.h"
  14. #endif
  15. #include "string.h"
  16. #endif /* NO_OVERWRITE */
  17.  
  18.  VOID
  19. #ifdef KR_headers
  20. s_cat(lp, rpp, rnp, np, ll) char *lp, *rpp[]; ftnlen rnp[], *np, ll;
  21. #else
  22. s_cat(char *lp, char *rpp[], ftnlen rnp[], ftnlen *np, ftnlen ll)
  23. #endif
  24. {
  25.     ftnlen i, nc;
  26.     char *rp;
  27.     ftnlen n = *np;
  28. #ifndef NO_OVERWRITE
  29.     ftnlen L, m;
  30.     char *lp0, *lp1;
  31.  
  32.     lp0 = 0;
  33.     lp1 = lp;
  34.     L = ll;
  35.     i = 0;
  36.     while(i < n) {
  37.         rp = rpp[i];
  38.         m = rnp[i++];
  39.         if (rp >= lp1 || rp + m <= lp) {
  40.             if ((L -= m) <= 0) {
  41.                 n = i;
  42.                 break;
  43.                 }
  44.             lp1 += m;
  45.             continue;
  46.             }
  47.         lp0 = lp;
  48.         lp = lp1 = malloc(L = ll);
  49.         }
  50. #endif /* NO_OVERWRITE */
  51.     for(i = 0 ; i < n ; ++i) {
  52.         nc = ll;
  53.         if(rnp[i] < nc)
  54.             nc = rnp[i];
  55.         ll -= nc;
  56.         rp = rpp[i];
  57.         while(--nc >= 0)
  58.             *lp++ = *rp++;
  59.         }
  60.     while(--ll >= 0)
  61.         *lp++ = ' ';
  62. #ifndef NO_OVERWRITE
  63.     if (lp0) {
  64.         memcpy(lp0, lp1, L);
  65.         free(lp1);
  66.         }
  67. #endif
  68.     }
  69.