(void)fgets(tmp_str, TMP_STRING_LEN, stdin);
strip_return(tmp_str);
strncpy(new_entry.type, tmp_str, CAT_TYPE_LEN - 1);
printf("Enter artist: ");
(void)fgets(tmp_str, TMP_STRING_LEN, stdin);
strip_return(tmp_str);
strncpy(new_entry.artist, tmp_str, CAT_ARTIST_LEN - 1);
printf("\nNew catalog entry entry is :-\n");
display_cdc(&new_entry);
if (get_confirm("Add this entry ? ")) {
memcpy(entry_to_update, &new_entry, sizeof(new_entry));
return(1);
}
return(0);
}
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΎ, ΡΡΠΎ Π²Ρ Π½Π΅ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ gets, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π΅Ρ ΡΠΏΠΎΡΠΎΠ±Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π±ΡΡΠ΅ΡΠ°. ΠΡΠ΅Π³Π΄Π° ΠΈΠ·Π±Π΅Π³Π°ΠΉΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ gets!
10. Π’Π΅ΠΏΠ΅ΡΡ Π²Ρ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡΠ΅ ΠΊ ΡΡΠ½ΠΊΡΠΈΠΈ enter_new_track_entries Π΄Π»Ρ Π²Π²ΠΎΠ΄Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ Π΄ΠΎΡΠΎΠΆΠΊΠ΅. ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ»ΠΎΠΆΠ½Π΅Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π²Π²ΠΎΠ΄Π° ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²Ρ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅ΡΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅ΠΌΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ-Π΄ΠΎΡΠΎΠΆΠΊΠ΅ ΠΎΡΡΠ°Π²Π°ΡΡΡΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΡΠΌ:
static void enter_new_track_entries(const cdc_entry *entry_to_add_to) {
cdt_entry new_track, existing_track;
char tmp_str[TMP_STRING_LEN + 1];
int track_no = 1;
if (entry_to_add_to->catalog[0] == '\0') return;
printf("\nUpdating tracks for %s\n", entry_to_add_to->catalog);
printf("Press return to leave existing description unchanged, \n");
printf(" a single d to delete this and remaining tracks, \n");
printf(" or new track description\n");
while(1) {
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 Π²Π΅ΡΠ½Π΅Ρ 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;
cdc_entry cdc_found;
cdt_entry cdt_found;
int track_no = 1;
int first_time = 1;
char *search_string = "";
do {
cdc_found = search_cdc_entry(search_string, &first_time);
if (cdc_found.catalog[0]) {
cd_entries_found++;
track_no = 1;
do {
cdt_found = get_cdt_entry(cdc_found.catalog, track_no);
if (cdt_found.catalog[0]) {
track_entries_found++;
track_no++;
}
} while (cdt_found.catalog[0]);
}
} while (cdc_found.catalog[0]);
printf("Found %d CDs, with a total of %d tracks\n",
cd_entries_found, track_entries_found);
(void)get_confirm("Press return");
}
20. Π’Π΅ΠΏΠ΅ΡΡ Ρ Π²Π°Ρ Π΅ΡΡΡ ΡΡΠΈΠ»ΠΈΡΠ° display_cdc Π΄Π»Ρ Π²ΡΠ²ΠΎΠ΄Π° ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π°:
static void display_cdc(const cdc_entry *cdc_to_show) {
printf("Catalog: %s\n", cdc_to_show->catalog);
printf("\ttitle: %s\n", cdc_to_show->title);
printf("\ttype: %s\n", cdc_to_show->type);
printf("\tartist: %s\n", cdc_to_show->artist);
}
ΠΈ ΡΡΠΈΠ»ΠΈΡΠ° display_cdt Π΄Π»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°-Π΄ΠΎΡΠΎΠΆΠΊΠΈ:
static void display_cdt(const cdt_entry *cdt_to_show) {
printf("%d: %s\n", cdt_to_show->track_no,
cdt_to_show->track_txt);
}
21. Π‘Π»ΡΠΆΠ΅Π±Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ strip_return ΡΠ΄Π°Π»ΡΠ΅Ρ Π·Π°Π²Π΅ΡΡΠ°ΡΡΠΈΠΉ ΡΡΡΠΎΠΊΡ ΡΠΈΠΌΠ²ΠΎΠ» ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π° ΡΡΡΠΎΠΊΠΈ. ΠΠΎΠΌΠ½ΠΈΡΠ΅ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Linux, ΠΊΠ°ΠΊ ΠΈ UNIX, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΎΠ΄ΠΈΠ½ ΡΠΈΠΌΠ²ΠΎΠ» ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π° ΡΡΡΠΎΠΊΠΈ Π΄Π»Ρ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ° ΡΡΡΠΎΠΊΠΈ.
static void strip_return(char *string_to_strip) {
int len;
len = strlen(string_to_strip);
if (string_to_strip[len - 1] == '\n')
string_to_strip[len - 1] = '\0';
}
22. Π€ΡΠ½ΠΊΡΠΈΡ command_mode ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π° Π΄Π»Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ. Π€ΡΠ½ΠΊΡΠΈΡ getopt β Ρ ΠΎΡΠΎΡΠΈΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠ±Π΅Π΄ΠΈΡΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Π²Π°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΌ ΡΠΎΠ³Π»Π°ΡΠ΅Π½ΠΈΡΠΌ, ΠΏΡΠΈΠ½ΡΡΡΠΌ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ Linux.
static int command_mode(int argc, char *argv[]) {
int c;
int result = EXIT_SUCCESS;
char *prog_name = argv[0];
/* ΠΡΠΈ Π²Π½Π΅ΡΠ½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ getopt */
extern char *optarg;
extern optind, opterr, optopt;
while ((c = getopt(argc, argv, ":i")) != -1) {
switch(c) {
case 'i':
if (!database_initialize(1)) {
result = EXIT_FAILURE;
fprintf(stderr, "Failed to initialize database\n");
}
break;
case ':':
case '?':
default: