Skip to content

Commit

Permalink
native seporator (#77)
Browse files Browse the repository at this point in the history
  • Loading branch information
Nivanchenko authored Nov 12, 2024
1 parent 4c46b5a commit ffacdc0
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 53 deletions.
2 changes: 1 addition & 1 deletion packagedef
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@


Описание.Имя("winow")
.Версия("0.8.3")
.Версия("0.8.4")
.Автор("Никита Иванченко")
.АдресАвтора("https://github.com/Nivanchenko")
.Описание("Минималистичный веб-сервер на нативном OneScript")
Expand Down
74 changes: 22 additions & 52 deletions src/Классы/Парсеры.os
Original file line number Diff line number Diff line change
Expand Up @@ -38,30 +38,29 @@
КонецФункции

Функция РазделитьДвоичныеДанныеРазделителем(ДвоичныеДанные, Разделитель) Экспорт
БайтыРазделителя = ПолучитьМассивБайт(Разделитель);
ТекущийПорядокБайт = Новый Массив(БайтыРазделителя.Количество());
БуферДвоичныхДанных = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ДвоичныеДанные);

Лево = Неопределено;
Право = Неопределено;
Чтение = Новый ЧтениеДанных(ДвоичныеДанные);

Пока не Чтение.ЧтениеЗавершено Цикл
ТекБайт = Чтение.Прочитать(1).ПолучитьДвоичныеДанные();
ДобавитьВМассивСоСмещением(ТекущийПорядокБайт, ТекБайт);
Массив = БуферДвоичныхДанных.Разделить(ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(Разделитель));

Если МассивыРавны(БайтыРазделителя, ТекущийПорядокБайт) Тогда
Право = Чтение.Прочитать().ПолучитьДвоичныеДанные();
Чтение.Закрыть();
Прервать;
КонецЕсли;
КонецЦикла;
Если Массив.Количество() > 0 Тогда

Чтение = Новый ЧтениеДанных(ДвоичныеДанные);
Лево = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(Массив[0]);

Если Право = Неопределено или Право.Размер() = 0 Тогда
Лево = Чтение.Прочитать().ПолучитьДвоичныеДанные();
Иначе
ЧитатьПо = ДвоичныеДанные.Размер() - Разделитель.Размер() - Право.Размер();
Лево = Чтение.Прочитать(ЧитатьПо).ПолучитьДвоичныеДанные();
Если Массив.Количество() > 1 Тогда

МассивПраво = Новый Массив();

Для Счетчик = 1 По Массив.Количество() - 1 Цикл
МассивПраво.Добавить(ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(Массив[Счетчик]));
КонецЦикла;

Право = СоединитьДвоичныеДанные(МассивПраво);

КонецЕсли;

КонецЕсли;

Возврат Новый Структура("Лево, Право", Лево, Право);
Expand All @@ -70,43 +69,14 @@

Функция РазделитьДвоичныеДанныеРазделителемВМассив(Знач ДвоичныеДанные, Разделитель, ВКлючатьПустые = Ложь) Экспорт

РазмерРазделителя = Разделитель.Размер();

Поток = ДвоичныеДанные.ОткрытьПотокДляЧтения();

РазмерТела = Поток.Размер();
БуферДвоичныхДанных = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ДвоичныеДанные);

Массив = БуферДвоичныхДанных.Разделить(ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(Разделитель));

Результат = Новый Массив();

Счетчик = 0;
Прочитано = 0;

Пока Счетчик <= РазмерТела Цикл

Остаток = РазмерТела - Счетчик;

Если РазмерРазделителя > Остаток Тогда
Результат.Добавить(ПолучитьИзПотокаДД(Поток, Прочитано, РазмерТела - Прочитано));
Прервать;
КонецЕсли;

ИскомыйРазделитель = ПолучитьИзПотокаДД(Поток, Счетчик, РазмерРазделителя);

Если ИскомыйРазделитель = Разделитель
И не Счетчик = Прочитано Тогда
Результат.Добавить(ПолучитьИзПотокаДД(Поток, Прочитано, Счетчик - Прочитано));
Счетчик = Счетчик + РазмерРазделителя;
Прочитано = Счетчик;
Продолжить;

ИначеЕсли
ИскомыйРазделитель = Разделитель
И Счетчик = Прочитано Тогда
Прочитано = Прочитано + РазмерРазделителя;
КонецЕсли;

Счетчик = Счетчик + 1;

Для Каждого Элемент Из Массив Цикл
Результат.Добавить(ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(Элемент));
КонецЦикла;

Возврат Результат;
Expand Down

0 comments on commit ffacdc0

Please sign in to comment.