eb50e000366db3a8138a94d5665edc8f7ff25419
[ghc-hetmet.git] / utils / hp2ps / Main.c
1 #include "Main.h"
2 #include <stdio.h>
3 #include <string.h>
4 #include <stdlib.h>
5 #include "Defines.h"
6 #include "AuxFile.h"
7 #include "AreaBelow.h"
8 #include "Dimensions.h"
9 #include "HpFile.h"
10 #include "PsFile.h"
11 #include "Reorder.h"
12 #include "Scale.h"
13 #include "TopTwenty.h"
14 #include "TraceElement.h"
15 #include "Deviation.h"
16 #include "Error.h"
17 #include "Utilities.h"
18
19 boolish pflag = 0;      /* read auxiliary file                  */
20 boolish eflag = 0;      /* scaled EPSF                          */
21 boolish dflag = 0;      /* sort by standard deviation           */
22 int     iflag = 0;      /* sort by identifier (3-way flag)      */
23 boolish gflag = 0;      /* output suitable for previewer        */
24 boolish yflag = 0;      /* ignore marks                         */
25 boolish bflag = 0;      /* use a big title box                  */
26 boolish sflag = 0;      /* use a small title box                */
27 int     mflag = 0;      /* max no. of bands displayed (default 20) */
28 boolish tflag = 0;      /* ignored threshold specified          */
29 boolish cflag = 0;      /* colour output                        */
30
31 boolish filter;         /* true when running as a filter        */
32 boolish multipageflag = 0;  /* true when the output should be 2 pages - key and profile */ 
33
34 static floatish WidthInPoints PROTO((char *));            /* forward */
35 static FILE *Fp PROTO((char *, char **, char *, char *)); /* forward */
36
37 char *hpfile;
38 char *psfile;
39 char *auxfile;
40
41 char *programname;
42
43 static char *pathName;
44 static char *baseName; /* "basename" is a std C library name (sigh) */
45
46 FILE* hpfp;
47 FILE* psfp;
48 FILE* auxfp;
49
50 floatish xrange = 0.0;
51 floatish yrange = 0.0;
52
53 floatish auxxrange = 0.0;
54 floatish auxyrange = 0.0;
55
56 floatish epsfwidth;
57 floatish areabelow;
58
59 intish nsamples;
60 intish nmarks;
61 intish nidents;
62
63 floatish THRESHOLD_PERCENT = DEFAULT_THRESHOLD;
64 int TWENTY = DEFAULT_TWENTY;
65
66 int main(argc, argv)
67 int argc;
68 char* argv[];
69 {
70
71     programname = copystring(Basename(argv[0]));
72
73     argc--, argv++;
74     while (argc && argv[0][0] == '-') {
75         while (*++*argv)
76             switch(**argv) {
77             case 'p':
78                 pflag++;
79                 break;
80             case 'e':
81                 eflag++;
82                 epsfwidth = WidthInPoints(*argv + 1);
83                 goto nextarg;
84             case 'd':
85                 dflag++;
86                 goto nextarg;
87             case 'i':
88                 switch( *(*argv + 1) ) {
89                   case '-':
90                     iflag = -1;
91                   case '+':
92                   default:
93                     iflag = 1;
94                 }
95                 goto nextarg;
96             case 'g':
97                 gflag++;
98                 goto nextarg;
99             case 'y':
100                 yflag++;
101                 goto nextarg;
102             case 'b':
103                 bflag++;
104                 goto nextarg;
105             case 's':
106                 sflag++;
107                 goto nextarg;
108             case 'm':
109                 mflag++;
110                 TWENTY = atoi(*argv + 1);
111                 // only 20 keys fit on a page
112                 if (TWENTY > DEFAULT_TWENTY) 
113                    multipageflag++;
114                 goto nextarg;
115             case 'M':
116                 multipageflag++;
117                 goto nextarg;
118             case 't':
119                 tflag++;
120                 THRESHOLD_PERCENT = (floatish) atof(*argv + 1);
121                 if (THRESHOLD_PERCENT < 0 || THRESHOLD_PERCENT > 5)
122                     Usage(*argv-1);
123                 goto nextarg;
124             case 'c':
125                 cflag++;
126                 goto nextarg;
127             case '?':
128             default:
129                 Usage(*argv-1);
130             }
131 nextarg: ;
132         argc--, argv++;
133     }
134
135     hpfile = "stdin";
136     psfile = "stdout";
137
138     hpfp = stdin;
139     psfp = stdout;
140
141     filter = argc < 1;
142
143
144
145     if (!filter) {
146         pathName = copystring(argv[0]);
147         DropSuffix(pathName, ".hp");
148         baseName = copystring(Basename(pathName));
149
150         hpfp  = Fp(pathName, &hpfile, ".hp", "r"); 
151         psfp  = Fp(baseName, &psfile, ".ps", "w"); 
152
153         if (pflag) auxfp = Fp(baseName, &auxfile, ".aux", "r");
154     }
155
156     GetHpFile(hpfp);
157
158     if (!filter && pflag) GetAuxFile(auxfp);
159
160
161     TraceElement();          /* Orders on total, Removes trace elements (tflag) */
162
163     if (dflag) Deviation();  /* ReOrders on deviation */
164
165     if (iflag) Identorder(iflag); /* ReOrders on identifier */
166
167     if (pflag) Reorder();    /* ReOrders on aux file */
168
169     /* Selects top bands (mflag) - can be more than 20 now */
170     if (TWENTY != 0) TopTwenty(); 
171
172     Dimensions();
173
174     areabelow = AreaBelow();
175
176     Scale();
177
178     PutPsFile();
179
180     if (!filter) {
181         auxfp = Fp(baseName, &auxfile, ".aux", "w");
182         PutAuxFile(auxfp);
183     } 
184
185     return(0);
186 }
187
188
189
190 typedef enum {POINTS, INCHES, MILLIMETRES} pim;
191
192 static pim Units PROTO((char *));   /* forward */
193
194 static floatish
195 WidthInPoints(wstr)
196   char *wstr;
197 {
198     floatish result;
199
200     result = (floatish) atof(wstr);
201
202     switch (Units(wstr)) {
203         case INCHES:            
204             result *= 72.0;
205             break;
206         case MILLIMETRES:       
207             result *= 2.834646;
208             break;
209         case POINTS:
210         default: ;
211     }
212
213     if (result <= 144)   /* Minimum of 2in wide ! */
214         Usage(wstr);
215
216     return result;
217 }
218
219         
220 static pim
221 Units(wstr)
222   char* wstr;
223 {
224 int i;
225
226     i = strlen(wstr) - 2;
227
228     if (wstr[i] == 'p' && wstr[i+1] == 't') {
229         return POINTS;
230     } else if (wstr[i] == 'i' && wstr[i+1] == 'n') {
231         return INCHES;  
232     } else if (wstr[i] == 'm' && wstr[i+1] == 'm') {
233         return MILLIMETRES;
234     } else {
235         return POINTS;
236     }
237 }
238
239 static FILE *
240 Fp(rootname, filename, suffix, mode)
241   char* rootname; char** filename; char* suffix; char* mode;
242 {
243     *filename = copystring2(rootname, suffix);
244
245     return(OpenFile(*filename, mode));
246 }
247
248 #ifdef DEBUG
249 void
250 _stgAssert (filename, linenum)
251   char          *filename;
252   unsigned int  linenum;
253 {
254     fflush(stdout);
255     fprintf(stderr, "ASSERTION FAILED: file %s, line %u\n", filename, linenum);
256     fflush(stderr);
257     abort();
258 }
259 #endif