FreeCalypso > hg > ueda-linux
comparison pads2gpcb/parttype.c @ 63:455a0051f9d2
pads2gpcb: PARTTYPE parsing implemented, compiles
author | Mychaela Falconia <falcon@ivan.Harhan.ORG> |
---|---|
date | Sun, 31 Jan 2016 07:32:08 +0000 |
parents | |
children | 2b71943a311b |
comparison
equal
deleted
inserted
replaced
62:9d7e2937883d | 63:455a0051f9d2 |
---|---|
1 #include <stdio.h> | |
2 #include <stdlib.h> | |
3 #include <ctype.h> | |
4 #include <string.h> | |
5 #include <strings.h> | |
6 #include "globals.h" | |
7 #include "struct.h" | |
8 | |
9 extern struct part_decal *find_decal_by_name(); | |
10 extern char *savestr(); | |
11 | |
12 static struct part_type *our_parttype; | |
13 static int ngates, nsignals; | |
14 | |
15 static void | |
16 enter_parttype() | |
17 { | |
18 struct part_type *p, **pp; | |
19 char *name = input_line_fields[0]; | |
20 | |
21 for (pp = &part_type_list; p = *pp; pp = &p->next) | |
22 if (!strcmp(p->name, name)) { | |
23 fprintf(stderr, | |
24 "%s line %d: part type name \"%s\" already defined\n", | |
25 input_filename, input_lineno, name); | |
26 exit(1); | |
27 } | |
28 p = malloc(sizeof(struct part_type) + strlen(name) + 1); | |
29 if (!p) { | |
30 perror("malloc of struct part_type"); | |
31 exit(1); | |
32 } | |
33 bzero(p, sizeof(struct part_type)); | |
34 p->name = (char *)(p + 1); | |
35 strcpy(p->name, name); | |
36 *pp = p; | |
37 our_parttype = p; | |
38 } | |
39 | |
40 static void | |
41 find_decals() | |
42 { | |
43 char *cp, *np; | |
44 struct part_decal *decal; | |
45 | |
46 for (cp = input_line_fields[1]; cp; cp = np) { | |
47 np = index(cp, ':'); | |
48 if (np) | |
49 *np++ = '\0'; | |
50 if (!*cp) | |
51 continue; | |
52 decal = find_decal_by_name(cp); | |
53 if (!decal) { | |
54 fprintf(stderr, | |
55 "%s line %d: part type definition refers to unknown decal name \"%s\"\n", | |
56 input_filename, input_lineno, cp); | |
57 exit(1); | |
58 } | |
59 if (our_parttype->ndecals >= MAX_DECALS_PER_PART_TYPE) { | |
60 fprintf(stderr, | |
61 "%s line %d: MAX_DECALS_PER_PART_TYPE exceeded\n", | |
62 input_filename, input_lineno); | |
63 exit(1); | |
64 } | |
65 our_parttype->decals[our_parttype->ndecals++] = decal; | |
66 } | |
67 if (!our_parttype->ndecals) { | |
68 fprintf(stderr, | |
69 "%s line %d: empty list of decals in part type def\n", | |
70 input_filename, input_lineno); | |
71 exit(1); | |
72 } | |
73 } | |
74 | |
75 static void | |
76 process_header_line() | |
77 { | |
78 if (input_line_nfields < 6) { | |
79 fprintf(stderr, | |
80 "%s line %d: expected beginning of part type definition, wrong # of fields\n", | |
81 input_filename, input_lineno); | |
82 exit(1); | |
83 } | |
84 enter_parttype(); | |
85 printf("Processing part type %s\n", our_parttype->name); | |
86 find_decals(); | |
87 ngates = atoi(input_line_fields[3]); | |
88 nsignals = atoi(input_line_fields[4]); | |
89 our_parttype->num_alpha_pins = atoi(input_line_fields[5]); | |
90 } | |
91 | |
92 static void | |
93 get_line_internal() | |
94 { | |
95 if (!get_input_line()) { | |
96 fprintf(stderr, | |
97 "error: EOF in the middle of a part type definition\n"); | |
98 exit(1); | |
99 } | |
100 } | |
101 | |
102 static void | |
103 process_one_gate_def() | |
104 { | |
105 int gatepins; | |
106 | |
107 get_line_internal(); | |
108 parse_input_line_fields(); | |
109 if (input_line_nfields != 3 || strcmp(input_line_fields[0], "G")) { | |
110 fprintf(stderr, "%s line %d: expected gate def header line\n", | |
111 input_filename, input_lineno); | |
112 exit(1); | |
113 } | |
114 gatepins = atoi(input_line_fields[2]); | |
115 while (gatepins > 0) { | |
116 get_line_internal(); | |
117 parse_input_line_fields(); | |
118 gatepins -= input_line_nfields; | |
119 } | |
120 } | |
121 | |
122 static void | |
123 alloc_alpha_pins_array() | |
124 { | |
125 our_parttype->alpha_pins = | |
126 malloc(sizeof(char *) * our_parttype->num_alpha_pins); | |
127 if (!our_parttype->alpha_pins) { | |
128 perror("malloc of alpha_pins array"); | |
129 exit(1); | |
130 } | |
131 } | |
132 | |
133 static void | |
134 read_alpha_pins() | |
135 { | |
136 int idx, i; | |
137 | |
138 for (idx = 0; idx < our_parttype->num_alpha_pins; ) { | |
139 get_line_internal(); | |
140 parse_input_line_fields(); | |
141 for (i = 0; i < input_line_nfields; i++) { | |
142 if (idx >= our_parttype->num_alpha_pins) { | |
143 fprintf(stderr, | |
144 "%s line %d: alpha_pins array overflow\n", | |
145 input_filename, input_lineno); | |
146 exit(1); | |
147 } | |
148 our_parttype->alpha_pins[idx++] = | |
149 savestr(input_line_fields[i]); | |
150 } | |
151 } | |
152 } | |
153 | |
154 static void | |
155 process_one_parttype() | |
156 { | |
157 int i; | |
158 | |
159 process_header_line(); | |
160 for (i = 0; i < ngates; i++) | |
161 process_one_gate_def(); | |
162 for (i = 0; i < nsignals; i++) | |
163 get_line_internal(); | |
164 if (our_parttype->num_alpha_pins) { | |
165 alloc_alpha_pins_array(); | |
166 read_alpha_pins(); | |
167 } | |
168 } | |
169 | |
170 process_parttype_section() | |
171 { | |
172 for (;;) { | |
173 if (!get_input_line()) { | |
174 fprintf(stderr, "error: EOF in PARTTYPE section\n"); | |
175 exit(1); | |
176 } | |
177 if (input_line_buf[0] == '*') { | |
178 parse_starline(); | |
179 if (strcmp(input_line_starkw, "REMARK")) | |
180 break; | |
181 else | |
182 continue; | |
183 } | |
184 parse_input_line_fields(); | |
185 if (input_line_nfields) | |
186 process_one_parttype(); | |
187 } | |
188 } |