The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/contrib/zstd/lib/common/error_private.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * Copyright (c) Yann Collet, Facebook, Inc.
    3  * All rights reserved.
    4  *
    5  * This source code is licensed under both the BSD-style license (found in the
    6  * LICENSE file in the root directory of this source tree) and the GPLv2 (found
    7  * in the COPYING file in the root directory of this source tree).
    8  * You may select, at your option, one of the above-listed licenses.
    9  */
   10 
   11 /* Note : this module is expected to remain private, do not expose it */
   12 
   13 #ifndef ERROR_H_MODULE
   14 #define ERROR_H_MODULE
   15 
   16 #if defined (__cplusplus)
   17 extern "C" {
   18 #endif
   19 
   20 
   21 /* ****************************************
   22 *  Dependencies
   23 ******************************************/
   24 #include "../zstd_errors.h"  /* enum list */
   25 #include "compiler.h"
   26 #include "debug.h"
   27 #include "zstd_deps.h"       /* size_t */
   28 
   29 
   30 /* ****************************************
   31 *  Compiler-specific
   32 ******************************************/
   33 #if defined(__GNUC__)
   34 #  define ERR_STATIC static __attribute__((unused))
   35 #elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
   36 #  define ERR_STATIC static inline
   37 #elif defined(_MSC_VER)
   38 #  define ERR_STATIC static __inline
   39 #else
   40 #  define ERR_STATIC static  /* this version may generate warnings for unused static functions; disable the relevant warning */
   41 #endif
   42 
   43 
   44 /*-****************************************
   45 *  Customization (error_public.h)
   46 ******************************************/
   47 typedef ZSTD_ErrorCode ERR_enum;
   48 #define PREFIX(name) ZSTD_error_##name
   49 
   50 
   51 /*-****************************************
   52 *  Error codes handling
   53 ******************************************/
   54 #undef ERROR   /* already defined on Visual Studio */
   55 #define ERROR(name) ZSTD_ERROR(name)
   56 #define ZSTD_ERROR(name) ((size_t)-PREFIX(name))
   57 
   58 ERR_STATIC unsigned ERR_isError(size_t code) { return (code > ERROR(maxCode)); }
   59 
   60 ERR_STATIC ERR_enum ERR_getErrorCode(size_t code) { if (!ERR_isError(code)) return (ERR_enum)0; return (ERR_enum) (0-code); }
   61 
   62 /* check and forward error code */
   63 #define CHECK_V_F(e, f) size_t const e = f; if (ERR_isError(e)) return e
   64 #define CHECK_F(f)   { CHECK_V_F(_var_err__, f); }
   65 
   66 
   67 /*-****************************************
   68 *  Error Strings
   69 ******************************************/
   70 
   71 const char* ERR_getErrorString(ERR_enum code);   /* error_private.c */
   72 
   73 ERR_STATIC const char* ERR_getErrorName(size_t code)
   74 {
   75     return ERR_getErrorString(ERR_getErrorCode(code));
   76 }
   77 
   78 /**
   79  * Ignore: this is an internal helper.
   80  *
   81  * This is a helper function to help force C99-correctness during compilation.
   82  * Under strict compilation modes, variadic macro arguments can't be empty.
   83  * However, variadic function arguments can be. Using a function therefore lets
   84  * us statically check that at least one (string) argument was passed,
   85  * independent of the compilation flags.
   86  */
   87 static INLINE_KEYWORD UNUSED_ATTR
   88 void _force_has_format_string(const char *format, ...) {
   89   (void)format;
   90 }
   91 
   92 /**
   93  * Ignore: this is an internal helper.
   94  *
   95  * We want to force this function invocation to be syntactically correct, but
   96  * we don't want to force runtime evaluation of its arguments.
   97  */
   98 #define _FORCE_HAS_FORMAT_STRING(...) \
   99   if (0) { \
  100     _force_has_format_string(__VA_ARGS__); \
  101   }
  102 
  103 #define ERR_QUOTE(str) #str
  104 
  105 /**
  106  * Return the specified error if the condition evaluates to true.
  107  *
  108  * In debug modes, prints additional information.
  109  * In order to do that (particularly, printing the conditional that failed),
  110  * this can't just wrap RETURN_ERROR().
  111  */
  112 #define RETURN_ERROR_IF(cond, err, ...) \
  113   if (cond) { \
  114     RAWLOG(3, "%s:%d: ERROR!: check %s failed, returning %s", \
  115            __FILE__, __LINE__, ERR_QUOTE(cond), ERR_QUOTE(ERROR(err))); \
  116     _FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \
  117     RAWLOG(3, ": " __VA_ARGS__); \
  118     RAWLOG(3, "\n"); \
  119     return ERROR(err); \
  120   }
  121 
  122 /**
  123  * Unconditionally return the specified error.
  124  *
  125  * In debug modes, prints additional information.
  126  */
  127 #define RETURN_ERROR(err, ...) \
  128   do { \
  129     RAWLOG(3, "%s:%d: ERROR!: unconditional check failed, returning %s", \
  130            __FILE__, __LINE__, ERR_QUOTE(ERROR(err))); \
  131     _FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \
  132     RAWLOG(3, ": " __VA_ARGS__); \
  133     RAWLOG(3, "\n"); \
  134     return ERROR(err); \
  135   } while(0);
  136 
  137 /**
  138  * If the provided expression evaluates to an error code, returns that error code.
  139  *
  140  * In debug modes, prints additional information.
  141  */
  142 #define FORWARD_IF_ERROR(err, ...) \
  143   do { \
  144     size_t const err_code = (err); \
  145     if (ERR_isError(err_code)) { \
  146       RAWLOG(3, "%s:%d: ERROR!: forwarding error in %s: %s", \
  147              __FILE__, __LINE__, ERR_QUOTE(err), ERR_getErrorName(err_code)); \
  148       _FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \
  149       RAWLOG(3, ": " __VA_ARGS__); \
  150       RAWLOG(3, "\n"); \
  151       return err_code; \
  152     } \
  153   } while(0);
  154 
  155 #if defined (__cplusplus)
  156 }
  157 #endif
  158 
  159 #endif /* ERROR_H_MODULE */

Cache object: dbccb8ed67d9ab3f8aabc55fc3cced49


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.