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

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

  Запуск,
  Настрой;

ПЕР
                              (* имя преобразуемого отдела *)
  отдИмяФ:Файл.ВПолного;  
                              (* путь к "СРЕДА.отд" *)
  срдМесто:Файл.ВПути; 
                              (* множество ключей преобразования *)
  настройки:МНОЖ;         
                              (* свод настроек *)
  свод:ЦЕЛ;

(******************************************************************************)
ЗАДАЧА Подсказка();
(* Цель:  вывести на экран правила применения МПГ и окончить работу *)

  ЗАДАЧА ПоставитьМетку(настройка:ЦЕЛ);
  УКАЗ
    ЕСЛИ настройка В настройки ТО НаЭкран.ВсяЦепь('*') ИНАЧЕ НаЭкран.ВсяЦепь(' ') КОН;
  КОН ПоставитьМетку;
   
УКАЗ
  НаЭкран.ВсяЦепь('Малый Преобразователь Глагола в АРМ код.');
  НаЭкран.ВсяЦепь('^Выпуск www.glagol.nad.ru от __.__.2009.');
  НаЭкран.ВсяЦепь('^Применение:  МПГ [настройка [настройка]] отдел');
  НаЭкран.ВсяЦепь('^отдел     - имя исходного файла (расширение ".отд")');
  НаЭкран.ВсяЦепь('^настройка - любое из:');
  НаЭкран.ВсяЦепь('^ -п    ');

  ПоставитьМетку(Настрой.ПровНомера);

  НаЭкран.ВсяЦепь(' включить проверки времени выполнения');
  НаЭкран.ВсяЦепь('^ -о    ');

  ПоставитьМетку(Настрой.ОтлДанные);

  НаЭкран.ВсяЦепь(' включить данные для отладчика');
  НаЭкран.ВсяЦепь('^         ("*" - отметка уже включенных настроек)');
  НаЭкран.ВсяЦепь('^ -н-     отключить настройку "н"');
  НаЭкран.ВсяЦепь('^ -кКлюч  ключ для "ЗАДАНО"');
  НаЭкран.ВсяЦепь('^ --Ключ  ключ для оболочки');
  НаЭкран.ВсяЦепь('^ -сПуть  путь к "СРЕДА.отд", текущий путь: "');
  НаЭкран.ВсяЦепь(срдМесто);
  НаЭкран.ВсяЦепь('".^Предварительно настройки считываются из "Настройки.МПГ".');
  СТОП(1)
КОН Подсказка;
 
(******************************************************************************)
ЗАДАЧА РазобратьЦепь(цепь+:ЦЕПЬ);
(* Цель:  обработать <цепь>, содержащую одну настройку
 * До:    <настройки>
 * После: <отдИмяФ> <срдМесто> <настройки> *)
ПЕР
  настройка:МНОЖ;
  добавить:КЛЮЧ;
  поз:ЦЕЛ;
УКАЗ
  настройка:={};
  ЕСЛИ (цепь[0] = '-') ИЛИ (цепь[0] = '/') ТО
    ЕСЛИ цепь[2] = '-' ТО
      добавить:=ОТКЛ
    ИНАЧЕ
      добавить:=ВКЛ
    КОН;
    ВЫБРАТЬ цепь[1] ИЗ
    | 'п': 
        настройка:={Настрой.ПровНомера,  Настрой.ПровПереполн,
                    Настрой.ПровПределов,Настрой.ПровПусто,
                    Настрой.ПровБегунка, Настрой.ПровНуля,
                    Настрой.ДостВПусто,  Настрой.ВклПроверить}
    | 'о': 
        настройка:={Настрой.ОтлДанные}
    | 'с': 
        оЦепи.Удалить(цепь,0,2); (* '-с' *)
        СПИСАТЬ(цепь,срдМесто)
    | 'к': 
        оЦепи.Удалить(цепь,0,2); (* '-к' *)
        Настрой.ДобавитьКлюч(цепь)
    ИНАЧЕ
      ЕСЛИ цепь[1] # '-' ТО (* для оболочки *)
        НаЭкран.ВсяЦепь('Ошибка в настройке: ');
        НаЭкран.ВсяЦепь(цепь);
        НаЭкран.ВсяЦепь('^');
        Подсказка()
      КОН
    КОН;
    ЕСЛИ добавить ТО
      настройки:=настройки+настройка
    ИНАЧЕ
      настройки:=настройки-настройка
    КОН;
                                                     (* расчёт свода настроек *)
    ОТ поз:=0 ДО ДЛИНА(цепь)-1 ВЫП
      УВЕЛИЧИТЬ(свод,ВЦЕЛ(цепь[поз]))
    КОН
  ИНАЧЕ
    СПИСАТЬ(цепь,отдИмяФ)
  КОН
КОН РазобратьЦепь;

(******************************************************************************)
ЗАДАЧА РазобратьПараметры();
(* Цель:  обработать командную строку МПГ
 * После: <отдИмяФ>, <срдМесто>, <настройки> *)
ПЕР
  номПар:ЦЕЛ;
  цепь:ЦЕПЬ[100];
УКАЗ
  ОТ номПар:=1 ДО Параметр.всего-1 ВЫП
    Параметр.Втекст(номПар,цепь);
    РазобратьЦепь(цепь)
  КОН
КОН РазобратьПараметры;

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

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

(*-ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss-*)
УКАЗ
  (* начальные значения *)
  настройки:={Настрой.ПровНомера,Настрой.ПровПереполн,Настрой.ПровПределов,
              Настрой.ПровПусто, Настрой.ПровБегунка, Настрой.ПровНуля,
              Настрой.ДостВПусто,Настрой.ВклПроверить};
  отдИмяФ:='';
  срдМесто:='.';
  свод:=Настрой.ПоколениеПГ;
                                                  (* считываем новые значения *)
  ПрочитатьНастройки;
                                          (* запускаем преобразование отделов *)
  Запуск.ПреобрОтделы(отдИмяФ,срдМесто,настройки,свод)
КОН МПГ.
