diff -r 000000000000 -r 08ec8eefde2f traceservices/commsdebugutility/tools/extractlog.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/traceservices/commsdebugutility/tools/extractlog.pl Fri Jan 22 11:06:30 2010 +0200 @@ -0,0 +1,227 @@ +# Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# + +use strict; +use Getopt::Long; + +# read in the command line parameters +my $verbose = 0; +my $singleLevel = 0; +my $fromBatchFile = 0; +my $help = 0; +GetOptions( 'verbose|v!' => \$verbose, + '1!' => \$singleLevel, + 'help|h|?!' => \$help, + '--fromBatchFile!' => \$fromBatchFile ); +Usage() if $help; +my $file = $ARGV[0]; +if(!defined($file)) +{ + $file = "$ENV{EPOCROOT}EPOC32\\WINSCW\\C\\LOGS\\LOG.TXT"; + $file = "$ENV{EPOCROOT}EPOC32\\WINS\\C\\LOGS\\LOG.TXT" if(!-r $file); + print "No file specified, defaulting to $file\n"; +} +print "Verbose mode on\n" if $verbose; + +# open up the file for input +open(INPUT_FILE, "< $file") or die "ERROR: Couldn't open the file \"$file\" for input:"; + +# read file without intepretting CR/LF - not ideal on window's systems, but +# I introduced this to get around apparent problem when seeking back when reading binary data +# The seek back seemed to seek to somewhere other than where we had last "tell"'ed. +# binmode fixes this since CR/LF is always seen as 2 distinct chars. +binmode(INPUT_FILE); + +# declare handy arrays +my %file_handles_text; # a hash of all components seen for ascii and their associated file handle +my %file_handles_binary; # a hash of all components seen for binary and their associated file handle +my @comments; # an array of all the comment lines seen so far + +# iterate through each line of the file +my $filepos = tell(INPUT_FILE); +my $linenum = 1; +while () { + # strip off any CR/LF's since we will correctly terminate the line by one + # if we find the line is ascii. Binary lines should also arrive with a CR/LF at their end. + my $line = $_; + print $line if $verbose; + chomp($line); + + my $strlen = length($line); + if (($strlen == 0) || (ord "$line" == 13)) { + if ($verbose) { print "Line#: $linenum is an empty line.\n"; } + } else { + $line =~ s/\r$//; # chomp CR + if ($line =~ /^#/) { + # we are dealing with a comment line + $line .= "\n"; + push(@comments, "$line"); + while((my $component, my $file_handle) = each(%file_handles_text)) { + print $file_handle "$line" + } + } + else { + #we are dealing with a component line so check the correct line format and determine if it is ascii or binary + my @list = split("\t", $line); + + my $linetype = "$list[2]"; + + if (ord "$linetype" == 97) { + # this is ascii, so return a CR/LF to line + $line .= "\n"; + my $component = lc($list[0] . ($singleLevel? "": "_$list[1]") . ".log"); + if (not exists $file_handles_text{$component}) { + # we haven't seen this component before + local *OUTFILE; + open(OUTFILE, "> $component") or die "ERROR. Line $linenum: can't open file \"$component\" for output: $!"; + foreach my $comment (@comments) { + print OUTFILE "$comment"; + } + $file_handles_text{$component} = *OUTFILE; + } + my $file_handle = $file_handles_text{$component}; + print $file_handle "$line"; + } elsif (ord "$linetype" == 98) { + #assume it is binary + my $component = "$list[0]_$list[1].bin"; + if (not exists $file_handles_binary{$component}) { + # we haven't seen this component before + local *OUTFILE; + open(OUTFILE, "> $component") or die "ERROR. Line $linenum: can't open file \"$component\" for output: $!"; + binmode(OUTFILE); + $file_handles_binary{$component} = *OUTFILE; + } + + # go back to start of line since CR/LF might even occur in the length field, + # then read to each tab until the binary tag is found again + seek(INPUT_FILE,$filepos,0); + + my $old_rs = $/; + $/ = chr(9); + do { + $_ = ; + } while ((ord "$_" != 98) && (length != 1)); + $/ = $old_rs; + + # read the length as a "little-endian" 4-byte unsigned integer + my $datalenstr; + my $numread = read(INPUT_FILE,$datalenstr,4); + if ($numread != 4) { die "ERROR: did not read all 4 bytes binary data length on line $linenum"; } + + my $datatoread = unpack("v",$datalenstr); + + # read next char and ensure it is a tab + my $onechar; + $numread = read(INPUT_FILE,$onechar,1); + if ($numread != 1) { die "ERROR: read error when reading tab char in binary line on line $linenum"; } + if (ord $onechar != 9) { die "ERROR: No tab char in binary line at pos : $filepos where expected between length and data at line $linenum"; } + + if ($verbose) { + print "About to read binary data. Beginning of line is at pos: $filepos "; + printf " [%X] Tags: ",$filepos; + foreach my $d (@list) { + print "[$d]"; + } + print "\nBytes to read: $datatoread\n"; + } + + my $datastr; + $numread = read(INPUT_FILE,$datastr,$datatoread); + if ($datatoread != $numread) { die "ERROR: only read $numread of expected $datatoread bytes binary data on line $linenum"; } + + if ($verbose) { print "Read Completed.\n"; } + + + my $file_handle = $file_handles_binary{$component}; + print $file_handle "$datastr"; + + # finally, read in the trailing CR/LF before reverting to textual reading + $_ = ; + + } else { + if ($verbose) { + print "Line# $linenum at filepos $filepos is CORRUPT: linetype field is neither ascii nor binary so ignoring.\n"; + print "Line fields: "; + foreach my $d (@list) { + print "[$d]"; + } + print "\n ... skipping line and continuing\n"; + } + + } + } # comment line check + } #empty line check + $filepos = tell(INPUT_FILE); + #print "filepos at end of line proc: $filepos . input rec #: $."; + #printf "[%X]\n",$filepos; + $linenum++; +} + +# and finally clean up +close(INPUT_FILE) or die "ERROR: failed to close the input log file: $!"; +my $firstFile = 1; +while((my $component, my $file_handle) = each(%file_handles_text)) +{ + printf "%s%s", $firstFile? "Generated: ": ", ", $component; + $firstFile = 0; + close($file_handle) or die "ERROR: failed to close the output log file for \"$component\": $!"; +} +while((my $component, my $file_handle) = each(%file_handles_binary)) +{ + printf "%s%s", $firstFile? "Generated: ": ", ", $component; + $firstFile = 0; + close($file_handle) or die "ERROR: failed to close the output log file for \"$component\": $!"; +} +print "\n"; + + +sub Usage () { +print $fromBatchFile? "Common Usage: splitlog [logfile] [-v][-1]\n": "Args: [logfile] [-v][-1]\n"; + print <