line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
# |
2
|
|
|
|
|
|
|
# bibliography package for Perl |
3
|
|
|
|
|
|
|
# |
4
|
|
|
|
|
|
|
# Character set common variables and routines |
5
|
|
|
|
|
|
|
# |
6
|
|
|
|
|
|
|
# Dana Jacobsen (dana@acm.org) |
7
|
|
|
|
|
|
|
# 18 November 1995 (last modified 17 March 1996) |
8
|
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
# for bib'nocharset which calls fromcanon: |
10
|
|
|
|
|
|
|
require "bp-cs-none.pl"; |
11
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
###### |
13
|
|
|
|
|
|
|
# |
14
|
|
|
|
|
|
|
# Return canonical character for a unicode hex string. |
15
|
|
|
|
|
|
|
# |
16
|
|
|
|
|
|
|
sub unicode_to_canon { |
17
|
262
|
|
|
262
|
|
447
|
local($hex) = @_; |
18
|
|
|
|
|
|
|
|
19
|
262
|
|
|
|
|
440
|
$hex =~ tr/a-f/A-F/; |
20
|
|
|
|
|
|
|
|
21
|
|
|
|
|
|
|
# XXXXX Should we prepend '0' characters if we don't have 4 digits? |
22
|
262
|
50
|
|
|
|
800
|
if ($hex !~ /^[\dA-F]{4}$/) { |
23
|
0
|
|
|
|
|
0
|
&bib'gotwarn("Invalid Unicode character: $hex"); |
24
|
0
|
|
|
|
|
0
|
return ''; |
25
|
|
|
|
|
|
|
} |
26
|
262
|
100
|
|
|
|
734
|
if ($hex =~ /00(..)/) { |
27
|
188
|
|
|
|
|
718
|
return pack("C", hex($1)); |
28
|
|
|
|
|
|
|
} |
29
|
74
|
|
|
|
|
208
|
return $bib'cs_ext . $hex; |
30
|
|
|
|
|
|
|
} |
31
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
|
sub canon_to_unicode { |
33
|
0
|
|
|
0
|
|
0
|
local($can) = @_; |
34
|
0
|
|
|
|
|
0
|
local($hex); |
35
|
|
|
|
|
|
|
|
36
|
0
|
0
|
|
|
|
0
|
if (length($can) == 1) { |
37
|
0
|
|
|
|
|
0
|
$hex = sprintf("%2lx", ord($can)); |
38
|
0
|
|
|
|
|
0
|
$hex =~ tr/a-f /A-F0/; |
39
|
0
|
|
|
|
|
0
|
return( '00' . $hex ); |
40
|
|
|
|
|
|
|
} |
41
|
0
|
0
|
|
|
|
0
|
if ($can =~ /$bib'cs_ext(....)/) { |
42
|
0
|
|
|
|
|
0
|
$hex = $1; |
43
|
0
|
|
|
|
|
0
|
$hex =~ tr/a-f/A-F/; |
44
|
0
|
|
|
|
|
0
|
return $hex; |
45
|
|
|
|
|
|
|
} |
46
|
0
|
0
|
|
|
|
0
|
if ($can eq $bib'cs_char_escape) { |
47
|
0
|
|
|
|
|
0
|
return &bib'canon_to_unicode($bib'cs_escape); |
48
|
|
|
|
|
|
|
} |
49
|
0
|
|
|
|
|
0
|
return &bib'gotwarn("Can't convert $can to Unicode"); |
50
|
|
|
|
|
|
|
} |
51
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
sub decimal_to_unicode { |
53
|
0
|
|
|
0
|
|
0
|
local($num) = @_; |
54
|
0
|
|
|
|
|
0
|
local($hex); |
55
|
|
|
|
|
|
|
|
56
|
0
|
0
|
|
|
|
0
|
if ($num < 256) { |
|
|
0
|
|
|
|
|
|
57
|
0
|
|
|
|
|
0
|
$hex = sprintf("00%2lx", $num); |
58
|
|
|
|
|
|
|
} elsif ($num < 65536) { |
59
|
0
|
|
|
|
|
0
|
local($div) = $num / 256; |
60
|
0
|
|
|
|
|
0
|
local($high) = int($div); |
61
|
0
|
|
|
|
|
0
|
local($low) = 256 * ($div - $high); |
62
|
0
|
|
|
|
|
0
|
$hex = sprintf("%2lx%2lx", $high, $low); |
63
|
|
|
|
|
|
|
} else { |
64
|
0
|
|
|
|
|
0
|
return &bib'gotwarn("Illegal number $num given to decimal_to_unicode"); |
65
|
|
|
|
|
|
|
} |
66
|
0
|
|
|
|
|
0
|
$hex =~ tr/a-f /A-F0/; |
67
|
0
|
|
|
|
|
0
|
$hex; |
68
|
|
|
|
|
|
|
} |
69
|
|
|
|
|
|
|
|
70
|
|
|
|
|
|
|
sub unicode_to_decimal { |
71
|
0
|
|
|
0
|
|
0
|
local($uni) = @_; |
72
|
|
|
|
|
|
|
|
73
|
0
|
0
|
|
|
|
0
|
return &bib'gotwarn("Illegal unicode length: $uni") unless length($uni) == 4; |
74
|
0
|
0
|
|
|
|
0
|
return &bib'gotwarn("Illegal unicode string: $uni") if $uni =~ /[^\da-fA-F]/; |
75
|
|
|
|
|
|
|
|
76
|
0
|
|
|
|
|
0
|
hex($uni); |
77
|
|
|
|
|
|
|
} |
78
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
sub unicode_name { |
80
|
0
|
|
|
0
|
|
0
|
local($hex) = @_; |
81
|
0
|
|
|
|
|
0
|
local($name); |
82
|
|
|
|
|
|
|
|
83
|
|
|
|
|
|
|
# For now, just print hex value |
84
|
0
|
|
|
|
|
0
|
$name = "Unicode '$hex'"; |
85
|
0
|
|
|
|
|
0
|
$name; |
86
|
|
|
|
|
|
|
} |
87
|
|
|
|
|
|
|
|
88
|
|
|
|
|
|
|
sub meta_name { |
89
|
0
|
|
|
0
|
|
0
|
local($hex) = @_; |
90
|
0
|
|
|
|
|
0
|
local($name); |
91
|
|
|
|
|
|
|
|
92
|
|
|
|
|
|
|
# For now, just print hex value |
93
|
0
|
|
|
|
|
0
|
$name = "Meta '$hex'"; |
94
|
0
|
|
|
|
|
0
|
$name; |
95
|
|
|
|
|
|
|
} |
96
|
|
|
|
|
|
|
|
97
|
|
|
|
|
|
|
# Oh boy, this is getting really complicated. |
98
|
|
|
|
|
|
|
# |
99
|
|
|
|
|
|
|
# We have an approx table set up, which says that one can approximate XXXX |
100
|
|
|
|
|
|
|
# by YYYY, where presumably YYYY is easier. There shouldn't be any loops, |
101
|
|
|
|
|
|
|
# so programs can recurse through the table. |
102
|
|
|
|
|
|
|
# |
103
|
|
|
|
|
|
|
# That's for the meta codes. For the unicode approx, we just have a |
104
|
|
|
|
|
|
|
# string. This allows multiple character approximations. |
105
|
|
|
|
|
|
|
# |
106
|
|
|
|
|
|
|
# XXXXX Think about C3's idea of multiple approximations. |
107
|
|
|
|
|
|
|
# |
108
|
|
|
|
|
|
|
# A map of 0000 means that it maps to the null string -- our "approximation" |
109
|
|
|
|
|
|
|
# is to get rid of it. This is what we can do if it isn't terribly harmful |
110
|
|
|
|
|
|
|
# to remove it. |
111
|
|
|
|
|
|
|
|
112
|
|
|
|
|
|
|
sub meta_approx { |
113
|
12
|
|
|
12
|
|
29
|
local($orig) = @_; |
114
|
|
|
|
|
|
|
|
115
|
12
|
100
|
|
|
|
2384
|
require "${glb_bpprefix}p-cstab.pl" unless defined %bib'mapprox_tab; |
116
|
|
|
|
|
|
|
|
117
|
12
|
50
|
|
|
|
47
|
if (defined $mapprox_tab{$orig}) { |
118
|
12
|
50
|
|
|
|
55
|
return '' if $mapprox_tab{$orig} eq '0000'; |
119
|
0
|
|
|
|
|
|
return "${bib'cs_meta}$mapprox_tab{$orig}"; |
120
|
|
|
|
|
|
|
} |
121
|
0
|
|
|
|
|
|
undef; |
122
|
|
|
|
|
|
|
} |
123
|
|
|
|
|
|
|
|
124
|
|
|
|
|
|
|
sub unicode_approx { |
125
|
0
|
|
|
0
|
|
|
local($orig) = @_; |
126
|
|
|
|
|
|
|
|
127
|
|
|
|
|
|
|
# XXXXX Should we warn them that they're getting an approx? |
128
|
|
|
|
|
|
|
|
129
|
0
|
0
|
|
|
|
|
require "${glb_bpprefix}p-cstab.pl" unless defined %bib'uapprox_tab; |
130
|
|
|
|
|
|
|
|
131
|
0
|
|
|
|
|
|
$uapprox_tab{$orig}; |
132
|
|
|
|
|
|
|
} |
133
|
|
|
|
|
|
|
|
134
|
|
|
|
|
|
|
###### |
135
|
|
|
|
|
|
|
# |
136
|
|
|
|
|
|
|
# Font change checker. Verifies and tries to correct font changes. |
137
|
|
|
|
|
|
|
# |
138
|
|
|
|
|
|
|
# After fonts are converted in your tocanon routine, call this. In your |
139
|
|
|
|
|
|
|
# fromcanon routine, you can assume this has been called. |
140
|
|
|
|
|
|
|
# |
141
|
|
|
|
|
|
|
# XXXXX Should we call this in bp.pl's conversion routines? That would |
142
|
|
|
|
|
|
|
# guarantee that it has been run. Right now, we let each module |
143
|
|
|
|
|
|
|
# decide when and if it needs to be run. |
144
|
|
|
|
|
|
|
# |
145
|
|
|
|
|
|
|
# It takes a string that has font changes in it and makes sure they always |
146
|
|
|
|
|
|
|
# match up and that there isn't an odd number (more starts than ends, more |
147
|
|
|
|
|
|
|
# ends than starts). |
148
|
|
|
|
|
|
|
# |
149
|
|
|
|
|
|
|
|
150
|
|
|
|
|
|
|
sub font_check { |
151
|
0
|
|
|
0
|
|
|
local($_) = @_; |
152
|
|
|
|
|
|
|
|
153
|
|
|
|
|
|
|
# XXXXX Ought to read meta information from 00 or as input. |
154
|
0
|
0
|
|
|
|
|
return $_ unless /${bib'cs_meta}01[01]/; |
155
|
|
|
|
|
|
|
|
156
|
0
|
|
|
|
|
|
local(@fontstack) = (); |
157
|
0
|
|
|
|
|
|
local($fontsmatch, $font, $pfont); |
158
|
|
|
|
|
|
|
|
159
|
|
|
|
|
|
|
# Check for this special occurance: They don't have end fonts (or don't |
160
|
|
|
|
|
|
|
# use them). They just make everything a begin font (troff often does this). |
161
|
|
|
|
|
|
|
# Solution: Try to fix it up by replacing each begin after the first with |
162
|
|
|
|
|
|
|
# an endprevious / begin pair. Then remove the last begin. |
163
|
0
|
0
|
|
|
|
|
if (!/${bib'cs_meta}011/) { |
164
|
0
|
|
|
|
|
|
local($pos) = $[; |
165
|
0
|
|
|
|
|
|
local($lpos) = 0; |
166
|
0
|
|
|
|
|
|
local($distance) = length($bib'cs_meta) + 3; |
167
|
0
|
|
|
|
|
|
local($n) = 0; |
168
|
0
|
|
|
|
|
|
while (($pos = index($_, "${bib'cs_meta}010", $pos)) >= $[) { |
169
|
0
|
|
|
|
|
|
$n++; |
170
|
0
|
0
|
|
|
|
|
if ($n == 1) { |
171
|
0
|
|
|
|
|
|
$lpos = $pos; |
172
|
0
|
|
|
|
|
|
$pfont = substr($_, $pos + $distance, 1); |
173
|
0
|
|
|
|
|
|
$pos++; |
174
|
0
|
|
|
|
|
|
next; |
175
|
|
|
|
|
|
|
} |
176
|
0
|
|
|
|
|
|
$lpos = $pos; |
177
|
0
|
|
|
|
|
|
$font = substr($_, $pos + $distance, 1); |
178
|
0
|
|
|
|
|
|
substr($_, $pos, 0) = "${bib'cs_meta}0110"; |
179
|
0
|
|
|
|
|
|
$pos += ($distance*2); # need to skip over the one we just put in. |
180
|
|
|
|
|
|
|
} |
181
|
0
|
0
|
|
|
|
|
if ($n > 1) { |
|
|
0
|
|
|
|
|
|
182
|
|
|
|
|
|
|
# now remove the last begin |
183
|
0
|
|
|
|
|
|
substr($_, $lpos + $distance + 1, $distance + 1) = ''; |
184
|
|
|
|
|
|
|
} elsif ($n == 1) { |
185
|
|
|
|
|
|
|
# only one begin? Add a previous to the end. |
186
|
0
|
|
|
|
|
|
$_ .= "${bib'cs_meta}0110"; |
187
|
|
|
|
|
|
|
} else { |
188
|
0
|
|
|
|
|
|
&panic("Bug in font_check, file bp-p-cs."); |
189
|
|
|
|
|
|
|
} |
190
|
|
|
|
|
|
|
#print STDERR "F: end of troff: $_\n"; |
191
|
|
|
|
|
|
|
# XXXXX XXF return $_; |
192
|
|
|
|
|
|
|
} |
193
|
|
|
|
|
|
|
|
194
|
0
|
|
|
|
|
|
do { |
195
|
|
|
|
|
|
|
# We assume that everything is ok until something goes wrong. |
196
|
0
|
|
|
|
|
|
$fontsmatch = 1; |
197
|
0
|
|
|
|
|
|
while (/${bib'cs_meta}01(.)(.)/g) { |
198
|
0
|
|
|
|
|
|
$font = $2; |
199
|
0
|
0
|
|
|
|
|
if ($1 eq '0') { # font begin |
200
|
|
|
|
|
|
|
#print STDERR "F: check begin font $font\n"; |
201
|
0
|
0
|
|
|
|
|
if ($font eq '0') { |
202
|
0
|
|
|
|
|
|
&bib'gotwarn("Someone used default font begin. Naughty."); |
203
|
0
|
|
|
|
|
|
s/${bib'cs_meta}0100/${bib'cs_meta}0110/go; |
204
|
0
|
|
|
|
|
|
$fontsmatch = 0; |
205
|
0
|
|
|
|
|
|
last; |
206
|
|
|
|
|
|
|
} |
207
|
0
|
|
|
|
|
|
push(@fontstack, $font); |
208
|
|
|
|
|
|
|
} else { # font end |
209
|
|
|
|
|
|
|
#print STDERR "F: check end font $font\n"; |
210
|
0
|
0
|
|
|
|
|
if (@fontstack) { |
211
|
0
|
|
|
|
|
|
$pfont = pop(@fontstack); |
212
|
0
|
0
|
|
|
|
|
next if $font eq '0'; # previous font. We don't care what it was. |
213
|
0
|
0
|
|
|
|
|
if ($pfont ne $font) { |
214
|
|
|
|
|
|
|
# _____ ended font that wasn't equal to the last begin |
215
|
0
|
|
|
|
|
|
&bib'gotwarn("Nesting problem. Ended $font after $pfont"); |
216
|
|
|
|
|
|
|
# just make it end the previous one. |
217
|
0
|
0
|
|
|
|
|
if ($] >= 5.000) { |
218
|
0
|
|
|
|
|
|
s/(${bib'cs_meta}010$pfont)(.*?)${bib'cs_meta}011$font/$1$2{bib'cs_meta}011$pfont/; |
219
|
|
|
|
|
|
|
} else { |
220
|
0
|
|
|
|
|
|
s/(${bib'cs_meta}010$pfont)(.*)${bib'cs_meta}011$font/$1$2{bib'cs_meta}011$pfont/; |
221
|
|
|
|
|
|
|
} |
222
|
0
|
|
|
|
|
|
$fontsmatch = 0; |
223
|
0
|
|
|
|
|
|
last; |
224
|
|
|
|
|
|
|
} |
225
|
|
|
|
|
|
|
} else { |
226
|
|
|
|
|
|
|
# _____ end font used without a begin |
227
|
0
|
|
|
|
|
|
&bib'gotwarn("Ended font $font before begin seen"); |
228
|
|
|
|
|
|
|
# This is really lousy, but without pulling the whole string apart, |
229
|
|
|
|
|
|
|
# I can't do it properly. |
230
|
|
|
|
|
|
|
# XXXXX Perhaps we should be pulling it apart with split? |
231
|
0
|
|
|
|
|
|
s/${bib'cs_meta}011$font//; |
232
|
0
|
|
|
|
|
|
$fontsmatch = 0; |
233
|
0
|
|
|
|
|
|
last; |
234
|
|
|
|
|
|
|
} |
235
|
|
|
|
|
|
|
} |
236
|
|
|
|
|
|
|
# .last statement of while |
237
|
|
|
|
|
|
|
} |
238
|
0
|
0
|
0
|
|
|
|
if ( $fontsmatch && (@fontstack != 0) ) { |
239
|
|
|
|
|
|
|
# _____ too many begins |
240
|
|
|
|
|
|
|
|
241
|
|
|
|
|
|
|
# XXXXX Is this loop needed, since we did this above? |
242
|
|
|
|
|
|
|
# Try the simple case: They think roman is the default font, and begin |
243
|
|
|
|
|
|
|
# it instead of ending their own. We'll treat this as a misunderstanding |
244
|
|
|
|
|
|
|
# and won't create a warning. |
245
|
0
|
|
0
|
|
|
|
while ( (@fontstack != 0) |
|
|
|
0
|
|
|
|
|
246
|
|
|
|
|
|
|
&& (@fontstack % 2 == 0) |
247
|
|
|
|
|
|
|
&& ($fontstack[$#fontstack] eq '1') ) { |
248
|
0
|
|
|
|
|
|
$pfont = pop(@fontstack); |
249
|
0
|
|
|
|
|
|
$pfont = pop(@fontstack); |
250
|
|
|
|
|
|
|
#print STDERR "F: Too many begins found roman & replacing with $pfont\n"; |
251
|
0
|
0
|
|
|
|
|
if ($] >= 5.000) { |
252
|
0
|
|
|
|
|
|
s/(${bib'cs_meta}010$pfont)(.*?)${bib'cs_meta}0111/$1$2{bib'cs_meta}011$pfont/; |
253
|
|
|
|
|
|
|
} else { |
254
|
0
|
|
|
|
|
|
s/(${bib'cs_meta}010$pfont)(.*)${bib'cs_meta}0111/$1$2{bib'cs_meta}011$pfont/; |
255
|
|
|
|
|
|
|
} |
256
|
|
|
|
|
|
|
} |
257
|
0
|
|
|
|
|
|
while (@fontstack != 0) { |
258
|
0
|
|
|
|
|
|
$pfont = pop(@fontstack); |
259
|
0
|
|
|
|
|
|
&bib'gotwarn("Began font $pfont, but never ended it!"); |
260
|
|
|
|
|
|
|
# just end them in order. |
261
|
|
|
|
|
|
|
# XXXXX Should we use previous? Doesn't seem to matter. |
262
|
0
|
|
|
|
|
|
$_ .= "${bib'cs_meta}011$pfont"; |
263
|
|
|
|
|
|
|
} |
264
|
|
|
|
|
|
|
# Yes, $fontsmatch should be 0 at the end. We want one more pass through |
265
|
|
|
|
|
|
|
# to validate the ordering. Our search and replace routines very well |
266
|
|
|
|
|
|
|
# may find the wrong item! |
267
|
0
|
|
|
|
|
|
$fontsmatch = 0; |
268
|
|
|
|
|
|
|
# .last statement of if too many begins |
269
|
|
|
|
|
|
|
} |
270
|
|
|
|
|
|
|
} until $fontsmatch; |
271
|
|
|
|
|
|
|
|
272
|
0
|
|
|
|
|
|
$_; |
273
|
|
|
|
|
|
|
} |
274
|
|
|
|
|
|
|
|
275
|
|
|
|
|
|
|
###### |
276
|
|
|
|
|
|
|
# |
277
|
|
|
|
|
|
|
# This routine removes references to "font-previous" for those routines |
278
|
|
|
|
|
|
|
# that don't support that notation. For instance, while troff has the |
279
|
|
|
|
|
|
|
# \fP command, and TeX uses {\it foo}, HTML doesn't understand this. It |
280
|
|
|
|
|
|
|
# needs a matching for every . So this routine will turn all |
281
|
|
|
|
|
|
|
# references to the previous font into a "font-xxx-off" command. |
282
|
|
|
|
|
|
|
# |
283
|
|
|
|
|
|
|
# We assume that the string has been run through font_check already. |
284
|
|
|
|
|
|
|
# Since this is called in a cs's fromcanon routine, that should be true. |
285
|
|
|
|
|
|
|
# |
286
|
|
|
|
|
|
|
sub font_noprev { |
287
|
0
|
|
|
0
|
|
|
local($val) = @_; |
288
|
0
|
|
|
|
|
|
local(@sval, @fontstack); |
289
|
0
|
|
|
|
|
|
local($font, $pfont); |
290
|
0
|
|
|
|
|
|
local($ret) = ''; |
291
|
|
|
|
|
|
|
|
292
|
0
|
0
|
|
|
|
|
return $val unless $val =~ /${bib'cs_meta}01/; |
293
|
|
|
|
|
|
|
|
294
|
0
|
|
|
|
|
|
@sval = split(/${bib'cs_meta}01([01].)/, $val); |
295
|
0
|
|
|
|
|
|
while (@sval) { |
296
|
0
|
|
|
|
|
|
$ret .= shift @sval; |
297
|
0
|
0
|
|
|
|
|
if (@sval) { |
298
|
0
|
|
|
|
|
|
$font = shift @sval; |
299
|
0
|
0
|
|
|
|
|
if ($font =~ /^0/) { |
300
|
|
|
|
|
|
|
# font begin |
301
|
0
|
|
|
|
|
|
push(@fontstack, $font); |
302
|
|
|
|
|
|
|
} else { |
303
|
0
|
|
|
|
|
|
$pfont = pop @fontstack; |
304
|
0
|
0
|
|
|
|
|
if ($font =~ /^10/) { |
305
|
0
|
|
|
|
|
|
$font = $pfont; |
306
|
0
|
|
|
|
|
|
$font =~ s/^0/1/; |
307
|
|
|
|
|
|
|
} else { |
308
|
0
|
0
|
|
|
|
|
if (substr($font, 1, 1) ne substr($pfont, 1, 1)) { |
309
|
0
|
|
|
|
|
|
&bib'gotwarn("Nesting problem in noprev. Ended $font after $pfont"); |
310
|
|
|
|
|
|
|
} |
311
|
|
|
|
|
|
|
} |
312
|
|
|
|
|
|
|
} |
313
|
0
|
|
|
|
|
|
$ret .= "${bib'cs_meta}01$font"; |
314
|
|
|
|
|
|
|
} |
315
|
|
|
|
|
|
|
} |
316
|
0
|
|
|
|
|
|
$ret; |
317
|
|
|
|
|
|
|
} |
318
|
|
|
|
|
|
|
|
319
|
|
|
|
|
|
|
|
320
|
|
|
|
|
|
|
###### |
321
|
|
|
|
|
|
|
# |
322
|
|
|
|
|
|
|
# This should strip off any special characters and replace them with either |
323
|
|
|
|
|
|
|
# a simple form, or delete them. This will return ASCII text only, which |
324
|
|
|
|
|
|
|
# is also equivilant to the 7 bit subset of ISO-8859-1. |
325
|
|
|
|
|
|
|
# |
326
|
|
|
|
|
|
|
# XXXXX I've tentatively decided that the actual code for this belongs in |
327
|
|
|
|
|
|
|
# cs-none. The problem is that we then must load that file before |
328
|
|
|
|
|
|
|
# running anything. It's a small file though. |
329
|
|
|
|
|
|
|
# It should be required at the top of this file, so it's always loaded. |
330
|
|
|
|
|
|
|
# |
331
|
|
|
|
|
|
|
sub nocharset { |
332
|
0
|
|
|
0
|
|
|
&bp_cs_none'fromcanon(@_); |
333
|
|
|
|
|
|
|
} |
334
|
|
|
|
|
|
|
|
335
|
|
|
|
|
|
|
1; |