gno/usr.bin/awk/tests/sortgen
tribby ddb82cb2e0 Remaining files for awk 2.0 that were left out of the previous checkin.
Maybe someday I'll become adept at using cvs...
1998-04-07 17:06:53 +00:00

59 lines
1.9 KiB
Plaintext

# sortgen - generate sort command
# input: sequence of lines describing sorting options
# output: Unix sort command with appropriate arguments
BEGIN { key = 0 }
/no |not |n't / { print "error: can't do negatives:", $0; ok = 1 }
# rules for global options
{ ok = 0 }
/uniq|discard.*(iden|dupl)/ { uniq = " -u"; ok = 1 }
/separ.*tab|tab.*sep/ { sep = "t'\t'"; ok = 1 }
/separ/ { for (i = 1; i <= NF; i++)
if (length($i) == 1)
sep = "t'" $i "'"
ok = 1
}
/key/ { key++; dokey(); ok = 1 } # new key; must come in order
# rules for each key
/dict/ { dict[key] = "d"; ok = 1 }
/ignore.*(space|blank)/ { blank[key] = "b"; ok = 1 }
/fold|case/ { fold[key] = "f"; ok = 1 }
/num/ { num[key] = "n"; ok = 1 }
/rev|descend|decreas|down|oppos/ { rev[key] = "r"; ok = 1 }
/forward|ascend|increas|up|alpha/ { next } # this is sort's default
!ok { print "error: can't understand:", $0 }
END { # print flags for each key
cmd = "sort" uniq
flag = dict[0] blank[0] fold[0] rev[0] num[0] sep
if (flag) cmd = cmd " -" flag
for (i = 1; i <= key; i++)
if (pos[i] != "") {
flag = pos[i] dict[i] blank[i] fold[i] rev[i] num[i]
if (flag) cmd = cmd " +" flag
if (pos2[i]) cmd = cmd " -" pos2[i]
}
print cmd
}
function dokey( i) { # determine position of key
for (i = 1; i <= NF; i++)
if ($i ~ /^[0-9]+$/) {
pos[key] = $i - 1 # sort uses 0-origin
break
}
for (i++; i <= NF; i++)
if ($i ~ /^[0-9]+$/) {
pos2[key] = $i
break
}
if (pos[key] == "")
printf("error: invalid key specification: %s\n", $0)
if (pos2[key] == "")
pos2[key] = pos[key] + 1
}