Add next_entry

This commit is contained in:
Sasha Koshka 2024-10-19 16:23:13 -04:00
parent cabc7c1e19
commit b42b1b1dd2
2 changed files with 16 additions and 4 deletions

View File

@ -17,7 +17,8 @@ export type comment = str;
// Specification: §3.2
export type group_header = str;
// An entry in a desktop file.
// An entry in a desktop file. Entries without an explicitly stated locale are
// assigned [[locale::c]].
// Specification: §3.3, §5
export type entry = struct {
group: str,

View File

@ -18,8 +18,10 @@ export fn scan(input: io::handle) scanner = scanner {
...
};
// Returns the next entry from a desktop entry file. The return value is
// borrowed from the [[scanner]] use [[line_dup]] to retain a copy.
// Returns the next line from a desktop entry file. The return value is
// borrowed from the [[scanner]]. Use [[line_dup]] to retain a copy. If all you
// want is the file's data, use next_entry.
// FIXME: there is no line_dup
export fn next(this: *scanner) (line | io::EOF | error) = {
let text = match (bufio::scan_line(&this.scanner)) {
case let text: const str =>
@ -53,7 +55,16 @@ export fn next(this: *scanner) (line | io::EOF | error) = {
};
};
// TODO: have next_entry that auto-skips over blank lines and comments
// Returns the next entry from the desktop file, skipping over blank lines,
// comments, group headers, etc. The return value is borrowed from the
// [[scanner]]. Use [[entry_dup]] to retain a copy.
export fn next_entry(this: *scanner) (entry | io::EOF | error) = {
for (true) match(next(this)?) {
case let entr: entry => return entr;
case io::EOF => return io::EOF;
case => void;
};
};
// Frees resources associated with a [[scanner]].
export fn finish(this: *scanner) void = {