[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]

Программирование: Разработка и отладка программ


Применение пакета libcur

В программы, работающие с пакетом libcur (расширение до пакета libcurses AT&T) необходимо внести следующие изменения:

  1. Переработать все фрагменты, в которых явно или неявно предполагается, что число байтов, необходимое для представления символа кодового набора, определяет ширину столбца с изображением этого символа на экране. Для определения числа колонок на экране, необходимых для изображения "широкого" символа, воспользуйтесь функцией wcwidth.
  2. Тип NLSCHAR должен быть переопределен на wchar_t.
  3. В win->_y[y][x] должны применяться кодировки wchar_t.
  4. В программах не должно предполагаться, что wchar_t соответствует какой-либо конкретной кодировке.
  5. Вместо функций семейства addch в программах следует применять функции addstr, waddstr, mvaddstr и mvwaddstr. Все строковые аргументы должны передаваться в виде строк многобайтовых символов.
  6. Функции addch и waddch должны поддерживать кодировки символов wchar_t. В программах, работающих с этими функциями, необходимо проверить наличие идентификатора wchar_t в синтаксисе вызова. Значение (x,y) должно увеличиваться на число колонок, занятых символом wchar_t, который был передан в соответствующую функцию.
  7. Функции delch, wdelch, mvdelch и mvwdelch должны поддерживать удаление текущего и предыдущего многобайтового символа в зависимости от текущего значения (x,y). Если текущее значение (x,y) указывает на первую или вторую колонку символа, занимающего две колонки, то функция delch удаляет обе колонки и сдвигает оставшуюся строку влево на число удаленных колонок.
  8. Функции insch, winsch, mvinsch и mvwinsch можно применять для вставки символа в кодировке wchar_t в текущую позицию (x,y). При этом строка сдвигается вправо на столько позиций, сколько колонок занимает вставленный символ wchar_t.
  9. Пакет libcur теперь поддерживает символы рисования окон, определенные в базе данных terminfo и не поддерживает графические символы из кодового набора IBM-850. Пакет libcur поддерживает рисование символов основного и альтернативного окон, определенных в записях box_chars_1 и box_chars_2 базы данных terminfo. Для работы с этими возможностями в программы необходимо внести следующие изменения:

    Основной набор
    символов псевдографики:
    
     
     
     
     
            wcolorout(win, Bxa);
            cbox(win);
            wcolorend(win);
      
            или
            wcolorout(win, Bxa);
            drawbox(win, y, x, высота, ширина);
            wcolorend(win);
     
    Дополнительный набор символов псевдографики:
    
     
     
     
     
            wcolorout(win, Bya)
            cboxalt(win);
            wcolorend(win);
     
            или
     
            wcolorout(win, Bya);
            drawbox(win, y, x, высота, ширина);
            wcolorend(win);
    

    Bxa и Bya соответствуют атрибутам primary и alternate, определенным в базе данных terminfo.

    В файл cur01.h добавлены следующие макроопределения:

    cboxalt(win)
     
    drawboxalt(win, y,x, height, width)
    
  10. В программах, в которых необходима поддержка ввода многобайтовых символов, нельзя присваивать атрибуту _extended значение TRUE путем вызова extended(TRUE). Если флаг _extended установлен (равен true), то функция wgetch возвращает символы в кодировке wchar_t. Для многобайтовых символов кодировка wchar_t может вызвать конфликт с предопределенными значениями Escape-последовательностей или кодами функциональных клавиш. Для предотвращения этого следует при работе с многобайтовыми кодовыми наборами сбросить флаг extended (extended(FALSE)) до начала ввода. (По умолчанию значение равно TRUE.)

    Программы, выполняющие ввод многобайтовых символов, должны выглядеть следующим образом:

        Процедура ввода:
     
        Пример:
     
            int c, count;
            char buf[];
     
            extended(FALSE); /* считывается по одному байту */
            count =0;
            while (1) {
                c = wgetch();  /* чтение байтов по одному */
                buf[count++] = c;
                if(count <=MB_CUR_MAX)
                    if(mblen(buf, count) != -1)
                        break; /* символ найден * /
                else
                    /* Ошибка. Символ не найден */
                    /* Обработка этой ситуации */
                    break;
            }
    /* В буфере содержится последовательность многобайтовых символов для ввода */
    /* Обработка функциональных клавиш и любых escape-последовательностей */ 
    
  11. Функции inch, winch, mvinch и mvwinch возвращают wchar_t в текущей позиции (x,y). Заметим, что при удвоенной ширине колонки, если точка (x,y) соответствует первой колонке, будет возвращен код wchar_t для двойной колонки. Если точка (x,y) соответствует второй колонке, будет возвращено значение WEOF.

Связанная информация

Глава 16, Поддержка национальных языков.

Функции addch, waddch, addstr, waddstr, mvaddstr, mvwaddstr, delch, wdelch, mvdelch, mvwdelch, inch, insch, winsch, mvinsch, mvwinsch, winch, mvinch, mvwinch, wcwidth и wgetch.


[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]