mdview2: чинить детект лимита строк + кламп файлов >256 КБ

1. Лимит строк не показывал предупреждение: g_trunc_cause=TRUNC_LINES
   ставился в emit_seg, но главный цикл выходит по n_lines<max_lines ДО
   вызова emit_seg в переполненном состоянии (для code-block — один
   emit_seg на строку). Теперь ловим после цикла по признаку p<file_size
   (остановились, файл не кончился).
2. Файл >256 КБ больше не отвергаем экраном ошибки, а КЛАМПим: читаем
   первые 256 КБ, индексатор дописывает строку TRUNC_FILE (File too large
   - truncated at 256 KB). Приоритет ниже content/lines. Текст ошибки -2
   поправлен (был 'size > 128K').

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-30 22:13:29 +03:00
parent c88f127057
commit e3342b63f3
4 changed files with 38 additions and 7 deletions
+19
View File
@@ -973,6 +973,25 @@ void index_lines(void)
* незафлашенной, её ячейки ещё в g_cells; коммитим здесь. */
if (n_lines > 0) seg_commit_cells((uint16_t)(n_lines - 1));
/* Лимит строк ловим ЗДЕСЬ, а не в emit_seg: главный цикл выходит по
* `n_lines < max_lines` ДО того, как emit_seg будет вызван в переполненном
* состоянии (для code-block — один emit_seg на строку, эта ветка не
* достигается). Признак — остановились, а файл не кончился; g_abort и
* исчерпание контента (TRUNC_CONTENT) уже обработаны/исключены. */
if (!g_trunc_cause && !g_abort && p < file_size) {
g_trunc_cause = TRUNC_LINES;
g_trunc_line = (uint16_t)(max_lines - 1);
}
/* Файл был обрезан до 256 КБ при загрузке, а индексация дошла до конца
* клампнутых данных без исчерпания контента/строк → ДОПИСЫВАЕМ строку
* (место есть: n_lines < max_lines). Приоритет ниже content/lines —
* те означают, что обрезали ещё раньше, их сообщение точнее. */
if (!g_trunc_cause && !g_abort && g_file_clamped) {
g_trunc_cause = TRUNC_FILE;
g_trunc_line = n_lines;
}
/* Обрыв по контенту/лимиту строк (не путать с пользовательским g_abort):
* документ заканчиваем строкой-сообщением на g_trunc_line. Сообщение
* рисуется вживую (IF_TRUNC_MSG) — место в контент-кэше ему не нужно, что