freebsd-dev/sys/boot/common/merge_help.awk
Bill Fenner ce20386909 Initialize first to -1; this will create a (nearly) empty file on failure,
instead of looping until the disk is full.  This kind of failure can
especially happen when a version of awk that doesn't support POSIX
character classes is used.

Submitted by:	David Wolfskill <david@catwhisker.org>
2001-11-07 17:53:25 +00:00

102 lines
2.1 KiB
Awk

#!/usr/bin/awk -f
#
# $FreeBSD$
#
# Merge two boot loader help files for FreeBSD 3.0
# Joe Abley <jabley@patho.gen.nz>
BEGIN \
{
state = 0;
first = -1;
ind = 0;
}
# beginning of first command
/^###/ && (state == 0) \
{
state = 1;
next;
}
# entry header
/^# T[[:graph:]]+ (S[[:graph:]]+ )*D[[:graph:]][[:print:]]*$/ && (state == 1) \
{
match($0, " T[[:graph:]]+");
T = substr($0, RSTART + 2, RLENGTH - 2);
match($0, " S[[:graph:]]+");
S = (RLENGTH == -1) ? "" : substr($0, RSTART + 2, RLENGTH - 2);
match($0, " D[[:graph:]][[:print:]]*$");
D = substr($0, RSTART + 2);
# find a suitable place to store this one...
ind++;
if (ind == 1)
{
first = ind;
help[ind, "T"] = T;
help[ind, "S"] = S;
help[ind, "link"] = -1;
} else {
i = first; j = -1;
while (help[i, "T"] help[i, "S"] < T S)
{
j = i;
i = help[i, "link"];
if (i == -1) break;
}
if (i == -1)
{
help[j, "link"] = ind;
help[ind, "link"] = -1;
} else {
help[ind, "link"] = i;
if (j == -1)
first = ind;
else
help[j, "link"] = ind;
}
}
help[ind, "T"] = T;
help[ind, "S"] = S;
help[ind, "D"] = D;
# set our state
state = 2;
help[ind, "text"] = 0;
next;
}
# end of last command, beginning of next one
/^###/ && (state == 2) \
{
state = 1;
}
(state == 2) \
{
sub("[[:blank:]]+$", "");
if (help[ind, "text"] == 0 && $0 ~ /^[[:blank:]]*$/) next;
help[ind, "text", help[ind, "text"]] = $0;
help[ind, "text"]++;
next;
}
# show them what we have (it's already sorted in help[])
END \
{
node = first;
while (node != -1)
{
printf "################################################################################\n";
printf "# T%s ", help[node, "T"];
if (help[node, "S"] != "") printf "S%s ", help[node, "S"];
printf "D%s\n\n", help[node, "D"];
for (i = 0; i < help[node, "text"]; i++)
printf "%s\n", help[node, "text", i];
node = help[node, "link"];
}
printf "################################################################################\n";
}