More readability cleanups.
[rmac] / 68kgen.c
1 //
2 // RMAC - Reboot's Macro Assembler for the Atari Jaguar Console System
3 // 68KGEN.C - Tool to Generate 68000 Opcode Table
4 // Copyright (C) 199x Landon Dyer, 2011 Reboot and Friends
5 // RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986
6 // Source Utilised with the Kind Permission of Landon Dyer
7 //
8
9 #include <stdio.h>
10 #include <ctype.h>
11 #include <stdlib.h>
12
13 #define EOS     '\0'
14
15 int kwnum = 1;                  /* current op# for kwgen output */
16
17 FILE * kfp;                     /* keyword file */
18
19 int lineno = 0;
20
21 void error(char *, char *);
22 void procln(int, char **);
23
24 int main(int argc, char ** argv)
25 {
26         char * namv[256];
27         char * s;
28         int namcnt;
29         char ln[256];
30
31         if ((argc == 2) && ((kfp = fopen(argv[1], "w")) == NULL))
32                 error("Cannot create: %s", argv[1]);
33
34         while (fgets(ln, 256, stdin) != NULL)
35         {
36                 ++lineno;                       /* bump line# */
37
38                 if (*ln == '#')         /* ignore comments */
39                         continue;
40
41                 /*
42                  *  Tokenize line (like the way "argc, argv" works)
43                  *  and pass it to the parser.
44                  */
45                 namcnt = 0;
46                 s = ln;
47
48                 while (*s)
49                 {
50                         if (isspace(*s))
51                                 ++s;
52                         else
53                         {
54                                 namv[namcnt++] = s;
55
56                                 while (*s && !isspace(*s))
57                                         ++s;
58
59                                 if (isspace(*s))
60                                         *s++ = EOS;
61                         }
62                 }
63
64                 if (namcnt)
65                         procln(namcnt, namv);
66         }
67
68         return 0;
69 }
70
71
72 /*
73  *  Parse line
74  */
75 void procln(int namc, char ** namv)
76 {
77         int i, j;
78         char * s;
79
80         if (namc == 1)          /* alias for previous entry */
81         {
82                 fprintf(kfp, "%s\t%d\n", namv[0], kwnum-1+1000);
83                 return;
84         }
85
86         if (namc < 5)
87         {
88                 fprintf(stderr, "%d: missing fields\n", lineno);
89                 exit(1);
90         }
91
92         if (*namv[0] != '-')            /* output keyword name */
93                 fprintf(kfp, "%s\t%d\n", namv[0], kwnum + 1000);
94
95         printf("/*%4d %-6s*/  {", kwnum, namv[0]);
96
97         if (*namv[1] == '!')
98                 printf("CGSPECIAL");
99         else for (s = namv[1], i=0; *s; ++s)
100                 printf("%sSIZ%c", (i++ ? "|" : ""), *s);
101
102         printf(", %s, %s, ", namv[2], namv[3]);
103
104         if (*namv[4] == '%')            /* enforce little fascist percent signs */
105         {
106                 for(i=1, j=0; i<17; ++i)
107                 {
108                         j <<= 1;
109
110                         if (namv[4][i] == '1' || isupper(namv[4][i]))
111                                 ++j;
112                 }
113
114                 printf("0x%04x, ", j);
115         }
116         else
117                 printf("%s, ", namv[4]);
118
119         if (namc == 7 && *namv[6] == '+')
120                 printf("%d, ", kwnum+1);
121         else
122                 printf("0, ");
123
124         printf("%s},\n", namv[5]);
125
126         ++kwnum;
127 }
128
129
130 void error(char * s, char * s1)
131 {
132         fprintf(stderr, s, s1);
133         fprintf(stderr, "\n");
134         exit(1);
135 }