URI: 
       tree - plstree - ps and ls displayed as a tree
  HTML git clone git://bitreich.org/plstree git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/plstree
   DIR Log
   DIR Files
   DIR Refs
   DIR Tags
   DIR README
       ---
       tree (1764B)
       ---
            1 #!/usr/bin/awk -f
            2 
            3 # convert a list of paths into a tree
            4 
            5 BEGIN {
            6         LINE = "|  ";
            7         NODE = "|- ";
            8         TAIL = "`- ";
            9         VOID = "   ";
           10 
           11         num = list(entries);
           12         tree(entries, num);
           13         display(entries, num);
           14 }
           15 
           16 # Get a recursive list of all entries into entries[] with entries[i:j]
           17 # holding the component j of the path i, and 0 has all the -l details,
           18 # then return the number of entries in entries[].
           19 #
           20 #        [ 1:[ 1:"etc" ],
           21 #          2:[ 1:"etc", 2:"sv" ],
           22 #          3:[ 1:"etc", 2:"tor" ] ]
           23 #
           24 # Only the leaves are present, the intermediates components are LINE or
           25 # NODE if just before a leave
           26 #
           27 #        [ 1:[ 1:LINE, 2:LINE, 3:LINE, 4:LINE, 5:NODE, 6:"filename" ],
           28 #          2:[ 1:LINE, 2:LINE, 3:LINE, 4:NODE, 5:"filename" ] ]
           29 
           30 function list(entries)
           31 {
           32         for (num = 0; getline; num++) {
           33                 sub("^/", "", $0);
           34                 sub("/$", "", $0);
           35                 count = split($0, nodelist, "/");
           36                 for (i = 1; i < count; i++)
           37                         entries[num":"i] = LINE;
           38                 entries[num":"count] = NODE;
           39                 entries[num"name"] = nodelist[count];
           40         }
           41 
           42         return num - 1;
           43 }
           44 
           45 # Transform entries into a tree by replacing some LINE by VOID when needed.
           46 # The tree is walked from the bottom to the top, and column by column
           47 # toward the right until an empty column is met which stops the algorithm.
           48 
           49 function tree(entries, num)
           50 {
           51         for (i = 1; !stop; i++) {
           52                 stop = tail = 1;
           53                 for (l = num; l > 0; l--) {
           54                         if (entries[l":"i] == LINE && tail) {
           55                                 entries[l":"i] = VOID;
           56                                 stop = 0;
           57                         } else if (entries[l":"i] == NODE && tail) {
           58                                 entries[l":"i] = TAIL;
           59                                 tail = stop = 0;
           60                         } else if (!entries[l":"i]) {
           61                                 tail = 1;
           62                         }
           63                 }
           64         }
           65 }
           66 
           67 # Print all entries line by line.
           68 
           69 function display(entries, num)
           70 {
           71         for (l = 1; l <= num; l++) {
           72                 for (i = 1; entries[l":"i] != ""; i++)
           73                         printf("%s", entries[l":"i]);
           74                 printf("%s\n", entries[l"name"]);
           75         }
           76 }