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