home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 August - Disc 3 / chip_20018103_hu.iso / amiga / chiputil / wipeout.lha / source / fillchar.c < prev    next >
C/C++ Source or Header  |  1998-04-12  |  2KB  |  120 lines

  1. /*
  2.  * $Id: fillchar.c 1.4 1998/04/12 17:29:09 olsen Exp olsen $
  3.  *
  4.  * :ts=4
  5.  *
  6.  * Wipeout -- Traces and munges memory and detects memory trashing
  7.  *
  8.  * Written by Olaf `Olsen' Barthel <olsen@sourcery.han.de>
  9.  * Public Domain
  10.  */
  11.  
  12. #ifndef _GLOBAL_H
  13. #include "global.h"
  14. #endif    /* _GLOBAL_H */
  15.  
  16. /******************************************************************************/
  17.  
  18. STATIC UBYTE FillChar = 0x81;        /* our memory wall fill character */
  19. STATIC BOOL FillCharRolling = TRUE;    /* if TRUE, fill character will change with every allocation */
  20.  
  21. /******************************************************************************/
  22.  
  23. VOID
  24. SetFillChar(UBYTE newFillChar)
  25. {
  26.     Forbid();
  27.  
  28.     /* use the new fill character and stop it from changing */
  29.     FillChar = newFillChar;
  30.     FillCharRolling = FALSE;
  31.  
  32.     Permit();
  33. }
  34.  
  35. /******************************************************************************/
  36.  
  37. UBYTE
  38. NewFillChar(VOID)
  39. {
  40.     UBYTE result;
  41.  
  42.     /* return the next fill character; keep returning a
  43.      * constant fill character if this is what the
  44.      * user wanted.
  45.      */
  46.  
  47.     Forbid();
  48.  
  49.     /* change the fill character? */
  50.     if(FillCharRolling)
  51.     {
  52.         if(FillChar == 0xFF)
  53.         {
  54.             /* roll over when it has reached its
  55.              * maximum value
  56.              */
  57.             FillChar = 0x81;
  58.         }
  59.         else
  60.         {
  61.             /* use the next odd number */
  62.             FillChar = FillChar + 2;
  63.         }
  64.     }
  65.  
  66.     result = FillChar;
  67.  
  68.     Permit();
  69.  
  70.     return(result);
  71. }
  72.  
  73. /******************************************************************************/
  74.  
  75. BOOL
  76. WasStompedUpon(
  77.     UBYTE *        mem,
  78.     LONG        memSize,
  79.     UBYTE        fillChar,
  80.     UBYTE **    stompPtr,
  81.     LONG *        stompSize)
  82. {
  83.     UBYTE * first = NULL;
  84.     UBYTE * last = NULL;
  85.     BOOL stomped = FALSE;
  86.     LONG i;
  87.  
  88.     /* check if the given memory area was partly or entirely
  89.      * overwritten; we compare its contents against the given
  90.      * fill character and remember the smallest interval whose
  91.      * contents do not match the character
  92.      */
  93.     for(i = 0 ; i < memSize ; i++)
  94.     {
  95.         if(mem[i] != fillChar)
  96.         {
  97.             if(first == NULL)
  98.             {
  99.                 first = &mem[i];
  100.             }
  101.  
  102.             last = &mem[i];
  103.         }
  104.     }
  105.  
  106.     /* if some memory was changed, remember where the first
  107.      * and where the last modified byte was and return that
  108.      * information
  109.      */
  110.     if(first != NULL && last != NULL)
  111.     {
  112.         (*stompPtr)        = first;
  113.         (*stompSize)    = (ULONG)last - (ULONG)first + 1;
  114.  
  115.         stomped = TRUE;
  116.     }
  117.  
  118.     return(stomped);
  119. }
  120.