|
|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Anton Kovalenko 2:5020/400 26 Jun 2003 18:12:24 To : Aleksey Cheusov Subject : Re: Пересборка иксов ради 15% прироста производительности -------------------------------------------------------------------------------- >>>>> Aleksey Cheusov writes: >> Похоже, что readline неправильно классифицирует русские буквы -- >> думает, что это не буквы, а так -- символы вроде пробела... И >> слова из них состоять не могут. AC> Это тоже понятно. Hо я подумал, может ты и это знаешь тоже ;) AC> В смысле, может, знаешь, есть ли патч какой для этого дела. Я у себя запатчил. Значит, так. Смотрим файл chardefs.h в дистрибутиве readline. ---------- Здесь начались извращения #if defined STDC_HEADERS || (!defined (isascii) && !defined (HAVE_ISASCII)) # define IN_CTYPE_DOMAIN(c) 1 #else # define IN_CTYPE_DOMAIN(c) isascii(c) #endif [..много всего..] #define NON_NEGATIVE(c) ((unsigned char)(c) == (c)) [..много всего..] #define _rl_pure_alphabetic(c) (NON_NEGATIVE(c) && ISALPHA(c)) #define ALPHABETIC(c) (NON_NEGATIVE(c) && ISALNUM(c)) ---------- А здесь извращения кончились Последствия понятны, как мне кажется. STDC_HEADERS никто при сборке readline у меня не определяет (это во-первых), и NON_NEGATIVE на русских буквах даёт гадость (это во-вторых). Причём, как вся эта хрень ухитряется классифицировать мультибайты, я так и не понял. Поэтому как лечить такой эффект в UTF-8 я не знаю. Для однобайтовой CP1251, которой пользуешься ты лично, можешь сделать так: - --- readline4-4.2a/chardefs.h Thu Nov 8 16:17:21 2001 +++ readline4-4.2a.new/chardefs.h Thu Jun 26 18:09:52 2003 @@ -64,17 +64,21 @@ #define UNMETA(c) ((c) & (~meta_character_bit)) #define UNCTRL(c) _rl_to_upper(((c)|control_character_bit)) +/* #if defined STDC_HEADERS || (!defined (isascii) && !defined (HAVE_ISASCII)) # define IN_CTYPE_DOMAIN(c) 1 #else # define IN_CTYPE_DOMAIN(c) isascii(c) #endif +*/ +# define IN_CTYPE_DOMAIN(c) 1 #if !defined (isxdigit) && !defined (HAVE_ISXDIGIT) # define isxdigit(c) (isdigit((c)) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F')) #endif -#define NON_NEGATIVE(c) ((unsigned char)(c) == (c)) +#define NON_NEGATIVE(c) 1 +/* There was ((unsigned char)(c) == (c)) */ #define ISALNUM(c) (IN_CTYPE_DOMAIN (c) && isalnum (c)) #define ISALPHA(c) (IN_CTYPE_DOMAIN (c) && isalpha (c)) То, что это помогает, я проверил. -- Удачи! Антон Коваленко /* kovalenko.webzone.ru */ --- ifmail v.2.15dev5 * Origin: Anton's home (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/44888673fa5b.html, оценка из 5, голосов 10
|