Программы GNU большие и сложные. Размер GNU Hello World показывает, что даже для самого простого проекта GNU требуется много кода и конфигурации вокруг него.
Автоинструменты трудны для понимания новичку, но вам не нужно понимать их, чтобы прочитать код. Даже если вы измените код, большую часть времени вы можете просто запустить make для компиляции ваших изменений.
Чтобы читать код, вам нужен хороший редактор (VIM, Emacs) или IDE (Eclipse) и некоторые инструменты для навигации по источнику. Проект tar содержит каталог src, с которого можно начать. Программа всегда запускается с основной функцией, так что
grep main *.c
или используйте вашу IDE для поиска этой функции. Это в tar.c. Теперь пропустите все вещи инициализации, до
/* Main command execution. */
Там вы видите переключатель для подкоманд. Если вы передаете -x, он делает это, если вы передаете -c, он делает это и т. Д. Это структура ветвления для этих команд. Если вы хотите узнать, что это за макрос, запустите
grep EXTRACT_SUBCOMMAND *.h
там вы можете видеть, что они перечислены в common.h.
Ниже EXTRACT_SUBCOMMAND вы видите что-то смешное:
read_and (extract_archive);
Определение read_and () (снова получено с помощью grep):
read_and (void (*do_something) (void))
Единственный параметр - это указатель на функцию , такой как обратный вызов, поэтому read_and предположительно что-то прочитает и затем вызовет функцию extract_archive
. Снова, grep на это, и вы увидите это:
if (prepare_to_extract (current_stat_info.file_name, typeflag, &fun))
{
if (fun && (*fun) (current_stat_info.file_name, typeflag)
&& backup_option)
undo_last_backup ();
}
else
skip_member ();
Обратите внимание, что настоящая работа происходит при вызове fun
. fun
снова указатель на функцию, который устанавливается в prepare_to_extract. fun
может указывать на extract_file
, что делает фактическое написание.
Надеюсь, я много рассказал вам об этом и показал, как я перемещаюсь по исходному коду. Не стесняйтесь обращаться ко мне, если у вас есть вопросы.