Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
int del_cdt_entry(const char *cd_catalog_ptr, const int track_no) {
char key_to_del[CAT_CAT_LEN + 10];
datum local_key_datum;
int result;
if (!cdc_dbm_ptr || !cdt_dbm_ptr) return (0);
if (strlen(cd_catalog_ptr) >= CAT_CAT_LEN) return (0);
memset(&key_to_del, ' ', sizeof(key_to_del));
sprintf(key_to_del, "%s %d", cd_catalog_ptr, track_no);
local_key_datum.dptr = (void*)key_to_del;
local_key_datum.dsize = sizeof(key_to_del);
result = dbm_delete(cdt_dbm_ptr, local_key_datum);
/* dbm_delete() применяет 0 в случае успешного завершения */
if (result == 0) return (1);
return (0);
}
13. И последнее, но не по значимости, у вас есть простая функция поиска. Она не очень замысловата, но, тем не менее, показывает, как просматривать элементы dbm, если ключи заранее неизвестны.
Поскольку вы не знаете наперед, сколько будет элементов, вы создаете такую функцию, которая будет возвращать один элемент после каждого вызова. Если ничего не найдено, элемент будет пустым. Для просмотра всей базы данных начните с вызова этой функции с указателем на целое число
*first_call_ptr
Когда вы хотите перезапустить поиск, возможно, указав другой элемент каталога, вы должны снова вызвать эту функцию с параметром
*first_call_ptr
true
Между вызовами функция хранит некоторую внутреннюю информацию о состоянии. Это скрывает от клиента сложность продолжения поиска и защищает секреты реализации функции поиска.
Если искомый текст указывает на символ
null
cdc_entry search_cdc_entry(const char *cd_catalog_ptr,
int *first_call_ptr) {
static int local_first_call = 1;
cdc_entry entry_to_return;
datum local_data_datum;
static datum local_key_datum; /* обратите внимание,
должна быть static */
memset(&entry_to_return, ' ', sizeof(entry_to_return));
14. Как всегда, начните с имеющих смысл проверок:
if (!cdc_dbm_ptr || !cdt_dbm_ptr) return (entry_to_return);
if (!cd_catalog_ptr || !first_call_ptr) return (entry_to_return);
if (strlen(cd_catalog_ptr) >= CAT_CAT_LEN) return (entry_to_return);
/* Защита от пропуска вызова с *first_call_ptr, равным true */
if (local_first_call) {
local_first_call = 0;
*first_call_ptr = 1;
}
15. Если эта функция была вызвана с параметром
*first_call_ptr
true
*first_call_ptr
true
if (*first_call_ptr) {
*first_call_ptr = 0;
local_key_datum = dbm_firstkey(cdc_dbm_ptr);
} else {
local_key_datum = dbm_nextkey(cdc_dbm_ptr);
}
do {
if (local_key_datum.dptr != NULL) {
/* Элемент был найден */
local_data_datum = dbm_fetch(cdc_dhm_ptr, local_key_datum);
if (local_data_datum.dptr) {
memcpy(&entry_to_return, (char*)local_data_datum.dptr, local_data_datum, dsize);
16. Функция поиска включает очень простую проверку, позволяющую увидеть, входит ли строка поиска в текущий элемент каталога.
/* Проверяет, входит ли строка в текущий элемент */
if (!strstr(entry_to_return.catalog, cd_catalog_ptr)) {
memset(&entry_to_return, ' ', sizeof(entry_to_return));
local_key_datum = dbm_nextkey(cdc_dbm_ptr);
}
}
}
} while (local_key_datum.dptr && local_data_datum.dptr &&
(entry_to_return.catalog[0] == ' '));
return (entry_to_return);
} /* search_cdc_entry */
Теперь вы готовы собрать все вместе с помощью следующего make-файла или файла сборки. Не слишком углубляйтесь в него сейчас, поскольку мы обсудим его работу в следующей главе. В данный момент просто наберите его и сохраните как Makefile.
all: application
INCLUDE=/usr/include/gdbm LIBS=gdbm
# В некоторых дистрибутивах вам, возможно, придется изменить предыдущую
# строку, чтобы включить библиотеку совместимости, как показано далее
# LIBS= -lgdbm_compat -lgdbm
CFIAGS=
app_ui.о: app_ui.с cd_data.h
gcc $(CFLAGS) -c app_ui.c
access.о: access.с cd_data.h
gcc $(CFLAGS) -I$(INCLUDE) -c access.с
application: app_ui.o access.о
gcc $(CFLAGS) -o application app_ui.o access.о -l$(LIBS)