(*~\Глагол\приложкемяLink\МПГ2009 (компилируется, но НЕ раб.?)\~~~~~~~~~~~~~~~*)
(**)                                                     ОТДЕЛ Обмен;
(******************************************************************************
 * НАЗНАЧЕНИЕ: обмен данными с файлами
 ******************************************************************************)

ИСПОЛЬЗУЕТ 
        (*  \Глагол\              *)
  оЦепи   ИЗ "..\..\Отделы\Иное\",
   Пустой ИЗ "..\..\Отделы\Иное\",  
        (*  \Глагол\              *)
  ОС      ИЗ "..\..\Отделы\Обмен\",
    Файл  ИЗ "..\..\Отделы\Обмен\",
        (*  \Глагол\              *)
   ВФайл  ИЗ "..\..\Отделы\Обмен\ВводВывод\",
  ИзФайла ИЗ "..\..\Отделы\Обмен\ВводВывод\",
(*
  Писать  ИЗ "..\..\Отделы\Обмен\",
  Читать  ИЗ "..\..\Отделы\Обмен\",
*)
  Настрой,
  Ошибка;

ПЕР
  отдИмяФ-:Файл.ВПолного; (* имя входного  .отд файла *)
  опгИмяФ-:Файл.ВПолного; (* имя выходного .опм файла *)
  кодИмяФ-:Файл.ВПолного; (* имя выходного .код файла *)

  отд:ИзФайла.ДкПотоку;
  опч:ИзФайла.ДкПотоку;

  опз:ВФайл.ДкПотоку;
  код:ВФайл.ДкПотоку;

  выхМесто:Файл.ВПути;    (* местоположение выходных файлов *)

                                          (* переброс текста из <отд> в <код> *)
  строка:ЦЕПЬ[200]; (* промежуточная память *)
  длСтроки:ЦЕЛ;     (* заполнение <строка>  *)
  идётВставка:КЛЮЧ; (* идёт вставка кода    *)
  идётОтладка:КЛЮЧ; (* идёт отладка         *)


(*-оооооооооооооо- опережающие определения/заготовки задач -ооооооооооооооооо-*)


(*-------------------------------------Общедоступные ЗАДАЧИ-------------------*)
ЗАДАЧА ^ОтдЗакрыть-;
ЗАДАЧА ^ОпчЗакрыть-;
ЗАДАЧА ^ОпзЗакрыть-;
ЗАДАЧА ^ОпчЦел-(ц+:ЦЕЛ);
ЗАДАЧА ^ОпзЦел-(ц:ЦЕЛ);
ЗАДАЧА ^КодЗакрыть-;
(*-----------------------------------------локальная ЗАДАЧА-------------------*)
ЗАДАЧА ^КодСтрока;


(*=рррррррррррррррррррррррр= реализация задач =рррррррррррррррррррррррррррррр=*)


(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       НужнаОбр-(времяПредков:Файл.шцВремя):КЛЮЧ;
(*
 * Цель:  возвращает ВКЛ если нужна обработка .отд файла
 * До:    <времяПредков> - самое позднее время обработки используемых отделов
 *)
ПЕР
  свод:ЦЕЛ;
  опгВремя,
  отдВремя:Файл.шцВремя; (* время изменения файлов *)
УКАЗ
  ЕСЛИ НЕ Файл.Существует(опгИмяФ) ТО
    ВОЗВРАТ ВКЛ
  КОН;
  Файл.ВремяИзменения(опгИмяФ,опгВремя);
  Файл.ВремяИзменения(отдИмяФ,отдВремя);
  ЕСЛИ отдВремя > опгВремя ТО
    ВОЗВРАТ ВКЛ
  КОН;
  ЕСЛИ времяПредков > опгВремя ТО 
    ВОЗВРАТ ВКЛ
  КОН;
          (* сравнить текущий свод настроек преобразования со сводом из файла *)
  опч:=ИзФайла.Открыть(опгИмяФ);
  опч.цВидЗнаков:=ИзФайла.знУни;
  ОпчЦел(свод);
                 ИзФайла.Закрыть(опч);
  ЕСЛИ свод # Настрой.свод ТО
    ВОЗВРАТ ВКЛ
  КОН;
  ВОЗВРАТ ОТКЛ
КОН НужнаОбр;


(******************************************************************************)
(*                             Чтение общедоступных понятий                   *)
(******************************************************************************)


(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       ОпчОткрыть-(опчИмя-,опчПуть-:ЦЕПЬ);
ПЕР
  отдМесто:Файл.ВПути;
  отдИмя:Файл.ВИмени;
  отдТип:Файл.ВТипа;
  опчИмяФ:Файл.ВПолного;
  свод:ЦЕЛ;
УКАЗ
  Файл.РазобратьИмя(отдИмяФ,отдМесто,отдИмя,отдТип);
  Файл.НайтиМесто(отдМесто,опчПуть,выхМесто);
  оЦепи.ДобавитьВКонец(выхМесто,"Код\");                                  
  Файл.СобратьИмя(опчИмяФ,выхМесто,опчИмя,"опм");                                  
  опч:=ИзФайла.Открыть(опчИмяФ);
  ЕСЛИ опч = ПУСТО ТО
    Ошибка.ОтметитьИмя(Ошибка.ФАЙЛ_НЕ_ОТКРЫВАЕТСЯ,опчИмяФ)
  КОН;
  опч.цВидЗнаков:=ИзФайла.знУни;
  ОпчЦел(свод)
КОН ОпчОткрыть;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ОпчЗакрыть-;
УКАЗ
  ЕСЛИ опч # ПУСТО ТО
    ИзФайла.Закрыть(опч)
  КОН
КОН ОпчЗакрыть;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ОпчКонец-():КЛЮЧ;
УКАЗ
  ВОЗВРАТ ИзФайла.Конец(опч)
КОН ОпчКонец;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ОпчМнож-(м+:МНОЖ);
УКАЗ
  ИзФайла.Ячейки(опч,м,4)
КОН ОпчМнож;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ОпчЗнак-(зн+:ЗНАК);
УКАЗ
  зн:=ИзФайла.ЗнакЦепи(опч)
КОН ОпчЗнак;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ОпчЦел-(ц+:ЦЕЛ);
УКАЗ
  ИзФайла.Ячейки(опч,ц,4)
КОН ОпчЦел;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ОпчЦепь-(цепь+:ЦЕПЬ);
ПЕР
  поз:ЦЕЛ;
  зн:ЗНАК;
УКАЗ
  поз:=0;
  ПОВТОРЯТЬ
    ОпчЗнак(зн);
    цепь[поз]:=зн;
    УВЕЛИЧИТЬ(поз)
  ДО (зн = 0X) ИЛИ (поз >= РАЗМЕР(цепь))
КОН ОпчЦепь;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ОпчПЦепь-(достцепь+:Пустой.ДкЦепи);
УКАЗ
  достцепь:=ИзФайла.ДлинаЦепи(опч)
КОН ОпчПЦепь;


(******************************************************************************)
(* Запись машинного кода *)
(******************************************************************************)


(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       КодОткрыть-;
УКАЗ
  код:=ВФайл.Открыть(кодИмяФ);
  ЕСЛИ код = ПУСТО ТО
    Ошибка.ОтметитьИмя(Ошибка.ФАЙЛ_НЕ_СОЗДАЕТСЯ,кодИмяФ)
  КОН;
  код.цВидЗнаков:=ВФайл.знВин;
  длСтроки:=0;
  идётВставка:=ОТКЛ;
  идётОтладка:=Настрой.клОтлДанные
КОН КодОткрыть;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА КодЗакрыть-;
УКАЗ
  ЕСЛИ код # ПУСТО ТО
    ВФайл.Закрыть(код)
  КОН
КОН КодЗакрыть;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА УдалитьКод-;
(* Цель:  удалить выходные .опм и .код файлы *)
ПЕР
  ответ:КЛЮЧ;
УКАЗ
  КодЗакрыть;
  ОпзЗакрыть;
  ответ:=ОС.УдалитьФ(опгИмяФ);
  ответ:=ОС.УдалитьФ(кодИмяФ);
  ответ:=ОС.СоздатьП(выхМесто)
КОН УдалитьКод;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА КодЗнак-(зн:ЗНАК);
УКАЗ
  ВФайл.ЗнакЦепи(код,зн)
КОН КодЗнак;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА КодЦепь-(цепь-:ЦЕПЬ);
УКАЗ
  ВФайл.ВсяЦепь(код,цепь)
КОН КодЦепь;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА КодЗнакЦепи-(зн:ЗНАК);
(* правильно отрабатывает "^" *)
ПЕР
  цепь:ЦЕПЬ[2];
УКАЗ
  цепь[0]:=зн;
  цепь[1]:=0X;
  КодЦепь(цепь)
КОН КодЗнакЦепи;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА КодЦел-(описание-:ЦЕПЬ; ц:ЦЕЛ);
УКАЗ
  ВФайл.Цел4числа(код,описание,ц,0,0,0)
КОН КодЦел;

(*-----------------------------------------локальная ЗАДАЧА-------------------*)
ЗАДАЧА КодСтрока;
ПЕР
  поз:ЦЕЛ;
УКАЗ
  ЕСЛИ идётОтладка ИЛИ идётВставка ТО
    (* отладочные данные будут примечаниями *)
    ЕСЛИ идётОтладка И НЕ идётВставка ТО
      КодЦепь("; ")
    КОН;
    (* запись строки из <отд> *)
    ОТ поз:=0 ДО длСтроки-1 ВЫП
      КодЗнак(строка[поз])
    КОН;
    КодЦепь("^")
  КОН;
  длСтроки:=0 
КОН КодСтрока;


(******************************************************************************)
(* Чтение текста отдела *)
(******************************************************************************)


(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ОтдОткрыть-;
УКАЗ
  отд:=ИзФайла.Открыть(отдИмяФ);
  ЕСЛИ отд = ПУСТО ТО
    Ошибка.ОтметитьИмя(Ошибка.ФАЙЛ_НЕ_ОТКРЫВАЕТСЯ,отдИмяФ)
  КОН;
  отд.цВидЗнаков:=ИзФайла.знУни
КОН ОтдОткрыть;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ОтдЗакрыть-;
УКАЗ
  ЕСЛИ отд # ПУСТО ТО
    ИзФайла.Закрыть(отд)
  КОН
КОН ОтдЗакрыть;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ОтдЗнак-():ЗНАК;
ПЕР
  зн:ЗНАК;
УКАЗ
  ЕСЛИ ИзФайла.Конец(отд) ТО
    ВОЗВРАТ 0X
  КОН;
  зн:=ИзФайла.ЗнакЦепи(отд);
  ЕСЛИ зн = 0AX ТО
    КодСтрока
  АЕСЛИ (зн >= " ") И (длСтроки < РАЗМЕР(строка)) ТО
    строка[длСтроки]:=зн;
    УВЕЛИЧИТЬ(длСтроки)
  КОН;
  ВОЗВРАТ зн
КОН ОтдЗнак;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА НачалоВставки-;
УКАЗ
  КодСтрока;
  идётВставка:=ВКЛ
КОН НачалоВставки;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА КонецВставки-;
УКАЗ
  УМЕНЬШИТЬ(длСтроки,4); (* убрали КОН *)
  КодСтрока;
  идётВставка:=ОТКЛ
КОН КонецВставки;


(******************************************************************************)
(* Запись общедоступных понятий *)
(******************************************************************************)


(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ОпзОткрыть-;
УКАЗ
  опз:=ВФайл.Открыть(опгИмяФ);
  ЕСЛИ опз=ПУСТО ТО
    Ошибка.ОтметитьИмя(Ошибка.ФАЙЛ_НЕ_СОЗДАЕТСЯ,опгИмяФ)
  КОН;
  опз.цВидЗнаков:=ВФайл.знУни;
  ОпзЦел(Настрой.свод)
КОН ОпзОткрыть;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ОпзЗакрыть-;
УКАЗ
  ЕСЛИ опз # ПУСТО ТО
    ВФайл.Закрыть(опз)
  КОН
КОН ОпзЗакрыть;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ОпзМнож-(м:МНОЖ);
УКАЗ
  ВФайл.Ячейки(опз,м,4)
КОН ОпзМнож;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ОпзЗнак-(зн:ЗНАК);
УКАЗ
  ВФайл.ЗнакЦепи(опз,зн)
КОН ОпзЗнак;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ОпзЦел-(ц:ЦЕЛ);
УКАЗ
  ВФайл.Ячейки(опз,ц,4)
КОН ОпзЦел;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ОпзЦепь-(цепь-:ЦЕПЬ);
ПЕР
  поз:ЦЕЛ;
  зн:ЗНАК;
УКАЗ
  поз:=0;
  ПОВТОРЯТЬ
    зн:=цепь[поз];
    ОпзЗнак(зн);
    УВЕЛИЧИТЬ(поз)
  ДО (зн = 0X) ИЛИ (поз >= РАЗМЕР(цепь))
КОН ОпзЦепь;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ОпзПЦепь-(цепь-:ЦЕПЬ);
УКАЗ
  ВФайл.ДлинаЦепи(опз,цепь)
КОН ОпзПЦепь;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА НовоеИмяФ-(отдИмяФ-:ЦЕПЬ);
(*
 * Цель:  обновление имён для нового отдела
 * До:    <отдИмяФ> - местоположение входного  .отд файла 
 * После: <опгИмяФ> - местоположение выходного .опм файла
 *        <кодИмяФ> - местоположение выходного .код файла
 *)
ПЕР
  путь:Файл.ВПути;
   имя:Файл.ВИмени;
   тип:Файл.ВТипа;
УКАЗ
  ОпчЗакрыть;
  ОтдЗакрыть;
  ОпзЗакрыть;
  КодЗакрыть;

  СПИСАТЬ(отдИмяФ,Обмен.отдИмяФ);

  Файл.РазобратьИмя(отдИмяФ,путь,имя,тип);
  оЦепи.ДобавитьВКонец(путь,"Код\");                                  
  Файл.СобратьИмя(опгИмяФ,путь,имя,"опм");                                  
  Файл.СобратьИмя(кодИмяФ,путь,имя,"код");                                  
  идётОтладка:=ОТКЛ;
  идётВставка:=ОТКЛ
КОН НовоеИмяФ;

(*-ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss-*)
УКАЗ
  опч:=ПУСТО;
  опз:=ПУСТО;
  отд:=ПУСТО;
  код:=ПУСТО;
КОН Обмен.
