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(¬es, (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)
}
|