vio/vio.lua

Sun, 10 Oct 2010 01:34:27 +0100

author
Matthew Wild <mwild1@gmail.com>
date
Sun, 10 Oct 2010 01:34:27 +0100
changeset 75
6028ae579fde
parent 19
f72a0f535301
permissions
-rw-r--r--

squish.gzip.lua: Escape \026 in gzipped output to prevent Windows from interpreting it as EOF (thanks to Vadim Peretokin for his persistence!)

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