/* ******************************************************************* */
/*                                                                     */
/*                         Applied Type System                         */
/*                                                                     */
/* ******************************************************************* */

/*
** ATS/Postiats - Unleashing the Potential of Types!
** Copyright (C) 2011-20?? Hongwei Xi, ATS Trustful Software, Inc.
** All rights reserved
**
** ATS is free software;  you can  redistribute it and/or modify it under
** the terms of  the GNU GENERAL PUBLIC LICENSE (GPL) as published by the
** Free Software Foundation; either version 3, or (at  your  option)  any
** later version.
** 
** ATS 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  ATS;  see the  file COPYING.  If not, please write to the
** Free Software Foundation,  51 Franklin Street, Fifth Floor, Boston, MA
** 02110-1301, USA.
*/

/* ****** ****** */

/*
(* Author: Hongwei Xi *)
(* Authoremail: hwxi AT cs DOT bu DOT edu *)
(* Start time: April, 2013 *)
*/

/* ****** ****** */
//
#include <stdio.h>
/*
extern "C" void exit (int) ; // in [stdlib.h]
*/
//
/* ****** ****** */

#include "pats_ccomp_basics.h"
#include "pats_ccomp_typedefs.h"

/* ****** ****** */
//
// HX-2013-04: some pre-initialized exceptions
//
/* ****** ****** */

#ifndef \
_ATS_CCOMP_EXCEPTION_NONE_
//
atstype_exncon
ATSLIB_056_prelude__AssertExn = { 10, "AssertException" } ;
atstype_exncon
ATSLIB_056_prelude__GenerallyExn = { 20, "GenerallyException" } ;
atstype_exncon
ATSLIB_056_prelude__IllegalArgExn = { 30, "IllegalArgException" } ;
//
#endif // end of [_ATS_CCOMP_EXCEPTION_NONE_]

/* ****** ****** */

#ifndef \
_ATS_CCOMP_EXCEPTION_NONE_
//
atstype_exncon
ATSLIB_056_prelude__NotSomeExn = { 40, "NotSomeException" } ;
atstype_exncon
ATSLIB_056_prelude__NotFoundExn = { 41, "NotFoundException" } ;
//
atstype_exncon
ATSLIB_056_prelude__ListSubscriptExn = { 50, "ListSubscriptException" } ;
atstype_exncon
ATSLIB_056_prelude__StreamSubscriptExn = { 51, "StreamSubscriptException" } ;
//
atstype_exncon
ATSLIB_056_prelude__ArraySubscriptExn = { 60, "ArraySubscriptException" } ;
atstype_exncon
ATSLIB_056_prelude__MatrixSubscriptExn = { 61, "MatrixSubscriptException" } ;
//
#endif // end of [_ATS_CCOMP_EXCEPTION_NONE_]

/* ****** ****** */

#ifndef \
_ATS_CCOMP_EXCEPTION_NONE_
//
extern "C"
{
void
the_atsexncon_initize
(
  atstype_exncon *d2c, char* exnmsg
)
{
//
  static int the_atsexntag = 1024 ;
//
  if (!d2c->exntag)
  {
    d2c->exntag = the_atsexntag ;
    the_atsexntag = the_atsexntag + 1 ;
  }
  d2c->exnmsg = exnmsg ;
  return ;
} // end of [the_atsexncon_initize]
} // end of [extern "C"]
//
#endif // end of [_ATS_CCOMP_EXCEPTION_NONE_]

/* ****** ****** */
//
// HX-2013:
// for reporting pattern matching failure
//
extern "C"
{
void
atsruntime_handle_unmatchedval
  (char *msg0)
{
  fprintf
  ( stderr
  , "exit(ATS): unmatched value at run-time:\n%s\n", msg0
  ) ; exit(1) ;
  return ; // deadcode
} /* end of [atsruntime_handle_unmatchedval] */
} // end of [extern "C"]
//
/* ****** ****** */
//
// HX-2014-06:
// for reporting funarg-pattern matching failure
//
extern "C"
{
void
atsruntime_handle_unmatchedarg
  (char *msg0)
{
  fprintf
  ( stderr
  , "exit(ATS): unmatched funarg at run-time:\n%s\n", msg0
  ) ; exit(1) ;
  return ; // deadcode
} /* end of [atsruntime_handle_unmatchedarg] */
} // end of [extern "C"]
//
/* ****** ****** */
//
// HX-2014-06:
// for reporting failure due to uncaught exception
//
extern "C"
{
void
atsruntime_handle_uncaughtexn_rest
  (atstype_exncon *exn0)
{
  fprintf
  ( stderr
  , "exit(ATS): uncaught exception at run-time:\n%s(%d)\n", exn0->exnmsg, exn0->exntag
  ) ; exit(1) ;
  return ; // deadcode
} /* end of [atsruntime_handle_uncaughtexn_rest] */
} // end of [extern "C"]
//
/* ****** ****** */

/* end of [pats_ccomp_runtime.c] */
