ccompress: C言語のソースから余分な空白を除去
cco.re: 原始プログラム
/* Generated by re2c 0.12.1 on Thu Dec 6 00:40:34 2007 */
#line 1 "cco.re"
#include <stdio.h>
#define ggets(s) fgets (s, sizeof s, stdin)
enum toktyp { none, word, num, op, quote, comin, comout, comsol, space };
char *
scan (char * p, int * r_type)
{
char * q;
#define YYCTYPE char
#define YYCURSOR p
#define YYLIMIT p
#define YYMARKER q
#define YYFILL(n)
start:
#line 20 "cco.c"
{
YYCTYPE yych;
unsigned int yyaccept = 0;
if((YYLIMIT - YYCURSOR) < 4) YYFILL(4);
yych = *YYCURSOR;
switch(yych) {
case 0x09:
case 0x0A:
case ' ': goto yy12;
case '"': goto yy11;
case '\'': goto yy10;
case '*': goto yy9;
case '/': goto yy7;
case '0': goto yy2;
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': goto yy4;
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
case 'G':
case 'H':
case 'I':
case 'J':
case 'K':
case 'L':
case 'M':
case 'N':
case 'O':
case 'P':
case 'Q':
case 'R':
case 'S':
case 'T':
case 'U':
case 'V':
case 'W':
case 'X':
case 'Y':
case 'Z':
case '_':
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
case 'g':
case 'h':
case 'i':
case 'j':
case 'k':
case 'l':
case 'm':
case 'n':
case 'o':
case 'p':
case 'q':
case 'r':
case 's':
case 't':
case 'u':
case 'v':
case 'w':
case 'x':
case 'y':
case 'z': goto yy5;
default: goto yy14;
}
yy2:
yyaccept = 0;
yych = *(YYMARKER = ++YYCURSOR);
switch(yych) {
case '.': goto yy38;
case 'X':
case 'x': goto yy44;
default: goto yy43;
}
yy3:
#line 20 "cco.re"
{ *r_type = num; return YYCURSOR; }
#line 112 "cco.c"
yy4:
yyaccept = 0;
yych = *(YYMARKER = ++YYCURSOR);
goto yy37;
yy5:
++YYCURSOR;
yych = *YYCURSOR;
goto yy35;
yy6:
#line 21 "cco.re"
{ *r_type = word; return YYCURSOR; }
#line 124 "cco.c"
yy7:
++YYCURSOR;
switch((yych = *YYCURSOR)) {
case '*': goto yy32;
case '/': goto yy30;
default: goto yy8;
}
yy8:
#line 29 "cco.re"
{ *r_type = op; return YYCURSOR; }
#line 135 "cco.c"
yy9:
yych = *++YYCURSOR;
switch(yych) {
case '/': goto yy28;
default: goto yy8;
}
yy10:
yyaccept = 1;
yych = *(YYMARKER = ++YYCURSOR);
switch(yych) {
case '\'': goto yy8;
case '\\': goto yy26;
default: goto yy24;
}
yy11:
yyaccept = 1;
yych = *(YYMARKER = ++YYCURSOR);
goto yy18;
yy12:
++YYCURSOR;
yych = *YYCURSOR;
goto yy16;
yy13:
#line 28 "cco.re"
{ *r_type = space; return YYCURSOR; }
#line 161 "cco.c"
yy14:
yych = *++YYCURSOR;
goto yy8;
yy15:
++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
yy16:
switch(yych) {
case 0x09:
case 0x0A:
case ' ': goto yy15;
default: goto yy13;
}
yy17:
++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
yy18:
switch(yych) {
case '"': goto yy21;
case '\\': goto yy19;
default: goto yy17;
}
yy19:
++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
switch(yych) {
case '"': goto yy23;
case '\\': goto yy19;
default: goto yy17;
}
yy21:
++YYCURSOR;
yy22:
#line 27 "cco.re"
{ *r_type = quote; return YYCURSOR; }
#line 200 "cco.c"
yy23:
yyaccept = 2;
YYMARKER = ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
switch(yych) {
case '"': goto yy21;
case '\\': goto yy19;
default: goto yy17;
}
yy24:
++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
switch(yych) {
case '\'': goto yy21;
default: goto yy24;
}
yy26:
yych = *++YYCURSOR;
switch(yych) {
case '\'': goto yy27;
default: goto yy24;
}
yy27:
yych = *++YYCURSOR;
switch(yych) {
case '\'': goto yy21;
default: goto yy22;
}
yy28:
++YYCURSOR;
#line 23 "cco.re"
{ *r_type = comout; return YYCURSOR; }
#line 235 "cco.c"
yy30:
++YYCURSOR;
#line 24 "cco.re"
{ *r_type = comsol; return YYCURSOR; }
#line 240 "cco.c"
yy32:
++YYCURSOR;
#line 22 "cco.re"
{ *r_type = comin; return YYCURSOR; }
#line 245 "cco.c"
yy34:
++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
yy35:
switch(yych) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
case 'G':
case 'H':
case 'I':
case 'J':
case 'K':
case 'L':
case 'M':
case 'N':
case 'O':
case 'P':
case 'Q':
case 'R':
case 'S':
case 'T':
case 'U':
case 'V':
case 'W':
case 'X':
case 'Y':
case 'Z':
case '_':
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
case 'g':
case 'h':
case 'i':
case 'j':
case 'k':
case 'l':
case 'm':
case 'n':
case 'o':
case 'p':
case 'q':
case 'r':
case 's':
case 't':
case 'u':
case 'v':
case 'w':
case 'x':
case 'y':
case 'z': goto yy34;
default: goto yy6;
}
yy36:
yyaccept = 0;
YYMARKER = ++YYCURSOR;
if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
yych = *YYCURSOR;
yy37:
switch(yych) {
case '.': goto yy38;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': goto yy36;
default: goto yy3;
}
yy38:
yych = *++YYCURSOR;
switch(yych) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': goto yy40;
default: goto yy39;
}
yy39:
YYCURSOR = YYMARKER;
switch(yyaccept) {
case 0: goto yy3;
case 1: goto yy8;
case 2: goto yy22;
}
yy40:
++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
switch(yych) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': goto yy40;
default: goto yy3;
}
yy42:
++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
yy43:
switch(yych) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7': goto yy42;
default: goto yy3;
}
yy44:
yych = *++YYCURSOR;
switch(yych) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f': goto yy45;
default: goto yy39;
}
yy45:
++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
switch(yych) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f': goto yy45;
default: goto yy3;
}
}
#line 30 "cco.re"
}
void
putnc (int n, char * cs)
{
while (n--) putchar (*cs++);
}
int
f (int a, int b)
{
if (a == word && b == word) return 1;
if (a == word && b == num) return 1;
if (a == num && b == word) return 1;
if (a == num && b == num) return 1;
return 0;
}
int
main (void)
{
char * p, * pp;
char buf[256];
int q = none, r;
while (pp = ggets (buf)) {
while (*(p = scan (pp, &r))) {
if (*pp == '#') {
if (q != none) puts ("");
q = none;
fputs (pp, stdout);
break;
}
if (r == comsol) break;
// one line comment
if (r != space) {
if (f (q, r)) putchar (' ');
putnc (p - pp, pp);
}
pp = p;
if (r != space) q = r;
}
}
putchar ('\n');
return 0;
}
Ray Misaki <raymisaki@yahoo.co.jp>