1implement Disdump; 2 3include "sys.m"; 4 sys: Sys; 5include "draw.m"; 6include "dis.m"; 7 dis: Dis; 8include "bufio.m"; 9 bufio: Bufio; 10 Iobuf: import bufio; 11 12Disdump: module { 13 init: fn(nil: ref Draw->Context, argv: list of string); 14}; 15 16init(nil: ref Draw->Context, argv: list of string) 17{ 18 sys = load Sys Sys->PATH; 19 stderr := sys->fildes(2); 20 bufio = load Bufio Bufio->PATH; 21 if (bufio == nil) { 22 sys->fprint(stderr, "dis: cannot load %s: %r\n", Bufio->PATH); 23 raise "fail:bad module"; 24 } 25 26 dis = load Dis Dis->PATH; 27 if (dis == nil) { 28 sys->fprint(stderr, "dis: cannot load %s: %r\n", Dis->PATH); 29 raise "fail:bad module"; 30 } 31 32 if (len argv < 2) { 33 sys->fprint(stderr, "usage: dis module...\n"); 34 raise "fail:usage"; 35 } 36 dis->init(); 37 out := bufio->fopen(sys->fildes(1), Sys->OWRITE); 38 errs := 0; 39 for (argv = tl argv; argv != nil; argv = tl argv) { 40 (mod, err) := dis->loadobj(hd argv); 41 if (mod == nil) { 42 sys->fprint(stderr, "dis: failed to load %s: %s\n", hd argv, err); 43 errs++; 44 continue; 45 } 46 for (i := 0; i < len mod.inst; i++) 47 out.puts(dis->inst2s(mod.inst[i])+"\n"); 48 } 49 out.close(); 50 if (errs) 51 raise "fail:errors"; 52} 53