Thu, 08 Jul 2010 01:11:40 +0100
make_squishy: Fix traceback when file doesn't contain any path component
19
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
1 | local vio = {}; |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
2 | vio.__index = vio; |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
3 | |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
4 | function vio.open(string) |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
5 | return setmetatable({ pos = 1, data = string }, vio); |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
6 | end |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
7 | |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
8 | function vio:read(format, ...) |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 | if self.pos >= #self.data then return; end |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
10 | if format == "*a" then |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
11 | local oldpos = self.pos; |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
12 | self.pos = #self.data; |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
13 | return self.data:sub(oldpos, self.pos); |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
14 | elseif format == "*l" then |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
15 | local data; |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
16 | data, self.pos = self.data:match("([^\r\n]*)\r?\n?()", self.pos) |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
17 | return data; |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
18 | elseif format == "*n" then |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
19 | local data; |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
20 | data, self.pos = self.data:match("(%d+)()", self.pos) |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
21 | return tonumber(data); |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
22 | elseif type(format) == "number" then |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
23 | local oldpos = self.pos; |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
24 | self.pos = self.pos + format; |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
25 | return self.data:sub(oldpos, self.pos-1); |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
26 | end |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
27 | end |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
28 | |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
29 | function vio:seek(whence, offset) |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
30 | if type(whence) == "number" then |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
31 | whence, offset = "cur", whence; |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
32 | end |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
33 | offset = offset or 0; |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
34 | |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
35 | if whence == "cur" then |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
36 | self.pos = self.pos + offset; |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
37 | elseif whence == "set" then |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
38 | self.pos = offset + 1; |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
39 | elseif whence == "end" then |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
40 | self.pos = #self.data - offset; |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
41 | end |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
42 | |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
43 | return self.pos; |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
44 | end |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
45 | |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
46 | local function _readline(f) return f:read("*l"); end |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
47 | function vio:lines() |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
48 | return _readline, self; |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
49 | end |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
50 | |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
51 | function vio:write(...) |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
52 | for i=1,select('#', ...) do |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
53 | local dat = tostring(select(i, ...)); |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
54 | self.data = self.data:sub(1, self.pos-1)..dat..self.data:sub(self.pos+#dat, -1); |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
55 | end |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
56 | end |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
57 | |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
58 | function vio:close() |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
59 | self.pos, self.data = nil, nil; |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
60 | end |
f72a0f535301
Add virtual io support for accessing resources
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
61 |