/* do not edit automatically generated by mc from mcDebug.  */
/* This file is part of GNU Modula-2.

GNU Modula-2 is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.

GNU Modula-2 is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */

#include "config.h"
#include "system.h"
#include <stdbool.h>
#   if !defined (PROC_D)
#      define PROC_D
       typedef void (*PROC_t) (void);
       typedef struct { PROC_t proc; } PROC;
#   endif

#define _mcDebug_C

#include "GmcDebug.h"
#   include "GStrIO.h"
#   include "GmcOptions.h"
#   include "GmcError.h"


/*
   assert - tests the boolean, q. If false then an error is reported
            and the execution is terminated.
*/

extern "C" void mcDebug_assert (bool q);

/*
   writeDebug - only writes a string if internal debugging is on.
*/

extern "C" void mcDebug_writeDebug (const char *a_, unsigned int _a_high);


/*
   assert - tests the boolean, q. If false then an error is reported
            and the execution is terminated.
*/

extern "C" void mcDebug_assert (bool q)
{
  if (! q)
    {
      mcError_internalError ((const char *) "assert failed", 13, (const char *) "../../gcc/m2/mc/mcDebug.mod", 27, 35);
    }
}


/*
   writeDebug - only writes a string if internal debugging is on.
*/

extern "C" void mcDebug_writeDebug (const char *a_, unsigned int _a_high)
{
  char a[_a_high+1];

  /* make a local copy of each unbounded array.  */
  memcpy (a, a_, _a_high+1);

  if (mcOptions_getInternalDebugging ())
    {
      StrIO_WriteString ((const char *) a, _a_high);
      StrIO_WriteLn ();
    }
}

extern "C" void _M2_mcDebug_init (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
{
}

extern "C" void _M2_mcDebug_fini (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
{
}
