BlueGrey
calm
Elegant
Català-Valencià – Catalan
中文 – Chinese (Simplified)
中文 – Chinese (Traditional)
Česky – Czech
Dansk – Danish
Nederlands – Dutch
English – English
Suomi – Finnish
Français – French
Deutsch – German
עברית – Hebrew
हिंदी – Hindi
Magyar – Hungarian
Bahasa Indonesia – Indonesian
Italiano – Italian
日本語 – Japanese
한국어 – Korean
Македонски – Macedonian
मराठी – Marathi
Norsk – Norwegian
Polski – Polish
Português – Portuguese
Português – Portuguese (Brazil)
Русский – Russian
Slovenčina – Slovak
Slovenščina – Slovenian
Español – Spanish
Svenska – Swedish
Türkçe – Turkish
Українська – Ukrainian
Oëzbekcha – Uzbek
Subversion Repositories
Kolibri OS
(root)
/
programs
/
develop
/
fp
/
rtl
/
sysfile.inc
– Rev 790
Rev
Rev 763
|
Blame
|
Compare with Previous
|
Last modification
|
View Log
|
Download
|
RSS feed
{
utf8
}
function DecodeErrNo
(
ErrNo
:
DWord
)
:
Word
;
{
0
= успешно
1
= не определена база и
/
или раздел жёсткого диска
(
подфункциями
7
,
8
функции
21
)
2
= функция не поддерживается для данной файловой системы
3
= неизвестная файловая система
4
= зарезервировано
,
никогда не возвращается в текущей реализации
5
= файл не найден
6
= файл закончился
7
= указатель вне памяти приложения
8
= диск заполнен
9
= таблица FAT разрушена
10
= доступ запрещён
11
= ошибка устройства
}
begin
case ErrNo of
0
:
Result
:
=
0
;
1
:
Result
:
=
152
;
2
:
Result
:
=
153
;
3
:
Result
:
=
151
;
4
:
Result
:
=
1
;
5
:
Result
:
=
2
;
6
:
Result
:
=
0
;
8
:
Result
:
=
101
;
else
Result
:
=
153
; { Unknown command (неизвестная команда) }
end
;
end
;
function do_isdevice
(
handle
:
thandle
)
:
Boolean
;
begin
InOutRes
:
=
211
;
Result
:
= False
;
end
;
procedure do_close
(
handle
:
THandle
)
;
begin
FreeMem
(
PKosFile
(
handle
)
)
;
InOutRes
:
=
0
;
end
;
procedure do_erase
(
p
:
pchar
)
;
begin
InOutRes
:
=
211
;
end
;
procedure do_rename
(
p1
,
p2
:
pchar
)
;
begin
InOutRes
:
=
211
;
end
;
function do_write
(
handle
:
THandle
; addr: Pointer; len: Longint): Longint;
begin
PKosFile
(
handle
)
^
.
Size
:
= len
;
PKosFile
(
handle
)
^
.
Data
:
= addr
;
InOutRes
:
= DecodeErrNo
(
kos_writefile
(
PKosFile
(
handle
)
,
Result
)
)
;
Inc
(
PKosFile
(
handle
)
^
.
Position
,
Result
)
;
end
;
function do_read
(
handle
:
THandle
; addr: Pointer; len: Longint): Longint;
begin
PKosFile
(
handle
)
^
.
Size
:
= len
;
PKosFile
(
handle
)
^
.
Data
:
= addr
;
InOutRes
:
= DecodeErrNo
(
kos_readfile
(
PKosFile
(
handle
)
,
Result
)
)
;
Inc
(
PKosFile
(
handle
)
^
.
Position
,
Result
)
;
end
;
function do_filepos
(
handle
:
THandle
)
:
Int64
;
begin
Result
:
= PKosFile
(
handle
)
^
.
Position
;
end
;
procedure do_seek
(
handle
:
THandle
; pos: Int64);
begin
PKosFile
(
handle
)
^
.
Position
:
= pos
;
end
;
function do_seekend
(
handle
:
THandle
)
:
Int64
;
begin
InOutRes
:
=
211
;
Result
:
=
0
;
end
;
function do_filesize
(
handle
:
THandle
)
:
Int64
;
var
BDFE
:
TKosBDFE
;
begin
PKosFile
(
handle
)
^
.
Data
:
= @BDFE
;
InOutRes
:
= DecodeErrNo
(
kos_fileinfo
(
PKosFile
(
handle
)
)
)
;
Result
:
= BDFE
.
Size
;
end
;
procedure do_truncate
(
handle
:
THandle
; pos: Int64);
begin
InOutRes
:
=
211
;
end
;
{
FIXME
:
Поправить RTL
,
факт отсутствия файла не фиксируется при его открытии
.
}
procedure do_open
(
var f
; p: PChar; flags: Longint);
var
KosFile
:
PKosFile
;
FilePath
:
PChar
;
FilePathLen
:
Longint
;
RecSize
:
Longint
;
CurrDir
:
array
[
0
..
2048
]
of Char
;
CurrDirLen
:
Longint
;
Dummy
:
Longint
;
begin
case flags
and
3
of
0
:
FileRec
(
f
)
.
Mode
:
= fmInput
;
1
:
FileRec
(
f
)
.
Mode
:
= fmOutput
;
2
:
FileRec
(
f
)
.
Mode
:
= fmInOut
;
end
;
{
Формирование имени абсолютного пути
}
FilePathLen
:
= Length
(
p
)
;
if p^ <> DirectorySeparator then
begin
{
XXX
:
размер буфера CurrDir может оказаться недостаточным
}
CurrDirLen
:
= kos_getdir
(
@CurrDir
,
SizeOf
(
CurrDir
)
-
FilePathLen
-
1
)
-
1
;
FilePath
:
= @CurrDir
;
if FilePath
[
CurrDirLen
-
1
]
<> DirectorySeparator then
begin
FilePath
[
CurrDirLen
]
:
= DirectorySeparator
;
Inc
(
CurrDirLen
)
;
end
;
Move
(
p^
,
FilePath
[
CurrDirLen
]
,
FilePathLen
+
1
)
;
Inc
(
FilePathLen
,
CurrDirLen
)
;
end else
FilePath
:
= p
;
{
Создание структуры TKosFile
}
RecSize
:
= SizeOf
(
TKosFile
)
+
FilePathLen
;
KosFile
:
= GetMem
(
RecSize
)
;
FillChar
(
KosFile^
,
RecSize
,
0
)
;
Move
(
FilePath^
,
KosFile^
.
Name
,
FilePathLen
)
;
FileRec
(
f
)
.
Handle
:
=
DWord
(
KosFile
)
;
if flags
and
$
1000
<>
0
then
begin
{
создать файл
}
InOutRes
:
= DecodeErrNo
(
kos_rewritefile
(
KosFile
,
RecSize
)
)
;
end else
begin
{
попытаться прочитать файл
}
KosFile^
.
Size
:
=
1
;
KosFile^
.
Data
:
= @Dummy
;
InOutRes
:
= DecodeErrNo
(
kos_readfile
(
KosFile
,
Dummy
)
)
;
end
;
if InOutRes <>
0
then
begin
FreeMem
(
KosFile
)
;
FileRec
(
f
)
.
Handle
:
=
DWord
(
-
1
)
;
end
;
end
;