#!/usr/bin/perl -w # encode.pl - Don Yang (uguu.org) # # Encode text as pointer differences. # # 2015-09-12 use strict; # Output header print < int main() { int *table[512], **q, **p = table, i, j; for(i = 0; i++ < 512; p = table + j) table[j = (p - table + 1) * 9 % 512] = (int*)p; EOT # Output bytes my $p = 0; my $parity = 0; while( my $line = <> ) { foreach my $byte (unpack 'C*', $line) { my $steps; my $q = $p; for($steps = 0; abs($p - $q) != $byte; $steps++) { $q = ($q + 1) * 9 % 512; die if $steps > 513; } $steps = 512 - $steps; 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 <