// 2025-2026 Богданович Давид Когут Прихожденко (кдб.дійсність.укр)
взяти означення мавка/бібліотека;
взяти означення мавка/пристрій;
простір мавка {
простір бібліотека {
внутрішня дія рідна_дія__прочитати(
М: адреса<Машина>,
діяльність: адреса<Діяльність>
) -> ЗначенняАбоСтанПадіння {
змінна задіяне_шлях = НЕДІЙСНЕ;
змінна знайдено_задіяне_шлях = ні;
змінна задіяне_тип = НЕДІЙСНЕ;
змінна знайдено_задіяне_тип = ні;
знайдено_задіяне_шлях = знайти_задіяне(М, діяльність.задіяні, 0, М.константи_назв._шлях, задіяне_шлях::адреса);
знайдено_задіяне_тип = знайти_задіяне(М, діяльність.задіяні, 1, М.константи_назв._тип, задіяне_тип::адреса);
якщо не знайдено_задіяне_шлях {
вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"шлях\" має бути текстом або даними."));
}
змінна як_текст = ні;
якщо знайдено_задіяне_тип {
якщо задіяне_тип.вид == ЗМашиннийПредмет {
змінна предмет = задіяне_тип.дані як адреса<Предмет>;
якщо предмет == М.предмет_структури_Текст {
як_текст = так;
} інакше якщо предмет == М.предмет_структури_Дані {
як_текст = ні;
} інакше {
вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"тип\" має бути структурою тексту або даних."));
}
} інакше {
вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"тип\" має бути структурою тексту або даних."));
}
}
змінна шлях_ю8 = ю8 { 0, пусто };
якщо задіяне_шлях.вид == ЗМашиннийПредмет {
змінна предмет = задіяне_шлях.дані як адреса<Предмет>;
якщо предмет.тип == М.предмет_структури_Текст {
змінна предмет_тексту = предмет як адреса<ПредметТексту>;
змінна позиція_помилки: природне = 0;
якщо не пристрій_мавки_перекодувати_кд_в_ю8(
предмет_тексту.значення.розмір,
предмет_тексту.значення.дані,
шлях_ю8.розмір::адреса,
шлях_ю8.дані::адреса,
позиція_помилки::адреса
) {
вернути ПАДІННЯ(М, створити_текст(М, "Не вдалося перекодувати шлях в юнікод."));
}
} інакше якщо предмет.тип == М.предмет_структури_Дані {
змінна предмет_даних = предмет як адреса<ПредметДаних>;
шлях_ю8.розмір = предмет_даних.розмір;
шлях_ю8.дані = предмет_даних.дані;
} інакше {
вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"шлях\" має бути текстом або даними."));
}
} інакше {
вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"шлях\" має бути текстом или даними."));
}
змінна дані_файлу = Дані { 0, пусто };
якщо не бібліотека_мавки_прочитати_файл(шлях_ю8.розмір, шлях_ю8.дані, дані_файлу::адреса) {
звільнити(М, шлях_ю8.дані);
вернути ПАДІННЯ(М, створити_текст(М, "Не вдалося прочитати файл за вказаним шляхом."));
}
звільнити(М, шлях_ю8.дані);
якщо як_текст {
вернути МАШИННИЙ_ПРЕДМЕТ(створити_текст_без_копіювання(
М,
дані_файлу.розмір,
дані_файлу.дані
));
}
вернути МАШИННИЙ_ПРЕДМЕТ(створити_дані_без_копіювання(
М,
дані_файлу.розмір,
дані_файлу.дані
));
}
дія записати_дію__система__прочитати(
М: адреса<Машина>,
предмет_модуля: адреса<ПредметМодуля>
) {
// потім: створити параметри
змінна д = створити_рідну_дію(
М,
створити_текст(М, "прочитати"),
М.предмет_пустої_послідовності,
пусто,
рідна_дія__прочитати,
пусто
);
предмет_модуля_змінити_властивість(
М,
предмет_модуля,
М.константи_назв._прочитати,
МАШИННИЙ_ПРЕДМЕТ(д),
Місцезнаходження { пусто, 0 }
);
}
}
}