Основы программирования в Linux
Шрифт:
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 track\n");
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 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) {
item_found = search_cdc_entry(tmp_str, &firstcall);
if (item_found.catalog[0] != '\0') {
any_entry_found = 1;
printf("\n");
display_cdc(&item_found);
if (get_confirm("This entry? ")) {
entry_selected = 1;
}
} else {
if (any_entry_found) printf("Sorry, no more matches found\n");
else printf("Sorry, nothing found\n");
break;
}
}
return(item_found);
}
18. Функция
list_tracks
—
утилита, которая выводит все дорожки для заданного элемента каталога:
static void list_tracks(const cdc_entry *entry_to_use) {
int track_no = 1;
cdt_entry entry_found;
display_cdc(entry_to_use);
printf("\nTracks\n");
do {
entry_found = get_cdt_entry(entry_to_use->catalog, track_no);
if (entry_found.catalog[0]) {
display_cdt(&entry_found);
track_no++;
}
} while(entry_found.catalog[0]);
(void)get_confirm("Press return");
} /* list_tracks */
19. Функция
count_all_entries
подсчитывает все дорожки:
static void count_all_entries(void) {
int cd_entries_found = 0;
int track_entries_found = 0;
Поделиться с друзьями: