// 2025-2026 Богданович Давид Когут Прихожденко

взяти визначення мавка;

простір мавка {
  дія знайти_задіяне(
    М: *Машина,
    задіяні: Задіяні,
    позиція: п32,
    назва: *ПредметТексту,
    вихід_значення: *Значення
  ) -> логічне {
    змінна розмір_позиційних = задіяні.розмір - (задіяні.кількість_імен * 2);
    змінна знайдено = ні;

    якщо розмір_позиційних > позиція {
      вихід_значення::вміст = задіяні.дані[позиція];

      знайдено = так;
    }

    якщо задіяні.кількість_імен > 0 {
      змінна п: п32 = 0;

      поки п < задіяні.кількість_імен {
        змінна елемент = задіяні.дані[розмір_позиційних + задіяні.кількість_імен + п].дані як *Предмет як *ПредметТексту;

        якщо порівняти_тексти(М, елемент, назва) {
          вихід_значення::вміст = задіяні.дані[розмір_позиційних + п];

          вернути так;
        }

        п += 1;
      }
    }

    вернути знайдено;
  }

  дія знайти_задіяне_як_число(
    М: *Машина,
    задіяні: Задіяні,
    позиція: п32,
    назва: *ПредметТексту,
    вихід_значення: *р64
  ) -> логічне {
    змінна значення: мавка::Значення;
    змінна знайдено: логічне;

    знайдено = знайти_задіяне(
      М,
      задіяні,
      позиція,
      назва,
      значення::адреса,
    );
    якщо не знайдено {
      вернути ні;
    }

    вихід_значення::вміст = отримати_число(
      М,
      значення,
      Місцезнаходження { пусто як *ПредметДаних, 0 },
    );
    вернути так;
  }

  дія отримати_задіяне_як_число(
    М: *Машина,
    задіяні: Задіяні,
    позиція: п32,
    назва: *ПредметТексту,
    вихід_значення: *р64
  ) {
    змінна значення: мавка::Значення;
    змінна знайдено: логічне;

    знайдено = знайти_задіяне(
      М,
      задіяні,
      позиція,
      назва,
      значення::адреса,
    );
    якщо не знайдено {
      вихід_значення::вміст = 0.0;
      вернути;
    }

    вихід_значення::вміст = отримати_число(
      М,
      значення,
      Місцезнаходження { пусто як *ПредметДаних, 0 },
    );
  }

  дія знайти_задіяне_як_текст(
    М: *Машина,
    задіяні: Задіяні,
    позиція: п32,
    назва: *ПредметТексту,
    вихід_значення: **ПредметТексту
  ) -> логічне {
    змінна значення: мавка::Значення;
    змінна знайдено: логічне;

    знайдено = знайти_задіяне(
      М,
      задіяні,
      позиція,
      назва,
      значення::адреса,
    );
    якщо не знайдено {
      вернути ні;
    }

    вихід_значення::вміст = отримати_текст(
      М,
      значення,
      Місцезнаходження { пусто як *ПредметДаних, 0 },
    );
    вернути так;
  }

  дія отримати_задіяне_як_текст(
    М: *Машина,
    задіяні: Задіяні,
    позиція: п32,
    назва: *ПредметТексту,
    вихід_значення: **ПредметТексту
  ) {
    змінна значення: мавка::Значення;
    змінна знайдено: логічне;

    знайдено = знайти_задіяне(
      М,
      задіяні,
      позиція,
      назва,
      значення::адреса,
    );
    якщо не знайдено {
      вихід_значення::вміст = М.константи_назв._недійсне;
      вернути;
    }

    вихід_значення::вміст = отримати_текст(
      М,
      значення,
      Місцезнаходження { пусто як *ПредметДаних, 0 },
    );
  }

  дія знайти_задіяне_як_ю8(
    М: *Машина,
    задіяні: Задіяні,
    позиція: п32,
    назва: *ПредметТексту,
    вихід_значення: *ю8
  ) -> логічне {
    змінна значення: мавка::Значення;
    змінна успіх: логічне;
    змінна пт: *мавка::ПредметТексту;
    змінна позиція_помилки: природне;

    успіх = знайти_задіяне(
      М,
      задіяні,
      позиція,
      назва,
      значення::адреса,
    );
    якщо не успіх {
      вернути ні;
    }

    пт = отримати_текст(
      М,
      значення,
      Місцезнаходження { пусто як *ПредметДаних, 0 },
    );
    якщо М.стан_падіння {
      вернути так;
    }

    успіх = мавка::перекодувати_кд_в_ю8(
      М,
      пт.значення,
      вихід_значення,
      позиція_помилки::адреса
    );
    якщо не успіх {
      МІСЦЕПАДІННЯ(М, створити_текст(М, "Не вдалось перекодувати задіяне в ю8."), Місцезнаходження { пусто як *ПредметДаних, 0 });
      вернути так;
    }

    вернути так;
  }

  дія отримати_задіяне_як_ю8(
    М: *Машина,
    задіяні: Задіяні,
    позиція: п32,
    назва: *ПредметТексту,
    вихід_значення: *ю8
  ) {
    змінна значення: мавка::Значення;
    змінна успіх: логічне;
    змінна пт: *мавка::ПредметТексту;
    змінна позиція_помилки: природне;

    успіх = знайти_задіяне(
      М,
      задіяні,
      позиція,
      назва,
      значення::адреса,
    );
    якщо успіх {
      пт = отримати_текст(
        М,
        значення,
        Місцезнаходження { пусто як *ПредметДаних, 0 },
      );
      якщо М.стан_падіння {
        вернути;
      }
    } інакше {
      пт = М.константи_назв._недійсне;
    }

    успіх = мавка::перекодувати_кд_в_ю8(
      М,
      пт.значення,
      вихід_значення,
      позиція_помилки::адреса
    );
    якщо не успіх {
      МІСЦЕПАДІННЯ(М, створити_текст(М, "Не вдалось перекодувати задіяне в ю8."), Місцезнаходження { пусто як *ПредметДаних, 0 });
    }
  }

  дія перебрати_позиційні_задіяні(
    М: *Машина,
    задіяні: Задіяні,
    дія_перебору: ДіяПереборуПозиційнихЗадіяних,
    аргумент: адреса
  ) {
    змінна розмір_позиційних = задіяні.розмір - (задіяні.кількість_імен * 2);
    змінна п: п32 = 0;

    поки п < розмір_позиційних {
      дія_перебору(
        М,
        задіяні,
        розмір_позиційних,
        п,
        задіяні.дані[п],
        аргумент
      );

      п += 1;
    }
  }

  дія перебрати_іменовані_задіяні(
    М: *Машина,
    задіяні: Задіяні,
    дія_перебору: ДіяПереборуІменованихЗадіяних,
    аргумент: адреса
  ) {
    змінна розмір_позиційних = задіяні.розмір - (задіяні.кількість_імен * 2);
    змінна п: п32 = 0;

    поки п < розмір_позиційних {
      дія_перебору(
        М,
        задіяні,
        розмір_позиційних + задіяні.кількість_імен + п,
        задіяні.дані[розмір_позиційних + задіяні.кількість_імен + п].дані як *Предмет як *ПредметТексту,
        задіяні.дані[розмір_позиційних + п],
        аргумент
      );

      п += 1;
    }
  }

  дія звільнити_задіяні(
    М: *Машина,
    задіяні: Задіяні
  ) {
    якщо задіяні.вид == ВидЗадіяних1 {
      вернути; // задіяні з накопичувача діяльності не можна звільняти
    }

    якщо задіяні.дані != пусто {
      звільнити(М, задіяні.дані);
    }
  }
}