[comp.sources.d] travestyyyyyyyy

brnstnd@stealth.acf.nyu.edu (01/05/90)

Sorry about travesty, everybody. On all the machines I use, bcmp()
returns a signed value like strcmp(). This assumption isn't portable.

For a quick fix, redefine cmp() in terms of strncmp(), and don't feed
travesty any nulls! Remember that strncmp() and strncpy() take arguments
in the opposite order to bcmp() and bcopy().

I coded cmp() inline in version 1.1; apparently that fixes the problem.
If you're desperate for a copy before Bill reappears, write me.

Yes, Peter, you can replace srandom() and random() by srand() and
rand(). random() and srandom() are two of those annoying routines that
work much better than their predecessors but aren't as widely available;
getopt() is another example.

---Dan

lwall@jpl-devvax.JPL.NASA.GOV (Larry Wall) (01/05/90)

Just for the fun of it, here's a travesty in perl.  It's based on the same
idea, but it's not a translation.  It's still a little rough in some ways,
but it will trim article headers for you.

Here's a paragraph of the new, revised perl manual (-:

    A subroutine may not make much sense to you. It's here at the
    end) and does certain optimizations with the package name is
    omitted, format "STDOUT" is defined. FORMLIST consists of a loop
    modifier, executes the second way hides the main point isn't whether the
    user typed -v or not. References to scalar variables, normal array
    values, and anything after it will not look for a script whether the
    lvalue EXPR has a real value or not. LIST operators have the newline
    is printed. The special field @* can be put anywhere a command to
    which output is to include subroutines from a subroutine but rather
    the name of the primary sequence of characters sent, or the right
    side of the following: Semicolons are required on ifs and whiles.
    Variables begin with '$', even when $* is 0. Default is 0, exits
    with 255. Equivalent examples: die "Can't open $foo: $!"; is better
    than verbose && print "Starting analysis\n" if $verbose; is better
    than verbose && print "Starting analysis\n"; since the language has
    more built-in functionality, it has to rely less upon external (and
    possibly untrustworthy) programs to accomplish its purposes.

#!/bin/sh
: make a subdirectory, cd to it, and run this through sh.
echo 'If this kit is complete, "End of kit" will echo at the end'
echo Extracting travesty
sed >travesty.pl <<'!STUFFY!FUNK!' -e 's/X//'
X#!/usr/bin/perl
X
Xwhile (<>) {
X    next if /^\./;
X    next if /^From / .. /^$/;
X    next if /^Path: / .. /^$/;
X    s/^\W+//;
X    push(@ary,split(' '));
X    while ($#ary > 1) {
X	$a = $p;
X	$p = $n;
X	$w = shift(@ary);
X	$n = $num{$w};
X	if ($n eq '') {
X	    push(@word,$w);
X	    $n = pack('S',$#word);
X	    $num{$w} = $n;
X	}
X	$lookup{$a . $p} .= $n;
X    }
X}
X
Xfor (;;) {
X    $n = $lookup{$a . $p};
X    ($foo,$n) = each(lookup) if $n eq '';
X    $n = substr($n,int(rand(length($n))) & 0177776,2);
X    $a = $p;
X    $p = $n;
X    ($w) = unpack('S',$n);
X    $w = $word[$w];
X    $col += length($w) + 1;
X    if ($col >= 65) {
X	$col = 0;
X	print "\n";
X    }
X    else {
X	print ' ';
X    }
X    print $w;
X    if ($w =~ /\.$/) {
X	if (rand() < .1) {
X	    print "\n";
X	    $col = 80;
X	}
X    }
X}
!STUFFY!FUNK!
echo ""
echo "End of kit"
: I do not append .signature, but someone might mail this.
exit

Larry Wall
lwall@jpl-devvax.jpl.nasa.gov

shenkin@cunixc.cc.columbia.edu (Peter S. Shenkin) (01/06/90)

In article <815@stealth.acf.nyu.edu> brnstnd@stealth.acf.nyu.edu (Dan Bernstein) writes:
>
>Yes, Peter, you can replace srandom() and random() by srand() and
>rand(). random() and srandom() are two of those annoying routines that
>work much better than their predecessors but aren't as widely available;

Careful, though;  with rand() and srand(), only the 16 high-order bits
have any semblence of randomness.  For example, on a 32 bit machine,
rand() returns strictly alternating even and odd numbers!  (At least this
was true on a VAX....)

	-P.  (not the Peter referred to above!)
************************f*u*cn*rd*ths*u*cn*gt*a*gd*jb**************************
Peter S. Shenkin, Department of Chemistry, Barnard College, New York, NY  10027
(212)854-1418  shenkin@cunixc.cc.columbia.edu(Internet)  shenkin@cunixc(Bitnet)

brnstnd@stealth.acf.nyu.edu (01/07/90)

In article <2597@cunixc.cc.columbia.edu> shenkin@cunixc.cc.columbia.edu (Peter S. Shenkin) writes:
> Careful, though;  with rand() and srand(), only the 16 high-order bits
> have any semblence of randomness.  For example, on a 32 bit machine,
> rand() returns strictly alternating even and odd numbers!  (At least this
> was true on a VAX....)

It's generally safe to use rand() modulo various small numbers, even for
linear congruential sequences; unless those small numbers are all powers
of two and you're very unlucky, the small period of rand()'s low-order
bits won't affect anything.

---Dan