implement DumpBin; include "sys.m"; include "draw.m"; include "arg.m"; include "lock.m"; include "string.m"; include "modbus.m"; include "exactus.m"; sys: Sys; str: String; exactus: Exactus; EPort, Emsg, ERmsg, Trecord: import exactus; DumpBin: module { init: fn(ctxt: ref Draw->Context, argv: list of string); }; stdout, stderr: ref Sys->FD; debug := 0; outfile : string; init(nil: ref Draw->Context, argv: list of string) { sys = load Sys Sys->PATH; stdout = sys->fildes(1); stderr = sys->fildes(2); str = load String String->PATH; exactus = load Exactus Exactus->PATH; exactus->init(); all := 0; arg := load Arg Arg->PATH; arg->init(argv); arg->setusage(arg->progname() + " [-a] [-o file] [-] [file...]"); while((c := arg->opt()) != 0) case c { 'a' => all++; 'o' => outfile = arg->earg(); * => arg->usage(); } args := arg->argv(); if(args == nil) args = "-" :: nil; for(; args != nil; args = tl args){ file := hd args; if(file != "-"){ fd := sys->open(file, Sys->OREAD); if(fd == nil){ sys->fprint(sys->fildes(2), "dumpbin: cannot open %s: %r\n", file); raise "fail:bad open"; } dump(fd, all, file); } else dump(sys->fildes(0), all, ""); } } dump(fd: ref Sys->FD, all: int, file: string) { buf := array[36] of byte; ofd := stdout; if(outfile != nil) { ofd = sys->create(outfile, sys->OWRITE, 8r664); if(ofd == nil) ofd = stderr; } while((n := sys->read(fd, buf, len buf)) > 0) { if(n < len buf) sys->fprint(sys->fildes(2), "dumpbin: last record too short: %d\n", n); (nil, t) := Trecord.unpack(buf); if(t != nil) { if(all) { sys->fprint(ofd, "%d\t%.3f\t%.5e\t%.3f\t%.04f\t%.04f\t%.04f\t%.05f\t%.05f\n", t.time, t.temp0, t.temp1, t.temp2, t.current1, t.current2, t.etemp1, t.etemp2, t.emissivity); } else { sys->fprint(ofd, "%d\t%.3f\n", t.time, t.temp0); } } else sys->fprint(stderr, "error unpacking: %s\n", hexdump(buf)); } if(n < 0) { sys->fprint(sys->fildes(2), "dumpbin: error reading %s: %r\n", file); raise "fail:read error"; } } hexdump(b: array of byte): string { s := ""; for(i:=0; isprint("%s %02X", s, int(b[i])); } return str->drop(s, "\n"); }