+/* platform independent wrappers for printf() et al. (newline aware) */
+/* ------------------------------------------------------------------------- */
+
+static void vfprintf_newline(FILE *stream, char *format, va_list ap)
+{
+#if defined(PLATFORM_WIN32) || defined(PLATFORM_MSDOS)
+ char *newline = "\r\n";
+#else
+ char *newline = "\n";
+#endif
+
+ vfprintf(stream, format, ap);
+
+ fprintf(stream, "%s", newline);
+}
+
+static void vprintf_error_ext(char *format, va_list ap, boolean print_newline)
+{
+ FILE *error = stderr;
+
+#if defined(PLATFORM_WIN32) || defined(PLATFORM_MSDOS)
+ if ((error = openErrorFile()) == NULL)
+ program.exit_function(1);
+#endif
+
+ if (print_newline)
+ vfprintf_newline(error, format, ap);
+ else
+ vfprintf(error, format, ap);
+
+ if (error != stderr)
+ fclose(error);
+}
+
+static void vprintf_error(char *format, va_list ap)
+{
+ vprintf_error_ext(format, ap, FALSE);
+}
+
+static void vprintf_error_newline(char *format, va_list ap)
+{
+ vprintf_error_ext(format, ap, TRUE);
+}
+
+static void printf_error(char *format, ...)
+{
+ if (format)
+ {
+ va_list ap;
+
+ va_start(ap, format);
+ vprintf_error(format, ap);
+ va_end(ap);
+ }
+}
+
+static void printf_error_newline(char *format, ...)
+{
+ if (format)
+ {
+ va_list ap;
+
+ va_start(ap, format);
+ vprintf_error_newline(format, ap);
+ va_end(ap);
+ }
+}
+
+static void fprintf_newline(FILE *stream, char *format, ...)
+{
+ if (format)
+ {
+ va_list ap;
+
+ va_start(ap, format);
+ vfprintf_newline(stream, format, ap);
+ va_end(ap);
+ }
+}