From: Wolfgang (Blub) Bumiller Date: Mon, 29 Oct 2012 12:52:39 +0000 (+0100) Subject: trigraphs X-Git-Tag: 0.1-rc1~12 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=e6cebc3ea35b3e96282e88f2792b8a2df68a868d;p=xonotic%2Fgmqcc.git trigraphs --- 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; }