1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
// SPDX-License-Identifier: MPL-2.0
// (c) Hare authors <https://harelang.org>
use bufio;
use fmt;
use fs;
use io;
use os;
use time;
// Prints a context line from the source file.
fn print_context(
path: str,
line: u64,
col: u64,
age: time::instant,
) void = {
const file = match (os::open(path)) {
case fs::error =>
return;
case let file: io::file =>
yield file;
};
defer io::close(file): void;
match (os::fstat(file)) {
case let st: fs::filestat =>
if (st.mask & fs::stat_mask::MTIME == 0) yield;
if (time::compare(st.mtime, age) == 1) {
fmt::errorln("* Warning: file was modified after executable was built"): void;
};
case => void;
};
static let linebuf: [1024]u8 = [0...];
const scan = bufio::newscanner_static(file, linebuf);
let context = "";
for (let i = 0u; i < line; i += 1) {
match (bufio::scan_line(&scan)) {
case let s: const str =>
context = s;
case =>
return;
};
};
fmt::errorfln("| {}", context): void;
if (col != 0) {
fmt::errorf(" "): void;
for (let i = 1u; i < col - 1; i += 1) {
fmt::errorf(" "): void;
};
fmt::errorf("^"): void;
};
fmt::errorln(): void;
};
|