Программирование для Linux. Профессиональный подход | страница 19



.

Листинг 2.2. (getopt_long.c) Использование функции >getopt_long()

>#include

>#include

>#include


>/* Имя программы. */

>const char* program_name;


>/* Вывод информации об использовании программы в поток STREAM

>   (обычно stdout или stderr) и завершение работы с выдачей кода

>   EXIT_CODE. Возврат в функцию main() не происходит */

>void print_usage(FILE* stream, int exit_code) {

> fprintf(stream, "Usage: %s options [ inputfile ... ]\n",

>  program_name);

> fprintf(stream,

>  " -h --help    Display this usage

>                 information.\n"

>  " -о --output  filename Write output to file.\n"

>  " -v --verbose Print verbose messages.\n");

> exit(exit_code);

>}


>/* Точка входа в основную программу, параметр ARGC содержит размер

>   списка аргументов; параметр ARGV -- это массив указателей

>   на аргументы. */

>int main(int argc, char* argv[]) (

> int next_option;


> /* Строка с описанием возможных коротких опций. */

> const char* const short_options = "ho:v";

> /* Массив с описанием возможных длинных опций. */

> const struct option long_options[] = {

>  { "help",    0, NULL, 'h' },

>  { "output",  1, NULL, 'o' },

>  { "verbose", 0, NULL, 'v' },

>  { NULL,      0, NULL, 0 } /* Требуется в конце массива. */

> };


> /* Имя файла, в который записываются результаты работы

>    программы, или NULL, если вывод направляется в поток

>    stdout. */

> const char* output_filename = NULL;

> /* Следует ли выводить развернутые сообщения. */

> int verbose = 0;


> /* Запоминаем имя программы, которое будет включаться

>    в сообщения. Оно хранится в элементе argv[0] */

> program_name = argv[0];


> do {

>  next_option =

>   getopt_long(argc, argv, short_options,

>    long_options, NULL);

>  switch(next_opt ion) {

>  case "h": /* -h или --help */

>   /* Пользователь запросил информацию об использовании

>      программы, нужно вывести ее в поток stdout и завершить

>      работу с выдачей кода 0 (нормальное завершение). */

>   print_usage(stdout, 0);

>  case 'o': /* -о или --output */

>   /* Эта опция принимает аргумент -- имя выходного файла. */

>      output_filename = optarg;

>   break;

>  case 'v': /* -v или --verbose */

>   verbose = 1;

>   break;

>  case '?': /* Пользователь ввел неверную опцию. */

>   /* Записываем информацию об использовании программы в поток

>      stderr и завершаем работу с выдачей кода 1

>      (аварийное завершение). */

>   print_usage(stderr, 1);

>  case -1: /* Опций больше нет. */

>   break;

>  default: /* Какой-то непредвиденный результат. */

>   abort();