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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 127 128 129 130 131 132 133 134 135 ... 324

11. Сначала вы должны проверить, существует ли уже дорожка с текущим номером дорожки. В зависимости от результатов проверки меняется строка приглашения:

  memset(&new_track, '', sizeof(new_track));

  existing_track = get_cdt_entry(entry_to_add_to->catalog,

   track_no);

  if (existing_track.catalog[0]) {

   printf("tTrack %d: %sn", track_no,

    existing_track.track_txt);

   printf("tNew text: ");

  } else {

   printf("tTrack %d description: ", track_no);

  }

  fgets(tmp_str, TMP_STRING_LEN, stdin);

  strip_return(tmp_str);

12. Если для данной дорожки не существует элемент и пользователь его не добавил, предположите, что больше нет дорожек, которые надо добавить:

  if (strlen(tmp_str) == 0) {

   if (existing_track.catalog[0] == '') {

    /* Нет в наличии элемента, поэтому вставка завершается */

    break;

   } else {

    /* Оставляем существующий элемент,

       переходам к следующей дорожке */

    track_no++;

    continue;

   }

  }

13. Если пользователь введет единичный символ d, это приведет к удалению текущей дорожки и дорожек с большими номерами. Функция del_cdt_entry вернет false, если не сможет найти дорожку, которую следует удалить:

  if ((strlen(tmp_str) == 1) && tmp_str[0] == 'd') { /* Удаляет эту и оставшиеся дорожки */

   while (del_cdt_entry(entry_to_add_to->catalog, track_no)) {

    track_no++;

   }

   break;

  }

14. В этом пункте приводится код для вставки новой дорожки или обновления существующей. Вы формируете элемент cdt_entry структуры new_track и затем вызываете функцию базы данных add_cdt_entry для того, чтобы включить его в базу данных:

  strncpy(new_track. track_txt, tmp_str, TRACK_TTEXT_LEN - 1);

  strcpy(new_track.catalog, entry_to_add_to->catalog);

  new_track.track_no = track_no;

  if (!add_cdt_entry(new_track)) {

   fprintf(stderr, "Failed to add new trackn");

   break;

  }

  track_no++;

 } /* while */

}

15. Функция del_cat_entry удаляет элемент каталога. Никогда не разрешайте хранить дорожки для несуществующего элемента каталога.

static void del_cat_entry(const cdc_entry *entry_to_delete) {

 int track_no = 1;

 int delete_ok;

 display_cdc(entry_to_delete);

 if (get_confirm("Delete this entry and all it's tracks? ")) {

  do {

   delete_ok = del_cdt_entry(entry_to_delete->catalog, track_no);

   track_no++;

  } while(delete_ok);

  if (!del_cdc_entry(entry_to_delete->catalog)) {

   fprintf(stderr, "Failed to delete entryn");

  }

 }

}

16. Следующая функция — утилита для удаления всех дорожек элемента каталога:

static void del_track_entries(const cdc_entry *entry_to_delete) {

 int track_no = 1;

 int delete_ok;

 display_cdc(entry_to_delete);

 if (get_confirm("Delete tracks for this entry? ")) {

  do {

   delete_ok = del_cdt_entry(entry_to_delete->catalog, track_no);

   track_no++;

  } while(delete_ok);

 }

}

17. Создайте очень простое средство поиска, в котором разрешите пользователю ввести строку и затем поищите элементы каталога, содержащие строку. Поскольку может быть несколько элементов с такой строкой, просто по очереди предлагаются пользователю все найденные:

static cdc_entry find_cat(void) {

 cdc_entry item_found;

 char tmp_str[TMP_STRING_LEN + 1];

 int first_call = 1;

 int any_entry_found = 0;

 int string ok;

 int entry_selected = 0;

 do {

  string_ok = 1;

  printf("Enter string to search for in catalog entry: ");

  fgets(tmp_str, TMP_STRING_LEN, stdin);

  strip_return(tmp_str);

  if (strlen(tmp_str) > CAT_CAT_LEN) {

   fprintf(stderr, "Sorry, string too long, maximum %d

    charactersn", CAT_CAT_LEN);

   string_ok = 0;

  }

 } while (!string_ok);

 while (!entry_selected) {

1 ... 127 128 129 130 131 132 133 134 135 ... 324
На этом сайте Вы можете читать книги онлайн бесплатно русская версия Основы программирования в Linux - Мэтью Нейл.

Оставить комментарий