Pristine Ack-5.5
[Ack-5.5.git] / mach / pdp / int / em.c
1 /*
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".
4  *
5  */
6
7 #include <stdio.h>
8 #include <em_path.h>
9 #include <local.h>
10
11 char rcs_id[]   =       "$Id: em.c,v 2.7 1994/06/24 13:09:02 ceriel Exp $" ;
12
13 #define MAGIC 07255
14
15 struct header {
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 */
20         short h_wsize;
21         short h_psize;
22         short h_unused[2];      /* left over */
23 } header;
24
25 #define TEST    001
26 #define PROFILE 002
27 #define FLOW    004
28 #define COUNT   010
29 char em_dir[64] = EM_DIR;       /* easier to patch */
30 char *defargv[] = {
31         "em",
32         "e.out",
33         0
34 };
35
36 char interpret[BUFSIZ];
37 char flags[5];
38 char tflg,fflg,cflg,pflg;
39
40 main(argc,argv) char **argv; {
41         char *file;
42         int fildes;
43
44         while (argc>1 && (argv[1][0]=='-' || argv[1][0]=='+')) {
45                 switch(argv[1][1]) {
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;
50                 default:
51                         fprintf(stderr,"Bad flag %c\n",argv[1][1]);
52                         exit(-1);
53                 }
54                 argv[1] = argv[0];
55                 argc--;argv++;
56         }
57         if (argc==1)
58                 argv= defargv;
59         file=argv[1];
60         if ((fildes=open(file,0))<0) {
61                 perror(file);
62                 exit(8) ;
63         }
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);
74                 exit(-1);
75         }
76         if (header.h_version != VERSION) {
77                 fprintf(stderr,"%s obsolete, recompile\n",file);
78                 exit(-1);
79         }
80         if (header.h_unresolved != 0) {
81                 fprintf(stderr,
82                         "%s has unresolved references, cannot run it\n",file);
83                 exit(-1);
84         }
85         if (tflg)
86                 flags[0] = tflg=='+' ? 't' : '-';
87         else
88                 flags[0]= header.h_flags&TEST ? 't' : '-';
89         if (fflg)
90                 flags[1] = fflg=='+' ? 'f' : '-';
91         else
92                 flags[1]= header.h_flags&FLOW ? 'f' : '-';
93         if (cflg)
94                 flags[2] = cflg=='+' ? 'c' : '-';
95         else
96                 flags[2]= header.h_flags&COUNT ? 'c' : '-';
97         if (pflg)
98                 flags[3] = pflg=='+' ? 'p' : '-';
99         else
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);
105 }
106
107 r2b(fildes,file) char *file ; {
108         char rd2[2] ;
109         if ( read(fildes,rd2,sizeof rd2)!=sizeof rd2) {
110                 fprintf(stderr,"%s too short\n",file);
111                 exit(-1);
112         }
113         return (rd2[0]&0xFF) | ( (rd2[1]&0xFF)<<8 ) ;
114 }