Don't use keys on a hashref
[openbsd-goodies.git] / devtree / devtree
1 #!/usr/bin/perl
2
3 # Copyright (C) 2014 Steven McDonald <steven@steven-mcdonald.id.au>
4 #
5 # This program is free software. It comes without any warranty, to the
6 # extent permitted by applicable law. You can redistribute it and/or
7 # modify it under the terms of the Do What The Fuck You Want To Public
8 # License, Version 2, as published by Sam Hocevar. See the COPYING file
9 # or visit http://www.wtfpl.net/ for more details.
10
11 use strict;
12 use warnings;
13
14 sub print_tree;
15
16 my $tree = {};
17 my %name_to_node = (root => $tree);
18 my $show_detached = 0;
19
20 for (@ARGV) {
21         $show_detached = 1 if /^(-d|--show-detached)$/;
22 }
23
24 while (<STDIN>) {
25         if (/^(\w+) at (\w+):?\s(.*?["(<])?([^"()<>\n]+)?/) {
26                 my $node_prettyname;
27                 if ($4) {
28                         $node_prettyname = "$1 ($4)";
29                 } else {
30                         $node_prettyname = $1;
31                 }
32
33                 my $new_node = {};
34                 $name_to_node{$2}{$node_prettyname} = $new_node;
35                 $name_to_node{$1} = $new_node;
36         } elsif (/^(\w+) detached$/ and my $node = $name_to_node{$1}) {
37                 $node->{_is_detached} = 1;
38         }
39 }
40
41 print "root\n";
42 print_tree $tree;
43 exit;
44
45 sub print_tree {
46         my $tree        = shift;
47         my $prev_indent = shift || "";
48         my $indent      = $prev_indent . "  |";
49         my $count       = 0;
50         my @keys        = keys %$tree;
51
52         for (sort @keys) {
53                 my $name = $_;
54                 if (delete $tree->{$_}->{_is_detached}) {
55                         next unless $show_detached;
56                         $name = "$name [DETACHED]";
57                 }
58
59                 print $indent . "-$name\n";
60                 $indent = $prev_indent . "   " if $count eq $#keys;
61                 print_tree $tree->{$_}, $indent;
62                 $count++;
63         }
64 }