File: source.ha

package info (click to toggle)
hare 0.25.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,948 kB
  • sloc: asm: 1,264; makefile: 123; sh: 114; lisp: 101
file content (59 lines) | stat: -rw-r--r-- 1,147 bytes parent folder | download
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;
};