
#ifndef ETHERCAT_SUGAR_TRY_MACRO_H
#define ETHERCAT_SUGAR_TRY_MACRO_H

#include "../ethercat_types.h"
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef EC_OK
#define EC_OK    1
#endif

#ifndef EC_ERR
#define EC_ERR   0
#endif

#define EC_TRY(expr)                            \
    do {                                        \
        if (!(expr)) {                          \
            goto fail;                          \
        }                                       \
    } while (0)

#ifndef EC_TRY_LOG_HOOK
#  include <stdio.h>
#  define EC_TRY_LOG_HOOK(msg)                                       \
        fprintf(stderr, "[EC_TRY] %s (at %s:%d)\n", (msg), __FILE__, __LINE__)
#endif

#define EC_TRY_LOG(expr, msg)                   \
    do {                                        \
        if (!(expr)) {                          \
            EC_TRY_LOG_HOOK(msg);               \
            goto fail;                          \
        }                                       \
    } while (0)

#define EC_RETURN_IF_FAIL(expr, retval)         \
    do {                                        \
        if (!(expr)) {                          \
            return (retval);                    \
        }                                       \
    } while (0)

#define EC_GOTO_IF_FAIL(expr, label)            \
    do {                                        \
        if (!(expr)) {                          \
            goto label;                         \
        }                                       \
    } while (0)

#define EC_BREAK_IF_FAIL(expr)                  \
    {                                           \
        if (!(expr)) break;                     \
    }

#define EC_ASSERT_RANGE(value, lo, hi)          \
    do {                                        \
        if ((value) < (lo) || (value) > (hi)) { \
            return EC_ERR;                      \
        }                                       \
    } while (0)

#ifdef __cplusplus
}
#endif

#endif
