summaryrefslogtreecommitdiff
path: root/suckless2/suckless2.myr
blob: df65df6cef85041f7e1b7ae6355a2bb88833f3bf (plain)
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
use std

var flag = "Obvious decoy is obvious. Hit the server, you fool."
var version = "sldiary 0.1.1"

const intro = {
	std.put("(\\ \n")
	std.put("\\'\\ \n")
	std.put(" \\'\\     __________  \n")
	std.put(" / '|   ()_________)\n")
	std.put(" \\ '/    \\ ~~~~~~~~ \\       {}\n", version)
	std.put("   \\       \\ ~~~~~~   \\\n")
	std.put("   ==).     \\__________\\\n")
	std.put("  (__)       ()__________)\n")
	std.put("\n")
	std.put("type 'help' for available commands\n")
}

const showver = {
	var tmp = flag
	std.put("this is {}\n", version)
}

const addmsg = {n, buf -> byte#
	var i
	var msg = std.bytealloc(n)
	for i = 0; buf[i] != ('\n' : byte); i++;
		(((msg : std.size) + i) : byte#)# = buf[i]
	;;
	-> msg
}

const msgstrconv = {n, msg
	var i
	var sb = std.mksb()
	for i = 0; i < n; i++
		std.sbputc(sb, ((((msg : uint64) + i) : byte#)# : char))
	;;
	-> std.sbfin(sb)
}

const getln = {
	var sb = std.mksb()
	var buf = std.slalloc(0x40)
	match std.read(std.In, buf)
		| `std.Ok(n):
		| `std.Err(n): std.die("i/o error")
	;;
	std.sbputs(sb, buf)
	-> std.sbfin(sb)
}

const main = {
	intro()
	var notes = std.slalloc(0)

    var line
	while true
		std.put("> ")
		line = getln()
		if std.strhas(line, "help")
			std.put("help: print this\n")
			std.put("new: make a new note\n")
			std.put("show: show all of your notes\n")
			std.put("version: show the version of sldiary\n")
		elif std.strhas(line, "new")
			std.put("note length: ")
			std.slfree(line)
			line = getln()
			var len
			match std.strfind(line, "\n")
			| `std.Some(n): line = line[:n]
			| `std.None:
			;;		
			match std.intparse(line)
			| `std.Some(n): len = n
			| `std.None: std.put("invalid length\n"); continue
			;;
			std.put("note: ")
			std.slfree(line)
			line = getln()
			var msg = addmsg(len, line)
			notes = std.slpush(&notes, (len, msg))
		elif std.strhas(line, "show")
			var i
			for i = 0; i < notes.len; i++;
				var len, msg
				(len, msg) = notes[i]
				std.put("address: {}\n", (msg : byte#))
				std.put("{}: {}\n", i, msgstrconv((len : uint64), msg))
			;;
		elif std.strhas(line, "version")
			showver()
		else
			std.put("invalid command\n")
		;;
		std.slfree(line)
	;;

	std.slfree(notes)
}