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

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

  ИзФайла ИЗ "..\..\Отделы\Обмен\ВводВывод\",
  НаЭкран ИЗ "..\..\Отделы\Обмен\ВводВывод\",
Настройки ИЗ "..\..\Отделы\Обмен\ВводВывод\",

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

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

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

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

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

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

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

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