ox

The Ox programming language, compiler and tools (WIP)
Log | Files | Refs | README | LICENSE

utils.c (1067B)



#include "utils.h"

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>

void
panic_at(Node* node, const char* fmt, ...)
{
	va_list args;
	int saved_errno;
	saved_errno = errno;
	va_start(args, fmt);
	fprintf(stderr, "%s, [%zu:%zu] ", node->filename, node->line, node->col);
	fprintf(stderr, "Error: ");
	vfprintf(stderr, fmt, args);
	fprintf(stderr, "\n");
	va_end(args);
	if (fmt[0] && fmt[strlen(fmt) - 1] == ':') fprintf(stderr, " %s", strerror(saved_errno));
	fputc('\n', stderr);
	exit(1);
}

void
panic(const char* fmt, ...)
{
	va_list args;
	int saved_errno;
	saved_errno = errno;
	va_start(args, fmt);
	fprintf(stderr, "Error: ");
	vfprintf(stderr, fmt, args);
	fprintf(stderr, "\n");
	va_end(args);
	if (fmt[0] && fmt[strlen(fmt) - 1] == ':') fprintf(stderr, " %s", strerror(saved_errno));
	fputc('\n', stderr);
	exit(1);
}

void
softpanic(const char* fmt, ...)
{
	va_list args;
	va_start(args, fmt);
	fprintf(stderr, "Error: ");
	vfprintf(stderr, fmt, args);
	fprintf(stderr, "\n");
	va_end(args);
	exit(0);
}