Компилятор языка программирования Oberon-07/11 для i386 Windows/Linux/KolibriOS. ------------------------------------------------------------------------------ Состав программы 1. Compiler.kex (KolibriOS) - исполняемый файл компилятора. Вход - текстовые файлы модулей с расширением ".ob07", кодировка ANSI или UTF-8 с BOM-сигнатурой. Выход - исполняемый файл формата PE, ELF или MENUET01/MS COFF. Параметры: 1) имя главного модуля 2) тип приложения и платформа "con" - Windows console "gui" - Windows GUI "dll" - Windows DLL "elf" - Linux "kos" - KolibriOS "obj" - KolibriOS DLL 3) размер стэка в мегабайтах, необязательный параметр, по умолчанию - 1 Мб, для ELF игнорируется. Если 2-й параметр = "obj" (KolibriOS DLL), то 3-й параметр задается шестнадцатиричным числом (0x00000001 .. 0xffffffff) и определяет версию программы, по умолчанию - 0x00010000 (v1.0). Например: "C:\oberon-07\example.ob07" con 1 "C:\oberon-07\example.ob07" obj 0x00020005 (* v2.5 *) В случае успешной компиляции, компилятор передает код завершения 0, иначе 1. При работе компилятора в KolibriOS, код завершения не передается. Сообщения компилятора выводятся на консоль (Windows, KolibriOS), в терминал (Linux). 2. Папка Lib - библиотека модулей ------------------------------------------------------------------------------ Отличия от оригинала 1. Расширен псевдомодуль SYSTEM 2. Разрешен символ "_" в идентификаторах 3. Добавлены системные флаги 4. Оператор CASE реализован в соответствии с синтаксисом и семантикой данного оператора в языке Oberon (Revision 1.10.90) 5. Расширен набор стандартных процедур 6. Семантика охраны/проверки типа уточнена для нулевого указателя 7. Семантика DIV и MOD уточнена для отрицательных чисел 8. Добавлены однострочные комментарии (начинаются с пары символов "//") 9. Разрешен экспорт переменных типов ARRAY и RECORD (только для чтения) 10. Разрешено наследование от типа-указателя 11. Добавлены псевдонимы типов (TYPE A = B) ------------------------------------------------------------------------------ Особенности реализации 1. Основные типы Тип Диапазон значений Размер, байт INTEGER -2147483648 .. 2147483647 4 REAL 1.40E-45 .. 3.34E+38 4 LONGREAL 4.94E-324 .. 1.70E+308 8 CHAR символ ASCII (0X .. 0FFX) 1 BOOLEAN FALSE, TRUE 1 SET множество из целых чисел {0 .. 31} 4 2. Максимальная длина идентификаторов - 255 символов 3. Максимальная длина строковых констант - 255 символов 4. Максимальная длина строк исходного кода - 511 символов 5. Максимальная размерность открытых массивов - 5 6. Максимальное количество объявленных типов-записей - 2047 7. Процедура NEW заполняет нулями выделенный блок памяти 8. Глобальные и локальные переменные инициализируются нулями 9. В отличие от многих Oberon-реализаций, сборщик мусора и динамическая модульность отсутствуют ------------------------------------------------------------------------------ Псевдомодуль SYSTEM Псевдомодуль SYSTEM содержит низкоуровневые и небезопасные процедуры, ошибки при использовании процедур псевдомодуля SYSTEM могут привести к повреждению данных времени выполнения и аварийному завершению программы. PROCEDURE ADR(v: любой тип): INTEGER v - переменная, процедура или строковая константа; возвращает адрес v PROCEDURE SIZE(T): INTEGER возвращает размер типа T PROCEDURE TYPEID(T): INTEGER T - тип-запись или тип-указатель, возвращает номер типа в таблице типов-записей PROCEDURE INF(T): T T - REAL или LONGREAL, возвращает специальное вещественное значение "бесконечность" PROCEDURE GET(a: INTEGER; VAR v: любой основной тип, PROCEDURE, POINTER) v := Память[a] PROCEDURE PUT(a: INTEGER; x: любой основной тип, PROCEDURE, POINTER) Память[a] := x PROCEDURE MOVE(Source, Dest, n: INTEGER) Копирует n байт памяти из Source в Dest, области Source и Dest не должны перекрываться PROCEDURE COPY(VAR Source: любой тип; VAR Dest: любой тип; n: INTEGER) Копирует n байт памяти из Source в Dest. Эквивалентно SYSTEM.MOVE(SYSTEM.ADR(Source), SYSTEM.ADR(Dest), n) PROCEDURE CODE(s: ARRAY OF CHAR) Вставка машинного кода s - строковая константа шестнадцатиричных цифр количество цифр должно быть четным например: SYSTEM.CODE("B801000000") (* mov eax, 1 *) Также в модуле SYSTEM определен тип CARD16 (2 байта). Для типа CARD16 не допускаются никакие явные операции, за исключением присваивания. Преобразования CARD16 -> INTEGER и INTEGER -> CARD16 могут быть реализованы так: PROCEDURE Card16ToInt(w: SYSTEM.CARD16): INTEGER; VAR i: INTEGER; BEGIN SYSTEM.PUT(SYSTEM.ADR(i), w) RETURN i END Card16ToInt; PROCEDURE IntToCard16(i: INTEGER): SYSTEM.CARD16; VAR w: SYSTEM.CARD16; BEGIN SYSTEM.GET(SYSTEM.ADR(i), w) RETURN w END IntToCard16; Функции псевдомодуля SYSTEM нельзя использовать в константных выражениях. ------------------------------------------------------------------------------ Системные флаги При объявлении процедурных типов и глобальных процедур, после ключевого слова PROCEDURE может быть указан флаг соглашения вызова: [stdcall], [cdecl] или [winapi]. Например: PROCEDURE [cdecl] MyProc(x, y, z: INTEGER): INTEGER; Если указан флаг [winapi], то принимается соглашение stdcall и процедуру-функцию можно вызвать как собственно процедуру, вне выражения. Флаг [winapi] доступен только для платформы Windows. При объявлении типов-записей, после ключевого слова RECORD может быть указан флаг [noalign] или [union]. Флаг [noalign] означает отсутствие выравнивания полей записи, а флаг [union] означает, что смещения всех полей записи равны нулю, при этом размер записи равен размеру наибольшего поля. Записи RECORD [union] ... END соответствуют объединениям (union) в языке C. Записи с системными флагами не могут иметь базового типа и не могут быть базовыми типами для других записей. Для использования системных флагов, требуется импортировать SYSTEM. ------------------------------------------------------------------------------ Оператор CASE Синтаксис оператора CASE: CaseStatement = CASE Expression OF Сase {"|" Сase} [ELSE StatementSequence] END. Case = [CaseLabelList ":" StatementSequence]. CaseLabelList = CaseLabels {"," CaseLabels}. CaseLabels = ConstExpression [".." ConstExpression]. Например: CASE x OF |-1: DoSomething1 | 1: DoSomething2 | 0: DoSomething3 ELSE DoSomething4 END В метках вариантов можно использовать константные выражения, ветка ELSE необязательна. Если не выполнен ни один вариант и ELSE отсутствует, то программа прерывается с ошибкой времени выполнения. ------------------------------------------------------------------------------ Проверка и охрана типа нулевого указателя Оригинальное сообщение о языке не определяет поведение программы при выполнении охраны p(T) и проверки типа p IS T при p = NIL. Во многих Oberon-реализациях выполнение такой операции приводит к ошибке времени выполнения. В данной реализации охрана типа нулевого указателя не приводит к ошибке, а проверка типа дает результат FALSE. В ряде случаев это позволяет значительно сократить частоту применения охраны типа. ------------------------------------------------------------------------------ Дополнительные стандартные процедуры DISPOSE(VAR v: любой_указатель) Освобождает память, выделенную процедурой NEW для динамической переменной v^, и присваивает переменной v значение NIL. LSR(x, n: INTEGER): INTEGER Логический сдвиг x на n бит вправо. MIN(a, b: INTEGER): INTEGER Минимум из двух значений. MAX(a, b: INTEGER): INTEGER Максимум из двух значений. BITS(x: INTEGER): SET Интерпретирует x как значение типа SET. Выполняется на этапе компиляции. LENGTH(s: ARRAY OF CHAR): INTEGER Длина 0X-завершенной строки s, без учета символа 0X. Если символ 0X отсутствует, функция возвращает длину массива s. ------------------------------------------------------------------------------ DIV и MOD x y x DIV y x MOD y 5 3 1 2 -5 3 -2 1 5 -3 -2 -1 -5 -3 1 -2 ------------------------------------------------------------------------------ Скрытые параметры процедур Некоторые процедуры могут иметь скрытые параметры, они отсутствуют в списке формальных параметров, но учитываются компилятором при трансляции вызовов. Это возможно в следующих случаях: 1. Процедура имеет формальный параметр открытый массив: PROCEDURE Proc(x: ARRAY OF ARRAY OF LONGREAL); Вызов транслируется так: Proc(SYSTEM.ADR(x), LEN(x), LEN(x[0]) 2. Процедура имеет формальный параметр-переменную типа RECORD: PROCEDURE Proc(VAR x: Rec); Вызов транслируется так: Proc(SYSTEM.TYPEID(Rec), SYSTEM.ADR(x)) 3. Процедура является вложенной, глубина вложения k, для глобальных процедур k = 0: PROCEDURE Proc(p1, ..., pn); Вызов транслируется так: Proc(base(k - 1), base(k - 2), ..., base(0), p1, ..., pn), где base(m) - адрес базы кадра стэка охватывающей процедуры глубины вложения m (используется для доступа к локальным переменным охватывающей процедуры) ------------------------------------------------------------------------------ Модуль RTL Все программы неявно используют модуль RTL. Компилятор транслирует некоторые операции (проверка и охрана типа, сравнение строк, сообщения об ошибках времени выполнения и др.) как вызовы процедур этого модуля. Не следует явно вызывать эти процедуры, за исключением процедуры SetClose: PROCEDURE SetClose(proc: PROC), где TYPE PROC = PROCEDURE SetClose назначает процедуру proc (без параметров) вызываемой при выгрузке dll-библиотеки (Windows), если приложение компилируется как Windows DLL. Для прочих типов приложений и платформ вызов процедуры SetClose не влияет на поведение программы. Сообщения об ошибках времени выполнения выводятся в диалоговых окнах (Windows), в терминал (Linux), на доску отладки (KolibriOS). ------------------------------------------------------------------------------ Модуль API Существуют три реализации модуля API: для Windows, Linux и KolibriOS. Как и модуль RTL, модуль API не предназначен для прямого использования. Он обеспечивает кроссплатформенность компилятора. ------------------------------------------------------------------------------ Генерация исполняемых файлов DLL Разрешается экспортировать только процедуры. Для этого, процедура должна находиться в главном модуле программы, и ее имя должно быть отмечено символом экспорта ("*"). KolibriOS DLL всегда экспортируют идентификаторы "version" (версия программы) и "lib_init" - адрес процедуры инициализации DLL: PROCEDURE [stdcall] lib_init(): INTEGER Эта процедура должна быть вызвана перед использованием DLL. Процедура всегда возвращает 1. В настоящее время генерация DLL для Linux не реализована. ============================================================================== ============================================================================== Библиотека (KolibriOS) ------------------------------------------------------------------------------ MODULE Out - консольный вывод PROCEDURE Open формально открывает консольный вывод PROCEDURE Int(x, width: INTEGER) вывод целого числа x; width - количество знакомест, используемых для вывода PROCEDURE Real(x: LONGREAL; width: INTEGER) вывод вещественного числа x в плавающем формате; width - количество знакомест, используемых для вывода PROCEDURE Char(x: CHAR) вывод символа x PROCEDURE FixReal(x: LONGREAL; width, p: INTEGER) вывод вещественного числа x в фиксированном формате; width - количество знакомест, используемых для вывода; p - количество знаков после десятичной точки PROCEDURE Ln переход на следующую строку PROCEDURE String(s: ARRAY OF CHAR) вывод строки s ------------------------------------------------------------------------------ MODULE In - консольный ввод VAR Done: BOOLEAN принимает значение TRUE в случае успешного выполнения операции ввода, иначе FALSE PROCEDURE Open формально открывает консольный ввод, также присваивает переменной Done значение TRUE PROCEDURE Int(VAR x: INTEGER) ввод числа типа INTEGER PROCEDURE Char(VAR x: CHAR) ввод символа PROCEDURE Real(VAR x: REAL) ввод числа типа REAL PROCEDURE LongReal(VAR x: LONGREAL) ввод числа типа LONGREAL PROCEDURE String(VAR s: ARRAY OF CHAR) ввод строки PROCEDURE Ln ожидание нажатия ENTER ------------------------------------------------------------------------------ MODULE Console - дополнительные процедуры консольного вывода CONST Следующие константы определяют цвет консольного вывода Black = 0 Blue = 1 Green = 2 Cyan = 3 Red = 4 Magenta = 5 Brown = 6 LightGray = 7 DarkGray = 8 LightBlue = 9 LightGreen = 10 LightCyan = 11 LightRed = 12 LightMagenta = 13 Yellow = 14 White = 15 PROCEDURE Cls очистка окна консоли PROCEDURE SetColor(FColor, BColor: INTEGER) установка цвета консольного вывода: FColor - цвет текста, BColor - цвет фона, возможные значения - вышеперечисленные константы PROCEDURE SetCursor(x, y: INTEGER) установка курсора консоли в позицию (x, y) PROCEDURE GetCursor(VAR x, y: INTEGER) записывает в параметры текущие координаты курсора консоли PROCEDURE GetCursorX(): INTEGER возвращает текущую x-координату курсора консоли PROCEDURE GetCursorY(): INTEGER возвращает текущую y-координату курсора консоли ------------------------------------------------------------------------------ MODULE ConsoleLib - обертка библиотеки console.obj ------------------------------------------------------------------------------ MODULE Math - математические функции CONST pi = 3.141592653589793D+00 e = 2.718281828459045D+00 VAR Inf, nInf: LONGREAL положительная и отрицательная бесконечность PROCEDURE IsNan(x: LONGREAL): BOOLEAN возвращает TRUE, если x - не число PROCEDURE IsInf(x: LONGREAL): BOOLEAN возвращает TRUE, если x - бесконечность PROCEDURE sqrt(x: LONGREAL): LONGREAL квадратный корень x PROCEDURE exp(x: LONGREAL): LONGREAL экспонента x PROCEDURE ln(x: LONGREAL): LONGREAL натуральный логарифм x PROCEDURE sin(x: LONGREAL): LONGREAL синус x PROCEDURE cos(x: LONGREAL): LONGREAL косинус x PROCEDURE tan(x: LONGREAL): LONGREAL тангенс x PROCEDURE arcsin(x: LONGREAL): LONGREAL арксинус x PROCEDURE arccos(x: LONGREAL): LONGREAL арккосинус x PROCEDURE arctan(x: LONGREAL): LONGREAL арктангенс x PROCEDURE arctan2(y, x: LONGREAL): LONGREAL арктангенс y/x PROCEDURE power(base, exponent: LONGREAL): LONGREAL возведение числа base в степень exponent PROCEDURE log(base, x: LONGREAL): LONGREAL логарифм x по основанию base PROCEDURE sinh(x: LONGREAL): LONGREAL гиперболический синус x PROCEDURE cosh(x: LONGREAL): LONGREAL гиперболический косинус x PROCEDURE tanh(x: LONGREAL): LONGREAL гиперболический тангенс x PROCEDURE arcsinh(x: LONGREAL): LONGREAL обратный гиперболический синус x PROCEDURE arccosh(x: LONGREAL): LONGREAL обратный гиперболический косинус x PROCEDURE arctanh(x: LONGREAL): LONGREAL обратный гиперболический тангенс x PROCEDURE round(x: LONGREAL): LONGREAL округление x до ближайшего целого PROCEDURE frac(x: LONGREAL): LONGREAL; дробная часть числа x PROCEDURE floor(x: LONGREAL): LONGREAL наибольшее целое число (представление как LONGREAL), не больше x: floor(1.2) = 1.0 PROCEDURE ceil(x: LONGREAL): LONGREAL наименьшее целое число (представление как LONGREAL), не меньше x: ceil(1.2) = 2.0 PROCEDURE sgn(x: LONGREAL): INTEGER если x > 0 возвращает 1 если x < 0 возвращает -1 если x = 0 возвращает 0 ------------------------------------------------------------------------------ MODULE Debug - вывод на доску отладки Интерфейс как модуль Out PROCEDURE Open открывает доску отладки ------------------------------------------------------------------------------ MODULE File - работа с файловой системой TYPE FNAME = ARRAY 520 OF CHAR FS = POINTER TO rFS rFS = RECORD (* информационная структура файла *) subfunc, pos, hpos, bytes, buffer: INTEGER; name: FNAME END FD = POINTER TO rFD rFD = RECORD (* структура блока данных входа каталога *) attr: INTEGER; ntyp: CHAR; reserved: ARRAY 3 OF CHAR; time_create, date_create, time_access, date_access, time_modif, date_modif, size, hsize: INTEGER; name: FNAME END CONST SEEK_BEG = 0 SEEK_CUR = 1 SEEK_END = 2 PROCEDURE Load(FName: ARRAY OF CHAR; VAR size: INTEGER): INTEGER; Загружает в память файл с именем FName, записывает в параметр size размер файла, возвращает адрес загруженного файла или 0 (ошибка). При необходимости, распаковывает файл (kunpack). PROCEDURE GetFileInfo(FName: ARRAY OF CHAR; VAR Info: rFD): BOOLEAN Записывает структуру блока данных входа каталога для файла или папки с именем FName в параметр Info. При ошибке возвращает FALSE. PROCEDURE Exists(FName: ARRAY OF CHAR): BOOLEAN возвращает TRUE, если файл с именем FName существует PROCEDURE Close(VAR F: FS) освобождает память, выделенную для информационной структуры файла F и присваивает F значение NIL PROCEDURE Open(FName: ARRAY OF CHAR): FS возвращает указатель на информационную структуру файла с именем FName, при ошибке возвращает NIL PROCEDURE Delete(FName: ARRAY OF CHAR): BOOLEAN удаляет файл с именем FName, при ошибке возвращает FALSE PROCEDURE Seek(F: FS; Offset, Origin: INTEGER): INTEGER устанавливает позицию чтения-записи файла F на Offset, относительно Origin = (SEEK_BEG - начало файла, SEEK_CUR - текущая позиция, SEEK_END - конец файла), возвращает позицию относительно начала файла, например: Seek(F, 0, SEEK_END) устанавливает позицию на конец файла и возвращает длину файла; при ошибке возвращает -1 PROCEDURE Read(F: FS; Buffer, Count: INTEGER): INTEGER Читает данные из файла в память. F - указатель на информационную структуру файла, Buffer - адрес области памяти, Count - количество байт, которое требуется прочитать из файла; возвращает количество байт, которое было прочитано и соответствующим образом изменяет позицию чтения/записи в информационной структуре F. PROCEDURE Write(F: FS; Buffer, Count: INTEGER): INTEGER Записывает данные из памяти в файл. F - указатель на информационную структуру файла, Buffer - адрес области памяти, Count - количество байт, которое требуется записать в файл; возвращает количество байт, которое было записано и соответствующим образом изменяет позицию чтения/записи в информационной структуре F. PROCEDURE Create(FName: ARRAY OF CHAR): FS создает новый файл с именем FName (полное имя), возвращает указатель на информационную структуру файла, при ошибке возвращает NIL PROCEDURE CreateDir(DirName: ARRAY OF CHAR): BOOLEAN создает папку с именем DirName, все промежуточные папки должны существовать, при ошибке возвращает FALSE PROCEDURE DeleteDir(DirName: ARRAY OF CHAR): BOOLEAN удаляет пустую папку с именем DirName, при ошибке возвращает FALSE PROCEDURE DirExists(DirName: ARRAY OF CHAR): BOOLEAN возвращает TRUE, если папка с именем DirName существует ------------------------------------------------------------------------------ MODULE Read - чтение основных типов данных из файла F Процедуры возвращают TRUE в случае успешной операции чтения и соответствующим образом изменяют позицию чтения/записи в информационной структуре F PROCEDURE Char(F: File.FS; VAR x: CHAR): BOOLEAN PROCEDURE Int(F: File.FS; VAR x: INTEGER): BOOLEAN PROCEDURE Real(F: File.FS; VAR x: REAL): BOOLEAN PROCEDURE LongReal(F: File.FS; VAR x: LONGREAL): BOOLEAN PROCEDURE Boolean(F: File.FS; VAR x: BOOLEAN): BOOLEAN PROCEDURE Set(F: File.FS; VAR x: SET): BOOLEAN PROCEDURE Card16(F: File.FS; VAR x: SYSTEM.CARD16): BOOLEAN ------------------------------------------------------------------------------ MODULE Write - запись основных типов данных в файл F Процедуры возвращают TRUE в случае успешной операции записи и соответствующим образом изменяют позицию чтения/записи в информационной структуре F PROCEDURE Char(F: File.FS; x: CHAR): BOOLEAN PROCEDURE Int(F: File.FS; x: INTEGER): BOOLEAN PROCEDURE Real(F: File.FS; x: REAL): BOOLEAN PROCEDURE LongReal(F: File.FS; x: LONGREAL): BOOLEAN PROCEDURE Boolean(F: File.FS; x: BOOLEAN): BOOLEAN PROCEDURE Set(F: File.FS; x: SET): BOOLEAN PROCEDURE Card16(F: File.FS; x: SYSTEM.CARD16): BOOLEAN ------------------------------------------------------------------------------ MODULE DateTime - дата, время CONST ERR = -7.0D5 PROCEDURE Now(VAR Year, Month, Day, Hour, Min, Sec: INTEGER) записывает в параметры компоненты текущей системной даты и времени PROCEDURE Encode(Year, Month, Day, Hour, Min, Sec: INTEGER): LONGREAL возвращает дату, полученную из компонентов Year, Month, Day, Hour, Min, Sec; при ошибке возвращает константу ERR = -7.0D5 PROCEDURE Decode(Date: LONGREAL; VAR Year, Month, Day, Hour, Min, Sec: INTEGER): BOOLEAN извлекает компоненты Year, Month, Day, Hour, Min, Sec из даты Date; при ошибке возвращает FALSE ------------------------------------------------------------------------------ MODULE Args - параметры программы VAR argc: INTEGER количество параметров программы, включая имя исполняемого файла PROCEDURE GetArg(n: INTEGER; VAR s: ARRAY OF CHAR) записывает в строку s n-й параметр программы, нумерация параметров от 0 до argc - 1, нулевой параметр -- имя исполняемого файла ------------------------------------------------------------------------------ MODULE KOSAPI PROCEDURE sysfunc1(arg1: INTEGER): INTEGER PROCEDURE sysfunc2(arg1, arg2: INTEGER): INTEGER ... PROCEDURE sysfunc7(arg1, arg2, ..., arg7: INTEGER): INTEGER Обертки для функций API ядра KolibriOS. arg1 .. arg7 соответствуют регистрам eax, ebx, ecx, edx, esi, edi, ebp; возвращают значение регистра eax после системного вызова. PROCEDURE sysfunc22(arg1, arg2: INTEGER; VAR res2: INTEGER): INTEGER Обертка для функций API ядра KolibriOS. arg1 - регистр eax, arg2 - регистр ebx, res2 - значение регистра ebx после системного вызова; возвращает значение регистра eax после системного вызова. PROCEDURE malloc(size: INTEGER): INTEGER Выделяет блок памяти. size - размер блока в байтах, возвращает адрес выделенного блока PROCEDURE free(ptr: INTEGER): INTEGER Освобождает ранее выделенный блок памяти с адресом ptr, возвращает 0 PROCEDURE realloc(ptr, size: INTEGER): INTEGER Перераспределяет блок памяти, ptr - адрес ранее выделенного блока, size - новый размер, возвращает указатель на перераспределенный блок, 0 при ошибке PROCEDURE GetCommandLine(): INTEGER Возвращает адрес строки параметров PROCEDURE GetName(): INTEGER Возвращает адрес строки с именем программы PROCEDURE LoadLib(name: ARRAY OF CHAR): INTEGER Загружает DLL с полным именем name. Возвращает адрес таблицы экспорта. При ошибке возвращает 0. PROCEDURE GetProcAdr(name: ARRAY OF CHAR; lib: INTEGER): INTEGER name - имя процедуры lib - адрес таблицы экспорта DLL Возвращает адрес процедуры. При ошибке возвращает 0. ------------------------------------------------------------------------------ MODULE ColorDlg - работа с диалогом "Color Dialog" TYPE Dialog = POINTER TO RECORD (* структура диалога *) status: INTEGER (* состояние диалога: 0 - пользователь нажал Cancel 1 - пользователь нажал OK 2 - диалог открыт *) color: INTEGER (* выбранный цвет *) END PROCEDURE Create(draw_window: DRAW_WINDOW): Dialog создать диалог draw_window - процедура перерисовки основного окна (TYPE DRAW_WINDOW = PROCEDURE); процедура возвращает указатель на структуру диалога PROCEDURE Show(cd: Dialog) показать диалог cd - указатель на структуру диалога, который был создан ранее процедурой Create PROCEDURE Destroy(VAR cd: Dialog) уничтожить диалог cd - указатель на структуру диалога ------------------------------------------------------------------------------ MODULE OpenDlg - работа с диалогом "Open Dialog" TYPE Dialog = POINTER TO RECORD (* структура диалога *) status: INTEGER (* состояние диалога: 0 - пользователь нажал Cancel 1 - пользователь нажал OK 2 - диалог открыт *) FileName: ARRAY 4096 OF CHAR (* имя выбранного файла *) FilePath: ARRAY 4096 OF CHAR (* полное имя выбранного файла *) END PROCEDURE Create(draw_window: DRAW_WINDOW; type: INTEGER; def_path, filter: ARRAY OF CHAR): Dialog создать диалог draw_window - процедура перерисовки основного окна (TYPE DRAW_WINDOW = PROCEDURE) type - тип диалога 0 - открыть 1 - сохранить 2 - выбрать папку def_path - путь по умолчанию, папка def_path будет открыта при первом запуске диалога filter - в строке записано перечисление расширений файлов, которые будут показаны в диалоговом окне, расширения разделяются символом "|", например: "ASM|TXT|INI" процедура возвращает указатель на структуру диалога PROCEDURE Show(od: Dialog; Width, Height: INTEGER) показать диалог od - указатель на структуру диалога, который был создан ранее процедурой Create Width и Height - ширина и высота диалогового окна PROCEDURE Destroy(VAR od: Dialog) уничтожить диалог od - указатель на структуру диалога ------------------------------------------------------------------------------ MODULE kfonts - работа с kf-шрифтами CONST bold = 1 italic = 2 underline = 4 strike_through = 8 smoothing = 16 bpp32 = 32 TYPE TFont = POINTER TO TFont_desc (* указатель на шрифт *) PROCEDURE LoadFont(file_name: ARRAY OF CHAR): TFont загрузить шрифт из файла file_name имя kf-файла рез-т: указатель на шрифт/NIL (ошибка) PROCEDURE SetSize(Font: TFont; font_size: INTEGER): BOOLEAN установить размер шрифта Font указатель на шрифт font_size размер шрифта рез-т: TRUE/FALSE (ошибка) PROCEDURE Enabled(Font: TFont; font_size: INTEGER): BOOLEAN проверить, есть ли шрифт, заданного размера Font указатель на шрифт font_size размер шрифта рез-т: TRUE/FALSE (шрифта нет) PROCEDURE Destroy(VAR Font: TFont) выгрузить шрифт, освободить динамическую память Font указатель на шрифт Присваивает переменной Font значение NIL PROCEDURE TextHeight(Font: TFont): INTEGER получить высоту строки текста Font указатель на шрифт рез-т: высота строки текста в пикселях PROCEDURE TextWidth(Font: TFont; str, length, params: INTEGER): INTEGER получить ширину строки текста Font указатель на шрифт str адрес строки текста в кодировке Win-1251 length количество символов в строке или -1, если строка завершается нулем params параметры-флаги см. ниже рез-т: ширина строки текста в пикселях PROCEDURE TextOut(Font: TFont; canvas, x, y, str, length, color, params: INTEGER) вывести текст в буфер для вывода буфера в окно, использовать ф.65 или ф.7 (если буфер 24-битный) Font указатель на шрифт canvas адрес графического буфера структура буфера: Xsize dd Ysize dd picture rb Xsize * Ysize * 4 (32 бита) или Xsize * Ysize * 3 (24 бита) x, y координаты текста относительно левого верхнего угла буфера str адрес строки текста в кодировке Win-1251 length количество символов в строке или -1, если строка завершается нулем color цвет текста 0x00RRGGBB params параметры-флаги: 1 жирный 2 курсив 4 подчеркнутый 8 перечеркнутый 16 применить сглаживание 32 вывод в 32-битный буфер возможно использование флагов в любых сочетаниях ------------------------------------------------------------------------------ MODULE RasterWorks - обертка библиотеки Rasterworks.obj ------------------------------------------------------------------------------ MODULE libimg - обертка библиотеки libimg.obj ------------------------------------------------------------------------------ MODULE NetDevices - обертка для ф.74 (работа с сетевыми устройствами) ------------------------------------------------------------------------------