#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include "gpk_std.h"
#include "err.h"

LOCAL void err(C char *front, C char *prgm, C char *a, C char *b, FILE *where)
{
 BOOL hasspace = strchr(a, ' ')!=0;
 fputs(front, where);
 fputc(hasspace ? ' ' : '_', where);
 fputs(prgm, where);
 fputs(hasspace ? ": " : ":_", where);
 fputs(a, where);
 if(b) fputs(b, where);
 putc('\n', where);
}

void gpk_hidden_err(C char *prgm, C char *a, C char *b)
{
 err("ERR:", prgm, a, b, stdout);
 fflush(stdout);
 err("ERR:", prgm, a, b, stderr);
 fflush(stderr);
 fsync(fileno(stdout));
 fsync(fileno(stderr));
 exit(2);
}

void gpk_hidden_warn(C char *prgm, C char *a, C char *b)
{
 err("#WARN:", prgm, a, b, stdout);
 fflush(stdout);
 err("#WARN:", prgm, a, b, stderr);
 fflush(stderr);
 fsync(fileno(stdout));
 fsync(fileno(stderr));
}

void gpk_hidden_abort(C char *prgm, C char *a, C char *b)
{
 err("ERR:", prgm, a, b, stdout);
 fflush(stdout);
 err("ERR:", prgm, a, b, stderr);
 fflush(stderr);
 fsync(fileno(stdout));
 fsync(fileno(stderr));
 abort();
}
