2 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
3 * See the copyright notice in the ACK home directory, in the file "Copyright".
11 char rcs_id[] = "$Id: em.c,v 2.7 1994/06/24 13:09:02 ceriel Exp $" ;
16 short h_magic; /* Magic number */
17 short h_flags; /* See below for defines */
18 short h_unresolved; /* Cannot run if nonzero */
19 short h_version; /* Check for VERSION */
22 short h_unused[2]; /* left over */
29 char em_dir[64] = EM_DIR; /* easier to patch */
36 char interpret[BUFSIZ];
38 char tflg,fflg,cflg,pflg;
40 main(argc,argv) char **argv; {
44 while (argc>1 && (argv[1][0]=='-' || argv[1][0]=='+')) {
46 case 't': tflg=argv[1][0]; break;
47 case 'c': cflg=argv[1][0]; break;
48 case 'f': fflg=argv[1][0]; break;
49 case 'p': pflg=argv[1][0]; break;
51 fprintf(stderr,"Bad flag %c\n",argv[1][1]);
60 if ((fildes=open(file,0))<0) {
64 header.h_magic= r2b(fildes,file) ;
65 header.h_flags= r2b(fildes,file) ;
66 header.h_unresolved= r2b(fildes,file) ;
67 header.h_version= r2b(fildes,file) ;
68 header.h_wsize= r2b(fildes,file) ;
69 header.h_psize= r2b(fildes,file) ;
70 header.h_unused[0]= r2b(fildes,file) ;
71 header.h_unused[1]= r2b(fildes,file) ;
72 if (header.h_magic != MAGIC) {
73 fprintf(stderr,"%s not in correct format\n",file);
76 if (header.h_version != VERSION) {
77 fprintf(stderr,"%s obsolete, recompile\n",file);
80 if (header.h_unresolved != 0) {
82 "%s has unresolved references, cannot run it\n",file);
86 flags[0] = tflg=='+' ? 't' : '-';
88 flags[0]= header.h_flags&TEST ? 't' : '-';
90 flags[1] = fflg=='+' ? 'f' : '-';
92 flags[1]= header.h_flags&FLOW ? 'f' : '-';
94 flags[2] = cflg=='+' ? 'c' : '-';
96 flags[2]= header.h_flags&COUNT ? 'c' : '-';
98 flags[3] = pflg=='+' ? 'p' : '-';
100 flags[3]= header.h_flags&PROFILE ? 'p' : '-';
101 sprintf(interpret,"%s/lib.bin/em%d%d/em_%s",
102 em_dir,header.h_wsize,header.h_psize,flags);
103 execv(interpret,argv);
104 fprintf(stderr,"Interpreter %s not available\n",interpret);
107 r2b(fildes,file) char *file ; {
109 if ( read(fildes,rd2,sizeof rd2)!=sizeof rd2) {
110 fprintf(stderr,"%s too short\n",file);
113 return (rd2[0]&0xFF) | ( (rd2[1]&0xFF)<<8 ) ;