The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#define RETURN_ON_ERROR(x,h,s) \
    if (ERROR_SUCCESS != x) { \
        SimpleLogString1(h,s); \
        return x; \
    }
 
#define RETURN_ON_ERROR_FREE(x,y,h,s) \
    if (ERROR_SUCCESS != x) { \
        SimpleLogString1(h,s); \
        free(y); \
        return x; \
    }
 
#define RETURN_ON_ERROR_FREE2(x,y,z,h,s) \
    if (ERROR_SUCCESS != x) { \
        SimpleLogString1(h,s); \
        free(y); \
        free(z); \
        return x; \
    }
 
#define RETURN_IF_NULL(x,h,s) \
    if (NULL == x) { \
        SimpleLogString1(h,s); \
        return ERROR_INSTALL_FAILURE; \
    }

#ifdef _DEBUG
#define LOG_DEBUG_DETAILS_IF_NULL(x,h) \
    if (NULL == x) { \
      PrintUINT(h,x); \
      PrintLastErrorDetails(h); \
    }
#define LOG_DEBUG_DETAILS_ON_ERROR(x,h) \
    if (ERROR_SUCCESS != x) { \
      PrintUINT(h,x); \
      PrintLastErrorDetails(h); \
    }
#else
#define LOG_DEBUG_DETAILS_IF_NULL(x,h)
#define LOG_DEBUG_DETAILS_ON_ERROR(x,h)
#endif


extern void SimpleLogString1(MSIHANDLE hModule, LPCTSTR s);
extern void SimpleLogString2(MSIHANDLE hModule, LPCTSTR s, LPCTSTR t);
extern void SimpleLogString3(MSIHANDLE hModule, LPCTSTR s, LPCTSTR t, LPCTSTR u);
extern void SimpleLogString4(MSIHANDLE hModule, LPCTSTR s, LPCTSTR t, LPCTSTR u, LPCTSTR v);
extern void PrintLastErrorDetails(MSIHANDLE hModule);
extern void PrintUINT(MSIHANDLE hModule, UINT i);