Re: Perl to C++
Hi there,
can somebody convert the following perl code to C++
sub OleUnpackPackages {
my($this, $explodeinto, $parentname, @NativeFilenames) = @_;
my($infh, $byte, $number, $buffer, $outname);
my($finished);
OLEFILE: foreach my $inname (@NativeFilenames) {
$byte = "";
$buffer = "";
close $infh if $infh;
$infh = new FileHandle;
sysopen $infh, "$explodeinto/$inname", O_RDONLY; sysseek $infh,
6, SEEK_SET; # Skip 1st 6 bytes
$outname = "";
$finished = 0;
until ($byte eq "\0" || $finished) { # Read a C-string into
$outname
sysread($infh, $byte, 1) or $finished = 1;
$outname .= $byte;
}
# Then there is a null-terminated ASCII string which is the filename
of the object.
#print STDERR "Output filename is $outname\n";
$finished = 0;
$byte = 1;
until ($byte eq "\0" || $finished) { # Throw away a C-string
sysread($infh, $byte, 1) or $finished = 1;
}
# Throw away the next null-terminated ASCII string
sysseek $infh, 4, Fcntl::SEEK_CUR or next OLEFILE; # Skip next 4
bytes
# Throw away next 4 byte int
sysread $infh, $number, 4 or next OLEFILE;
$number = unpack 'V', $number;
# The next 4 bytes are an int giving the length of the next bit of the
header
#print STDERR "Skipping $number bytes of header filename\n";
sysseek $infh, $number, Fcntl::SEEK_CUR; # Skip the next bit of
header (C-string)
# Skip over the next bit of the header whose length we just read
sysread $infh, $number, 4 or next OLEFILE;
$number = unpack 'V', $number;
#print STDERR "Reading $number bytes of file data\n";
# Then you have a 4-byte int which is the length of the real embedded
original file
sysread $infh, $buffer, $number
if $number < -s "$explodeinto/$inname"; # Sanity check
# Read in all the data of the original embedded file
my $outfh = new FileHandle;
my $outsafe = $this->MakeNameSafe($outname, $explodeinto);
sysopen $outfh, "$explodeinto/$outsafe", (O_CREAT | O_WRONLY)
or next OLEFILE;
syswrite $outfh, $buffer, $number or next OLEFILE;
close $outfh;
# Set up MailScanner data structures
$this->{file2parent}{$outname} = $parentname;
$this->{file2parent}{$outsafe} = $parentname;
$this->{file2safefile}{$outname} = $outsafe;
$this->{safefile2file}{$outsafe} = $outname;
}
close $infh if $infh;
}
You help will be highly appreciated.
Thank You
miztaken
#include <string>
#include <vector>
#include <fstream>
#include <map>
using namespace std;
class Widget {
public:
void OleUnpackPackages(int explodeinto, std::string parentname,
std::vector<std::string> NativeFilenames) {
ifstream infh;
char byte = ' ';
string number;
std::string buffer("");
std::string outname("");
int finished;
OLEFILE:
for (int i=0; i<NativeFilenames.size(); ++i) {
string inname = NativeFilenames[i];
byte = ' ';
buffer = "";
infh.open("$explodeinto/$inname", ios_base::in); // 2nd parameter
is the FILENAME
infh.ignore(6);
outname = "";
finished = 0;
while ( byte != '\0' || finished == 1) {
infh.get(byte);
outname += byte;
}
//cerr << "Output filename is " << outname << endl;
finished = 0;
byte = '1';
while (byte != '\0' || finished == 1) { //throw away a c-string
if (!infh.get(byte))
finished = 1;
}
if (!infh.ignore(boost::lexical_cast<int>(number)))
goto OLEFILE;
char TMP_BUFFER[40];
if (! infh.read(TMP_BUFFER, 4))
goto OLEFILE;
number.assign(TMP_BUFFER);
//UNPACK v number
infh.read(TMP_BUFFER, boost::lexical_cast<int>(number));
if (number.compare("-s") < 0)
explodeinto/boost::lexical_cast<int>(inname); //sanity check
ofstream outfh;
bool outsafe = this->MakeNameSafe(outname, explodeinto); //return
type from MakeNameSafe?
if (! outfh.open("explodeinto/outsafe", ios_base::out |
ios_base::trunc))
goto OLEFILE;
outfh << buffer;
outfh.close();
// set up mailscanner data structures, eg. map<string, map<string,
string> >
this->my_map_with_maps[file2parent][outname] = parentname;
this->my_map_with_maps[file2parent][outsafe] = parentname;
this->my_map_with_maps[file2safefile][outname] = outsafe;
this->my_map_with_maps[safefile2file][outsafe] = outname;
}
if (infh)
infh.close();
}
}
HTH Roger Schildmeijer.
ps. look at boost.org for lexical_cast. ds. the map is not a perfect
solution, but i hope you see what i mean. ds.
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]