xref: /aosp_15_r20/external/pciutils/maint/gen-zone (revision c2e0c6b56a71da9abe8df5c8348fb3eb5c2c9251)
1*c2e0c6b5SAndroid Build Coastguard Worker#!/usr/bin/perl -w
2*c2e0c6b5SAndroid Build Coastguard Worker# Create a DNS zone with PCI ID records
3*c2e0c6b5SAndroid Build Coastguard Worker
4*c2e0c6b5SAndroid Build Coastguard Workeruse strict;
5*c2e0c6b5SAndroid Build Coastguard Worker
6*c2e0c6b5SAndroid Build Coastguard Workermy %ids = ();
7*c2e0c6b5SAndroid Build Coastguard Workermy %comments = ();
8*c2e0c6b5SAndroid Build Coastguard Workerforeach our $file (@ARGV) {
9*c2e0c6b5SAndroid Build Coastguard Worker	my $fn = ($file =~ /\.gz$/) ? "zcat $file |" : ($file =~ /\.bz2$/) ? "bzcat $file |" : $file;
10*c2e0c6b5SAndroid Build Coastguard Worker	open F, $fn or die "Unable to open $file: $!";
11*c2e0c6b5SAndroid Build Coastguard Worker	my @id = ();
12*c2e0c6b5SAndroid Build Coastguard Worker	my $comm = "";
13*c2e0c6b5SAndroid Build Coastguard Worker	sub err($) {
14*c2e0c6b5SAndroid Build Coastguard Worker		print STDERR "Error in $file, line $.: @_\n";
15*c2e0c6b5SAndroid Build Coastguard Worker		exit 1;
16*c2e0c6b5SAndroid Build Coastguard Worker	}
17*c2e0c6b5SAndroid Build Coastguard Worker	while (<F>) {
18*c2e0c6b5SAndroid Build Coastguard Worker		if (/^(#.*)/) {
19*c2e0c6b5SAndroid Build Coastguard Worker			$comm .= $_;
20*c2e0c6b5SAndroid Build Coastguard Worker			next;
21*c2e0c6b5SAndroid Build Coastguard Worker		}
22*c2e0c6b5SAndroid Build Coastguard Worker		chomp;
23*c2e0c6b5SAndroid Build Coastguard Worker		if (my ($indent, $id, $ignored, $name) = /^(\t*)(([0-9a-fA-Z]+ ?)*)((  |\t|$)\s*(.*))$/) {
24*c2e0c6b5SAndroid Build Coastguard Worker			my $depth = length $indent;
25*c2e0c6b5SAndroid Build Coastguard Worker			$depth <= @id or err "Mismatched indentation";
26*c2e0c6b5SAndroid Build Coastguard Worker			@id = (@id[0..$depth-1], $id);
27*c2e0c6b5SAndroid Build Coastguard Worker			my $i = join(":", @id);
28*c2e0c6b5SAndroid Build Coastguard Worker			if ($i ne "") {
29*c2e0c6b5SAndroid Build Coastguard Worker				!exists $ids{$i} or die "ID $i defined twice";
30*c2e0c6b5SAndroid Build Coastguard Worker				$ids{$i} = $name;
31*c2e0c6b5SAndroid Build Coastguard Worker				$comments{$i} = $comm if $comm;
32*c2e0c6b5SAndroid Build Coastguard Worker			}
33*c2e0c6b5SAndroid Build Coastguard Worker		} elsif (!/^$/) {
34*c2e0c6b5SAndroid Build Coastguard Worker			err "Parse error";
35*c2e0c6b5SAndroid Build Coastguard Worker		}
36*c2e0c6b5SAndroid Build Coastguard Worker		$comm = "";
37*c2e0c6b5SAndroid Build Coastguard Worker	}
38*c2e0c6b5SAndroid Build Coastguard Worker	close F;
39*c2e0c6b5SAndroid Build Coastguard Worker}
40*c2e0c6b5SAndroid Build Coastguard Worker
41*c2e0c6b5SAndroid Build Coastguard Workersub esc($) {
42*c2e0c6b5SAndroid Build Coastguard Worker	my ($x) = @_;
43*c2e0c6b5SAndroid Build Coastguard Worker	$x =~ s/^\s+//;
44*c2e0c6b5SAndroid Build Coastguard Worker	$x =~ s/"/\\"/g;
45*c2e0c6b5SAndroid Build Coastguard Worker	return $x;
46*c2e0c6b5SAndroid Build Coastguard Worker}
47*c2e0c6b5SAndroid Build Coastguard Worker
48*c2e0c6b5SAndroid Build Coastguard Workerforeach my $i (keys %ids) {
49*c2e0c6b5SAndroid Build Coastguard Worker	my $j = join(".", reverse split(/[: ]/, $i));
50*c2e0c6b5SAndroid Build Coastguard Worker	print "$j.pci\tTXT \"i=", esc($ids{$i}), "\"\n";
51*c2e0c6b5SAndroid Build Coastguard Worker	# print "$j.pci\tTXT \"c=", esc($comments{$i}), "\"\n"
52*c2e0c6b5SAndroid Build Coastguard Worker}
53