diff pads2gpcb/partinst.c @ 65:2b71943a311b

pads2gpcb: PART section parsing implemented, compiles
author Mychaela Falconia <falcon@ivan.Harhan.ORG>
date Sun, 31 Jan 2016 21:32:08 +0000
parents
children 68900e8dcda1
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pads2gpcb/partinst.c	Sun Jan 31 21:32:08 2016 +0000
@@ -0,0 +1,164 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+#include <strings.h>
+#include "globals.h"
+#include "struct.h"
+
+extern struct part_type *find_parttype_by_name();
+extern struct part_decal *find_decal_by_name();
+extern long convert_input_dim();
+
+static struct part_instance *our_part;
+
+static void
+enter_part_inst()
+{
+	struct part_instance *p, **pp;
+	char *name = input_line_fields[0];
+
+	for (pp = &part_inst_list; p = *pp; pp = &p->next)
+		if (!strcmp(p->name, name)) {
+			fprintf(stderr,
+			"%s line %d: part instance \"%s\" already defined\n",
+				input_filename, input_lineno, name);
+			exit(1);
+		}
+	p = malloc(sizeof(struct part_instance) + strlen(name) + 1);
+	if (!p) {
+		perror("malloc of struct part_instance");
+		exit(1);
+	}
+	bzero(p, sizeof(struct part_instance));
+	p->name = (char *)(p + 1);
+	strcpy(p->name, name);
+	*pp = p;
+	our_part = p;
+}
+
+static void
+select_decal_by_name(decalname)
+	char *decalname;
+{
+	our_part->decal = find_decal_by_name(decalname);
+	if (!our_part->decal) {
+		fprintf(stderr,
+	"%s line %d: part instantiation refers to unknown decal name \"%s\"\n",
+			input_filename, input_lineno, decalname);
+		exit(1);
+	}
+}
+
+static void
+select_decal_by_number()
+{
+	char *strnum = input_line_fields[7];
+	int num = atoi(strnum);
+
+	if (num < 0 || num >= our_part->type->ndecals) {
+		fprintf(stderr,
+		"%s line %d: invalid decal number \"%s\" in PART line\n",
+			input_filename, input_lineno, strnum);
+		exit(1);
+	}
+	our_part->decal = our_part->type->decals[num];
+}
+
+static void
+find_type_and_decal()
+{
+	char *typename = input_line_fields[1];
+	char *decalname;
+
+	decalname = index(typename, '@');
+	if (decalname)
+		*decalname++;
+	our_part->type = find_parttype_by_name(typename);
+	if (!our_part->type) {
+		fprintf(stderr,
+	"%s line %d: part instantiation refers to unknown part type \"%s\"\n",
+			input_filename, input_lineno, typename);
+		exit(1);
+	}
+	if (decalname)
+		select_decal_by_name(decalname);
+	else
+		select_decal_by_number();
+}
+
+static void
+one_attr_label()
+{
+	int i;
+
+	/* just skip it for now */
+	for (i = 0; i < 3; i++) {
+		if (!get_input_line()) {
+			fprintf(stderr,
+			"error: EOF when expecting a part label line\n");
+			exit(1);
+		}
+	}
+}
+
+static void
+read_one_part()
+{
+	int num_attr_labels, i;
+
+	if (input_line_nfields < 8 || input_line_nfields > 12) {
+		fprintf(stderr,
+	"%s line %d: expected beginning of part instance, wrong # of fields\n",
+			input_filename, input_lineno);
+		exit(1);
+	}
+	enter_part_inst();
+	printf("Processing part instance %s\n", our_part->name);
+	find_type_and_decal();
+	our_part->mark_x = convert_input_dim(input_line_fields[2]);
+	our_part->mark_y = -convert_input_dim(input_line_fields[3]);
+	our_part->ori = parse_input_angle_90s(input_line_fields[4]);
+	if (!strcmp(input_line_fields[6], "N"))
+		our_part->onbottom = 0;
+	else if (!strcmp(input_line_fields[6], "M"))
+		our_part->onbottom = 1;
+	else {
+		fprintf(stderr, "%s line %d: expected 'N' or 'M' in field 6\n",
+			input_filename, input_lineno);
+		exit(1);
+	}
+	if (input_line_nfields > 11)
+		num_attr_labels = atoi(input_line_fields[11]);
+	else
+		num_attr_labels = 0;
+	for (i = 0; i < num_attr_labels; i++)
+		one_attr_label();
+}
+
+static void
+process_one_part()
+{
+	read_one_part();
+}
+
+process_part_section()
+{
+	input_units_current = input_units_global;
+	for (;;) {
+		if (!get_input_line()) {
+			fprintf(stderr, "error: EOF in PART 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_part();
+	}
+}