Created
September 2, 2011 00:25
-
-
Save mjf/1187661 to your computer and use it in GitHub Desktop.
Simple FSM to strip Juniper configuration comments
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Strip Juniper Comments | |
* Copyright (C) 2011 Matous J. Fialka, <http://mjf.cz/> | |
* Released under the terms of The MIT License | |
*/ | |
#include <stdio.h> | |
enum { | |
ASCII_NUL = '\000', | |
ASCII_BELL = '\007', | |
ASCII_BACKSPACE = '\010', | |
ASCII_HTTAB = '\011', | |
ASCII_LFNL = '\012', | |
ASCII_LINE_TABULATION = '\013', | |
ASCII_FORM_FEED = '\014', | |
ASCII_CR = '\015', | |
ASCII_ESCAPE = '\033', | |
ASCII_QUOTATION_MARK = '\042', | |
ASCII_NUMBER_SIGN = '\043', | |
ASCII_ASTERISK = '\052', | |
ASCII_SOLIDUS = '\057', | |
ASCII_DIGITAL_ZERO = '\060', | |
ASCII_REVERSED_SOLIDUS = '\134', | |
ASCII_DELETE = '\177', | |
ASCII_MINISCULE_A = '\141', | |
ASCII_MINISCULE_B = '\142', | |
ASCII_MINISCULE_D = '\144', | |
ASCII_MINISCULE_E = '\145', | |
ASCII_MINISCULE_F = '\146', | |
ASCII_MINISCULE_N = '\156', | |
ASCII_MINISCULE_R = '\162', | |
ASCII_MINISCULE_T = '\164', | |
ASCII_MINISCULE_V = '\166' | |
}; | |
int | |
main(void) | |
{ | |
enum { | |
STATE_TEXT = 0, | |
STATE_TEXT_REVERSED_SOLIDUS, | |
STATE_TEXT_SOLIDUS, | |
STATE_COMMENT, | |
STATE_MULTILINE_COMMENT, | |
STATE_MULTILINE_COMMENT_ASTERISK, | |
STATE_QUOTATION, | |
STATE_QUOTATION_REVERSED_SOLIDUS, | |
STATE_ABORT | |
} state; | |
int position; | |
state = STATE_TEXT; | |
while((position = fgetc(stdin)) != EOF) { | |
switch (state) { | |
case STATE_TEXT: | |
switch (position) { | |
case ASCII_QUOTATION_MARK: | |
state = STATE_QUOTATION; | |
break; | |
case ASCII_REVERSED_SOLIDUS: | |
state = STATE_TEXT_REVERSED_SOLIDUS; | |
continue; | |
case ASCII_SOLIDUS: | |
state = STATE_TEXT_SOLIDUS; | |
continue; | |
case ASCII_NUMBER_SIGN: | |
state = STATE_COMMENT; | |
continue; | |
default: | |
break; | |
} | |
break; | |
case STATE_TEXT_REVERSED_SOLIDUS: | |
switch (position) { | |
case ASCII_LFNL: | |
state = STATE_TEXT; | |
continue; | |
} | |
state = STATE_TEXT; | |
break; | |
case STATE_TEXT_SOLIDUS: | |
switch (position) { | |
case ASCII_ASTERISK: | |
state = STATE_MULTILINE_COMMENT; | |
continue; | |
default: | |
state = STATE_TEXT; | |
fputc(ASCII_SOLIDUS, stdout); | |
break; | |
} | |
break; | |
case STATE_COMMENT: | |
switch (position) { | |
case ASCII_LFNL: | |
state = STATE_TEXT; | |
break; | |
default: | |
continue; | |
} | |
break; | |
case STATE_MULTILINE_COMMENT: | |
switch (position) { | |
case ASCII_ASTERISK: | |
state = STATE_MULTILINE_COMMENT_ASTERISK; | |
continue; | |
default: | |
continue; | |
} | |
break; | |
case STATE_MULTILINE_COMMENT_ASTERISK: | |
switch (position) { | |
case ASCII_SOLIDUS: | |
state = STATE_TEXT; | |
continue; | |
default: | |
state = STATE_MULTILINE_COMMENT; | |
continue; | |
} | |
break; | |
case STATE_QUOTATION: | |
switch (position) { | |
case ASCII_QUOTATION_MARK: | |
state = STATE_TEXT; | |
break; | |
case ASCII_REVERSED_SOLIDUS: | |
state = STATE_QUOTATION_REVERSED_SOLIDUS; | |
continue; | |
default: | |
break; | |
} | |
break; | |
case STATE_QUOTATION_REVERSED_SOLIDUS: | |
state = STATE_QUOTATION; | |
switch (position) { | |
case ASCII_DIGITAL_ZERO: | |
putc(ASCII_NUL, stdout); | |
continue; | |
case ASCII_MINISCULE_A: | |
putc(ASCII_BELL, stdout); | |
continue; | |
case ASCII_MINISCULE_B: | |
putc(ASCII_BACKSPACE, stdout); | |
continue; | |
case ASCII_MINISCULE_D: | |
putc(ASCII_DELETE, stdout); | |
continue; | |
case ASCII_MINISCULE_E: | |
putc(ASCII_ESCAPE, stdout); | |
continue; | |
case ASCII_MINISCULE_F: | |
putc(ASCII_FORM_FEED, stdout); | |
continue; | |
case ASCII_MINISCULE_N: | |
putc(ASCII_CR, stdout); | |
continue; | |
case ASCII_MINISCULE_R: | |
putc(ASCII_LFNL, stdout); | |
continue; | |
case ASCII_MINISCULE_T: | |
putc(ASCII_HTTAB, stdout); | |
continue; | |
case ASCII_MINISCULE_V: | |
putc(ASCII_LINE_TABULATION, stdout); | |
continue; | |
default: | |
break; | |
} | |
break; | |
case STATE_ABORT: | |
break; | |
default: | |
break; | |
} | |
fprintf(stdout, "%c", position); | |
} | |
switch (state) { | |
case STATE_TEXT_REVERSED_SOLIDUS: | |
fprintf(stderr, "Error: end of file can not be escaped\n"); | |
return 1; | |
case STATE_QUOTATION: | |
case STATE_QUOTATION_REVERSED_SOLIDUS: | |
fprintf(stderr, "Error: string not closed\n"); | |
return 1; | |
case STATE_COMMENT: | |
fprintf(stderr, "Error: comment not closed\n"); | |
return 1; | |
case STATE_MULTILINE_COMMENT: | |
fprintf(stderr, "Error: multiline comment not closed\n"); | |
return 1; | |
default: | |
return 0; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Compile as follows: