summaryrefslogtreecommitdiffstats
path: root/contrib/awk/awklib/eg/prog/translate.awk
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/awk/awklib/eg/prog/translate.awk')
-rw-r--r--contrib/awk/awklib/eg/prog/translate.awk46
1 files changed, 46 insertions, 0 deletions
diff --git a/contrib/awk/awklib/eg/prog/translate.awk b/contrib/awk/awklib/eg/prog/translate.awk
new file mode 100644
index 0000000..97c4ada
--- /dev/null
+++ b/contrib/awk/awklib/eg/prog/translate.awk
@@ -0,0 +1,46 @@
+# translate --- do tr like stuff
+# Arnold Robbins, arnold@gnu.org, 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
+}
OpenPOWER on IntegriCloud