/* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ #include #include #include struct sgttyb tty; #define DATTYPE 0 #define EOFTYPE 1 #define SEGTYPE 2 #define PCTYPE 3 #define MAXBYTE 0x18 int check; int records; int echo; int bytecount; int ttyfd; char *progname; char hex[] = "0123456789ABCDEF"; main(argc,argv) char **argv; { register nd,pc,sg,osg,first; register char *s; progname = argv[0]; if (argc > 3) fatal("usage: %s [object [tty]]\n",argv[0]); s = "a.out"; if (argc >= 2) s = argv[1]; if (freopen(s,"r",stdin) == NULL) fatal("can't open %s",s); ttyfd = 1; first = 1; osg = 0; for (;;) { pc = get2c(stdin); if (feof(stdin)) break; sg = get2c(stdin); nd = get2c(stdin); if (first) { first = 0; } assert(sg == osg); while (nd > MAXBYTE) { data(MAXBYTE,pc); nd -= MAXBYTE; pc += MAXBYTE; } if (nd > 0) data(nd,pc); assert(feof(stdin) == 0); } if (first == 0) eof(); if (echo) for (;;) reply(); } data(nd,pc) { newline(nd,pc,DATTYPE); do byte(getc(stdin)); while (--nd); endline(); } eof() { newline(0,records,EOFTYPE); endline(); } newline(n,pc,typ) { records++; put(';'); byte(n); check = 0; bytecount = n+4; word(pc); } endline() { word(check); put('\r'); put('\n'); assert(bytecount == 0); put(0); put(0); put(0); put(0); put(0); put(0); } word(w) { byte(w>>8); byte(w); } byte(b) { b &= 0377; check += b; --bytecount; put(hex[(b>>4) & 017]); put(hex[b & 017]); } put(c) { write(ttyfd,&c,1); } reply() { register i; int c; if (echo == 0) return; i = read(ttyfd,&c,1); assert(i > 0); write(1,&c,1); } get2c(f) FILE *f; { register c; c = getc(f); return((getc(f) << 8) | c); } fatal(s,a) { fprintf(stderr,"%s: ",progname); fprintf(stderr,s,a); fprintf(stderr,"\n"); exit(-1); }