Rev 7107 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
6613 | leency | 1 | Компилятор языка программирования Oberon-07/11 для i386 |
2 | Windows/Linux/KolibriOS. |
||
3 | ------------------------------------------------------------------------------ |
||
4 | |||
5 | Состав программы |
||
6 | |||
7 | 1. Compiler.kex (KolibriOS) - исполняемый файл компилятора. |
||
8 | Вход - текстовые файлы модулей с расширением ".ob07", кодировка ANSI |
||
9 | или UTF-8 с BOM-сигнатурой. |
||
10 | Выход - исполняемый файл формата PE, ELF или MENUET01/MS COFF. |
||
11 | Параметры: |
||
12 | 1) имя главного модуля |
||
13 | 2) тип приложения и платформа |
||
14 | "con" - Windows console |
||
15 | "gui" - Windows GUI |
||
16 | "dll" - Windows DLL |
||
17 | "elf" - Linux |
||
18 | "kos" - KolibriOS |
||
19 | "obj" - KolibriOS DLL |
||
7209 | akron1 | 20 | "kem" - KolibriOS с адресом загрузки 0x10000 для возможного |
21 | исполнения в эмуляторе |
||
6613 | leency | 22 | 3) размер стэка в мегабайтах, необязательный параметр, по умолчанию - |
23 | 1 Мб, для ELF игнорируется. Если 2-й параметр = "obj" (KolibriOS DLL), |
||
24 | то 3-й параметр задается шестнадцатиричным числом |
||
25 | (0x00000001 .. 0xffffffff) и определяет версию программы, |
||
26 | по умолчанию - 0x00010000 (v1.0). |
||
27 | Например: |
||
28 | "C:\oberon-07\example.ob07" con 1 |
||
29 | "C:\oberon-07\example.ob07" obj 0x00020005 (* v2.5 *) |
||
30 | В случае успешной компиляции, компилятор передает код завершения 0, |
||
31 | иначе 1. При работе компилятора в KolibriOS, код завершения не |
||
32 | передается. Сообщения компилятора выводятся на консоль (Windows, |
||
33 | KolibriOS), в терминал (Linux). |
||
34 | 2. Папка Lib - библиотека модулей |
||
35 | |||
36 | ------------------------------------------------------------------------------ |
||
37 | Отличия от оригинала |
||
38 | |||
39 | 1. Расширен псевдомодуль SYSTEM |
||
40 | 2. Разрешен символ "_" в идентификаторах |
||
41 | 3. Добавлены системные флаги |
||
42 | 4. Оператор CASE реализован в соответствии с синтаксисом и семантикой |
||
43 | данного оператора в языке Oberon (Revision 1.10.90) |
||
44 | 5. Расширен набор стандартных процедур |
||
45 | 6. Семантика охраны/проверки типа уточнена для нулевого указателя |
||
46 | 7. Семантика DIV и MOD уточнена для отрицательных чисел |
||
47 | 8. Добавлены однострочные комментарии (начинаются с пары символов "//") |
||
48 | 9. Разрешен экспорт переменных типов ARRAY и RECORD (только для чтения) |
||
7107 | akron1 | 49 | 10. Разрешено наследование от типа-указателя |
50 | 11. Добавлены псевдонимы типов (TYPE A = B) |
||
6613 | leency | 51 | |
52 | ------------------------------------------------------------------------------ |
||
53 | Особенности реализации |
||
54 | |||
55 | 1. Основные типы |
||
56 | |||
57 | Тип Диапазон значений Размер, байт |
||
58 | |||
59 | INTEGER -2147483648 .. 2147483647 4 |
||
60 | REAL 1.40E-45 .. 3.34E+38 4 |
||
61 | LONGREAL 4.94E-324 .. 1.70E+308 8 |
||
62 | CHAR символ ASCII (0X .. 0FFX) 1 |
||
63 | BOOLEAN FALSE, TRUE 1 |
||
64 | SET множество из целых чисел {0 .. 31} 4 |
||
65 | |||
66 | 2. Максимальная длина идентификаторов - 255 символов |
||
67 | 3. Максимальная длина строковых констант - 255 символов |
||
68 | 4. Максимальная длина строк исходного кода - 511 символов |
||
69 | 5. Максимальная размерность открытых массивов - 5 |
||
70 | 6. Максимальное количество объявленных типов-записей - 2047 |
||
71 | 7. Процедура NEW заполняет нулями выделенный блок памяти |
||
72 | 8. Глобальные и локальные переменные инициализируются нулями |
||
73 | 9. В отличие от многих Oberon-реализаций, сборщик мусора и динамическая |
||
74 | модульность отсутствуют |
||
75 | |||
76 | ------------------------------------------------------------------------------ |
||
77 | Псевдомодуль SYSTEM |
||
78 | |||
79 | Псевдомодуль SYSTEM содержит низкоуровневые и небезопасные процедуры, |
||
80 | ошибки при использовании процедур псевдомодуля SYSTEM могут привести к |
||
81 | повреждению данных времени выполнения и аварийному завершению программы. |
||
82 | |||
83 | PROCEDURE ADR(v: любой тип): INTEGER |
||
84 | v - переменная, процедура или строковая константа; |
||
85 | возвращает адрес v |
||
86 | |||
87 | PROCEDURE SIZE(T): INTEGER |
||
88 | возвращает размер типа T |
||
89 | |||
90 | PROCEDURE TYPEID(T): INTEGER |
||
91 | T - тип-запись или тип-указатель, |
||
92 | возвращает номер типа в таблице типов-записей |
||
93 | |||
94 | PROCEDURE INF(T): T |
||
95 | T - REAL или LONGREAL, |
||
96 | возвращает специальное вещественное значение "бесконечность" |
||
97 | |||
98 | PROCEDURE GET(a: INTEGER; |
||
7107 | akron1 | 99 | VAR v: любой основной тип, PROCEDURE, POINTER) |
6613 | leency | 100 | v := Память[a] |
101 | |||
102 | PROCEDURE PUT(a: INTEGER; x: любой основной тип, PROCEDURE, POINTER) |
||
103 | Память[a] := x |
||
104 | |||
105 | PROCEDURE MOVE(Source, Dest, n: INTEGER) |
||
106 | Копирует n байт памяти из Source в Dest, |
||
107 | области Source и Dest не должны перекрываться |
||
108 | |||
7107 | akron1 | 109 | PROCEDURE COPY(VAR Source: любой тип; VAR Dest: любой тип; n: INTEGER) |
110 | Копирует n байт памяти из Source в Dest. |
||
111 | Эквивалентно |
||
112 | SYSTEM.MOVE(SYSTEM.ADR(Source), SYSTEM.ADR(Dest), n) |
||
113 | |||
6613 | leency | 114 | PROCEDURE CODE(s: ARRAY OF CHAR) |
115 | Вставка машинного кода |
||
116 | s - строковая константа шестнадцатиричных цифр |
||
117 | количество цифр должно быть четным |
||
118 | например: SYSTEM.CODE("B801000000") (* mov eax, 1 *) |
||
119 | |||
120 | Также в модуле SYSTEM определен тип CARD16 (2 байта). Для типа CARD16 не |
||
121 | допускаются никакие явные операции, за исключением присваивания. |
||
122 | Преобразования CARD16 -> INTEGER и INTEGER -> CARD16 могут быть реализованы |
||
123 | так: |
||
124 | |||
125 | PROCEDURE Card16ToInt(w: SYSTEM.CARD16): INTEGER; |
||
126 | VAR i: INTEGER; |
||
127 | BEGIN |
||
128 | SYSTEM.PUT(SYSTEM.ADR(i), w) |
||
129 | RETURN i |
||
130 | END Card16ToInt; |
||
131 | |||
132 | PROCEDURE IntToCard16(i: INTEGER): SYSTEM.CARD16; |
||
133 | VAR w: SYSTEM.CARD16; |
||
134 | BEGIN |
||
135 | SYSTEM.GET(SYSTEM.ADR(i), w) |
||
136 | RETURN w |
||
137 | END IntToCard16; |
||
138 | |||
139 | Функции псевдомодуля SYSTEM нельзя использовать в константных выражениях. |
||
140 | |||
141 | ------------------------------------------------------------------------------ |
||
142 | Системные флаги |
||
143 | |||
144 | При объявлении процедурных типов и глобальных процедур, после ключевого |
||
145 | слова PROCEDURE может быть указан флаг соглашения вызова: [stdcall], [cdecl] |
||
146 | или [winapi]. Например: |
||
147 | |||
148 | PROCEDURE [cdecl] MyProc(x, y, z: INTEGER): INTEGER; |
||
149 | |||
150 | Если указан флаг [winapi], то принимается соглашение stdcall и |
||
151 | процедуру-функцию можно вызвать как собственно процедуру, вне выражения. |
||
152 | Флаг [winapi] доступен только для платформы Windows. |
||
153 | При объявлении типов-записей, после ключевого слова RECORD может быть |
||
154 | указан флаг [noalign] или [union]. Флаг [noalign] означает отсутствие |
||
155 | выравнивания полей записи, а флаг [union] означает, что смещения всех полей |
||
156 | записи равны нулю, при этом размер записи равен размеру наибольшего поля. |
||
157 | Записи RECORD [union] ... END соответствуют объединениям (union) в языке C. |
||
158 | Записи с системными флагами не могут иметь базового типа и не могут быть |
||
159 | базовыми типами для других записей. |
||
160 | Для использования системных флагов, требуется импортировать SYSTEM. |
||
161 | |||
162 | ------------------------------------------------------------------------------ |
||
163 | Оператор CASE |
||
164 | |||
165 | Синтаксис оператора CASE: |
||
166 | |||
167 | CaseStatement = |
||
168 | CASE Expression OF Сase {"|" Сase} |
||
169 | [ELSE StatementSequence] END. |
||
170 | Case = [CaseLabelList ":" StatementSequence]. |
||
171 | CaseLabelList = CaseLabels {"," CaseLabels}. |
||
172 | CaseLabels = ConstExpression [".." ConstExpression]. |
||
173 | |||
174 | Например: |
||
175 | |||
176 | CASE x OF |
||
177 | |-1: DoSomething1 |
||
178 | | 1: DoSomething2 |
||
179 | | 0: DoSomething3 |
||
180 | ELSE |
||
181 | DoSomething4 |
||
182 | END |
||
183 | |||
184 | В метках вариантов можно использовать константные выражения, ветка ELSE |
||
185 | необязательна. Если не выполнен ни один вариант и ELSE отсутствует, то |
||
186 | программа прерывается с ошибкой времени выполнения. |
||
187 | |||
188 | ------------------------------------------------------------------------------ |
||
189 | Проверка и охрана типа нулевого указателя |
||
190 | |||
191 | Оригинальное сообщение о языке не определяет поведение программы при |
||
192 | выполнении охраны p(T) и проверки типа p IS T при p = NIL. Во многих |
||
193 | Oberon-реализациях выполнение такой операции приводит к ошибке времени |
||
194 | выполнения. В данной реализации охрана типа нулевого указателя не приводит к |
||
195 | ошибке, а проверка типа дает результат FALSE. В ряде случаев это позволяет |
||
196 | значительно сократить частоту применения охраны типа. |
||
197 | |||
198 | ------------------------------------------------------------------------------ |
||
199 | Дополнительные стандартные процедуры |
||
200 | |||
201 | DISPOSE(VAR v: любой_указатель) |
||
202 | Освобождает память, выделенную процедурой NEW для |
||
203 | динамической переменной v^, и присваивает переменной v |
||
204 | значение NIL. |
||
205 | |||
206 | LSR(x, n: INTEGER): INTEGER |
||
207 | Логический сдвиг x на n бит вправо. |
||
208 | |||
7107 | akron1 | 209 | MIN(a, b: INTEGER): INTEGER |
210 | Минимум из двух значений. |
||
211 | |||
212 | MAX(a, b: INTEGER): INTEGER |
||
213 | Максимум из двух значений. |
||
214 | |||
6613 | leency | 215 | BITS(x: INTEGER): SET |
216 | Интерпретирует x как значение типа SET. |
||
217 | Выполняется на этапе компиляции. |
||
218 | |||
219 | LENGTH(s: ARRAY OF CHAR): INTEGER |
||
220 | Длина 0X-завершенной строки s, без учета символа 0X. |
||
221 | Если символ 0X отсутствует, функция возвращает длину |
||
222 | массива s. |
||
223 | |||
224 | ------------------------------------------------------------------------------ |
||
225 | DIV и MOD |
||
226 | |||
227 | x y x DIV y x MOD y |
||
228 | |||
229 | 5 3 1 2 |
||
230 | -5 3 -2 1 |
||
231 | 5 -3 -2 -1 |
||
232 | -5 -3 1 -2 |
||
233 | |||
234 | ------------------------------------------------------------------------------ |
||
235 | Скрытые параметры процедур |
||
236 | |||
237 | Некоторые процедуры могут иметь скрытые параметры, они отсутствуют в списке |
||
238 | формальных параметров, но учитываются компилятором при трансляции вызовов. |
||
239 | Это возможно в следующих случаях: |
||
240 | |||
241 | 1. Процедура имеет формальный параметр открытый массив: |
||
242 | PROCEDURE Proc(x: ARRAY OF ARRAY OF LONGREAL); |
||
243 | Вызов транслируется так: |
||
244 | Proc(SYSTEM.ADR(x), LEN(x), LEN(x[0]) |
||
245 | 2. Процедура имеет формальный параметр-переменную типа RECORD: |
||
246 | PROCEDURE Proc(VAR x: Rec); |
||
247 | Вызов транслируется так: |
||
248 | Proc(SYSTEM.TYPEID(Rec), SYSTEM.ADR(x)) |
||
249 | 3. Процедура является вложенной, глубина вложения k, |
||
250 | для глобальных процедур k = 0: |
||
251 | PROCEDURE Proc(p1, ..., pn); |
||
252 | Вызов транслируется так: |
||
253 | Proc(base(k - 1), base(k - 2), ..., base(0), p1, ..., pn), |
||
254 | где base(m) - адрес базы кадра стэка охватывающей процедуры глубины |
||
255 | вложения m (используется для доступа к локальным переменным |
||
256 | охватывающей процедуры) |
||
257 | |||
258 | ------------------------------------------------------------------------------ |
||
259 | Модуль RTL |
||
260 | |||
261 | Все программы неявно используют модуль RTL. Компилятор транслирует |
||
262 | некоторые операции (проверка и охрана типа, сравнение строк, сообщения об |
||
263 | ошибках времени выполнения и др.) как вызовы процедур этого модуля. Не |
||
264 | следует явно вызывать эти процедуры, за исключением процедуры SetClose: |
||
265 | |||
266 | PROCEDURE SetClose(proc: PROC), где TYPE PROC = PROCEDURE |
||
267 | |||
268 | SetClose назначает процедуру proc (без параметров) вызываемой при выгрузке |
||
269 | dll-библиотеки (Windows), если приложение компилируется как Windows DLL. Для |
||
270 | прочих типов приложений и платформ вызов процедуры SetClose не влияет на |
||
271 | поведение программы. |
||
272 | Сообщения об ошибках времени выполнения выводятся в диалоговых окнах |
||
273 | (Windows), в терминал (Linux), на доску отладки (KolibriOS). |
||
274 | |||
275 | ------------------------------------------------------------------------------ |
||
276 | Модуль API |
||
277 | |||
278 | Существуют три реализации модуля API: для Windows, Linux и KolibriOS. Как и |
||
279 | модуль RTL, модуль API не предназначен для прямого использования. Он |
||
280 | обеспечивает кроссплатформенность компилятора. |
||
281 | |||
282 | ------------------------------------------------------------------------------ |
||
283 | Генерация исполняемых файлов DLL |
||
284 | |||
285 | Разрешается экспортировать только процедуры. Для этого, процедура должна |
||
286 | находиться в главном модуле программы, и ее имя должно быть отмечено символом |
||
287 | экспорта ("*"). KolibriOS DLL всегда экспортируют идентификаторы "version" |
||
288 | (версия программы) и "lib_init" - адрес процедуры инициализации DLL: |
||
289 | |||
290 | PROCEDURE [stdcall] lib_init(): INTEGER |
||
291 | |||
292 | Эта процедура должна быть вызвана перед использованием DLL. |
||
293 | Процедура всегда возвращает 1. |
||
294 | В настоящее время генерация DLL для Linux не реализована. |
||
295 | |||
296 | ============================================================================== |
||
297 | ============================================================================== |
||
298 | |||
299 | Библиотека (KolibriOS) |
||
300 | |||
301 | ------------------------------------------------------------------------------ |
||
302 | MODULE Out - консольный вывод |
||
303 | |||
304 | PROCEDURE Open |
||
305 | формально открывает консольный вывод |
||
306 | |||
307 | PROCEDURE Int(x, width: INTEGER) |
||
308 | вывод целого числа x; |
||
309 | width - количество знакомест, используемых для вывода |
||
310 | |||
311 | PROCEDURE Real(x: LONGREAL; width: INTEGER) |
||
312 | вывод вещественного числа x в плавающем формате; |
||
313 | width - количество знакомест, используемых для вывода |
||
314 | |||
315 | PROCEDURE Char(x: CHAR) |
||
316 | вывод символа x |
||
317 | |||
318 | PROCEDURE FixReal(x: LONGREAL; width, p: INTEGER) |
||
319 | вывод вещественного числа x в фиксированном формате; |
||
320 | width - количество знакомест, используемых для вывода; |
||
321 | p - количество знаков после десятичной точки |
||
322 | |||
323 | PROCEDURE Ln |
||
324 | переход на следующую строку |
||
325 | |||
326 | PROCEDURE String(s: ARRAY OF CHAR) |
||
327 | вывод строки s |
||
328 | |||
329 | ------------------------------------------------------------------------------ |
||
330 | MODULE In - консольный ввод |
||
331 | |||
332 | VAR Done: BOOLEAN |
||
333 | принимает значение TRUE в случае успешного выполнения |
||
334 | операции ввода, иначе FALSE |
||
335 | |||
336 | PROCEDURE Open |
||
337 | формально открывает консольный ввод, |
||
338 | также присваивает переменной Done значение TRUE |
||
339 | |||
340 | PROCEDURE Int(VAR x: INTEGER) |
||
341 | ввод числа типа INTEGER |
||
342 | |||
343 | PROCEDURE Char(VAR x: CHAR) |
||
344 | ввод символа |
||
345 | |||
346 | PROCEDURE Real(VAR x: REAL) |
||
347 | ввод числа типа REAL |
||
348 | |||
349 | PROCEDURE LongReal(VAR x: LONGREAL) |
||
350 | ввод числа типа LONGREAL |
||
351 | |||
352 | PROCEDURE String(VAR s: ARRAY OF CHAR) |
||
353 | ввод строки |
||
354 | |||
355 | PROCEDURE Ln |
||
356 | ожидание нажатия ENTER |
||
357 | |||
358 | ------------------------------------------------------------------------------ |
||
359 | MODULE Console - дополнительные процедуры консольного вывода |
||
360 | |||
361 | CONST |
||
362 | |||
363 | Следующие константы определяют цвет консольного вывода |
||
364 | |||
365 | Black = 0 Blue = 1 Green = 2 |
||
366 | Cyan = 3 Red = 4 Magenta = 5 |
||
367 | Brown = 6 LightGray = 7 DarkGray = 8 |
||
368 | LightBlue = 9 LightGreen = 10 LightCyan = 11 |
||
369 | LightRed = 12 LightMagenta = 13 Yellow = 14 |
||
370 | White = 15 |
||
371 | |||
372 | PROCEDURE Cls |
||
373 | очистка окна консоли |
||
374 | |||
375 | PROCEDURE SetColor(FColor, BColor: INTEGER) |
||
376 | установка цвета консольного вывода: FColor - цвет текста, |
||
377 | BColor - цвет фона, возможные значения - вышеперечисленные |
||
378 | константы |
||
379 | |||
380 | PROCEDURE SetCursor(x, y: INTEGER) |
||
381 | установка курсора консоли в позицию (x, y) |
||
382 | |||
383 | PROCEDURE GetCursor(VAR x, y: INTEGER) |
||
384 | записывает в параметры текущие координаты курсора консоли |
||
385 | |||
386 | PROCEDURE GetCursorX(): INTEGER |
||
387 | возвращает текущую x-координату курсора консоли |
||
388 | |||
389 | PROCEDURE GetCursorY(): INTEGER |
||
390 | возвращает текущую y-координату курсора консоли |
||
391 | |||
392 | ------------------------------------------------------------------------------ |
||
393 | MODULE ConsoleLib - обертка библиотеки console.obj |
||
394 | |||
395 | ------------------------------------------------------------------------------ |
||
396 | MODULE Math - математические функции |
||
397 | |||
398 | CONST |
||
399 | |||
400 | pi = 3.141592653589793D+00 |
||
401 | e = 2.718281828459045D+00 |
||
402 | |||
403 | VAR |
||
404 | |||
405 | Inf, nInf: LONGREAL |
||
406 | положительная и отрицательная бесконечность |
||
407 | |||
408 | PROCEDURE IsNan(x: LONGREAL): BOOLEAN |
||
409 | возвращает TRUE, если x - не число |
||
410 | |||
411 | PROCEDURE IsInf(x: LONGREAL): BOOLEAN |
||
412 | возвращает TRUE, если x - бесконечность |
||
413 | |||
414 | PROCEDURE sqrt(x: LONGREAL): LONGREAL |
||
415 | квадратный корень x |
||
416 | |||
417 | PROCEDURE exp(x: LONGREAL): LONGREAL |
||
418 | экспонента x |
||
419 | |||
420 | PROCEDURE ln(x: LONGREAL): LONGREAL |
||
421 | натуральный логарифм x |
||
422 | |||
423 | PROCEDURE sin(x: LONGREAL): LONGREAL |
||
424 | синус x |
||
425 | |||
426 | PROCEDURE cos(x: LONGREAL): LONGREAL |
||
427 | косинус x |
||
428 | |||
429 | PROCEDURE tan(x: LONGREAL): LONGREAL |
||
430 | тангенс x |
||
431 | |||
432 | PROCEDURE arcsin(x: LONGREAL): LONGREAL |
||
433 | арксинус x |
||
434 | |||
435 | PROCEDURE arccos(x: LONGREAL): LONGREAL |
||
436 | арккосинус x |
||
437 | |||
438 | PROCEDURE arctan(x: LONGREAL): LONGREAL |
||
439 | арктангенс x |
||
440 | |||
441 | PROCEDURE arctan2(y, x: LONGREAL): LONGREAL |
||
442 | арктангенс y/x |
||
443 | |||
444 | PROCEDURE power(base, exponent: LONGREAL): LONGREAL |
||
445 | возведение числа base в степень exponent |
||
446 | |||
447 | PROCEDURE log(base, x: LONGREAL): LONGREAL |
||
448 | логарифм x по основанию base |
||
449 | |||
450 | PROCEDURE sinh(x: LONGREAL): LONGREAL |
||
451 | гиперболический синус x |
||
452 | |||
453 | PROCEDURE cosh(x: LONGREAL): LONGREAL |
||
454 | гиперболический косинус x |
||
455 | |||
456 | PROCEDURE tanh(x: LONGREAL): LONGREAL |
||
457 | гиперболический тангенс x |
||
458 | |||
459 | PROCEDURE arcsinh(x: LONGREAL): LONGREAL |
||
460 | обратный гиперболический синус x |
||
461 | |||
462 | PROCEDURE arccosh(x: LONGREAL): LONGREAL |
||
463 | обратный гиперболический косинус x |
||
464 | |||
465 | PROCEDURE arctanh(x: LONGREAL): LONGREAL |
||
466 | обратный гиперболический тангенс x |
||
467 | |||
468 | PROCEDURE round(x: LONGREAL): LONGREAL |
||
469 | округление x до ближайшего целого |
||
470 | |||
471 | PROCEDURE frac(x: LONGREAL): LONGREAL; |
||
472 | дробная часть числа x |
||
473 | |||
474 | PROCEDURE floor(x: LONGREAL): LONGREAL |
||
475 | наибольшее целое число (представление как LONGREAL), |
||
476 | не больше x: floor(1.2) = 1.0 |
||
477 | |||
478 | PROCEDURE ceil(x: LONGREAL): LONGREAL |
||
479 | наименьшее целое число (представление как LONGREAL), |
||
480 | не меньше x: ceil(1.2) = 2.0 |
||
481 | |||
482 | PROCEDURE sgn(x: LONGREAL): INTEGER |
||
483 | если x > 0 возвращает 1 |
||
484 | если x < 0 возвращает -1 |
||
485 | если x = 0 возвращает 0 |
||
486 | |||
487 | ------------------------------------------------------------------------------ |
||
488 | MODULE Debug - вывод на доску отладки |
||
489 | Интерфейс как модуль Out |
||
490 | |||
491 | PROCEDURE Open |
||
492 | открывает доску отладки |
||
493 | |||
494 | ------------------------------------------------------------------------------ |
||
495 | MODULE File - работа с файловой системой |
||
496 | |||
497 | TYPE |
||
498 | |||
499 | FNAME = ARRAY 520 OF CHAR |
||
500 | |||
501 | FS = POINTER TO rFS |
||
502 | |||
503 | rFS = RECORD (* информационная структура файла *) |
||
504 | subfunc, pos, hpos, bytes, buffer: INTEGER; |
||
505 | name: FNAME |
||
506 | END |
||
507 | |||
508 | FD = POINTER TO rFD |
||
509 | |||
510 | rFD = RECORD (* структура блока данных входа каталога *) |
||
511 | attr: INTEGER; |
||
512 | ntyp: CHAR; |
||
513 | reserved: ARRAY 3 OF CHAR; |
||
514 | time_create, date_create, |
||
515 | time_access, date_access, |
||
516 | time_modif, date_modif, |
||
517 | size, hsize: INTEGER; |
||
518 | name: FNAME |
||
519 | END |
||
520 | |||
521 | CONST |
||
522 | |||
523 | SEEK_BEG = 0 |
||
524 | SEEK_CUR = 1 |
||
525 | SEEK_END = 2 |
||
526 | |||
527 | PROCEDURE Load(FName: ARRAY OF CHAR; VAR size: INTEGER): INTEGER; |
||
528 | Загружает в память файл с именем FName, записывает в параметр |
||
529 | size размер файла, возвращает адрес загруженного файла |
||
530 | или 0 (ошибка). При необходимости, распаковывает |
||
531 | файл (kunpack). |
||
532 | |||
533 | PROCEDURE GetFileInfo(FName: ARRAY OF CHAR; VAR Info: rFD): BOOLEAN |
||
534 | Записывает структуру блока данных входа каталога для файла |
||
535 | или папки с именем FName в параметр Info. |
||
536 | При ошибке возвращает FALSE. |
||
537 | |||
538 | PROCEDURE Exists(FName: ARRAY OF CHAR): BOOLEAN |
||
539 | возвращает TRUE, если файл с именем FName существует |
||
540 | |||
541 | PROCEDURE Close(VAR F: FS) |
||
542 | освобождает память, выделенную для информационной структуры |
||
543 | файла F и присваивает F значение NIL |
||
544 | |||
545 | PROCEDURE Open(FName: ARRAY OF CHAR): FS |
||
546 | возвращает указатель на информационную структуру файла с |
||
547 | именем FName, при ошибке возвращает NIL |
||
548 | |||
549 | PROCEDURE Delete(FName: ARRAY OF CHAR): BOOLEAN |
||
550 | удаляет файл с именем FName, при ошибке возвращает FALSE |
||
551 | |||
552 | PROCEDURE Seek(F: FS; Offset, Origin: INTEGER): INTEGER |
||
553 | устанавливает позицию чтения-записи файла F на Offset, |
||
554 | относительно Origin = (SEEK_BEG - начало файла, |
||
555 | SEEK_CUR - текущая позиция, SEEK_END - конец файла), |
||
556 | возвращает позицию относительно начала файла, например: |
||
557 | Seek(F, 0, SEEK_END) |
||
558 | устанавливает позицию на конец файла и возвращает длину |
||
559 | файла; при ошибке возвращает -1 |
||
560 | |||
561 | PROCEDURE Read(F: FS; Buffer, Count: INTEGER): INTEGER |
||
562 | Читает данные из файла в память. F - указатель на |
||
563 | информационную структуру файла, Buffer - адрес области |
||
564 | памяти, Count - количество байт, которое требуется прочитать |
||
565 | из файла; возвращает количество байт, которое было прочитано |
||
566 | и соответствующим образом изменяет позицию чтения/записи в |
||
567 | информационной структуре F. |
||
568 | |||
569 | PROCEDURE Write(F: FS; Buffer, Count: INTEGER): INTEGER |
||
570 | Записывает данные из памяти в файл. F - указатель на |
||
571 | информационную структуру файла, Buffer - адрес области |
||
572 | памяти, Count - количество байт, которое требуется записать |
||
573 | в файл; возвращает количество байт, которое было записано и |
||
574 | соответствующим образом изменяет позицию чтения/записи в |
||
575 | информационной структуре F. |
||
576 | |||
577 | PROCEDURE Create(FName: ARRAY OF CHAR): FS |
||
578 | создает новый файл с именем FName (полное имя), возвращает |
||
579 | указатель на информационную структуру файла, |
||
580 | при ошибке возвращает NIL |
||
581 | |||
582 | PROCEDURE CreateDir(DirName: ARRAY OF CHAR): BOOLEAN |
||
583 | создает папку с именем DirName, все промежуточные папки |
||
584 | должны существовать, при ошибке возвращает FALSE |
||
585 | |||
586 | PROCEDURE DeleteDir(DirName: ARRAY OF CHAR): BOOLEAN |
||
587 | удаляет пустую папку с именем DirName, |
||
588 | при ошибке возвращает FALSE |
||
589 | |||
590 | PROCEDURE DirExists(DirName: ARRAY OF CHAR): BOOLEAN |
||
591 | возвращает TRUE, если папка с именем DirName существует |
||
592 | |||
593 | ------------------------------------------------------------------------------ |
||
594 | MODULE Read - чтение основных типов данных из файла F |
||
595 | |||
596 | Процедуры возвращают TRUE в случае успешной операции чтения и |
||
597 | соответствующим образом изменяют позицию чтения/записи в |
||
598 | информационной структуре F |
||
599 | |||
600 | PROCEDURE Char(F: File.FS; VAR x: CHAR): BOOLEAN |
||
601 | |||
602 | PROCEDURE Int(F: File.FS; VAR x: INTEGER): BOOLEAN |
||
603 | |||
604 | PROCEDURE Real(F: File.FS; VAR x: REAL): BOOLEAN |
||
605 | |||
606 | PROCEDURE LongReal(F: File.FS; VAR x: LONGREAL): BOOLEAN |
||
607 | |||
608 | PROCEDURE Boolean(F: File.FS; VAR x: BOOLEAN): BOOLEAN |
||
609 | |||
610 | PROCEDURE Set(F: File.FS; VAR x: SET): BOOLEAN |
||
611 | |||
612 | PROCEDURE Card16(F: File.FS; VAR x: SYSTEM.CARD16): BOOLEAN |
||
613 | |||
614 | ------------------------------------------------------------------------------ |
||
615 | MODULE Write - запись основных типов данных в файл F |
||
616 | |||
617 | Процедуры возвращают TRUE в случае успешной операции записи и |
||
618 | соответствующим образом изменяют позицию чтения/записи в |
||
619 | информационной структуре F |
||
620 | |||
621 | PROCEDURE Char(F: File.FS; x: CHAR): BOOLEAN |
||
622 | |||
623 | PROCEDURE Int(F: File.FS; x: INTEGER): BOOLEAN |
||
624 | |||
625 | PROCEDURE Real(F: File.FS; x: REAL): BOOLEAN |
||
626 | |||
627 | PROCEDURE LongReal(F: File.FS; x: LONGREAL): BOOLEAN |
||
628 | |||
629 | PROCEDURE Boolean(F: File.FS; x: BOOLEAN): BOOLEAN |
||
630 | |||
631 | PROCEDURE Set(F: File.FS; x: SET): BOOLEAN |
||
632 | |||
633 | PROCEDURE Card16(F: File.FS; x: SYSTEM.CARD16): BOOLEAN |
||
634 | |||
635 | ------------------------------------------------------------------------------ |
||
636 | MODULE DateTime - дата, время |
||
637 | |||
638 | CONST ERR = -7.0D5 |
||
639 | |||
640 | PROCEDURE Now(VAR Year, Month, Day, Hour, Min, Sec: INTEGER) |
||
641 | записывает в параметры компоненты текущей системной даты и |
||
642 | времени |
||
643 | |||
644 | PROCEDURE Encode(Year, Month, Day, Hour, Min, Sec: INTEGER): LONGREAL |
||
645 | возвращает дату, полученную из компонентов |
||
646 | Year, Month, Day, Hour, Min, Sec; |
||
647 | при ошибке возвращает константу ERR = -7.0D5 |
||
648 | |||
649 | PROCEDURE Decode(Date: LONGREAL; VAR Year, Month, Day, |
||
650 | Hour, Min, Sec: INTEGER): BOOLEAN |
||
651 | извлекает компоненты |
||
652 | Year, Month, Day, Hour, Min, Sec из даты Date; |
||
653 | при ошибке возвращает FALSE |
||
654 | |||
655 | ------------------------------------------------------------------------------ |
||
656 | MODULE Args - параметры программы |
||
657 | |||
658 | VAR argc: INTEGER |
||
659 | количество параметров программы, включая имя |
||
660 | исполняемого файла |
||
661 | |||
662 | PROCEDURE GetArg(n: INTEGER; VAR s: ARRAY OF CHAR) |
||
663 | записывает в строку s n-й параметр программы, |
||
664 | нумерация параметров от 0 до argc - 1, |
||
665 | нулевой параметр -- имя исполняемого файла |
||
666 | |||
667 | ------------------------------------------------------------------------------ |
||
668 | MODULE KOSAPI |
||
669 | |||
670 | PROCEDURE sysfunc1(arg1: INTEGER): INTEGER |
||
671 | PROCEDURE sysfunc2(arg1, arg2: INTEGER): INTEGER |
||
672 | ... |
||
673 | PROCEDURE sysfunc7(arg1, arg2, ..., arg7: INTEGER): INTEGER |
||
674 | Обертки для функций API ядра KolibriOS. |
||
675 | arg1 .. arg7 соответствуют регистрам |
||
676 | eax, ebx, ecx, edx, esi, edi, ebp; |
||
677 | возвращают значение регистра eax после системного вызова. |
||
678 | |||
679 | PROCEDURE sysfunc22(arg1, arg2: INTEGER; VAR res2: INTEGER): INTEGER |
||
680 | Обертка для функций API ядра KolibriOS. |
||
681 | arg1 - регистр eax, arg2 - регистр ebx, |
||
682 | res2 - значение регистра ebx после системного вызова; |
||
683 | возвращает значение регистра eax после системного вызова. |
||
684 | |||
685 | PROCEDURE malloc(size: INTEGER): INTEGER |
||
686 | Выделяет блок памяти. |
||
687 | size - размер блока в байтах, |
||
688 | возвращает адрес выделенного блока |
||
689 | |||
690 | PROCEDURE free(ptr: INTEGER): INTEGER |
||
691 | Освобождает ранее выделенный блок памяти с адресом ptr, |
||
692 | возвращает 0 |
||
693 | |||
694 | PROCEDURE realloc(ptr, size: INTEGER): INTEGER |
||
695 | Перераспределяет блок памяти, |
||
696 | ptr - адрес ранее выделенного блока, |
||
697 | size - новый размер, |
||
698 | возвращает указатель на перераспределенный блок, |
||
699 | |||
700 | |||
701 | PROCEDURE GetCommandLine(): INTEGER |
||
702 | Возвращает адрес строки параметров |
||
703 | |||
704 | PROCEDURE GetName(): INTEGER |
||
705 | Возвращает адрес строки с именем программы |
||
706 | |||
707 | PROCEDURE LoadLib(name: ARRAY OF CHAR): INTEGER |
||
708 | Загружает DLL с полным именем name. Возвращает адрес таблицы |
||
709 | экспорта. При ошибке возвращает 0. |
||
710 | |||
711 | PROCEDURE GetProcAdr(name: ARRAY OF CHAR; lib: INTEGER): INTEGER |
||
712 | name - имя процедуры |
||
713 | lib - адрес таблицы экспорта DLL |
||
714 | Возвращает адрес процедуры. При ошибке возвращает 0. |
||
715 | |||
716 | ------------------------------------------------------------------------------ |
||
717 | MODULE ColorDlg - работа с диалогом "Color Dialog" |
||
718 | |||
719 | TYPE |
||
720 | |||
721 | Dialog = POINTER TO RECORD (* структура диалога *) |
||
722 | status: INTEGER (* состояние диалога: |
||
723 | |||
724 | 1 - пользователь нажал OK |
||
725 | 2 - диалог открыт *) |
||
726 | |||
727 | color: INTEGER (* выбранный цвет *) |
||
728 | END |
||
729 | |||
730 | PROCEDURE Create(draw_window: DRAW_WINDOW): Dialog |
||
731 | создать диалог |
||
732 | draw_window - процедура перерисовки основного окна |
||
733 | (TYPE DRAW_WINDOW = PROCEDURE); |
||
734 | процедура возвращает указатель на структуру диалога |
||
735 | |||
736 | PROCEDURE Show(cd: Dialog) |
||
737 | показать диалог |
||
738 | cd - указатель на структуру диалога, который был создан ранее |
||
739 | процедурой Create |
||
740 | |||
741 | PROCEDURE Destroy(VAR cd: Dialog) |
||
742 | уничтожить диалог |
||
743 | cd - указатель на структуру диалога |
||
744 | |||
745 | ------------------------------------------------------------------------------ |
||
746 | MODULE OpenDlg - работа с диалогом "Open Dialog" |
||
747 | |||
748 | TYPE |
||
749 | |||
750 | Dialog = POINTER TO RECORD (* структура диалога *) |
||
751 | status: INTEGER (* состояние диалога: |
||
752 | |||
753 | 1 - пользователь нажал OK |
||
754 | 2 - диалог открыт *) |
||
755 | |||
756 | FileName: ARRAY 4096 OF CHAR (* имя выбранного файла *) |
||
757 | FilePath: ARRAY 4096 OF CHAR (* полное имя выбранного |
||
758 | файла *) |
||
759 | END |
||
760 | |||
761 | PROCEDURE Create(draw_window: DRAW_WINDOW; type: INTEGER; def_path, |
||
762 | filter: ARRAY OF CHAR): Dialog |
||
763 | создать диалог |
||
764 | draw_window - процедура перерисовки основного окна |
||
765 | (TYPE DRAW_WINDOW = PROCEDURE) |
||
766 | type - тип диалога |
||
767 | |||
768 | 1 - сохранить |
||
769 | 2 - выбрать папку |
||
770 | def_path - путь по умолчанию, папка def_path будет открыта |
||
771 | при первом запуске диалога |
||
772 | filter - в строке записано перечисление расширений файлов, |
||
773 | которые будут показаны в диалоговом окне, расширения |
||
774 | разделяются символом "|", например: "ASM|TXT|INI" |
||
775 | процедура возвращает указатель на структуру диалога |
||
776 | |||
777 | PROCEDURE Show(od: Dialog; Width, Height: INTEGER) |
||
778 | показать диалог |
||
779 | od - указатель на структуру диалога, который был создан ранее |
||
780 | процедурой Create |
||
781 | Width и Height - ширина и высота диалогового окна |
||
782 | |||
783 | PROCEDURE Destroy(VAR od: Dialog) |
||
784 | уничтожить диалог |
||
785 | od - указатель на структуру диалога |
||
786 | |||
787 | ------------------------------------------------------------------------------ |
||
788 | MODULE kfonts - работа с kf-шрифтами |
||
789 | |||
790 | CONST |
||
791 | |||
792 | bold = 1 |
||
793 | italic = 2 |
||
794 | underline = 4 |
||
795 | strike_through = 8 |
||
796 | smoothing = 16 |
||
797 | bpp32 = 32 |
||
798 | |||
799 | TYPE |
||
800 | |||
801 | TFont = POINTER TO TFont_desc (* указатель на шрифт *) |
||
802 | |||
803 | PROCEDURE LoadFont(file_name: ARRAY OF CHAR): TFont |
||
804 | загрузить шрифт из файла |
||
805 | file_name имя kf-файла |
||
806 | рез-т: указатель на шрифт/NIL (ошибка) |
||
807 | |||
808 | PROCEDURE SetSize(Font: TFont; font_size: INTEGER): BOOLEAN |
||
809 | установить размер шрифта |
||
810 | Font указатель на шрифт |
||
811 | font_size размер шрифта |
||
812 | рез-т: TRUE/FALSE (ошибка) |
||
813 | |||
814 | PROCEDURE Enabled(Font: TFont; font_size: INTEGER): BOOLEAN |
||
815 | проверить, есть ли шрифт, заданного размера |
||
816 | Font указатель на шрифт |
||
817 | font_size размер шрифта |
||
818 | рез-т: TRUE/FALSE (шрифта нет) |
||
819 | |||
820 | PROCEDURE Destroy(VAR Font: TFont) |
||
821 | выгрузить шрифт, освободить динамическую память |
||
822 | Font указатель на шрифт |
||
823 | Присваивает переменной Font значение NIL |
||
824 | |||
825 | PROCEDURE TextHeight(Font: TFont): INTEGER |
||
826 | получить высоту строки текста |
||
827 | Font указатель на шрифт |
||
828 | рез-т: высота строки текста в пикселях |
||
829 | |||
830 | PROCEDURE TextWidth(Font: TFont; |
||
831 | str, length, params: INTEGER): INTEGER |
||
832 | получить ширину строки текста |
||
833 | Font указатель на шрифт |
||
834 | str адрес строки текста в кодировке Win-1251 |
||
835 | length количество символов в строке или -1, если строка |
||
836 | завершается нулем |
||
837 | params параметры-флаги см. ниже |
||
838 | рез-т: ширина строки текста в пикселях |
||
839 | |||
840 | PROCEDURE TextOut(Font: TFont; |
||
841 | canvas, x, y, str, length, color, params: INTEGER) |
||
842 | вывести текст в буфер |
||
843 | для вывода буфера в окно, использовать ф.65 или |
||
844 | ф.7 (если буфер 24-битный) |
||
845 | Font указатель на шрифт |
||
846 | canvas адрес графического буфера |
||
847 | структура буфера: |
||
848 | Xsize dd |
||
849 | Ysize dd |
||
850 | picture rb Xsize * Ysize * 4 (32 бита) |
||
851 | или Xsize * Ysize * 3 (24 бита) |
||
852 | x, y координаты текста относительно левого верхнего |
||
853 | угла буфера |
||
854 | str адрес строки текста в кодировке Win-1251 |
||
855 | length количество символов в строке или -1, если строка |
||
856 | завершается нулем |
||
857 | color цвет текста 0x00RRGGBB |
||
858 | params параметры-флаги: |
||
859 | 1 жирный |
||
860 | 2 курсив |
||
861 | 4 подчеркнутый |
||
862 | 8 перечеркнутый |
||
863 | 16 применить сглаживание |
||
864 | 32 вывод в 32-битный буфер |
||
865 | возможно использование флагов в любых сочетаниях |
||
866 | ------------------------------------------------------------------------------ |
||
867 | MODULE RasterWorks - обертка библиотеки Rasterworks.obj |
||
868 | ------------------------------------------------------------------------------ |
||
869 | MODULE libimg - обертка библиотеки libimg.obj |
||
7107 | akron1 | 870 | ------------------------------------------------------------------------------ |
871 | MODULE NetDevices - обертка для ф.74 (работа с сетевыми устройствами) |
||
6613 | leency | 872 | ------------------------------------------------------------------------------> |