Я пишу функции, которые принимают контрольную сумму двух разных вещей: во-первых, файла; и два, архивная запись а-ля библиотечной библиотеки BSD. Я позаимствовал код контрольной суммы из coreutils GNU.
Мой код для выполнения контрольной суммы файла читается из его источника следующим образом:
unsigned char buf[BUFLEN];
size_t bytes_read;
FILE *fp;
...
while ((bytes_read = fread (buf, 1, BUFLEN, fp)) > 0) { ... }
В моем коде для чтения из архивной записи соответствующий код выглядит так
struct archive *ar;
unsigned char buf[BUFLEN];
ssize_t bytes_read;
...
while ((bytes_read = archive_read_data(ar, buf, sizeof(buf))) > 0) { ... }
В нынешнем виде у меня должны быть две разные функции, хотя большая часть кода одинакова. Я не совсем понимаю, как это сделать, передав указатель на функцию, поскольку fread и archive_read_data даже не имеют одинакового количества аргументов. (Думаю, я мог бы начать с чтения (2) вместо fread (3), но я не уверен, что это продуктивный способ продолжить.)
Есть ли хороший способ избежать дублирования кода здесь? Помимо попытки сделать это с помощью указателей на функции, я мог бы сделать это, поместив идентичные фрагменты кода в отдельные файлы, а затем #including
' их, но это выглядит уродливо.
В этом конкретном примере код для функций не такой длинный, так что простое дублирование кода не так уж и сложно. Мне просто интересно, существует ли элегантное решение.