#ifndef BSD_ERR_ERR_C
#define BSD_ERR_ERR_C

#include <bsd/err/err.h>

#if WANT_ERR_C99
#ifndef HAVE_ERR_C99
#define HAVE_ERR_C99

#include <stdio.h>	/* vsnprintf(3) */
#include <stdarg.h>	/* va_list va_start va_end */
#include <stdlib.h>	/* exit(3) */

#include <string.h>	/* strerror(3) */

#include <win32/windows/GetLastError.h>
#include <win32/windows/SetLastError.h>


#ifndef ERR_ERR_C_BUFSIZ
#define ERR_ERR_C_BUFSIZ	256
#endif


void err(int retcode, const char *fmt, ...) {
	va_list ap;

	va_start(ap, fmt);

	verr(fmt, ap);

	/* NOT REACHED */
} /* err() */


void verr(int retcode, const char *fmt, va_list args) {
	int sys_errno	= GetLastError();
	char buf[ERR_ERR_C_BUFSIZ];

	(void)vsnprintf(buf, sizeof buf, fmt, args);

	(void)fprintf(stderr, "%s: %s\n", buf, strerror(sys_errno));

	exit(retcode);
} /* verr() */


void errx(int retcode, const char *fmt, ...) {
	va_list ap;

	va_start(ap, fmt);

	verrx(fmt, ap);

	/* NOT REACHED */
} /* errx() */


void verrx(int retcode, const char *fmt, va_list args) {
	int sys_errno	= GetLastError();
	char buf[ERR_ERR_C_BUFSIZ];

	(void)vsnprintf(buf, sizeof buf, fmt, args);

	(void)fprintf(stderr, "%s\n", buf);

	exit(retcode);
} /* verrx() */


void warn(const char *fmt, ...) {
	va_list ap;

	va_start(ap, fmt);

	vwarn(fmt, ap);

	va_end(ap);

	return /* void */;
} /* warn() */


void vwarn(const char *fmt, va_list args) {
	int sys_errno	= GetLastError();
	char buf[ERR_ERR_C_BUFSIZ];

	(void)vsnprintf(buf, sizeof buf, fmt, args);

	(void)fprintf(stderr, "%s: %s\n", buf, strerror(sys_errno));

	fflush(stderr);

	SetLastError(sys_errno);

	return /* void */;
} /* vwarn() */


void warnx(const char *fmt, ...) {
	va_list ap;

	va_start(ap, fmt);

	vwarnx(fmt, ap);

	va_end(ap);

	return /* void */;
} /* warnx() */


void vwarnx(const char *fmt, va_list args) {
	int sys_errno	= GetLastError();
	char buf[ERR_ERR_C_BUFSIZ];

	(void)vsnprintf(buf, sizeof buf, fmt, args);

	(void)fprintf(stderr, "%s\n", buf);

	fflush(stderr);

	SetLastError(errno);

	return /* void */;
} /* vwarnx() */


#endif /* HAVE_ERR_C99 */
#endif /* WANT_ERR_C99 */

#endif /* !BSD_ERR_ERR_C */

syntax highlighted by Code2HTML, v. 0.9.1