home *** CD-ROM | disk | FTP | other *** search
/ Netscape Plug-Ins Developer's Kit / Netscape_Plug-Ins_Developers_Kit.iso / CGIPERL / MACPERL / MSRCE418.HQX / Perl Source ƒ / Perl / reentrant.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-12-01  |  2.4 KB  |  106 lines

  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 <LowMem.h>
  14. #include <Files.h>
  15.  
  16. #include "EXTERN.h"
  17. #include "icemalloc.h"    /* Thanks, Tim ! */
  18. #define RESOLVE_MAC_CONFLICTS
  19. #include "perl.h"
  20.  
  21. #if !defined(powerc) && !defined(__powerc)
  22. extern void A5Init(Ptr myA5);
  23. extern long A5Size(void);
  24. #endif
  25.  
  26. void CompareMem(char * orig, char * reset, int len, int offset, short log)
  27. {
  28.     char     error[20];
  29.     long    errlen;
  30.     
  31.     while (len--) {
  32.         if (*orig++ != *reset++) {
  33.             sprintf(error, "%06x: %02x %02x\n", offset, orig[-1] & 0xFF, reset[-1] & 0xFF);
  34.             errlen = strlen(error);
  35.             FSWrite(log, &errlen, error);
  36.         }
  37.         --offset;
  38.     }
  39. }
  40.  
  41. void reenter()
  42. {
  43. #if !defined(powerc) && !defined(__powerc)
  44.     long    **    ranges;
  45.     Handle    tempGlob;
  46.     Ptr        tempA5;
  47.     long    *    range;
  48.     long        size;
  49.     long        from;
  50.     short        log;
  51.     Str255    name;
  52. #endif
  53.     
  54.     /* Release all memory allocated on the previous Perl run */
  55.     free_pool_memory(_default_mem_pool->id);    
  56.  
  57.     /* Clear all globals and static variables. If any pointers remain, we're probably
  58.        DEAD! 
  59.     */
  60. #include "perl.init"
  61.     reinit_cmd();
  62.     reinit_consarg();
  63.     reinit_doarg();
  64.     reinit_doio();
  65.     reinit_dolist();
  66.     reinit_dump();
  67.     reinit_eval();
  68.     reinit_missing();
  69.     reinit_perl();
  70.     reinit_regexec();
  71.     reinit_stab();
  72.     reinit_str();
  73.     reinit_toke();
  74.     reinit_usersub();
  75.     reinit_util();
  76. #if !defined(powerc) && !defined(__powerc) && defined(PARANOID)
  77.     name[0] = 14;
  78.     sprintf(name+1, "Log %10d", LMGetTicks());
  79.     Create(name, 0, 'MPS ', 'TEXT');
  80.     FSOpen(name, 0, &log);
  81.     if (!(ranges = (long **) Get1Resource('IRng', 128)))
  82.         return;
  83.     if (!(tempGlob = NewHandle(size = A5Size() - 32)))
  84.         return;
  85.         
  86.     HLock(tempGlob);
  87.     BlockMove(LMGetCurrentA5() - size, *tempGlob, size);
  88.     A5Init(LMGetCurrentA5());
  89.     tempA5 = *tempGlob + size;
  90.     from      = size;
  91.     for (range  = *ranges; *range; range += 2) {
  92.         BlockMove(tempA5 - from, LMGetCurrentA5() - from, from - range[0]);
  93.         CompareMem(LMGetCurrentA5() - range[0], tempA5 - range[0], range[0]-range[1], range[0], log);
  94.         from = range[1];
  95.     }
  96.     BlockMove(tempA5 - from, LMGetCurrentA5() - from, from);
  97.  
  98.     DisposeHandle(tempGlob);
  99.     ReleaseResource((Handle) ranges);
  100.     
  101.     curcmd = &compiling;
  102.     FSClose(log);
  103. #endif
  104. }
  105.  
  106.