Pristine Ack-5.5
[Ack-5.5.git] / util / misc / esize.c
1 /*      esize:          prints info from e.out header
2 */
3
4 #include        <stdio.h>
5
6 #ifndef MAGIC
7 #define MAGIC           07255
8 #endif  /* MAGIC */
9
10 FILE *load_fp;
11 int eof;
12
13 /*      Much of the code has been borrowed from the EM interpreter
14 */
15
16 typedef /* unsigned */ long ptr;        /* pointer to EM adress */
17
18 long magic;
19 long flags;
20 long uref;
21 long version;
22 long wsize;
23 long psize;
24 long int7;
25 long int8;
26 long ntext;
27 long ndata;
28 long nproc;
29 long entrypoint;
30 long nline;
31 long szdata;
32 long ptr7;
33 long ptr8;
34
35 main(argc, argv)
36         int argc;
37         char *argv[];
38 {
39         printf("TPFCRE uref vers  w/p   text  nproc  szdata\n");
40         
41         if (argc == 1)  {
42                 esize("e.out");
43         }
44         else    {
45                 while (argc > 1)        {
46                         esize(argv[1]);
47                         argc--, argv++;
48                 }
49         }
50         exit(0);
51 }
52
53 esize(fname)
54         char *fname;
55 {
56         eof = 0;
57         if (!rd_open(fname))    {
58                 printf("%s: cannot open\n", fname);
59         }
60         else    {
61                 if (!rd_header())       {
62                         printf("%s: not EM object format\n", fname);
63                 }
64                 else    {
65                         printf("%c", flags&0001 ? 'T' : '-');
66                         printf("%c", flags&0002 ? 'P' : '-');
67                         printf("%c", flags&0004 ? 'F' : '-');
68                         printf("%c", flags&0010 ? 'C' : '-');
69                         printf("%c", flags&0020 ? 'R' : '-');
70                         printf("%c", flags&0040 ? 'E' : '-');
71                         printf("%c", flags&0100 ? '?' : ' ');
72                         printf("%c", flags&0200 ? '?' : ' ');
73                         
74                         printf("%3ld  ", uref);
75                         printf("%3ld  ", version);
76                         printf("%1ld/%1ld", wsize, psize);
77                         printf("%c", int7 ? '?' : ' ');
78                         printf("%c", int8 ? '?' : ' ');
79                                 
80                         printf("%5ld  ", ntext);
81                         printf("%5ld  ", nproc);
82                         printf("%6ld", szdata);
83                         printf("%c", ptr7 ? '?' : ' ');
84                         printf("%c", ptr8 ? '?' : ' ');
85                         printf("%s\n", fname);
86                 }
87                 rd_close();
88         }
89 }
90
91 #define btol(a)         ((long)(((long) (a)) & 0xFF))
92
93 int
94 rd_open(load_file)
95         char *load_file;
96 {
97         return (load_fp = fopen(load_file, "r")) != NULL;
98 }
99
100 int
101 rd_byte()
102 {
103         int i;
104
105         if ((i = fgetc(load_fp)) == EOF)
106                 eof = 1;
107         return (i);
108 }
109
110 long
111 rd_int(n)
112         long n;
113 {
114         long l;
115         register int i;
116
117         l = btol(rd_byte());
118         for (i = 1; i < n; i++)
119                 l = l | (btol(rd_byte()) << (long) (i*8));
120         return (l);
121 }
122
123 #define rd_ptr()        ((ptr) rd_int(psize))
124
125 int
126 rd_header()
127 {
128         magic = rd_int(2L);
129         if (magic != MAGIC || eof)
130                 return 0;
131         
132         flags = rd_int(2L);
133         uref = rd_int(2L);
134         version = rd_int(2L);
135         wsize = rd_int(2L);
136         psize = rd_int(2L);
137         int7 = rd_int(2L);      /* Entry 7 is unused */
138         int8 = rd_int(2L);      /* Entry 8 is unused */
139
140         ntext = rd_ptr();
141         ndata = rd_ptr();
142         nproc = rd_ptr();
143         entrypoint = rd_ptr();
144         nline = rd_ptr();
145         szdata = rd_ptr();
146         ptr7 = rd_ptr();        /* entry 7 is unused */
147         ptr8 = rd_ptr();        /* entry 8 is unused */
148         
149         return !eof;
150 }
151
152 rd_close()
153 {
154         fclose(load_fp);
155 }
156