FreeCalypso > hg > ueda-linux
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('"'); +}