cat.om (670B)
1 func docat(fd: int, buf: *byte) { 2 var n: int; 3 var m: int; 4 var k: int; 5 loop { 6 n = read(fd, buf, 4096); 7 if n == 0 { 8 return; 9 } 10 11 if n < 0 { 12 die("read failed"); 13 } 14 15 m = 0; 16 loop { 17 if m == n { 18 break; 19 } 20 21 k = write(1, &buf[m], n - m); 22 if k < 0 { 23 die("write failed"); 24 } 25 26 m = m + k; 27 } 28 } 29 } 30 31 func main(argc: int, argv: **byte, envp: **byte) { 32 var fd: int; 33 var i: int; 34 var a: alloc; 35 var buf: *byte; 36 37 setup_alloc(&a); 38 39 buf = alloc(&a, 4096); 40 41 if argc == 1 { 42 docat(0, buf); 43 } else { 44 i = 1; 45 loop { 46 if i >= argc { 47 break; 48 } 49 50 fd = open(argv[i], 0, 0); 51 52 docat(fd, buf); 53 54 close(fd); 55 56 i = i + 1; 57 } 58 } 59 }