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