Skip to content

Instantly share code, notes, and snippets.

@mjf
Created September 2, 2011 00:25
Show Gist options
  • Save mjf/1187661 to your computer and use it in GitHub Desktop.
Save mjf/1187661 to your computer and use it in GitHub Desktop.
Simple FSM to strip Juniper configuration comments
/**
* 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;
}
}
@mjf
Copy link
Author

mjf commented Jun 27, 2014

Compile as follows:

cc -pedantic -ansi -Wall -Werror -o junos_strip_comments junos_strip_comments.c

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment