Данный экран достаточно тщательно спроектирован, чтобы уместиться в 23 строки и 79 колонок, поэтому он помещается в терминальном окне 24x80.
Таблицу можно было бы создавать во время выполнения, т.е. на лету. Подгонка десятичных и шестнадцатеричных столбцов была бы достаточно простой. Однако существует достаточно необычных, делающих код крайне неудобным, случаев от перенесения строк таблицы в нужных местах до вывода таких неотображаемых символов, как NUL, вместо обычных символов. Более того, столбцы понадобилось бы неравномерно заполнять пробелами, чтобы заставить таблицу уместиться в 79 колонках. Но любой Unix-программист автоматически выражал бы таблицу как блок данных, прежде чем обнаружил бы данные проблемы.
Самым примитивным способом создания справочного экрана было бы помещение каждой строки в С-инициализатор в исходном коде ascii. с, а затем заставить код, проходящий через инициализатор, выписывать строки. Проблема такого метода заключается в том, что дополнительные данные в формате С-инициализатора (завершающие разделители строк, строковые кавычки, запятые) удлиняли бы строки более 79 символов. Это привело бы к переносу строк и усложнило бы преобразование внешнего вида кода к внешнему виду вывода, что, в свою очередь, усложнило бы редактирование справочного дисплея, который и без этого сложно было уместить в экран на 24x80 растровых ячеек.
Более сложный метод использования режима вставки строк в препроцессоре ANSI С приводит к другому варианту той же проблемы. По существу, любой способ явного включения в код справочного экрана задействовал бы пунктуацию в начале и конце строки, для которой не было места70. А копирование на экран таблицы из файла во время выполнения выглядело ненадежно. В конце концов, файл мог быть утерян.
Пример 9.5. Справка по использованию программы
Usage: ascii [-dxohv] [-t] [char-alias...]
-t = one-line output -d = Decimal table -o = octal table -x = hex table -h = This help screen -v = version information Prints all aliases of an ASCII character. Args may be chars, С \-escapes, English names, '"-escapes, ASCII mnemonics, or numerics in decimal/octal/hex.
Dec Hex Dec Hex Dec Hex Dec Hex Dec Hex Dec Hex Dec Hex Dec Hex
0 | 00 | NUL | 16 | 10 | DLE | 32 | 20 | 48 | 30 | 0 | 64 | 40 | ® | 80 | 50 | P | 96 | 60 | 112 | 70 | P | ||
1 | 01 | SOH | 17 | 11 | DC1 | 33 | 21 | I | 49 | 31 | 1 | 65 | 41 | A | 81 | 51 | Q | 97 | 61 | a | 113 | 71 | q |
2 | 02 | STX | 18 | 12 | DC2 | 34 | 22 | ii | 50 | 32 | 2 | 66 | 42 | В | 82 | 52 | R | 98 | 62 | b | 114 | 72 | r |
3 | 03 | ЕТХ | 19 | 13 | DC3 | 35 | 23 | # | 51 | 33 | 3 | 67 | 43 | С | 83 | 53 | S | 99 | 63 | с | 115 | 73 | s |
4 | 04 | EOT | 20 | 14 | DC4 | 36 | 24 | $ | 52 | 34 | 4 | 68 | 44 | D | 84 | 54 | T | 100 | 64 | d | 116 | 74 | t |
5 | 05 | ENQ | 21 | 15 | NAK | 37 | 25 | % | 53 | 35 | 5 | 69 | 45 | E | 85 | 55 | U | 101 | 65 | e | 117 | 75 | u |
6 | 06 | АСК | 22 | 16 | SYN | 38 | 26 | & | 54 | 36 | 6 | 70 | 46 | F | 86 | 56 | V | 102 | 66 | f | 118 | 76 | v |
7 | 07 | BEL | 23 | 17 | ETB | 39 | 27 | t | 55 | 37 | 7 | 71 | 47 | G | 87 | 57 | w | 103 | 67 | g | 119 | 77 | w |
8 | 08 | BS | 24 | 18 | CAN | 40 | 28 | ( | 56 | 38 | 8 | 72 | 48 | H | 88 | 58 | X | 104 | 68 | h | 120 | 78 | X |
9 | 09 | нт | 25 | 19 | EM | 41 | 29 | ) | 57 | 39 | 9 | 73 | 49 | I | 89 | 59 | Y | 105 | 69 | i | 121 | 79 | У |
10 | 0А | LF | 26 | 1А | SUB | 42 | 2A | * | 58 | ЗА | 74 | 4A | J | 90 | 5A | Z | 106 | 6A | j | 122 | 7A | z | |
11 | OB | VT | 27 | IB | ESC | 43 | 2B | + | 59 | 3B | ; | 75 | 4B | К | 91 | 5B | [ | 107 | 6B | k | 123 | 7B | |
12 | ОС | FF | 28 | 1С | FS | 44 | 2C | 60 | 3C | < | 76 | 4C | L | 92 | 5C | \ | 108 | 6C | 1 | 124 | 7C | ||
13 | 0D | CR | 29 | ID | GS | 45 | 2D | - | 61 | 3D | = | 77 | 4D | M | 93 | 5D | ] | 109 | 6D | ш | 125 | 7D | |
14 | 0Е | SO | 30 | IE | RS | 46 | 2E | 62 | 3E | > | 78 | 4E | N | 94 | 5E | A | 110 | 6E | n | 126 | 7E | - | |
15 | 0F | SI | 31 | IF | US | 47 | 2F | / | 63 | 3F | ? | 79 | 4F | О | 95 | 5F | 111 | 6F | о | 127 | 7F |
DEL
Данный пример почти тривиален, однако он, тем не менее, иллюстрирует преимущества генерации как простого, так и особого кода. Подобные методики могли бы применяться для более крупных программ, предоставляя, соответственно, еще большие преимущества.
9.2.2. Учебный пример: генерация HTML-кода для табличного списка
Предположим, что требуется поместить страницу табличных данных на Web-страницу. Необходимо, чтобы первые несколько строк выглядели, как в примере 9.6.
Пример 9.6. Необходимый формат вывода для таблицы звезд
Aalat David Weber The Armageddon Inheritance
Aelmos Alan Dean Foster The Man who Used the Universe
Aedryr Steve Miller/Sharon Lee Scout's Progress
Aergistal Gerard Klein The Overlords of War
Afdiar L. Neil Smith Tom Paine Maru