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