diff ueda/mclutils/bomtally.c @ 83:88cdef7e6b1b

BOM tallying code factored out of ueda-mkbom
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 23 Feb 2017 19:27:14 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ueda/mclutils/bomtally.c	Thu Feb 23 19:27:14 2017 +0000
@@ -0,0 +1,111 @@
+/*
+ * This code generates a tallied form of the BOM from the MCL,
+ * to be used for generation of various BOM output formats.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <unistd.h>
+#include "../libueda/mcl.h"
+#include "bomstruct.h"
+
+extern struct component components[];
+extern int ncomponents;
+extern char *get_comp_attr();
+extern struct component *find_partdef_by_name();
+
+extern int check_completeness, refdes_lists;
+extern struct bompart *bomhead;
+
+tally_parts()
+{
+	int c;
+	register struct component *comp;
+	register char *attr;
+	struct component *socket;
+
+	for (comp = components, c = 0; c < ncomponents; comp++, c++) {
+		if (!check_component_popopt(comp))
+			continue;
+		if (comp->partdef == NULL) {
+			attr = get_comp_attr(comp, "part");
+			if (attr && !strcmp(attr, "none"))
+				continue;
+			if (check_completeness)
+				fprintf(stderr, "%s has no part defined\n",
+					comp->name);
+			continue;
+		}
+		add_part_to_bom(comp->partdef, comp->name);
+		attr = get_comp_attr(comp, "socket");
+		if (attr) {
+			socket = find_partdef_by_name(attr);
+			if (socket)
+				add_part_to_bom(socket, comp->name);
+			else
+				fprintf(stderr,
+					"%s: socket part %s not found\n",
+					comp->name, attr);
+		}
+	}
+}
+
+add_part_to_bom(part, refdes)
+	struct component *part;
+	char *refdes;
+{
+	register struct bompart *bp, **bpp;
+
+	for (bpp = &bomhead; bp = *bpp; bpp = &bp->next)
+		if (bp->part == part) {
+			bp->qty++;
+			if (refdes_lists)
+				add_refdes_to_bompart(bp, refdes);
+			return;
+		}
+	/* new part */
+	bp = (struct bompart *) malloc(sizeof(struct bompart));
+	if (bp == NULL) {
+		perror("malloc");
+		exit(1);
+	}
+	bp->part = part;
+	bp->qty = 1;
+	bp->next = NULL;
+	bp->refdeslist = NULL;
+	*bpp = bp;
+	if (refdes_lists)
+		add_refdes_to_bompart(bp, refdes);
+}
+
+add_refdes_to_bompart(bp, refdes)
+	struct bompart *bp;
+	char *refdes;
+{
+	register struct refdeslist *le, **lep;
+
+	if (!bp->refdeslist) {
+		lep = &bp->refdeslist;
+		goto add_new;
+	}
+	for (le = bp->refdeslist; le->next; le = le->next)
+		;
+	if (is_refdes_sequential(le->last, refdes)) {
+		le->last = refdes;
+		return(1);
+	}
+	lep = &le->next;
+add_new:
+	le = (struct refdeslist *) malloc(sizeof(struct refdeslist));
+	if (!le) {
+		perror("malloc");
+		exit(1);
+	}
+	le->first = refdes;
+	le->last = refdes;
+	le->next = NULL;
+	*lep = le;
+	return(0);
+}