LINUX.ORG.RU

Сломан поиск неюникодных строк в mcedit

 


0

1

Добрый день, ЛОР.

В пятницу собрал последний Midnight Commander из мастера гитхаба. Пару дней полёт был нормальный, но сегодня выловил багу: в mcedit перестал работать поиск строк в неюникодных файлах.

К примеру, у меня большой файл в CP1251. Я его открываю, через Alt+E выбираю нужную кодировку, файл отображается. Я ввожу для поиска русское слово «Самара», и редактор его не находит, хотя в файле оно есть. При этом в ходе поиска он выдаёт окно прогресса, по которому видно, что слово «Самара» превратилось в квадратики. ОС - 64-разрядный дебиан (старенький, притом старенький же mc 4.8.3 на нём эту ошибку не совершал, всё работало).

Думаю над тем, чтобы запостить багрепорт, но надо понять, когда появилась ошибка, и проявляется ли она на разных системах. Я у себя дома посмотрю Федору, там, по идее, должен быть mc 4.8.23. Может кто-нибудь подтвердить или опровергнуть ошибку на более-менее актуальных версиях mc?

★★★★★

Что-то у меня не получилось воспроизвести.

Ни в Arch с mc 4.8.25-3, Ни в Debian с mc 4.8.22.

Даже с git clone, autogen.sh, configure, make, make install не воспроизводится.

Может быть у меня тестовый CP1251 файл недостаточно большой?

А такие штуки не могут быть связаны с glibc/musl или gcc/clang случайно?
Если скажете, как именно вы собираете - могу повторить )

Toxo2 ★★★★
()

mc-4.8.24, Slackware, не воспроизвел, слово находится.

Проверьте свое слово «Самара» в файле на предмет кодов символов, не затесалась ли там латинская буковка из набора C, a, p?
В cp1251 «Самара» — d1 e0 ec e0 f0 e0

bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 1)
Ответ на: комментарий от bormant

Спасибо.

Проверьте свое слово «Самара» в файле на предмет кодов символов, не затесалась ли там латинская буковка из набора C, a, p?

Однозначно нет. К тому же, в файле это слово встречается сильно больше одного раза, и что важно — старый mc работает корректно с этим же файлом.

hobbit ★★★★★
() автор топика
Ответ на: комментарий от Toxo2

Спасибо.

Если скажете, как именно вы собираете - могу повторить )

Пока, наверное, не надо. Попробую сначала проверить на более новой системе, возможно, дело действительно в библиотеках.

hobbit ★★★★★
() автор топика
Последнее исправление: hobbit (всего исправлений: 1)

Не воспроизводится.

mc --version
GNU Midnight Commander, версия 4.8.25
Скомпилирован с библиотекой GLib версии 2.58.3
С библиотекой S-Lang 2.3.1a и с базой данных terminfo
Со встроенным редактором и поддержкой Aspell
C поддержкой внутренней командной оболочки
С поддержкой фоновых операций
С поддержкой мыши в xterm и консоли Linux
С поддержкой интернационализации
С поддержкой многих кодировок
With ext2fs attributes support
Виртуальная файловая система:
 cpiofs, tarfs, sfs, extfs, ftpfs, sftpfs, fish, smbfs
Тип данных:
 char: 8; int: 32; long: 64; void *: 64; size_t: 64; off_t: 64;

gremlin_the_red ★★★★★
()
Ответ на: комментарий от hobbit

Пока, наверное, не надо

Нннадо ) Получилось воспроизвести.

Действительно, в Debian 7 так и получается, как вы говорите.

Штатный mc:

bo@debian7:~$ /usr/bin/mc --version
GNU Midnight Commander, версия 4.8.3
Скомпилирован с библиотекой GLib версии  2.32.4
С библиотекой S-Lang и с базой данных terminfo
Со встроенным редактором
C поддержкой внутренней командной оболочки
С поддержкой фоновых операций
С поддержкой мыши в xterm и консоли Linux
С поддержкой событий X11
С поддержкой интернационализации
С поддержкой многих кодировок
Виртуальная файловая система: cpiofs, tarfs, sfs, extfs, ext2undelfs, ftpfs, fish
Тип данных: char: 8; int: 32; long: 64; void *: 64; size_t: 64; off_t: 64;

Собранный в Debian7 из GitHub mc:

bo@debian7:~$ /usr/local/bin/mc --version
GNU Midnight Commander, версия 4.8.25-57-g7f49605
Скомпилирован с библиотекой GLib версии 2.32.4
С библиотекой S-Lang 2.2.4 и с базой данных terminfo
Со встроенным редактором
C поддержкой внутренней командной оболочки
С поддержкой фоновых операций
С поддержкой мыши в xterm
С поддержкой интернационализации
С поддержкой многих кодировок
Виртуальная файловая система:
 cpiofs, tarfs, sfs, extfs, ftpfs, fish
Тип данных:
 char: 8; int: 32; long: 64; void *: 64; size_t: 64; off_t: 64;

И он правда не ищет строчку в CP1251.

Пока мыслей нет, почему.

Toxo2 ★★★★
()
Ответ на: комментарий от Toxo2

1) А почему в первом случае версии S-lang не видно?
2) Не накладывает ли Debian каких-либо патчей при сборке в .deb?

ABW ★★★★★
()
Ответ на: комментарий от ABW

1) А почему в первом случае версии S-lang не видно?

Так это же его внутренние дела, что и как рисовать по --version. В версии 4.8.25 он делает так:

#ifdef HAVE_SLANG
    printf (_("Built with S-Lang %s with terminfo database\n"), SLANG_VERSION_STRING);
А в старой версии 4.8.3 это же место выглядит так:
static const char *const features[] = {
#ifdef HAVE_SLANG
    N_("Using the S-Lang library with terminfo database\n"),
/*..........................*/
   for (i = 0; features[i] != NULL; i++)
        printf ("%s", _(features[i]));
Хочет пишет, не хочет - не пишет. Hardcode )

2) Не накладывает ли Debian каких-либо патчей при сборке в .deb?

Не то слово «каких-либо». В родном deb от Debian7 для mc 4.8.3 - 30 (тридцать!!!) patch.

) Но вроде не про кодировку, насколько вижу )

Toxo2 ★★★★
()
Ответ на: комментарий от Toxo2

Я к тому, что регрессия может быть не в самом mc, а в slang.
Ты, впрочем, мог бы это проверить, ради шутки пересобрав с ncurses.
У меня, к сожалению, сейчас нет возможности.

ABW ★★★★★
()
Ответ на: комментарий от ABW

Скорее всего что-то вокруг GLib-2.0. Там сама функция, которая байтики перебирает - была нормальная такая честная ходьба по массиву. Теперь стала через макрос g_ptr_array_index().

Ну, мне так кажется.

Хотел было попробовать собрать со статическим glib (в другом месте) и подсунуть в Debian 7. С первого раза не получилось, а теперь уже керосин кончается на это развлечение.

Но с ncurses, хорошо попробую. Ставлю 10 к 1 что не он )

Toxo2 ★★★★
()
Ответ на: комментарий от ABW

Собрать-то кое-как собрал с ncurses

bo@debian7:~$ /usr/local/bin/mc --version
GNU Midnight Commander, версия 4.8.25-57-g7f49605
Скомпилирован с библиотекой GLib версии 2.32.4
С библиотекой ncurses 5.9
Со встроенным редактором
C поддержкой внутренней командной оболочки
С поддержкой фоновых операций
С поддержкой мыши в xterm и консоли Linux
С поддержкой событий X11
С поддержкой интернационализации
С поддержкой многих кодировок
With ext2fs attributes support
Виртуальная файловая система:
 cpiofs, tarfs, sfs, extfs, ftpfs, fish
Тип данных:
 char: 8; int: 32; long: 64; void *: 64; size_t: 64; off_t: 64;

Но там совсем каша у меня получается. В лучшем случае чего добился - чтобы c LANG=ru_RU.cp1251 запускалось и более/менее рисовало. Но всё равно не ищет.

Я всё. ТСу придётся профессионалов просить )

Toxo2 ★★★★
()
Ответ на: комментарий от Toxo2

Действительно, в Debian 7 так и получается, как вы говорите.

Да, это был Wheezy. :)

Уже со Stretch ситуация не повторилась, поиск работает.

Заметил ещё, что по нажатии F1 моя сборка из последнего гита в Wheezy пишет версию «unknown», а в Stretch - «4.8.25-57-g7f4960553».

Да, сомнительно, что кто-то из нынешних разработчиков mc будет дёргаться из-за дистрибутива 7-летней давности. Попробую как-нибудь покопать исходники, интересно же…

hobbit ★★★★★
() автор топика
Ответ на: комментарий от hobbit

Для какого-нибудь редхата может и почесались бы, да и то не факт — получаете деньги за поддержку, так работайте, чего мы должны. Но у wheezy даже ELTS поддержка уже кончилась, он четыре месяца, как мёртв окончательно и бесповоротно.

gremlin_the_red ★★★★★
()
Ответ на: комментарий от hobbit

Пардон. Что-то опять приспичило эту тему поковырять.

В общем - если цель такая:
«чтобы работал поиск в mc 4.8.25 на Debian 7»,
тогда решением может быть сборка mc с флагом ./configure --with-search-engine=pcre. Проверено, работает.

Если цель более глобальная - разобраться почему GLib поиск (который собирается по-умолчанию) не работает, то шут знает. Я так и не понял. Например, в версии GLib 2.32.4 (родная для Debain 7) вот такое:

#define NEXT_CHAR(re, s) (((re)->compile_opts & PCRE_UTF8) ? \
                                g_utf8_next_char (s) : \
                                ((s) + 1))
А в версии GLib 2.42.1 (родная для Debian 8, в которой уже работает поиск mc) вот такое:
#define NEXT_CHAR(re, s) (((re)->compile_opts & G_REGEX_RAW) ? \
                                ((s) + 1) : \
                                g_utf8_next_char (s))
Оно как бы одно и тоже должно делать, казалось бы. Но умолчания-то разные.

В общем - точно GLib надо ковырять. Но у меня компетенции не хватит. Как обычно - весело, интересно... но нифига не понятно )

Toxo2 ★★★★
()
Ответ на: комментарий от AS

Если собран со S-Lnag, будет писать.

Что будет писать?

Человек спрашивал - почему номер версии не пишет в 4.8.3 - я ему говорю, что такой Hardcode в исходниках 4.8.3 - без версии. Какое в Ж compile time?

Пардон, конечно.

Toxo2 ★★★★
()
Ответ на: комментарий от Toxo2

почему номер версии не пишет в 4.8.3

А, я что-то просто про S-Lang только прочитал.

AS ★★★★★
()
22 января 2021 г.
Ответ на: комментарий от Toxo2

В общем - если цель такая: «чтобы работал поиск в mc 4.8.25 на Debian 7», тогда решением может быть сборка mc с флагом ./configure --with-search-engine=pcre.

Спасибо, работает. Самара находится и прямым поиском, и обратным.

hobbit ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.