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