ack/mach/pdp/int/em.c
1992-04-23 13:02:37 +00:00

115 lines
2.6 KiB
C

/*
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
* See the copyright notice in the ACK home directory, in the file "Copyright".
*
*/
#include <stdio.h>
#include <em_path.h>
#include <local.h>
char rcs_id[] = "$Header$" ;
#define MAGIC 07255
struct header {
short h_magic; /* Magic number */
short h_flags; /* See below for defines */
short h_unresolved; /* Cannot run if nonzero */
short h_version; /* Check for VERSION */
short h_wsize;
short h_psize;
short h_unused[2]; /* left over */
} header;
#define TEST 001
#define PROFILE 002
#define FLOW 004
#define COUNT 010
char em_dir[64] = EM_DIR; /* easier to patch */
char *defargv[] = {
"em",
"e.out",
0
};
char interpret[BUFSIZ];
char flags[5];
char tflg,fflg,cflg,pflg;
main(argc,argv) char **argv; {
char *file;
int fildes;
while (argc>1 && (argv[1][0]=='-' || argv[1][0]=='+')) {
switch(argv[1][1]) {
case 't': tflg=argv[1][0]; break;
case 'c': cflg=argv[1][0]; break;
case 'f': fflg=argv[1][0]; break;
case 'p': pflg=argv[1][0]; break;
default:
fprintf(stderr,"Bad flag %c\n",argv[1][1]);
exit(-1);
}
argv[1] = argv[0];
argc--;argv++;
}
if (argc==1)
argv= defargv;
file=argv[1];
if ((fildes=open(file,0))<0) {
perror(file);
exit(8) ;
}
header.h_magic= r2b(fildes,file) ;
header.h_flags= r2b(fildes,file) ;
header.h_unresolved= r2b(fildes,file) ;
header.h_version= r2b(fildes,file) ;
header.h_wsize= r2b(fildes,file) ;
header.h_psize= r2b(fildes,file) ;
header.h_unused[0]= r2b(fildes,file) ;
header.h_unused[1]= r2b(fildes,file) ;
if (header.h_magic != MAGIC) {
fprintf(stderr,"%s not in correct format\n",file);
exit(-1);
}
if (header.h_version != VERSION) {
fprintf(stderr,"%s obsolete, recompile\n",file);
exit(-1);
}
if (header.h_unresolved != 0) {
fprintf(stderr,
"%s has unresolved references, cannot run it\n",file);
exit(-1);
}
if (tflg)
flags[0] = tflg=='+' ? 't' : '-';
else
flags[0]= header.h_flags&TEST ? 't' : '-';
if (fflg)
flags[1] = fflg=='+' ? 'f' : '-';
else
flags[1]= header.h_flags&FLOW ? 'f' : '-';
if (cflg)
flags[2] = cflg=='+' ? 'c' : '-';
else
flags[2]= header.h_flags&COUNT ? 'c' : '-';
if (pflg)
flags[3] = pflg=='+' ? 'p' : '-';
else
flags[3]= header.h_flags&PROFILE ? 'p' : '-';
sprintf(interpret,"%s/lib.bin/em%d%d/em_%s",
em_dir,header.h_wsize,header.h_psize,flags);
execv(interpret,argv);
fprintf(stderr,"Interpreter %s not available\n",interpret);
}
r2b(fildes,file) char *file ; {
char rd2[2] ;
if ( read(fildes,rd2,sizeof rd2)!=sizeof rd2) {
fprintf(stderr,"%s too short\n",file);
exit(-1);
}
return (rd2[0]&0xFF) | ( (rd2[1]&0xFF)<<8 ) ;
}