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

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

   ВФайл  ИЗ "..\..\Отделы\Обмен\ВводВывод\",

   ФО, ОО;

ВИД
  ДкЗадаче = ДОСТУП К (*нЗадача;
                        нЗадача =*) НАБОР
          имя :Пустой.ДкЦепи;
          слеД:ДкЗадаче
                                    КОН;
(*  Библиотека = ДОСТУП К НАБОР*)
  ДкБиблиотеке = ДОСТУП К (*нБиблиотека;
                            нБиблиотека =*) НАБОР
          имя :Пустой.ДкЦепи;
          слеД:ДкБиблиотеке;
    всегоЗадач:ЦЕЛ;
       задачиД:ДкЗадаче                                (* начало списка задач *)
                                            КОН;

ПЕР
  внешБиблиотекаД:ДкБиблиотеке;            (* начало списка внешних библиотек *)
     iБиблиотеки :ЦЕЛ;
       перЗадачи :ДкЗадаче;        (* передаваемые из головного отдела задачи *)


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

  библиотекаД.задачиД:=задачаД;
  библиотекаД.всегоЗадач:=1;
                    (* добавляем библиотеку в начало списка <внешБиблиотекаД> *)
  библиотекаД.слеД:=внешБиблиотекаД;
  внешБиблиотекаД:=библиотекаД;
  УВЕЛИЧИТЬ(iБиблиотеки)
КОН Добавить;

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

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       Чтение-;                (*  Цель: чтение из файла данных о библиотеках *)
ПЕР
  имяБиблиотеки,
  имяЗадачи     :Пустой.ДкЦепи;
    iбиблиотека,
 всехБиблиотек,
    jзадача,
 всехЗадач      :ЦЕЛ;
УКАЗ
             ФО.ОпчЦел(всехБиблиотек);
  ОТ iбиблиотека:=1 ДО всехБиблиотек ВЫП
           ФО.ОпчПЦепь(имяБиблиотеки);
           ФО.ОпчЦел(всехЗадач);
    ОТ jзадача:=1 ДО всехЗадач ВЫП
      ФО.ОпчПЦепь(имяЗадачи);

      Добавить(имяБиблиотеки,
               имяЗадачи)
    КОН
  КОН
КОН Чтение;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       ДобавитьПерЗадачу-(имяЗадачи-:ЦЕПЬ);
(*
    Цель: добавить новую передаваемую задачу в начало списка <перЗадачи>
 *)
ПЕР
          задачаД:ДкЗадаче;
УКАЗ
  СОЗДАТЬ(задачаД);
  СОЗДАТЬ(задачаД.имя,имяЗадачи);
  задачаД.слеД:=перЗадачи;
     перЗадачи:=задачаД
КОН ДобавитьПерЗадачу;

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

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

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       ПринЗадачиДляMSLink-;
(*
     Цель: вывод в текстовый файл данных о принимаемых задачах
 *)
ПЕР
  библиотекаД:ДкБиблиотеке;
      задачаД:ДкЗадаче;
  пКоманд,
  пБиблиотеки,
  пСписка :ВФайл.ДкПотоку;
  имяФайла: Файл.ВПолного;
ПОСТ
  имяФайлаКоманд = "СписокПБ.bat";
  имяФайлаСписка = "Biblioteki.spi";
УКАЗ
  пКоманд:=ВФайл.Открыть(имяФайлаКоманд);
  ЕСЛИ пКоманд = ПУСТО ТО
    ОО.Отметить(ОО.ФАЙЛ_НЕ_ОТКРЫВАЕТСЯ,имяФайлаКоманд)
  КОН;
  пКоманд.цВидЗнаков:=ВФайл.знДос;
  пСписка:=ВФайл.Открыть(имяФайлаСписка);
  ЕСЛИ пСписка = ПУСТО ТО
    ОО.Отметить(ОО.ФАЙЛ_НЕ_ОТКРЫВАЕТСЯ,имяФайлаСписка)
  КОН;
  пСписка.цВидЗнаков:=ВФайл.знВин;
  библиотекаД:=внешБиблиотекаД;
  ПОКА библиотекаД # ПУСТО ВЫП
    (* вывод строчки в пКоманд *)
    Файл.СобратьИмя(имяФайла,ФО.выхПуть,библиотекаД.имя^,"^");
   оЦепи.Вставить("call ПБ ",имяФайла,0);
    ВФайл.ЦепьЗнаков(пКоманд,имяФайла);
    (* вывод в список библиотек *)
    Файл.СобратьИмя(имяФайла,ФО.выхПуть,библиотекаД.имя^,"lib^");
    ВФайл.ЦепьЗнаков(пСписка,имяФайла);
    (* вывод .def файла *)
    Файл.СобратьИмя(имяФайла,ФО.выхПуть,библиотекаД.имя^,"def");
    пБиблиотеки:=ВФайл.Открыть(имяФайла);
    ЕСЛИ пБиблиотеки = ПУСТО ТО
      ОО.Отметить(ОО.ФАЙЛ_НЕ_ОТКРЫВАЕТСЯ,имяФайла)
    КОН;
    пБиблиотеки.цВидЗнаков:=ВФайл.знВин;
    ВФайл.ЦепьЗнаков(пБиблиотеки,'LIBRARY "');
    ВФайл.ЦепьЗнаков(пБиблиотеки,библиотекаД.имя^);
    ВФайл.ЦепьЗнаков(пБиблиотеки,'"^EXPORTS');
    задачаД:=библиотекаД.задачиД;
    ПОКА задачаД # ПУСТО ВЫП
      ВФайл.ЦепьЗнаков(пБиблиотеки,"^  ");
      ВФайл.ЦепьЗнаков(пБиблиотеки,задачаД.имя^);
      задачаД:=задачаД.слеД
    КОН;
    ВФайл.Закрыть(пБиблиотеки);
    библиотекаД:=библиотекаД.слеД
  КОН;
  ВФайл.Закрыть(пКоманд);
  ВФайл.Закрыть(пСписка)
КОН ПринЗадачиДляMSLink;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       ПринЗадачиДляALink-;
(*
    Цель: вывод в текстовый файл данных о принимаемых задачах
 *)
ПЕР
  библиотекаД:ДкБиблиотеке;
      задачаД:ДкЗадаче;

    потокД:ВФайл.ДкПотоку;
  имяФайла: Файл.ВПолного;
УКАЗ
  Файл.СобратьИмя(имяФайла,ФО.выхПуть,"ПринЗадачи","asm");
  потокД:=ВФайл.Открыть(имяФайла);
  ЕСЛИ потокД = ПУСТО ТО
    ОО.Отметить(ОО.ФАЙЛ_НЕ_ОТКРЫВАЕТСЯ,имяФайла)
  КОН;
  потокД.цВидЗнаков:=ВФайл.знВин;
  библиотекаД:=внешБиблиотекаД;
  ПОКА библиотекаД # ПУСТО ВЫП
    задачаД:=библиотекаД.задачиД;
    ПОКА задачаД # ПУСТО ВЫП
      ВФайл.ЦепьЗнаков(потокД,"import ");
      ВФайл.ЦепьЗнаков(потокД,задачаД.имя^);
      ВФайл.ЦепьЗнаков(потокД," ");
      ВФайл.ЦепьЗнаков(потокД,библиотекаД.имя^);
      ВФайл.ЦепьЗнаков(потокД,"^global ");
      ВФайл.ЦепьЗнаков(потокД,задачаД.имя^);
      ВФайл.ЦепьЗнаков(потокД,"^");
      задачаД:=задачаД.слеД
    КОН;
    библиотекаД:=библиотекаД.слеД
  КОН;
  ВФайл.Закрыть(потокД)
КОН ПринЗадачиДляALink;

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

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       Завершить-;
УКАЗ
  ПЗ.Подготовить
КОН Завершить;

КОН ПЗ.
 