This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
677edfc6a5ed3371178a09118a4c563ab4e61e79
[perl5.git] / lib / charnames.pm
1 package charnames;
2 use strict;
3 use warnings;
4 use File::Spec;
5 our $VERSION = '1.16';
6
7 use bytes ();          # for $bytes::hint_bits
8
9 # The hashes are stored as utf8 strings.  This makes it easier to deal with
10 # sequences.  I (khw) also tried making Name.pl utf8, but it slowed things
11 # down by a factor of 7.  I then tried making Name.pl store the ut8
12 # equivalents but not calling them utf8.  That led to similar speed as leaving
13 # it alone, but since that is harder for a human to parse, I left it as-is.
14
15 my %system_aliases = (
16     # Icky 3.2 names with parentheses.
17     'LINE FEED'             => pack("U", 0x0A), # LINE FEED (LF)
18     'FORM FEED'             => pack("U", 0x0C), # FORM FEED (FF)
19     'CARRIAGE RETURN'       => pack("U", 0x0D), # CARRIAGE RETURN (CR)
20     'NEXT LINE'             => pack("U", 0x85), # NEXT LINE (NEL)
21
22     # Some variant names from Wikipedia
23     'SINGLE-SHIFT 2'                => pack("U", 0x8E),
24     'SINGLE-SHIFT 3'                => pack("U", 0x8F),
25     'PRIVATE USE 1'                 => pack("U", 0x91),
26     'PRIVATE USE 2'                 => pack("U", 0x92),
27     'START OF PROTECTED AREA'       => pack("U", 0x96),
28     'END OF PROTECTED AREA'         => pack("U", 0x97),
29
30     # Convenience.  Standard abbreviations for the controls
31     'NUL'           => pack("U", 0x00), # NULL
32     'SOH'           => pack("U", 0x01), # START OF HEADING
33     'STX'           => pack("U", 0x02), # START OF TEXT
34     'ETX'           => pack("U", 0x03), # END OF TEXT
35     'EOT'           => pack("U", 0x04), # END OF TRANSMISSION
36     'ENQ'           => pack("U", 0x05), # ENQUIRY
37     'ACK'           => pack("U", 0x06), # ACKNOWLEDGE
38     'BEL'           => pack("U", 0x07), # BELL
39     'BS'            => pack("U", 0x08), # BACKSPACE
40     'HT'            => pack("U", 0x09), # HORIZONTAL TABULATION
41     'LF'            => pack("U", 0x0A), # LINE FEED (LF)
42     'VT'            => pack("U", 0x0B), # VERTICAL TABULATION
43     'FF'            => pack("U", 0x0C), # FORM FEED (FF)
44     'CR'            => pack("U", 0x0D), # CARRIAGE RETURN (CR)
45     'SO'            => pack("U", 0x0E), # SHIFT OUT
46     'SI'            => pack("U", 0x0F), # SHIFT IN
47     'DLE'           => pack("U", 0x10), # DATA LINK ESCAPE
48     'DC1'           => pack("U", 0x11), # DEVICE CONTROL ONE
49     'DC2'           => pack("U", 0x12), # DEVICE CONTROL TWO
50     'DC3'           => pack("U", 0x13), # DEVICE CONTROL THREE
51     'DC4'           => pack("U", 0x14), # DEVICE CONTROL FOUR
52     'NAK'           => pack("U", 0x15), # NEGATIVE ACKNOWLEDGE
53     'SYN'           => pack("U", 0x16), # SYNCHRONOUS IDLE
54     'ETB'           => pack("U", 0x17), # END OF TRANSMISSION BLOCK
55     'CAN'           => pack("U", 0x18), # CANCEL
56     'EOM'           => pack("U", 0x19), # END OF MEDIUM
57     'SUB'           => pack("U", 0x1A), # SUBSTITUTE
58     'ESC'           => pack("U", 0x1B), # ESCAPE
59     'FS'            => pack("U", 0x1C), # FILE SEPARATOR
60     'GS'            => pack("U", 0x1D), # GROUP SEPARATOR
61     'RS'            => pack("U", 0x1E), # RECORD SEPARATOR
62     'US'            => pack("U", 0x1F), # UNIT SEPARATOR
63     'DEL'           => pack("U", 0x7F), # DELETE
64     'BPH'           => pack("U", 0x82), # BREAK PERMITTED HERE
65     'NBH'           => pack("U", 0x83), # NO BREAK HERE
66     'NEL'           => pack("U", 0x85), # NEXT LINE (NEL)
67     'SSA'           => pack("U", 0x86), # START OF SELECTED AREA
68     'ESA'           => pack("U", 0x87), # END OF SELECTED AREA
69     'HTS'           => pack("U", 0x88), # CHARACTER TABULATION SET
70     'HTJ'           => pack("U", 0x89), # CHARACTER TABULATION WITH JUSTIFICATION
71     'VTS'           => pack("U", 0x8A), # LINE TABULATION SET
72     'PLD'           => pack("U", 0x8B), # PARTIAL LINE FORWARD
73     'PLU'           => pack("U", 0x8C), # PARTIAL LINE BACKWARD
74     'RI '           => pack("U", 0x8D), # REVERSE LINE FEED
75     'SS2'           => pack("U", 0x8E), # SINGLE SHIFT TWO
76     'SS3'           => pack("U", 0x8F), # SINGLE SHIFT THREE
77     'DCS'           => pack("U", 0x90), # DEVICE CONTROL STRING
78     'PU1'           => pack("U", 0x91), # PRIVATE USE ONE
79     'PU2'           => pack("U", 0x92), # PRIVATE USE TWO
80     'STS'           => pack("U", 0x93), # SET TRANSMIT STATE
81     'CCH'           => pack("U", 0x94), # CANCEL CHARACTER
82     'MW '           => pack("U", 0x95), # MESSAGE WAITING
83     'SPA'           => pack("U", 0x96), # START OF GUARDED AREA
84     'EPA'           => pack("U", 0x97), # END OF GUARDED AREA
85     'SOS'           => pack("U", 0x98), # START OF STRING
86     'SCI'           => pack("U", 0x9A), # SINGLE CHARACTER INTRODUCER
87     'CSI'           => pack("U", 0x9B), # CONTROL SEQUENCE INTRODUCER
88     'ST '           => pack("U", 0x9C), # STRING TERMINATOR
89     'OSC'           => pack("U", 0x9D), # OPERATING SYSTEM COMMAND
90     'PM '           => pack("U", 0x9E), # PRIVACY MESSAGE
91     'APC'           => pack("U", 0x9F), # APPLICATION PROGRAM COMMAND
92
93     # There are no names for these in the Unicode standard; perhaps should be
94     # deprecated, but then again there are no alternative names, so am not
95     # deprecating.  And if did, the code would have to change to not recommend
96     # an alternative for these.
97     'PADDING CHARACTER'                     => pack("U", 0x80),
98     'PAD'                                   => pack("U", 0x80),
99     'HIGH OCTET PRESET'                     => pack("U", 0x81),
100     'HOP'                                   => pack("U", 0x81),
101     'INDEX'                                 => pack("U", 0x84),
102     'IND'                                   => pack("U", 0x84),
103     'SINGLE GRAPHIC CHARACTER INTRODUCER'   => pack("U", 0x99),
104     'SGC'                                   => pack("U", 0x99),
105
106     # More convenience.  For further convenience, it is suggested some way of
107     # using the NamesList aliases be implemented, but there are ambiguities in
108     # NamesList.txt
109     'BOM'   => pack("U", 0xFEFF), # BYTE ORDER MARK
110     'BYTE ORDER MARK'=> pack("U", 0xFEFF),
111     'CGJ'   => pack("U", 0x034F), # COMBINING GRAPHEME JOINER
112     'FVS1'  => pack("U", 0x180B), # MONGOLIAN FREE VARIATION SELECTOR ONE
113     'FVS2'  => pack("U", 0x180C), # MONGOLIAN FREE VARIATION SELECTOR TWO
114     'FVS3'  => pack("U", 0x180D), # MONGOLIAN FREE VARIATION SELECTOR THREE
115     'LRE'   => pack("U", 0x202A), # LEFT-TO-RIGHT EMBEDDING
116     'LRM'   => pack("U", 0x200E), # LEFT-TO-RIGHT MARK
117     'LRO'   => pack("U", 0x202D), # LEFT-TO-RIGHT OVERRIDE
118     'MMSP'  => pack("U", 0x205F), # MEDIUM MATHEMATICAL SPACE
119     'MVS'   => pack("U", 0x180E), # MONGOLIAN VOWEL SEPARATOR
120     'NBSP'  => pack("U", 0x00A0), # NO-BREAK SPACE
121     'NNBSP' => pack("U", 0x202F), # NARROW NO-BREAK SPACE
122     'PDF'   => pack("U", 0x202C), # POP DIRECTIONAL FORMATTING
123     'RLE'   => pack("U", 0x202B), # RIGHT-TO-LEFT EMBEDDING
124     'RLM'   => pack("U", 0x200F), # RIGHT-TO-LEFT MARK
125     'RLO'   => pack("U", 0x202E), # RIGHT-TO-LEFT OVERRIDE
126     'SHY'   => pack("U", 0x00AD), # SOFT HYPHEN
127     'VS1'   => pack("U", 0xFE00), # VARIATION SELECTOR-1
128     'VS2'   => pack("U", 0xFE01), # VARIATION SELECTOR-2
129     'VS3'   => pack("U", 0xFE02), # VARIATION SELECTOR-3
130     'VS4'   => pack("U", 0xFE03), # VARIATION SELECTOR-4
131     'VS5'   => pack("U", 0xFE04), # VARIATION SELECTOR-5
132     'VS6'   => pack("U", 0xFE05), # VARIATION SELECTOR-6
133     'VS7'   => pack("U", 0xFE06), # VARIATION SELECTOR-7
134     'VS8'   => pack("U", 0xFE07), # VARIATION SELECTOR-8
135     'VS9'   => pack("U", 0xFE08), # VARIATION SELECTOR-9
136     'VS10'  => pack("U", 0xFE09), # VARIATION SELECTOR-10
137     'VS11'  => pack("U", 0xFE0A), # VARIATION SELECTOR-11
138     'VS12'  => pack("U", 0xFE0B), # VARIATION SELECTOR-12
139     'VS13'  => pack("U", 0xFE0C), # VARIATION SELECTOR-13
140     'VS14'  => pack("U", 0xFE0D), # VARIATION SELECTOR-14
141     'VS15'  => pack("U", 0xFE0E), # VARIATION SELECTOR-15
142     'VS16'  => pack("U", 0xFE0F), # VARIATION SELECTOR-16
143     'VS17'  => pack("U", 0xE0100), # VARIATION SELECTOR-17
144     'VS18'  => pack("U", 0xE0101), # VARIATION SELECTOR-18
145     'VS19'  => pack("U", 0xE0102), # VARIATION SELECTOR-19
146     'VS20'  => pack("U", 0xE0103), # VARIATION SELECTOR-20
147     'VS21'  => pack("U", 0xE0104), # VARIATION SELECTOR-21
148     'VS22'  => pack("U", 0xE0105), # VARIATION SELECTOR-22
149     'VS23'  => pack("U", 0xE0106), # VARIATION SELECTOR-23
150     'VS24'  => pack("U", 0xE0107), # VARIATION SELECTOR-24
151     'VS25'  => pack("U", 0xE0108), # VARIATION SELECTOR-25
152     'VS26'  => pack("U", 0xE0109), # VARIATION SELECTOR-26
153     'VS27'  => pack("U", 0xE010A), # VARIATION SELECTOR-27
154     'VS28'  => pack("U", 0xE010B), # VARIATION SELECTOR-28
155     'VS29'  => pack("U", 0xE010C), # VARIATION SELECTOR-29
156     'VS30'  => pack("U", 0xE010D), # VARIATION SELECTOR-30
157     'VS31'  => pack("U", 0xE010E), # VARIATION SELECTOR-31
158     'VS32'  => pack("U", 0xE010F), # VARIATION SELECTOR-32
159     'VS33'  => pack("U", 0xE0110), # VARIATION SELECTOR-33
160     'VS34'  => pack("U", 0xE0111), # VARIATION SELECTOR-34
161     'VS35'  => pack("U", 0xE0112), # VARIATION SELECTOR-35
162     'VS36'  => pack("U", 0xE0113), # VARIATION SELECTOR-36
163     'VS37'  => pack("U", 0xE0114), # VARIATION SELECTOR-37
164     'VS38'  => pack("U", 0xE0115), # VARIATION SELECTOR-38
165     'VS39'  => pack("U", 0xE0116), # VARIATION SELECTOR-39
166     'VS40'  => pack("U", 0xE0117), # VARIATION SELECTOR-40
167     'VS41'  => pack("U", 0xE0118), # VARIATION SELECTOR-41
168     'VS42'  => pack("U", 0xE0119), # VARIATION SELECTOR-42
169     'VS43'  => pack("U", 0xE011A), # VARIATION SELECTOR-43
170     'VS44'  => pack("U", 0xE011B), # VARIATION SELECTOR-44
171     'VS45'  => pack("U", 0xE011C), # VARIATION SELECTOR-45
172     'VS46'  => pack("U", 0xE011D), # VARIATION SELECTOR-46
173     'VS47'  => pack("U", 0xE011E), # VARIATION SELECTOR-47
174     'VS48'  => pack("U", 0xE011F), # VARIATION SELECTOR-48
175     'VS49'  => pack("U", 0xE0120), # VARIATION SELECTOR-49
176     'VS50'  => pack("U", 0xE0121), # VARIATION SELECTOR-50
177     'VS51'  => pack("U", 0xE0122), # VARIATION SELECTOR-51
178     'VS52'  => pack("U", 0xE0123), # VARIATION SELECTOR-52
179     'VS53'  => pack("U", 0xE0124), # VARIATION SELECTOR-53
180     'VS54'  => pack("U", 0xE0125), # VARIATION SELECTOR-54
181     'VS55'  => pack("U", 0xE0126), # VARIATION SELECTOR-55
182     'VS56'  => pack("U", 0xE0127), # VARIATION SELECTOR-56
183     'VS57'  => pack("U", 0xE0128), # VARIATION SELECTOR-57
184     'VS58'  => pack("U", 0xE0129), # VARIATION SELECTOR-58
185     'VS59'  => pack("U", 0xE012A), # VARIATION SELECTOR-59
186     'VS60'  => pack("U", 0xE012B), # VARIATION SELECTOR-60
187     'VS61'  => pack("U", 0xE012C), # VARIATION SELECTOR-61
188     'VS62'  => pack("U", 0xE012D), # VARIATION SELECTOR-62
189     'VS63'  => pack("U", 0xE012E), # VARIATION SELECTOR-63
190     'VS64'  => pack("U", 0xE012F), # VARIATION SELECTOR-64
191     'VS65'  => pack("U", 0xE0130), # VARIATION SELECTOR-65
192     'VS66'  => pack("U", 0xE0131), # VARIATION SELECTOR-66
193     'VS67'  => pack("U", 0xE0132), # VARIATION SELECTOR-67
194     'VS68'  => pack("U", 0xE0133), # VARIATION SELECTOR-68
195     'VS69'  => pack("U", 0xE0134), # VARIATION SELECTOR-69
196     'VS70'  => pack("U", 0xE0135), # VARIATION SELECTOR-70
197     'VS71'  => pack("U", 0xE0136), # VARIATION SELECTOR-71
198     'VS72'  => pack("U", 0xE0137), # VARIATION SELECTOR-72
199     'VS73'  => pack("U", 0xE0138), # VARIATION SELECTOR-73
200     'VS74'  => pack("U", 0xE0139), # VARIATION SELECTOR-74
201     'VS75'  => pack("U", 0xE013A), # VARIATION SELECTOR-75
202     'VS76'  => pack("U", 0xE013B), # VARIATION SELECTOR-76
203     'VS77'  => pack("U", 0xE013C), # VARIATION SELECTOR-77
204     'VS78'  => pack("U", 0xE013D), # VARIATION SELECTOR-78
205     'VS79'  => pack("U", 0xE013E), # VARIATION SELECTOR-79
206     'VS80'  => pack("U", 0xE013F), # VARIATION SELECTOR-80
207     'VS81'  => pack("U", 0xE0140), # VARIATION SELECTOR-81
208     'VS82'  => pack("U", 0xE0141), # VARIATION SELECTOR-82
209     'VS83'  => pack("U", 0xE0142), # VARIATION SELECTOR-83
210     'VS84'  => pack("U", 0xE0143), # VARIATION SELECTOR-84
211     'VS85'  => pack("U", 0xE0144), # VARIATION SELECTOR-85
212     'VS86'  => pack("U", 0xE0145), # VARIATION SELECTOR-86
213     'VS87'  => pack("U", 0xE0146), # VARIATION SELECTOR-87
214     'VS88'  => pack("U", 0xE0147), # VARIATION SELECTOR-88
215     'VS89'  => pack("U", 0xE0148), # VARIATION SELECTOR-89
216     'VS90'  => pack("U", 0xE0149), # VARIATION SELECTOR-90
217     'VS91'  => pack("U", 0xE014A), # VARIATION SELECTOR-91
218     'VS92'  => pack("U", 0xE014B), # VARIATION SELECTOR-92
219     'VS93'  => pack("U", 0xE014C), # VARIATION SELECTOR-93
220     'VS94'  => pack("U", 0xE014D), # VARIATION SELECTOR-94
221     'VS95'  => pack("U", 0xE014E), # VARIATION SELECTOR-95
222     'VS96'  => pack("U", 0xE014F), # VARIATION SELECTOR-96
223     'VS97'  => pack("U", 0xE0150), # VARIATION SELECTOR-97
224     'VS98'  => pack("U", 0xE0151), # VARIATION SELECTOR-98
225     'VS99'  => pack("U", 0xE0152), # VARIATION SELECTOR-99
226     'VS100' => pack("U", 0xE0153), # VARIATION SELECTOR-100
227     'VS101' => pack("U", 0xE0154), # VARIATION SELECTOR-101
228     'VS102' => pack("U", 0xE0155), # VARIATION SELECTOR-102
229     'VS103' => pack("U", 0xE0156), # VARIATION SELECTOR-103
230     'VS104' => pack("U", 0xE0157), # VARIATION SELECTOR-104
231     'VS105' => pack("U", 0xE0158), # VARIATION SELECTOR-105
232     'VS106' => pack("U", 0xE0159), # VARIATION SELECTOR-106
233     'VS107' => pack("U", 0xE015A), # VARIATION SELECTOR-107
234     'VS108' => pack("U", 0xE015B), # VARIATION SELECTOR-108
235     'VS109' => pack("U", 0xE015C), # VARIATION SELECTOR-109
236     'VS110' => pack("U", 0xE015D), # VARIATION SELECTOR-110
237     'VS111' => pack("U", 0xE015E), # VARIATION SELECTOR-111
238     'VS112' => pack("U", 0xE015F), # VARIATION SELECTOR-112
239     'VS113' => pack("U", 0xE0160), # VARIATION SELECTOR-113
240     'VS114' => pack("U", 0xE0161), # VARIATION SELECTOR-114
241     'VS115' => pack("U", 0xE0162), # VARIATION SELECTOR-115
242     'VS116' => pack("U", 0xE0163), # VARIATION SELECTOR-116
243     'VS117' => pack("U", 0xE0164), # VARIATION SELECTOR-117
244     'VS118' => pack("U", 0xE0165), # VARIATION SELECTOR-118
245     'VS119' => pack("U", 0xE0166), # VARIATION SELECTOR-119
246     'VS120' => pack("U", 0xE0167), # VARIATION SELECTOR-120
247     'VS121' => pack("U", 0xE0168), # VARIATION SELECTOR-121
248     'VS122' => pack("U", 0xE0169), # VARIATION SELECTOR-122
249     'VS123' => pack("U", 0xE016A), # VARIATION SELECTOR-123
250     'VS124' => pack("U", 0xE016B), # VARIATION SELECTOR-124
251     'VS125' => pack("U", 0xE016C), # VARIATION SELECTOR-125
252     'VS126' => pack("U", 0xE016D), # VARIATION SELECTOR-126
253     'VS127' => pack("U", 0xE016E), # VARIATION SELECTOR-127
254     'VS128' => pack("U", 0xE016F), # VARIATION SELECTOR-128
255     'VS129' => pack("U", 0xE0170), # VARIATION SELECTOR-129
256     'VS130' => pack("U", 0xE0171), # VARIATION SELECTOR-130
257     'VS131' => pack("U", 0xE0172), # VARIATION SELECTOR-131
258     'VS132' => pack("U", 0xE0173), # VARIATION SELECTOR-132
259     'VS133' => pack("U", 0xE0174), # VARIATION SELECTOR-133
260     'VS134' => pack("U", 0xE0175), # VARIATION SELECTOR-134
261     'VS135' => pack("U", 0xE0176), # VARIATION SELECTOR-135
262     'VS136' => pack("U", 0xE0177), # VARIATION SELECTOR-136
263     'VS137' => pack("U", 0xE0178), # VARIATION SELECTOR-137
264     'VS138' => pack("U", 0xE0179), # VARIATION SELECTOR-138
265     'VS139' => pack("U", 0xE017A), # VARIATION SELECTOR-139
266     'VS140' => pack("U", 0xE017B), # VARIATION SELECTOR-140
267     'VS141' => pack("U", 0xE017C), # VARIATION SELECTOR-141
268     'VS142' => pack("U", 0xE017D), # VARIATION SELECTOR-142
269     'VS143' => pack("U", 0xE017E), # VARIATION SELECTOR-143
270     'VS144' => pack("U", 0xE017F), # VARIATION SELECTOR-144
271     'VS145' => pack("U", 0xE0180), # VARIATION SELECTOR-145
272     'VS146' => pack("U", 0xE0181), # VARIATION SELECTOR-146
273     'VS147' => pack("U", 0xE0182), # VARIATION SELECTOR-147
274     'VS148' => pack("U", 0xE0183), # VARIATION SELECTOR-148
275     'VS149' => pack("U", 0xE0184), # VARIATION SELECTOR-149
276     'VS150' => pack("U", 0xE0185), # VARIATION SELECTOR-150
277     'VS151' => pack("U", 0xE0186), # VARIATION SELECTOR-151
278     'VS152' => pack("U", 0xE0187), # VARIATION SELECTOR-152
279     'VS153' => pack("U", 0xE0188), # VARIATION SELECTOR-153
280     'VS154' => pack("U", 0xE0189), # VARIATION SELECTOR-154
281     'VS155' => pack("U", 0xE018A), # VARIATION SELECTOR-155
282     'VS156' => pack("U", 0xE018B), # VARIATION SELECTOR-156
283     'VS157' => pack("U", 0xE018C), # VARIATION SELECTOR-157
284     'VS158' => pack("U", 0xE018D), # VARIATION SELECTOR-158
285     'VS159' => pack("U", 0xE018E), # VARIATION SELECTOR-159
286     'VS160' => pack("U", 0xE018F), # VARIATION SELECTOR-160
287     'VS161' => pack("U", 0xE0190), # VARIATION SELECTOR-161
288     'VS162' => pack("U", 0xE0191), # VARIATION SELECTOR-162
289     'VS163' => pack("U", 0xE0192), # VARIATION SELECTOR-163
290     'VS164' => pack("U", 0xE0193), # VARIATION SELECTOR-164
291     'VS165' => pack("U", 0xE0194), # VARIATION SELECTOR-165
292     'VS166' => pack("U", 0xE0195), # VARIATION SELECTOR-166
293     'VS167' => pack("U", 0xE0196), # VARIATION SELECTOR-167
294     'VS168' => pack("U", 0xE0197), # VARIATION SELECTOR-168
295     'VS169' => pack("U", 0xE0198), # VARIATION SELECTOR-169
296     'VS170' => pack("U", 0xE0199), # VARIATION SELECTOR-170
297     'VS171' => pack("U", 0xE019A), # VARIATION SELECTOR-171
298     'VS172' => pack("U", 0xE019B), # VARIATION SELECTOR-172
299     'VS173' => pack("U", 0xE019C), # VARIATION SELECTOR-173
300     'VS174' => pack("U", 0xE019D), # VARIATION SELECTOR-174
301     'VS175' => pack("U", 0xE019E), # VARIATION SELECTOR-175
302     'VS176' => pack("U", 0xE019F), # VARIATION SELECTOR-176
303     'VS177' => pack("U", 0xE01A0), # VARIATION SELECTOR-177
304     'VS178' => pack("U", 0xE01A1), # VARIATION SELECTOR-178
305     'VS179' => pack("U", 0xE01A2), # VARIATION SELECTOR-179
306     'VS180' => pack("U", 0xE01A3), # VARIATION SELECTOR-180
307     'VS181' => pack("U", 0xE01A4), # VARIATION SELECTOR-181
308     'VS182' => pack("U", 0xE01A5), # VARIATION SELECTOR-182
309     'VS183' => pack("U", 0xE01A6), # VARIATION SELECTOR-183
310     'VS184' => pack("U", 0xE01A7), # VARIATION SELECTOR-184
311     'VS185' => pack("U", 0xE01A8), # VARIATION SELECTOR-185
312     'VS186' => pack("U", 0xE01A9), # VARIATION SELECTOR-186
313     'VS187' => pack("U", 0xE01AA), # VARIATION SELECTOR-187
314     'VS188' => pack("U", 0xE01AB), # VARIATION SELECTOR-188
315     'VS189' => pack("U", 0xE01AC), # VARIATION SELECTOR-189
316     'VS190' => pack("U", 0xE01AD), # VARIATION SELECTOR-190
317     'VS191' => pack("U", 0xE01AE), # VARIATION SELECTOR-191
318     'VS192' => pack("U", 0xE01AF), # VARIATION SELECTOR-192
319     'VS193' => pack("U", 0xE01B0), # VARIATION SELECTOR-193
320     'VS194' => pack("U", 0xE01B1), # VARIATION SELECTOR-194
321     'VS195' => pack("U", 0xE01B2), # VARIATION SELECTOR-195
322     'VS196' => pack("U", 0xE01B3), # VARIATION SELECTOR-196
323     'VS197' => pack("U", 0xE01B4), # VARIATION SELECTOR-197
324     'VS198' => pack("U", 0xE01B5), # VARIATION SELECTOR-198
325     'VS199' => pack("U", 0xE01B6), # VARIATION SELECTOR-199
326     'VS200' => pack("U", 0xE01B7), # VARIATION SELECTOR-200
327     'VS201' => pack("U", 0xE01B8), # VARIATION SELECTOR-201
328     'VS202' => pack("U", 0xE01B9), # VARIATION SELECTOR-202
329     'VS203' => pack("U", 0xE01BA), # VARIATION SELECTOR-203
330     'VS204' => pack("U", 0xE01BB), # VARIATION SELECTOR-204
331     'VS205' => pack("U", 0xE01BC), # VARIATION SELECTOR-205
332     'VS206' => pack("U", 0xE01BD), # VARIATION SELECTOR-206
333     'VS207' => pack("U", 0xE01BE), # VARIATION SELECTOR-207
334     'VS208' => pack("U", 0xE01BF), # VARIATION SELECTOR-208
335     'VS209' => pack("U", 0xE01C0), # VARIATION SELECTOR-209
336     'VS210' => pack("U", 0xE01C1), # VARIATION SELECTOR-210
337     'VS211' => pack("U", 0xE01C2), # VARIATION SELECTOR-211
338     'VS212' => pack("U", 0xE01C3), # VARIATION SELECTOR-212
339     'VS213' => pack("U", 0xE01C4), # VARIATION SELECTOR-213
340     'VS214' => pack("U", 0xE01C5), # VARIATION SELECTOR-214
341     'VS215' => pack("U", 0xE01C6), # VARIATION SELECTOR-215
342     'VS216' => pack("U", 0xE01C7), # VARIATION SELECTOR-216
343     'VS217' => pack("U", 0xE01C8), # VARIATION SELECTOR-217
344     'VS218' => pack("U", 0xE01C9), # VARIATION SELECTOR-218
345     'VS219' => pack("U", 0xE01CA), # VARIATION SELECTOR-219
346     'VS220' => pack("U", 0xE01CB), # VARIATION SELECTOR-220
347     'VS221' => pack("U", 0xE01CC), # VARIATION SELECTOR-221
348     'VS222' => pack("U", 0xE01CD), # VARIATION SELECTOR-222
349     'VS223' => pack("U", 0xE01CE), # VARIATION SELECTOR-223
350     'VS224' => pack("U", 0xE01CF), # VARIATION SELECTOR-224
351     'VS225' => pack("U", 0xE01D0), # VARIATION SELECTOR-225
352     'VS226' => pack("U", 0xE01D1), # VARIATION SELECTOR-226
353     'VS227' => pack("U", 0xE01D2), # VARIATION SELECTOR-227
354     'VS228' => pack("U", 0xE01D3), # VARIATION SELECTOR-228
355     'VS229' => pack("U", 0xE01D4), # VARIATION SELECTOR-229
356     'VS230' => pack("U", 0xE01D5), # VARIATION SELECTOR-230
357     'VS231' => pack("U", 0xE01D6), # VARIATION SELECTOR-231
358     'VS232' => pack("U", 0xE01D7), # VARIATION SELECTOR-232
359     'VS233' => pack("U", 0xE01D8), # VARIATION SELECTOR-233
360     'VS234' => pack("U", 0xE01D9), # VARIATION SELECTOR-234
361     'VS235' => pack("U", 0xE01DA), # VARIATION SELECTOR-235
362     'VS236' => pack("U", 0xE01DB), # VARIATION SELECTOR-236
363     'VS237' => pack("U", 0xE01DC), # VARIATION SELECTOR-237
364     'VS238' => pack("U", 0xE01DD), # VARIATION SELECTOR-238
365     'VS239' => pack("U", 0xE01DE), # VARIATION SELECTOR-239
366     'VS240' => pack("U", 0xE01DF), # VARIATION SELECTOR-240
367     'VS241' => pack("U", 0xE01E0), # VARIATION SELECTOR-241
368     'VS242' => pack("U", 0xE01E1), # VARIATION SELECTOR-242
369     'VS243' => pack("U", 0xE01E2), # VARIATION SELECTOR-243
370     'VS244' => pack("U", 0xE01E3), # VARIATION SELECTOR-244
371     'VS245' => pack("U", 0xE01E4), # VARIATION SELECTOR-245
372     'VS246' => pack("U", 0xE01E5), # VARIATION SELECTOR-246
373     'VS247' => pack("U", 0xE01E6), # VARIATION SELECTOR-247
374     'VS248' => pack("U", 0xE01E7), # VARIATION SELECTOR-248
375     'VS249' => pack("U", 0xE01E8), # VARIATION SELECTOR-249
376     'VS250' => pack("U", 0xE01E9), # VARIATION SELECTOR-250
377     'VS251' => pack("U", 0xE01EA), # VARIATION SELECTOR-251
378     'VS252' => pack("U", 0xE01EB), # VARIATION SELECTOR-252
379     'VS253' => pack("U", 0xE01EC), # VARIATION SELECTOR-253
380     'VS254' => pack("U", 0xE01ED), # VARIATION SELECTOR-254
381     'VS255' => pack("U", 0xE01EE), # VARIATION SELECTOR-255
382     'VS256' => pack("U", 0xE01EF), # VARIATION SELECTOR-256
383     'WJ'    => pack("U", 0x2060), # WORD JOINER
384     'ZWJ'   => pack("U", 0x200D), # ZERO WIDTH JOINER
385     'ZWNJ'  => pack("U", 0x200C), # ZERO WIDTH NON-JOINER
386     'ZWSP'  => pack("U", 0x200B), # ZERO WIDTH SPACE
387 );
388
389 my %deprecated_aliases = (
390     # Pre-3.2 compatibility (only for the first 256 characters).
391     # Use of these gives deprecated message.
392     'HORIZONTAL TABULATION' => pack("U", 0x09), # CHARACTER TABULATION
393     'VERTICAL TABULATION'   => pack("U", 0x0B), # LINE TABULATION
394     'FILE SEPARATOR'        => pack("U", 0x1C), # INFORMATION SEPARATOR FOUR
395     'GROUP SEPARATOR'       => pack("U", 0x1D), # INFORMATION SEPARATOR THREE
396     'RECORD SEPARATOR'      => pack("U", 0x1E), # INFORMATION SEPARATOR TWO
397     'UNIT SEPARATOR'        => pack("U", 0x1F), # INFORMATION SEPARATOR ONE
398     'HORIZONTAL TABULATION SET' => pack("U", 0x88), # CHARACTER TABULATION SET
399     'HORIZONTAL TABULATION WITH JUSTIFICATION' => pack("U", 0x89), # CHARACTER TABULATION WITH JUSTIFICATION
400     'PARTIAL LINE DOWN'       => pack("U", 0x8B), # PARTIAL LINE FORWARD
401     'PARTIAL LINE UP'         => pack("U", 0x8C), # PARTIAL LINE BACKWARD
402     'VERTICAL TABULATION SET' => pack("U", 0x8A), # LINE TABULATION SET
403     'REVERSE INDEX'           => pack("U", 0x8D), # REVERSE LINE FEED
404 );
405
406
407 my $txt;  # The table of official character names
408
409 my %full_names_cache; # Holds already-looked-up names, so don't have to
410 # re-look them up again.  The previous versions of charnames had scoping
411 # bugs.  For example if we use script A in one scope and find and cache
412 # what Z resolves to, we can't use that cache in a different scope that
413 # uses script B instead of A, as Z might be an entirely different letter
414 # there; or there might be different aliases in effect in different
415 # scopes, or :short may be in effect or not effect in different scopes,
416 # or various combinations thereof.  This was solved in this version
417 # mostly by moving things to %^H.  But some things couldn't be moved
418 # there.  One of them was the cache of runtime looked-up names, in part
419 # because %^H is read-only at runtime.  I (khw) don't know why the cache
420 # was run-time only in the previous versions: perhaps oversight; perhaps
421 # that compile time looking doesn't happen in a loop so didn't think it
422 # was worthwhile; perhaps not wanting to make the cache too large.  But
423 # I decided to make it compile time as well; this could easily be
424 # changed.
425 # Anyway, this hash is not scoped, and is added to at runtime.  It
426 # doesn't have scoping problems because the data in it is restricted to
427 # official names, which are always invariant, and we only set it and
428 # look at it at during :full lookups, so is unaffected by any other
429 # scoped options.  I put this in to maintain parity with the older
430 # version.  If desired, a %short_names cache could also be made, as well
431 # as one for each script, say in %script_names_cache, with each key
432 # being a hash for a script named in a 'use charnames' statement.  I
433 # decided not to do that for now, just because it's added complication,
434 # and because I'm just trying to maintain parity, not extend it.
435
436 # Designed so that test decimal first, and then hex.  Leading zeros
437 # imply non-decimal, as do non-[0-9]
438 my $decimal_qr = qr/^[1-9]\d*$/;
439
440 # Returns the hex number in $1.
441 my $hex_qr = qr/^(?:[Uu]\+|0[xX])?([[:xdigit:]]+)$/;
442
443 sub croak
444 {
445   require Carp; goto &Carp::croak;
446 } # croak
447
448 sub carp
449 {
450   require Carp; goto &Carp::carp;
451 } # carp
452
453 sub alias (@) # Set up a single alias
454 {
455   my $alias = ref $_[0] ? $_[0] : { @_ };
456   foreach my $name (keys %$alias) {
457     my $value = $alias->{$name};
458     next unless defined $value;          # Omit if screwed up.
459
460     # Is slightly slower to just after this statement see if it is
461     # decimal, since we already know it is after having converted from
462     # hex, but makes the code easier to maintain, and is called
463     # infrequently, only at compile-time
464     if ($value !~ $decimal_qr && $value =~ $hex_qr) {
465       $value = CORE::hex $1;
466     }
467     if ($value =~ $decimal_qr) {
468         no warnings 'utf8'; # Allow even illegal characters
469         $^H{charnames_ord_aliases}{$name} = pack("U", $value);
470
471         # Use a canonical form.
472         $^H{charnames_inverse_ords}{sprintf("%05X", $value)} = $name;
473     }
474     else {
475         # XXX validate syntax when deprecation cycle complete. ie. start
476         # with an alpha only, etc.
477         $^H{charnames_name_aliases}{$name} = $value;
478     }
479   }
480 } # alias
481
482 sub not_legal_use_bytes_msg {
483   my ($name, $utf8) = @_;
484   my $return;
485
486   if (length($utf8) == 1) {
487     $return = sprintf("Character 0x%04x with name '%s' is", ord $utf8, $name);
488   } else {
489     $return = sprintf("String with name '%s' (and ordinals %s) contains character(s)", $name, join(" ", map { sprintf "0x%04X", ord $_ } split(//, $utf8)));
490   }
491   return $return . " above 0xFF with 'use bytes' in effect";
492 }
493
494 sub alias_file ($)  # Reads a file containing alias definitions
495 {
496   my ($arg, $file) = @_;
497   if (-f $arg && File::Spec->file_name_is_absolute ($arg)) {
498     $file = $arg;
499   }
500   elsif ($arg =~ m/^\w+$/) {
501     $file = "unicore/${arg}_alias.pl";
502   }
503   else {
504     croak "Charnames alias files can only have identifier characters";
505   }
506   if (my @alias = do $file) {
507     @alias == 1 && !defined $alias[0] and
508       croak "$file cannot be used as alias file for charnames";
509     @alias % 2 and
510       croak "$file did not return a (valid) list of alias pairs";
511     alias (@alias);
512     return (1);
513   }
514   0;
515 } # alias_file
516
517 # For use when don't import anything.  This structure must be kept in
518 # sync with the one that import() fills up.
519 my %dummy_H = (
520                 charnames_stringified_names => "",
521                 charnames_stringified_ords => "",
522                 charnames_scripts => "",
523                 charnames_full => 1,
524                 charnames_short => 0,
525               );
526
527
528 sub lookup_name ($$$) {
529   my ($name, $wants_ord, $runtime) = @_;
530
531   # Lookup the name or sequence $name in the tables.  If $wants_ord is false,
532   # returns the string equivalent of $name; if true, returns the ordinal value
533   # instead, but in this case $name must not be a sequence; otherwise undef is
534   # returned and a warning raised.  $runtime is 0 if compiletime, otherwise
535   # gives the number of stack frames to go back to get the application caller
536   # info.
537   # If $name is not found, returns undef in runtime with no warning; and in
538   # compiletime, the Unicode replacement character, with a warning.
539
540   # It looks first in the aliases, then in the large table of official Unicode
541   # names.
542
543   my $utf8;       # The string result
544   my $save_input;
545
546   if ($runtime) {
547
548     my $hints_ref = (caller($runtime))[10];
549
550     # If we didn't import anything (which happens with 'use charnames ()',
551     # substitute a dummy structure.
552     $hints_ref = \%dummy_H if ! defined $hints_ref
553                               || ! defined $hints_ref->{charnames_full};
554
555     # At runtime, but currently not at compile time, $^H gets
556     # stringified, so un-stringify back to the original data structures.
557     # These get thrown away by perl before the next invocation
558     # Also fill in the hash with the non-stringified data.
559     # N.B.  New fields must be also added to %dummy_H
560
561     %{$^H{charnames_name_aliases}} = split ',',
562                                       $hints_ref->{charnames_stringified_names};
563     %{$^H{charnames_ord_aliases}} = split ',',
564                                       $hints_ref->{charnames_stringified_ords};
565     $^H{charnames_scripts} = $hints_ref->{charnames_scripts};
566     $^H{charnames_full} = $hints_ref->{charnames_full};
567     $^H{charnames_short} = $hints_ref->{charnames_short};
568   }
569
570   # User alias should be checked first or else can't override ours, and if we
571   # were to add any, could conflict with theirs.
572   if (exists $^H{charnames_ord_aliases}{$name}) {
573     $utf8 = $^H{charnames_ord_aliases}{$name};
574   }
575   elsif (exists $^H{charnames_name_aliases}{$name}) {
576     $name = $^H{charnames_name_aliases}{$name};
577     $save_input = $name;  # Cache the result for any error message
578   }
579   elsif (exists $system_aliases{$name}) {
580     $utf8 = $system_aliases{$name};
581   }
582   elsif (exists $deprecated_aliases{$name}) {
583     require warnings;
584     warnings::warnif('deprecated', "Unicode character name \"$name\" is deprecated, use \"" . viacode(ord $deprecated_aliases{$name}) . "\" instead");
585     $utf8 = $deprecated_aliases{$name};
586   }
587
588   my @off;
589
590   if (! defined $utf8) {
591
592     # See if has looked this input up earlier.
593     if ($^H{charnames_full} && exists $full_names_cache{$name}) {
594       $utf8 = $full_names_cache{$name};
595     }
596     else {
597
598       ## Suck in the code/name list as a big string.
599       ## Lines look like:
600       ##     "00052\tLATIN CAPITAL LETTER R\n"
601       # or
602       #      "0052 0303\tLATIN CAPITAL LETTER R WITH TILDE\n"
603       $txt = do "unicore/Name.pl" unless $txt;
604
605       ## @off will hold the index into the code/name string of the start and
606       ## end of the name as we find it.
607
608       ## If :full, look for the name exactly; runtime implies full
609       my $found_full_in_table = 0;  # Tells us if can cache the result
610       if ($^H{charnames_full}) {
611
612         # See if the name is one which is algorithmically determinable.
613         # The subroutine is included in Name.pl.  The table contained in
614         # $txt doesn't contain these.  Experiments show that checking
615         # for these before checking for the regular names has no
616         # noticeable impact on performance for the regular names, but
617         # the other way around slows down finding these immensely.
618         # Algorithmically determinables are not placed in the cache (that
619         # $found_full_in_table indicates) because that uses up memory,
620         # and finding these again is fast.
621         if (defined (my $ord = name_to_code_point_special($name))) {
622           $utf8 = pack("U", $ord);
623         }
624         else {
625
626           # Not algorthmically determinable; look up in the table.
627           if ($txt =~ /\t\Q$name\E$/m) {
628             @off = ($-[0] + 1, $+[0]);    # The 1 is for the tab
629             $found_full_in_table = 1;
630           }
631         }
632       }
633
634       # If we didn't get it above, keep looking
635       if (! $found_full_in_table && ! defined $utf8) {
636
637         # If :short is allowed, see if input is like "greek:Sigma".
638         my $scripts_trie;
639         if (($^H{charnames_short})
640             && $name =~ /^ \s* (.+?) \s* : \s* (.+?) \s* $ /xs)
641         {
642             $scripts_trie = "\U\Q$1";
643             $name = $2;
644         }
645         else { # Otherwise look in allowed scripts
646             $scripts_trie = $^H{charnames_scripts};
647         }
648
649         my $case = $name =~ /[[:upper:]]/ ? "CAPITAL" : "SMALL";
650         if ($txt !~
651             /\t (?: $scripts_trie ) \ (?:$case\ )? LETTER \ \U\Q$name\E $/xm)
652         {
653           # Here we still don't have it, give up.
654           return if $runtime;
655
656           # May have zapped input name, get it again.
657           $name = (defined $save_input) ? $save_input : $_[0];
658           carp "Unknown charname '$name'";
659           return ($wants_ord) ? 0xFFFD : pack("U", 0xFFFD);
660         }
661
662         @off = ($-[0] + 1, $+[0]);  # The 1 is for the tab
663       }
664
665       if (! defined $utf8) {
666
667         # Here, we haven't set up the output, but we know where in the string
668         # the name starts.  The string is set up so that for single characters
669         # (and not named sequences), the name is preceeded immediately by a
670         # tab and 5 hex digits for its code, with a \n before those.  Named
671         # sequences won't have the 7th preceeding character be a \n.
672         # (Actually, for the very first entry in the table this isn't strictly
673         # true: subtracting 7 will yield -1, and the substr below will
674         # therefore yield the very last character in the table, which should
675         # also be a \n, so the statement works anyway.)
676         if (substr($txt, $off[0] - 7, 1) eq "\n") {
677           $utf8 = pack("U", CORE::hex substr($txt, $off[0] - 6, 5));
678         }
679         else {
680
681           # Here, is a named sequence.  Need to go looking for the beginning,
682           # which is just after the \n from the previous entry in the table.
683           # The +1 skips past that newline, or, if the rindex() fails, to put
684           # us to an offset of zero.
685           my $charstart = rindex($txt, "\n", $off[0] - 7) + 1;
686           $utf8 = pack("U*", map { CORE::hex }
687               split " ", substr($txt, $charstart, $off[0] - $charstart - 1));
688         }
689       }
690
691       # Cache the input so as to not have to search the large table
692       # again, but only if it came from the one search that we cache.
693       $full_names_cache{$name} = $utf8 if $found_full_in_table;
694     }
695   }
696
697
698   # Here, have the utf8.  If the return is to be an ord, must be any single
699   # character.
700   if ($wants_ord) {
701     return ord($utf8) if length $utf8 == 1;
702   }
703   else {
704
705     # Here, wants string output.  If utf8 is acceptable, just return what
706     # we've got; otherwise attempt to convert it to non-utf8 and return that.
707     my $in_bytes = ($runtime)
708                    ? (caller $runtime)[8] & $bytes::hint_bits
709                    : $^H & $bytes::hint_bits;
710     return $utf8 if (! $in_bytes || utf8::downgrade($utf8, 1)) # The 1 arg
711                                                   # means don't die on failure
712   }
713
714   # Here, there is an error:  either there are too many characters, or the
715   # result string needs to be non-utf8, and at least one character requires
716   # utf8.  Prefer any official name over the input one for the error message.
717   if (@off) {
718     $name = substr($txt, $off[0], $off[1] - $off[0]) if @off;
719   }
720   else {
721     $name = (defined $save_input) ? $save_input : $_[0];
722   }
723
724   if ($wants_ord) {
725     # Only way to get here in this case is if result too long.  Message
726     # assumes that our only caller that requires single char result is
727     # vianame.
728     carp "charnames::vianame() doesn't handle named sequences ($name).  Use charnames::string_vianame() instead";
729     return;
730   }
731
732   # Only other possible failure here is from use bytes.
733   if ($runtime) {
734     carp not_legal_use_bytes_msg($name, $utf8);
735     return;
736   } else {
737     croak not_legal_use_bytes_msg($name, $utf8);
738   }
739
740 } # lookup_name
741
742 sub charnames {
743
744   # For \N{...}.  Looks up the character name and returns the string
745   # representation of it.
746
747   # The first 0 arg means wants a string returned; the second that we are in
748   # compile time
749   return lookup_name($_[0], 0, 0);
750 }
751
752 sub import
753 {
754   shift; ## ignore class name
755
756   if (not @_) {
757     carp("`use charnames' needs explicit imports list");
758   }
759   $^H{charnames} = \&charnames ;
760   $^H{charnames_ord_aliases} = {};
761   $^H{charnames_name_aliases} = {};
762   $^H{charnames_inverse_ords} = {};
763   # New fields must be added to %dummy_H, and the code in lookup_name()
764   # that copies fields from the runtime structure
765
766   ##
767   ## fill %h keys with our @_ args.
768   ##
769   my ($promote, %h, @args) = (0);
770   while (my $arg = shift) {
771     if ($arg eq ":alias") {
772       @_ or
773         croak ":alias needs an argument in charnames";
774       my $alias = shift;
775       if (ref $alias) {
776         ref $alias eq "HASH" or
777           croak "Only HASH reference supported as argument to :alias";
778         alias ($alias);
779         next;
780       }
781       if ($alias =~ m{:(\w+)$}) {
782         $1 eq "full" || $1 eq "short" and
783           croak ":alias cannot use existing pragma :$1 (reversed order?)";
784         alias_file ($1) and $promote = 1;
785         next;
786       }
787       alias_file ($alias);
788       next;
789     }
790     if (substr($arg, 0, 1) eq ':' and ! ($arg eq ":full" || $arg eq ":short")) {
791       warn "unsupported special '$arg' in charnames";
792       next;
793     }
794     push @args, $arg;
795   }
796   @args == 0 && $promote and @args = (":full");
797   @h{@args} = (1) x @args;
798
799   $^H{charnames_full} = delete $h{':full'} || 0;  # Don't leave undefined,
800                                                   # as tested for in
801                                                   # lookup_names
802   $^H{charnames_short} = delete $h{':short'} || 0;
803   my @scripts = map uc, keys %h;
804
805   ##
806   ## If utf8? warnings are enabled, and some scripts were given,
807   ## see if at least we can find one letter from each script.
808   ##
809   if (warnings::enabled('utf8') && @scripts) {
810     $txt = do "unicore/Name.pl" unless $txt;
811
812     for my $script (@scripts) {
813       if (not $txt =~ m/\t$script (?:CAPITAL |SMALL )?LETTER /) {
814         warnings::warn('utf8',  "No such script: '$script'");
815         $script = quotemeta $script;  # Escape it, for use in the re.
816       }
817     }
818   }
819
820   # %^H gets stringified, so serialize it ourselves so can extract the
821   # real data back later.
822   $^H{charnames_stringified_ords} = join ",", %{$^H{charnames_ord_aliases}};
823   $^H{charnames_stringified_names} = join ",", %{$^H{charnames_name_aliases}};
824   $^H{charnames_stringified_inverse_ords} = join ",", %{$^H{charnames_inverse_ords}};
825   $^H{charnames_scripts} = join "|", @scripts;  # Stringifiy them as a trie
826 } # import
827
828 # Cache of already looked-up values.  This is set to only contain
829 # official values, and user aliases can't override them, so scoping is
830 # not an issue.
831 my %viacode;
832
833 sub viacode {
834
835   # Returns the name of the code point argument
836
837   if (@_ != 1) {
838     carp "charnames::viacode() expects one argument";
839     return;
840   }
841
842   my $arg = shift;
843
844   # This is derived from Unicode::UCD, where it is nearly the same as the
845   # function _getcode(), but here it makes sure that even a hex argument
846   # has the proper number of leading zeros, which is critical in
847   # matching against $txt below
848   # Must check if decimal first; see comments at that definition
849   my $hex;
850   if ($arg =~ $decimal_qr) {
851     $hex = sprintf "%05X", $arg;
852   } elsif ($arg =~ $hex_qr) {
853     # Below is the line that differs from the _getcode() source
854     $hex = sprintf "%05X", hex $1;
855   } else {
856     carp("unexpected arg \"$arg\" to charnames::viacode()");
857     return;
858   }
859
860   return $viacode{$hex} if exists $viacode{$hex};
861
862   # If the code point is above the max in the table, there's no point
863   # looking through it.  Checking the length first is slightly faster
864   if (length($hex) <= 5 || CORE::hex($hex) <= 0x10FFFF) {
865     $txt = do "unicore/Name.pl" unless $txt;
866
867     # See if the name is algorithmically determinable.
868     my $algorithmic = code_point_to_name_special(CORE::hex $hex);
869     if (defined $algorithmic) {
870       $viacode{$hex} = $algorithmic;
871       return $algorithmic;
872     }
873
874     # Return the official name, if exists.  It's unclear to me (khw) at
875     # this juncture if it is better to return a user-defined override, so
876     # leaving it as is for now.
877     if ($txt =~ m/^$hex\t/m) {
878
879         # The name starts with the next character and goes up to the
880         # next new-line.  Using capturing parentheses above instead of
881         # @+ more than doubles the execution time in Perl 5.13
882         $viacode{$hex} = substr($txt, $+[0], index($txt, "\n", $+[0]) - $+[0]);
883         return $viacode{$hex};
884     }
885   }
886
887   # See if there is a user name for it, before giving up completely.
888   # First get the scoped aliases, give up if have none.
889   my $H_ref = (caller(0))[10];
890   return if ! defined $H_ref
891             || ! exists $H_ref->{charnames_stringified_inverse_ords};
892
893   my %code_point_aliases = split ',',
894                           $H_ref->{charnames_stringified_inverse_ords};
895   if (! exists $code_point_aliases{$hex}) {
896     if (CORE::hex($hex) > 0x10FFFF) {
897         carp "Unicode characters only allocated up to U+10FFFF (you asked for U+$hex)";
898     }
899     return;
900   }
901
902   return $code_point_aliases{$hex};
903 } # viacode
904
905 sub vianame
906 {
907   if (@_ != 1) {
908     carp "charnames::vianame() expects one name argument";
909     return ()
910   }
911
912   # Looks up the character name and returns its ordinal if
913   # found, undef otherwise.
914
915   my $arg = shift;
916
917   if ($arg =~ /^U\+([0-9a-fA-F]+)$/) {
918
919     # khw claims that this is poor interface design.  The function should
920     # return either a an ord or a chr for all inputs; not be bipolar.  But
921     # can't change it because of backward compatibility.  New code can use
922     # string_vianame() instead.
923     my $ord = CORE::hex $1;
924     return chr $ord if $ord <= 255 || ! ((caller 0)[8] & $bytes::hint_bits);
925     carp not_legal_use_bytes_msg($arg, chr $ord);
926     return;
927   }
928
929   # The first 1 arg means wants an ord returned; the second that we are in
930   # runtime, and this is the first level routine called from the user
931   return lookup_name($arg, 1, 1);
932 } # vianame
933
934 sub string_vianame {
935
936   # Looks up the character name and returns its string representation if
937   # found, undef otherwise.
938
939   if (@_ != 1) {
940     carp "charnames::string_vianame() expects one name argument";
941     return;
942   }
943
944   my $arg = shift;
945
946   if ($arg =~ /^U\+([0-9a-fA-F]+)$/) {
947
948     my $ord = CORE::hex $1;
949     return chr $ord if $ord <= 255 || ! ((caller 0)[8] & $bytes::hint_bits);
950
951     carp not_legal_use_bytes_msg($arg, chr $ord);
952     return;
953   }
954
955   # The 0 arg means wants a string returned; the 1 arg means that we are in
956   # runtime, and this is the first level routine called from the user
957   return lookup_name($arg, 0, 1);
958 } # string_vianame
959
960
961
962 1;
963 __END__
964
965 =head1 NAME
966
967 charnames - access to Unicode character names and named character sequences; also define character names
968
969 =head1 SYNOPSIS
970
971  use charnames ':full';
972  print "\N{GREEK SMALL LETTER SIGMA} is called sigma.\n";
973  print "\N{LATIN CAPITAL LETTER E WITH VERTICAL LINE BELOW}",
974        " is an officially named sequence of two Unicode characters\n";
975
976  use charnames ':short';
977  print "\N{greek:Sigma} is an upper-case sigma.\n";
978
979  use charnames qw(cyrillic greek);
980  print "\N{sigma} is Greek sigma, and \N{be} is Cyrillic b.\n";
981
982  use charnames ":full", ":alias" => {
983    e_ACUTE => "LATIN SMALL LETTER E WITH ACUTE",
984    mychar => 0xE8000,  # Private use area
985  };
986  print "\N{e_ACUTE} is a small letter e with an acute.\n";
987  print "\\N{mychar} allows me to name private use characters.\n";
988
989  use charnames ();
990  print charnames::viacode(0x1234); # prints "ETHIOPIC SYLLABLE SEE"
991  printf "%04X", charnames::vianame("GOTHIC LETTER AHSA"); # prints
992                                                           # "10330"
993  print charnames::vianame("LATIN CAPITAL LETTER A"); # prints 65 on
994                                                      # ASCII platforms;
995                                                      # 193 on EBCDIC
996  print charnames::string_vianame("LATIN CAPITAL LETTER A"); # prints "A"
997
998 =head1 DESCRIPTION
999
1000 Pragma C<use charnames> is used to gain access to the names of the
1001 Unicode characters and named character sequences, and to allow you to define
1002 your own character and character sequence names.
1003
1004 All forms of the pragma enable use of the following 3 functions:
1005
1006 =over
1007
1008 =item *
1009
1010 L</charnames::string_vianame(I<name>)> for run-time lookup of a
1011 either a character name or a named character sequence, returning its string
1012 representation
1013
1014 =item *
1015
1016 L</charnames::vianame(I<name>)> for run-time lookup of a
1017 character name (but not a named character sequence) to get its ordinal value
1018 (code point)
1019
1020 =item *
1021
1022 L</charnames::viacode(I<code>)> for run-time lookup of a code point to get its
1023 Unicode name.
1024
1025 =back
1026
1027 All forms other than C<S<"use charnames ();">> also enable the use of
1028 C<\N{I<CHARNAME>}> sequences to compile a Unicode character into a
1029 string, based on its name.
1030
1031 Note that C<\N{U+I<...>}>, where the I<...> is a hexadecimal number,
1032 also inserts a character into a string, but doesn't require the use of
1033 this pragma.  The character it inserts is the one whose code point
1034 (ordinal value) is equal to the number.  For example, C<"\N{U+263a}"> is
1035 the Unicode (white background, black foreground) smiley face; it doesn't
1036 require this pragma, whereas the equivalent, C<"\N{WHITE SMILING FACE}">
1037 does.
1038 Also, C<\N{I<...>}> can mean a regex quantifier instead of a character
1039 name, when the I<...> is a number (or comma separated pair of numbers
1040 (see L<perlreref/QUANTIFIERS>), and is not related to this pragma.
1041
1042 The C<charnames> pragma supports arguments C<:full>, C<:short>, script
1043 names and customized aliases.  If C<:full> is present, for expansion of
1044 C<\N{I<CHARNAME>}>, the string I<CHARNAME> is first looked up in the list of
1045 standard Unicode character names.  If C<:short> is present, and
1046 I<CHARNAME> has the form C<I<SCRIPT>:I<CNAME>>, then I<CNAME> is looked up
1047 as a letter in script I<SCRIPT>.  If C<use charnames> is used
1048 with script name arguments, then for C<\N{I<CHARNAME>}> the name
1049 I<CHARNAME> is looked up as a letter in the given scripts (in the
1050 specified order). Customized aliases can override these, and are explained in
1051 L</CUSTOM ALIASES>.
1052
1053 For lookup of I<CHARNAME> inside a given script I<SCRIPTNAME>
1054 this pragma looks for the names
1055
1056   SCRIPTNAME CAPITAL LETTER CHARNAME
1057   SCRIPTNAME SMALL LETTER CHARNAME
1058   SCRIPTNAME LETTER CHARNAME
1059
1060 in the table of standard Unicode names.  If I<CHARNAME> is lowercase,
1061 then the C<CAPITAL> variant is ignored, otherwise the C<SMALL> variant
1062 is ignored.
1063
1064 Note that C<\N{...}> is compile-time; it's a special form of string
1065 constant used inside double-quotish strings; this means that you cannot
1066 use variables inside the C<\N{...}>.  If you want similar run-time
1067 functionality, use
1068 L<charnames::string_vianame()|/charnames::string_vianame(I<name>)>.
1069
1070 For the C0 and C1 control characters (U+0000..U+001F, U+0080..U+009F)
1071 there are no official Unicode names but you can use instead the ISO 6429
1072 names (LINE FEED, ESCAPE, and so forth, and their abbreviations, LF,
1073 ESC, ...).  In Unicode 3.2 (as of Perl 5.8) some naming changes took
1074 place, and ISO 6429 was updated, see L</ALIASES>.
1075
1076 If the input name is unknown, C<\N{NAME}> raises a warning and
1077 substitutes the Unicode REPLACEMENT CHARACTER (U+FFFD).
1078
1079 For C<\N{NAME}>, it is a fatal error if C<use bytes> is in effect and the
1080 input name is that of a character that won't fit into a byte (i.e., whose
1081 ordinal is above 255).
1082
1083 Otherwise, any string that includes a C<\N{I<charname>}> or
1084 C<S<\N{U+I<code point>}>> will automatically have Unicode semantics (see
1085 L<perlunicode/Byte and Character Semantics>).
1086
1087 =head1 ALIASES
1088
1089 A few aliases have been defined for convenience: instead of having
1090 to use the official names
1091
1092     LINE FEED (LF)
1093     FORM FEED (FF)
1094     CARRIAGE RETURN (CR)
1095     NEXT LINE (NEL)
1096
1097 (yes, with parentheses), one can use
1098
1099     LINE FEED
1100     FORM FEED
1101     CARRIAGE RETURN
1102     NEXT LINE
1103     LF
1104     FF
1105     CR
1106     NEL
1107
1108 All the other standard abbreviations for the controls, such as C<ACK> for
1109 C<ACKNOWLEDGE> also can be used.
1110
1111 One can also use
1112
1113     BYTE ORDER MARK
1114     BOM
1115
1116 and these abbreviations
1117
1118     Abbreviation        Full Name
1119
1120     CGJ                 COMBINING GRAPHEME JOINER
1121     FVS1                MONGOLIAN FREE VARIATION SELECTOR ONE
1122     FVS2                MONGOLIAN FREE VARIATION SELECTOR TWO
1123     FVS3                MONGOLIAN FREE VARIATION SELECTOR THREE
1124     LRE                 LEFT-TO-RIGHT EMBEDDING
1125     LRM                 LEFT-TO-RIGHT MARK
1126     LRO                 LEFT-TO-RIGHT OVERRIDE
1127     MMSP                MEDIUM MATHEMATICAL SPACE
1128     MVS                 MONGOLIAN VOWEL SEPARATOR
1129     NBSP                NO-BREAK SPACE
1130     NNBSP               NARROW NO-BREAK SPACE
1131     PDF                 POP DIRECTIONAL FORMATTING
1132     RLE                 RIGHT-TO-LEFT EMBEDDING
1133     RLM                 RIGHT-TO-LEFT MARK
1134     RLO                 RIGHT-TO-LEFT OVERRIDE
1135     SHY                 SOFT HYPHEN
1136     VS1                 VARIATION SELECTOR-1
1137     .
1138     .
1139     .
1140     VS256               VARIATION SELECTOR-256
1141     WJ                  WORD JOINER
1142     ZWJ                 ZERO WIDTH JOINER
1143     ZWNJ                ZERO WIDTH NON-JOINER
1144     ZWSP                ZERO WIDTH SPACE
1145
1146 For backward compatibility one can use the old names for
1147 certain C0 and C1 controls
1148
1149     old                         new
1150
1151     FILE SEPARATOR              INFORMATION SEPARATOR FOUR
1152     GROUP SEPARATOR             INFORMATION SEPARATOR THREE
1153     HORIZONTAL TABULATION       CHARACTER TABULATION
1154     HORIZONTAL TABULATION SET   CHARACTER TABULATION SET
1155     HORIZONTAL TABULATION WITH JUSTIFICATION    CHARACTER TABULATION
1156                                                 WITH JUSTIFICATION
1157     PARTIAL LINE DOWN           PARTIAL LINE FORWARD
1158     PARTIAL LINE UP             PARTIAL LINE BACKWARD
1159     RECORD SEPARATOR            INFORMATION SEPARATOR TWO
1160     REVERSE INDEX               REVERSE LINE FEED
1161     UNIT SEPARATOR              INFORMATION SEPARATOR ONE
1162     VERTICAL TABULATION         LINE TABULATION
1163     VERTICAL TABULATION SET     LINE TABULATION SET
1164
1165 but the old names in addition to giving the character
1166 will also give a warning about being deprecated.
1167
1168 And finally, certain published variants are usable, including some for
1169 controls that have no Unicode names:
1170
1171     name                                   character
1172
1173     END OF PROTECTED AREA                  END OF GUARDED AREA, U+0097
1174     HIGH OCTET PRESET                      U+0081
1175     HOP                                    U+0081
1176     IND                                    U+0084
1177     INDEX                                  U+0084
1178     PAD                                    U+0080
1179     PADDING CHARACTER                      U+0080
1180     PRIVATE USE 1                          PRIVATE USE ONE, U+0091
1181     PRIVATE USE 2                          PRIVATE USE TWO, U+0092
1182     SGC                                    U+0099
1183     SINGLE GRAPHIC CHARACTER INTRODUCER    U+0099
1184     SINGLE-SHIFT 2                         SINGLE SHIFT TWO, U+008E
1185     SINGLE-SHIFT 3                         SINGLE SHIFT THREE, U+008F
1186     START OF PROTECTED AREA                START OF GUARDED AREA, U+0096
1187
1188 =head1 CUSTOM ALIASES
1189
1190 You can add customized aliases to standard (C<:full>) Unicode naming
1191 conventions.  The aliases override any standard definitions, so, if
1192 you're twisted enough, you can change C<"\N{LATIN CAPITAL LETTER A}"> to
1193 mean C<"B">, etc.
1194
1195 Note that an alias should not be something that is a legal curly
1196 brace-enclosed quantifier (see L<perlreref/QUANTIFIERS>).  For example
1197 C<\N{123}> means to match 123 non-newline characters, and is not treated as a
1198 charnames alias.  Aliases are discouraged from beginning with anything
1199 other than an alphabetic character and from containing anything other
1200 than alphanumerics, spaces, dashes, parentheses, and underscores.
1201 Currently they must be ASCII.
1202
1203 An alias can map to either an official Unicode character name or to a
1204 numeric code point (ordinal).  The latter is useful for assigning names
1205 to code points in Unicode private use areas such as U+E800 through
1206 U+F8FF.
1207 A numeric code point must be a non-negative integer or a string beginning
1208 with C<"U+"> or C<"0x"> with the remainder considered to be a
1209 hexadecimal integer.  A literal numeric constant must be unsigned; it
1210 will be interpreted as hex if it has a leading zero or contains
1211 non-decimal hex digits; otherwise it will be interpreted as decimal.
1212
1213 Aliases are added either by the use of anonymous hashes:
1214
1215     use charnames ":alias" => {
1216         e_ACUTE => "LATIN SMALL LETTER E WITH ACUTE",
1217         mychar1 => 0xE8000,
1218         };
1219     my $str = "\N{e_ACUTE}";
1220
1221 or by using a file containing aliases:
1222
1223     use charnames ":alias" => "pro";
1224
1225 This will try to read C<"unicore/pro_alias.pl"> from the C<@INC> path. This
1226 file should return a list in plain perl:
1227
1228     (
1229     A_GRAVE         => "LATIN CAPITAL LETTER A WITH GRAVE",
1230     A_CIRCUM        => "LATIN CAPITAL LETTER A WITH CIRCUMFLEX",
1231     A_DIAERES       => "LATIN CAPITAL LETTER A WITH DIAERESIS",
1232     A_TILDE         => "LATIN CAPITAL LETTER A WITH TILDE",
1233     A_BREVE         => "LATIN CAPITAL LETTER A WITH BREVE",
1234     A_RING          => "LATIN CAPITAL LETTER A WITH RING ABOVE",
1235     A_MACRON        => "LATIN CAPITAL LETTER A WITH MACRON",
1236     mychar2         => "U+E8001",
1237     );
1238
1239 Both these methods insert C<":full"> automatically as the first argument (if no
1240 other argument is given), and you can give the C<":full"> explicitly as
1241 well, like
1242
1243     use charnames ":full", ":alias" => "pro";
1244
1245 Also, both these methods currently allow only a single character to be named.
1246 To name a sequence of characters, use a
1247 L<custom translator|/CUSTOM TRANSLATORS> (described below).
1248
1249 =head1 charnames::viacode(I<code>)
1250
1251 Returns the full name of the character indicated by the numeric code.
1252 For example,
1253
1254     print charnames::viacode(0x2722);
1255
1256 prints "FOUR TEARDROP-SPOKED ASTERISK".
1257
1258 The name returned is the official name for the code point, if
1259 available; otherwise your custom alias for it.  This means that your
1260 alias will only be returned for code points that don't have an official
1261 Unicode name (nor Unicode version 1 name), such as private use code
1262 points, and the 4 control characters U+0080, U+0081, U+0084, and U+0099.
1263 If you define more than one name for the code point, it is indeterminate
1264 which one will be returned.
1265
1266 The function returns C<undef> if no name is known for the code point.
1267 In Unicode the proper name of these is the empty string, which
1268 C<undef> stringifies to.  (If you ask for a code point past the legal
1269 Unicode maximum of U+10FFFF that you haven't assigned an alias to, you
1270 get C<undef> plus a warning.)
1271
1272 The input number must be a non-negative integer or a string beginning
1273 with C<"U+"> or C<"0x"> with the remainder considered to be a
1274 hexadecimal integer.  A literal numeric constant must be unsigned; it
1275 will be interpreted as hex if it has a leading zero or contains
1276 non-decimal hex digits; otherwise it will be interpreted as decimal.
1277
1278 Notice that the name returned for of U+FEFF is "ZERO WIDTH NO-BREAK
1279 SPACE", not "BYTE ORDER MARK".
1280
1281 =head1 charnames::string_vianame(I<name>)
1282
1283 This is a runtime equivalent to C<\N{...}>.  I<name> can be any expression
1284 that evaluates to a name accepted by C<\N{...}> under the L<C<:full>
1285 option|/DESCRIPTION> to C<charnames>.  In addition, any other options for the
1286 controlling C<"use charnames"> in the same scope apply, like any L<script
1287 list, C<:short> option|/DESCRIPTION>, or L<custom aliases|/CUSTOM ALIASES> you
1288 may have defined.
1289
1290 The only difference is that if the input name is unknown, C<string_vianame>
1291 returns C<undef> instead of the REPLACEMENT CHARACTER and does not raise a
1292 warning message.
1293
1294 =head1 charnames::vianame(I<name>)
1295
1296 This is similar to C<string_vianame>.  The main difference is that under most
1297 circumstances (see L</BUGS> for the others), vianame returns an ordinal code
1298 point, whereas C<string_vianame> returns a string.  For example,
1299
1300    printf "U+%04X", charnames::vianame("FOUR TEARDROP-SPOKED ASTERISK");
1301
1302 prints "U+2722".
1303
1304 This leads to the other two differences.  Since a single code point is
1305 returned, the function can't handle named character sequences, as these are
1306 composed of multiple characters.  And, the code point can be that of any
1307 character, even ones that aren't legal under the C<S<use bytes>> pragma,
1308
1309 =head1 CUSTOM TRANSLATORS
1310
1311 The mechanism of translation of C<\N{...}> escapes is general and not
1312 hardwired into F<charnames.pm>.  A module can install custom
1313 translations (inside the scope which C<use>s the module) with the
1314 following magic incantation:
1315
1316     sub import {
1317         shift;
1318         $^H{charnames} = \&translator;
1319     }
1320
1321 Here translator() is a subroutine which takes I<CHARNAME> as an
1322 argument, and returns text to insert into the string instead of the
1323 C<\N{I<CHARNAME>}> escape.  Since the text to insert should be different
1324 in C<bytes> mode and out of it, the function should check the current
1325 state of C<bytes>-flag as in:
1326
1327     use bytes ();                      # for $bytes::hint_bits
1328     sub translator {
1329         if ($^H & $bytes::hint_bits) {
1330             return bytes_translator(@_);
1331         }
1332         else {
1333             return utf8_translator(@_);
1334         }
1335     }
1336
1337 See L</CUSTOM ALIASES> above for restrictions on I<CHARNAME>.
1338
1339 Of course, C<vianame> and C<viacode> would need to be overridden as
1340 well.
1341
1342 =head1 BUGS
1343
1344 vianame normally returns an ordinal code point, but when the input name is of
1345 the form C<U+...>, it returns a chr instead.  In this case, if C<use bytes> is
1346 in effect and the character won't fit into a byte, it returns C<undef> and
1347 raises a warning.
1348
1349 Names must be ASCII characters only, which means that you are out of luck if
1350 you want to create aliases in a language where some or all the characters of
1351 the desired aliases are non-ASCII.
1352
1353 Since evaluation of the translation function (see L</CUSTOM
1354 TRANSLATORS>) happens in the middle of compilation (of a string
1355 literal), the translation function should not do any C<eval>s or
1356 C<require>s.  This restriction should be lifted (but is low priority) in
1357 a future version of Perl.
1358
1359 =cut
1360
1361 # ex: set ts=8 sts=2 sw=2 et: