/* 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;
}