+string quoted(string v)
+{
+ if (String::index(v, "\"") >= 0 || String::index(v, ",") >= 0) {
+ if (String::index(v, "\"") >= 0) {
+ string ret = "\"";
+ for (int i = 0; i < String::length(v); i++) {
+ if (v[i] == '"')
+ ret = ret + "\"";
+ ret = ret + String::new(v[i]);
+ }
+ ret = ret + "\"";
+ return ret;
+ } else {
+ return "\"" + v + "\"";
+ }
+ } else {
+ return v;
+ }
+}
+
+void process_seeed(string[string] entry)
+{
+ if (entry["loadstatus"] == "noload")
+ return;
+
+ static bool start = true;
+ if (start) {
+ printf("Part/Designator,Manufacturer Part Number/Seeed SKU, Quantity\n");
+ start = false;
+ }
+
+ string[*] refdes = String::wordsplit(entry["refdes"], " \t");
+ if (dim(refdes) > 1)
+ printf ("\"");
+ for (int i = 0; i < dim(refdes); i++) {
+ printf("%s", refdes[i]);
+ if (i < dim(refdes) - 1)
+ printf (",");
+ }
+ if (dim(refdes) > 1)
+ printf ("\"");
+ printf(",%s,%s\n", quoted(entry["mfg_part_number"]), entry["quantity"]);
+}
+
+void process_goldphoenix(string[string] entry)
+{
+ int units = 1000;
+
+ if (entry["loadstatus"] == "noload")
+ return;
+
+ static int item = 1;
+ static bool start = true;
+ if (start) {
+ printf("#Item,Description,Designator,Package,Manufacturer,Manufacturer Part Number#,Supplier,Supplier Part #,QTY/BOARD,Order QTY,Unit Price, Subtotal \n");
+ start = false;
+ }
+
+ string[*] refdes = String::wordsplit(entry["refdes"], " \t");
+ printf("%d,", item);
+
+ /* description */
+ printf("%s %s,",
+ quoted(entry["device"]),
+ quoted(entry["value"]));
+
+ /* designators */
+ if (dim(refdes) > 1)
+ printf ("\"");
+ for (int i = 0; i < dim(refdes); i++) {
+ printf("%s", refdes[i]);
+ if (i < dim(refdes) - 1)
+ printf (",");
+ }
+ if (dim(refdes) > 1)
+ printf ("\"");
+
+ /* rest */
+ printf(",%s,%s,%s,%s,%s,%s,%d\n",
+ quoted(entry["footprint"]),
+ quoted(entry["mfg"]),
+ quoted(entry["mfg_part_number"]),
+ quoted(entry["vendor"]),
+ quoted(entry["vendor_part_number"]),
+ entry["quantity"],
+ dim(refdes) * units);
+ item++;
+}
+