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