3 # Convert CSV parts list into vendor import format
5 # Copyright © 2015 Keith Packard <keithp@keithp.com>, GPL v3+
11 string[*] not_vendors;
12 string not_vendor_list;
19 void fatal(string format, poly args ...)
21 File::fprintf(stderr, format, args...);
25 string[*] read_line(file f) {
27 string line = fgets(f);
29 return String::parse_csv(line);
34 string[*] required_elements = {
43 bool has_header_member(string member) {
44 for (int i = 0; i < dim(header); i++)
45 if (header[i] == member)
50 bool has_vendor(string[*] vendors, string vendor) {
51 for (int i = 0; i < dim(vendors); i++)
52 if (vendors[i] == vendor)
57 void read_header(file f) {
58 header = read_line(f);
60 for (int i = 0; i < dim(required_elements); i++)
61 if (!has_header_member(required_elements[i]))
62 fatal("Missing header element \"%s\"\n", required_elements[i]);
65 string[string] read_entry(file f) {
66 string[*] elements = read_line(f);
67 string[string] entry = {};
69 if (dim(header) != dim(elements))
70 fatal("line %d: has %d instead of %d elements (%V)\n",
71 lineno, dim(elements), dim(header), elements);
73 for (int i = 0; i < dim(header); i++) {
74 if (elements[i] == "")
75 elements[i] = "unknown";
76 entry[header[i]] = elements[i];
81 string part_number(string[string] entry)
84 return entry["mfg_part_number"];
86 return entry["vendor_part_number"];
89 void process_digikey(string[string] entry)
91 printf("%s,%s,%s %s\n",
98 void process_other(string[string] entry) {
99 printf("%s,%s,%s,%s %s\n",
107 void process_file(file f) {
109 while (!File::end(f)) {
110 string[string] entry = read_entry(f);
111 string vendor = entry["vendor"];
112 if ((!is_uninit(&vendors) && has_vendor(vendors, vendor)) ||
113 (!is_uninit(¬_vendors) && !has_vendor(not_vendors, vendor))) {
114 switch (entry["vendor"]) {
116 process_digikey(entry);
119 process_other(entry);
126 ParseArgs::argdesc argd = {
128 { .var = { .arg_flag = &mfg_part },
131 .desc = "Display manufacturer part number"},
132 { .var = { .arg_string = &vendor_list },
135 .expr_name = "vendors",
136 .desc = "Vendors to match"},
137 { .var = { .arg_string = ¬_vendor_list },
139 .name = "not-vendor",
140 .expr_name = "not-vendor",
141 .desc = "Vendors to exclude"},
147 ParseArgs::parseargs(&argd, &argv);
148 if (!is_uninit(&vendor_list))
149 vendors = String::parse_csv(vendor_list);
151 if (!is_uninit(¬_vendor_list))
152 not_vendors = String::parse_csv(not_vendor_list);
154 if (!is_uninit(&argi)) {
155 for (int i = argi; i < dim(argv); i++)
156 twixt(file f = File::open(argv[i], "r"); File::close(f))