diff options
| author | Diego Nehab <diego@tecgraf.puc-rio.br> | 2005-10-07 04:40:59 +0000 |
|---|---|---|
| committer | Diego Nehab <diego@tecgraf.puc-rio.br> | 2005-10-07 04:40:59 +0000 |
| commit | f4dadea763c1959a27dead24df3ee6c54c209842 (patch) | |
| tree | c13b294a8ca5438d59b60e3f5a25a4f7c1fc9a1b /src/ltn12.lua | |
| parent | 562d8cceb704a96a7b2f9acc4bc229ab9f5c6541 (diff) | |
| download | luasocket-f4dadea763c1959a27dead24df3ee6c54c209842.tar.gz luasocket-f4dadea763c1959a27dead24df3ee6c54c209842.tar.bz2 luasocket-f4dadea763c1959a27dead24df3ee6c54c209842.zip | |
Before compiling on Windows.
Diffstat (limited to 'src/ltn12.lua')
| -rw-r--r-- | src/ltn12.lua | 52 |
1 files changed, 34 insertions, 18 deletions
diff --git a/src/ltn12.lua b/src/ltn12.lua index 733422d..2c16253 100644 --- a/src/ltn12.lua +++ b/src/ltn12.lua | |||
| @@ -134,33 +134,49 @@ function source.rewind(src) | |||
| 134 | end | 134 | end |
| 135 | end | 135 | end |
| 136 | 136 | ||
| 137 | -- chains a source with a filter | ||
| 138 | function source.chain(src, f) | 137 | function source.chain(src, f) |
| 139 | base.assert(src and f) | 138 | base.assert(src and f) |
| 140 | local last_in, last_out = "", "" | 139 | local last_in, last_out = "", "" |
| 140 | local state = "feeding" | ||
| 141 | local err | ||
| 141 | return function() | 142 | return function() |
| 142 | if last_out == "" then | 143 | if not last_out then |
| 143 | while true do | 144 | base.error('source is empty!', 2) |
| 144 | local err | 145 | end |
| 146 | while true do | ||
| 147 | if state == "feeding" then | ||
| 145 | last_in, err = src() | 148 | last_in, err = src() |
| 146 | if err then return nil, err end | 149 | if err then return nil, err end |
| 147 | last_out = f(last_in) | 150 | last_out = f(last_in) |
| 148 | if last_out ~= "" then return last_out end | 151 | if not last_out then |
| 149 | if not last_in then | 152 | if last_in then |
| 150 | base.error('filter returned inappropriate ""') | 153 | base.error('filter returned inappropriate nil') |
| 154 | else | ||
| 155 | return nil | ||
| 156 | end | ||
| 157 | elseif last_out ~= "" then | ||
| 158 | state = "eating" | ||
| 159 | if last_in then last_in = "" end | ||
| 160 | return last_out | ||
| 161 | end | ||
| 162 | else | ||
| 163 | last_out = f(last_in) | ||
| 164 | if last_out == "" then | ||
| 165 | if last_in == "" then | ||
| 166 | state = "feeding" | ||
| 167 | else | ||
| 168 | base.error('filter returned ""') | ||
| 169 | end | ||
| 170 | elseif not last_out then | ||
| 171 | if last_in then | ||
| 172 | base.error('filter returned inappropriate nil') | ||
| 173 | else | ||
| 174 | return nil | ||
| 175 | end | ||
| 176 | else | ||
| 177 | return last_out | ||
| 151 | end | 178 | end |
| 152 | end | 179 | end |
| 153 | elseif last_out then | ||
| 154 | last_out = f(last_in and "") | ||
| 155 | if last_in and not last_out then | ||
| 156 | base.error('filter returned inappropriate nil') | ||
| 157 | end | ||
| 158 | if last_out == "" and not last_in then | ||
| 159 | base.error(base.tostring(f) .. ' returned inappropriate ""') | ||
| 160 | end | ||
| 161 | return last_out | ||
| 162 | else | ||
| 163 | base.error("source is empty", 2) | ||
| 164 | end | 180 | end |
| 165 | end | 181 | end |
| 166 | end | 182 | end |
