mirror of
https://github.com/GnoConsortium/gno.git
synced 2024-11-18 19:09:31 +00:00
ddb82cb2e0
Maybe someday I'll become adept at using cvs...
59 lines
1.9 KiB
Plaintext
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
|
|
}
|