Kniga-Online.club
» » » » Основы программирования в Linux - Мэтью Нейл

Основы программирования в Linux - Мэтью Нейл

Читать бесплатно Основы программирования в Linux - Мэтью Нейл. Жанр: Интернет год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:

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, которое должно равняться 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, '', 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)

Перейти на страницу:

Мэтью Нейл читать все книги автора по порядку

Мэтью Нейл - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


Основы программирования в Linux отзывы

Отзывы читателей о книге Основы программирования в Linux, автор: Мэтью Нейл. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор kniga-online.


Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*