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