// 2025-2026 Богданович Давид Когут Прихожденко (кдб.дійсність.укр)

/* Пристрій Мавки */

взяти визначення мавка;

простір мавка {
  структура ЕлементШляхуПристроюМавки {
    дані: *п8;
    розмір: природне;
  }
}

// ВАЖЛИВО: параметри дій пристрою НЕ ЗМІНЮВАТИ! інакше прийдеться змінювати ВСЮДИ (віндовс, лінукс, макос, васм)
//          якщо треба щось таке зробити, то треба створити нову дію!
//          сумісність цих дій між версіями має завжли зберігатись!
//          це головна біль потім міняти їх у Васм!
дія пристрій_мавки_виділити(розмір: природне) -> адреса;
дія пристрій_мавки_перевиділити(значення: адреса, новий_розмір: природне) -> адреса;
дія пристрій_мавки_звільнити(значення: адреса);
дія пристрій_мавки_вийти(код: ц32);
дія пристрій_мавки_отримати_версію_як_ю8(вихід_даних: **п8, вихід_розміру: *природне) -> логічне;
дія пристрій_мавки_вивести_сирі_дані(дані: *п8, розмір: природне);
дія пристрій_мавки_вивести_ю8(колір: природне, дані: *п8, розмір: природне);
дія пристрій_мавки_вивести_шлях(колір: природне, дані: *п8, розмір: природне);
дія пристрій_мавки_перетворити_п64_в_ю8(значення: п64, вихід_даних: **п8, вихід_розміру: *природне) -> логічне;
дія пристрій_мавки_перетворити_ц64_в_ю8(значення: ц64, вихід_даних: **п8, вихід_розміру: *природне) -> логічне;
дія пристрій_мавки_перетворити_р64_в_ю8(значення: р64, вихід_даних: **п8, вихід_розміру: *природне, вихід_розміру_експоненти: *ціле) -> логічне;
дія пристрій_мавки_отримати_р64_з_ю8(дані: *п8, розмір: природне, вихід: *р64) -> логічне;
дія пристрій_мавки_піднести_до_степеня_р64(значення: р64, степінь: р64) -> р64;
дія пристрій_мавки_читати_ю8(дані_перед: *п8, розмір_перед: природне, вихід_даних: **п8, вихід_розміру: *природне, вихід_кінець_файлу: *природне, дозволити_історію: природне) -> логічне;
дія пристрій_мавки_читати_ю8_асинхронно(дані_перед: *п8, розмір_перед: природне, обробник: (дані: *п8, розмір: природне, кінець_файлу: природне, аргумент: адреса) -> ніщо, аргумент: адреса, дозволити_історію: природне) -> логічне;
дія пристрій_мавки_прочитати_файл(дані_шляху: *п8, розмір_шляху: природне, вихід_даних: **п8, вихід_розміру: *природне) -> логічне;
дія пристрій_мавки_перевірити_чи_шлях_існує_і_є_файлом(дані_шляху: *п8, розмір_шляху: природне) -> логічне;
дія пристрій_мавки_отримати_абсолютний_шлях(дані_шляху: *п8, розмір_шляху: природне, вихід_даних: **п8, вихід_розміру: *природне) -> логічне;
дія пристрій_мавки_отримати_теку_шляху(дані_шляху: *п8, розмір_шляху: природне, вихід_даних: **п8, вихід_розміру: *природне, рівень: природне) -> логічне;
дія пристрій_мавки_отримати_теку_до_паків(дані_шляху: *п8, розмір_шляху: природне, вихід_даних: **п8, вихід_розміру: *природне) -> логічне;
дія пристрій_мавки_отримати_назву_модуля_з_шляху_ю8(дані_шляху: *п8, розмір_шляху: природне, вихід_даних: **п8, вихід_розміру: *природне) -> логічне;
дія пристрій_мавки_збити_шлях_до_модуля(кількість_елементів: природне, елементи: *мавка::ЕлементШляхуПристроюМавки, вихід_даних: **п8, вихід_розміру: *природне) -> логічне;
дія пристрій_мавки_перевірити_чи_шлях_починається_на(дані_шляху: *п8, розмір_шляху: природне, дані_початку: *п8, розмір_початку: природне) -> логічне;
дія пристрій_мавки_отримати_шлях_до_паку_з_шляху_теки_модулів(дані_шляху: *п8, розмір_шляху: природне, дані_шляху_до_паків: *п8, розмір_шляху_до_паків: природне, вихід_даних: **п8, вихід_розміру: *природне) -> логічне;
дія пристрій_мавки_отримати_поточний_шлях_процесу(вихід_даних: **п8, вихід_розміру: *природне) -> логічне;

дія пристрій_мавки_перекодувати_ю8_в_кд(розмір: природне, дані: *п8, вихід_розміру: *природне, вихід_даних: **п8, вихід_позиції_помилки: *природне) -> логічне;
дія пристрій_мавки_перекодувати_кд_в_ю8(розмір: природне, дані: *п8, вихід_розміру: *природне, вихід_даних: **п8, вихід_позиції_помилки: *природне) -> логічне;

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

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

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

  пристрій_мавки_звільнити(дані_ю8);
  вернути так;
}

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

  якщо не пристрій_мавки_перекодувати_кд_в_ю8(розмір, дані, розмір_ю8::адреса, дані_ю8::адреса, позиція_помилки::адреса) {
    // потім: обробити
    вернути;
  }

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

  пристрій_мавки_звільнити(дані_ю8);
}

внутрішня дія пристрій_мавки_перетворити_п64_в_кд(значення: п64, вихід_розміру: *природне, вихід_даних: **п8) -> логічне {
  змінна розмір_ю8: природне;
  змінна дані_ю8: *п8;
  змінна позиція_помилки: природне;

  якщо не пристрій_мавки_перетворити_п64_в_ю8(значення, дані_ю8::адреса, розмір_ю8::адреса) {
    вернути ні;
  }

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

  пристрій_мавки_звільнити(дані_ю8);
  вернути так;
}

внутрішня дія пристрій_мавки_перетворити_ц64_в_кд(значення: ц64, вихід_розміру: *природне, вихід_даних: **п8) -> логічне {
  змінна розмір_ю8: природне;
  змінна дані_ю8: *п8;
  змінна позиція_помилки: природне;

  якщо не пристрій_мавки_перетворити_ц64_в_ю8(значення, дані_ю8::адреса, розмір_ю8::адреса) {
    вернути ні;
  }

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

  пристрій_мавки_звільнити(дані_ю8);
  вернути так;
}

внутрішня дія пристрій_мавки_перетворити_р64_в_кд(значення: р64, вихід_розміру: *природне, вихід_даних: **п8, вихід_розміру_експоненти: *ціле) -> логічне {
  змінна розмір_ю8: природне;
  змінна дані_ю8: *п8;
  змінна позиція_помилки: природне;

  якщо не пристрій_мавки_перетворити_р64_в_ю8(значення, дані_ю8::адреса, розмір_ю8::адреса, вихід_розміру_експоненти) {
    вернути ні;
  }

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

  пристрій_мавки_звільнити(дані_ю8);
  вернути так;
}

внутрішня дія пристрій_мавки_отримати_р64_з_кд(дані: *п8, розмір: природне, вихід: *р64) -> логічне {
  змінна розмір_ю8: природне;
  змінна дані_ю8: *п8;
  змінна позиція_помилки: природне;

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

  якщо не пристрій_мавки_отримати_р64_з_ю8(дані_ю8, розмір_ю8, вихід) {
    пристрій_мавки_звільнити(дані_ю8);
    вернути ні;
  }

  пристрій_мавки_звільнити(дані_ю8);
  вернути так;
}

внутрішня дія пристрій_мавки_читати_кд(дані_перед: *п8, розмір_перед: природне, вихід_даних: **п8, вихід_розміру: *природне, вихід_кінець_файлу: *природне, дозволити_історію: природне) -> логічне {
  змінна розмір_перед_ю8: природне;
  змінна дані_перед_ю8: *п8;
  змінна позиція_помилки: природне;
  змінна успіх: логічне;

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

  змінна прочитаний_розмір: природне;
  змінна прочитані_дані: *п8;

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

  пристрій_мавки_звільнити(дані_перед_ю8);

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

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

  вернути успіх;
}

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

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

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

  пристрій_мавки_звільнити(дані_ю8);
  вернути так;
}

простір мавка {
  простір пристрій {
    дія створити_машину() -> *Машина;
    дія розібрати_шлях_початкового_модуля(М: *Машина, шлях: *ПредметДаних, вихід_абсолютного_шляху: **ПредметДаних, вихід_теки_модулів: **ПредметДаних, вихід_теки_паків: **ПредметДаних, вихід_назви_модуля: **ПредметТексту) -> логічне;
    дія визначити_глобально_мавка(М: *Машина);
    дія визначити_глобальні_виводу(М: *Машина);
  }
}