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