Listing 6 (chckstck.c)

/*
 *  Jerzy Tomasik, 09-Jun-1991
 *
 *  Utility functions for determining unused stack space.
 *  Supports Microsoft and Turbo C
 */

#include <stdlib.h>
#include <stdio.h>


#if defined( _MSC_VER )

#include <malloc.h>

extern char end;           /* bottom of Microsoft stack */
static char marker = 'J';  /* "signature" byte */


/*  determine unused stack space, normally this function
 *  is called at program termination, but it can be
 *  called at other times.
 *  Microsoft version
 */
unsigned short unused_stack(void)
   {
   unsigned short unused = 0;
   char *ptr;

   ptr = &end;

   while(*ptr++ == marker)
      unused++;

   return(unused);
   }


/* "paint" the stack with the signature byte */
void spray_stack(void)
   {
   char *ptr, *stack_top;

   stack_top = &end + stackavail();
   ptr = &end;

   do

   {
   *ptr++ = marker;
   } while( ptr < stack_top);

}

#elif defined ( _TURBOC_ )

#include <dos.h>

static char marker = 'J';  /* "signature" byte */
static char far *bottom;

/*  determine unused stack space, normally this function
 *  is called at program termination, but it can be
 *  called at other times.
 *  Turbo C version
 */
void spray_stack(void)
   {
   char far *ptr;

#if defined  ( _SMALL_ ) || defined ( _MEDIUM_ )

   extern unsigned int _stklen;

   ptr = (char *) MK_FP ( _DS, (_SP - 0x100));
   bottom = (char *) MK_FP( _DS, (0xFFFF - _stklen));

#elif defined ( _COMPACT_ ) ||  defined ( _LARGE_ )

   ptr = (char *) MK_FP( _SS, (_SP - 0x100));
   bottom = (char *) MK_FP( _ SS, 0x00 );

#endif

   for( ; ptr > bottom; *ptr-- = marker )
      ;

   }

unsigned short unused_stack(void)
   {
   unsigned short unused = 0;
   char far *ptr;

   ptr = bottom + 1;

   while (*ptr++ == marker)
      unused++;

   return(unused);
   }

#endif

/* End of File */