#ifndef __CHECK_H_
#define __CHECK_H_

#include <eid_impl.h>

#define CHECK_PARAM_TYPES(param_types, val1, val2, val3, val4)      \
    do {                                                            \
      if (param_types != TEE_PARAM_TYPES(val1, val2, val3, val4)) {  \
         ret = EID_ERROR_BAD_PARAMETERS;                            \
         SLogError("%s failed: unexpected nParamTypes", __func__);  \
         goto ret_handle;                                           \
      };                                                            \
    } while(0)

#define CHECK_BAIL(is_valid, code)                                  \
    do {                                                            \
      if (!(is_valid)) {                                            \
         ret = (code);                                              \
         SLogError("%s:%u:%d", __func__, __LINE__, ret);            \
         goto ret_handle;                                           \
      };                                                            \
    } while(0)

#define GUARD_MSG_BAIL(code)                                        \
   do {                                                             \
      ret = (code);                                                 \
      if (ret) {                                                    \
         SLogError("%s:%u:%d", __func__, __LINE__, ret);            \
         goto ret_handle;                                           \
      };                                                            \
   }while(0)

#define CHECK_OP(val1, val2, code, op)                              \
    do {                                                            \
        if ((val1) op (val2)) {                                     \
        } else {                                                    \
            SLogError("%s:%u: 0x%x %s 0x%x", __func__, __LINE__, (val1), #op, (val2));\
            ret = (code);                                           \
            goto ret_handle;                                        \
        }                                                           \
    } while (0)

#define CHECK_GT(val1, val2, code)                                  \
    CHECK_OP(val1, val2, code, >)

#define CHECK_LE(val1, val2, code)                                  \
    CHECK_OP(val1, val2, code, <=)

#define CHECK_EQ(val1, val2, code) CHECK_OP(val1, val2, code, ==)

#endif // __CHECK_H_
