ref: 7b65afc1ad13f3859eca6eadaa2c45d864320304
dir: /as.c/
#include <u.h> #include <libc.h> #include <bio.h> #include "dat.h" static void _Noreturn usage(void) { fprint(2, "usage: apl/as [-d] [-o outfile] [infile]\n"); exits("usage"); } void main(int argc, char *argv[]) { int disass = 0; char *infile = nil; char *outfile = nil; Biobuf *in, *out; ARGBEGIN{ case 'o': outfile = EARGF(usage()); break; case 'd': disass = 1; break; default: usage(); }ARGEND; if(argc > 1) usage(); else if(argc == 1) infile = *argv; if(outfile == nil && infile != nil){ outfile = strdup(infile); char *dot = utfrrune(outfile, '.'); char *inext = disass ? OC_EXT : BC_EXT; char *outext = disass ? BC_EXT : OC_EXT; if(dot && strcmp(dot+1, inext) == 0) dot[0] = 0; outfile = smprint("%s.%s", outfile, outext); } in = infile ? Bopen(infile, OREAD) : Bfdopen(0, OREAD); out = outfile ? Bopen(outfile, OWRITE|OTRUNC) : Bfdopen(1, OWRITE); if(in == nil || out == nil) sysfatal("open: %r"); Module *m = mallocz(sizeof(Module), 1); for(int output = 0; output < 2; output++){ for(int n = 0; n < nelem(objparts); n++){ ObjpartSpec p = objparts[n]; if(output) p.write(m, out, disass); else p.read(m, in, !disass); } } Bterm(in); Bterm(out); }