#include #define q(R,x) #x, c11[]=R"()"; x char state, count, *r, *w, *f, output[1<<16], data[] = /* Prologue */ "#include" "#define q(R,x) #x, c11[]=R\"()\"; x" "char state, count," "*r, *w, *f," "output[1<<16]," "data[] =\"" /* Format data */ "(zz!(zz!(zz!(zz!(zz!(zz!(zz!(zz!(zz!(zz!" "(zz!(zz!(zz!(zz!(zz!(zz!(zz!(zz!(zz!(zz!" "(zz!(zz!(zz!(zz!(zz!(zz!(zz!(zz!(zz!(zz!" "(zz!(zz!(zz!(zz!(zz!(zz!(zz!(zz!(zz!(zz!" "(zz!(zz!(zz!(zz!(zz!(zz!(zz!(zz!(zz!(zz!" "(zz!(zz!(zz!(zz!(zz!(zz!(zz!(zz!(zz!(zz!" "(zz!(zz!(zz!(zz!(zz!(zz!(zz!(zz!(zz!(zz!" "(zz!(zz!(zz!(zz!(zz!(zz!(zz!(zz!(zz!(zz!" "(zz!(zz!(zz!(zz!(zz!(zz!(zz!(zz!(zz!(zz!" "(zz!(zz!(zz!(zz!(zz!(zz!(zz!(zz!(zz!(zz!" /* Code */ "\"" q(, int main() { /* Compress whitespaces in input */ for(r = w = data; *r; r++) { if( *r != 32 ) /* Space */ *(w++) = *r; } *(w++) = 41; /* Closing parenthesis */ *w = 0; /* Select format */ f = data + (sizeof('c') > 1 ? 90 /* C90 */ : c11[0] ? 98 /* C++98 */ : 11); /* C++11 */ /* XXX temporary */ f = data + 96; /* Output states (toggle on double quote before output character): 0 = copy data as is 1 = copy data as is 2 = copy data as is 3 = r = 0, escape double quote and newline 4 = escape double quote and newline 5 = escape double quote and newline 6 = escape double quote and newline 7 = copy data as is, write '"q(,' */ state = 0; /* Generate output */ r = data; w = output; for(; *r; f++) { if( *f < 92 ) { if( *f == 33 ) { /* Newline */ if( state >= 3 && state <= 6 ) { w[-1] = 92; /* Backslash */ r--; } *(w++) = 10; } else { /* Space */ for(count = *f - 34; count > 0; count--) *(w++) = 32; } } else { /* Characters */ for(count = *f - 92; count > 0 && *r; count--) { if( *r == 34 ) { state++; r = (state == 3 ? data : r + 1); if( state >= 4 && state <= 7 ) { /* Backslash escaped double quote */ *(w++) = 92; count--; } *(w++) = 34; /* Double quote */ if( state == 7 ) { *(w++) = 34; /* double quote */ *(w++) = 113; /* 'q' */ *(w++) = 40; /* '(' */ *(w++) = 44; /* ',' */ count -= 4; } } else { *(w++) = *(r++); } } } } *w = 0; return puts(output); })