/*
 * International Chemical Identifier (InChI)
 * Version 1
 * Software version 1.02
 * October 31, 2008
 * Developed at NIST
 *
 * The InChI library and programs are free software developed under the
 * auspices of the International Union of Pure and Applied Chemistry (IUPAC);
 * you can redistribute this software and/or modify it under the terms of 
 * the GNU Lesser General Public License as published by the Free Software 
 * Foundation:
 * http://www.opensource.org/licenses/lgpl-license.php
 */


#ifndef __INCHIERR_H__
#define __INCHIERR_H__

#define _IS_OKAY    0
#define _IS_WARNING 1
#define _IS_ERROR   2    /* Microsoft defined its own IS_ERROR() macro */
#define _IS_FATAL   3
#define _IS_UNKNOWN 4    /* unknown error: used in INChI DLL only */
#define _IS_EOF    -1    /* end of file */
#define _IS_SKIP   -2

#define CT_ERR_FIRST         (-30000)
#define CT_OVERFLOW          (CT_ERR_FIRST- 0)  /*(-30000) */
#define CT_LEN_MISMATCH      (CT_ERR_FIRST- 1)  /*(-30001) */
#define CT_OUT_OF_RAM        (CT_ERR_FIRST- 2)  /*(-30002) */
#define CT_RANKING_ERR       (CT_ERR_FIRST- 3)  /*(-30003) */
#define CT_ISOCOUNT_ERR      (CT_ERR_FIRST- 4)  /*(-30004) */
#define CT_TAUCOUNT_ERR      (CT_ERR_FIRST- 5)  /*(-30005) */
#define CT_ISOTAUCOUNT_ERR   (CT_ERR_FIRST- 6)  /*(-30006) */
#define CT_MAPCOUNT_ERR      (CT_ERR_FIRST- 7)  /*(-30007) */
#define CT_TIMEOUT_ERR       (CT_ERR_FIRST- 8)  /*(-30008) */
#define CT_ISO_H_ERR         (CT_ERR_FIRST- 9)  /*(-30009) */
#define CT_STEREOCOUNT_ERR   (CT_ERR_FIRST-10)  /*(-30010) */
#define CT_ATOMCOUNT_ERR     (CT_ERR_FIRST-11)  /*(-30011) */
#define CT_STEREOBOND_ERROR  (CT_ERR_FIRST-12)  /*(-30012) */
#define CT_USER_QUIT_ERR     (CT_ERR_FIRST-13)  /*(-30013) */
#define CT_REMOVE_STEREO_ERR (CT_ERR_FIRST-14)  /*(-30014) */
#define CT_CALC_STEREO_ERR   (CT_ERR_FIRST-15)  /*(-30015) */
#define CT_CANON_ERR         (CT_ERR_FIRST-16)  /*(-30016) */
#define CT_STEREO_CANON_ERR  (CT_ERR_FIRST-17)  /*(-30017) */
#define CT_WRONG_FORMULA     (CT_ERR_FIRST-18)  /*(-30017) */
#define CT_UNKNOWN_ERR       (CT_ERR_FIRST-19)  /*(-30019) */

#define CT_ERR_MIN CT_UNKNOWN_ERR
#define CT_ERR_MAX CT_ERR_FIRST

#define CHECK_OVERFLOW(Len, Maxlen) ( (Len) >= (Maxlen) )
#define RETURNED_ERROR(nVal) (CT_ERR_MIN<=(nVal) && (nVal)<=CT_ERR_MAX)


#define BNS_ERR            -9999
#define BNS_WRONG_PARMS    (BNS_ERR +  0) /*(-9999)*/
#define BNS_OUT_OF_RAM     (BNS_ERR +  1) /*(-9998)*/
#define BNS_PROGRAM_ERR    (BNS_ERR +  2) /*(-9997)*/
#define BNS_ALTPATH_OVFL   (BNS_ERR +  3) /*(-9996)*/
#define BNS_BOND_ERR       (BNS_ERR +  4) /*(-9995)*/
#define BNS_VERT_NUM_ERR   (BNS_ERR +  5) /*(-9994)*/
#define BNS_VERT_EDGE_OVFL (BNS_ERR +  6) /*(-9993)*/
#define BNS_SET_ALTP_ERR   (BNS_ERR +  7) /*(-9992)*/
#define BNS_CPOINT_ERR     (BNS_ERR +  8) /*(-9991)*/
#define BNS_CANT_SET_BOND  (BNS_ERR +  9) /*(-9990)*/
#define BNS_CAP_FLOW_ERR   (BNS_ERR + 10) /*(-9989)*/
#define BNS_RADICAL_ERR    (BNS_ERR + 11) /*(-9988)*/
#define BNS_REINIT_ERR     (BNS_ERR + 12) /*(-9987)*/
#define BNS_ALTBOND_ERR    (BNS_ERR + 13) /*(-9986)*/

#define BNS_MAX_ERR_VALUE  (BNS_ERR + 19) /*(-9980)*/

#define IS_BNS_ERROR(X) (BNS_ERR <= (X) && (X) <= BNS_MAX_ERR_VALUE)


#define INCHI_INP_ERROR_ERR   40
#define INCHI_INP_ERROR_RET  (-1)

#define INCHI_INP_FATAL_ERR    1
#define INCHI_INP_FATAL_RET    0

#define INCHI_INP_EOF_ERR     11
#define INCHI_INP_EOF_RET      0

#ifndef INCHI_ALL_CPP
#ifdef  __cplusplus
extern "C" {
#endif
#endif

extern int (*UserAction)(void); /* callback */
extern int (*ConsoleQuit)(void); /* Console user issued CTRL+C etc. */

#ifndef INCHI_ALL_CPP
#ifdef  __cplusplus
}
#endif
#endif

#define LOG_MASK_WARN  1
#define LOG_MASK_ERR   2
#define LOG_MASK_FATAL 4

#define LOG_MASK_ALL     (LOG_MASK_WARN | LOG_MASK_ERR | LOG_MASK_FATAL)
#define LOG_MASK_NO_WARN (LOG_MASK_ERR | LOG_MASK_FATAL)

#ifdef INCHI_LIB
#include <stdarg.h>

#ifndef INCHI_ALL_CPP
#ifdef  __cplusplus
extern "C" {
#endif
#endif

extern void (*FWPRINT) (const char * format, va_list argptr );
extern void (*DRAWDATA) ( struct DrawData * pDrawData);
extern int  (*DRAWDATA_EXISTS) ( int nComponent, int nType, int bReconnected );
extern struct DrawData * (*GET_DRAWDATA) ( int nComponent, int nType, int bReconnected );

#ifndef INCHI_ALL_CPP
#ifdef  __cplusplus
}
#endif
#endif

#endif

#define USER_ACTION_QUIT   1

#endif /* __INCHIERR_H__ */
