#!/usr/bin/perl # # simplemot # # Copyright (C) 2007 Red Hat, Inc. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # $inone = 0; $intran = 0; $total = 0; binmode(STDIN, ":raw"); binmode(STDOUT, ":raw"); while (<>) { if (!$inone && /^msgid/) { chop; $str = substr($_, 7, length($_) - 8); $inone = 1; } elsif ($inone && /^"/) { chop; $str .= substr($_, 1, length($_) - 2); } elsif ($inone) { $inone = 0; $str =~ s/\\n/\n/g; $str =~ s/\\t/\t/g; $str =~ s/\\"/"/g; # the string is complete -- calculate a hash $sum = 0; $xor = 0; for ($i = 0; $i < length($str); $i++) { $char = ord(substr($str, $i, 1)); $sum += $char; $xor ^= $char; } $total = ($sum << 16) | (($xor & 0xFF) << 8) | (length($str) & 0xFF); } if (!$intran && /^msgstr/) { chop; $tran = substr($_, 8, length($_) - 9); $intran = 1; } elsif ($intran && /^"/) { chop; $tran .= substr($_, 1, length($_) - 2); } elsif ($intran) { $intran = 0; $tran =~ s/\\n/\n/g; $tran =~ s/\\t/\t/g; $tran =~ s/\\"/"/g; if (!$total && $str) { print STDERR "Missing string for $tran"; exit 1 } elsif ($str && $tran) { print pack("Nn", $total, length($tran)); print $tran; #if ($tran < 60) { #printf STDERR ("0x%x %s\n", $total, $tran); #} } } }