(*~\Глагол\ПриложенияLink\ПГ\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                              ОТДЕЛ ФО;
(*============================================================================*)
(* НАЗНАЧЕНИЕ: Файловый Обмен                                                 *)
(*============================================================================*)

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

  НП,ОО;

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

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


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


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

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


(* -------------------------------------------------------------------------- *)
(* ------------------ Чтение понятий используемого отдела ------------------- *)
(* -------------------------------------------------------------------------- *)

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

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

  ОпчМнож(настройки);

  ИзФайла.Закрыть(опч);
  ЕСЛИ
       настройки # НП.настройки
  ТО
    ВОЗВРАТ ВКЛ
  КОН;
    ВОЗВРАТ ОТКЛ
КОН НужнаОбр;

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

  ОпчМнож(настройки)
КОН ОпчОткрыть;

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

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

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

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

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

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

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

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

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       ОпчШирВещ-(в+:ШИРВЕЩ);
УКАЗ
  ИзФайла.Ячейки(опч,в,НП.рВещ64)
КОН ОпчШирВещ;


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


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

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

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

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

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

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

  ОпзМнож(НП.настройки)
КОН ОпзОткрыть;

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

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

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

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

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

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

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       ОпзШирВещ-(в:ШИРВЕЩ);
УКАЗ
  ВФайл.Ячейки(опз,в,НП.рВещ64)
КОН ОпзШирВещ;


(* -------------------------------------------------------------------------- *)
(* ---------------- Запись машинного кода текущего отдела ------------------- *)
(* -------------------------------------------------------------------------- *)


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

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

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

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

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

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

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

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

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       КодРовно4-;
УКАЗ
  ПОКА
      (КодПозиция() ОСТАТОК 4) # 0
  ВЫП
       КодЦел1(0)
  КОН
КОН КодРовно4;

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

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

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       Подготовить-;
УКАЗ                                             (* Обнуление рабочих наборов *)
  опч:=ПУСТО;
  опз:=ПУСТО;
  отд:=ПУСТО;
  код:=ПУСТО
КОН Подготовить;

КОН ФО.
