Skip to content

Commit

Permalink
Implement filestream:lines and io.lines
Browse files Browse the repository at this point in the history
  • Loading branch information
edubart committed Sep 12, 2020
1 parent eb0872e commit 3df72f8
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 13 deletions.
16 changes: 8 additions & 8 deletions docs/pages/differences.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ Nelua has additional functions in this library. See [here](/libraries/#io).
| `io.close`{:.language-nelua} || `io`{:.language-nelua} | |
| `io.flush`{:.language-nelua} || `io`{:.language-nelua} | |
| `io.input`{:.language-nelua} || `io`{:.language-nelua} | |
| `io.lines`{:.language-nelua} | | `io`{:.language-nelua} | |
| `io.lines`{:.language-nelua} | | `io`{:.language-nelua} | |
| `io.open`{:.language-nelua} || `io`{:.language-nelua} | |
| `io.output`{:.language-nelua} || `io`{:.language-nelua} | |
| `io.popen`{:.language-nelua} || `io`{:.language-nelua} | |
Expand All @@ -79,13 +79,13 @@ Nelua has additional functions in this library. See [here](/libraries/#io).
| `io.tmpfile`{:.language-nelua} || `io`{:.language-nelua} | |
| `io.type`{:.language-nelua} || `io`{:.language-nelua} | |
| `io.write`{:.language-nelua} || `io`{:.language-nelua} | Doesn't support multiple arguments. |
| `file:close`{:.language-nelua} || `filesystem`{:.language-nelua} | |
| `file:flush`{:.language-nelua} || `filesystem`{:.language-nelua} | |
| `file:lines`{:.language-nelua} || `filesystem`{:.language-nelua} | |
| `file:read`{:.language-nelua} || `filesystem`{:.language-nelua} | Doesn't support `*n` format and multiple arguments. |
| `file:seek`{:.language-nelua} || `filesystem`{:.language-nelua} | |
| `file:setvbuf`{:.language-nelua} || `filesystem`{:.language-nelua} | |
| `file:write`{:.language-nelua} || `filesystem`{:.language-nelua} | Doesn't support multiple arguments. Doesn't return the file itself. |
| `file:close`{:.language-nelua} || `filestream`{:.language-nelua} | |
| `file:flush`{:.language-nelua} || `filestream`{:.language-nelua} | |
| `file:lines`{:.language-nelua} || `filestream`{:.language-nelua} | |
| `file:read`{:.language-nelua} || `filestream`{:.language-nelua} | Doesn't support `*n` format and multiple arguments. |
| `file:seek`{:.language-nelua} || `filestream`{:.language-nelua} | |
| `file:setvbuf`{:.language-nelua} || `filestream`{:.language-nelua} | |
| `file:write`{:.language-nelua} || `filestream`{:.language-nelua} | Doesn't support multiple arguments. Doesn't return the file itself. |
{: .table.table-bordered.table-striped.table-sm}

## Math
Expand Down
24 changes: 21 additions & 3 deletions lib/filestream.nelua
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ function filestream:_get_fp(): FILEptr
end

function filestream.open(filename: stringview, mode: facultative(stringview)) : (filestream, stringview, integer)
## if mode.type.is_nil then
## if mode.type.is_niltype then
local mode: stringview = "r"
## end
--TODO: check modes
Expand Down Expand Up @@ -212,6 +212,11 @@ function filestream:read(fmt: overload(integer,stringview,niltype)): (string, st
if success then
s = sb:promotestring()
else
if #errmsg == 0 then
-- should be eof
errmsg = 'eof'
status = EOF
end
sb:destroy()
end
return s, errmsg, status
Expand All @@ -229,6 +234,21 @@ function filestream:write(s: stringview): (boolean, stringview, integer)
return fileresult(false)
end

function filestream:lines(fmt: overload(integer,stringview,niltype))
## if fmt.type.is_niltype then
local fmt: stringview = 'l'
## end
local LinesState = @record {
file: filestream,
fmt: #[fmt.type]#
}
local function lines_next(state: LinesState, prevstr: string): (boolean, string)
local str: string, errmsg: stringview, status: integer = state.file:read(state.fmt)
return status == 0, str
end
return lines_next, (@LinesState){file=$self,fmt=fmt}, (@string){}
end

function filestream:isopen(): boolean
return pool:has(self.id)
end
Expand All @@ -241,5 +261,3 @@ function filestream:__tostring(): string
return string.format('file (%p)', fp)
end
end

-- TODO: filestream:lines
14 changes: 13 additions & 1 deletion lib/io.nelua
Original file line number Diff line number Diff line change
Expand Up @@ -101,5 +101,17 @@ function io.isopen(file: filestream): boolean
return file:isopen()
end

-- TODO: io.lines
function io.lines(filename: facultative(stringview), fmt: overload(integer,stringview,niltype))
## if filename.type.is_niltype then
return io.stdin:lines()
## else
-- TODO: close file using to be closed variables
local file: filestream = io.open(filename)
if not file:isopen() then
error('io.lines: cannot open file')
end
return file:lines(fmt)
## end
end

-- TODO: io.popen
2 changes: 1 addition & 1 deletion lib/span.nelua
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@
## else
self.data = &values[#[values.type.subtype.is_sequence and 1 or 0]#]
self.size = (@usize)(#$values)
## end
## end
return self
end

Expand Down
46 changes: 46 additions & 0 deletions tests/io_test.nelua
Original file line number Diff line number Diff line change
Expand Up @@ -91,11 +91,57 @@ do -- filestream:read, filestream:write and filestream:seek
assert(file:read('a') == text)
assert(file:close())
assert(not file:isopen())
end

do -- filestream:lines
file = io.open('test.tmp', 'r')
local i = 1
for line in file:lines() do
assert(line == ('line'..i))
i = i + 1
end

file:seek('set')
i = 1
for line in file:lines('L') do
assert(line == ('line'..i..'\n'))
i = i + 1
end

file:seek('set')
i = 1
for line in file:lines(6) do
assert(line == ('line'..i..'\n'))
i = i + 1
end

file:close()
end

do -- io.lines
local i = 1
for line in io.lines('test.tmp') do
assert(line == ('line'..i))
i = i + 1
end

i = 1
for line in io.lines('test.tmp', 'L') do
assert(line == ('line'..i..'\n'))
i = i + 1
end

i = 1
for line in io.lines('test.tmp', 6) do
assert(line == ('line'..i..'\n'))
i = i + 1
end

os.remove('test.tmp')
end

do -- filestream:setvbuf
os.remove('test.tmp')
file = io.open('test.tmp', 'w')
assert(file:isopen())
assert(file:setvbuf("no") == true)
Expand Down

0 comments on commit 3df72f8

Please sign in to comment.