взяти означення мавка;
взяти означення мавка/бібліотека;

дія перевірити_чи_ю8_починається_на(значення: ю8, початок: ю8) -> логічне {
  змінна п: природне = 0;

  поки п < початок.розмір {
    якщо п >= значення.розмір {
      вернути ні;
    }

    якщо значення.дані[п] != початок.дані[п] {
      вернути ні;
    }

    п += 1;
  }

  вернути так;
}

дія обробити_чергу_здійснення(М: адреса<мавка::Машина>) -> ц32 {
  змінна інформація_падіння: мавка::ІнформаціяПадіння;
  змінна елемент_черги_здійснення: мавка::ЕлементЧергиЗдійснення;

  поки мавка::забрати_з_черги_здійснення(М, елемент_черги_здійснення::адреса) {
    мавка::здійснити(
      М,
      мавка::НЕДІЙСНЕ,
      елемент_черги_здійснення.значення,
      елемент_черги_здійснення.задіяні,
      мавка::Місцезнаходження { пусто, 0 }
    );

    якщо мавка::отримати_інформацію_падіння(М, інформація_падіння::адреса) {
      мавка::пристрій::надрукувати_інформацію_падіння(
        М,
        інформація_падіння
      );

      мавка::знищити_інформацію_падіння(М, інформація_падіння);

      вернути 1;
    }
  }

  вернути 0;
}

дія старт(кількість_аргументів: природне, аргументи: памʼять<ю8>) -> ц32 {
  змінна шлях_до_теки_модулів_ю8: ю8;
  змінна шлях_до_теки_паків_ю8: ю8;
  змінна шлях_до_стандартного_вводу_ю8 = ю8"діалог";
  змінна шлях_до_файлу: ю8;
  змінна знайдено_шлях_до_файлу = ні;
  змінна п: природне;
  змінна успіх: логічне;
  змінна абсолютний_шлях_до_файлу_модуля: адреса<мавка::ПредметДаних>;
  змінна шлях_до_теки_модулів: адреса<мавка::ПредметДаних>;
  змінна шлях_до_теки_паків: адреса<мавка::ПредметДаних>;
  змінна шлях_до_стандартного_вводу: адреса<мавка::ПредметДаних>;
  змінна назва_модуля: адреса<мавка::ПредметТексту>;
  змінна М: адреса<мавка::Машина>;
  змінна кількість_назв_взяти: природне;
  змінна назви_взяти: памʼять<адреса<мавка::ПредметТексту>>;
  змінна інформація_падіння: мавка::ІнформаціяПадіння;
  змінна текст_помилки: кд;
  змінна елемент_черги_здійснення: мавка::ЕлементЧергиЗдійснення;
  змінна результат: ц32;

  п = 1;

  поки п < кількість_аргументів {
    якщо перевірити_чи_ю8_починається_на(аргументи[п], ю8"--") {
    } інакше {
      шлях_до_файлу = аргументи[п];
      знайдено_шлях_до_файлу = так;

      п = кількість_аргументів; // Вийти з циклу
    }

    п += 1;
  }

  М = мавка::пристрій::створити_машину();

  мавка::пристрій::визначити_глобальний_мавка(М);
  мавка::пристрій::визначити_глобальні_виводу(М);

  мавка::бібліотека::ініціалізувати(М);

  якщо знайдено_шлях_до_файлу {
    успіх = мавка::пристрій::розібрати_шлях_початкового_модуля(
      М,
      мавка::створити_дані(М, шлях_до_файлу.розмір, шлях_до_файлу.дані),
      абсолютний_шлях_до_файлу_модуля::адреса,
      шлях_до_теки_модулів::адреса,
      шлях_до_теки_паків::адреса,
      назва_модуля::адреса
    );

    якщо не успіх {
      мавка::вивести_кд(М, "Неможливо виконати файл \"");
      пристрій_мавки_вивести_ю8(шлях_до_файлу.розмір, шлях_до_файлу.дані);
      мавка::вивести_кд(М, "\"\р");
      вернути 1;
    }

    мавка::пристрій::записати_шлях_до_теки_модулів_та_паків(
      М,
      шлях_до_теки_модулів,
      шлях_до_теки_паків,
    );

    мавка::пристрій::взяти_файл(
      М,
      абсолютний_шлях_до_файлу_модуля,
      назва_модуля,
      мавка::Місцезнаходження { абсолютний_шлях_до_файлу_модуля, 0 }
    );

    якщо мавка::отримати_інформацію_падіння(М, інформація_падіння::адреса) {
      мавка::пристрій::надрукувати_інформацію_падіння(
        М,
        інформація_падіння
      );

      мавка::знищити_інформацію_падіння(М, інформація_падіння);

      вернути 1;
    }
  } інакше {
    успіх = пристрій_мавки_отримати_поточний_шлях_процесу(
      шлях_до_теки_модулів_ю8.розмір::адреса,
      шлях_до_теки_модулів_ю8.дані::адреса
    );

    якщо не успіх {
      мавка::надрукувати_кд(М, "Неможливо отримати поточний шлях процесу.");
      вернути 1;
    }

    успіх = пристрій_мавки_отримати_теку_до_паків(
      шлях_до_теки_модулів_ю8.розмір,
      шлях_до_теки_модулів_ю8.дані,
      шлях_до_теки_паків_ю8.розмір::адреса,
      шлях_до_теки_паків_ю8.дані::адреса
    );

    якщо не успіх {
      мавка::надрукувати_кд(М, "Неможливо отримати теку до паків.");
      вернути 1;
    }

    шлях_до_теки_модулів = мавка::створити_дані(М, шлях_до_теки_модулів_ю8.розмір, шлях_до_теки_модулів_ю8.дані);
    шлях_до_теки_паків = мавка::створити_дані(М, шлях_до_теки_паків_ю8.розмір, шлях_до_теки_паків_ю8.дані);
    шлях_до_стандартного_вводу = мавка::створити_дані(М, шлях_до_стандартного_вводу_ю8.розмір, шлях_до_стандартного_вводу_ю8.дані);

    мавка::пристрій::записати_шлях_до_теки_модулів_та_паків(
      М,
      шлях_до_теки_модулів,
      шлях_до_теки_паків,
    );

    змінна версія_мавки_кд: кд;
    пристрій_мавки_отримати_версію(версія_мавки_кд.розмір::адреса, версія_мавки_кд.дані::адреса);

    мавка::вивести_кд(М, "Діалог Мавки ");
    мавка::надрукувати_кд(М, версія_мавки_кд);

    мавка::звільнити_памʼять(М, версія_мавки_кд.дані);

    мавка::пристрій::почати_діалог(
      М,
      шлях_до_теки_модулів,
      шлях_до_стандартного_вводу
    );
  }

  // результат = обробити_чергу_здійснення(М);

  // якщо результат != 0 {
  //   вернути результат;
  // }

  // потім: запустити очікувач подій

  вернути 0;
}