view place.c @ 8:97243badae69

split place stuff to its own file
author David A. Holland
date Sun, 19 Dec 2010 19:15:55 -0500
parents
children 800f3a560a3b
line wrap: on
line source

#include <assert.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>

#include "utils.h"
#include "place.h"

static bool overall_failure;

#define NOWHERE_LINE      0
#define BUILTIN_LINE      1
#define COMMANDLINE_LINE  2

static struct place scratchplace;
static bool scratchplace_inuse;

static
bool
place_isnowhere(const struct place *p)
{
	return p->file == NULL && p->line == NOWHERE_LINE;
}

static
bool
place_isbuiltin(const struct place *p)
{
	return p->file == NULL && p->line == BUILTIN_LINE;
}

static
bool
place_iscommandline(const struct place *p)
{
	return p->file == NULL && p->line == COMMANDLINE_LINE;
}

struct place *
place_gettemporary(void)
{
	assert(!scratchplace_inuse);
	scratchplace_inuse = true;
	return &scratchplace;
}

void
place_puttemporary(struct place *p)
{
	assert(scratchplace_inuse);
	assert(p == &scratchplace);
	scratchplace_inuse = false;
}

struct place *
place_create(void)
{
	struct place *p;

	p = domalloc(sizeof(*p));
	place_setnowhere(p);
	return p;
}

struct place *
place_clone(const struct place *op)
{
	struct place *p;

	p = domalloc(sizeof(*p));
	*p = *op;
	return p;
}

void
place_destroy(struct place *p)
{
	free(p);
}

void
place_setnowhere(struct place *p)
{
	p->file = NULL;
	p->line = NOWHERE_LINE;
	p->column = 0;
}

void
place_setbuiltin(struct place *p, unsigned num)
{
	p->file = NULL;
	p->line = BUILTIN_LINE;
	p->column = num;
}

void
place_setcommandline(struct place *p, unsigned column)
{
	p->file = NULL;
	p->line = COMMANDLINE_LINE;
	p->column = column;
}

static
void
place_print(const struct place *p)
{
	if (place_iscommandline(p)) {
		fprintf(stderr, "<command-line>:1:%u", p->column);
	} else if (place_isbuiltin(p)) {
		fprintf(stderr, "<built-in>:%u:1", p->column);
	} else {
		fprintf(stderr, "%s:%u:%u", seenfile_getname(p->file),
			p->line, p->column);
	}
}

static
void
place_printfrom(const struct place *p)
{
	const struct place *from;

	from = seenfile_getincludeplace(p->file);
	if (!place_isnowhere(from)) {
		place_printfrom(from);
	}
	fprintf(stderr, "In file included from ");
	place_print(p);
	fprintf(stderr, ":\n");
}

void
complain(const struct place *p, const char *fmt, ...)
{
	va_list ap;
	const struct place *from;

	from = seenfile_getincludeplace(p->file);
	if (!place_isnowhere(from)) {
		place_printfrom(from);
	}
	place_print(p);
	fprintf(stderr, ": ");
	va_start(ap, fmt);
	vfprintf(stderr, fmt, ap);
	va_end(ap);
	fprintf(stderr, "\n");
}

void
complain_fail(void)
{
	overall_failure = true;
}

bool
complain_failed(void)
{
	return overall_failure;
}