123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- /* $Id$ */
- /*
- * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
- * See the copyright notice in the ACK home directory, in the file "Copyright".
- *
- */
- #include <stdlib.h>
- #include <stdio.h>
- #include <assert.h>
- #include "out.h"
- #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";
- struct outhead ohead;
- struct outsect sect[MAXSECT];
- main(argc,argv) char **argv; {
- int i,nd,pc,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 (! rd_open(s)) {
- fprintf(stderr,"%s: can't open %s\n",progname,s);
- exit(-1);
- }
- rd_ohead(&ohead);
- if (ohead.oh_flags & HF_LINK) {
- fprintf(stderr,"%s: %s contains unresolved references\n",progname,s);
- exit(-1);
- }
- rd_sect(sect, ohead.oh_nsect);
- ttyfd = 1;
- first = 1;
- for (i = 0; i < ohead.oh_nsect; i++) {
- rd_outsect(i);
- pc = sect[i].os_base;
- while (sect[i].os_size) {
- unsigned int sz = 8096, fl;
- register char *buf;
- char *pbuf;
- if (sz > sect[i].os_size) sz = sect[i].os_size;
- sect[i].os_size -= sz;
- pbuf = buf = calloc(sz, 1);
- if (fl = sect[i].os_flen) {
- if (fl > sz) fl = sz;
- sect[i].os_flen -= fl;
- rd_emit(buf, (long) fl);
- }
- while (sz >= MAXBYTE) {
- data(MAXBYTE, (int) pc, buf);
- sz -= MAXBYTE;
- buf += MAXBYTE;
- pc += MAXBYTE;
- first = 0;
- }
- if (sz > 0) {
- data(sz, (int) pc, buf);
- first = 0;
- }
- free(pbuf);
- }
- }
- if (first == 0)
- eof();
- if (echo)
- for (;;)
- reply();
- }
- data(nd,pc, buf)
- register char *buf;
- {
- newline(nd,pc,DATTYPE);
- do
- byte(*buf++);
- 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)
- char c;
- {
- write(ttyfd,&c,1);
- }
- reply() {
- register i;
- char c;
- if (echo == 0)
- return;
- i = read(ttyfd,&c,1);
- assert(i > 0);
- write(1,&c,1);
- }
- fatal(s,a)
- const char* s;
- const char* a;
- {
- fprintf(stderr,"%s: ",progname);
- fprintf(stderr,s,a);
- fprintf(stderr,"\n");
- exit(-1);
- }
- rd_fatal() { fatal("read error"); }
|