blob: 16e9e45e901f9d49c8a29633eb82f1413c9dd7df [file] [log] [blame]
Radek Krejci5aeea3a2018-09-05 13:29:36 +02001/**
2 * @file common.h
3 * @author Radek Krejci <rkrejci@cesnet.cz>
4 * @brief common internal definitions for libyang
5 *
6 * Copyright (c) 2015 - 2018 CESNET, z.s.p.o.
7 *
8 * This source code is licensed under BSD 3-Clause License (the "License").
9 * You may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * https://opensource.org/licenses/BSD-3-Clause
13 */
14
15#ifndef LY_COMMON_H_
16#define LY_COMMON_H_
17
18#include <stdint.h>
19#include <stdlib.h>
20
21#include "libyang.h"
22
23#define UNUSED(x) UNUSED_ ## x __attribute__((__unused__))
24
25#if __STDC_VERSION__ >= 201112 && !defined __STDC_NO_THREADS__
26# define THREAD_LOCAL _Thread_local
27#elif defined __GNUC__ || \
28 defined __SUNPRO_C || \
29 defined __xlC__
30# define THREAD_LOCAL __thread
31#else
32# error "Cannot define THREAD_LOCAL"
33#endif
34
35#define GETMACRO2(_1, _2, NAME, ...) NAME
36#define GETMACRO3(_1, _2, _3, NAME, ...) NAME
37#define GETMACRO4(_1, _2, _3, _4, NAME, ...) NAME
38
39/*
40 * logger
41 */
42
43/* internal logging options */
44enum int_log_opts {
45 ILO_LOG = 0, /* log normally */
46 ILO_STORE, /* only store any messages, they will be processed higher on stack */
47 ILO_IGNORE, /* completely ignore messages */
48 ILO_ERR2WRN, /* change errors to warnings */
49};
50
51extern THREAD_LOCAL enum int_log_opts log_opt;
52extern volatile uint8_t ly_log_level;
53extern volatile uint8_t ly_log_opts;
54
55void ly_log(const struct ly_ctx *ctx, LY_LOG_LEVEL level, LY_ERR no, const char *format, ...);
56
57#define LOGERR(ctx, errno, str, args...) ly_log(ctx, LY_LLERR, errno, str, ##args)
58#define LOGWRN(ctx, str, args...) ly_log(ctx, LY_LLWRN, 0, str, ##args)
59#define LOGVRB(str, args...) ly_log(NULL, LY_LLVRB, 0, str, ##args)
60
61#define LOGMEM(CTX) LOGERR(CTX, LY_EMEM, "Memory allocation failed (%s()).", __func__)
62#define LOGINT(CTX) LOGERR(CTX, LY_EINT, "Internal error (%s:%d).", __FILE__, __LINE__)
63#define LOGARG(CTX, ARG) LOGERR(CTX, LY_EINVAL, "Invalid argument %s (%s()).", #ARG, __func__)
64
65/*
66 * Common code to check return value and perform appropriate action.
67 */
68#define LY_CHECK_GOTO(COND, GOTO) if (COND) {goto GOTO;}
69#define LY_CHECK_ERR_GOTO(COND, ERR, GOTO) if (COND) {ERR; goto GOTO;}
70#define LY_CHECK_RETURN(COND, RETVAL) if (COND) {return RETVAL;}
71#define LY_CHECK_ERR_RETURN(COND, ERR, RETVAL) if (COND) {ERR; return RETVAL;}
72
73#define LY_CHECK_ARG_NON_NULL_GOTO1(CTX, ARG, GOTO) if (!ARG) {LOGARG(CTX, ARG);goto GOTO;}
74#define LY_CHECK_ARG_NON_NULL_GOTO2(CTX, ARG1, ARG2, GOTO) LY_CHECK_ARG_NON_NULL_GOTO1(CTX, ARG1, GOTO);LY_CHECK_ARG_NON_NULL_GOTO1(CTX, ARG2, GOTO)
75#define LY_CHECK_ARG_NON_NULL_GOTO3(CTX, ARG1, ARG2, ARG3, GOTO) LY_CHECK_ARG_NON_NULL_GOTO2(CTX, ARG1, ARG2, GOTO);LY_CHECK_ARG_NON_NULL_GOTO1(CTX, ARG3, GOTO)
76#define LY_CHECK_ARG_NON_NULL_GOTO(CTX, ...) GETMACRO4(__VA_ARGS__, LY_CHECK_ARG_NON_NULL_GOTO3, LY_CHECK_ARG_NON_NULL_GOTO2, LY_CHECK_ARG_NON_NULL_GOTO1)(CTX, __VA_ARGS__)
77
78#define LY_CHECK_ARG_NON_NULL_RETURN1(CTX, ARG, RETVAL) if (!ARG) {LOGARG(CTX, ARG);return RETVAL;}
79#define LY_CHECK_ARG_NON_NULL_RETURN2(CTX, ARG1, ARG2, RETVAL) LY_CHECK_ARG_NON_NULL_RETURN1(CTX, ARG1, RETVAL);LY_CHECK_ARG_NON_NULL_RETURN1(CTX, ARG2, RETVAL)
80#define LY_CHECK_ARG_NON_NULL_RETURN3(CTX, ARG1, ARG2, ARG3, RETVAL) LY_CHECK_ARG_NON_NULL_RETURN2(CTX, ARG1, ARG2, RETVAL);LY_CHECK_ARG_NON_NULL_RETURN1(CTX, ARG3, RETVAL)
81#define LY_CHECK_ARG_NON_NULL_RETURN(CTX, ...) GETMACRO4(__VA_ARGS__, LY_CHECK_ARG_NON_NULL_RETURN3, LY_CHECK_ARG_NON_NULL_RETURN2, LY_CHECK_ARG_NON_NULL_RETURN1)(CTX, __VA_ARGS__)
82
83#define LY_CHECK_ARG_NULL_GOTO1(CTX, ARG, GOTO) if (ARG) {LOGARG(CTX, ARG);goto GOTO;}
84#define LY_CHECK_ARG_NULL_GOTO2(CTX, ARG1, ARG2, GOTO) LY_CHECK_ARG_NULL_GOTO1(CTX, ARG1, GOTO);LY_CHECK_ARG_NULL_GOTO1(CTX, ARG2, GOTO)
85#define LY_CHECK_ARG_NULL_GOTO3(CTX, ARG1, ARG2, ARG3, GOTO) LY_CHECK_ARG_NULL_GOTO2(CTX, ARG1, ARG2, GOTO);LY_CHECK_ARG_NULL_GOTO1(CTX, ARG3, GOTO)
86#define LY_CHECK_ARG_NULL_GOTO(CTX, ...) GETMACRO4(__VA_ARGS__, LY_CHECK_ARG_NULL_GOTO3, LY_CHECK_ARG_NULL_GOTO2, LY_CHECK_ARG_NULL_GOTO1)(CTX, __VA_ARGS__)
87
88#define LY_CHECK_ARG_NULL_RETURN1(CTX, ARG, RETVAL) if (ARG) {LOGARG(CTX, ARG);return RETVAL;}
89#define LY_CHECK_ARG_NULL_RETURN2(CTX, ARG1, ARG2, RETVAL) LY_CHECK_ARG_NULL_RETURN1(CTX, ARG1, RETVAL);LY_CHECK_ARG_NULL_RETURN1(CTX, ARG2, RETVAL)
90#define LY_CHECK_ARG_NULL_RETURN3(CTX, ARG1, ARG2, ARG3, RETVAL) LY_CHECK_ARG_NULL_RETURN2(CTX, ARG1, ARG2, RETVAL);LY_CHECK_ARG_NULL_RETURN1(CTX, ARG3, RETVAL)
91#define LY_CHECK_ARG_NULL_RETURN(CTX, ...) GETMACRO4(__VA_ARGS__, LY_CHECK_ARG_NULL_RETURN3, LY_CHECK_ARG_NULL_RETURN2, LY_CHECK_ARG_NULL_RETURN1)(CTX, __VA_ARGS__)
92
93/*
94 * If the compiler supports attribute to mark objects as hidden, mark all
95 * objects as hidden and export only objects explicitly marked to be part of
96 * the public API.
97 */
98#define API __attribute__((visibility("default")))
99
100#endif /* LY_COMMON_H_ */