From e6cebc3ea35b3e96282e88f2792b8a2df68a868d Mon Sep 17 00:00:00 2001 From: "Wolfgang (Blub) Bumiller" Date: Mon, 29 Oct 2012 13:52:39 +0100 Subject: [PATCH] trigraphs --- lexer.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/lexer.c b/lexer.c index aa08a89..3730093 100644 --- a/lexer.c +++ b/lexer.c @@ -197,6 +197,34 @@ void lex_close(lex_file *lex) * are working on. * The are merely wrapping get/put in order to count line numbers. */ +static void lex_ungetch(lex_file *lex, int ch); +static int lex_try_trigraph(lex_file *lex, int old) +{ + int c2, c3; + c2 = fgetc(lex->file); + if (c2 != '?') { + lex_ungetch(lex, c2); + return old; + } + + c3 = fgetc(lex->file); + switch (c3) { + case '=': return '#'; + case '/': return '\\'; + case '\'': return '^'; + case '(': return '['; + case ')': return ']'; + case '!': return '|'; + case '<': return '{'; + case '>': return '}'; + case '-': return '~'; + default: + lex_ungetch(lex, c3); + lex_ungetch(lex, c2); + return old; + } +} + static int lex_getch(lex_file *lex) { int ch; @@ -211,6 +239,8 @@ static int lex_getch(lex_file *lex) ch = fgetc(lex->file); if (ch == '\n') lex->line++; + else if (ch == '?') + return lex_try_trigraph(lex, ch); return ch; } -- 2.39.2