but...but...but..this way I can strcmp the buffer with a finite set of strings, determined at compile time, with the efficiency of a single strcmp!
for example, if the strings were: hi me how are you
I could do:
#define NOTHING -1
#define HI 2
#define ME 4
#define HOW 7
#define ARE 11
#define YOU 16
char *start = buffer;
char *position;
int state = 0;
int token = NOTHING;
for(;;) {
switch(*position) {
case 'h': switch(state) { case 0: state = 1; break;
default: state = 0; break;
}
case 'i': switch(state) { case 1: state = 2; break;
default: state = 0; break;
}
case 'm': switch(state) { case 0: state = 3; break;
default: state = 0; break;
}
case 'e': switch(state) { case 3: state = 4; break;
default: state = 0; break;
}
case 'h': switch(state) { case 0: state = 5; break;
default: state = 0; break;
}
case 'o': switch(state) { case 5: state = 6; break;
default: state = 0; break;
}
case 'w': switch(state) { case 6: state = 7; break;
default: state = 0; break;
}
case 'a': switch(state) { case 8: state = 9; break;
default: state = 0; break;
}
case 'r': switch(state) { case 9: state = 10; break;
default: state = 0; break;
}
case 'e': switch(state) { case 10: state = 11; break;
default: state = 0; break;
}
case 'y': switch(state) { case 0: state = 12; break;
default: state = 0; break;
}
case 'o': switch(state) { case 13: state = 14; break;
default: state = 0; break;
}
case 'u': switch(state) { case 15: state = 16; break;
default: state = 0; break;
}
case '\0': state = NOTHING; break;
}
switch(state) {
case NOTHING: return NULL; break;
case HI:
case ME:
case HOW:
case ARE:
case YOU:
return state;
break;
}
}
And this then reduces to:
#define NOTHING -1
#define HI 2
#define ME 4
#define HOW 7
#define ARE 11
#define YOU 16
char *start = buffer;
char *position;
int state = 0;
int token = NOTHING;
for(;;) {
switch(*position) {
case 'h': switch(state) { case 0: state = 1; break;
default: state = 0; break;
}
case 'i': switch(state) { case 1: state = 2; break;
default: state = 0; break;
}
case 'm': switch(state) { case 0: state = 3; break;
default: state = 0; break;
}
case 'e': switch(state) { case 3: state = 4; break;
case 10: state = 11; break;
default: state = 0; break;
}
case 'o': switch(state) { case 1: state = 6; break;
case 13: state = 14; break;
default: state = 0; break;
}
case 'w': switch(state) { case 6: state = 7; break;
default: state = 0; break;
}
case 'a': switch(state) { case 8: state = 9; break;
default: state = 0; break;
}
case 'r': switch(state) { case 9: state = 10; break;
default: state = 0; break;
}
case 'y': switch(state) { case 0: state = 12; break;
default: state = 0; break;
}
case 'u': switch(state) { case 15: state = 16; break;
default: state = 0; break;
}
case '\0': state = NOTHING; break;
}
switch(state) {
case NOTHING: return NULL; break;
case HI:
case ME:
case HOW:
case ARE:
case YOU:
return state;
break;
}
}