diff options
Diffstat (limited to 'std')
| -rw-r--r-- | std/common.cup | 130 |
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; } |