util-fil.lmt /size: 4490 b    last modification: 2023-12-21 09:44
1if not modules then modules = { } end modules ['util-fil'] = {
2    version   = 1.001,
3    optimize  = true,
4    comment   = "companion to luat-lib.mkxl",
5    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
6    copyright = "PRAGMA ADE / ConTeXt Development Team",
7    license   = "see context related readme files"
8}
9
10-- For the old ones, see util-fil.lua.
11
12local byte = string.byte
13local char = string.char
14
15utilities       = utilities or { }
16local files     = { }
17utilities.files = files
18
19local zerobased = { }
20
21function files.open(filename,zb)
22    local f = io.open(filename,"rb")
23    if f then
24        zerobased[f] = zb or false
25    end
26    return f
27end
28
29function files.close(f)
30    if f then
31        zerobased[f] = nil
32        f:close()
33    end
34end
35
36function files.size(f)
37    if f then
38        local current = f:seek()
39        local size = f:seek("end")
40        f:seek("set",current)
41        return size
42    else
43        return 0
44    end
45end
46
47files.getsize = files.size
48
49function files.setposition(f,n)
50    if zerobased[f] then
51        f:seek("set",n)
52    else
53        f:seek("set",n - 1)
54    end
55end
56
57function files.getposition(f)
58    if zerobased[f] then
59        return f:seek()
60    else
61        return f:seek() + 1
62    end
63end
64
65function files.look(f,n,chars)
66    local p = f:seek()
67    local s = f:read(n)
68    f:seek("set",p)
69    if chars then
70        return s
71    else
72        return byte(s,1,#s)
73    end
74end
75
76function files.skip(f,n)
77    if n == 1 then
78        f:read(n)
79    else
80        f:seek("set",f:seek()+n)
81    end
82end
83
84-- readers:
85
86files.readcardinal1     = fio.readcardinal1
87files.readcardinal2     = fio.readcardinal2
88files.readcardinal3     = fio.readcardinal3
89files.readcardinal4     = fio.readcardinal4
90
91files.readcardinal1le   = fio.readcardinal1le or files.readcardinal1le
92files.readcardinal2le   = fio.readcardinal2le or files.readcardinal2le
93files.readcardinal3le   = fio.readcardinal3le or files.readcardinal3le
94files.readcardinal4le   = fio.readcardinal4le or files.readcardinal4le
95
96files.readinteger1      = fio.readinteger1
97files.readinteger2      = fio.readinteger2
98files.readinteger3      = fio.readinteger3
99files.readinteger4      = fio.readinteger4
100
101files.readinteger1le    = fio.readinteger1le or files.readinteger1le
102files.readinteger2le    = fio.readinteger2le or files.readinteger2le
103files.readinteger3le    = fio.readinteger3le or files.readinteger3le
104files.readinteger4le    = fio.readinteger4le or files.readinteger4le
105
106files.readfixed2        = fio.readfixed2
107files.readfixed4        = fio.readfixed4
108files.read2dot14        = fio.read2dot14
109files.setposition       = fio.setposition
110files.getposition       = fio.getposition
111
112files.readbyte          = files.readcardinal1
113files.readsignedbyte    = files.readinteger1
114files.readcardinal      = files.readcardinal1
115files.readinteger       = files.readinteger1
116
117local skipposition      = fio.skipposition
118files.skipposition      = skipposition
119
120files.readbytes         = fio.readbytes
121files.readbytetable     = fio.readbytetable
122files.readcardinaltable = fio.readcardinaltable
123files.readintegertable  = fio.readintegertable
124
125files.readcstring       = fio.readcstring
126files.readcline         = fio.readcline
127
128function files.readchar(f)
129    return f:read(1)
130end
131
132function files.readstring(f,n)
133    return f:read(n or 1)
134end
135
136function files.skipshort(f,n)
137    skipposition(f,2*(n or 1))
138end
139
140function files.skiplong(f,n)
141    skipposition(f,4*(n or 1))
142end
143
144-- writers
145
146function files.writestring(f,s)
147    f:write(char(byte(s,1,#s)))
148end
149
150function files.writebyte(f,b)
151    f:write(char(b))
152end
153
154files.writecardinal1   = fio.writecardinal1
155files.writecardinal2   = fio.writecardinal2
156files.writecardinal3   = fio.writecardinal3
157files.writecardinal4   = fio.writecardinal4
158
159files.writecardinal1le = fio.writecardinal1le
160files.writecardinal2le = fio.writecardinal2le
161files.writecardinal3le = fio.writecardinal3le
162files.writecardinal4le = fio.writecardinal4le
163
164files.writeinteger1    = fio.writeinteger1 or fio.writecardinal1
165files.writeinteger2    = fio.writeinteger2 or fio.writecardinal2
166files.writeinteger3    = fio.writeinteger3 or fio.writecardinal3
167files.writeinteger4    = fio.writeinteger4 or fio.writecardinal4
168
169files.writeinteger1le  = files.writeinteger1le or fio.writecardinal1le
170files.writeinteger2le  = files.writeinteger2le or fio.writecardinal2le
171files.writeinteger3le  = files.writeinteger3le or fio.writecardinal3le
172files.writeinteger4le  = files.writeinteger4le or fio.writecardinal4le
173