Home | History | Annotate | Line # | Download | only in common
merge_help.awk revision 1.1
      1 #!/usr/bin/awk -f
      2 #
      3 # $FreeBSD$
      4 #
      5 # Merge two boot loader help files for FreeBSD 3.0
      6 # Joe Abley <jabley (at] patho.gen.nz>
      7 
      8 BEGIN \
      9 {
     10   state = 0;
     11   first = -1;
     12   ind = 0;
     13 }
     14 
     15 # beginning of first command
     16 /^###/ && (state == 0) \
     17 {
     18   state = 1;
     19   next;
     20 }
     21 
     22 # entry header
     23 /^# T[[:graph:]]+ (S[[:graph:]]+ )*D[[:graph:]][[:print:]]*$/ && (state == 1) \
     24 {
     25   match($0, " T[[:graph:]]+");
     26   T = substr($0, RSTART + 2, RLENGTH - 2);
     27   match($0, " S[[:graph:]]+");
     28   S = (RLENGTH == -1) ? "" : substr($0, RSTART + 2, RLENGTH - 2);
     29   match($0, " D[[:graph:]][[:print:]]*$");
     30   D = substr($0, RSTART + 2);
     31 
     32   # find a suitable place to store this one...
     33   ind++;
     34   if (ind == 1)
     35   {
     36     first = ind;
     37     help[ind, "T"] = T;
     38     help[ind, "S"] = S;
     39     help[ind, "link"] = -1;
     40   } else {
     41     i = first; j = -1;
     42     while (help[i, "T"] help[i, "S"] < T S)
     43     {
     44       j = i;
     45       i = help[i, "link"];
     46       if (i == -1) break;
     47     }
     48 
     49     if (i == -1)
     50     {
     51       help[j, "link"] = ind;
     52       help[ind, "link"] = -1;
     53     } else {
     54       help[ind, "link"] = i;
     55       if (j == -1)
     56         first = ind;
     57       else
     58         help[j, "link"] = ind;
     59     }
     60   }
     61   help[ind, "T"] = T;
     62   help[ind, "S"] = S;
     63   help[ind, "D"] = D;
     64 
     65   # set our state
     66   state = 2;
     67   help[ind, "text"] = 0;
     68   next;
     69 }
     70 
     71 # end of last command, beginning of next one
     72 /^###/ && (state == 2) \
     73 {
     74   state = 1;
     75 }
     76 
     77 (state == 2) \
     78 {
     79   sub("[[:blank:]]+$", "");
     80   if (help[ind, "text"] == 0 && $0 ~ /^[[:blank:]]*$/) next;
     81   help[ind, "text", help[ind, "text"]] = $0;
     82   help[ind, "text"]++;
     83   next;
     84 }
     85 
     86 # show them what we have (it's already sorted in help[])
     87 END \
     88 {
     89   node = first;
     90   while (node != -1)
     91   {
     92     printf "################################################################################\n";
     93     printf "# T%s ", help[node, "T"];
     94     if (help[node, "S"] != "") printf "S%s ", help[node, "S"];
     95     printf "D%s\n\n", help[node, "D"];
     96     for (i = 0; i < help[node, "text"]; i++)
     97       printf "%s\n", help[node, "text", i];
     98     node = help[node, "link"];
     99   }
    100   printf "################################################################################\n";
    101 }
    102