Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

native seporator #77

Merged
merged 1 commit into from
Nov 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 @@
КонецФункции

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

Comment on lines +41 to +42
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Проверьте входные параметры на заполненность

Функции ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных могут возникать ошибки, если ДвоичныеДанные или Разделитель не заполнены. Рекомендуется добавить проверки на заполненность входных параметров перед их использованием.

Примените следующий дифф для добавления проверок:

+	Если НЕ ЗначениеЗаполнено(ДвоичныеДанные) Тогда
+		Возврат Новый Структура("Лево, Право", Неопределено, Неопределено);
+	КонецЕсли;
+
+	Если НЕ ЗначениеЗаполнено(Разделитель) Тогда
+		Возврат Новый Структура("Лево, Право", ДвоичныеДанные, Неопределено);
+	КонецЕсли;
	
	БуферДвоичныхДанных = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ДвоичныеДанные);

Committable suggestion skipped: line range outside the PR's diff.

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

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

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

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

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

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

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

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

КонецЕсли;

КонецЕсли;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Для Каждого Элемент Из Массив Цикл
Результат.Добавить(ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(Элемент));
Comment on lines +72 to +79
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Учтите параметр 'ВКлючатьПустые' при формировании результата

В функции РазделитьДвоичныеДанныеРазделителемВМассив параметр ВКлючатьПустые не используется. Рекомендуется добавить логику для его обработки, чтобы соответствовать ожидаемому поведению функции.

Примените следующий дифф для исправления:

	Для Каждого Элемент Из Массив Цикл
+		Если ВКлючатьПустые ИЛИ Элемент.Размер() > 0 Тогда
			Результат.Добавить(ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(Элемент));
+		КонецЕсли;
	КонецЦикла;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
БуферДвоичныхДанных = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ДвоичныеДанные);
Массив = БуферДвоичныхДанных.Разделить(ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(Разделитель));
Результат = Новый Массив();
Счетчик = 0;
Прочитано = 0;
Пока Счетчик <= РазмерТела Цикл
Остаток = РазмерТела - Счетчик;
Если РазмерРазделителя > Остаток Тогда
Результат.Добавить(ПолучитьИзПотокаДД(Поток, Прочитано, РазмерТела - Прочитано));
Прервать;
КонецЕсли;
ИскомыйРазделитель = ПолучитьИзПотокаДД(Поток, Счетчик, РазмерРазделителя);
Если ИскомыйРазделитель = Разделитель
И не Счетчик = Прочитано Тогда
Результат.Добавить(ПолучитьИзПотокаДД(Поток, Прочитано, Счетчик - Прочитано));
Счетчик = Счетчик + РазмерРазделителя;
Прочитано = Счетчик;
Продолжить;
ИначеЕсли
ИскомыйРазделитель = Разделитель
И Счетчик = Прочитано Тогда
Прочитано = Прочитано + РазмерРазделителя;
КонецЕсли;
Счетчик = Счетчик + 1;
Для Каждого Элемент Из Массив Цикл
Результат.Добавить(ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(Элемент));
БуферДвоичныхДанных = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ДвоичныеДанные);
Массив = БуферДвоичныхДанных.Разделить(ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(Разделитель));
Результат = Новый Массив();
Для Каждого Элемент Из Массив Цикл
Если ВКлючатьПустые ИЛИ Элемент.Размер() > 0 Тогда
Результат.Добавить(ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(Элемент));
КонецЕсли;

КонецЦикла;

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