vio/vio.lua

Sat, 24 Sep 2011 19:39:30 +0100

author
Matthew Wild <mwild1@gmail.com>
date
Sat, 24 Sep 2011 19:39:30 +0100
changeset 84
14f827efadf2
parent 19
f72a0f535301
permissions
-rw-r--r--

make_squishy: Match require calls at the start of a line (thanks R D)

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

mercurial