Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

 if (result == 0) return (1);

 return (0);

}

10. Функция

add_cdt_entry
добавляет новый элемент-дорожку. Ключ доступа — это комбинация строки из каталога и номера дорожки:

int add_cdt_entry(const cdt_entry entry_to_add) {

 char key_to_add[CAT_CAT_LEN + 10];

 datum local_data_datum;

 datum local_key_datum;

 int result;

 if (!cdc_dbm_ptr || !cdt_dbm_ptr) return (0);

 if (strlen(entry_to_add.catalog) >= CAT_CAT_LEN) return (0);

 memset(&key_to_add, '\0 ', sizeof(key_to_add));

 sprintf(key_to_add, "%s %d", entry_to_add.catalog, entry_to_add.track_no);

 local_key_datum.dptr = (void*)key_to_add;

 local_key_datum.dsize = sizeof(key_to_add);

 local_data_daturn.dptr = (void*)&entry_to_add;

 local_data_datum.dsize = sizeof(entry_to_add);

 result = dbm_store(cdt_dbm_ptr, local_key_datum, local_data_datum, DBM_REPLACE);

 /* dbm_store применяет 0 в случае успешного завершения

и отрицательные числа для обозначения ошибок */

 if (result == 0) return (1);

 return (0);

}

11. Если вы можете вставлять строки, было бы лучше, если вы могли бы и удалять их. Следующая функция удаляет элементы каталога;

int del_cdc_entry(const char *cd_catalog_ptr) {

 char key_to_del[CAT_CAT_LEN +1];

 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, '\0', sizeof(key_to_del));

 strcpy(key_to_del, cd_catalog_ptr);

 local_key_datum.dptr = (void*)key_to_del;

 local_key_datum.dsize = sizeof(key_to_del);

 result = dbm_delete(cdc_dbm_ptr, local_key_datum);

 /* dbm_delete применяет 0 в случае успешного завершения */

 if (result == 0) return (1);

 return (0);

}

12. Далее приведена аналогичная функция для удаления дорожки. Помните о том, что ключ дорожки — это сложный индекс, состоящий из строки, принадлежащей элементу каталога, и номера дорожки:

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, '\0', 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
, которое должно равняться 1 при первом вызове функции. Благодаря этому функция знает, что должна начать поиск с начала базы данных. В последующих вызовах переменная равна 0 и функция возобновляет поиск следом за последним найденным элементом.

Когда вы хотите перезапустить поиск, возможно, указав другой элемент каталога, вы должны снова вызвать эту функцию с параметром

*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, '\0', sizeof(entry_to_return));

Поделиться:
Популярные книги

Вожделеющее семя

Берджесс Энтони
Проза:
современная проза
6.43
рейтинг книги
Вожделеющее семя

UNIX: взаимодействие процессов

Стивенс Уильям Ричард
Компьютеры и Интернет:
программирование
5.00
рейтинг книги
UNIX: взаимодействие процессов

Лекарь Империи 5

Карелин Сергей Витальевич
5. Лекарь Империи
Фантастика:
городское фэнтези
аниме
героическая фантастика
попаданцы
5.00
рейтинг книги
Лекарь Империи 5

Преисподняя

Лонг Джефф
54. Книга-загадка, книга-бестселлер
Фантастика:
научная фантастика
8.29
рейтинг книги
Преисподняя

Хроника семьи Паскье. Гаврский нотариус. Наставники. Битва с тенями

Дюамель Жорж
Проза:
классическая проза
семейный роман
5.00
рейтинг книги
Хроника семьи Паскье. Гаврский нотариус. Наставники. Битва с тенями

Локки 5. Потомок бога

Решетов Евгений Валерьевич
5. Локки
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Локки 5. Потомок бога

Том 2. Рассказы 1889-1903

Короленко Владимир Галактионович
2. Собрание сочинений в пяти томах
Проза:
русская классическая проза
5.00
рейтинг книги
Том 2. Рассказы 1889-1903

Одна – здесь – жизнь

Цветаева Марина Ивановна
Проза:
русская классическая проза
5.00
рейтинг книги
Одна – здесь – жизнь

Безмолвная

Герритсен Тесс
9. Джейн Риццоли и Маура Айлс
Детективы:
триллеры
8.81
рейтинг книги
Безмолвная

Дюна

Андерсон Кевин Джей
1. Хроники Дюны
Фантастика:
эпическая фантастика
9.43
рейтинг книги
Дюна

Возлюби болезнь свою

Синельников Валерий Владимирович
Научно-образовательная:
психология
7.71
рейтинг книги
Возлюби болезнь свою

Звезды над Самаркандом

Бородин Сергей Петрович
Проза:
историческая проза
7.50
рейтинг книги
Звезды над Самаркандом

Козел отпущения

дю Морье Дафна
Проза:
современная проза
8.83
рейтинг книги
Козел отпущения

Царица амазонок

Фортье Энн
The Big Book
Проза:
современная проза
8.33
рейтинг книги
Царица амазонок