diff ueda/mclutils/csvbom.c @ 84:422385f10084

ueda-csvbom utility written
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 23 Feb 2017 19:55:51 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ueda/mclutils/csvbom.c	Thu Feb 23 19:55:51 2017 +0000
@@ -0,0 +1,116 @@
+/*
+ * This program generates a BOM in CSV format whose content is a subset
+ * of what is generated by ueda-mkbom; it is intended for passing BOM
+ * information to assembly shops who would then import into M$ Excel.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <unistd.h>
+#include "../libueda/mcl.h"
+#include "bomstruct.h"
+
+extern char *MCLfile;
+extern char *get_comp_attr(), *get_comp_multiattr();
+
+int check_completeness, refdes_lists = 1;
+struct bompart *bomhead;
+
+do_cmdline_opts(argc, argv)
+	char **argv;
+{
+	register int c;
+
+	while ((c = getopt(argc, argv, "cM:p:")) != EOF)
+		switch (c) {
+		case 'c':
+			check_completeness++;
+			break;
+		case 'M':
+			MCLfile = optarg;
+			break;
+		case 'p':
+			set_popopt_list(optarg);
+			break;
+		default:
+			/* getopt prints the error message */
+			exit(1);
+		}
+}
+
+main(argc, argv)
+	char **argv;
+{
+	do_cmdline_opts(argc, argv);
+	read_MCL();
+	tally_parts();
+	output();
+	exit(0);
+}
+
+output()
+{
+	register struct component *part;
+	register struct bompart *bp;
+	register char *attr;
+	static char unknownstr[] = "unknown";
+
+	puts("Manufacturer,Part number,Description,Qty,Refdes list");
+
+	for (bp = bomhead; bp; bp = bp->next) {
+		part = bp->part;
+		attr = get_comp_attr(part, "manufacturer");
+		if (attr)
+			emit_csv_string(attr);
+		else
+			emit_csv_string(unknownstr);
+		putchar(',');
+		if (attr = get_comp_attr(part, "manufacturer_part_number"))
+			emit_csv_string(attr);
+		else if (attr = get_comp_attr(part, "device"))
+			emit_csv_string(attr);
+		else
+			emit_csv_string(unknownstr);
+		putchar(',');
+		if (attr = get_comp_attr(part, "description"))
+			emit_csv_string(attr);
+		printf(",%d,", bp->qty);
+		emit_refdes_list(bp->refdeslist);
+		putchar('\n');
+	}
+}
+
+emit_csv_string(str)
+	char *str;
+{
+	char *cp;
+	int c;
+
+	if (!index(str, ',') && !index(str, '"')) {
+		fputs(str, stdout);
+		return;
+	}
+	putchar('"');
+	for (cp = str; c = *cp++; ) {
+		if (c == '"')
+			putchar(c);
+		putchar(c);
+	}
+	putchar('"');
+}
+
+emit_refdes_list(le)
+	register struct refdeslist *le;
+{
+	putchar('"');
+	for (; le; le = le->next) {
+		printf("%s", le->first);
+		if (le->last != le->first)
+			printf("-%s", le->last);
+		if (le->next)
+			putchar(',');
+	}
+	putchar('"');
+}