summaryrefslogtreecommitdiffstats
path: root/scripts/convert-devices.uc
blob: 44b2192e3d43961d1b6d38a2900bf5dc51465ad1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!/usr/bin/env ucode
'use strict';
import { readfile, basename } from "fs";
let uht = require("uht");

let signatures = {};

function parse_category(str) {
	let items = split(str, "|");
	let data = {};
	for (let item in items) {
		item = split(item, "=", 2);
		if (item[1] == "%")
			data["%val"] = item[0];
		else
			data[item[0]] = item[1];
	}

	return data;
}

function get_device(meta, name)
{
	let dev = {};

	dev[meta["%val"] ?? "device"] = name;
	for (let type in meta) {
		if (substr(type, 0, 1) == "%")
			continue;

		dev[type] = meta[type];
	}

	return dev;
}

let out = shift(ARGV);
if (!out) {
	warn(`Syntax: ${basename(sourcepath())} <output> <jsonfile> [<jsonfile> ...]\n`);
	exit(1);
}

for (let file in ARGV) {
	let data = json(readfile(file));
	for (let category_str in data) {
		let category = parse_category(category_str);
		let devices = data[category_str];
		for (let dev in devices) {
			for (let sig in devices[dev]) {
				signatures[sig] ??= [];
				push(signatures[sig], get_device(category, dev));
			}
		}
	}
}

uht.mark_hashtable(signatures);
uht.save(out, signatures);