#!/usr/bin/perl -w # # unface: # Interpret X-Face data. # # Relies upon formail and uncompface. # # Copyright (c) 2002 Chris Lightfoot. All rights reserved. # Email: chris@ex-parrot.com; WWW: http://www.ex-parrot.com/~chris/ # my $rcsid = '$Id: unface,v 1.1 2002/02/09 18:49:50 chris Exp $'; sub unbin ($) { my $val = shift; my $binstr = ''; for ($i = 15; $i >= 0; --$i) { $binstr .= ($val & (1 << $i)) ? '1' : '0'; } return $binstr; } sub do_face ($) { my ($face) = shift; pipe(RD, WR); if (open(UNCOMP, "-|") == 0) { open(STDIN, "<&RD"); close(WR); exec("uncompface"); } else { close(RD); print WR $_; close(WR); } @lines = ; close(UNCOMP); @pic = ( ); foreach (@lines) { @bins = (split(",", $_)); @row = ( ); foreach $b (@bins[0...2]) { $a = hex(substr($b, 2)); push(@row, (split(//, unbin($a)))); } push(@pic, [(@row)]); } for ($i = 0; $i < 48; $i += 2) { for ($j = 0; $j < 48; ++$j) { if ($pic[$i]->[$j] and $pic[$i + 1]->[$j]) { print " "; } elsif ($pic[$i]->[$j]) { print ","; } elsif ($pic[$i + 1]->[$j]) { print "'"; } else { print "|"; } } print "\n"; } } open(FACELINES, "formail -cx X-Face|"); @faces = ; close(FACELINES); foreach (@faces) { do_face($_); print STDOUT ("-" x 48) . "\n"; }