diff options
Diffstat (limited to 'grammars/c/preprocess.c')
-rw-r--r-- | grammars/c/preprocess.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/grammars/c/preprocess.c b/grammars/c/preprocess.c new file mode 100644 index 0000000..3ae7406 --- /dev/null +++ b/grammars/c/preprocess.c @@ -0,0 +1,45 @@ +void preprocess(char *string, size_t length) { + int on_newline = 1; + for (int i = 0; i < length;) { + switch (string[i]) { + case '/': { + on_newline = 0; + if (string[i+1] == '*') { + for (; i+1 < length; i++) { + if (string[i] == '*' && string[i+1] == '/') { + string[i] = ' '; + string[i+1] = ' '; + break; + } + string[i] = ' '; + } + continue; + } else if (string[i+1] == '/') { + for (; i < length; i++) { + if (string[i] == '\n') { + string[i] = ' '; + break; + } + string[i] = ' '; + } + continue; + } + break; + } + case '#': { + if (on_newline) { + int escaped = 0; + for (i++; i < length; i++) { + if (string[i] == '\n' && !escaped) break; + escaped = (string[i] == '\\'); + string[i] = ' '; + } + break; + } + } + case '\n': on_newline = 1; break; + default: on_newline = 0; break; + } + i++; + } +} |