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

ИСПОЛЬЗУЕТ 
  ОБХОД,
        (*  \Глагол\              *)
ЧэргаСлеД ИЗ "..\..\Отделы\Иное\";

ПОСТ
                                              (* размеры данных простых видов *)
  рЗнак-   = 2;
  рКлюч-   = 1;
  рМнож-   = 4;
  рЦел8-   = 1;
  рЦел16-  = 2;
  рЦел32-  = 4;
  рЦел64-  = 8;
  рВещ32-  = 4;
  рВещ64-  = 8;
  рЗадача- = 4; (* вид ЗАДАЧА *)
  рДоступ- = 4; (* вид ДОСТУП *)
  рЯчейка- = 1; (* ОБХОД.Ячейка *)
                                  (* предельные значения данных простых видов *)
  МинЗнак-   = ВЦЕЛ(МИН(ЗНАК));
  МаксЗнак-  = ВЦЕЛ(МАКС(ЗНАК));
  МинЦел8-   = МИН(ОБХОД.Цел8);
  МаксЦел8-  = МАКС(ОБХОД.Цел8);
  МинЦел16-  = МИН(ОБХОД.Цел16);
  МаксЦел16- = МАКС(ОБХОД.Цел16);
  МинЦел32-  = МИН(ОБХОД.Цел32);
  МаксЦел32- = МАКС(ОБХОД.Цел32);
  МинЦел64-  = МИН(ОБХОД.Цел64);
  МаксЦел64- = МАКС(ОБХОД.Цел64);
  МинВещ32-  = МИН(ОБХОД.Вещ32);
  МаксВещ32- = МАКС(ОБХОД.Вещ32);
  МинВещ64-  = МИН(ОБХОД.Вещ64);
  МаксВещ64- = МАКС(ОБХОД.Вещ64);
  МаксМнож-  = МАКС(МНОЖ);
                                                (* наибольший размер названия *)
  длинаНазвания- =32;
                                           (* настройки числового считывателя *)

  ВсегоЦифр16- = 16;  (* наибольшее число цифр у шестнадцатеричного Цел64 *)
  МаксЭксп-    = 38;  (* ограничение Вещ32 экспоненты *)
  МаксШирЭксп- =308;  (* ограничение Вещ64 экспоненты *)

   (* начальное значение адреса, не должно совпадать с существующими адресами *)
  АдрНеопр-     =  -1;
                              (* ограничение числа выборов в указании ВЫБРАТЬ *)
  ВсегоВыборов- = 512;
            (*
             * ограничение разброса в указании ВЫБРАТЬ,
             * т.к. размер таблицы переходов ~= большая метка - меньшая метка
             *)
  РазбросВыборов-=512;
                              (* виды отделов *)
  отдел-     =0;
  описание-  =1;
  приложение-=2;

ВИД
  Имя- = ЦЕПЬ[НП.длинаНазвания];
  
ПЕР
    отдВид-:ЦЕЛ;
    отдИмя-:НП.Имя;
  рБегунок-:ЦЕЛ; (* 3*4 для тек.адр, нач.адр, кон.адр или 4 для тек.адр *)


(*----------------------------------------------------------------------------*)
                           (* настройки преобразования *.отд *)
ПОСТ
                                     (* признаки *)
  ПровНомера-   =0;  
  ПровПереполн- =1;
  ПровПределов- =2;
  ПровПусто-    =3;    
  ПровБегунка-  =4;    
  ПровНуля-     =5;    
  ДостВПусто-   =6;  
  ВклПроверить- =7;
  ОтлДанные-    =8;   
  КодДляМСборки-=9;   
  
ПЕР
                                        (* ключи *)
  клПровНомера-   :КЛЮЧ;
  клПровПереполн- :КЛЮЧ;
  клПровПределов- :КЛЮЧ;
  клПровПусто-    :КЛЮЧ;
  клПровНуля-     :КЛЮЧ;
  клПровБегунка-  :КЛЮЧ;
  клДостВПусто-   :КЛЮЧ;
  клВклПроверить- :КЛЮЧ;
  клОтлДанные-    :КЛЮЧ;
  клКодДляМСборки-:КЛЮЧ;
                   (* сразу все множество ключей *)
  настройки-:МНОЖ;
                                (* свод настроек *)
  свод-:ЦЕЛ;

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


(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       УстОтдел-(имя-:НП.Имя; вид:ЦЕЛ);
УКАЗ
  отдИмя:=имя;
  отдВид:=вид
КОН УстОтдел;

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

  ЧэргаСлеД.ДобавитьНовЗвеноВконСписка(ключи,ключД)

КОН ДобавитьКлюч;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       ЕстьКлюч-(имя-:ЦЕПЬ):КЛЮЧ;
ПЕР
(*ключД:ДкКлючу;*)
         звеноД:ЧэргаСлеД.ДкЗвену_телоД;
УКАЗ                               (* ключи - список вида очередь *)
(*
   Обход списка с 1-го звена до N-го, т.е. пока звеноД.слеД # ПУСТО
 *)
         звеноД:=ЧэргаСлеД.Дк1муЗвену(ключи);
  ПОКА
         звеноД # ПУСТО
  ВЫП
    ЕСЛИ                                                    (* преобразование полиморфное  
                телоД         из ЧэргаСлеД.ДкПустомуНабору в
                      ДкКлючу <- ЧэргаСлеД.ДкПустомуНабору                    *)
         звеноД.телоД(ДкКлючу).имя = имя
                     (*  ключД.имя = имя  *)
    ТО
      ВОЗВРАТ ВКЛ
    КОН;
         звеноД:=звеноД.слеД
  КОН;
      ВОЗВРАТ ОТКЛ
КОН ЕстьКлюч;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       Подготовить-(настройки:МНОЖ;
                         свод:ЦЕЛ);
УКАЗ
  НП.настройки:=настройки;
  НП.свод:=свод;
  клПровНомера   :=ПровНомера    В настройки;
  клПровПереполн :=ПровПереполн  В настройки;
  клПровПределов :=ПровПределов  В настройки;
  клПровПусто    :=ПровПусто     В настройки;
  клПровБегунка  :=ПровБегунка   В настройки;
  клПровНуля     :=ПровНуля      В настройки;
  клДостВПусто   :=ДостВПусто    В настройки;
  клВклПроверить :=ВклПроверить  В настройки;
  клОтлДанные    :=ОтлДанные     В настройки;
  клКодДляМСборки:=КодДляМСборки В настройки;
  ЕСЛИ клПровБегунка ТО
    рБегунок:=4*3
  ИНАЧЕ
    рБегунок:=4
  КОН
КОН Подготовить;
(*
(*-ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss-*)
УКАЗ
  ЧэргаСлеД.ОчиститьСписок(ключи)
*)
КОН НП.
