Выбрать главу

3   03  ETX 19  13  DC3 35  23 # 51  33  3 67  43  C 83  53  S 99  63  c 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  ACK 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 ' 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  HT  25  19  EM  41  29 ) 57  39  9 73  49  I 89  59  Y 105 69  i 121 79 у

10  0A  LF  26  1A  SUB 42  2A * 58  3A  : 74  4A  J 90  5A  Z 106 6A  j 122 7A z

11  0B  VT  27  1B  ESC 43  2B + 59  3B  ; 75  4B  K 91  5B  [ 107 6B  k 123 7B {

12  0С  FF  28  1С  FS  44  2C , 60  3C  < 76  4C  L 92  5C  \ 108 6C  l 124 7C |

13  0D  CR  29  1D  GS  45  2D - 61  3D  = 77  4D  M 93  5D  ] 109 6D  m 125 7D }

14  0E  SO  30  1E  RS  46  2E . 62  3E  > 78  4E  N 94  5E  ^ 110 6E  n 126 7E ~

15  0F  SI  31  1F  US  47  2F / 63  3F  ? 79  4F  О 95  5F  _ 111 6F  о 127 7F del

Данная проблема решается следующим образом. В состав исходного дистрибутива входит файл с именем splashscreen, в котором содержится такой же экран использования, как в приведенном примере. Исходный код на С содержит следующую функцию.

void showHelp(FILE *out, char *progname) {

 fprintf(out,"Usage: %s [-dxohv] [-t] [char-alias...]\n", progname);

#include "splashscreen.h"

 exit(0);

}

Файл splashscreen.h генерируется инструкцией make-файла.

splashscreen.h: splashscreen

 sed <splashscreen >splashscreen.h \

  -e 's/\\/\\\\/g' -e 's/"/\\"/' -e 's/.*/puts("&");/'

Поэтому при сборке программы файл splashscreen автоматически преобразовывается в серию вызовов функции вывода, которые C-препроцессор затем включает в необходимую функцию.

Путем создания кода из данных поддерживается редактируемая версия справочного экрана, идентичного его представлению на дисплее. В результате этого повышается прозрачность. Более того, при желании можно модифицировать справочный экран, не затрагивая C-кода вообще, а верное внешнее представление будет автоматически получено при следующей сборке.

По тем же причинам инициализатор, содержащий строки синонимичных названий, также генерируется посредством sed-сценария в make-файле из файла с именем nametable, входящего в состав исходного дистрибутива ascii. Большая часть файла nametable просто копируется в С-инициализатор. Но процесс генерации упростил бы адаптацию данного средства для других 8-битовых наборов символов, таких как ISO-8859 (Latin-1 и подобные).

Данный пример почти тривиален, однако он, тем не менее, иллюстрирует преимущества генерации как простого, так и особого кода. Подобные методики могли бы применяться для более крупных программ, предоставляя, соответственно, еще большие преимущества.

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

Agandar     Donald Kingsbury        Psychohistorical Crisis

Aghirnamirr Jo Clayton              Shadowkill

Примитивнейший способ решения данной задачи заключался бы в написании вручную HTML-кода для необходимого внешнего представления. Таким образом, каждый раз, когда потребуется добавить новое имя, придется вручную писать еще один набор тегов <tr> и <td> для новой записи. Такая необходимость очень быстро стала бы утомительной. Но еще хуже то, что при изменении формата списка каждую запись потребуется кодировать вручную.

Внешне разумный способ решить данную проблему заключался бы в том, чтобы внести данные в трехстолбцовую таблицу в базе данных, а затем использовать некоторую причудливую CGI-методику[95] или поддерживающий базы данных шаблонный процессор, например, PHP для создания страницы на лету. Однако, предположим, разработчику известно, что список не будет изменяться очень часто, и не требуется запускать сервер баз данных для того, чтобы отображать данные, а также нежелательно загружать сервер излишним CGI-трафиком.

Существует простое решение: поместить данные в файл в простом табличном формате, см. пример 9.7.

Пример 9.7. Модель таблицы звезд

Aalat       :David Weber             :The Armageddon Inheritance

вернуться

95

Здесь CGI означает не Computer Graphic Imagery, а технологию Common Gateway Interface (интерфейс общего шлюза), которая применяется для создания интерактивных Web-документов.