diff options
Diffstat (limited to 'awklib/eg/prog/translate.awk')
-rw-r--r-- | awklib/eg/prog/translate.awk | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/awklib/eg/prog/translate.awk b/awklib/eg/prog/translate.awk new file mode 100644 index 00000000..6e9aa5a5 --- /dev/null +++ b/awklib/eg/prog/translate.awk @@ -0,0 +1,46 @@ +# translate --- do tr like stuff +# Arnold Robbins, arnold@gnu.ai.mit.edu, Public Domain +# August 1989 + +# bugs: does not handle things like: tr A-Z a-z, it has +# to be spelled out. However, if `to' is shorter than `from', +# the last character in `to' is used for the rest of `from'. + +function stranslate(from, to, target, lf, lt, t_ar, i, c) +{ + lf = length(from) + lt = length(to) + for (i = 1; i <= lt; i++) + t_ar[substr(from, i, 1)] = substr(to, i, 1) + if (lt < lf) + for (; i <= lf; i++) + t_ar[substr(from, i, 1)] = substr(to, lt, 1) + for (i = 1; i <= lf; i++) { + c = substr(from, i, 1) + if (index(target, c) > 0) + gsub(c, t_ar[c], target) + } + return target +} + +function translate(from, to) +{ + return $0 = stranslate(from, to, $0) +} + +# main program +BEGIN { + if (ARGC < 3) { + print "usage: translate from to" > "/dev/stderr" + exit + } + FROM = ARGV[1] + TO = ARGV[2] + ARGC = 2 + ARGV[1] = "-" +} + +{ + translate(FROM, TO) + print +} |