Книга: Программирование для Linux. Профессиональный подход

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

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

#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
/* Имя программы. */
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();
  }
 }
 while (next_option != -1);
 /* Обработка опций завершена, переменная OPTIND указывает на
    первый аргумент, не являющийся опцией. В демонстрационных
    целях отображаем эти аргументы, если задан режим VERBOSE. */
 if (verbose) {
  int i;
  for (i = optind; i < argc; ++i)
   printf("Argument: %sn", argv[i]);
 }
 /* Далее идет основное тело программы... */
 return 0;
}

Может показаться, что использование функции getopt_long() приводит к написанию громоздкого кода, но, поверьте, самостоятельный синтаксический анализ опций командной строки — гораздо более трудоемкая задача. Функция getopt_long() достаточно универсальна и гибка в работе с опциями, но лучше не заниматься сложными вещами. Старайтесь придерживаться традиционной структуры задания опций.

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


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