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);