5c86756d5c
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>
102 lines
2.1 KiB
Awk
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";
|
|
}
|