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