/* frmwrk.c

   Generic Framework for testing.

 */

#include "ed/inc/sysalloc.h"
#include "ed/inc/sys.h"

#include <stdio.h>

/* external user function */
int main_ (int argc, char *argv[]);

/* macros ============================================================== */

#define MODULE "FRMWRK."
#define OUT "out.txt"
#define ERR "err.txt"

/* constants =========================================================== */
/* types =============================================================== */
/* structures ========================================================== */
/* private variables =================================================== */
/* private functions =================================================== */

/* ---------------------------------------------------------------------
   --------------------------------------------------------------------- */
static void onexit (void)
{
   sys_mem_trace ();
   STACK_PRINT ();

   printf (MODULE "Termine\n");

#if defined (__BORLANDC__)
#elif defined (MINGWS)
#elif defined (CODEBLOCKS)
#elif defined (linux)
#else
   system ("pause");
#endif
}

/* ---------------------------------------------------------------------
   --------------------------------------------------------------------- */
static int is_opt (char const *sopt, int argc, char **argv)
{
   int ok = 0;
   int i;
   for (i = 1; !ok && i < argc; i++)
   {
      if (strcmp (sopt, argv[i]) == 0)
      {
         ok = 1;
      }
   }
   return ok;
}

/* entry points ======================================================== */

/* ---------------------------------------------------------------------
   --------------------------------------------------------------------- */
int main (int argc, char *argv[])
{
   STACK_INIT ();
   STACK_CHK ();

   {
      static char Trace[1 << 11];

      int trace = TRACE_OFF;

      puts("Usage xxx[ /T][ /E][ /O][ <options application>]");
      
      if (argc > 1)
      {
         if (is_opt ("/T", argc, argv))
         {
            trace = TRACE_ON;
            argc--;
            argv++;
         }

         if (is_opt ("/E", argc, argv))
         {
            freopen (ERR, "w", stderr);
            fprintf (stderr, "stderr trace start\n");
            argc--;
            argv++;
         }

         if (is_opt ("/O", argc, argv))
         {
            freopen (OUT, "w", stdout);
            printf ("trace start\n");
            argc--;
            argv++;
         }
      }

#ifdef DBG_SYSALLOC
#ifdef __BORLANDC__
      printf (MODULE "DBG_SYSALLOC is defined\n");
#elif __GNUC__
      printf (MODULE "DBG_SYSALLOC=%d\n", DBG_SYSALLOC);
#else
#error undefined for this platform
#endif
#else
      printf (MODULE "DBG_SYSALLOC is not defined\n");
#endif
      atexit (onexit);

      sys_mem_init (Trace, sizeof Trace, trace, NULL);

      main_ (argc, argv);
   }
   return 0;
}
