RU.GOLDED --------------- < Пред. | След. > -- < @ > -- < Сообщ. > -- < Эхи > --
 Nп/п : 44 из 100
 От   : Nil A                               2:5015/46         05 мар 26 03:53:08
 К    : Stas Mishchenkov                                      05 мар 26 03:56:01
 Тема : GoldEd+ Corrupts UUE Encoded Messages
----------------------------------------------------------------------------------
                                                                                 
@MSGID: 2:5015/46 69a8d473
@REPLY: 2:5015/46 69a8ced6
@CHRS: CP866 2
@TZUTC: 0300
@TID: hpt/lnx 1.9
Hello, Stas!

Thursday March 05 2026 03:22, from Nil A -> Stas Mishchenkov:

 SM>> Глюк возникает именно при сохранении сообщения. Неводится дед на
 SM>> определённую последовательность символов.

 NA> Буду с помощью ИИ чинить. Но видишь подход, я протестировал разный
 NA> вход/выход у голдеда, чтобы у кодинг-агента была инфа что чинить ;-)

#### Анализ первопричины
 Порча данных вызвана тем, что Внутренний Редактор (IE) и Процессор
Сообщений неправильно интерпретируют данные, закодированные в UUE, как цитаты
сообщений. Это приводит к применению некорректной логики переноса строк и
объединения к бинарным данным.

1.  **Ошибочное определение цитаты (`golded3/geutil.cpp`)**:
    - Функция: `is_quote(const char* ptr)`
  - Логика: Сканирует первые 11 символов строки. Если находит символ
цитаты (по умолчанию `>`) после некоторых "инициалов" (любые символы, не
входящие в `Quotestops` или пробелы), возвращает `true`.
  - Срабатывание: Корректные UUE-строки часто начинаются с символа
длины (например, `M`) и могут содержать символ `>` в первых позициях
(например, `M)>:FM...`). Это приводит к тому, что строка помечается как
`GLINE_QUOT`.

2.  **Агрессивное объединение абзацев (`golded3/geline.cpp`)**:
    - Функция: `MakeLineIndex(...)`
  - Логика: При обработке текста сообщения ищет последовательные
строки с одинаковым префиксом цитаты. Если у двух строк совпадают префиксы
(определяется через `GetQuotestr` и `cmp_quotes`), они "разворачиваются" и
объединяются в одну строку, часто с добавлением пробела между ними.
  - Срабатывание: Поскольку несколько UUE-строк часто начинаются с
одного и того же символа длины (например, `M`) и могут случайно иметь
похожий "цитатный" паттерн, GoldEd+ объединяет их. Это удаляет "цитату" (на
самом деле данные UUE) с начала второй строки и вставляет пробел, что
приводит к порче UUE-потока.

3.  **Логика переноса редактора (`golded3/geedit.cpp`)**:
    - Функция: `IEclass::wrapit(...)`
  - Логика: Аналогично `MakeLineIndex`, логика переноса редактора в
реальном времени использует `GetQuotestr` для сохранения префиксов цитаты. Если
строка ошибочно определяется как цитата, редактор пытается перенести её с
сохранением префикса. Если данные UUE ошибочно интерпретируются, точки переноса
вычисляются неверно, а префиксы дублируются или удаляются.

#### Затронутые файлы и функции
- **`golded3/geutil.cpp`**:
  - `is_quote(const char* ptr)`: Основной источник ошибочной
идентификации. Просмотр на 11 символов вперёд для поиска `>` слишком широк для
бинарного текста.
  - `is_quote2(Line* line, const char* ptr)`: Вторичная эвристика, не
исключающая UUE-данные.
  - `GetQuotestr(const char* ptr, char* qbuf, uint* qlen)`:
Неправильно извлекает данные UUE как строку цитаты.

- **`golded3/geline.cpp`**:
  - `MakeLineIndex(...)`: Главный цикл преобразования исходного текста
сообщения в отображаемые строки. Содержит логику объединения "развернутых" строк.

- **`golded3/geedit.cpp`**:
  - `IEclass::wrapit(...)`: Отвечает за перенос строк в реальном
времени при редактировании/вставке.
  - `IEclass::setlinetype(Line* __line)`: Присваивает строкам тип
`GLINE_QUOT`, что запускает ошибочную логику далее по цепочке.

#### Предлагаемое решение
Надёжное исправление требует различать данные UUE и настоящие цитаты.

1.  **Новая эвристика: `is_uue_line(const char* line)`**:
  - Реализовать функцию для проверки, является ли строка, вероятно,
UUE-данными.
    - Проверка 1: Начинается с символа в диапазоне ASCII 33 (`!`) до 96 (```).
  - Проверка 2: Длина строки соответствует ожидаемой, определяемой
первым символом (Длина = `(char - 32)`). Для стандартной 45-байтовой строки
первый символ ? `M` (77), а закодированная длина ? 60 символов.
  - Проверка 3: Все символы находятся в допустимом наборе UUE (ASCII
32 до 96).

2.  **Интеграция проверки**:
  - Обновить `is_quote` и `is_quote2`, чтобы они немедленно возвращали
`false`, если `is_uue_line` возвращает `true`.
  - Обновить `setlinetype`, чтобы UUE-строки помечались как
`GLINE_HARD` (чтобы предотвратить объединение) и никогда как `GLINE_QUOT`.
  - Убедиться, что `MakeLineIndex` и `wrapit` уважают эти границы и
не пытаются "разворачивать" строки, похожие на UUE.

Best Regards, Nil
--- GoldED+/LNX 1.1.5-b20250409
 * Origin: Gemini can make mistakes, so double-check it (2:5015/46)
SEEN-BY: 46/49 50/109 104/117 221/6 240/1120 301/1
341/66 451/31 452/28 166
SEEN-BY: 455/19 460/58 463/68 4500/1 5000/111
5015/42 46 255 519 5019/40 400
SEEN-BY: 5020/101 113 545 620 715 830 846 848
1042 2992 4441 12000 5022/128
SEEN-BY: 5029/32 5030/49 115 1081 1474 5049/1 3
5050/151 5053/51 58 5054/89
SEEN-BY: 5058/104 5060/900 5061/133 5068/45 5083/1
444 6078/80 6090/1
@PATH: 5015/46 5020/1042 4441



   GoldED+ VK   │                                                 │   09:55:30    
                                                                                
В этой области больше нет сообщений.

Остаться здесь
Перейти к списку сообщений
Перейти к списку эх