diff ueda/mclutils/shortbom.c @ 0:cd92449fdb51

initial import of ueda and ifctf-part-lib from ifctfvax CVS
author Space Falcon <falcon@ivan.Harhan.ORG>
date Mon, 20 Jul 2015 00:24:37 +0000
parents
children d098f8548b44
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ueda/mclutils/shortbom.c	Mon Jul 20 00:24:37 2015 +0000
@@ -0,0 +1,182 @@
+/*
+ * This program generates a "short" BOM from the MCL.
+ */
+
+#include <stdio.h>
+#include <strings.h>
+#include "../libueda/mcl.h"
+
+extern char *optarg;
+extern char *malloc();
+
+extern char *MCLfile;
+extern struct component components[];
+extern int ncomponents;
+extern char *get_comp_attr();
+extern struct component *find_partdef_by_name();
+
+struct bomline {
+	char	*refdes;
+	char	*manuf;
+	char	*partno;
+	char	*description;
+};
+
+int column_sep_width = 2, tabbed;
+int assembly;
+struct bomline *bombuf;
+int nbomlines;
+char unknownstr[] = "unknown";
+int refdes_col_width, manuf_col_width, partno_col_width;
+
+do_cmdline_opts(argc, argv)
+	char **argv;
+{
+	register int c;
+
+	while ((c = getopt(argc, argv, "aM:p:s:t")) != EOF)
+		switch (c) {
+		case 'a':
+			assembly++;
+			break;
+		case 'M':
+			MCLfile = optarg;
+			break;
+		case 'p':
+			set_popopt_list(optarg);
+			break;
+		case 's':
+			column_sep_width = atoi(optarg);
+			break;
+		case 't':
+			tabbed++;
+			break;
+		default:
+			/* getopt prints the error message */
+			exit(1);
+		}
+}
+
+main(argc, argv)
+	char **argv;
+{
+	do_cmdline_opts(argc, argv);
+	read_MCL();
+	bombuf = (struct bomline *)
+			malloc(sizeof(struct bomline) * (ncomponents+1));
+	if (!bombuf) {
+		perror("malloc");
+		exit(1);
+	}
+	bombuf[0].refdes = "Refdes";
+	bombuf[0].manuf = "Manuf";
+	bombuf[0].partno = "Part #";
+	bombuf[0].description = "Description";
+	construct_bom();
+	if (tabbed)
+		tabbed_output();
+	else {
+		compute_col_widths();
+		output();
+	}
+	exit(0);
+}
+
+construct_bom()
+{
+	int c, i;
+	register struct component *comp, *part;
+	register char *attr;
+
+	for (comp = components, c = 0, i = 1; c < ncomponents; comp++, c++) {
+		if (!check_component_popopt(comp))
+			continue;
+		attr = get_comp_attr(comp, "part");
+		if (attr && !strcmp(attr, "none"))
+			continue;
+		bombuf[i].refdes = comp->name;
+		if (assembly && (attr = get_comp_attr(comp, "socket"))) {
+			part = find_partdef_by_name(attr);
+			if (!part) {
+				fprintf(stderr,
+					"%s: socket part %s not found\n",
+					comp->name, attr);
+				continue;
+			}
+		} else
+			part = comp;
+		attr = get_comp_attr(part, "manufacturer");
+		if (attr)
+			bombuf[i].manuf = attr;
+		else
+			bombuf[i].manuf = unknownstr;
+		if (attr = get_comp_attr(part, "manufacturer_part_number"))
+			bombuf[i].partno = attr;
+		else if (attr = get_comp_attr(part, "device"))
+			bombuf[i].partno = attr;
+		else
+			bombuf[i].partno = unknownstr;
+		bombuf[i].description = get_comp_attr(part, "description");
+		i++;
+	}
+	nbomlines = i;
+}
+
+compute_col_widths()
+{
+	int c;
+	register int i;
+	register struct bomline *line;
+
+	for (line = bombuf, c = 0; c < nbomlines; line++, c++) {
+		i = strlen(line->refdes);
+		if (i > refdes_col_width)
+			refdes_col_width = i;
+		i = strlen(line->manuf);
+		if (i > manuf_col_width)
+			manuf_col_width = i;
+		i = strlen(line->partno);
+		if (i > partno_col_width)
+			partno_col_width = i;
+	}
+}
+
+output()
+{
+	int c;
+	register int i;
+	register struct bomline *line;
+
+	for (line = bombuf, c = 0; c < nbomlines; line++, c++) {
+		fputs(line->refdes, stdout);
+		i = refdes_col_width + column_sep_width - strlen(line->refdes);
+		while (i--)
+			putchar(' ');
+		fputs(line->manuf, stdout);
+		i = manuf_col_width + column_sep_width - strlen(line->manuf);
+		while (i--)
+			putchar(' ');
+		fputs(line->partno, stdout);
+		if (line->description) {
+			i = partno_col_width + column_sep_width -
+				strlen(line->partno);
+			while (i--)
+				putchar(' ');
+			fputs(line->description, stdout);
+		}
+		putchar('\n');
+	}
+}
+
+tabbed_output()
+{
+	int c;
+	register struct bomline *line;
+
+	for (line = bombuf+1, c = 1; c < nbomlines; line++, c++) {
+		printf("%s\t%s\t%s", line->refdes, line->manuf, line->partno);
+		if (line->description)
+			printf("\t%s", line->description);
+		putchar('\n');
+	}
+}