#include "defs.h" char * GetToken( char *TheLine, char *Str, int *Token ) { enum { Neutral, InQuote, InWord } State = Neutral; int c; *Token = Word; *Str = '\0'; while( *TheLine != '\0' ) switch( State ) { case Neutral: switch( c = *TheLine++ ) { case ' ': case '\t': continue; case '&': *Token = Amper; return TheLine; case '|': *Token = Pipe; return TheLine; case '\n': *Token = Eoln; return TheLine; case '<': *Token = From; continue; case '>': *Token = To; continue; case '\'': State = InQuote; continue; default: State = InWord; *Str++ = c; continue; } case InQuote: switch( c = *TheLine++ ) { case '\'': State = InWord; continue; default: *Str++ = c; continue; } case InWord: switch( c = *TheLine++ ) { case '&': case '|': case '<': case '>': case '\n': TheLine--; /* FALLTHROUGH - this is an intentional fall-through */ case ' ': case '\t': *Str++ = '\0'; return TheLine; case '\'': State = InQuote; continue; default: *Str++ = c; continue; } } return NULL; }