int g_passed = 0; int g_failed = 0; int getc() { char c; int n = syscall(0, 0, &c, 1); if (n <= 0) return -1; return (int)c; } int write_char(int c) { char b; b = (char)c; syscall(1, 1, &b, 1); return 1; } int write_str(char *s) { int n = 0; while (s[n] != 0) n++; syscall(1, 1, s, n); return n; } int write_int(int n) { char tmp[24]; int len = 0; int neg = n < 0; if (neg) { write_char('-'); n = -n; } if (n == 0) { write_char('0'); return 1; } while (n > 0) { tmp[len] = (char)('0' + n % 10); n = n / 10; len++; } int i = len - 1; while (i >= 0) { write_char(tmp[i]); i--; } return neg + len; } int check(char *name, int got, int want) { if (got == want) { write_str("PASS "); write_str(name); write_char('\n'); g_passed++; return 1; } write_str("FAIL "); write_str(name); write_str(": got "); write_int(got); write_str(" want "); write_int(want); write_char('\n'); g_failed++; return 0; } int read_line(char *buf, int cap) { int i = 0; int c; while (i < cap - 1) { c = getc(); if (c == -1 || c == '\n') break; buf[i] = (char)c; i++; } buf[i] = 0; return i; } int test1() { int c = getc(); int result = c; while (c != '\n' && c != -1) c = getc(); return check("single_char_is_65", result, 65); } int test2() { char buf[64]; int n = read_line(buf, 64); write_str(buf); write_char('\n'); return check("readline_length", n, 5); } int test3() { int newlines = 0; int c; while (newlines < 2) { c = getc(); if (c == -1) break; if (c == '\n') newlines++; } return check("count_lines", newlines, 2); } int test4() { int value = 0; int c; while (1) { c = getc(); if (c < '0' || c > '9') break; value = value * 10 + (c - '0'); } return check("parse_int", value, 42); } int test5() { char buf[64]; int n = read_line(buf, 64); int i = 0; while (i < n) { char ch = buf[i]; if (ch >= 'a' && ch <= 'z') buf[i] = ch - 'a' + 'A'; i++; } write_str(buf); write_char('\n'); return check("toupper_length", n, 5); } int test6() { int c = getc(); return check("eof_is_minus1", c, -1); } int main() { test1(); test2(); test3(); test4(); test5(); test6(); write_char('\n'); write_int(g_passed); write_str(" passed, "); write_int(g_failed); write_str(" failed\n"); return g_failed == 0 ? 0 : 1; }