Блок задач

5. Проекты

Темы
Сложность 6

Проект «Обработка ключей и аргументов командной строки»

Реализовать библиотеку обработки аргументов, передаваемых программе с помощью командной строки.

Ключи командной строки

Ключи позволяют управлять режимами работы программы и заменяют получение параметров с помощью стандартного ввода (scanf()).

  1. Существуют длинная и короткая форма записи ключей.

    ls -h — короткая форма.

    ls --human-readable — длинная форма для того же ключа.

    ls -ah — короткая форма для двух ключей, аналог ls -a -h.

  2. Ключи имеют разный тип.

* Ключи-флаги. Могут использоваться один раз в командной строке и означают выбор (включение) некоторого режима работы. Например, ключ -h (--human-readable) у программы ls (см. выше) показывает все размеры файлов в понятном для человека виде (52M, 100G и т.д.).

* Ключи со значениями. Позволяют передать в программу некоторое значение. Например, ls -w 100 (аналог с длинной формой ключа: ls --width=100) указывает, что программа ls должна форматировать свой вывод на ширину 100 символов.

При этом значение может иметь разный тип (число, строка).

  1. Один и тот же ключ может повторяться несколько раз (имеет смысл только для некоторых ключей!). Например: gcc -I /usr/include -I . file.c означает добавление двух include-каталогов при компиляции.
Требования к библиотеке
  1. Задание ключей (однобуквенное имя, длинное имя, тип ключа, значение по умолчанию, обязательность присутствия ключа, описание ключа) в виде статического массива структур.
  2. Главная функция библиотеки получает из main указатели на argc и argv, в процессе работы изменяя их. После вызова функции argv[1] будет указывать на первый не-ключевой аргумент командной строки (пример: ls -a -l dir — после вызова argc должно стать равным 2, а argv[1] — указывать на аргумент "dir".
  3. Если появился неизвестный ключ или не встретился обязательный ключ, функция должна печатать помощь — список ключей с их описанием.
  4. Специальный ключ -- означает, что ключи на этом месте кончаются. Это нужно для случаев, когда аргументом ком. строки является имя файла, начинающееся с дефиса.
  5. Значение ключа (или 0/1 для ключа-флага) должно записываться прямо в соответствующую структуру описания. В случае повторяющихся ключей потребуется создать список (вставлять в хвост, чтобы не исказился порядок).
  6. Дополнительная функция — очистка памяти, которая будет вызываться в конце программы. Она должна освободить созданные списки.