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

взяти означення мавка/бібліотека;
взяти означення мавка/пристрій;

простір мавка {
  простір бібліотека {
    внутрішня дія рідна_дія__дописати(
      М: адреса<Машина>,
      діяльність: адреса<Діяльність>
    ) -> ЗначенняАбоСтанПадіння {
      змінна задіяне_значення = НЕДІЙСНЕ;
      змінна знайдено_задіяне_значення = ні;
      змінна задіяне_куди = НЕДІЙСНЕ;
      змінна знайдено_задіяне_куди = ні;

      знайдено_задіяне_значення = знайти_задіяне(М, діяльність.задіяні, 0, М.константи_назв._значення, задіяне_значення::адреса);
      знайдено_задіяне_куди = знайти_задіяне(М, діяльність.задіяні, 1, М.константи_назв._куди, задіяне_куди::адреса);

      якщо не знайдено_задіяне_значення {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"значення\" має бути текстом або даними."));
      }
      якщо не знайдено_задіяне_куди {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"куди\" має бути текстом або даними."));
      }

      змінна шлях_ю8 = ю8 { 0, пусто };

      якщо задіяне_куди.вид == ЗМашиннийПредмет {
        змінна предмет = задіяне_куди.дані як адреса<Предмет>;

        якщо предмет.тип == М.предмет_структури_Текст {
          змінна предмет_тексту = предмет як адреса<ПредметТексту>;
          змінна позиція_помилки: природне = 0;

          якщо не пристрій_мавки_перекодувати_кд_в_ю8(
            предмет_тексту.значення.розмір,
            предмет_тексту.значення.дані,
            шлях_ю8.розмір::адреса,
            шлях_ю8.дані::адреса,
            позиція_помилки::адреса
          ) {
            вернути ПАДІННЯ(М, створити_текст(М, "Не вдалося перекодувати куди в юнікод."));
          }
        } інакше якщо предмет.тип == М.предмет_структури_Дані {
          змінна предмет_даних = предмет як адреса<ПредметДаних>;

          шлях_ю8.розмір = предмет_даних.розмір;
          шлях_ю8.дані = предмет_даних.дані;
        } інакше {
          вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"куди\" має бути текстом або даними."));
        }
      } інакше {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"куди\" має бути текстом або даними."));
      }

      змінна дані_файлу = Дані { 0, пусто };

      якщо задіяне_значення.вид == ЗМашиннийПредмет {
        змінна предмет = задіяне_значення.дані як адреса<Предмет>;

        якщо предмет.тип == М.предмет_структури_Текст {
          змінна предмет_тексту = предмет як адреса<ПредметТексту>;

          дані_файлу.розмір = предмет_тексту.значення.розмір;
          дані_файлу.дані = предмет_тексту.значення.дані;
        } інакше якщо предмет.тип == М.предмет_структури_Дані {
          змінна предмет_даних = предмет як адреса<ПредметДаних>;

          дані_файлу.розмір = предмет_даних.розмір;
          дані_файлу.дані = предмет_даних.дані;
        } інакше {
          вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"значення\" має бути текстом або даними."));
        }
      } інакше {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"значення\" має бути текстом або даними."));
      }

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

        вернути ПАДІННЯ(М, створити_текст(М, "Не вдалося дописати файл за вказаним шляхом."));
      }

      звільнити(М, шлях_ю8.дані);
    }

    дія записати_дію__система__дописати(
      М: адреса<Машина>,
      предмет_модуля: адреса<ПредметМодуля>
    ) {
      // потім: створити параметри

      змінна д = створити_рідну_дію(
        М,
        створити_текст(М, "дописати"),
        М.предмет_пустої_послідовності,
        пусто,
        рідна_дія__дописати,
        пусто
      );

      предмет_модуля_змінити_властивість(
        М,
        предмет_модуля,
        М.константи_назв._дописати,
        МАШИННИЙ_ПРЕДМЕТ(д),
        Місцезнаходження { пусто, 0 }
      );
    }
  }
}