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

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

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

  ЗП,
  НП;

ПОСТ
  ПоколениеПГ = 2; (* увеличить для перЕобразования .obj и .опг файлов *)

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


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

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

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

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

(*-------------------------------------------главная ЗАДАЧА-------------------*)
ЗАДАЧА Голова;
ПЕР
  пимя:Файл.ВПолного;
  путь:Файл.ВПути;
   имя:Файл.ВИмени;
   тип:Файл.ВТипа;
УКАЗ
  настройки:={НП.ПровНомера,НП.ПровПереполн,НП.ПровПределов,НП.ПровПусто,НП.ПровБегунка,НП.ПровНуля,НП.ДостВПусто,НП.ВклПроверить};
  отдИмяФ:='';
  срдПуть:='.';
  свод:=ПоколениеПГ;

  Параметр.Втекст(0,пимя);
      Файл.РазобратьИмя(пимя,путь,имя,тип);
      Файл.СобратьИмя(пимя,путь,"Настройки","ПГ");

  РазобратьФайл(пимя);
  РазобратьПараметры;
  ЕСЛИ
       НЕ (НП.КодДляМСборки В настройки)
  ТО
    настройки:=настройки-{НП.ОтлДанные}
  КОН;
  ЕСЛИ
       Параметр.всего = 1 ТО Подсказка
  КОН;
  ЗП.ПреобрОтделы(отдИмяФ,срдПуть,настройки,свод)
КОН Голова;

УКАЗ
  Голова
КОН ПГ.
