//[of]:description //[c]All functions to manipulate files //[cf] //[of]:imports //[c] import "base/types" import "base/memory-allocator" import "text/array-of-strings" import "libc/stdio" import "private/io" //[c] public import "file/file-defines" //[cf] //[c] //[of]:filename //[of]:constants //[c] //public equ path separator = path_separator //[cf] //[c] //[of]:converting //[of]:convert full name (filename) //[c] /*public equ convert full name (filename: string) = convert_full_name (filename)*/ //[cf] //[of]:full name (filename, full name) //[c]Platform dependent - See file-defines //[cf] //[of]:resolve full name (directory, filename, full name) //[c]Platform dependent - See file-defines //[cf] //[c] //[of]:convert filename to uri (filename) //[c]Platform dependent - See file-defines //[cf] //[of]:convert uri to filename (uri) //[c]Platform dependent - See file-defines //[cf] //[cf] //[of]:accessing //[of]:file size (filename) //[c] public equ file size (filename: [] char) = file_size (filename) //[cf] //[of]:file last modification (filename) //[c] public equ file last modification (filename: [] char) = file_last_modification (filename) //[cf] //[cf] //[of]:testing //[of]:file exists (filename) //[c] public equ file exists (filename: [] char) = file_exists (filename) <> 0 //[cf] //[of]:is file read only (filename) //[c] public equ is file read only (filename: [] char) = file_read_only (filename) <> 0 //[cf] //[of]:is same file (fn1, fn2) //[c]Platform dependent - See file-defines //[cf] //[cf] //[cf] //[of]:directory //[of]:create directory (dirname) //[c]Platform dependent - see file-defines //[cf] //[of]:append root dir (string buffer, name) //[c]Platform dependent - see file-defines //[cf] //[of]:append home dir (string buffer, name) //[c]Platform dependent - see file-defines //[cf] //[cf] //[of]:file buffer //[of]:constants //[c] public enum fb error fb ok fb file not found fb seek error fb not enough memory end //[cf] //[of]:definition //[c] public struct file buffer base: [] byte size: size end //[cf] //[c] //[of]:initialize - release //[of]:initialize (fb, filename, is text) //[c] public func initialize (buffer: file buffer, filename: string, is text: bool) base (buffer) = nil // Get file size def file size = file_size (filename) if file size == 0xFFFFFFFF return fb seek error end def buffer size = file size if is text ++buffer size end // open the file def f = fopen (filename, "rb") if is nil (f) return fb file not found end // allocate memory def base = allocate memory (buffer size):[] byte if is nil (base) return fb not enough memory end // read the file def res = fread (base, 1, file size, f) // close the file fclose (f) // append a zero if text if is text base[file size] = 0:byte end // setup object status and return base (buffer) = base size (buffer) = file size return fb ok end //[cf] //[of]:release (fb) //[c] public func release (buffer: file buffer) if not nil (base (buffer)) free memory (base (buffer)) end end //[cf] //[cf] //[of]:accessing //[of]:base (fb) //[cf] //[of]:size (fb) //[cf] //[cf] //[cf] //[of]:filemask //[of]:testing //[of]:match wildcards (pattern, string) //[c]Platform dependent - See file-defines //[cf] //[cf] //[cf] //[of]:list of filemasks //[of]:definition public struct list of filemasks : local array of strings // empty end //[cf] //[c] //[of]:adding - removing //[of]:add all (m, string) //[c]Add filemasks from a string containing a list of masks separated by semicolons //[c] public func add all (m: list of filemasks, list: string) def p = list repeat p = skip blanks (p) if is nul (p[]) break end def q = p while not nul (q[]) && q[]<>$; ++q end def next = q // remove trailing blanks while q:[]byte > p:[]byte && is blank (q[-1]) q -= 1 end def size = q - p if size > 0 add substring (m, p, size) end p = next if not nul (p[]) ++ p end end end //[cf] //[cf] //[of]:testing //[of]:match (m, string) //[c] public func match (m: list of filemasks, name: string) each (m) ? mask if match wildcards (mask, name) return true end end return false end //[cf] //[cf] //[cf] //[of]:io //[of]:fputs stderr (s) public equ fputs stderr (s: [] char) = fputs_stderr (s) //[cf] //[cf]