#ifndef PRYSTRIY_H
#define PRYSTRIY_H

#include "mavka/tsil.h"

#define КолірВиводуСтандартний 0
#define КолірВиводуЧервоний 1
#define КолірВиводуЗелений 2
#define КолірВиводуСиній 3
#define КолірВиводуЖовтий 4

typedef struct ЕлементШляхуПристроюМавки ЕлементШляхуПристроюМавки;

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

typedef логічне (*КористувацькийПристрійМавкиЧитатиКД)(
    природне розмір_перед,
    п8* дані_перед,
    природне* вихід_розміру,
    п8** вихід_даних,
    природне дозволити_історію,
    природне* кінець_файлу);

extern void змінити_користувацький_пристрій_мавки_читати_кд(
    КористувацькийПристрійМавкиЧитатиКД нова_функція);

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

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

// втілено в Цілі, вертає null-terminated
extern логічне пристрій_мавки_перекодувати_кд_в_ю8(
    природне розмір,
    п8* дані,
    природне* вихід_розміру,
    п8** вихід_даних,
    природне* вихід_позиції_помилки);

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

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

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

extern void пристрій_мавки_вивести_шлях(природне колір,
                                        природне розмір,
                                        п8* дані);

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

extern адреса пристрій_мавки_виділити_сиру_памʼять(природне розмір);

extern адреса пристрій_мавки_перевиділити_сиру_памʼять(адреса значення,
                                                       природне новий_розмір);

extern void пристрій_мавки_звільнити_сиру_памʼять(адреса значення);

extern void пристрій_мавки_вийти(ц32 код_виходу);

extern логічне пристрій_мавки_прочитати_файл(природне розмір_шляху,
                                             п8* дані_шляху,
                                             природне* вихід_розміру,
                                             п8** вихід_даних);

extern логічне пристрій_мавки_перетворити_п64_в_кд(п64 значення,
                                                   природне* вихід_розміру,
                                                   п8** вихід_даних);

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

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

extern п64 пристрій_мавки_піднести_до_степеня_п64(п64 значення, п64 степінь);

extern ц64 пристрій_мавки_піднести_до_степеня_ц64(ц64 значення, ц64 степінь);

extern р64 пристрій_мавки_піднести_до_степеня_р64(р64 значення, р64 степінь);

extern логічне пристрій_мавки_перевірити_чи_шлях_існує_і_є_файлом(
    природне розмір_шляху,
    п8* дані_шляху);

extern логічне пристрій_мавки_перевірити_чи_шлях_закінчується_як_модуль_мавки(
    природне розмір_шляху,
    п8* дані_шляху);

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

extern логічне пристрій_мавки_отримати_теку_шляху(природне розмір_шляху,
                                                  п8* дані_шляху,
                                                  природне* вихід_розміру,
                                                  п8** вихід_даних,
                                                  природне рівень);

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

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

extern логічне пристрій_мавки_збити_шлях_до_модуля(
    природне кількість_елементів,
    ЕлементШляхуПристроюМавки* елементи,
    природне* вихід_розміру,
    п8** вихід_даних);

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

extern логічне пристрій_мавки_перевірити_чи_шлях_починається_на(
    природне розмір_шляху,
    п8* дані_шляху,
    природне розмір_початку,
    п8* дані_початку);

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

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

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

#endif // PRYSTRIY_H