Linux программирование в примерах | страница 45



>88  #include "closeout.h"

>89

>90  /* Официальное имя этой программы (напр., нет префикса 'g'). */

>91  #define PROGRAM_NAME "env"

>92

>93  #define AUTHORS N_ ("Richard Mlynarik and David MacKenzie")

>94

>95  int putenv();

>96

>97  extern char **environ;

>98

>99  /* Имя, посредством которого эта программа была запущена. */

>100 char *program_name;

>101

>102 static struct option const longopts[] =

>103  {

>104  {"ignore-environment", no_argument, NULL, 'i'},

>105  {"unset", required_argument, NULL, 'u'},

>106  {GETOPT_HELP_OPTION_DECL},

>107  {GETOPT_VERSION_OPTION_DECL},

>108  {NULL, 0, NULL, 0}

>109 };

GNU Coreutils содержит большое число программ, многие из которых выполняют одни и те же общие задачи (например, анализ аргументов). Для облегчения сопровождения многие типичные идиомы были определены в виде макросов. Двумя таким макросами являются >GETOPT_HELP_OPTION_DECL и >GETOPT_VERSION_OPTION (строки 106 и 107). Вскоре мы рассмотрим их определения. Первая функция, >usage(), выводит информацию об использовании и завершает программу. Макрос >_("string") (строка 115, используется также по всей программе) также предназначен для локализации, пока также считайте его содержащим строковую константу.

>111 void

>112 usage(int status)

>113 {

>114  if (status '= 0)

>115   fprintf(stderr, _("Try '%s --help' for more information.\n"),

>116    program_name);

>117  else

>118  {

>119   printf (_("\

>120    Usage: %s [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]\n"),

>121    program_name);

>122   fputs (_("\

>123    Set each NAME to VALUE in the environment and run COMMAND. \n\

>124    \n\

>125    -i, --ignore-environment start with an empty environment\n\

>126    -u, --unset=NAME remove variable from the environment\n\

>127    "), stdout);

>128   fputs(HELP_OPTION_DESCRIPTION, stdout);

>129   fputs(VERSION_OPTION_DESCRIPTION, stdout);

>130   fputs(_("\

>131    \n\

>132    A mere - implies -i. If no COMMAND, print the resulting\

>133    environment.\n"), stdout);

>134   printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);

>135  }

>136  exit(status);

>137 }

Первая часть >main() объявляет переменные и настраивает локализацию. Функции >setlocale(), >bindtextdomain() и >textdomain() (строки 147–149) обсуждаются в главе 13 «Интернационализация и локализация». Отметим, что эта программа использует аргумент >main() envp (строка 140). Это единственная программа Coreutils, которая так делает. Наконец, вызов >atexit() в строке 151 (см. раздел 9.1.5.3. «Функции завершения») регистрирует библиотечную функцию Coreutils, которая очищает все выходные буферы и закрывает