Le fichier include : io_linux.pbi
Code : Tout sélectionner
; IO Linux
; Flaith 26.02.2009-28.02.09
;-******** Permissions
; #S_IRUSR + #S_IWUSR + #S_IRGRP + #S_IWGRP + #S_IROTH + #S_IWOTH
#S_ISUID = $0800
#S_ISGID = $0400
#S_ISVTX = $0200
;User
#S_IRUSR = $0100 ; user permission to read
#S_IWUSR = $0080 ; to write
#S_IXUSR = $0040 ; to execute
;Group
#S_IRGRP = $0020
#S_IWGRP = $0010
#S_IXGRP = $0008
;Autre
#S_IROTH = $0004
#S_IWOTH = $0002
#S_IXOTH = $0001
;-******** File
#SYS_READ = 3
#SYS_WRITE = 4
#SYS_OPEN = 5
#SYS_CLOSE = 6
#SYS_CREATE = 8
#SYS_IOCTL = 54
;-******** Seek value
#SEEK_SET = 0 ; Seek from beginning of file.
#SEEK_CUR = 1 ; Seek from current position.
#SEEK_END = 2 ; Seek from End of file.
;-******** Open mode
#O_RDONLY = $0000 ; file is read-only
#O_WRONLY = $0001 ; file is write-only
#O_RDWR = $0002 ; read or write
#O_ACCMODE = $0003
#O_CREAT = $0040 ; create file or erase it
#O_EXCL = $0080
#O_NOCTTY = $0100
#O_TRUNC = $0200
#O_APPEND = $0400
#O_NONBLOCK = $0800
;-******** Divers
#STDIN_FILENO = 0 ; Standard input
#STDOUT_FILENO = 1 ; Standard output
#STDERR_FILENO = 2 ; Error output
Global __num_error.i
Global __stderr.s
;-******************
;-*** Procedures ***
;-******************
;-fOpen(namefile.s,open_mode.i)
Procedure.i fOpen(namefile.s,open_mode.i)
!mov dword eax, 5 ; SYS_OPEN
!mov dword ebx, [p.v_namefile]
!mov dword ecx, [p.v_open_mode]
!xor dword edx, edx
!int byte 0x80
!test dword eax, eax
!js _open_error
ProcedureReturn ; return value in EAX
!_open_error:
!mov dword [v___num_error], eax
ProcedureReturn -1
EndProcedure
;-fRead(fd.i,buffer.i,size.i)
Procedure.i fRead(fd.i,buffer.i,size.i)
!mov dword eax, 3 ; SYS_READ
!mov dword ebx, [p.v_fd]
!mov dword ecx, [p.v_buffer]
!mov dword edx, [p.v_size]
!int byte 0x80
!test dword eax, eax
!js _read_error
ProcedureReturn
!_read_error:
!mov dword [v___num_error], eax
ProcedureReturn -1
EndProcedure
;-fCreate(namefile.s,rights.i,open_mode.i)
Procedure.i fCreate(namefile.s,rights.i=#S_IRUSR+#S_IWUSR+#S_IRGRP+#S_IROTH,open_mode.i=#O_CREAT+#O_TRUNC+#O_WRONLY)
!mov dword eax, 5 ; SYS_OPEN
!mov dword ebx, [p.v_namefile]
!mov dword ecx, [p.v_open_mode]
!mov dword edx, [p.v_rights]
!int byte 0x80
!test dword eax, eax
!js _create_error
ProcedureReturn
!_create_error:
!mov dword [v___num_error], eax
ProcedureReturn -1
EndProcedure
;-fWrite(fd.i,buffer.i,size.i)
Procedure.i fWrite(fd.i,buffer.i,size.i)
!mov dword eax, 4 ; SYS_WRITE
!mov dword ebx, [p.v_fd] ; to print to console put #STDOUT_FILENO or #STDERR_FILENO
!mov dword ecx, [p.v_buffer]
!mov dword edx, [p.v_size]
!int byte 0x80
!test dword eax, eax
!js _write_error
ProcedureReturn
!_write_error:
!mov dword [v___num_error], eax
ProcedureReturn -1
EndProcedure
;-fClose(fd.i)
Procedure.i fClose(fd.i)
!mov dword eax, 6 ; SYS_CLOSE
!mov dword ebx, [p.v_fd]
!int byte 0x80
!test dword eax, eax
!js _close_error
ProcedureReturn
!_close_error:
!mov dword [v___num_error], eax
ProcedureReturn -1
EndProcedure
;-fSeek(fd.i, offset.i, whence.i)
Procedure.i fSeek(fd.i, offset.i, whence.i)
!mov dword eax, 19
!mov dword ebx, [p.v_fd]
!mov dword ecx, [p.v_offset]
!mov dword edx, [p.v_whence]
!int byte 0x80
!test dword eax, eax
!js _lseek_error
ProcedureReturn
!_lseek_error:
!mov dword [v___num_error], eax
ProcedureReturn -1
EndProcedure
;-fEof(fd.i)
Procedure.i fEof(fd.i)
Protected lenfile.i = fSeek(fd,0,#SEEK_END)
If lenfile > 0
fSeek(fd,0,#SEEK_SET)
ProcedureReturn lenfile
Else
ProcedureReturn -1
EndIf
EndProcedure
;-fAppend(filename.s)
Procedure.i fAppend(filename.s)
Protected fd.i = fOpen(filename,#O_APPEND+#O_RDWR)
If fd > 0
ProcedureReturn fd
Else
ProcedureReturn -1
EndIf
EndProcedure
;-ioctl(fd.i,tdata.l,value.l)
Procedure.i ioctl(fd.i,tdata.l,value.l)
!mov dword eax, 54
!mov dword ebx, [p.v_fd]
!mov dword ecx, [p.v_tdata]
!lea dword edx, [p.v_value]
!int byte 0x80
!test dword eax, eax
!js _ioctl_error ;Jump short if sign (SF=1) (if <> 0 => error)
ProcedureReturn
!_ioctl_error:
!mov dword [v___num_error], eax
ProcedureReturn -1
EndProcedure
Procedure.s strerror()
Protected err.s = "Unknow !!!"
Select __num_error
Case -2
err = "No such file or directory"
Case -9
err = "Bad file number"
EndSelect
ProcedureReturn "(" + Str(__num_error) + ")" + ": " + err
EndProcedure
Procedure.s perror(error_string.s)
__stderr = error_string + strerror()
ProcedureReturn __stderr
EndProcedure