| ... | ... | @@ -1203,23 +1203,21 @@ fn printLineFromFile(io: Io, writer: *Writer, source_location: SourceLocation) ! |
| 1203 | 1203 | const cwd: Io.Dir = .cwd(); |
| 1204 | 1204 | var file = try cwd.openFile(io, source_location.file_name, .{}); |
| 1205 | 1205 | defer file.close(io); |
| 1206 | | // TODO fstat and make sure that the file has the correct size |
| 1207 | 1206 | |
| 1208 | 1207 | var buffer: [4096]u8 = undefined; |
| 1209 | 1208 | var file_reader: File.Reader = .init(file, io, &buffer); |
| 1210 | 1209 | var line_index: usize = 0; |
| 1211 | | while (try file_reader.interface.takeDelimiter('\n')) |line| { |
| 1210 | const r = &file_reader.interface; |
| 1211 | while (true) { |
| 1212 | 1212 | line_index += 1; |
| 1213 | 1213 | if (line_index == source_location.line) { |
| 1214 | 1214 | // TODO delete hard tabs from the language |
| 1215 | | mem.replaceScalar(u8, line, '\t', ' '); |
| 1216 | | try writer.writeAll(line); |
| 1217 | | // Make sure printing last line of file inserts extra newline. |
| 1215 | _ = try r.streamDelimiterEnding(writer, '\n'); |
| 1218 | 1216 | try writer.writeByte('\n'); |
| 1219 | 1217 | return; |
| 1220 | 1218 | } |
| 1219 | _ = try r.discardDelimiterInclusive('\n'); |
| 1221 | 1220 | } |
| 1222 | | return error.EndOfStream; |
| 1223 | 1221 | } |
| 1224 | 1222 | |
| 1225 | 1223 | test printLineFromFile { |