home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Applications / MacPerl 4.1.3 / Perl / reentrant.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-10-23  |  1.3 KB  |  56 lines  |  [TEXT/MPS ]

  1. /*********************************************************************
  2. Project    :    Perl                -    
  3. File        :    reentrant.c        -    Prepare everything for another Perl run
  4. Author    :    Matthias Neeracher
  5. Started    :    08Apr93                                Language    :    MPW C
  6. Modified    :    08Apr93    MN    
  7. Last        :    08Apr93
  8. *********************************************************************/
  9.  
  10. #include <Types.h>
  11. #include <Resources.h>
  12. #include <Memory.h>
  13. #include <SysEqu.h>
  14.  
  15. #include "EXTERN.h"
  16. #include "icemalloc.h"    /* Thanks, Tim ! */
  17. #include "perl.h"
  18.  
  19. extern void A5Init(Ptr myA5);
  20. extern long A5Size(void);
  21.  
  22. void reenter()
  23. {
  24.     long    **    ranges;
  25.     Handle    tempGlob;
  26.     Ptr        tempA5;
  27.     long    *    range;
  28.     long        size;
  29.     long        from;
  30.     
  31.     /* Release all memory allocated on the previous Perl run */
  32.     free_pool_memory(_default_mem_pool->id);    
  33.  
  34.     if (!(ranges = (long **) Get1Resource('IRng', 128)))
  35.         return;
  36.     if (!(tempGlob = NewHandle(size = A5Size() - 32)))
  37.         return;
  38.         
  39.     HLock(tempGlob);
  40.     BlockMove(*(Ptr *) CurrentA5 - size, *tempGlob, size);
  41.     A5Init(*(Ptr *) CurrentA5);
  42.     tempA5 = *tempGlob + size;
  43.     from      = size;
  44.     for (range  = *ranges; *range; range += 2) {
  45.         BlockMove(tempA5 - from, *(Ptr *) CurrentA5 - from, from - range[0]);
  46.         from = range[1];
  47.     }
  48.     BlockMove(tempA5 - from, *(Ptr *) CurrentA5 - from, from);
  49.  
  50.     DisposeHandle(tempGlob);
  51.     ReleaseResource((Handle) ranges);
  52.     
  53.     curcmd = &compiling;
  54. }
  55.  
  56.