/* Auteur: pirus */ /* Plateforme: Linux */ /* Compilateur/version: gcc/- */ /* Auteur: pirus Plateforme: Linux/Win32 Compilateur/version: gcc 3.3.6 (Linux), gcc 3.4.2 (MinGW) Version: 1 (20060810) */ #include <stdio.h> #include <unistd.h> #include <sys/uio.h> #define NVEC 256 #define BLEN ( 8*NVEC ) /* char translation table */ static const unsigned char ctt[256] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x02, 0x02, 0x02, 0x02, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x05, 0x06, 0x07, 0x02, 0x02, 0x08, 0x02, 0x02, 0x02, 0x09, 0x0a, 0x02, 0x0b, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0c, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x02, 0x03, 0x08, 0x02, 0x02, 0x02, 0x09, 0x0a, 0x02, 0x0b, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0c, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x02, 0x00, }; enum { S_OT, S_IT, S_AT, S_HR, S_U0, S_U1, S_U2, S_A, S_E, S_F, S_H, S_R, S_SA }; /* state transition table */ static const int stt[] = { S_OT, S_OT, S_OT, S_OT, S_OT, S_IT, S_OT, S_OT, S_OT, S_OT, S_OT, S_OT, S_OT, S_OT, S_OT, S_OT, /* OTAG */ S_SA, S_IT, S_SA, S_SA, S_SA, S_SA, S_SA, S_OT, S_A, S_SA, S_SA, S_SA, S_SA, S_OT, S_OT, S_OT, /* ITAG */ S_SA, S_AT, S_SA, S_SA, S_SA, S_SA, S_SA, S_OT, S_SA, S_SA, S_SA, S_H, S_SA, S_OT, S_OT, S_OT, /* ATAG */ S_SA, S_HR, S_U0, S_U0, S_HR, S_SA, S_SA, S_SA, S_U0, S_U0, S_U0, S_U0, S_U0, S_OT, S_OT, S_OT, /* HREF */ S_SA, S_SA, S_U1, S_U1, S_SA, S_U1, S_U1, S_OT, S_U1, S_U1, S_U1, S_U1, S_U1, S_OT, S_OT, S_OT, /* URI0 */ S_SA, S_U2, S_U1, S_U1, S_U2, S_U1, S_U1, S_U2, S_U1, S_U1, S_U1, S_U1, S_U1, S_OT, S_OT, S_OT, /* URI1 */ S_SA, S_SA, S_SA, S_SA, S_SA, S_SA, S_SA, S_OT, S_SA, S_SA, S_SA, S_SA, S_SA, S_OT, S_OT, S_OT, /* URI2 */ S_SA, S_AT, S_SA, S_SA, S_SA, S_SA, S_SA, S_OT, S_SA, S_SA, S_SA, S_SA, S_SA, S_OT, S_OT, S_OT, /* A */ S_SA, S_IT, S_SA, S_SA, S_SA, S_SA, S_SA, S_OT, S_SA, S_SA, S_F, S_SA, S_SA, S_OT, S_OT, S_OT, /* E */ S_SA, S_F, S_SA, S_SA, S_SA, S_SA, S_HR, S_OT, S_SA, S_SA, S_SA, S_SA, S_SA, S_OT, S_OT, S_OT, /* F */ S_SA, S_IT, S_SA, S_SA, S_SA, S_SA, S_SA, S_OT, S_SA, S_SA, S_SA, S_SA, S_R, S_OT, S_OT, S_OT, /* H */ S_SA, S_IT, S_SA, S_SA, S_SA, S_SA, S_SA, S_OT, S_SA, S_E, S_SA, S_SA, S_SA, S_OT, S_OT, S_OT, /* R */ S_SA, S_IT, S_SA, S_SA, S_SA, S_SA, S_SA, S_OT, S_SA, S_SA, S_SA, S_SA, S_SA, S_OT, S_OT, S_OT /* SKIP */ /* (def) (WS) (uri) (uns) (qt) < = > a e f h r */ }; static unsigned char xbuf[ BLEN ]; static struct iovec iov[ NVEC ]; static const char *lf = "\n"; #define IOVEC_SET( IOV, BASE, XLEN ) { \ (IOV).iov_base = (void *)(BASE); \ (IOV).iov_len = (size_t)(XLEN); \ } static void parse() { unsigned char *c0, *c1; int st, nv, i, n; st = S_OT; while( (n = read( STDIN_FILENO, xbuf, BLEN )) > 0 ) { c0 = c1 = xbuf; nv = 0; for( i = 0 ; i < n ; ++i ) { st = stt[ ( st << 4 ) + ctt[ *c1 ] ]; if( st == S_U0 ) c0 = c1; else if( st == S_U2 ) { IOVEC_SET( iov[ nv ], c0, c1 - c0 ); ++nv; IOVEC_SET( iov[ nv ], lf, 1 ); ++nv; } ++c1; } if( st == S_U1 ) { IOVEC_SET( iov[ nv ], c0, c1 - c0 ); ++nv; } if( nv > 0 ) (void)writev( STDOUT_FILENO, iov, nv ); } } /*ARGSUSED*/ int main( int argc, char *argv[] ) { parse(); return 0; }