Mercurial > ~dholland > hg > tradcpp > index.cgi
diff 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 diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/place.c Sun Dec 19 19:15:55 2010 -0500 @@ -0,0 +1,163 @@ +#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; +} +