142807Smsmith#!/usr/bin/awk -f
242807Smsmith#
350477Speter# $FreeBSD$
442807Smsmith#
542807Smsmith# Merge two boot loader help files for FreeBSD 3.0
642807Smsmith# Joe Abley <jabley@patho.gen.nz>
742807Smsmith
842807SmsmithBEGIN \
942807Smsmith{
1042807Smsmith  state = 0;
1186168Sfenner  first = -1;
1242807Smsmith  ind = 0;
1342807Smsmith}
1442807Smsmith
1542807Smsmith# beginning of first command
1642807Smsmith/^###/ && (state == 0) \
1742807Smsmith{
1842807Smsmith  state = 1;
1942807Smsmith  next;
2042807Smsmith}
2142807Smsmith
2242807Smsmith# entry header
2385935Sobrien/^# T[[:graph:]]+ (S[[:graph:]]+ )*D[[:graph:]][[:print:]]*$/ && (state == 1) \
2442807Smsmith{
2585935Sobrien  match($0, " T[[:graph:]]+");
2642807Smsmith  T = substr($0, RSTART + 2, RLENGTH - 2);
2785935Sobrien  match($0, " S[[:graph:]]+");
28162742Sjhb  SSTART = RSTART
2942807Smsmith  S = (RLENGTH == -1) ? "" : substr($0, RSTART + 2, RLENGTH - 2);
3085935Sobrien  match($0, " D[[:graph:]][[:print:]]*$");
3142807Smsmith  D = substr($0, RSTART + 2);
32162742Sjhb  if (SSTART > RSTART)
33162742Sjhb    S = "";
3442807Smsmith
3542807Smsmith  # find a suitable place to store this one...
3642807Smsmith  ind++;
3742807Smsmith  if (ind == 1)
3842807Smsmith  {
3942807Smsmith    first = ind;
4042807Smsmith    help[ind, "T"] = T;
4142807Smsmith    help[ind, "S"] = S;
4242807Smsmith    help[ind, "link"] = -1;
4342807Smsmith  } else {
4442807Smsmith    i = first; j = -1;
4542807Smsmith    while (help[i, "T"] help[i, "S"] < T S)
4642807Smsmith    {
4742807Smsmith      j = i;
4842807Smsmith      i = help[i, "link"];
4942807Smsmith      if (i == -1) break;
5042807Smsmith    }
5142807Smsmith
5242807Smsmith    if (i == -1)
5342807Smsmith    {
5442807Smsmith      help[j, "link"] = ind;
5542807Smsmith      help[ind, "link"] = -1;
5642807Smsmith    } else {
5742807Smsmith      help[ind, "link"] = i;
5842807Smsmith      if (j == -1)
5942807Smsmith        first = ind;
6042807Smsmith      else
6142807Smsmith        help[j, "link"] = ind;
6242807Smsmith    }
6342807Smsmith  }
6442807Smsmith  help[ind, "T"] = T;
6542807Smsmith  help[ind, "S"] = S;
6642807Smsmith  help[ind, "D"] = D;
6742807Smsmith
6842807Smsmith  # set our state
6942807Smsmith  state = 2;
7042807Smsmith  help[ind, "text"] = 0;
7142807Smsmith  next;
7242807Smsmith}
7342807Smsmith
7442807Smsmith# end of last command, beginning of next one
7542807Smsmith/^###/ && (state == 2) \
7642807Smsmith{
7742807Smsmith  state = 1;
7842807Smsmith}
7942807Smsmith
8042807Smsmith(state == 2) \
8142807Smsmith{
8242807Smsmith  sub("[[:blank:]]+$", "");
8342807Smsmith  if (help[ind, "text"] == 0 && $0 ~ /^[[:blank:]]*$/) next;
8442807Smsmith  help[ind, "text", help[ind, "text"]] = $0;
8542807Smsmith  help[ind, "text"]++;
8642807Smsmith  next;
8742807Smsmith}
8842807Smsmith
8942807Smsmith# show them what we have (it's already sorted in help[])
9042807SmsmithEND \
9142807Smsmith{
9242807Smsmith  node = first;
9342807Smsmith  while (node != -1)
9442807Smsmith  {
9542807Smsmith    printf "################################################################################\n";
9642807Smsmith    printf "# T%s ", help[node, "T"];
9742807Smsmith    if (help[node, "S"] != "") printf "S%s ", help[node, "S"];
9842807Smsmith    printf "D%s\n\n", help[node, "D"];
9942807Smsmith    for (i = 0; i < help[node, "text"]; i++)
10042807Smsmith      printf "%s\n", help[node, "text", i];
10142807Smsmith    node = help[node, "link"];
10242807Smsmith  }
10342807Smsmith  printf "################################################################################\n";
10442807Smsmith}
105