Mercurial > repo
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/interps/clc-intercal/CLC-INTERCAL-Base-1.-94.-2/INTERCAL/Charset/Baudot.pm Sun Dec 09 19:30:08 2012 +0000 @@ -0,0 +1,167 @@ +package Language::INTERCAL::Charset::Baudot; + +# Convert between Baudot and ASCII + +# This file is part of CLC-INTERCAL. + +# Copyright (C) 1999, 2000, 2002, 2006-2008 Claudio Calvelli, all rights reserved + +# CLC-INTERCAL is copyrighted software. However, permission to use, modify, +# and distribute it is granted provided that the conditions set out in the +# licence agreement are met. See files README and COPYING in the distribution. + +use strict; +use vars qw($VERSION $PERVERSION); +($VERSION) = ($PERVERSION = "CLC-INTERCAL/Base INTERCAL/Charset/Baudot.pm 1.-94.-2") =~ /\s(\S+)$/; + +use Carp; +use Language::INTERCAL::Exporter '1.-94.-2'; +use Language::INTERCAL::Splats '1.-94.-2', qw(:SP); +use vars qw(@EXPORT @EXPORT_OK); +@EXPORT = (); +@EXPORT_OK = qw(ascii2baudot baudot2ascii); + +my @charset = ( + "\000E\nA SIU\rDRJNFCKTZWLHYPQOBG2MXV1", + "\000e\na siu\rdrjnfcktzwlhypqobg2mxv1", + "\0003\n- \a87\r\$4',!:(5\")2 6019?&3./;0", + "\000\242\n+\t\\#=\r*{~\245|^<[}>]\b@\253\243\254\377\2613%_\2730", +); + +my $charset = join('', map { "\000" . substr($_, 1, 26) . + "\000" . substr($_, 28, 3) . "\000" } + @charset); +push @charset, ''; + +sub baudot2ascii { + @_ == 1 or croak "Usage: baudot2ascii(STRING)"; + my $string = shift; + my $set = 0; + my $result = ''; + while ($string ne '') { + my $chr = ord($string) & 037; + $string = substr($string, 1); + if ($chr == 033 || $chr == 037) { + $set = ord(substr($charset[$set], $chr, 1)) & 03; + } else { + $result .= substr($charset[$set], $chr, 1); + } + } + $result; +} + +sub ascii2baudot { + @_ == 1 or @_ == 2 or croak "Usage: ascii2baudot(STRING)"; + my $string = shift; + my $faint = @_ ? shift : 1; + my $set = 4; + my $result = ''; + while ($string ne '') { + my $chr = substr($string, 0, 1); + $string = substr($string, 1); + my $pos = index($charset[$set], $chr); + if ($pos < 0 || $pos == 033 || $pos == 037) { + $pos = index($charset, $chr); + if ($pos < 0 || $chr eq "\000") { + faint(SP_NOSUCHCHAR, ord($chr), "Baudot") if $faint; + $string = sprintf("\\%03o", ord($chr)) . $string; + next; + } + my $s = $pos >> 5; + $pos = $pos & 037; + if ($set > 3) { + $result .= ['[_', '__', '_[', '[[']->[$s]; + } else { + $result .= ['', '_', '[', '[[', + '[_', '', '[', '[[', + '_', '__', '', '[[', + '_', '__', '_[', '', + ]->[($set << 2) | $s]; + } + $set = $s; + } + $result .= sprintf("%c", 0x40 + $pos); + } + $result; +} + +1; + +__END__ + +=head1 NAME + +Charset::Baudot - allows to use Baudot string constants in ASCII programs (and v.v.) + +=head1 SYNOPSIS + + use Charset::Baudot 'baudot2ascii'; + + my $a = baudot2ascii"(Baudot text)"; + +=head1 DESCRIPTION + +I<Charset::Baudot> defines functions to convert between a subset of ASCII and a +subset of nonstandard Baudot - the original Baudot allows only letters, +numbers, and some punctuation. We assume that a "Shift to letters" code +while already in letters mode means "Shift to lowercase" and "Shift to +figures" while already in figures mode means "Shift to symbols". This allows +to use up to 120 characters. However, for simplicity some characters are +available in multiple sets, so the total is less than that. + +Two functions, I<baudot2ascii> and I<ascii2baudot>, are exportable (but +not exported by default). They do the obvious thing to their first argument +and return the transformed string. + +=head1 BAUDOT CHARACTER TABLE + +The following are the characters recognised. As described, the "shift" +characters have nonstandard meaning. + + set Letters Lowercase Figures Symbols + code + 00 N/A N/A N/A N/A + 01 E e 3 Cents + 02 L/F L/F L/F L/F (line feed) + 03 A a - + + 04 Space Space Space Tab + 05 S s BELL \ + 06 I i 8 # + 07 U u 7 = + 08 C/R C/R C/R C/R (carriage return) + 09 D d $ * + 10 R r 4 { + 11 J j ' ~ + 12 N n , XOR + 13 F f ! | + 14 C c : ^ + 15 K k ( < + 16 T t 5 [ + 17 Z z " } + 18 W w ) > + 19 L l 2 ] + 20 H h N/A backspace + 21 Y y 6 @ + 22 P p 0 N/A + 23 Q q 1 POUND + 24 O o 9 NOT + 25 B b ? delete + 26 G g & N/A + 27 Figures Figures Symbols Symbols + 28 M m . % + 29 X x / _ + 30 V v ; N/A + 31 Lowercase Lowercase Letters Letters + +=head1 COPYRIGHT + +This module is part of CLC-INTERCAL. + +Copyright (C) 1999, 2000, 2002, 2006, 2007 Claudio Calvelli, all rights reserved + +See files README and COPYING in the distribution for information. + +=head1 SEE ALSO + +A qualified psychiatrist. +