diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pads2gpcb/parttype.c	Sun Jan 31 07:32:08 2016 +0000
@@ -0,0 +1,188 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+#include <strings.h>
+#include "globals.h"
+#include "struct.h"
+
+extern struct part_decal *find_decal_by_name();
+extern char *savestr();
+
+static struct part_type *our_parttype;
+static int ngates, nsignals;
+
+static void
+enter_parttype()
+{
+	struct part_type *p, **pp;
+	char *name = input_line_fields[0];
+
+	for (pp = &part_type_list; p = *pp; pp = &p->next)
+		if (!strcmp(p->name, name)) {
+			fprintf(stderr,
+			"%s line %d: part type name \"%s\" already defined\n",
+				input_filename, input_lineno, name);
+			exit(1);
+		}
+	p = malloc(sizeof(struct part_type) + strlen(name) + 1);
+	if (!p) {
+		perror("malloc of struct part_type");
+		exit(1);
+	}
+	bzero(p, sizeof(struct part_type));
+	p->name = (char *)(p + 1);
+	strcpy(p->name, name);
+	*pp = p;
+	our_parttype = p;
+}
+
+static void
+find_decals()
+{
+	char *cp, *np;
+	struct part_decal *decal;
+
+	for (cp = input_line_fields[1]; cp; cp = np) {
+		np = index(cp, ':');
+		if (np)
+			*np++ = '\0';
+		if (!*cp)
+			continue;
+		decal = find_decal_by_name(cp);
+		if (!decal) {
+			fprintf(stderr,
+"%s line %d: part type definition refers to unknown decal name \"%s\"\n",
+				input_filename, input_lineno, cp);
+			exit(1);
+		}
+		if (our_parttype->ndecals >= MAX_DECALS_PER_PART_TYPE) {
+			fprintf(stderr,
+			"%s line %d: MAX_DECALS_PER_PART_TYPE exceeded\n",
+				input_filename, input_lineno);
+			exit(1);
+		}
+		our_parttype->decals[our_parttype->ndecals++] = decal;
+	}
+	if (!our_parttype->ndecals) {
+		fprintf(stderr,
+			"%s line %d: empty list of decals in part type def\n",
+			input_filename, input_lineno);
+		exit(1);
+	}
+}
+
+static void
+process_header_line()
+{
+	if (input_line_nfields < 6) {
+		fprintf(stderr,
+"%s line %d: expected beginning of part type definition, wrong # of fields\n",
+			input_filename, input_lineno);
+		exit(1);
+	}
+	enter_parttype();
+	printf("Processing part type %s\n", our_parttype->name);
+	find_decals();
+	ngates = atoi(input_line_fields[3]);
+	nsignals = atoi(input_line_fields[4]);
+	our_parttype->num_alpha_pins = atoi(input_line_fields[5]);
+}
+
+static void
+get_line_internal()
+{
+	if (!get_input_line()) {
+		fprintf(stderr,
+		      "error: EOF in the middle of a part type definition\n");
+		exit(1);
+	}
+}
+
+static void
+process_one_gate_def()
+{
+	int gatepins;
+
+	get_line_internal();
+	parse_input_line_fields();
+	if (input_line_nfields != 3 || strcmp(input_line_fields[0], "G")) {
+		fprintf(stderr, "%s line %d: expected gate def header line\n",
+			input_filename, input_lineno);
+		exit(1);
+	}
+	gatepins = atoi(input_line_fields[2]);
+	while (gatepins > 0) {
+		get_line_internal();
+		parse_input_line_fields();
+		gatepins -= input_line_nfields;
+	}
+}
+
+static void
+alloc_alpha_pins_array()
+{
+	our_parttype->alpha_pins =
+			malloc(sizeof(char *) * our_parttype->num_alpha_pins);
+	if (!our_parttype->alpha_pins) {
+		perror("malloc of alpha_pins array");
+		exit(1);
+	}
+}
+
+static void
+read_alpha_pins()
+{
+	int idx, i;
+
+	for (idx = 0; idx < our_parttype->num_alpha_pins; ) {
+		get_line_internal();
+		parse_input_line_fields();
+		for (i = 0; i < input_line_nfields; i++) {
+			if (idx >= our_parttype->num_alpha_pins) {
+				fprintf(stderr,
+				"%s line %d: alpha_pins array overflow\n",
+					input_filename, input_lineno);
+				exit(1);
+			}
+			our_parttype->alpha_pins[idx++] =
+						savestr(input_line_fields[i]);
+		}
+	}
+}
+
+static void
+process_one_parttype()
+{
+	int i;
+
+	process_header_line();
+	for (i = 0; i < ngates; i++)
+		process_one_gate_def();
+	for (i = 0; i < nsignals; i++)
+		get_line_internal();
+	if (our_parttype->num_alpha_pins) {
+		alloc_alpha_pins_array();
+		read_alpha_pins();
+	}
+}
+
+process_parttype_section()
+{
+	for (;;) {
+		if (!get_input_line()) {
+			fprintf(stderr, "error: EOF in PARTTYPE section\n");
+			exit(1);
+		}
+		if (input_line_buf[0] == '*') {
+			parse_starline();
+			if (strcmp(input_line_starkw, "REMARK"))
+				break;
+			else
+				continue;
+		}
+		parse_input_line_fields();
+		if (input_line_nfields)
+			process_one_parttype();
+	}
+}