Mercurial > ~dholland > hg > tradcpp > index.cgi
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; }