/*
    Copyright (c) 2014-2016 Intel Corporation.  All Rights Reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

      * Redistributions of source code must retain the above copyright
        notice, this list of conditions and the following disclaimer.
      * Redistributions in binary form must reproduce the above copyright
        notice, this list of conditions and the following disclaimer in the
        documentation and/or other materials provided with the distribution.
      * Neither the name of Intel Corporation nor the names of its
        contributors may be used to endorse or promote products derived
        from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#ifndef COI_HOST_H_INCLUDED
#define COI_HOST_H_INCLUDED

#include "coi_common.h"

#define COIERROR(...)			  \
{					  \
  fprintf (stderr, "COI ERROR - HOST: "); \
  fprintf (stderr, __VA_ARGS__);	  \
  fprintf (stderr, "\n");		  \
  perror (NULL);			  \
  return COI_ERROR;			  \
}

/* Like COIERROR, but return NULL instead of COIRESULT.  */
#define COIERRORN(...)			  \
{					  \
  fprintf (stderr, "COI ERROR - HOST: "); \
  fprintf (stderr, __VA_ARGS__);	  \
  fprintf (stderr, "\n");		  \
  perror (NULL);			  \
  return NULL;				  \
}

#ifdef DEBUG
  #define COITRACE(...)			    \
  {					    \
    fprintf (stderr, "COI TRACE - HOST: "); \
    fprintf (stderr, __VA_ARGS__);	    \
    fprintf (stderr, "\n");		    \
  }
#else
  #define COITRACE(...) {}
#endif

#endif // COI_HOST_H_INCLUDED
