#ifndef __CHECKS_H
#define __CHECKS_H

#ifdef __cplusplus
extern "C" {
#endif
  int message_box(const char* fmt, ...);
  int warning_box(const char* fmt, ...);
  int sorry_box(const char* fmt, ...);
  int error_box(const char* fmt, ...);
  int fatal_box(const char* fmt, ...);
  int yesno_box(const char* fmt, ...);
  int yesnocancel_box(const char* fmt, ...);
  int yesnofatal_box(const char* fmt, ...);
  int __trace(const char* fmt, ...);
#ifdef __cplusplus
}
#endif

//   Utilizzate in fase di debug (definire il simbolo DBG in compilazione)

// @doc EXTERNAL

#ifdef DBG
// @msg CHECK | Macro che richiama una <m fatal_box> per stampare messaggi a video
#define CHECK(p, m) ( (p) ? (void)0 : (void) fatal_box(          \
                                                       "Check failed in %s, line %d:\n\r%s",      \
                                                       __FILE__, __LINE__, m) )
  // @parm | p | Condizione per la stampa del messaggio (stampa se FALSE)                                                       
  // @parm | m | Messaggio da stampare
  //                                                       
  // @comm Viene richiamata se <p p> e' FALSE.
  //             <nl>Utilizzata in fase di debug (definire il simbolo DBG in compilazione).
  //
  // @xref <m CHECKS> <m CHECKD>
  
  // @msg CHECKS | Macro che richiama una <m fatal_box> per stampare messaggi a video
#define CHECKS(p, m, s0) ( (p) ? (void)0 : (void) fatal_box(      \
                                                            "Check failed in %s, line %d:\n\r%s%s", \
                                                            __FILE__, __LINE__, m, s0) )
  // @parm | p | Condizione per la stampa del messaggio (stampa se FALSE)                                                       
  // @parm | m | Messaggio da stampare
  // @parm | s0 | Stringa aggiuntiva da stampare
  //                                                       
  // @comm Viene richiamata se <p p> e' FALSE. Oltre al messaggio passato im <p m>
  //       stampa anche una strina aggiuntiva passata in <p s0>.
  //             <nl>Utilizzata in fase di debug (definire il simbolo DBG in compilazione).
  //
  // @xref <m CHECK> <m CHECKD>
  
  // @msg CHECKD | Macro che richiama una <m fatal_box> per stampare messaggi a video
#define CHECKD(p, m, d0) ( (p) ? (void)0 : (void) fatal_box(      \
                                                            "Check failed in %s, line %d:\n%s%d", \
                                                            __FILE__, __LINE__, m, d0) )
  // @parm | p | Condizione per la stampa del messaggio (stampa se FALSE)                                                       
  // @parm | m | Messaggio da stampare
  // @parm | d0 | Stringa aggiuntiva da stampare
  //                                                       
  // @comm Viene richiamata se <p p> e' FALSE. Oltre al messaggio passato im <p m>
  //       stampa anche un numero passato in <p d0>.
  //             <nl>Utilizzata in fase di debug (definire il simbolo DBG in compilazione).
  //
  // @xref <m CHECKS> <m CHECK>
  
#else

#define CHECK(p, m)
#define CHECKS(p, m, s)
#define CHECKD(p, m, d)

#endif

//   Utilizzata in fase di debug (definire il simbolo TRC in compilazione)

#ifdef TRC
// @msg TRACE | Macro che richiama la funzione <m __trace>
#define TRACE __trace
#else
#define TRACE 1 ? 0 : __trace
#endif

#endif // __CHECKS_H
