Skip to content

Commit

Permalink
Merge branch 'develop' of https://github.com/EvilBeaver/oscript-library
Browse files Browse the repository at this point in the history
… into develop
  • Loading branch information
artbear committed Oct 23, 2015
2 parents a539f45 + 69ba636 commit 70c3aa3
Show file tree
Hide file tree
Showing 2 changed files with 162 additions and 47 deletions.
158 changes: 113 additions & 45 deletions src/cmdline/src/cmdline.os
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

Перем Лог;
Перем мПараметры;
Перем мПараметрыФлаги;
Перем мПозиционныеПараметры;

Перем мКоманды;
Expand All @@ -11,34 +10,37 @@
Перем мПозицияПозиционныхПараметров;
Перем мМассивВходныхПараметров;

Процедура ДобавитьПараметр(ИмяПараметра) Экспорт
Процедура ДобавитьПараметр(Знач ИмяПараметра, Знач Пояснение = "") Экспорт

Лог.Отладка("ДобавитьПараметр: ИмяПараметра <"+ИмяПараметра+">");

Ключ = Строка(ИмяПараметра);
мПозиционныеПараметры.Добавить(Ключ);
ДобавитьПараметрВТаблицу(мПозиционныеПараметры, ИмяПараметра, Пояснение, Ложь);

КонецПроцедуры

Процедура ДобавитьИменованныйПараметр(ИмяПараметра) Экспорт
Процедура ДобавитьИменованныйПараметр(Знач ИмяПараметра, Знач Пояснение = "") Экспорт

Лог.Отладка("ДобавитьИменованныйПараметр: ИмяПараметра <"+ИмяПараметра+">");

Ключ = Строка(ИмяПараметра);
мПараметры.Вставить(Ключ, Ключ);
ДобавитьПараметрВТаблицу(мПараметры, ИмяПараметра, Пояснение, Ложь);

КонецПроцедуры

Процедура ДобавитьПараметрФлаг(ИмяПараметра) Экспорт
Процедура ДобавитьПараметрФлаг(Знач ИмяПараметра, Знач Пояснение = "") Экспорт

Лог.Отладка("ДобавитьПараметрФлаг: ИмяПараметра <"+ИмяПараметра+">");

Ключ = Строка(ИмяПараметра);
мПараметрыФлаги.Вставить(Ключ, Ложь);
ДобавитьПараметрВТаблицу(мПозиционныеПараметры, ИмяПараметра, Пояснение, Истина);

КонецПроцедуры

Функция ОписаниеКоманды(Знач ИмяКоманды) Экспорт
Функция ОписаниеКоманды(Знач ИмяКоманды, Знач Пояснение = "") Экспорт

НовоеОписание = Новый Структура;
НовоеОписание.Вставить("Команда", ИмяКоманды);
НовоеОписание.Вставить("ПозиционныеПараметры", Новый Массив);
НовоеОписание.Вставить("ИменованныеПараметры", Новый Соответствие);
НовоеОписание.Вставить("ПараметрыФлаги", Новый Соответствие);
НовоеОписание.Вставить("Пояснение", Пояснение);
НовоеОписание.Вставить("ПозиционныеПараметры", НоваяТаблицаПараметров());
НовоеОписание.Вставить("ИменованныеПараметры", НоваяТаблицаПараметров());

Возврат НовоеОписание;

Expand All @@ -50,16 +52,16 @@

КонецПроцедуры

Процедура ДобавитьПозиционныйПараметрКоманды(Знач ОписаниеКоманды, Знач ИмяПараметра) Экспорт
ОписаниеКоманды.ПозиционныеПараметры.Добавить(ИмяПараметра);
Процедура ДобавитьПозиционныйПараметрКоманды(Знач ОписаниеКоманды, Знач ИмяПараметра, Знач Пояснение = "") Экспорт
ДобавитьПараметрВТаблицу(ОписаниеКоманды.ПозиционныеПараметры, ИмяПараметра, Пояснение, Ложь);
КонецПроцедуры

Процедура ДобавитьИменованныйПараметрКоманды(Знач ОписаниеКоманды, Знач ИмяПараметра) Экспорт
ОписаниеКоманды.ИменованныеПараметры.Вставить(ИмяПараметра, ИмяПараметра);
Процедура ДобавитьИменованныйПараметрКоманды(Знач ОписаниеКоманды, Знач ИмяПараметра, Знач Пояснение = "") Экспорт
ДобавитьПараметрВТаблицу(ОписаниеКоманды.ИменованныеПараметры, ИмяПараметра, Пояснение, Ложь);
КонецПроцедуры

Процедура ДобавитьПараметрФлагКоманды(Знач ОписаниеКоманды, Знач ИмяПараметра) Экспорт
ОписаниеКоманды.ПараметрыФлаги.Вставить(ИмяПараметра, ИмяПараметра);
Процедура ДобавитьПараметрФлагКоманды(Знач ОписаниеКоманды, Знач ИмяПараметра, Знач Пояснение = "") Экспорт
ДобавитьПараметрВТаблицу(ОписаниеКоманды.ПозиционныеПараметры, ИмяПараметра, Пояснение, Истина);
КонецПроцедуры

Функция РазобратьКоманду(Знач МассивПараметров) Экспорт
Expand All @@ -81,7 +83,7 @@
мПозицияВСпискеТокенов = 1;
мПозицияПозиционныхПараметров = 0;

РезультатКоманды.ЗначенияПараметров = РазобратьАргументы(ОписаниеКоманды.ИменованныеПараметры, ОписаниеКоманды.ПозиционныеПараметры, ОписаниеКоманды.ПараметрыФлаги);
РезультатКоманды.ЗначенияПараметров = РазобратьАргументы(ОписаниеКоманды.ИменованныеПараметры, ОписаниеКоманды.ПозиционныеПараметры);
Возврат РезультатКоманды;

КонецФункции
Expand All @@ -96,11 +98,6 @@
Лог.Отладка("ВходнойМассивПараметров <"+СокрЛП(Строка)+">");
КонецЕсли;

// Если ВходнойМассивПараметров.Количество() = 0 Тогда
// Лог.Отладка("Параметров не передали.");
// Возврат Новый Соответствие;
// КонецЕсли;

ОписаниеКоманды = Неопределено;
Если ВходнойМассивПараметров.Количество() > 0 Тогда
ОписаниеКоманды = мКоманды[ВходнойМассивПараметров[0]];
Expand All @@ -117,26 +114,79 @@
мПозицияПозиционныхПараметров = 0;
мПозицияВСпискеТокенов = 0;

Возврат РазобратьАргументы(мПараметры, мПозиционныеПараметры, мПараметрыФлаги);
Возврат РазобратьАргументы(мПараметры, мПозиционныеПараметры);
КонецЕсли;

КонецФункции

Функция СправкаПоПараметрам() Экспорт
Возврат ТаблицаСправкаПоПараметрам(мПараметры, мПозиционныеПараметры);
КонецФункции

Функция РазобратьАргументы(Знач ИменованныеПараметры, Знач ПозиционныеПараметры, Знач ПараметрыФлаги)
Функция СправкаПоКоманде(Знач ИмяКоманды) Экспорт

РезультатРазбора = Новый Соответствие;
ТаблицаСправкаПоКомандам = СправкаВозможныеКоманды();
Возврат ТаблицаСправкаПоКомандам.Найти(ИмяКоманды, "Команда");

КонецФункции

Функция СправкаВозможныеКоманды() Экспорт

ТаблицаСправка = Новый ТаблицаЗначений;
ТаблицаСправка.Колонки.Добавить("Команда");
ТаблицаСправка.Колонки.Добавить("Пояснение");
ТаблицаСправка.Колонки.Добавить("Параметры");

Для Каждого КлючИЗначение Из мКоманды Цикл
СтрСправка = ТаблицаСправка.Добавить();
ОписаниеКоманды = КлючИЗначение.Значение;

СтрСправка.Команда = ОписаниеКоманды.Команда;
СтрСправка.Пояснение = ОписаниеКоманды.Пояснение;
СправкаПоПараметрам = ТаблицаСправкаПоПараметрам(ОписаниеКоманды.ИменованныеПараметры, ОписаниеКоманды.ПозиционныеПараметры);
СтрСправка.Параметры = СправкаПоПараметрам;

КонецЦикла;

Возврат ТаблицаСправка;

КонецФункции

Функция ТаблицаСправкаПоПараметрам(Знач ИменованныеПараметры, Знач ПозиционныеПараметры)

ТабРезультат = НоваяТаблицаПараметров();
ТабРезультат.Колонки.Добавить("ЭтоИменованныйПараметр");

Для Каждого КлючЗначение Из ПараметрыФлаги Цикл
Лог.Отладка("Сбрасываю параметр-флаг: " + КлючЗначение.Ключ);
РезультатРазбора[КлючЗначение.Ключ] = Ложь;
Для Каждого Стр Из ИменованныеПараметры Цикл
СтрРезультат = ТабРезультат.Добавить();
ЗаполнитьЗначенияСвойств(СтрРезультат, Стр);
СтрРезультат.ЭтоИменованныйПараметр = Истина;
КонецЦикла;

Для Каждого Стр Из ПозиционныеПараметры Цикл
СтрРезультат = ТабРезультат.Добавить();
ЗаполнитьЗначенияСвойств(СтрРезультат, Стр);
СтрРезультат.ЭтоИменованныйПараметр = Ложь;
КонецЦикла;

Возврат ТабРезультат;

КонецФункции

Функция РазобратьАргументы(Знач ИменованныеПараметры, Знач ПозиционныеПараметры)

РезультатРазбора = Новый Соответствие;

Если мМассивВходныхПараметров.Количество() = 0 Тогда
Лог.Отладка("Параметров не передали.");
Возврат РезультатРазбора;
КонецЕсли;

Для Каждого СтрПараметр Из ПозиционныеПараметры.НайтиСтроки(Новый Структура("ЭтоФлаг",Истина)) Цикл
Лог.Отладка("Сбрасываю параметр-флаг: " + СтрПараметр.Имя);
РезультатРазбора[СтрПараметр.Имя] = Ложь;
КонецЦикла;

Пока Истина Цикл

Токен = СледующийТокен();
Expand All @@ -148,17 +198,17 @@

Если ЭтоИменованныйПараметр(Токен, ИменованныеПараметры) Тогда
Лог.Отладка("Это именованный параметр: " + Токен);
РезультатРазбора[Токен] = СледующийОбязательныйТокен();
РезультатРазбора[Токен] = СледующийОбязательныйТокен(Токен);
Лог.Отладка("Нашли значение именованного параметра: " + РезультатРазбора[Токен]);
ИначеЕсли ЭтоПараметрФлаг(Токен, ПараметрыФлаги) Тогда
ИначеЕсли ЭтоПараметрФлаг(Токен, ПозиционныеПараметры) Тогда
Лог.Отладка("Это параметр-флаг: " + Токен);
РезультатРазбора[Токен] = Истина;
Лог.Отладка("Нашли параметр-флаг: " + РезультатРазбора[Токен]);
Иначе
ИмяПараметра = ВыбратьСледующееИмяПозиционногоПараметра(ПозиционныеПараметры);
Лог.Отладка("Установлено значение позиционного параметра <" + ИмяПараметра + " = " + Токен + ">");
РезультатРазбора[ИмяПараметра] = Токен;
КонецЕсли
КонецЕсли;

КонецЦикла;

Expand All @@ -177,39 +227,57 @@
Возврат Токен;
КонецФункции

Функция СледующийОбязательныйТокен()
Функция СледующийОбязательныйТокен(Знач ИскомыйПараметр)
Токен = СледующийТокен();
Если Токен = Неопределено Тогда
ВызватьИсключение "Ожидается значение параметра, хз какого";
ВызватьИсключение "Ожидается значение параметра " + ИскомыйПараметр;
КонецЕсли;
Возврат Токен;
КонецФункции

Функция ЭтоИменованныйПараметр(Знач Токен, Знач ИменованныеПараметры)
Возврат ИменованныеПараметры[Токен] <> Неопределено;
Возврат ИменованныеПараметры.Найти(Токен, "Имя") <> Неопределено;
КонецФункции

Функция ЭтоПараметрФлаг(Знач Токен, Знач ПараметрыФлаги)
Возврат ПараметрыФлаги[Токен] <> Неопределено;
Функция ЭтоПараметрФлаг(Знач Токен, Знач ПозиционныеПараметры)
СтрПараметр = ПозиционныеПараметры.Найти(Токен, "Имя");
Возврат СтрПараметр <> Неопределено и СтрПараметр.ЭтоФлаг;
КонецФункции

Функция ВыбратьСледующееИмяПозиционногоПараметра(Знач ПозиционныеПараметры)
Если мПозицияПозиционныхПараметров = ПозиционныеПараметры.Количество() Тогда
ВызватьИсключение "Ожидается наличие позиционного параметра";
КонецЕсли;

Имя = ПозиционныеПараметры[мПозицияПозиционныхПараметров];
СтрПараметр = ПозиционныеПараметры[мПозицияПозиционныхПараметров];
мПозицияПозиционныхПараметров = мПозицияПозиционныхПараметров + 1;
Возврат Имя;
Возврат СтрПараметр.Имя;
КонецФункции

Процедура Инит()
Лог = Логирование.ПолучитьЛог("oscript.lib.cmdline");

мПараметры = Новый Соответствие;
мПараметрыФлаги = Новый Соответствие;
мПозиционныеПараметры = Новый Массив;
мПараметры = НоваяТаблицаПараметров();
мПозиционныеПараметры = НоваяТаблицаПараметров();
мКоманды = Новый Соответствие;
КонецПроцедуры

Функция НоваяТаблицаПараметров()

Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Имя");
Таблица.Колонки.Добавить("ЭтоФлаг");
Таблица.Колонки.Добавить("Пояснение");

Возврат Таблица;

КонецФункции

Процедура ДобавитьПараметрВТаблицу(Знач Таблица, Знач Имя, Знач Пояснение, Знач Флаг)
СтрПараметр = Таблица.Добавить();
СтрПараметр.Имя = Строка(Имя);
СтрПараметр.ЭтоФлаг = Флаг;
СтрПараметр.Пояснение = Пояснение;
КонецПроцедуры

Инит();
Loading

0 comments on commit 70c3aa3

Please sign in to comment.