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

Шрифт:

-
+

Интервал:

-
+

Закладка:

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

 menu_options current_option;

 cdc_entry current_cdc_entry;

 int command_result;

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

if (argc >1) {

  command_result = command_mode(argc, argv);

  exit(command_result);

 }

 announce();

 if (!database_initialize(0)) {

  fprintf(stderr, "Sorry, unable to initialize databasen");

  fprintf(stderr, "To create a new database use %s -in", argv[0]);

  exit(EXIT_FAILURE);

 }

5. Теперь вы готовы обрабатывать ввод пользователя. Вы остаетесь в цикле, запрашивая пункт меню и обрабатывая его до тех пор, пока пользователь не выберет выход. Обратите вниманий на то, что вы передаете структуру current_cdc_entry в функцию show_menu, чтобы разрешить изменять варианты пунктов меню, когда выбран текущий элемент каталога:

 while (current_option != mo_exit) {

  current_option = show_menu(&current_cdc_entry);

  switch(current_option) {

  case mo_add_cat:

   if (enter_new_cat_entry(&current_cdc_entry)) {

    if (!add_cdc_entry(current_cdc_entry)) {

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

     memset(&current_cdc_entry, '',

      sizeof(current_cdc_entry));

    }

   }

   break;

  case mo_add_tracks:

   enter_new_track_entries(&current_cdc_entry);

   break;

  case mo_del_cat:

   del_cat_entry(&current_cdc_entry);

   break;

  case mo_find_cat:

   current_cdc_entry = find_cat();

   break;

  case mo_list_cat_tracks:

   list_tracks(&current_cdc_entry);

   break;

  case mo_del_tracks:

   del_track_entries(&current_cdc_entry);

   break;

  case mo_count_entries:

   count_all_entries();

   break;

  case mo_exit:

   break;

  case mo_invalid:

   break;

  default:

   break;

  } /* switch */

 } /* while */

6. Когда цикл в функции main завершится, закройте базу данных и вернитесь в окружение. Функция announce выводит приглашающее предложение:

 database_close();

 exit(EXIT_SUCCESS);

} /* main */

static void announce(void) {

 printf("nnWelcome to the demonstration CD catalog database

  programn");

}

7. Здесь вы реализуете функцию show_menu. Эта функция проверяет, выбран ли текущий элемент каталога, используя первый символ имени в каталоге. Если элемент каталога выбран, становятся доступными дополнительные пункты меню:

static menu_options show_menu(const cdc_entry *cdc_selected) {

 char tmp_str[TMP_STRING_LEN + 1];

 menu_options option_chosen = mo_invalid;

 while (option_chosen == mo_invalid) {

  if (cdc_selected->catalog[0]) {

   printf("nnCurrent entry: ");

   printf("%s, %s, %a, %sn",

    cdc_selected->catalog, cdc_selected->title,

    cdc_selected->type, cdc_selected->artist);

   printf("n");

   printf("1 - add new CDn");

   printf("2 — search for a CDn");

   printf("3 — count the CDs and tracks in the databasen");

   printf("4 — re-enter tracks for current CDn");

   printf("5 - delete this CD, and all its tracksn");

   printf("6 - list tracks for this CDn");

   printf("q — quitn");

   printf("nOption: ");

   fgets(tmp_str, TMP_STRING_LEN, stdin);

   switch(tmp_str[0]) {

   case '1':

    option_chosen = mo_add_cat;

    break;

   case '2':

    option_chosen = mo_find_cat;

    break;

   case '3':

    option_chosen = mo_count_entries;

    break;

   case '4':

    option_chosen = mo_add_tracks;

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

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