Mercurial > repo
comparison interps/clc-intercal/CLC-INTERCAL-Base-1.-94.-2/INTERCAL/Charset/Baudot.pm @ 996:859f9b4339e6
<Gregor> tar xf egobot.tar.xz
author | HackBot |
---|---|
date | Sun, 09 Dec 2012 19:30:08 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
995:6883f5911eb7 | 996:859f9b4339e6 |
---|---|
1 package Language::INTERCAL::Charset::Baudot; | |
2 | |
3 # Convert between Baudot and ASCII | |
4 | |
5 # This file is part of CLC-INTERCAL. | |
6 | |
7 # Copyright (C) 1999, 2000, 2002, 2006-2008 Claudio Calvelli, all rights reserved | |
8 | |
9 # CLC-INTERCAL is copyrighted software. However, permission to use, modify, | |
10 # and distribute it is granted provided that the conditions set out in the | |
11 # licence agreement are met. See files README and COPYING in the distribution. | |
12 | |
13 use strict; | |
14 use vars qw($VERSION $PERVERSION); | |
15 ($VERSION) = ($PERVERSION = "CLC-INTERCAL/Base INTERCAL/Charset/Baudot.pm 1.-94.-2") =~ /\s(\S+)$/; | |
16 | |
17 use Carp; | |
18 use Language::INTERCAL::Exporter '1.-94.-2'; | |
19 use Language::INTERCAL::Splats '1.-94.-2', qw(:SP); | |
20 use vars qw(@EXPORT @EXPORT_OK); | |
21 @EXPORT = (); | |
22 @EXPORT_OK = qw(ascii2baudot baudot2ascii); | |
23 | |
24 my @charset = ( | |
25 "\000E\nA SIU\rDRJNFCKTZWLHYPQOBG2MXV1", | |
26 "\000e\na siu\rdrjnfcktzwlhypqobg2mxv1", | |
27 "\0003\n- \a87\r\$4',!:(5\")2 6019?&3./;0", | |
28 "\000\242\n+\t\\#=\r*{~\245|^<[}>]\b@\253\243\254\377\2613%_\2730", | |
29 ); | |
30 | |
31 my $charset = join('', map { "\000" . substr($_, 1, 26) . | |
32 "\000" . substr($_, 28, 3) . "\000" } | |
33 @charset); | |
34 push @charset, ''; | |
35 | |
36 sub baudot2ascii { | |
37 @_ == 1 or croak "Usage: baudot2ascii(STRING)"; | |
38 my $string = shift; | |
39 my $set = 0; | |
40 my $result = ''; | |
41 while ($string ne '') { | |
42 my $chr = ord($string) & 037; | |
43 $string = substr($string, 1); | |
44 if ($chr == 033 || $chr == 037) { | |
45 $set = ord(substr($charset[$set], $chr, 1)) & 03; | |
46 } else { | |
47 $result .= substr($charset[$set], $chr, 1); | |
48 } | |
49 } | |
50 $result; | |
51 } | |
52 | |
53 sub ascii2baudot { | |
54 @_ == 1 or @_ == 2 or croak "Usage: ascii2baudot(STRING)"; | |
55 my $string = shift; | |
56 my $faint = @_ ? shift : 1; | |
57 my $set = 4; | |
58 my $result = ''; | |
59 while ($string ne '') { | |
60 my $chr = substr($string, 0, 1); | |
61 $string = substr($string, 1); | |
62 my $pos = index($charset[$set], $chr); | |
63 if ($pos < 0 || $pos == 033 || $pos == 037) { | |
64 $pos = index($charset, $chr); | |
65 if ($pos < 0 || $chr eq "\000") { | |
66 faint(SP_NOSUCHCHAR, ord($chr), "Baudot") if $faint; | |
67 $string = sprintf("\\%03o", ord($chr)) . $string; | |
68 next; | |
69 } | |
70 my $s = $pos >> 5; | |
71 $pos = $pos & 037; | |
72 if ($set > 3) { | |
73 $result .= ['[_', '__', '_[', '[[']->[$s]; | |
74 } else { | |
75 $result .= ['', '_', '[', '[[', | |
76 '[_', '', '[', '[[', | |
77 '_', '__', '', '[[', | |
78 '_', '__', '_[', '', | |
79 ]->[($set << 2) | $s]; | |
80 } | |
81 $set = $s; | |
82 } | |
83 $result .= sprintf("%c", 0x40 + $pos); | |
84 } | |
85 $result; | |
86 } | |
87 | |
88 1; | |
89 | |
90 __END__ | |
91 | |
92 =head1 NAME | |
93 | |
94 Charset::Baudot - allows to use Baudot string constants in ASCII programs (and v.v.) | |
95 | |
96 =head1 SYNOPSIS | |
97 | |
98 use Charset::Baudot 'baudot2ascii'; | |
99 | |
100 my $a = baudot2ascii"(Baudot text)"; | |
101 | |
102 =head1 DESCRIPTION | |
103 | |
104 I<Charset::Baudot> defines functions to convert between a subset of ASCII and a | |
105 subset of nonstandard Baudot - the original Baudot allows only letters, | |
106 numbers, and some punctuation. We assume that a "Shift to letters" code | |
107 while already in letters mode means "Shift to lowercase" and "Shift to | |
108 figures" while already in figures mode means "Shift to symbols". This allows | |
109 to use up to 120 characters. However, for simplicity some characters are | |
110 available in multiple sets, so the total is less than that. | |
111 | |
112 Two functions, I<baudot2ascii> and I<ascii2baudot>, are exportable (but | |
113 not exported by default). They do the obvious thing to their first argument | |
114 and return the transformed string. | |
115 | |
116 =head1 BAUDOT CHARACTER TABLE | |
117 | |
118 The following are the characters recognised. As described, the "shift" | |
119 characters have nonstandard meaning. | |
120 | |
121 set Letters Lowercase Figures Symbols | |
122 code | |
123 00 N/A N/A N/A N/A | |
124 01 E e 3 Cents | |
125 02 L/F L/F L/F L/F (line feed) | |
126 03 A a - + | |
127 04 Space Space Space Tab | |
128 05 S s BELL \ | |
129 06 I i 8 # | |
130 07 U u 7 = | |
131 08 C/R C/R C/R C/R (carriage return) | |
132 09 D d $ * | |
133 10 R r 4 { | |
134 11 J j ' ~ | |
135 12 N n , XOR | |
136 13 F f ! | | |
137 14 C c : ^ | |
138 15 K k ( < | |
139 16 T t 5 [ | |
140 17 Z z " } | |
141 18 W w ) > | |
142 19 L l 2 ] | |
143 20 H h N/A backspace | |
144 21 Y y 6 @ | |
145 22 P p 0 N/A | |
146 23 Q q 1 POUND | |
147 24 O o 9 NOT | |
148 25 B b ? delete | |
149 26 G g & N/A | |
150 27 Figures Figures Symbols Symbols | |
151 28 M m . % | |
152 29 X x / _ | |
153 30 V v ; N/A | |
154 31 Lowercase Lowercase Letters Letters | |
155 | |
156 =head1 COPYRIGHT | |
157 | |
158 This module is part of CLC-INTERCAL. | |
159 | |
160 Copyright (C) 1999, 2000, 2002, 2006, 2007 Claudio Calvelli, all rights reserved | |
161 | |
162 See files README and COPYING in the distribution for information. | |
163 | |
164 =head1 SEE ALSO | |
165 | |
166 A qualified psychiatrist. | |
167 |