[Feature]Upload Modem source code
Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/tools/perl/Spreadsheet/WriteExcel/BIFFwriter.pm b/mcu/tools/perl/Spreadsheet/WriteExcel/BIFFwriter.pm
new file mode 100644
index 0000000..7f618a7
--- /dev/null
+++ b/mcu/tools/perl/Spreadsheet/WriteExcel/BIFFwriter.pm
@@ -0,0 +1,316 @@
+package Spreadsheet::WriteExcel::BIFFwriter;
+
+###############################################################################
+#
+# BIFFwriter - An abstract base class for Excel workbooks and worksheets.
+#
+#
+# Used in conjunction with Spreadsheet::WriteExcel
+#
+# Copyright 2000-2010, John McNamara, jmcnamara@cpan.org
+#
+# Documentation after __END__
+#
+
+use Exporter;
+use strict;
+
+
+
+
+
+
+
+use vars qw($VERSION @ISA);
+@ISA = qw(Exporter);
+
+$VERSION = '2.37';
+
+###############################################################################
+#
+# Class data.
+#
+my $byte_order = '';
+my $BIFF_version = 0x0600;
+
+
+###############################################################################
+#
+# new()
+#
+# Constructor
+#
+sub new {
+
+ my $class = $_[0];
+
+ my $self = {
+ _byte_order => '',
+ _data => '',
+ _datasize => 0,
+ _limit => 8224,
+ _ignore_continue => 0,
+ };
+
+ bless $self, $class;
+ $self->_set_byte_order();
+ return $self;
+}
+
+
+###############################################################################
+#
+# _set_byte_order()
+#
+# Determine the byte order and store it as class data to avoid
+# recalculating it for each call to new().
+#
+sub _set_byte_order {
+
+ my $self = shift;
+
+ if ($byte_order eq ''){
+ # Check if "pack" gives the required IEEE 64bit float
+ my $teststr = pack "d", 1.2345;
+ my @hexdata =(0x8D, 0x97, 0x6E, 0x12, 0x83, 0xC0, 0xF3, 0x3F);
+ my $number = pack "C8", @hexdata;
+
+ if ($number eq $teststr) {
+ $byte_order = 0; # Little Endian
+ }
+ elsif ($number eq reverse($teststr)){
+ $byte_order = 1; # Big Endian
+ }
+ else {
+ # Give up. I'll fix this in a later version.
+ croak ( "Required floating point format not supported " .
+ "on this platform. See the portability section " .
+ "of the documentation."
+ );
+ }
+ }
+ $self->{_byte_order} = $byte_order;
+}
+
+
+###############################################################################
+#
+# _prepend($data)
+#
+# General storage function
+#
+sub _prepend {
+
+ my $self = shift;
+ my $data = join('', @_);
+
+ $data = $self->_add_continue($data) if length($data) > $self->{_limit};
+
+ $self->{_data} = $data . $self->{_data};
+ $self->{_datasize} += length($data);
+
+ return $data;
+}
+
+
+###############################################################################
+#
+# _append($data)
+#
+# General storage function
+#
+sub _append {
+
+ my $self = shift;
+ my $data = join('', @_);
+
+ $data = $self->_add_continue($data) if length($data) > $self->{_limit};
+
+ $self->{_data} = $self->{_data} . $data;
+ $self->{_datasize} += length($data);
+
+ return $data;
+}
+
+
+###############################################################################
+#
+# _store_bof($type)
+#
+# $type = 0x0005, Workbook
+# $type = 0x0010, Worksheet
+# $type = 0x0020, Chart
+#
+# Writes Excel BOF record to indicate the beginning of a stream or
+# sub-stream in the BIFF file.
+#
+sub _store_bof {
+
+ my $self = shift;
+ my $record = 0x0809; # Record identifier
+ my $length = 0x0010; # Number of bytes to follow
+
+ my $version = $BIFF_version;
+ my $type = $_[0];
+
+ # According to the SDK $build and $year should be set to zero.
+ # However, this throws a warning in Excel 5. So, use these
+ # magic numbers.
+ my $build = 0x0DBB;
+ my $year = 0x07CC;
+
+ my $bfh = 0x00000041;
+ my $sfo = 0x00000006;
+
+ my $header = pack("vv", $record, $length);
+ my $data = pack("vvvvVV", $version, $type, $build, $year, $bfh, $sfo);
+
+ $self->_prepend($header, $data);
+}
+
+
+###############################################################################
+#
+# _store_eof()
+#
+# Writes Excel EOF record to indicate the end of a BIFF stream.
+#
+sub _store_eof {
+
+ my $self = shift;
+ my $record = 0x000A; # Record identifier
+ my $length = 0x0000; # Number of bytes to follow
+
+ my $header = pack("vv", $record, $length);
+
+ $self->_append($header);
+}
+
+
+###############################################################################
+#
+# _add_continue()
+#
+# Excel limits the size of BIFF records. In Excel 5 the limit is 2084 bytes. In
+# Excel 97 the limit is 8228 bytes. Records that are longer than these limits
+# must be split up into CONTINUE blocks.
+#
+# This function take a long BIFF record and inserts CONTINUE records as
+# necessary.
+#
+# Some records have their own specialised Continue blocks so there is also an
+# option to bypass this function.
+#
+sub _add_continue {
+
+ my $self = shift;
+ my $data = $_[0];
+ my $limit = $self->{_limit};
+ my $record = 0x003C; # Record identifier
+ my $header;
+ my $tmp;
+
+ # Skip this if another method handles the continue blocks.
+ return $data if $self->{_ignore_continue};
+
+ # The first 2080/8224 bytes remain intact. However, we have to change
+ # the length field of the record.
+ #
+ $tmp = substr($data, 0, $limit, "");
+ substr($tmp, 2, 2, pack("v", $limit-4));
+
+ # Strip out chunks of 2080/8224 bytes +4 for the header.
+ while (length($data) > $limit) {
+ $header = pack("vv", $record, $limit);
+ $tmp .= $header;
+ $tmp .= substr($data, 0, $limit, "");
+ }
+
+ # Mop up the last of the data
+ $header = pack("vv", $record, length($data));
+ $tmp .= $header;
+ $tmp .= $data;
+
+ return $tmp ;
+}
+
+
+###############################################################################
+#
+# _add_mso_generic()
+#
+# Create a mso structure that is part of an Escher drawing object. These are
+# are used for images, comments and filters. This generic method is used by
+# other methods to create specific mso records.
+#
+# Returns the packed record.
+#
+sub _add_mso_generic {
+
+ my $self = shift;
+ my $type = $_[0];
+ my $version = $_[1];
+ my $instance = $_[2];
+ my $data = $_[3];
+ my $length = defined $_[4] ? $_[4] : length($data);
+
+ # The header contains version and instance info packed into 2 bytes.
+ my $header = $version | ($instance << 4);
+
+ my $record = pack "vvV", $header, $type, $length;
+ $record .= $data;
+
+ return $record;
+}
+
+
+###############################################################################
+#
+# For debugging
+#
+sub _hexout {
+
+ my $self = shift;
+
+ print +(caller(1))[3], "\n";
+
+ my $data = join '', @_;
+
+ my @bytes = unpack("H*", $data) =~ /../g;
+
+ while (@bytes > 16) {
+ print join " ", splice @bytes, 0, 16;
+ print "\n";
+ }
+ print join " ", @bytes, "\n\n";
+}
+
+
+
+1;
+
+
+__END__
+
+
+=head1 NAME
+
+BIFFwriter - An abstract base class for Excel workbooks and worksheets.
+
+=head1 SYNOPSIS
+
+See the documentation for Spreadsheet::WriteExcel
+
+=head1 DESCRIPTION
+
+This module is used in conjunction with Spreadsheet::WriteExcel.
+
+=head1 AUTHOR
+
+John McNamara jmcnamara@cpan.org
+
+=head1 COPYRIGHT
+
+© MM-MMX, John McNamara.
+
+All Rights Reserved. This module is free software. It may be used, redistributed and/or modified under the same terms as Perl itself.