#!/usr/bin/perl -w # encode.pl - Don Yang (uguu.org) # # Encode text as pointer differences. # # 2015-09-12 use strict; # Build table my @table = (); my $p = 0; $#table = 511; for(my $i = 0; $i < 512; $i++) { my $j = ($p + 1) * 9 % 512; $table[$j] = $p; $p = $j; } # Output header print < int main() { int *table[512], **q, **p = table, i, j; for(i = 0; i < 512; i++) { j = (p - table + 1) * 9 % 512; table[j] = (int*)p; p = table + j; } EOT # Output bytes my $parity = 0; while( my $line = <> ) { foreach my $byte (unpack 'C*', $line) { my $steps = 0; my $q = $p; do { $q = $table[$q]; $steps++; die if $steps > 512; } while( abs($p - $q) != $byte ); my $p_ptr = $parity ? 'q' : 'p'; my $q_ptr = $parity ? 'p' : 'q'; my $lhs = $p_ptr; my $rhs = "($q_ptr = " . ('*' x $steps) . "(int**" . ('*' x $steps) . ")$p_ptr)"; if( $p < $q ) { ($lhs, $rhs) = ($rhs, $lhs); } print " /* $p_ptr=$p, $q_ptr=$q, steps=$steps */ ", "putchar($lhs - $rhs);\n"; $parity ^= 1; $p = $q; } } # Output footer print <