This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[UTIL] Perl system does not default to $_
[metaconfig.git] / dist / U / Tr.U
1 ?RCS: $Id$
2 ?RCS:
3 ?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi
4 ?RCS: 
5 ?RCS: You may redistribute only under the terms of the Artistic License,
6 ?RCS: as specified in the README file that comes with the distribution.
7 ?RCS: You may reuse parts of this distribution only within the terms of
8 ?RCS: that same Artistic License; a copy of which may be found at the root
9 ?RCS: of the source tree for dist 4.0.
10 ?RCS:
11 ?RCS: $Log: Tr.U,v $
12 ?RCS: Revision 3.0.1.2  1994/10/29  18:00:54  ram
13 ?RCS: patch43: forgot to quote $@ to protect against "evil" characters
14 ?RCS:
15 ?RCS: Revision 3.0.1.1  1994/10/29  15:58:35  ram
16 ?RCS: patch36: created
17 ?RCS:
18 ?X: 
19 ?X: This unit produces a bit of shell code that must be dotted in in order
20 ?X: to do a character translation. It catches translations to uppercase or
21 ?X: to lowercase, and then invokes the real tr to perform the job.
22 ?X:
23 ?X: This unit is necessary on HP machines (HP strikes again!) with non-ascii
24 ?X: ROMAN8-charset, where normal letters are not arranged in a row, so a-z
25 ?X: covers not the whole alphabet but lots of special chars. This was reported
26 ?X: by Andreas Sahlbach <a.sahlbach@tu-bs.de>.
27 ?X:
28 ?X: Units performing a tr '[A-Z]' '[a-z]' or the other way round should include
29 ?X: us in their dependency and use ./tr instead.
30 ?X:
31 ?MAKE:Tr: startsh tr eunicefix
32 ?MAKE:  -pick add $@ %<
33 ?F:./tr
34 ?T:up low LC_ALL
35 : see whether [:lower:] and [:upper:] are supported character classes
36 echo " "
37 case "`echo AbyZ | LC_ALL=C $tr '[:lower:]' '[:upper:]' 2>/dev/null`" in
38 ABYZ)
39         echo "Good, your tr supports [:lower:] and [:upper:] to convert case." >&4
40         up='[:upper:]'
41         low='[:lower:]'
42         ;;
43 *)      # There is a discontinuity in EBCDIC between 'I' and 'J'
44         # (0xc9 and 0xd1), therefore that is a nice testing point.
45         if test "X$up" = X -o "X$low" = X; then
46             case "`echo IJ | LC_ALL=C $tr '[I-J]' '[i-j]' 2>/dev/null`" in
47             ij) up='[A-Z]'
48                 low='[a-z]'
49                 ;;
50             esac
51         fi
52         if test "X$up" = X -o "X$low" = X; then
53             case "`echo IJ | LC_ALL=C $tr I-J i-j 2>/dev/null`" in
54             ij) up='A-Z'
55                 low='a-z'
56                 ;;
57             esac
58         fi
59         if test "X$up" = X -o "X$low" = X; then
60             case "`echo IJ | od -x 2>/dev/null`" in
61             *C9D1*|*c9d1*)
62                 echo "Hey, this might be EBCDIC." >&4
63                 if test "X$up" = X -o "X$low" = X; then
64                     case "`echo IJ | \
65                                 LC_ALL=C $tr '[A-IJ-RS-Z]' '[a-ij-rs-z]' 2>/dev/null`" in
66                     ij) up='[A-IJ-RS-Z]'
67                         low='[a-ij-rs-z]'
68                         ;;
69                     esac
70                 fi
71                 if test "X$up" = X -o "X$low" = X; then
72                     case "`echo IJ | LC_ALL=C $tr A-IJ-RS-Z a-ij-rs-z 2>/dev/null`" in
73                     ij) up='A-IJ-RS-Z'
74                         low='a-ij-rs-z'
75                         ;;
76                     esac
77                 fi
78                 ;;
79             esac
80         fi
81 esac
82 case "`echo IJ | LC_ALL=C $tr \"$up\" \"$low\" 2>/dev/null`" in
83 ij)
84     echo "Using $up and $low to convert case." >&4
85     ;;
86 *)
87     echo "I don't know how to translate letters from upper to lower case." >&4
88     echo "Your tr is not acting any way I know of." >&4
89     exit 1
90     ;;
91 esac
92 : set up the translation script tr, must be called with ./tr of course
93 cat >tr <<EOSC
94 $startsh
95 case "\$1\$2" in
96 '[A-Z][a-z]') LC_ALL=C exec $tr '$up' '$low';;
97 '[a-z][A-Z]') LC_ALL=C exec $tr '$low' '$up';;
98 esac
99 LC_ALL=C exec $tr "\$@"
100 EOSC
101 chmod +x tr
102 $eunicefix tr
103