123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- /* $Header$ */
- /*
- * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
- * See the copyright notice in the ACK home directory, in the file "Copyright".
- *
- */
- #include <sgtty.h>
- #include <stdio.h>
- #include <assert.h>
- struct sgttyb tty;
- #define DATTYPE 0
- #define EOFTYPE 1
- #define SEGTYPE 2
- #define PCTYPE 3
- #define MAXBYTE 32
- int check;
- int echo;
- int istty;
- int bytecount;
- int ttyfd;
- char *progname;
- char hex[] = "0123456789ABCDEF";
- main(argc,argv) char **argv; {
- register nd,pc,sg,osg,first;
- register char *s;
- int uid;
- 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);
- s = "/dev/tty05";
- if (argc >= 3)
- s = argv[2];
- if ((ttyfd = open(s,2)) < 0)
- if ((ttyfd = creat(s,0666)) < 0)
- fatal("can't open %s",s);
- if (gtty(ttyfd,&tty) == 0) {
- echo++;
- istty++;
- tty.sg_ispeed = tty.sg_ospeed = B2400;
- tty.sg_flags = RAW;
- stty(ttyfd,&tty);
- } else {
- freopen(s,"w",stdout);
- }
- first = 1; osg = 0;
- /* uid = getuid(); */
- /* lock(1); */
- for (;;) {
- pc = get2c(stdin);
- if (feof(stdin))
- break;
- sg = get2c(stdin);
- nd = get2c(stdin);
- if (first) {
- put('L'); reply();
- put('S'); reply();
- first = 0;
- }
- if (sg != osg) {
- segment(sg);
- osg = sg;
- }
- while (nd > MAXBYTE) {
- data(MAXBYTE,pc);
- nd -= MAXBYTE;
- pc += MAXBYTE;
- }
- if (nd > 0)
- data(nd,pc);
- assert(feof(stdin) == 0);
- }
- if (first == 0)
- eof();
- /* lock(0); */
- /* setuid(uid); */
- /* if (echo) */
- /* for (;;) */
- /* reply(); */
- }
- segment(sg) {
- newline(2,0,SEGTYPE);
- word(sg);
- endline();
- }
- startad(pc) {
- newline(4,0,PCTYPE);
- word(0);
- word(pc);
- endline();
- }
- data(nd,pc) {
- newline(nd,pc,DATTYPE);
- do
- byte(getc(stdin));
- while (--nd);
- endline();
- }
- eof() {
- newline(0,0,EOFTYPE);
- byte(0xFF);
- put('\n');
- }
- newline(n,pc,typ) {
- check = 0;
- bytecount = n+5;
- put('\n'); /* added instruction */
- put(':');
- byte(n);
- word(pc);
- byte(typ);
- }
- endline() {
- byte(-check);
- assert(bytecount == 0);
- assert(check == 0);
- }
- word(w) {
- byte(w>>8);
- byte(w);
- }
- byte(b) {
- check += b;
- --bytecount;
- put(hex[(b>>4) & 017]);
- put(hex[b & 017]);
- }
- put(c) {
- if (istty)
- write(ttyfd,&c,1);
- else
- putchar(c);
- }
- 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);
- }
|