[project @ 1996-01-08 20:28:12 by partain]
[ghc-hetmet.git] / ghc / utils / ugen / main.c
1 #ifdef __STDC__
2 #define PROTO(x)        x
3 #else
4 #define PROTO(x)        ()
5 #endif
6
7 #include <stdio.h>
8 #include "id.h"
9 #include "tree.h"
10
11 #include "funs.h"
12
13 FILE *fh, *fc, *fhs;
14
15 tree root; /* The root of the built syntax tree. */
16
17 main(argc, argv)
18     int argc;
19     char **argv;
20 {
21         int i = 0;
22
23         if(argc != 2) {
24                 printf("Missing input file.\n");
25                 exit(1);
26         }
27
28         if(freopen(argv[1], "r", stdin) == NULL) {
29                 fprintf(stderr, "Cannot open %s.\n", argv[1]);
30                 exit(1);
31         }
32
33         while(argv[1][i+1] != 0)
34                 i++;
35         if(! (argv[1][i-3] == '.' &&
36               argv[1][i-2] == 'u' &&
37               argv[1][i-1] == 'g' &&
38               argv[1][i]   == 'n')) {
39                 fprintf(stderr, "Not a .ugn file\n");
40                 exit(1);
41         }
42
43         argv[1][i-2] = 'c';
44         argv[1][i-1] = '\0';
45         fc = fopen(argv[1], "w"); /* .c file */
46         argv[1][i-2] = 'h';
47         fh = fopen(argv[1], "w"); /* .h file */
48         argv[1][i-1] = 's';
49         argv[1][i]   = '\0';
50         fhs = fopen(argv[1], "w"); /* .hs file */
51         argv[1][i-1] = '\0';
52
53         if(yyparse() == 0) {
54                 /* No syntax errors. */
55
56                 fprintf(fc, "#include \"%s\"\n", argv[1]);
57                 gentype(root);
58                 exit(0);
59
60         } else {
61                 /* There was a syntax error. */
62 /* ToDo: this stuff is now *WWRROONNGG* (WDP 94/10) */
63                 unlink(argv[1][i]);
64                 argv[i][i] = 'c';
65                 unlink(argv[1][i]);
66                 fprintf(stderr, "Nothing generated.\n");
67                 exit(1);
68         }
69 }
70
71 void
72 gentype(t)
73    tree t;
74 {
75         ge_typdef(t); /* Generate the .h - file. */
76
77         /* Generate the struct definitions. */
78 /*partain:moved         gs_typlist(gtdeflist(t), gtid(t));
79 */
80         /* Generate constructors and selectors. */
81         g_consels(gtdeflist(t), gtid(t));
82
83         fprintf(fh, "#endif\n"); /* for .h multi-slurp protector */
84         
85         /* Generate Haskell reader */
86         gen_hs_reader(gtid(t), gtdeflist(t));
87 }