/* 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 gm2; see the file COPYING.  If not, write to the Free Software
Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */

#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_H
#define _mcDebug_C

#   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-read-write/gcc/m2/mc/mcDebug.mod", 42, 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[])
{
}
