From c9834ea987879e45b15dce15ee53dbb80f83ca19 Mon Sep 17 00:00:00 2001 From: Alexey Dobriyan Date: Fri, 19 Mar 2010 12:48:57 +0200 Subject: [PATCH] acc: warn about trigraphs, do not replace --- main.c | 43 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/main.c b/main.c index b9b62c7..93cee8a 100644 --- a/main.c +++ b/main.c @@ -11,12 +11,28 @@ #include #include +struct pos { + unsigned int line, column; +}; + #ifdef __GNUC__ #define __printf(a, b) __attribute__((format(printf, a, b))) #else #define __printf(a, b) #endif +static void warning(struct pos *pos, const char *fmt, ...) __printf(2, 3); +static void warning(struct pos *pos, const char *fmt, ...) +{ + va_list args; + + fprintf(stderr, "%u:%u: warning: ", pos->line, pos->column); + va_start(args, fmt); + vfprintf(stderr, fmt, args); + va_end(args); + fputc('\n', stderr); +} + static void perror_exit(const char *fmt, ...) __printf(1, 2); static void perror_exit(const char *fmt, ...) { @@ -163,10 +179,6 @@ static void fix_newline(uint32_t *c, unsigned int *nr_c) } } -struct pos { - unsigned int line, column; -}; - static struct pos *line_column(const uint32_t *c, unsigned int nr_c) { struct pos *pos; @@ -192,6 +204,28 @@ static struct pos *line_column(const uint32_t *c, unsigned int nr_c) return pos; } +static void warn_trigraph(const uint32_t *c, unsigned int nr_c, struct pos *pos) +{ + unsigned int i; + + i = 0; + while (i + 2 < nr_c) { + if (c[i] == '?' && c[i + 1] == '?') { + switch (c[i + 2]) { + case '=':case ')':case '!': + case '(':case '\'':case '>': + case '/':case '<':case '-': + warning(&pos[i], "trigraph sequence ??%c, ignoring", c[i + 2]); + i += 3; + break; + default: + i++; + } + } else + i++; + } +} + int main(int argc, char *argv[]) { int fd; @@ -234,6 +268,7 @@ int main(int argc, char *argv[]) fix_newline(c, &nr_c); pos = line_column(c, nr_c); + warn_trigraph(c, nr_c, pos); { unsigned int i; -- 2.11.4.GIT