Значение NOGHTOF(c)
фактически определяется кодом, начинающимся со строки 81:
char _codes[26] = {
1, 16, 4, 16, 9, 2, 4, 16, 9, 2, 0, 2, 2, 2, 1, 4, 0, 2, 4, 4, 1, 0, 0, 0, 8, 0
/* a b c d e f g h i j k l m n o p q r s t u v w x y z */
};
#define ENCODE(c) (isalpha(c) ? _codes[((toupper(c)) - 'A')] : 0)
По существу, значение присваивается каждой букве алфавита в порядке (A = 1, B =16 и т. Д.) Затем макрос ENCODE
проверяет, является ли переданный символ буквой;если да, он возвращает соответствующий код для этой буквы, в противном случае он возвращает символ null
.(На самом деле он ничего не возвращает, так как это макрос и подставляется компилятором во время компиляции для замены фактического вызова.)
То, как я читаю код для 'G'
, таково(не пытаясь понять, почему):
If current letter is G then
If next letter is H then
Take "_code" value of a letter three letters back (why?) from the _codes table and check the fifth bit (from the back, naturally)
If this bit is not set OR if a letter four letters back (why?) is 'H' then
Add 'F' to the result
skip one more character (letter 'H' following the 'G')
Почему это так, что я не знаю, но я вполне уверен, что у кого-то была веская причина написать это так, но это кажется очевидной ошибкойя.