/* @BAKE
    flex -o $*.c $@
    cc -o eof $*.c -ggdb -lfl
   @STOP
*/
ALPHABETIC  [a-zA-Z]
WS          [^a-zA-Z!]

%option

%%

{ALPHABETIC}+   {
    ECHO;
    return 1;
}
{WS}+   {
    ECHO;
    return 2;
}

"!"         {
    char buf[80];
    for (int idx=0; (buf[idx] = input()); idx++) /* empty */ ;
    printf("buf=<%s>\n", buf);
    // YY_FLUSH_BUFFER; /* makes no difference */
    return 3;
    ECHO;
    char c;
    while (c = input()) {
        printf("'%c'\n", c);
    }
    return 3;
}

%%
int main(int argc, const char * const * const argv)
{
    /*
    switch (argc) {
      case 1: break;
      case 2:
        yy_scan_string(argv[1]);
        break;
      default:
        fprintf(stderr, "Usage: %s [string]\n", argv[0]);
        exit(1);
    }
    */

    const char * test = "one two !three four";
    yy_scan_string(argv[1]);


    int token;
    while ((token = yylex()) != 0) {
        printf("-> %d\n", token);
        fflush(stdout);
    }
}