Skip Navigation Links
Проект "Real Time Systems DD"
Пакет (Binding) Ada2012 Unicode NCURSES под Windows.

Этот проект является UNICODE реализацией библиотеки привязки ADA2012 к пакету NCURSES 6.0 (WIDEC-вариант) под Windows (MINGW). За основу проекта взят пакет Ada95 Ncurses из дистрибутива NCURSES 6.0. Исходные тексты и инструкции по построению и установке пакетов в архиве ADANCURSES.zip.


В директориях ADAPROJECTS\AdaCursesW и ADAPROJECTS\ncurses-6.0 находятся дистрибутив Ada2012 Unicode NCURSES и сильно покуроченный дистрибутив пакета NCURSES 6.0. Причина необходимости основательной модификации исходников пакета NCURSES 6.0 кроется в том, что под Windows нельзя в Locale установить кодовую страницу с числом байт в символе большем двух, а кодовая страница 65001 (UTF-8) этим требованиям не удовлетворяет. Поэтому пришлось заменить вызовы CRT функций преобразований строк и символов в вызовы Win32 функций «MultiByteToWideChar» и «WideCharToMultiByte» с явным указанием кодовой страницы UTF-8. В исходном WIDEC-варианте NCURSES-драйвера MINGW-консоли на экран выводятся 16-битные символы с помощью функции «WriteConsoleOutputW», а вводятся с клавиатуры 8-битные символы с помощью функции «ReadConsoleInputA». Если код символа равен нулю, то из виртуального кода клавиши формируется код функциональной клавиши NCURSES с кодом большим 255. Функции wget_wch и get_wch выдают код символа или код функциональной клавиши в 16-разрядном выходном параметре wch и устанавливают признак функциональной клавиши (возвращают значение KEY_CODE_YES) если код wch больше 255. Мой драйвер читает 16-битные символы с помощью функции «ReadConsoleInputW», а функции wget_wch и get_wch устанавливают признак функциональной клавиши если код wch больше 255 и меньше или равно значению KEY_MAX (511), что, наверное, не совсем правильно (для русских символов это прокатывает) и, так как происхождение кода легко проследить, в дальнейшем это поведение программы можно заменить более правильным.

Много времени и усилий ушло на реализацию возможности изменения размера основного окна NCURSES-приложения (в исходном варианте эта функциональность для MINGW-консоли не предусмотрена). Сначала я пытался (и много раз к этим попыткам возвращался) реализовать эту функциональность на уровне драйвера MINGW-консоли путем перехвата событий типа «WINDOW_BUFFER_SIZE_EVENT». Но, в конце концов, пришел к выводу, что эта методика для моих целей не годится. События данного типа возникают при изменении размера выходного буфера консоли, а мне нужно было найти механизм обнаружения изменения размера окна консоли, а заморачиваться с перехватом событий Windows типа «WM_SIZE» я не стал. Я перенёс указанную функциональность на уровень NCURSES-приложения, введя несколько новых API в библиотеку NCURSES. Пример кода, использующего эту методику в приложении tour.exe из пакета примеров в директории ADAPROJECTS\AdaNCursesW.

Подчинённые пакеты form и menu оказались очень плохо приспособленными к ЮНИКОДу и потому были подвергнуты значительной модификации. Сначала я пытался сохранить совместимость по исходным текстам с однобайтовой реализацией пакетов и вводил в заголовочные файлы form.h и menu.h только новые определения, сохраняя при этом все старые определения в указанных файлах. Но потом решил не заморачиваться с совместимостью и изменил несколько ключевых определений в заголовочных файлах. Это привело к потере совместимости по исходным текстам. Если в вашей системе установлен однобайтный вариант библиотеки NCURSES, то устанавливать в систему (использовать команду «make install») данную реализацию WIDEC-варианта библиотеки нельзя. Проект AdaCursesW устанавливает в систему лишь необходимые для работы NCURSESW-приложений DLL-файлы. Если вы хотите разрабатывать NCURSESW-приложения на языках, отличных от ADA, то за заголовочными файлами и библиотеками обращайтесь в BUILD-директорию библиотеки NCURSESW (ADAPROJECTS\ncurses-631w). В моём варианте библиотеки NCURSESW поддержка C++ отключена. Если вы хотите разрабатывать NCURSESW-приложения на языке C++, то вам придётся самостоятельно изменить исходные тексты в предлагаемом дистрибутиве для получения работоспособной поддержки C++.


В директории ADAPROJECTS\Unicode_Console расположен дистрибутив пакета консольного ввода/вывода в режиме UNICODE. За основу пакета взят шаблон Minimal_Console предложенный Иваном Левашевым на форуме ada_ru. Пакет Unicode_Console зависит от пакета win32ada и, на всякий случай, в директорию ADAPROJECTS\MINGW631\win32ada-gpl-2017-src помещён слегка откорректированный дистрибутив этого пакета, взятый из проекта «Сборка GNAT gpl 2017». В стандартной библиотеке исполнения GNAT Ada2012 есть средства получения строки текущего Locale, но я не нашел средств установки текущего Locale. Поэтому в библиотеку Unicode_Console я так же поместил две функции Set_Locale и Get_Locale для работы с текущим Locale.


В директории ADAPROJECTS\AdaNCursesW находится пакет примеров Ada NCURSESW-приложений, а в директории ADAPROJECTS\Minimal_Console проект простого приложения для демонстрации консольного UNICODE ввода/вывода.


Инструкции по сборке и установке пакетов:
  1. Распаковать архив ADANCURSES.zip на жёсткий диск (желательно в корневую директорию диска C:, тогда не придется менять конфигурационные файлы).
  2. Согласно списку команд в файле ADAPROJECTS\AdaCursesW\build.txt собрать пакет NCURSESW, далее собрать и установить пакет AdaCursesW.
  3. Согласно списку команд в файле ADAPROJECTS\MINGW631\win32ada-gpl-2017-src\gcc-6.3.1.txt собрать и установить пакет win32ada.
  4. Согласно списку команд в файле ADAPROJECTS\Unicode_Console\build.txt собрать и установить пакет Unicode_Console.
  5. Теперь можно открыть в GPS проект ADAPROJECTS\Minimal_Console\Minimal_Console.gpr и построить консольное приложение Minimal_Console.exe. Запустив его, можно протестировать консольный UNICODE ввод/вывод.
  6. Далее открываем в GPS проект ADAPROJECTS\AdaNCursesW\adancursesw.gpr и строим набор примеров NCURSESW-приложений, запускаем их, чтобы проверить их функционирование, исследуем исходные коды этих приложений, чтобы научиться строить свои собственные NCURSESW-приложения на языке Ada. Инсталлятор пакета AdaCursesW помещает в директорию share/doc/AdaCursesW/html полную документацию по NCURSES. Но я эту документацию не редактировал, так что не всё в ней соответствует действительности.

Теперь несколько слов о правильной интерпретации UNICODE литералов компиляторами и интерпретаторами языков программирования в Windows. Среди компиляторов GCC только GNAT Ada2012 компилятор умеет правильно интерпретировать UNICODE литералы (правильно интерпретируются только Wide_Wide_String и Wide_Wide_Character литералы, а Wide_String и Wide_Character литералы интерпретируются неправильно). Стандартный пакет Ada.Wide_Wide_Text_IO позволяет правильно выводить UNICODE текст в обычный файл в кодировке UTF-8, но на экран консоли этот пакет выводит UNICODE текст неправильно. Ввод UNICODE строк, даже из обычного файла, этот пакет производит неправильно. Чтобы обойти это препятствие, нужно читать UTF-8 строки из обычного файла средствами пакета Ada.Text_IO и преобразовывать их в Wide_Wide_String функцией Decode из пакета Ada.Strings.UTF_Encoding.Wide_Wide_Strings. Возможность применения UNICODE идентификаторов при программировании в среде GNAT Ada – уникальна для всего ПО под Windows (за исключением внутреннего языка 1С, который допускает применение русских и английских ключевых слов, и идентификаторов), и эта возможность оказалась весьма полезной при разработке NCURSESW-приложений на языке Ada (пример tour.exe).

В 32-разрядной реализации GCC компилятор языка java правильно интерпретировал NLS литералы, но в 64-разрядной версии GCC подсистема java не реализована. Я пытался собрать 64-разрядную реализацию java-подсистемы в GCC. Собрать компилятор у меня получилось, а вот собрать исполняющую библиотеку java – нет. И это очень, очень жаль, потому что идея создавать высокоэффективные нативные JAVA-приложения взамен низкоэффективных JAVA-байткодов была хороша! Почему же авторы GCC похерили эту замечательную идею?

Интерпретатор языка python под Windows правильно интерпретирует UNICODE литералы, правильно читает UNICODE данные из регулярных файлов, правильно записывает UNICODE данные в регулярные файлы, но вот правильно выводить UNICODE данные в окно консоли или правильно читать UNICODE данные с клавиатуры консоли стандартным способом не умеет.

И, наконец, группа приложений, которые просто обязаны правильно интерпретировать NLS литералы и правильно обрабатывать UNICODE данные, это приложения, которые специально созданы для разработки ПО под Windows, например, компиляторы и утилиты из системы Microsoft Visual Studio.


В дальнейшем я планирую создать NCURSESW русифицированную оболочку для отладчика gdb на языке Ada, которая будет поддерживать UNICODE ввод/вывод и показ исходных текстов в различных кодировках. В результате этой работы интерфейсы NCURSESW и AdaCursesW могут несколько измениться.


Ну вот пока и всё. Наслаждайтесь жизнью в мире GNAT Ada!

Уважаемые посетители страницы! Оставляйте, по возможности, свои отзывы!
Сергей Дюков.

Таблица загрузок проекта:
Ссылка Описание
ADANCURSES.zip Упакованная папка проекта «Ada2012_Unicode_NCURSES»
ADANCURSES Папка проекта «Ada2012_Unicode_NCURSES»

Таблица комментариев и пожеланий:
Добавте новый комментарий или пожелание:
Имя создателя комментария:   
Адрес электронной почты создателя комментария:   
Текст комментария:   
   
«RTSDD Web-Site» v 1.0.0000.0001 β Системы Реального Времени DD © 2019
Главный архитектор систем Сергей Дюков
Готово Статус исполнения