: $, ( au-) here swap dup allot move ;
: & ( -) parse-name dup c, $, ;
: ref, ( au-) over , 0 do count + loop ;
Create keywords & do & if & for & int & auto & case
& char & else & enum & goto & long & void & break
& const & float & short & union & while & double
& extern & return & signed & sizeof & static & struct
& switch & default & typedef & continue & register
& unsigned & volatile 0 c,
Create by-length keywords 2 ref, 2 ref,
8 ref, 6 ref, 8 ref, 2 ref, 3 ref, ,
: keyword
? ( au
-f
) dup
10 2 within IF 2drop
0 exit THEN
dup 2 - cells by-length + @ >r BEGIN ( au)
2dup r> count 2dup + >r dup ( not-at-end? ) WHILE
compare 0= UNTIL -1 ELSE 0 THEN nip nip r> drop ;
cr s" extern" 2dup keyword? . type
cr s" externa" 2dup keyword? . type
OiAkLCAoIGF1LSkgaGVyZSBzd2FwIGR1cCBhbGxvdCBtb3ZlIDsKOiAmICggLSkgcGFyc2UtbmFtZSBkdXAgYywgJCwgOwo6IHJlZiwgKCBhdS0pIG92ZXIgLCAwIGRvIGNvdW50ICsgbG9vcCA7CgpDcmVhdGUga2V5d29yZHMgICYgZG8gJiBpZiAmIGZvciAmIGludCAmIGF1dG8gJiBjYXNlIAomIGNoYXIgJiBlbHNlICYgZW51bSAmIGdvdG8gJiBsb25nICYgdm9pZCAmIGJyZWFrIAomIGNvbnN0ICYgZmxvYXQgJiBzaG9ydCAmIHVuaW9uICYgd2hpbGUgJiBkb3VibGUgCiYgZXh0ZXJuICYgcmV0dXJuICYgc2lnbmVkICYgc2l6ZW9mICYgc3RhdGljICYgc3RydWN0IAomIHN3aXRjaCAmIGRlZmF1bHQgJiB0eXBlZGVmICYgY29udGludWUgJiByZWdpc3RlciAKJiB1bnNpZ25lZCAmIHZvbGF0aWxlICAwIGMsIAoKQ3JlYXRlIGJ5LWxlbmd0aCAga2V5d29yZHMgMiByZWYsIDIgcmVmLCAKOCByZWYsIDYgcmVmLCA4IHJlZiwgMiByZWYsIDMgcmVmLCAsCgo6IGtleXdvcmQ/ICggYXUtZikgZHVwIDEwIDIgd2l0aGluIElGIDJkcm9wIDAgZXhpdCBUSEVOIAogIGR1cCAyIC0gY2VsbHMgYnktbGVuZ3RoICsgQCA+ciBCRUdJTiAoIGF1KQogIDJkdXAgcj4gY291bnQgMmR1cCArID5yIGR1cCAoIG5vdC1hdC1lbmQ/ICkgV0hJTEUgCiAgY29tcGFyZSAwPSBVTlRJTCAtMSBFTFNFIDAgVEhFTiAgbmlwIG5pcCByPiBkcm9wIDsKICAKY3IgcyIgZXh0ZXJuIiAyZHVwIGtleXdvcmQ/IC4gdHlwZQpjciBzIiBleHRlcm5hIiAyZHVwIGtleXdvcmQ/IC4gdHlwZQo=