PDA

View Full Version : File Format conversion via pipes instead of tempory files


chrestomanci
29-Apr-2008, 06:34 AM
Hello

I have been working on creating a file format converter for dissassmbing java .class files into jasmin assembly language so that I can see how different two java classes are. I have been using the d-java (http://www.netsw.org/softeng/lang/java/bytecode/disassembler/djava/) program for that, however the program always writes the disassembled output to stdout, and there is no option in BC3 to capture stdout instead of using an output file, so I had to create a perl wrapper script:

#!/bin/perl

use File::Copy;
use File::Basename;

my ($src, $dest) = @ARGV;

open DEBUGOUT, '>>', 'C:\\Program Files\\d-java\\d-java_DEBUG.txt';
print DEBUGOUT "Args:\n\tsrc = $src\n\tdest = $dest\n";

# Copy the src file to .class so that the dissasmber will load it.
my ($name,$path,$suffix) = fileparse($src, qr/\.[^.]*/);
my $newName = $path.$name.'.class';
copy $src, $newName;
print DEBUGOUT "\t$src coppied to $newName\n";

chdir "C:/Program Files/d-java";
my $cmd = sprintf 'D-Java.exe -e C:\\Temp\\d-java_DEBUG.log -o jasmin -n lvt -n lnt "%s"', $newName;
print DEBUGOUT "\tDissaembly command: \"$cmd\"\n";
open CMDOUT, '-|', $cmd or die "Error running d-java dissassember $!";
my @jasminLines = <CMDOUT>;
close CMDOUT;
printf DEBUGOUT "\t%d lines of jasmin disassmbly produced\n", scalar @jasminLines;


open OUTFILE, '>', $dest or die "Error writing output to $dest $!";
print OUTFILE @jasminLines;
close OUTFILE;
print DEBUGOUT "Written to $dest\n\n";

close DEBUGOUT;
This program is necessary because BC3 requires conversion programs to take their input from a file, and emit it to another file. Can we have a type of conversion where the text to be converted is piped through the conversion program instead of requiring temporary files? This could be done by having a pair of checkboxes on the conversion dialog, one labeled "pipe original to stdin" the other labeled "read output from stdout".

You can also see in the above program that I had to create a copy of the input file with the correct extension. This is because if the input is passed to d-java as a file rather than a pipe, it will only convert files with a .class extension, and because I was comparing files in an archive (a java .jar file). BC3 had to extract a copy which got a .tmp extension.

chrestomanci
30-May-2008, 01:44 AM
Bump

Craig
30-May-2008, 09:06 AM
You should take a look at our existing "Java Class (http://www.scootersoftware.com/download.php?c=kb_morerules)" rule (BC2) or the "Java class to source (http://www.scootersoftware.com/beta3/download.php?zz=kb_moreformats)" file format (BC3), which does the same thing with the JAD decompiler. The BC3 bcpkg files are just renamed zips.

In both cases they use a one-line batch file to handle the piping. That is, the "External Conversion" command is "jad.bat %s %s" and the batch file is "jad.exe -p %1 > %2". To pipe into stdin you just use the "<" symbol. If you're using the Linux build the batch file isn't necessary because the external conversion command is run through the shell first, so it does support the command line piping syntax.