Книга: Искусство программирования для Unix

Пример 9.5. Справка по использованию программы ascii

Пример 9.5. Справка по использованию программы ascii

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, C -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 ! 49  31  1 65  41  A 81  51  Q 97  61  a 113 71 q
2   02  STX 18  12  DC2 34  22 " 50  32  2 66  42  B 82  52  R 98  62  b 114 72 r
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 и подобные).

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

Оглавление книги


Генерация: 1.143. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз