Основы программирования в Linux
11. Сначала вы должны проверить, существует ли уже дорожка с текущим номером дорожки. В зависимости от результатов проверки меняется строка приглашения:
memset(&new_track, '\0', sizeof(new_track));existing_track = get_cdt_entry(entry_to_add_to->catalog,track_no);if (existing_track.catalog[0]) {printf("\tTrack %d: %s\n", 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] == '\0') {/* Нет в наличии элемента, поэтому вставка завершается */break;} else {/* Оставляем существующий элемент,переходам к следующей дорожке */track_no++;continue;}}13. Если пользователь введет единичный символ
, это приведет к удалению текущей дорожки и дорожек с большими номерами. Функцияdвернетdel_cdt_entry, если не сможет найти дорожку, которую следует удалить:falseif ((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_entrystrncpy(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 track\n");break;}track_no++;} /* while */}15. Функция
удаляет элемент каталога. Никогда не разрешайте хранить дорожки для несуществующего элемента каталога.del_cat_entrystatic 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 entry\n");}}}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 \characters\n", CAT_CAT_LEN);string_ok = 0;}} while (!string_ok);while (!entry_selected) {