aboutsummaryrefslogtreecommitdiff
path: root/std
diff options
context:
space:
mode:
Diffstat (limited to 'std')
-rw-r--r--std/common.cup130
1 files changed, 109 insertions, 21 deletions
diff --git a/std/common.cup b/std/common.cup
index 004eaa9..24e24b7 100644
--- a/std/common.cup
+++ b/std/common.cup
@@ -1,26 +1,40 @@
-fn min(a: int, b: int): int {
- return a < b ? a : b;
+const true = 1;
+const false = 0;
+
+///////////////////////////////////////////////////////////////////////////////
+// Syscalls
+
+fn write(fd: int, s: char*, n: int): int {
+ return syscall3(SYS_write, fd, s, n);
}
-fn max(a: int, b: int): int {
- return a > b ? a : b;
+fn exit(status: int): int {
+ return syscall1(SYS_exit, status);
}
-fn sign(a: int): int {
- return a > 0 ? 1 : a == 0 ? 0 : -1;
+fn read(fd: int, s: char*, n: int): int {
+ return syscall3(SYS_read, fd, s, n);
}
-fn abs(a: int): int {
- return a * sign(a);
+fn open(path: char*, flags: int, mode: int): int {
+ return syscall3(SYS_open, path, flags, mode);
}
-fn factorial(n: int): int {
- let res: int = 1;
- for (;n > 0; n = n - 1)
- res = res * n;
- return res;
+fn openat(fd: int, path: char*, flags: int, mode: int): int {
+ return syscall4(SYS_openat, fd, path, flags, mode);
}
+fn fork(): int {
+ return syscall0(SYS_fork);
+}
+
+fn wait(status: int*): int {
+ return syscall4(SYS_wait4, -1, status, 0, 0);
+}
+
+
+///////////////////////////////////////////////////////////////////////////////
+// Strings
fn strlen(s: char *): int {
let count: int = 0;
@@ -62,6 +76,47 @@ fn streq(s1: char *, s2: char *): int {
return *s1 == *s2;
}
+fn strrev(s: char *) {
+ let len: int = strlen(s);
+ let i: int = 0;
+ let j: int = len - 1;
+ while (i < j) {
+ let tmp: char = s[i];
+ s[i] = s[j];
+ s[j] = tmp;
+ i = i + 1;
+ j = j - 1;
+ }
+}
+
+fn atoi_end(s: char *, end: char**): int {
+ let i: int = 0;
+ let sign: int = 1;
+ if (*s == '-') {
+ sign = -1;
+ s = s + 1;
+ }
+ while (*s >= '0' && *s <= '9') {
+ i = i * 10 + (*s - '0');
+ s = s + 1;
+ }
+ *end = s;
+ return i * sign;
+}
+
+fn atoi(s: char *): int {
+ let tmp: char*;
+ return atoi_end(s, &tmp);
+}
+
+
+///////////////////////////////////////////////////////////////////////////////
+// I/O
+
+const stdin = 0;
+const stdout = 1;
+const stderr = 2;
+
fn putc(c: char) {
write(0, &c, 1);
}
@@ -76,15 +131,48 @@ fn putsln(c: char *) {
putc('\n');
}
-fn strrev(s: char *) {
- let len: int = strlen(s);
+fn putu(n: int) {
+ let buf: char[32];
let i: int = 0;
- let j: int = len - 1;
- while (i < j) {
- let tmp: char = s[i];
- s[i] = s[j];
- s[j] = tmp;
+ while (n > 0) {
+ buf[i] = (n % 10) + '0';
+ n = n / 10;
i = i + 1;
- j = j - 1;
}
+ if (i == 0)
+ buf[i] = '0';
+ else
+ strrev(buf);
+ write(0, buf, i);
+}
+
+fn die(msg: char *) {
+ putsln(msg);
+ exit(1);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// Math
+
+fn min(a: int, b: int): int {
+ return a < b ? a : b;
+}
+
+fn max(a: int, b: int): int {
+ return a > b ? a : b;
+}
+
+fn sign(a: int): int {
+ return a > 0 ? 1 : a == 0 ? 0 : -1;
+}
+
+fn abs(a: int): int {
+ return a * sign(a);
+}
+
+fn factorial(n: int): int {
+ let res: int = 1;
+ for (;n > 0; n = n - 1)
+ res = res * n;
+ return res;
}