comparison 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
comparison
equal deleted inserted replaced
83:88cdef7e6b1b 84:422385f10084
1 /*
2 * This program generates a BOM in CSV format whose content is a subset
3 * of what is generated by ueda-mkbom; it is intended for passing BOM
4 * information to assembly shops who would then import into M$ Excel.
5 */
6
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include <strings.h>
11 #include <unistd.h>
12 #include "../libueda/mcl.h"
13 #include "bomstruct.h"
14
15 extern char *MCLfile;
16 extern char *get_comp_attr(), *get_comp_multiattr();
17
18 int check_completeness, refdes_lists = 1;
19 struct bompart *bomhead;
20
21 do_cmdline_opts(argc, argv)
22 char **argv;
23 {
24 register int c;
25
26 while ((c = getopt(argc, argv, "cM:p:")) != EOF)
27 switch (c) {
28 case 'c':
29 check_completeness++;
30 break;
31 case 'M':
32 MCLfile = optarg;
33 break;
34 case 'p':
35 set_popopt_list(optarg);
36 break;
37 default:
38 /* getopt prints the error message */
39 exit(1);
40 }
41 }
42
43 main(argc, argv)
44 char **argv;
45 {
46 do_cmdline_opts(argc, argv);
47 read_MCL();
48 tally_parts();
49 output();
50 exit(0);
51 }
52
53 output()
54 {
55 register struct component *part;
56 register struct bompart *bp;
57 register char *attr;
58 static char unknownstr[] = "unknown";
59
60 puts("Manufacturer,Part number,Description,Qty,Refdes list");
61
62 for (bp = bomhead; bp; bp = bp->next) {
63 part = bp->part;
64 attr = get_comp_attr(part, "manufacturer");
65 if (attr)
66 emit_csv_string(attr);
67 else
68 emit_csv_string(unknownstr);
69 putchar(',');
70 if (attr = get_comp_attr(part, "manufacturer_part_number"))
71 emit_csv_string(attr);
72 else if (attr = get_comp_attr(part, "device"))
73 emit_csv_string(attr);
74 else
75 emit_csv_string(unknownstr);
76 putchar(',');
77 if (attr = get_comp_attr(part, "description"))
78 emit_csv_string(attr);
79 printf(",%d,", bp->qty);
80 emit_refdes_list(bp->refdeslist);
81 putchar('\n');
82 }
83 }
84
85 emit_csv_string(str)
86 char *str;
87 {
88 char *cp;
89 int c;
90
91 if (!index(str, ',') && !index(str, '"')) {
92 fputs(str, stdout);
93 return;
94 }
95 putchar('"');
96 for (cp = str; c = *cp++; ) {
97 if (c == '"')
98 putchar(c);
99 putchar(c);
100 }
101 putchar('"');
102 }
103
104 emit_refdes_list(le)
105 register struct refdeslist *le;
106 {
107 putchar('"');
108 for (; le; le = le->next) {
109 printf("%s", le->first);
110 if (le->last != le->first)
111 printf("-%s", le->last);
112 if (le->next)
113 putchar(',');
114 }
115 putchar('"');
116 }