diff options
author | openvcdiff <openvcdiff@132ac840-3546-0410-a738-d3f8764196be> | 2009-04-09 19:20:49 +0000 |
---|---|---|
committer | openvcdiff <openvcdiff@132ac840-3546-0410-a738-d3f8764196be> | 2009-04-09 19:20:49 +0000 |
commit | baf44ead8ad43d5c600b7f89420905a7397489fb (patch) | |
tree | 856804c89f046f134d08c3fe872514f308138837 | |
parent | d18457863096b3685e56f5a8919959f6afbdb121 (diff) | |
download | open-vcdiff-baf44ead8ad43d5c600b7f89420905a7397489fb.tar.gz |
Thu, 09 Apr 2009 09:16:58 -0700 Google Inc. <opensource@google.com>
Release version 0.6 with the following changes:
* Issue #9: Add option to optimize VCDIFF decoder when VCD_TARGET will not be
used as source segment.
Add new interface SetAllowVcdTarget to control whether the VCD_TARGET flag
may be used. If this option is set to false and the decoder finds a
VCD_TARGET flag, it will issue an error and refuse to continue decoding.
* Issue #19: ERROR: Length of target window (100001916) exceeds limit of
67108864 bytes
Remove the limit of INT32_MAX on the value of --max_target_file_size, since
the new SetAllowVcdTarget feature means that the entire target file will not
need to be kept in memory. Separate vcdecoder_test into five test targets,
one of which is devoted to the new SetAllowVcdTarget feature. Get rid of
kMaxBufferSize and kDefaultBufferSize, which were used ambiguously. A new
constant kDefaultMaxTargetSize provides the default values for the
--max_target_file_size and --max_target_window_size options. The
--buffersize option, if specified, should control the buffer size used,
without limits on its value.
* Issue #21: Fail to test on MinGW 5.1.4
The wrapper executables produced by libtool failed on MinGW with the error
"File /bin/sh not found". Add the option AC_DISABLE_FAST_INSTALL to avoid
creating wrapper executables. The option implies an extra link step during
"make install", but the package is small enough that this does not take
long.
* Remove the annotated-output feature from the decoder.
* Automatically detect and work around a Solaris 10 bug which causes the error
"libstdc++.la is not a valid libtool archive".
http://whocares.de/2006/05/solaris-10-fixup-for-libstdcla-is-not-a-valid-libtool-archive/
* Update with latest changes to gflags package.
* Fix type-conversion warning in vcdiff_main.cc in 32-bit Visual Studio build.
git-svn-id: http://open-vcdiff.googlecode.com/svn/trunk@25 132ac840-3546-0410-a738-d3f8764196be
31 files changed, 1815 insertions, 519 deletions
@@ -1,3 +1,35 @@ +Thu, 09 Apr 2009 09:16:58 -0700 Google Inc. <opensource@google.com> + + Release version 0.6 with the following changes: + * Issue #9: Add option to optimize VCDIFF decoder when VCD_TARGET will not be + used as source segment. + Add new interface SetAllowVcdTarget to control whether the VCD_TARGET flag + may be used. If this option is set to false and the decoder finds a + VCD_TARGET flag, it will issue an error and refuse to continue decoding. + * Issue #19: ERROR: Length of target window (100001916) exceeds limit of + 67108864 bytes + Remove the limit of INT32_MAX on the value of --max_target_file_size, since + the new SetAllowVcdTarget feature means that the entire target file will not + need to be kept in memory. Separate vcdecoder_test into five test targets, + one of which is devoted to the new SetAllowVcdTarget feature. Get rid of + kMaxBufferSize and kDefaultBufferSize, which were used ambiguously. A new + constant kDefaultMaxTargetSize provides the default values for the + --max_target_file_size and --max_target_window_size options. The + --buffersize option, if specified, should control the buffer size used, + without limits on its value. + * Issue #21: Fail to test on MinGW 5.1.4 + The wrapper executables produced by libtool failed on MinGW with the error + "File /bin/sh not found". Add the option AC_DISABLE_FAST_INSTALL to avoid + creating wrapper executables. The option implies an extra link step during + "make install", but the package is small enough that this does not take + long. + * Remove the annotated-output feature from the decoder. + * Automatically detect and work around a Solaris 10 bug which causes the error + "libstdc++.la is not a valid libtool archive". + http://whocares.de/2006/05/solaris-10-fixup-for-libstdcla-is-not-a-valid-libtool-archive/ + * Update with latest changes to gflags package. + * Fix type-conversion warning in vcdiff_main.cc in 32-bit Visual Studio build. + Wed, 18 Mar 2009 14:28:23 -0700 Google Inc. <opensource@google.com> * Issue #14: HashedDictionary may free memory twice if implicitly copied. diff --git a/Makefile.am b/Makefile.am index cf10cbf..1c3d4cc 100644 --- a/Makefile.am +++ b/Makefile.am @@ -83,6 +83,11 @@ noinst_LTLIBRARIES += libgtest_main.la libgtest_main_la_SOURCES = src/gtest/gtest_main.cc libgtest_main_la_LIBADD = libgtest.la +noinst_LTLIBRARIES += libvcdecoder_test_common.la +libvcdecoder_test_common_la_SOURCES = src/vcdecoder_test.h \ + src/vcdecoder_test.cc +libvcdecoder_test_common_la_LIBADD = libvcddec.la libgtest_main.la + # libvcdcom: The open-vcdiff *common* library lib_LTLIBRARIES += libvcdcom.la libvcdcom_la_SOURCES = src/google/output_string.h \ @@ -172,11 +177,25 @@ check_PROGRAMS += varint_bigendian_test varint_bigendian_test_SOURCES = src/varint_bigendian_test.cc varint_bigendian_test_LDADD = libvcdcom.la libgtest_main.la -check_PROGRAMS += vcdecoder_test -vcdecoder_test_SOURCES = src/vcdecoder_test.h src/vcdecoder_test.cc \ - src/vcdecoder1_test.cc src/vcdecoder2_test.cc \ - src/vcdecoder3_test.cc src/vcdecoder4_test.cc -vcdecoder_test_LDADD = libvcddec.la libgtest_main.la +check_PROGRAMS += vcdecoder1_test +vcdecoder1_test_SOURCES = src/vcdecoder1_test.cc +vcdecoder1_test_LDADD = libvcdecoder_test_common.la + +check_PROGRAMS += vcdecoder2_test +vcdecoder2_test_SOURCES = src/vcdecoder2_test.cc +vcdecoder2_test_LDADD = libvcdecoder_test_common.la + +check_PROGRAMS += vcdecoder3_test +vcdecoder3_test_SOURCES = src/vcdecoder3_test.cc +vcdecoder3_test_LDADD = libvcdecoder_test_common.la + +check_PROGRAMS += vcdecoder4_test +vcdecoder4_test_SOURCES = src/vcdecoder4_test.cc +vcdecoder4_test_LDADD = libvcdecoder_test_common.la + +check_PROGRAMS += vcdecoder5_test +vcdecoder5_test_SOURCES = src/vcdecoder5_test.cc +vcdecoder5_test_LDADD = libvcdecoder_test_common.la check_PROGRAMS += vcdiffengine_test vcdiffengine_test_SOURCES = src/vcdiffengine_test.cc @@ -232,7 +251,11 @@ EXTRA_DIST = $(check_SCRIPTS) \ vsprojects/varint_bigendian_test/varint_bigendian_test.vcproj \ vsprojects/vcdcom/vcdcom.vcproj \ vsprojects/vcddec/vcddec.vcproj \ - vsprojects/vcdecoder_test/vcdecoder_test.vcproj \ + vsprojects/vcdecoder1_test/vcdecoder1_test.vcproj \ + vsprojects/vcdecoder2_test/vcdecoder2_test.vcproj \ + vsprojects/vcdecoder3_test/vcdecoder3_test.vcproj \ + vsprojects/vcdecoder4_test/vcdecoder4_test.vcproj \ + vsprojects/vcdecoder5_test/vcdecoder5_test.vcproj \ vsprojects/vcdenc/vcdenc.vcproj \ vsprojects/vcdiff/vcdiff.vcproj \ vsprojects/vcdiffengine_test/vcdiffengine_test.vcproj \ diff --git a/Makefile.in b/Makefile.in index fc4a297..1fce17d 100644 --- a/Makefile.in +++ b/Makefile.in @@ -50,7 +50,9 @@ check_PROGRAMS = addrcache_test$(EXEEXT) blockhash_test$(EXEEXT) \ encodetable_test$(EXEEXT) headerparser_test$(EXEEXT) \ instruction_map_test$(EXEEXT) output_string_test$(EXEEXT) \ rolling_hash_test$(EXEEXT) varint_bigendian_test$(EXEEXT) \ - vcdecoder_test$(EXEEXT) vcdiffengine_test$(EXEEXT) \ + vcdecoder1_test$(EXEEXT) vcdecoder2_test$(EXEEXT) \ + vcdecoder3_test$(EXEEXT) vcdecoder4_test$(EXEEXT) \ + vcdecoder5_test$(EXEEXT) vcdiffengine_test$(EXEEXT) \ vcencoder_test$(EXEEXT) noinst_PROGRAMS = subdir = . @@ -61,7 +63,8 @@ DIST_COMMON = README $(am__configure_deps) $(dist_doc_DATA) \ COPYING ChangeLog INSTALL NEWS THANKS compile config.guess \ config.sub depcomp install-sh ltmain.sh missing mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__aclocal_m4_deps = $(top_srcdir)/m4/ac_have_attribute.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ @@ -97,6 +100,11 @@ libvcdcom_la_OBJECTS = $(am_libvcdcom_la_OBJECTS) libvcddec_la_DEPENDENCIES = libvcdcom.la am_libvcddec_la_OBJECTS = decodetable.lo headerparser.lo vcdecoder.lo libvcddec_la_OBJECTS = $(am_libvcddec_la_OBJECTS) +libvcdecoder_test_common_la_DEPENDENCIES = libvcddec.la \ + libgtest_main.la +am_libvcdecoder_test_common_la_OBJECTS = vcdecoder_test.lo +libvcdecoder_test_common_la_OBJECTS = \ + $(am_libvcdecoder_test_common_la_OBJECTS) libvcdenc_la_DEPENDENCIES = libvcdcom.la am_libvcdenc_la_OBJECTS = blockhash.lo encodetable.lo \ instruction_map.lo vcdiffengine.lo vcencoder.lo @@ -133,11 +141,21 @@ rolling_hash_test_DEPENDENCIES = libvcdcom.la libgtest_main.la am_varint_bigendian_test_OBJECTS = varint_bigendian_test.$(OBJEXT) varint_bigendian_test_OBJECTS = $(am_varint_bigendian_test_OBJECTS) varint_bigendian_test_DEPENDENCIES = libvcdcom.la libgtest_main.la -am_vcdecoder_test_OBJECTS = vcdecoder_test.$(OBJEXT) \ - vcdecoder1_test.$(OBJEXT) vcdecoder2_test.$(OBJEXT) \ - vcdecoder3_test.$(OBJEXT) vcdecoder4_test.$(OBJEXT) -vcdecoder_test_OBJECTS = $(am_vcdecoder_test_OBJECTS) -vcdecoder_test_DEPENDENCIES = libvcddec.la libgtest_main.la +am_vcdecoder1_test_OBJECTS = vcdecoder1_test.$(OBJEXT) +vcdecoder1_test_OBJECTS = $(am_vcdecoder1_test_OBJECTS) +vcdecoder1_test_DEPENDENCIES = libvcdecoder_test_common.la +am_vcdecoder2_test_OBJECTS = vcdecoder2_test.$(OBJEXT) +vcdecoder2_test_OBJECTS = $(am_vcdecoder2_test_OBJECTS) +vcdecoder2_test_DEPENDENCIES = libvcdecoder_test_common.la +am_vcdecoder3_test_OBJECTS = vcdecoder3_test.$(OBJEXT) +vcdecoder3_test_OBJECTS = $(am_vcdecoder3_test_OBJECTS) +vcdecoder3_test_DEPENDENCIES = libvcdecoder_test_common.la +am_vcdecoder4_test_OBJECTS = vcdecoder4_test.$(OBJEXT) +vcdecoder4_test_OBJECTS = $(am_vcdecoder4_test_OBJECTS) +vcdecoder4_test_DEPENDENCIES = libvcdecoder_test_common.la +am_vcdecoder5_test_OBJECTS = vcdecoder5_test.$(OBJEXT) +vcdecoder5_test_OBJECTS = $(am_vcdecoder5_test_OBJECTS) +vcdecoder5_test_DEPENDENCIES = libvcdecoder_test_common.la am_vcdiff_OBJECTS = vcdiff_main.$(OBJEXT) vcdiff_OBJECTS = $(am_vcdiff_OBJECTS) vcdiff_DEPENDENCIES = libvcddec.la libvcdenc.la libgflags.la @@ -172,24 +190,30 @@ CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libgflags_la_SOURCES) $(libgtest_la_SOURCES) \ $(libgtest_main_la_SOURCES) $(libvcdcom_la_SOURCES) \ - $(libvcddec_la_SOURCES) $(libvcdenc_la_SOURCES) \ - $(addrcache_test_SOURCES) $(blockhash_test_SOURCES) \ - $(codetable_test_SOURCES) $(decodetable_test_SOURCES) \ - $(encodetable_test_SOURCES) $(headerparser_test_SOURCES) \ - $(instruction_map_test_SOURCES) $(output_string_test_SOURCES) \ - $(rolling_hash_test_SOURCES) $(varint_bigendian_test_SOURCES) \ - $(vcdecoder_test_SOURCES) $(vcdiff_SOURCES) \ - $(vcdiffengine_test_SOURCES) $(vcencoder_test_SOURCES) + $(libvcddec_la_SOURCES) $(libvcdecoder_test_common_la_SOURCES) \ + $(libvcdenc_la_SOURCES) $(addrcache_test_SOURCES) \ + $(blockhash_test_SOURCES) $(codetable_test_SOURCES) \ + $(decodetable_test_SOURCES) $(encodetable_test_SOURCES) \ + $(headerparser_test_SOURCES) $(instruction_map_test_SOURCES) \ + $(output_string_test_SOURCES) $(rolling_hash_test_SOURCES) \ + $(varint_bigendian_test_SOURCES) $(vcdecoder1_test_SOURCES) \ + $(vcdecoder2_test_SOURCES) $(vcdecoder3_test_SOURCES) \ + $(vcdecoder4_test_SOURCES) $(vcdecoder5_test_SOURCES) \ + $(vcdiff_SOURCES) $(vcdiffengine_test_SOURCES) \ + $(vcencoder_test_SOURCES) DIST_SOURCES = $(libgflags_la_SOURCES) $(libgtest_la_SOURCES) \ $(libgtest_main_la_SOURCES) $(libvcdcom_la_SOURCES) \ - $(libvcddec_la_SOURCES) $(libvcdenc_la_SOURCES) \ - $(addrcache_test_SOURCES) $(blockhash_test_SOURCES) \ - $(codetable_test_SOURCES) $(decodetable_test_SOURCES) \ - $(encodetable_test_SOURCES) $(headerparser_test_SOURCES) \ - $(instruction_map_test_SOURCES) $(output_string_test_SOURCES) \ - $(rolling_hash_test_SOURCES) $(varint_bigendian_test_SOURCES) \ - $(vcdecoder_test_SOURCES) $(vcdiff_SOURCES) \ - $(vcdiffengine_test_SOURCES) $(vcencoder_test_SOURCES) + $(libvcddec_la_SOURCES) $(libvcdecoder_test_common_la_SOURCES) \ + $(libvcdenc_la_SOURCES) $(addrcache_test_SOURCES) \ + $(blockhash_test_SOURCES) $(codetable_test_SOURCES) \ + $(decodetable_test_SOURCES) $(encodetable_test_SOURCES) \ + $(headerparser_test_SOURCES) $(instruction_map_test_SOURCES) \ + $(output_string_test_SOURCES) $(rolling_hash_test_SOURCES) \ + $(varint_bigendian_test_SOURCES) $(vcdecoder1_test_SOURCES) \ + $(vcdecoder2_test_SOURCES) $(vcdecoder3_test_SOURCES) \ + $(vcdecoder4_test_SOURCES) $(vcdecoder5_test_SOURCES) \ + $(vcdiff_SOURCES) $(vcdiffengine_test_SOURCES) \ + $(vcencoder_test_SOURCES) man1dir = $(mandir)/man1 NROFF = nroff MANS = $(dist_man1_MANS) @@ -352,7 +376,8 @@ noinst_SCRIPTS = # gtest (Google Test): Used for unit tests only # Please refer to http://code.google.com/p/googletest/ for details -noinst_LTLIBRARIES = libgflags.la libgtest.la libgtest_main.la +noinst_LTLIBRARIES = libgflags.la libgtest.la libgtest_main.la \ + libvcdecoder_test_common.la libgflags_la_SOURCES = src/gflags/gflags.h \ src/mutex.h \ src/gflags.cc \ @@ -378,6 +403,10 @@ libgtest_la_SOURCES = src/gtest/gtest.h \ libgtest_main_la_SOURCES = src/gtest/gtest_main.cc libgtest_main_la_LIBADD = libgtest.la +libvcdecoder_test_common_la_SOURCES = src/vcdecoder_test.h \ + src/vcdecoder_test.cc + +libvcdecoder_test_common_la_LIBADD = libvcddec.la libgtest_main.la libvcdcom_la_SOURCES = src/google/output_string.h \ src/addrcache.h \ src/checksum.h \ @@ -440,11 +469,16 @@ rolling_hash_test_SOURCES = src/rolling_hash_test.cc rolling_hash_test_LDADD = libvcdcom.la libgtest_main.la varint_bigendian_test_SOURCES = src/varint_bigendian_test.cc varint_bigendian_test_LDADD = libvcdcom.la libgtest_main.la -vcdecoder_test_SOURCES = src/vcdecoder_test.h src/vcdecoder_test.cc \ - src/vcdecoder1_test.cc src/vcdecoder2_test.cc \ - src/vcdecoder3_test.cc src/vcdecoder4_test.cc - -vcdecoder_test_LDADD = libvcddec.la libgtest_main.la +vcdecoder1_test_SOURCES = src/vcdecoder1_test.cc +vcdecoder1_test_LDADD = libvcdecoder_test_common.la +vcdecoder2_test_SOURCES = src/vcdecoder2_test.cc +vcdecoder2_test_LDADD = libvcdecoder_test_common.la +vcdecoder3_test_SOURCES = src/vcdecoder3_test.cc +vcdecoder3_test_LDADD = libvcdecoder_test_common.la +vcdecoder4_test_SOURCES = src/vcdecoder4_test.cc +vcdecoder4_test_LDADD = libvcdecoder_test_common.la +vcdecoder5_test_SOURCES = src/vcdecoder5_test.cc +vcdecoder5_test_LDADD = libvcdecoder_test_common.la vcdiffengine_test_SOURCES = src/vcdiffengine_test.cc vcdiffengine_test_LDADD = libvcdenc.la libgtest_main.la vcencoder_test_SOURCES = src/vcencoder_test.cc @@ -480,7 +514,11 @@ EXTRA_DIST = $(check_SCRIPTS) \ vsprojects/varint_bigendian_test/varint_bigendian_test.vcproj \ vsprojects/vcdcom/vcdcom.vcproj \ vsprojects/vcddec/vcddec.vcproj \ - vsprojects/vcdecoder_test/vcdecoder_test.vcproj \ + vsprojects/vcdecoder1_test/vcdecoder1_test.vcproj \ + vsprojects/vcdecoder2_test/vcdecoder2_test.vcproj \ + vsprojects/vcdecoder3_test/vcdecoder3_test.vcproj \ + vsprojects/vcdecoder4_test/vcdecoder4_test.vcproj \ + vsprojects/vcdecoder5_test/vcdecoder5_test.vcproj \ vsprojects/vcdenc/vcdenc.vcproj \ vsprojects/vcdiff/vcdiff.vcproj \ vsprojects/vcdiffengine_test/vcdiffengine_test.vcproj \ @@ -587,6 +625,8 @@ libvcdcom.la: $(libvcdcom_la_OBJECTS) $(libvcdcom_la_DEPENDENCIES) $(CXXLINK) -rpath $(libdir) $(libvcdcom_la_OBJECTS) $(libvcdcom_la_LIBADD) $(LIBS) libvcddec.la: $(libvcddec_la_OBJECTS) $(libvcddec_la_DEPENDENCIES) $(CXXLINK) -rpath $(libdir) $(libvcddec_la_OBJECTS) $(libvcddec_la_LIBADD) $(LIBS) +libvcdecoder_test_common.la: $(libvcdecoder_test_common_la_OBJECTS) $(libvcdecoder_test_common_la_DEPENDENCIES) + $(CXXLINK) $(libvcdecoder_test_common_la_OBJECTS) $(libvcdecoder_test_common_la_LIBADD) $(LIBS) libvcdenc.la: $(libvcdenc_la_OBJECTS) $(libvcdenc_la_DEPENDENCIES) $(CXXLINK) -rpath $(libdir) $(libvcdenc_la_OBJECTS) $(libvcdenc_la_LIBADD) $(LIBS) install-binPROGRAMS: $(bin_PROGRAMS) @@ -661,9 +701,21 @@ rolling_hash_test$(EXEEXT): $(rolling_hash_test_OBJECTS) $(rolling_hash_test_DEP varint_bigendian_test$(EXEEXT): $(varint_bigendian_test_OBJECTS) $(varint_bigendian_test_DEPENDENCIES) @rm -f varint_bigendian_test$(EXEEXT) $(CXXLINK) $(varint_bigendian_test_OBJECTS) $(varint_bigendian_test_LDADD) $(LIBS) -vcdecoder_test$(EXEEXT): $(vcdecoder_test_OBJECTS) $(vcdecoder_test_DEPENDENCIES) - @rm -f vcdecoder_test$(EXEEXT) - $(CXXLINK) $(vcdecoder_test_OBJECTS) $(vcdecoder_test_LDADD) $(LIBS) +vcdecoder1_test$(EXEEXT): $(vcdecoder1_test_OBJECTS) $(vcdecoder1_test_DEPENDENCIES) + @rm -f vcdecoder1_test$(EXEEXT) + $(CXXLINK) $(vcdecoder1_test_OBJECTS) $(vcdecoder1_test_LDADD) $(LIBS) +vcdecoder2_test$(EXEEXT): $(vcdecoder2_test_OBJECTS) $(vcdecoder2_test_DEPENDENCIES) + @rm -f vcdecoder2_test$(EXEEXT) + $(CXXLINK) $(vcdecoder2_test_OBJECTS) $(vcdecoder2_test_LDADD) $(LIBS) +vcdecoder3_test$(EXEEXT): $(vcdecoder3_test_OBJECTS) $(vcdecoder3_test_DEPENDENCIES) + @rm -f vcdecoder3_test$(EXEEXT) + $(CXXLINK) $(vcdecoder3_test_OBJECTS) $(vcdecoder3_test_LDADD) $(LIBS) +vcdecoder4_test$(EXEEXT): $(vcdecoder4_test_OBJECTS) $(vcdecoder4_test_DEPENDENCIES) + @rm -f vcdecoder4_test$(EXEEXT) + $(CXXLINK) $(vcdecoder4_test_OBJECTS) $(vcdecoder4_test_LDADD) $(LIBS) +vcdecoder5_test$(EXEEXT): $(vcdecoder5_test_OBJECTS) $(vcdecoder5_test_DEPENDENCIES) + @rm -f vcdecoder5_test$(EXEEXT) + $(CXXLINK) $(vcdecoder5_test_OBJECTS) $(vcdecoder5_test_LDADD) $(LIBS) vcdiff$(EXEEXT): $(vcdiff_OBJECTS) $(vcdiff_DEPENDENCIES) @rm -f vcdiff$(EXEEXT) $(CXXLINK) $(vcdiff_OBJECTS) $(vcdiff_LDADD) $(LIBS) @@ -712,7 +764,8 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vcdecoder2_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vcdecoder3_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vcdecoder4_test.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vcdecoder_test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vcdecoder5_test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vcdecoder_test.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vcdiff_main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vcdiffengine.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vcdiffengine_test.Po@am__quote@ @@ -866,6 +919,13 @@ vcdecoder.lo: src/vcdecoder.cc @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o vcdecoder.lo `test -f 'src/vcdecoder.cc' || echo '$(srcdir)/'`src/vcdecoder.cc +vcdecoder_test.lo: src/vcdecoder_test.cc +@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT vcdecoder_test.lo -MD -MP -MF $(DEPDIR)/vcdecoder_test.Tpo -c -o vcdecoder_test.lo `test -f 'src/vcdecoder_test.cc' || echo '$(srcdir)/'`src/vcdecoder_test.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/vcdecoder_test.Tpo $(DEPDIR)/vcdecoder_test.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/vcdecoder_test.cc' object='vcdecoder_test.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o vcdecoder_test.lo `test -f 'src/vcdecoder_test.cc' || echo '$(srcdir)/'`src/vcdecoder_test.cc + blockhash.lo: src/blockhash.cc @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT blockhash.lo -MD -MP -MF $(DEPDIR)/blockhash.Tpo -c -o blockhash.lo `test -f 'src/blockhash.cc' || echo '$(srcdir)/'`src/blockhash.cc @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/blockhash.Tpo $(DEPDIR)/blockhash.Plo @@ -1041,20 +1101,6 @@ varint_bigendian_test.obj: src/varint_bigendian_test.cc @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o varint_bigendian_test.obj `if test -f 'src/varint_bigendian_test.cc'; then $(CYGPATH_W) 'src/varint_bigendian_test.cc'; else $(CYGPATH_W) '$(srcdir)/src/varint_bigendian_test.cc'; fi` -vcdecoder_test.o: src/vcdecoder_test.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT vcdecoder_test.o -MD -MP -MF $(DEPDIR)/vcdecoder_test.Tpo -c -o vcdecoder_test.o `test -f 'src/vcdecoder_test.cc' || echo '$(srcdir)/'`src/vcdecoder_test.cc -@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/vcdecoder_test.Tpo $(DEPDIR)/vcdecoder_test.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/vcdecoder_test.cc' object='vcdecoder_test.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o vcdecoder_test.o `test -f 'src/vcdecoder_test.cc' || echo '$(srcdir)/'`src/vcdecoder_test.cc - -vcdecoder_test.obj: src/vcdecoder_test.cc -@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT vcdecoder_test.obj -MD -MP -MF $(DEPDIR)/vcdecoder_test.Tpo -c -o vcdecoder_test.obj `if test -f 'src/vcdecoder_test.cc'; then $(CYGPATH_W) 'src/vcdecoder_test.cc'; else $(CYGPATH_W) '$(srcdir)/src/vcdecoder_test.cc'; fi` -@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/vcdecoder_test.Tpo $(DEPDIR)/vcdecoder_test.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/vcdecoder_test.cc' object='vcdecoder_test.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o vcdecoder_test.obj `if test -f 'src/vcdecoder_test.cc'; then $(CYGPATH_W) 'src/vcdecoder_test.cc'; else $(CYGPATH_W) '$(srcdir)/src/vcdecoder_test.cc'; fi` - vcdecoder1_test.o: src/vcdecoder1_test.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT vcdecoder1_test.o -MD -MP -MF $(DEPDIR)/vcdecoder1_test.Tpo -c -o vcdecoder1_test.o `test -f 'src/vcdecoder1_test.cc' || echo '$(srcdir)/'`src/vcdecoder1_test.cc @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/vcdecoder1_test.Tpo $(DEPDIR)/vcdecoder1_test.Po @@ -1111,6 +1157,20 @@ vcdecoder4_test.obj: src/vcdecoder4_test.cc @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o vcdecoder4_test.obj `if test -f 'src/vcdecoder4_test.cc'; then $(CYGPATH_W) 'src/vcdecoder4_test.cc'; else $(CYGPATH_W) '$(srcdir)/src/vcdecoder4_test.cc'; fi` +vcdecoder5_test.o: src/vcdecoder5_test.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT vcdecoder5_test.o -MD -MP -MF $(DEPDIR)/vcdecoder5_test.Tpo -c -o vcdecoder5_test.o `test -f 'src/vcdecoder5_test.cc' || echo '$(srcdir)/'`src/vcdecoder5_test.cc +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/vcdecoder5_test.Tpo $(DEPDIR)/vcdecoder5_test.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/vcdecoder5_test.cc' object='vcdecoder5_test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o vcdecoder5_test.o `test -f 'src/vcdecoder5_test.cc' || echo '$(srcdir)/'`src/vcdecoder5_test.cc + +vcdecoder5_test.obj: src/vcdecoder5_test.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT vcdecoder5_test.obj -MD -MP -MF $(DEPDIR)/vcdecoder5_test.Tpo -c -o vcdecoder5_test.obj `if test -f 'src/vcdecoder5_test.cc'; then $(CYGPATH_W) 'src/vcdecoder5_test.cc'; else $(CYGPATH_W) '$(srcdir)/src/vcdecoder5_test.cc'; fi` +@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/vcdecoder5_test.Tpo $(DEPDIR)/vcdecoder5_test.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/vcdecoder5_test.cc' object='vcdecoder5_test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o vcdecoder5_test.obj `if test -f 'src/vcdecoder5_test.cc'; then $(CYGPATH_W) 'src/vcdecoder5_test.cc'; else $(CYGPATH_W) '$(srcdir)/src/vcdecoder5_test.cc'; fi` + vcdiff_main.o: src/vcdiff_main.cc @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT vcdiff_main.o -MD -MP -MF $(DEPDIR)/vcdiff_main.Tpo -c -o vcdiff_main.o `test -f 'src/vcdiff_main.cc' || echo '$(srcdir)/'`src/vcdiff_main.cc @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/vcdiff_main.Tpo $(DEPDIR)/vcdiff_main.Po @@ -7530,3 +7530,4 @@ AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR +m4_include([m4/ac_have_attribute.m4]) @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.61 for open-vcdiff 0.5. +# Generated by GNU Autoconf 2.61 for open-vcdiff 0.6. # # Report bugs to <opensource@google.com>. # @@ -728,8 +728,8 @@ SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='open-vcdiff' PACKAGE_TARNAME='open-vcdiff' -PACKAGE_VERSION='0.5' -PACKAGE_STRING='open-vcdiff 0.5' +PACKAGE_VERSION='0.6' +PACKAGE_STRING='open-vcdiff 0.6' PACKAGE_BUGREPORT='opensource@google.com' ac_unique_file="README" @@ -1397,7 +1397,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures open-vcdiff 0.5 to adapt to many kinds of systems. +\`configure' configures open-vcdiff 0.6 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1467,7 +1467,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of open-vcdiff 0.5:";; + short | recursive ) echo "Configuration of open-vcdiff 0.6:";; esac cat <<\_ACEOF @@ -1476,10 +1476,10 @@ Optional Features: --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors + --enable-fast-install[=PKGS] + optimize for fast installation [default=no] --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] - --enable-fast-install[=PKGS] - optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) Optional Packages: @@ -1569,7 +1569,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -open-vcdiff configure 0.5 +open-vcdiff configure 0.6 generated by GNU Autoconf 2.61 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, @@ -1583,7 +1583,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by open-vcdiff $as_me 0.5, which was +It was created by open-vcdiff $as_me 0.6, which was generated by GNU Autoconf 2.61. Invocation command line was $ $0 $@ @@ -2274,7 +2274,7 @@ fi # Define the identity of the package. PACKAGE='open-vcdiff' - VERSION='0.5' + VERSION='0.6' cat >>confdefs.h <<_ACEOF @@ -4307,75 +4307,81 @@ case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac -# Check whether --enable-shared was given. -if test "${enable_shared+set}" = set; then - enableval=$enable_shared; p=${PACKAGE-default} +# Issue #21: Fail to test on MinGW 5.1.4 +# Disabling fast install keeps libtool from creating wrapper scripts around +# the executables it builds. Such scripts have caused failures on MinGW. +# Using this option means an extra link step is executed during "make install". +# Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then + enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; *) - enable_shared=no + enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then - enable_shared=yes + enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else - enable_shared=yes + enable_fast_install=no fi -# Check whether --enable-static was given. -if test "${enable_static+set}" = set; then - enableval=$enable_static; p=${PACKAGE-default} + + +# Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then + enableval=$enable_shared; p=${PACKAGE-default} case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; + yes) enable_shared=yes ;; + no) enable_shared=no ;; *) - enable_static=no + enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then - enable_static=yes + enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else - enable_static=yes + enable_shared=yes fi -# Check whether --enable-fast-install was given. -if test "${enable_fast_install+set}" = set; then - enableval=$enable_fast_install; p=${PACKAGE-default} +# Check whether --enable-static was given. +if test "${enable_static+set}" = set; then + enableval=$enable_static; p=${PACKAGE-default} case $enableval in - yes) enable_fast_install=yes ;; - no) enable_fast_install=no ;; + yes) enable_static=yes ;; + no) enable_static=no ;; *) - enable_fast_install=no + enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then - enable_fast_install=yes + enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else - enable_fast_install=yes + enable_static=yes fi @@ -5032,7 +5038,7 @@ ia64-*-hpux*) ;; *-*-irix6*) # Find out which ABI we are using. - echo '#line 5035 "configure"' > conftest.$ac_ext + echo '#line 5041 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -7387,11 +7393,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:7390: $lt_compile\"" >&5) + (eval echo "\"\$as_me:7396: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:7394: \$? = $ac_status" >&5 + echo "$as_me:7400: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -7677,11 +7683,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:7680: $lt_compile\"" >&5) + (eval echo "\"\$as_me:7686: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:7684: \$? = $ac_status" >&5 + echo "$as_me:7690: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -7781,11 +7787,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:7784: $lt_compile\"" >&5) + (eval echo "\"\$as_me:7790: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:7788: \$? = $ac_status" >&5 + echo "$as_me:7794: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -10158,7 +10164,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<EOF -#line 10161 "configure" +#line 10167 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -10258,7 +10264,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<EOF -#line 10261 "configure" +#line 10267 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -12659,11 +12665,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:12662: $lt_compile\"" >&5) + (eval echo "\"\$as_me:12668: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:12666: \$? = $ac_status" >&5 + echo "$as_me:12672: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -12763,11 +12769,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:12766: $lt_compile\"" >&5) + (eval echo "\"\$as_me:12772: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:12770: \$? = $ac_status" >&5 + echo "$as_me:12776: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -14361,11 +14367,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:14364: $lt_compile\"" >&5) + (eval echo "\"\$as_me:14370: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:14368: \$? = $ac_status" >&5 + echo "$as_me:14374: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -14465,11 +14471,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:14468: $lt_compile\"" >&5) + (eval echo "\"\$as_me:14474: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:14472: \$? = $ac_status" >&5 + echo "$as_me:14478: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -16685,11 +16691,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:16688: $lt_compile\"" >&5) + (eval echo "\"\$as_me:16694: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:16692: \$? = $ac_status" >&5 + echo "$as_me:16698: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -16975,11 +16981,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:16978: $lt_compile\"" >&5) + (eval echo "\"\$as_me:16984: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:16982: \$? = $ac_status" >&5 + echo "$as_me:16988: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -17079,11 +17085,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:17082: $lt_compile\"" >&5) + (eval echo "\"\$as_me:17088: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:17086: \$? = $ac_status" >&5 + echo "$as_me:17092: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -21835,7 +21841,69 @@ _ACEOF fi -AX_C___ATTRIBUTE__ + + { echo "$as_me:$LINENO: checking for __attribute__" >&5 +echo $ECHO_N "checking for __attribute__... $ECHO_C" >&6; } + if test "${ac_cv___attribute__+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <stdlib.h> + static void foo(void) __attribute__ ((unused)); + void foo(void) { exit(1); } +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv___attribute__=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv___attribute__=no + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + + if test "$ac_cv___attribute__" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE___ATTRIBUTE__ 1 +_ACEOF + + fi + { echo "$as_me:$LINENO: result: $ac_cv___attribute__" >&5 +echo "${ECHO_T}$ac_cv___attribute__" >&6; } + # End of definitions needed by gflags package @@ -22274,7 +22342,7 @@ exec 6>&1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by open-vcdiff $as_me 0.5, which was +This file was extended by open-vcdiff $as_me 0.6, which was generated by GNU Autoconf 2.61. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -22327,7 +22395,7 @@ Report bugs to <bug-autoconf@gnu.org>." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ -open-vcdiff config.status 0.5 +open-vcdiff config.status 0.6 configured by $0, generated by GNU Autoconf 2.61, with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" diff --git a/configure.ac b/configure.ac index 399351e..b47421c 100644 --- a/configure.ac +++ b/configure.ac @@ -4,7 +4,7 @@ # make sure we're interpreted by some minimal autoconf AC_PREREQ(2.57) -AC_INIT(open-vcdiff, 0.5, opensource@google.com) +AC_INIT(open-vcdiff, 0.6, opensource@google.com) AC_CONFIG_SRCDIR(README) AM_INIT_AUTOMAKE AM_CONFIG_HEADER(src/config.h) @@ -16,6 +16,12 @@ AC_PROG_CXX AM_CONDITIONAL(GCC, test "$GCC" = yes) # let the Makefile know if we're gcc AC_CANONICAL_HOST +# Issue #21: Fail to test on MinGW 5.1.4 +# Disabling fast install keeps libtool from creating wrapper scripts around +# the executables it builds. Such scripts have caused failures on MinGW. +# Using this option means an extra link step is executed during "make install". +AC_DISABLE_FAST_INSTALL + AC_PROG_LIBTOOL AC_SUBST(LIBTOOL_DEPS) diff --git a/packages/deb/changelog b/packages/deb/changelog index 0885f22..cd17567 100644 --- a/packages/deb/changelog +++ b/packages/deb/changelog @@ -1,83 +1,30 @@ +open-vcdiff (0.6-1) unstable; urgency=low + + * New upstream release. + + -- Google Inc. <opensource@google.com> Thu, 09 Apr 2009 09:16:58 -0700 + open-vcdiff (0.5-1) unstable; urgency=low - * Issue #14: HashedDictionary may free memory twice if implicitly copied. - * Add private copy constructor and assignment operator for HashedDictionary. - * Issue #18: Building RPM package fails on Fedora 9: Installed (but - unpackaged) file vcdiff.1.gz. - * Some OS, including Fedora 9, automatically compress man pages that are - installed using /usr/bin/install. This confuses the RPM packager, which - expects a file named "vcdiff.1" and finds one named "vcdiff.1.gz" instead. - Use a wild-card character to accept either of these two alternatives. - * Change the VCDIFF block size to 16, but have the encoder discard all matches - smaller than 32 bytes. This doubles the CPU and memory needed by the - encoder, but finds better string matches, producing a more efficient - encoding. Loosen the timing test limit in blockhash_test.cc for the debug - build only. - * Make the code table writer a virtual interface. - * Add an interface SetTargetMatching() to the simple encoder class - VCDEncoder. - * Remove all references to LOG and logging.h from the unit tests and - command-line client. - * Remove all special cases for kBlockSize < 4. kBlockSize must be a multiple - of the machine word size (see blockhash.cc), so it will never be smaller - than 4. - * Use version 1.10 of Automake. - * Incorporate recent changes to gflags package - (http://code.google.com/p/google-gflags/) - * Fix Visual Studio type-mismatch warning in vcdecoder4_test.cc. - * Use address cache helper functions IsSameMode(), IsHereMode(), etc. to - simplify test code. - * Add contributor's name to THANKS file. + * New upstream release. -- Google Inc. <opensource@google.com> Wed, 18 Mar 2009 14:28:23 -0700 open-vcdiff (0.4-1) unstable; urgency=low - * Issue #15: open-vcdiff fails to compile on Fedora 9 - * Apply patch sent by Daniel Kegel - * Add header <string.h> to src/vcdiffengine.cc, which uses memcpy. - * Remove const qualifier from integral return types to fix gcc 4.3.1 - warning. - * Issue #6: vcdiff crashes with zero-size dictionary - * Add special cases for empty dictionary file in vcdiff_main.cc. - * Issue #7: vcdiff incorrect binary I/O on Windows - * Change stdin/stdout file type to binary in vcdiff_main.cc. - * Issue #13: Add unit test for vcdiff command-line executable - * Unit test vcdiff_test.bat added for Visual Studio testing of vcdiff.exe. - Includes regression tests for issues #6 and #7. - * Add contributors' names to THANKS file. + * New upstream release. -- Google Inc. <opensource@google.com> Thu, 23 Oct 2008 09:03:56 -0700 open-vcdiff (0.3-1) unstable; urgency=low - * Issue #15: open-vcdiff fails to compile on Fedora 9 - * Add header <string.h> to source files that use memcmp, memset, memcpy, - and/or strlen. - * Change C++-style includes like <cstdlib> to C-style includes like - <stdlib.h> so that function names are guaranteed to be defined in the - global namespace. - * Issue #8: Decoder should not crash if it runs out of memory - * Add a new interface that places a limit on the maximum bytes allowed in - a single target window or a target file. - * Issue #13: Add unit test for vcdiff command-line executable - * Unit test vcdiff_test.sh added for Linux and Mac builds. - * Still need to add a Windows version of this test. + * New upstream release. -- Google Inc. <opensource@google.com> Fri, 10 Oct 2008 11:16:23 -0700 open-vcdiff (0.2-1) unstable; urgency=low - * Fix problems found on OpenBSD platform. - * Issue #1: vcdiff command-line executable crashes on startup. - This was a problem with the stub intended to replace pthread_once if the - package was not linked with the pthreads library. Simplify gflags.cc to - assume single-threaded execution. - * Issue #2: Unit test blockhash_test fails. - Define VCDIFF_USE_BLOCK_COMPARE_WORDS for BSD platforms to ensure that - the most efficient version of memcmp is used in the encoder's inner loop. - * Fix compilation warnings in gtest-filepath.cc: "warning: missing - initializer for member 'stat::...'" + * New upstream release. -- Google Inc. <opensource@google.com> Tue, 2 Sep 2008 09:20:20 -0700 diff --git a/src/config.h.in b/src/config.h.in index 8881344..1694022 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -78,6 +78,9 @@ /* Define to 1 if you have the <windows.h> header file. */ #undef HAVE_WINDOWS_H +/* define if your compiler has __attribute__ */ +#undef HAVE___ATTRIBUTE__ + /* Define to 1 if the system has the type `__int16'. */ #undef HAVE___INT16 diff --git a/src/google/vcdecoder.h b/src/google/vcdecoder.h index 72c2ed7..c834517 100644 --- a/src/google/vcdecoder.h +++ b/src/google/vcdecoder.h @@ -118,44 +118,13 @@ class VCDiffStreamingDecoder { // than this limit, it will log an error and stop decoding. bool SetMaximumTargetWindowSize(size_t new_maximum_target_window_size); - // *** Diagnostic interfaces *** - - // The decoder can create a version of the output target string with XML tags - // added to indicate where each section of the decoded text came from. This - // can assist in debugging the decoder and/or determining the effectiveness of - // a particular dictionary. The following XML tags will be added. Despite - // the formatting of this example, newlines will not be added between tags. - // <dmatch>This text matched with the dictionary</dmatch> - // <bmatch>This text matched earlier target output</bmatch> - // <literal>This text found no match</literal> - // - // Calling EnableAnnotatedOutput() will enable this feature. The interface - // GetAnnotatedOutput() can be used to retrieve the annotated text. It is - // recommended to use this feature only when the target data consists of HTML - // or other human-readable text. - - // Enables the annotated output feature. After this method is called, new - // target windows added to output_string by DecodeChunk() will also be added - // to the annotated output, and can be retrieved using GetAnnotatedOutput(). - // If annotated output is already enabled, this function has no effect. - void EnableAnnotatedOutput(); - - // Disables the annotated output feature. After calling this method, - // GetAnnotatedOutput() will produce an empty string until - // EnableAnnotatedOutput() is called again. - void DisableAnnotatedOutput(); - - // Replaces annotated_output with a copy of the annotated output string. - // Annotated output collection begins when EnableAnnotatedOutput() is called. - // The annotated output will be cleared each time StartDecoding() is called, - // but not when FinishDecoding() is called. - template<class OutputType> - void GetAnnotatedOutput(OutputType* annotated_output) { - OutputString<OutputType> output_string(annotated_output); - GetAnnotatedOutputToInterface(&output_string); - } - - void GetAnnotatedOutputToInterface(OutputStringInterface* annotated_output); + // This interface must be called before StartDecoding(). If its argument + // is true, then the VCD_TARGET flag can be specified to allow the source + // segment to be chosen from the previously-decoded target data. (This is the + // default behavior.) If it is false, then specifying the VCD_TARGET flag is + // considered an error, and the decoder does not need to keep in memory any + // decoded target data prior to the current window. + void SetAllowVcdTarget(bool allow_vcd_target); private: VCDiffStreamingDecoderImpl* const impl_; diff --git a/src/headerparser.cc b/src/headerparser.cc index ead4f44..02f7f31 100644 --- a/src/headerparser.cc +++ b/src/headerparser.cc @@ -205,6 +205,7 @@ bool VCDiffHeaderParser::ParseSourceSegmentLengthAndPosition( bool VCDiffHeaderParser::ParseWinIndicatorAndSourceSegment( size_t dictionary_size, size_t decoded_target_size, + bool allow_vcd_target, unsigned char* win_indicator, size_t* source_segment_length, size_t* source_segment_position) { @@ -221,6 +222,12 @@ bool VCDiffHeaderParser::ParseWinIndicatorAndSourceSegment( source_segment_length, source_segment_position); case VCD_TARGET: + if (!allow_vcd_target) { + LOG(ERROR) << "Delta file contains VCD_TARGET flag, which is not " + "allowed by current decoder settings" << LOG_ENDL; + return_code_ = RESULT_ERROR; + return false; + } return ParseSourceSegmentLengthAndPosition(decoded_target_size, "current target position", "target file", diff --git a/src/headerparser.h b/src/headerparser.h index c74fa25..eb0ea8e 100644 --- a/src/headerparser.h +++ b/src/headerparser.h @@ -257,6 +257,9 @@ class VCDiffHeaderParser { // source_segment_length and source_segment_position if the source segment // is taken from the target (i.e., if the parsed *win_indicator equals // VCD_TARGET.) + // allow_vcd_target: If this argument is false, and the parsed *win_indicator + // is VCD_TARGET, then an error is produced; if true, VCD_TARGET is + // allowed. // win_indicator (output): Points to a single unsigned char (not an array) // that will receive the parsed value of Win_Indicator. // source_segment_length (output): The parsed length of the source segment. @@ -264,6 +267,7 @@ class VCDiffHeaderParser { // source/target file from which the source segment is to be taken. bool ParseWinIndicatorAndSourceSegment(size_t dictionary_size, size_t decoded_target_size, + bool allow_vcd_target, unsigned char* win_indicator, size_t* source_segment_length, size_t* source_segment_position); diff --git a/src/mutex.h b/src/mutex.h index d15579e..eda1f4e 100644 --- a/src/mutex.h +++ b/src/mutex.h @@ -167,7 +167,7 @@ class Mutex { inline void SetIsSafe() { is_safe_ = true; } // Catch the error of writing Mutex when intending MutexLock. - Mutex(Mutex *ignored) {} + Mutex(Mutex* /*ignored*/) {} // Disallow "evil" constructors Mutex(const Mutex&); void operator=(const Mutex&); @@ -226,7 +226,8 @@ void Mutex::Lock() { SAFE_PTHREAD(pthread_rwlock_wrlock); } void Mutex::Unlock() { SAFE_PTHREAD(pthread_rwlock_unlock); } #ifdef GMUTEX_TRYLOCK bool Mutex::TryLock() { return is_safe_ ? - pthread_rwlock_trywrlock(&mutex_) == 0 : true; } + pthread_rwlock_trywrlock(&mutex_) == 0 : + true; } #endif void Mutex::ReaderLock() { SAFE_PTHREAD(pthread_rwlock_rdlock); } void Mutex::ReaderUnlock() { SAFE_PTHREAD(pthread_rwlock_unlock); } diff --git a/src/vcdecoder.cc b/src/vcdecoder.cc index 02afa87..5454e24 100644 --- a/src/vcdecoder.cc +++ b/src/vcdecoder.cc @@ -46,28 +46,6 @@ namespace open_vcdiff { -namespace { - -enum VCDiffAnnotationType { - VCD_ANNOTATION_LITERAL, - VCD_ANNOTATION_DMATCH, - VCD_ANNOTATION_BMATCH -}; - -static const char* kAnnotationStartTags[] = { - "<literal>", - "<dmatch>", - "<bmatch>" -}; - -static const char* kAnnotationEndTags[] = { - "</literal>", - "</dmatch>", - "</bmatch>" -}; - -} // anonymous namespace - // This class is used to parse delta file windows as described // in RFC sections 4.2 and 4.3. Its methods are not thread-safe. // @@ -133,10 +111,9 @@ class VCDiffDeltaFileWindow { // Decodes as many delta windows as possible using the input data from // *parseable_chunk. Appends the decoded target windows to - // parent_->decoded_target(). If annotated output is enabled, appends - // annotated output to parent_->annotated_output(). Returns RESULT_SUCCESS on - // success, or RESULT_END_OF_DATA if the end of input was reached before the - // entire window could be decoded and more input is expected (only possible if + // parent_->decoded_target(). Returns RESULT_SUCCESS on success, or + // RESULT_END_OF_DATA if the end of input was reached before the entire window + // could be decoded and more input is expected (only possible if // IsInterleaved() is true), or RESULT_ERROR if an error occurred during // decoding. In the RESULT_ERROR case, the value of parseable_chunk->pointer_ // is undefined; otherwise, parseable_chunk->Advance() is called to point to @@ -166,19 +143,15 @@ class VCDiffDeltaFileWindow { return IsInterleaved() && (interleaved_bytes_expected_ > 0); } - // Returns the number of bytes remaining to be decoded in the target window. - // If not in the process of decoding a window, returns 0. - size_t TargetBytesRemaining(); + size_t target_window_start_pos() const { return target_window_start_pos_; } - void EnableAnnotatedOutput() { - if (!annotated_output_.get()) { - annotated_output_.reset(new string); - } + void set_target_window_start_pos(size_t new_start_pos) { + target_window_start_pos_ = new_start_pos; } - void DisableAnnotatedOutput() { - annotated_output_.reset(NULL); - } + // Returns the number of bytes remaining to be decoded in the target window. + // If not in the process of decoding a window, returns 0. + size_t TargetBytesRemaining(); private: // Reads the header of the window section as described in RFC sections 4.2 and @@ -271,20 +244,12 @@ class VCDiffDeltaFileWindow { // Executes a single COPY or ADD instruction, appending data to // parent_->decoded_target(). - void CopyBytes(const char* data, - size_t size, - VCDiffAnnotationType annotation_type); + void CopyBytes(const char* data, size_t size); // Executes a single RUN instruction, appending data to // parent_->decoded_target(). void RunByte(unsigned char byte, size_t size); - void AppendAnnotatedOutput(string* annotated_output) { - if (annotated_output_.get()) { - annotated_output->append(*annotated_output_.get()); - } - } - // Advance *parseable_chunk to point to the current position in the // instructions/sizes section. If interleaved format is used, then // decrement the number of expected bytes in the instructions/sizes section @@ -335,12 +300,6 @@ class VCDiffDeltaFileWindow { VCDiffCodeTableReader reader_; - // This value is initialized to NULL, which means that annotated output is - // disabled. If EnableAnnotatedOutput() is called, it will be set to point - // to a new string object, and annotated output will be gathered into that - // string. - std::auto_ptr<string> annotated_output_; - // Making these private avoids implicit copy constructor & assignment operator VCDiffDeltaFileWindow(const VCDiffDeltaFileWindow&); // NOLINT void operator=(const VCDiffDeltaFileWindow&); @@ -368,9 +327,8 @@ class VCDiffStreamingDecoderImpl { // SetMaximumTargetFileSize() is not called. static const size_t kDefaultMaximumTargetFileSize = 67108864U; // 64 MB - // The largest value that can be passed to SetMaximumTargetFileSize() or - // SetMaximumTargetWindowSize(). Using a larger value will result in an - // error. + // The largest value that can be passed to SetMaximumTargetWindowSize(). + // Using a larger value will result in an error. static const size_t kTargetSizeLimit = 2147483647U; // INT32_MAX // A constant that is the default value for planned_target_file_size_, @@ -419,12 +377,6 @@ class VCDiffStreamingDecoderImpl { bool AllowChecksum() const { return vcdiff_version_code_ == 'S'; } bool SetMaximumTargetFileSize(size_t new_maximum_target_file_size) { - if (new_maximum_target_file_size > kTargetSizeLimit) { - LOG(ERROR) << "Specified maximum target file size " - << new_maximum_target_file_size << " exceeds limit of " - << kTargetSizeLimit << " bytes" << LOG_ENDL; - return false; - } maximum_target_file_size_ = new_maximum_target_file_size; return true; } @@ -449,6 +401,10 @@ class VCDiffStreamingDecoderImpl { planned_target_file_size_ = planned_target_file_size; } + void AddToTotalTargetWindowSize(size_t window_size) { + total_of_target_window_sizes_ += window_size; + } + // Checks to see whether the decoded target data has reached its planned size. bool ReachedPlannedTargetFileSize() const { if (!HasPlannedTargetFileSize()) { @@ -459,14 +415,14 @@ class VCDiffStreamingDecoderImpl { // each target window would not make the target file exceed that limit, and // DecodeBody() will return RESULT_ERROR if the actual decoded output ever // exceeds the advertised target window size. - if (decoded_target_.size() > planned_target_file_size_) { + if (total_of_target_window_sizes_ > planned_target_file_size_) { LOG(DFATAL) << "Internal error: Decoded data size " - << decoded_target_.size() + << total_of_target_window_sizes_ << " exceeds planned target file size " << planned_target_file_size_ << LOG_ENDL; return true; } - return decoded_target_.size() == planned_target_file_size_; + return total_of_target_window_sizes_ == planned_target_file_size_; } // Checks to see whether adding a new target window of the specified size @@ -521,27 +477,20 @@ class VCDiffStreamingDecoderImpl { string* decoded_target() { return &decoded_target_; } - string* annotated_output() { return &annotated_output_; } + bool allow_vcd_target() const { return allow_vcd_target_; } - // The variable that determines whether annotated output is enabled is - // delta_window_.annotated_output_. If that member is NULL, then the feature - // is disabled. - void EnableAnnotatedOutput() { - delta_window_.EnableAnnotatedOutput(); + void SetAllowVcdTarget(bool allow_vcd_target) { + if (start_decoding_was_called_) { + LOG(DFATAL) << "SetAllowVcdTarget() called after StartDecoding()" + << LOG_ENDL; + return; + } + allow_vcd_target_ = allow_vcd_target; } - void DisableAnnotatedOutput() { - delta_window_.DisableAnnotatedOutput(); - } - - void GetAnnotatedOutput(OutputStringInterface* annotated_output) { - // We could use annotated_output->assign(), but that method is not defined - // for some output string types, so use clear() + append() to accomplish the - // same thing. - annotated_output->clear(); - annotated_output->append(annotated_output_.data(), - annotated_output_.size()); - } + // Removes the contents of decoded_target_ that precede the beginning of the + // current window. + void TruncateToBeginningOfWindow(); private: // Reads the VCDiff delta file header section as described in RFC section 4.1, @@ -634,11 +583,10 @@ class VCDiffStreamingDecoderImpl { size_t maximum_target_window_size_; - // This string will always be empty until EnableAnnotatedOutput() is called, - // at which point it will start to accumulate annotated delta windows each - // time DecodeChunk() finishes a window. It will be cleared each time that - // StartDecoding() is called. - string annotated_output_; + // Contains the sum of the decoded sizes of all target windows seen so far, + // including the expected total size of the current target window in progress + // (even if some of the current target window has not yet been decoded.) + size_t total_of_target_window_sizes_; // This value is used to ensure the correct order of calls to the interface // functions, i.e., a single call to StartDecoding(), followed by zero or @@ -646,6 +594,13 @@ class VCDiffStreamingDecoderImpl { // FinishDecoding(). bool start_decoding_was_called_; + // If this value is true then the VCD_TARGET flag can be specified to allow + // the source segment to be chosen from the previously-decoded target data. + // (This is the default behavior.) If it is false, then specifying the + // VCD_TARGET flag is considered an error, and the decoder does not need to + // keep in memory any decoded target data prior to the current window. + bool allow_vcd_target_; + // Making these private avoids implicit copy constructor & assignment operator VCDiffStreamingDecoderImpl(const VCDiffStreamingDecoderImpl&); // NOLINT void operator=(const VCDiffStreamingDecoderImpl&); @@ -658,7 +613,8 @@ const size_t VCDiffStreamingDecoderImpl::kUnlimitedBytes; VCDiffStreamingDecoderImpl::VCDiffStreamingDecoderImpl() : maximum_target_file_size_(kDefaultMaximumTargetFileSize), - maximum_target_window_size_(kDefaultMaximumTargetFileSize) { + maximum_target_window_size_(kDefaultMaximumTargetFileSize), + allow_vcd_target_(true) { delta_window_.Init(this); Reset(); } @@ -672,12 +628,19 @@ void VCDiffStreamingDecoderImpl::Reset() { dictionary_size_ = 0; vcdiff_version_code_ = '\0'; planned_target_file_size_ = kUnlimitedBytes; + total_of_target_window_sizes_ = 0; addr_cache_.reset(); custom_code_table_.reset(); custom_code_table_decoder_.reset(); delta_window_.Reset(); } +void VCDiffStreamingDecoderImpl::TruncateToBeginningOfWindow() { + // Conserve the data for the current window that has been partially decoded. + decoded_target_.erase(0, delta_window_.target_window_start_pos()); + delta_window_.set_target_window_start_pos(0); +} + void VCDiffStreamingDecoderImpl::StartDecoding(const char* dictionary_ptr, size_t dictionary_size) { if (start_decoding_was_called_) { @@ -687,7 +650,6 @@ void VCDiffStreamingDecoderImpl::StartDecoding(const char* dictionary_ptr, } unparsed_bytes_.clear(); decoded_target_.clear(); // delta_window_.Reset() depends on this - annotated_output_.clear(); Reset(); dictionary_ptr_ = dictionary_ptr; dictionary_size_ = dictionary_size; @@ -933,6 +895,11 @@ bool VCDiffStreamingDecoderImpl::DecodeChunk( parseable_chunk.UnparsedSize()); output_tracker.AppendNewOutputText(delta_window_.TargetBytesRemaining(), output_string); + if (!allow_vcd_target()) { + // VCD_TARGET will never be used to reference target data beyond the start + // of the current window, so throw away any earlier target data. + TruncateToBeginningOfWindow(); + } return true; } @@ -966,26 +933,28 @@ bool VCDiffStreamingDecoderImpl::TargetWindowWouldExceedSizeLimits( if (HasPlannedTargetFileSize()) { // The logical expression to check would be: // - // decoded_target_.size() + window_size > planned_target_file_size_ + // total_of_target_window_sizes_ + window_size > planned_target_file_size_ // // but the addition might cause an integer overflow if target_bytes_to_add // is very large. So it is better to check target_bytes_to_add against // the remaining planned target bytes. size_t remaining_planned_target_file_size = - planned_target_file_size_ - decoded_target_.size(); + planned_target_file_size_ - total_of_target_window_sizes_; if (window_size > remaining_planned_target_file_size) { LOG(ERROR) << "Length of target window (" << window_size - << " bytes) plus previous windows (" << decoded_target_.size() + << " bytes) plus previous windows (" + << total_of_target_window_sizes_ << " bytes) would exceed planned size of " << planned_target_file_size_ << " bytes" << LOG_ENDL; return true; } } size_t remaining_maximum_target_bytes = - maximum_target_file_size_ - decoded_target_.size(); + maximum_target_file_size_ - total_of_target_window_sizes_; if (window_size > remaining_maximum_target_bytes) { LOG(ERROR) << "Length of target window (" << window_size - << " bytes) plus previous windows (" << decoded_target_.size() + << " bytes) plus previous windows (" + << total_of_target_window_sizes_ << " bytes) would exceed maximum target file size of " << maximum_target_file_size_ << " bytes" << LOG_ENDL; return true; @@ -1013,9 +982,6 @@ void VCDiffDeltaFileWindow::Reset() { has_checksum_ = false; expected_checksum_ = 0; - if (annotated_output_.get()) { - annotated_output_->clear(); - } } VCDiffResult VCDiffDeltaFileWindow::SetUpWindowSections( @@ -1093,6 +1059,7 @@ VCDiffResult VCDiffDeltaFileWindow::ReadHeader( if (!header_parser.ParseWinIndicatorAndSourceSegment( parent_->dictionary_size(), decoded_target->size(), + parent_->allow_vcd_target(), &win_indicator, &source_segment_length_, &source_segment_position)) { @@ -1125,6 +1092,7 @@ VCDiffResult VCDiffDeltaFileWindow::ReadHeader( // The whole window header was found and parsed successfully. found_header_ = true; parseable_chunk->Advance(header_parser.ParsedSize()); + parent_->AddToTotalTargetWindowSize(target_window_length_); return RESULT_SUCCESS; } @@ -1138,7 +1106,7 @@ void VCDiffDeltaFileWindow::UpdateInstructionPointer( } } -size_t VCDiffDeltaFileWindow::TargetBytesDecoded() { +inline size_t VCDiffDeltaFileWindow::TargetBytesDecoded() { return parent_->decoded_target()->size() - target_window_start_pos_; } @@ -1151,24 +1119,12 @@ size_t VCDiffDeltaFileWindow::TargetBytesRemaining() { } } -void VCDiffDeltaFileWindow::CopyBytes(const char* data, - size_t size, - VCDiffAnnotationType annotation_type) { +inline void VCDiffDeltaFileWindow::CopyBytes(const char* data, size_t size) { parent_->decoded_target()->append(data, size); - if (annotated_output_.get()) { - annotated_output_->append(kAnnotationStartTags[annotation_type]); - annotated_output_->append(data, size); - annotated_output_->append(kAnnotationEndTags[annotation_type]); - } } -void VCDiffDeltaFileWindow::RunByte(unsigned char byte, size_t size) { +inline void VCDiffDeltaFileWindow::RunByte(unsigned char byte, size_t size) { parent_->decoded_target()->append(size, byte); - if (annotated_output_.get()) { - annotated_output_->append(kAnnotationStartTags[VCD_ANNOTATION_LITERAL]); - annotated_output_->append(size, byte); - annotated_output_->append(kAnnotationEndTags[VCD_ANNOTATION_LITERAL]); - } } VCDiffResult VCDiffDeltaFileWindow::DecodeAdd(size_t size) { @@ -1176,7 +1132,7 @@ VCDiffResult VCDiffDeltaFileWindow::DecodeAdd(size_t size) { return RESULT_END_OF_DATA; } // Write the next "size" data bytes - CopyBytes(data_for_add_and_run_.UnparsedData(), size, VCD_ANNOTATION_LITERAL); + CopyBytes(data_for_add_and_run_.UnparsedData(), size); data_for_add_and_run_.Advance(size); return RESULT_SUCCESS; } @@ -1221,16 +1177,14 @@ VCDiffResult VCDiffDeltaFileWindow::DecodeCopy(size_t size, size_t address = static_cast<size_t>(decoded_address); if ((address + size) <= source_segment_length_) { // Copy all data from source segment - CopyBytes(&source_segment_ptr_[address], size, VCD_ANNOTATION_DMATCH); + CopyBytes(&source_segment_ptr_[address], size); return RESULT_SUCCESS; } // Copy some data from target window... if (address < source_segment_length_) { // ... plus some data from source segment const size_t partial_copy_size = source_segment_length_ - address; - CopyBytes(&source_segment_ptr_[address], - partial_copy_size, - VCD_ANNOTATION_DMATCH); + CopyBytes(&source_segment_ptr_[address], partial_copy_size); target_bytes_decoded += partial_copy_size; address += partial_copy_size; size -= partial_copy_size; @@ -1242,14 +1196,12 @@ VCDiffResult VCDiffDeltaFileWindow::DecodeCopy(size_t size, while (size > (target_bytes_decoded - address)) { // Recursive copy that extends into the yet-to-be-copied target data const size_t partial_copy_size = target_bytes_decoded - address; - CopyBytes(&target_segment_ptr[address], - partial_copy_size, - VCD_ANNOTATION_BMATCH); + CopyBytes(&target_segment_ptr[address], partial_copy_size); target_bytes_decoded += partial_copy_size; address += partial_copy_size; size -= partial_copy_size; } - CopyBytes(&target_segment_ptr[address], size, VCD_ANNOTATION_BMATCH); + CopyBytes(&target_segment_ptr[address], size); return RESULT_SUCCESS; } @@ -1353,8 +1305,7 @@ int VCDiffDeltaFileWindow::DecodeBody(ParseableChunk* parseable_chunk) { // end of the addresses section, which is the last section in the window. parseable_chunk->SetPosition(addresses_for_copy_.End()); } else { - // Interleaved format is being used. The window may have been only - // partially decoded. + // Interleaved format is being used. UpdateInstructionPointer(parseable_chunk); } return RESULT_SUCCESS; @@ -1409,7 +1360,6 @@ VCDiffResult VCDiffDeltaFileWindow::DecodeWindows( default: break; // DecodeBody succeeded } - AppendAnnotatedOutput(parent_->annotated_output()); // Get ready to read a new delta window Reset(); if (parent_->ReachedPlannedTargetFileSize()) { @@ -1452,17 +1402,8 @@ bool VCDiffStreamingDecoder::SetMaximumTargetWindowSize( return impl_->SetMaximumTargetWindowSize(new_maximum_target_window_size); } -void VCDiffStreamingDecoder::EnableAnnotatedOutput() { - impl_->EnableAnnotatedOutput(); -} - -void VCDiffStreamingDecoder::DisableAnnotatedOutput() { - impl_->DisableAnnotatedOutput(); -} - -void VCDiffStreamingDecoder::GetAnnotatedOutputToInterface( - OutputStringInterface* annotated_output) { - impl_->GetAnnotatedOutput(annotated_output); +void VCDiffStreamingDecoder::SetAllowVcdTarget(bool allow_vcd_target) { + impl_->SetAllowVcdTarget(allow_vcd_target); } bool VCDiffDecoder::DecodeToInterface(const char* dictionary_ptr, diff --git a/src/vcdecoder1_test.cc b/src/vcdecoder1_test.cc index 7c825d7..7eef598 100644 --- a/src/vcdecoder1_test.cc +++ b/src/vcdecoder1_test.cc @@ -131,18 +131,6 @@ TEST_F(VCDiffStandardDecoderTest, FuzzBits) { } } -TEST_F(VCDiffStandardDecoderTest, CheckAnnotatedOutput) { - decoder_.EnableAnnotatedOutput(); - decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); - EXPECT_TRUE(decoder_.DecodeChunk(delta_file_.data(), - delta_file_.size(), - &output_)); - EXPECT_TRUE(decoder_.FinishDecoding()); - string annotated_output; - decoder_.GetAnnotatedOutput(&annotated_output); - EXPECT_EQ(expected_annotated_target_, annotated_output); -} - // Change each element of the delta file window to an erroneous value // and make sure it's caught as an error. diff --git a/src/vcdecoder2_test.cc b/src/vcdecoder2_test.cc index 7f24a78..74dc3f8 100644 --- a/src/vcdecoder2_test.cc +++ b/src/vcdecoder2_test.cc @@ -46,6 +46,16 @@ TEST_F(VCDiffStandardDecoderTestByteByByte, Decode) { EXPECT_EQ(expected_target_, output_); } +TEST_F(VCDiffStandardDecoderTestByteByByte, DecodeNoVcdTarget) { + decoder_.SetAllowVcdTarget(false); + decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); + for (size_t i = 0; i < delta_file_.size(); ++i) { + EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[i], 1, &output_)); + } + EXPECT_TRUE(decoder_.FinishDecoding()); + EXPECT_EQ(expected_target_, output_); +} + // Remove one byte from the length of the chunk to process, and // verify that an error is returned for FinishDecoding(). TEST_F(VCDiffStandardDecoderTestByteByByte, FinishAfterDecodingPartialWindow) { @@ -164,18 +174,6 @@ TEST_F(VCDiffStandardDecoderTestByteByByte, FuzzBits) { } } -TEST_F(VCDiffStandardDecoderTestByteByByte, CheckAnnotatedOutput) { - decoder_.EnableAnnotatedOutput(); - decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); - for (size_t i = 0; i < delta_file_.size(); ++i) { - EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[i], 1, &output_)); - } - EXPECT_TRUE(decoder_.FinishDecoding()); - string annotated_output; - decoder_.GetAnnotatedOutput(&annotated_output); - EXPECT_EQ(expected_annotated_target_, annotated_output); -} - // Change each element of the delta file window to an erroneous value // and make sure it's caught as an error. diff --git a/src/vcdecoder3_test.cc b/src/vcdecoder3_test.cc index 3a0673c..62b47be 100644 --- a/src/vcdecoder3_test.cc +++ b/src/vcdecoder3_test.cc @@ -235,18 +235,6 @@ TEST_F(VCDiffInterleavedDecoderTest, FuzzBitsWithChecksum) { } } -TEST_F(VCDiffInterleavedDecoderTest, CheckAnnotatedOutput) { - decoder_.EnableAnnotatedOutput(); - decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); - EXPECT_TRUE(decoder_.DecodeChunk(delta_file_.data(), - delta_file_.size(), - &output_)); - EXPECT_TRUE(decoder_.FinishDecoding()); - string annotated_output; - decoder_.GetAnnotatedOutput(&annotated_output); - EXPECT_EQ(expected_annotated_target_, annotated_output); -} - TEST_F(VCDiffInterleavedDecoderTest, CopyMoreThanExpectedTarget) { delta_file_[delta_file_header_.size() + 0x0C] = FirstByteOfStringLength(kExpectedTarget); @@ -793,18 +781,6 @@ TEST_F(VCDiffInterleavedDecoderTestByteByByte, FuzzBitsWithChecksum) { } } -TEST_F(VCDiffInterleavedDecoderTestByteByByte, CheckAnnotatedOutput) { - decoder_.EnableAnnotatedOutput(); - decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); - for (size_t i = 0; i < delta_file_.size(); ++i) { - EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[i], 1, &output_)); - } - EXPECT_TRUE(decoder_.FinishDecoding()); - string annotated_output; - decoder_.GetAnnotatedOutput(&annotated_output); - EXPECT_EQ(expected_annotated_target_, annotated_output); -} - TEST_F(VCDiffInterleavedDecoderTestByteByByte, CopyInstructionsShouldFailIfNoSourceSegment) { // Replace the Win_Indicator and the source size and source offset with a diff --git a/src/vcdecoder4_test.cc b/src/vcdecoder4_test.cc index fa8cb43..e1fc90f 100644 --- a/src/vcdecoder4_test.cc +++ b/src/vcdecoder4_test.cc @@ -121,7 +121,6 @@ class VCDiffStandardWindowDecoderTest : public VCDiffDecoderTest { virtual ~VCDiffStandardWindowDecoderTest() {} private: - static const char kExpectedAnnotatedTarget[]; static const char kWindowBody[]; }; @@ -241,26 +240,8 @@ const char VCDiffStandardWindowDecoderTest::kWindowBody[] = { // No addresses for COPYs }; -// The window encoding should produce the same target file as the standard -// encoding, but the annotated target will be different because some of the -// <bmatch> tags (copying from the previously decoded data in the current target -// window) are changed to <dmatch> (copying from the previously decoded data in -// another target window, which is used as the source window for the current -// delta window.) -const char VCDiffStandardWindowDecoderTest::kExpectedAnnotatedTarget[] = - "<dmatch>\"Just the place for a Snark!</dmatch>" - "<literal> I have said it twice:\n" - "That alone should encourage the crew.\n</literal>" - "<dmatch>Just the place for a Snark! I have said it t</dmatch>" - "<literal>hr</literal>" - "<dmatch>ice:\n</dmatch>" - "<literal>What I te</literal>" - "<literal>ll</literal>" - "<literal> you three times is true.\"\n</literal>"; - VCDiffStandardWindowDecoderTest::VCDiffStandardWindowDecoderTest() { UseStandardFileHeader(); - expected_annotated_target_.assign(kExpectedAnnotatedTarget); delta_window_body_.assign(kWindowBody, sizeof(kWindowBody)); } @@ -301,6 +282,21 @@ TEST_F(VCDiffStandardWindowDecoderTest, DecodeBreakInFourthWindowHeader) { EXPECT_EQ(expected_target_, output_chunk1 + output_chunk2 + output_chunk3); } +TEST_F(VCDiffStandardWindowDecoderTest, DecodeChunkNoVcdTargetAllowed) { + decoder_.SetAllowVcdTarget(false); + // Parse file header + first two windows. + const size_t chunk_1_size = delta_file_header_.size() + 83; + // The third window begins with Win_Indicator = VCD_TARGET which is not + // allowed. + CHECK_EQ(VCD_TARGET, static_cast<unsigned char>(delta_file_[chunk_1_size])); + decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); + EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[0], chunk_1_size, &output_)); + // Just parsing one more byte (the VCD_TARGET) should result in an error. + EXPECT_FALSE(decoder_.DecodeChunk(&delta_file_[chunk_1_size], 1, &output_)); + // The target data for the first two windows should have been output. + EXPECT_EQ(expected_target_.substr(0, 89), output_); +} + TEST_F(VCDiffStandardWindowDecoderTest, DecodeInTwoParts) { const size_t delta_file_size = delta_file_.size(); for (size_t i = 1; i < delta_file_size; i++) { @@ -382,6 +378,7 @@ TEST_F(VCDiffStandardWindowDecoderTest, TargetExceedsFileSizeLimit) { typedef VCDiffStandardWindowDecoderTest VCDiffStandardWindowDecoderTestByteByByte; + TEST_F(VCDiffStandardWindowDecoderTestByteByByte, Decode) { decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); for (size_t i = 0; i < delta_file_.size(); ++i) { @@ -391,6 +388,32 @@ TEST_F(VCDiffStandardWindowDecoderTestByteByByte, Decode) { EXPECT_EQ(expected_target_, output_); } +TEST_F(VCDiffStandardWindowDecoderTestByteByByte, DecodeExplicitVcdTarget) { + decoder_.SetAllowVcdTarget(true); + decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); + for (size_t i = 0; i < delta_file_.size(); ++i) { + EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[i], 1, &output_)); + } + EXPECT_TRUE(decoder_.FinishDecoding()); + EXPECT_EQ(expected_target_, output_); +} + +// Windows 3 and 4 use the VCD_TARGET flag, so decoder should signal an error. +TEST_F(VCDiffStandardWindowDecoderTestByteByByte, DecodeNoVcdTarget) { + decoder_.SetAllowVcdTarget(false); + decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); + size_t i = 0; + for (; i < delta_file_.size(); ++i) { + if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { + break; + } + } + // The failure should occur just at the position of the first VCD_TARGET. + EXPECT_EQ(delta_file_header_.size() + 83, i); + // The target data for the first two windows should have been output. + EXPECT_EQ(expected_target_.substr(0, 89), output_); +} + // Divides up the interleaved encoding into eight separate delta file windows. class VCDiffInterleavedWindowDecoderTest : public VCDiffStandardWindowDecoderTest { @@ -561,6 +584,22 @@ TEST_F(VCDiffInterleavedWindowDecoderTestByteByByte, Decode) { EXPECT_EQ(expected_target_, output_); } +// Windows 3 and 4 use the VCD_TARGET flag, so decoder should signal an error. +TEST_F(VCDiffInterleavedWindowDecoderTestByteByByte, DecodeNoVcdTarget) { + decoder_.SetAllowVcdTarget(false); + decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); + size_t i = 0; + for (; i < delta_file_.size(); ++i) { + if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { + break; + } + } + // The failure should occur just at the position of the first VCD_TARGET. + EXPECT_EQ(delta_file_header_.size() + 83, i); + // The target data for the first two windows should have been output. + EXPECT_EQ(expected_target_.substr(0, 89), output_); +} + // The original version of VCDiffDecoder did not allow the caller to modify the // contents of output_string between calls to DecodeChunk(). That restriction // has been removed. Verify that the same result is still produced if the @@ -596,7 +635,6 @@ TEST_F(VCDiffInterleavedWindowDecoderTest, OutputStringIsPreserved) { class VCDiffStandardCrossDecoderTest : public VCDiffDecoderTest { protected: static const char kExpectedTarget[]; - static const char kExpectedAnnotatedTarget[]; static const char kWindowHeader[]; static const char kWindowBody[]; @@ -637,19 +675,11 @@ const char VCDiffStandardCrossDecoderTest::kExpectedTarget[] = "Spiders in his hair.\n" "Spiders in the air.\n"; -const char VCDiffStandardCrossDecoderTest::kExpectedAnnotatedTarget[] = - "<literal>Spiders</literal>" - "<dmatch> in his hair.\n</dmatch>" // crosses source-target boundary - "<bmatch>Spiders in </bmatch>" - "<dmatch>the </dmatch>" - "<bmatch>air.\n</bmatch>"; - VCDiffStandardCrossDecoderTest::VCDiffStandardCrossDecoderTest() { UseStandardFileHeader(); delta_window_header_.assign(kWindowHeader, sizeof(kWindowHeader)); delta_window_body_.assign(kWindowBody, sizeof(kWindowBody)); expected_target_.assign(kExpectedTarget); - expected_annotated_target_.assign(kExpectedAnnotatedTarget); } TEST_F(VCDiffStandardCrossDecoderTest, Decode) { @@ -979,6 +1009,16 @@ TEST_F(VCDiffCustomCodeTableDecoderTestByteByByte, IncompleteCustomCodeTable) { EXPECT_EQ("", output_); } +TEST_F(VCDiffCustomCodeTableDecoderTestByteByByte, CustomTableNoVcdTarget) { + decoder_.SetAllowVcdTarget(false); + decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); + for (size_t i = 0; i < delta_file_.size(); ++i) { + EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[i], 1, &output_)); + } + EXPECT_TRUE(decoder_.FinishDecoding()); + EXPECT_EQ(expected_target_, output_); +} + #ifdef GTEST_HAS_DEATH_TEST typedef VCDiffCustomCodeTableDecoderTest VCDiffCustomCodeTableDecoderDeathTest; @@ -998,6 +1038,25 @@ TEST_F(VCDiffCustomCodeTableDecoderDeathTest, BadCustomCacheSizes) { "cache"); EXPECT_EQ("", output_); } + +TEST_F(VCDiffCustomCodeTableDecoderDeathTest, BadCustomCacheSizesNoVcdTarget) { + decoder_.SetAllowVcdTarget(false); + delta_file_header_.assign(kFileHeader, sizeof(kFileHeader)); + delta_file_header_.push_back(0x81); // NEAR cache size (top bit) + delta_file_header_.push_back(0x10); // NEAR cache size (custom value 0x90) + delta_file_header_.push_back(0x81); // SAME cache size (top bit) + delta_file_header_.push_back(0x10); // SAME cache size (custom value 0x90) + delta_file_header_.append(kEncodedCustomCodeTable, + sizeof(kEncodedCustomCodeTable)); + InitializeDeltaFile(); + decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); + EXPECT_DEBUG_DEATH(EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), + delta_file_.size(), + &output_)), + "cache"); + EXPECT_EQ("", output_); +} + #endif // GTEST_HAS_DEATH_TEST } // namespace open_vcdiff diff --git a/src/vcdecoder5_test.cc b/src/vcdecoder5_test.cc new file mode 100644 index 0000000..641a0d7 --- /dev/null +++ b/src/vcdecoder5_test.cc @@ -0,0 +1,113 @@ +// Copyright 2008 Google Inc. +// Author: Lincoln Smith +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include <config.h> +#include "google/vcdecoder.h" +#include <string> +#include "codetable.h" +#include "testing.h" +#include "vcdecoder_test.h" + +namespace open_vcdiff { +namespace { + + +// Decode an encoding that uses a RUN instruction to allocate 64MB. +class VCDiffLargeTargetTest : public VCDiffDecoderTest { + protected: + VCDiffLargeTargetTest(); + virtual ~VCDiffLargeTargetTest() {} + + static const char kLargeRunWindow[]; +}; + +const char VCDiffLargeTargetTest::kLargeRunWindow[] = { + 0x00, // Win_Indicator: no source segment + 0x0E, // Length of the delta encoding + 0xA0, // Size of the target window (0x4000000) + 0x80, // Size of the target window cont'd + 0x80, // Size of the target window cont'd + 0x00, // Size of the target window cont'd + 0x00, // Delta_indicator (no compression) + 0x00, // length of data for ADDs and RUNs + 0x06, // length of instructions section + 0x00, // length of addresses for COPYs + // Interleaved segment + 0x00, // VCD_RUN size 0 + 0xA0, // Size of RUN (0x4000000) + 0x80, // Size of RUN cont'd + 0x80, // Size of RUN cont'd + 0x00, // Size of RUN cont'd + 0xBE, // Data for RUN +}; + +VCDiffLargeTargetTest::VCDiffLargeTargetTest() { + UseInterleavedFileHeader(); +} + +// Ensure that, with allow_vcd_target set to false, we can decode any number of +// 64MB windows without running out of memory. +TEST_F(VCDiffLargeTargetTest, Decode) { + // 50 x 64MB = 3.2GB, which should be too large if memory usage accumulates + // during each iteration. + const int kIterations = 50; + decoder_.SetAllowVcdTarget(false); + decoder_.SetMaximumTargetFileSize(0x4000000UL * 50); + decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); + EXPECT_TRUE(decoder_.DecodeChunk(delta_file_header_.data(), + delta_file_header_.size(), + &output_)); + EXPECT_EQ("", output_); + for (int i = 0; i < kIterations; i++) { + EXPECT_TRUE(decoder_.DecodeChunk(kLargeRunWindow, sizeof(kLargeRunWindow), + &output_)); + EXPECT_EQ(0x4000000U, output_.size()); + EXPECT_EQ(static_cast<char>(0xBE), output_[0]); + EXPECT_EQ(static_cast<char>(0xBE), + output_[output_.size() / 2]); // middle element + EXPECT_EQ(static_cast<char>(0xBE), + output_[output_.size() - 1]); // last element + output_.clear(); + } + EXPECT_TRUE(decoder_.FinishDecoding()); +} + +// If we don't increase the maximum target file size first, the same test should +// produce an error. +TEST_F(VCDiffLargeTargetTest, DecodeReachesMaxFileSize) { + decoder_.SetAllowVcdTarget(false); + decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); + EXPECT_TRUE(decoder_.DecodeChunk(delta_file_header_.data(), + delta_file_header_.size(), + &output_)); + EXPECT_EQ("", output_); + // The default maximum target file size is 64MB, which just matches the target + // data produced by a single iteration. + EXPECT_TRUE(decoder_.DecodeChunk(kLargeRunWindow, sizeof(kLargeRunWindow), + &output_)); + EXPECT_EQ(0x4000000U, output_.size()); + EXPECT_EQ(static_cast<char>(0xBE), output_[0]); + EXPECT_EQ(static_cast<char>(0xBE), + output_[output_.size() / 2]); // middle element + EXPECT_EQ(static_cast<char>(0xBE), + output_[output_.size() - 1]); // last element + output_.clear(); + // Trying to decode a second window should exceed the target file size limit. + EXPECT_FALSE(decoder_.DecodeChunk(kLargeRunWindow, sizeof(kLargeRunWindow), + &output_)); +} + +} // unnamed namespace +} // namespace open_vcdiff diff --git a/src/vcdecoder_test.cc b/src/vcdecoder_test.cc index 0faa248..e4681a9 100644 --- a/src/vcdecoder_test.cc +++ b/src/vcdecoder_test.cc @@ -52,21 +52,9 @@ const char VCDiffDecoderTest::kExpectedTarget[] = "Just the place for a Snark! I have said it thrice:\n" "What I tell you three times is true.\"\n"; -const char VCDiffDecoderTest::kExpectedAnnotatedTarget[] = - "<dmatch>\"Just the place for a Snark!</dmatch>" - "<literal> I have said it twice:\n" - "That alone should encourage the crew.\n</literal>" - "<bmatch>Just the place for a Snark! I have said it t</bmatch>" - "<literal>hr</literal>" - "<bmatch>ice:\n</bmatch>" - "<literal>What I te</literal>" - "<literal>ll</literal>" - "<literal> you three times is true.\"\n</literal>"; - VCDiffDecoderTest::VCDiffDecoderTest() : fuzzer_(0), fuzzed_byte_position_(0) { dictionary_ = kDictionary; expected_target_ = kExpectedTarget; - expected_annotated_target_ = kExpectedAnnotatedTarget; } void VCDiffDecoderTest::SetUp() { diff --git a/src/vcdecoder_test.h b/src/vcdecoder_test.h index 3748c0d..59ba703 100644 --- a/src/vcdecoder_test.h +++ b/src/vcdecoder_test.h @@ -35,7 +35,6 @@ class VCDiffDecoderTest : public testing::Test { static const char kDictionary[]; static const char kExpectedTarget[]; - static const char kExpectedAnnotatedTarget[]; VCDiffDecoderTest(); @@ -119,7 +118,6 @@ class VCDiffDecoderTest : public testing::Test { // kDictionary, kExpectedTarget, etc.) string dictionary_; string expected_target_; - string expected_annotated_target_; // The components that will be used to construct delta_file_. string delta_file_header_; diff --git a/src/vcdiff_main.cc b/src/vcdiff_main.cc index b36b4b4..d1500df 100644 --- a/src/vcdiff_main.cc +++ b/src/vcdiff_main.cc @@ -38,12 +38,7 @@ using std::string; using google::GetCommandLineFlagInfoOrDie; using google::ShowUsageWithFlagsRestrict; -// The buffer size, which determines the maximum allowable size -// of a target window, based on how much memory can be allocated. -// Both of these can be increased (and the default can be decreased) -// using the --buffersize flag. -static const size_t kDefaultBufferSize = 1 << 20; // 1 MB -static const size_t kMaxBufferSize = 1 << 26; // 64 MB +static const size_t kDefaultMaxTargetSize = 1 << 26; // 64 MB // Definitions of command-line flags DEFINE_string(dictionary, "", @@ -53,17 +48,22 @@ DEFINE_string(target, "", DEFINE_string(delta, "", "Encoded delta file (default is stdout for encode, " "stdin for decode"); -DEFINE_uint64(buffersize, kDefaultBufferSize, +// --buffersize is the maximum allowable size of a target window. +// This value may be increased if there is sufficient memory available. +DEFINE_uint64(buffersize, 1 << 20, // 1 MB "Buffer size for reading input file"); +DEFINE_bool(allow_vcd_target, true, + "If false, the decoder issues an error when the VCD_TARGET flag " + "is encountered"); DEFINE_bool(checksum, false, "Include an Adler32 checksum of the target data when encoding"); DEFINE_bool(interleaved, false, "Use interleaved format"); DEFINE_bool(stats, false, "Report compression percentage"); DEFINE_bool(target_matches, false, "Find duplicate strings in target data" " as well as dictionary data"); -DEFINE_uint64(max_target_file_size, kMaxBufferSize, +DEFINE_uint64(max_target_file_size, kDefaultMaxTargetSize, "Maximum target file size allowed by decoder"); -DEFINE_uint64(max_target_window_size, kMaxBufferSize, +DEFINE_uint64(max_target_window_size, kDefaultMaxTargetSize, "Maximum target window size allowed by decoder"); static const char* const kUsageString = @@ -177,8 +177,7 @@ class VCDiffFileBasedCoder { // input_buffer_ will be the value specified by the --buffersize option. // If the input comes from a file, then the buffer will be allocated to match // the file size, if possible. However, the buffer will not exceed - // kMaxBufferSize bytes in length, unless the user specifies the --buffersize - // option to override that limit. + // --buffersize bytes in length. std::vector<char> input_buffer_; // A memory buffer used to load the output file into memory for comparison @@ -276,10 +275,7 @@ bool VCDiffFileBasedCoder::OpenFileForReading(const string& file_name, << file_name << "': " << strerror(errno) << std::endl; return false; } - buffer_size = kMaxBufferSize; - if (FLAGS_buffersize > buffer_size) { - buffer_size = static_cast<size_t>(FLAGS_buffersize); - } + buffer_size = static_cast<size_t>(FLAGS_buffersize); if (file_size < buffer_size) { // Allocate just enough memory to store the entire file buffer_size = file_size; @@ -455,6 +451,7 @@ bool VCDiffFileBasedCoder::Decode() { static_cast<size_t>(FLAGS_max_target_file_size)); decoder.SetMaximumTargetWindowSize( static_cast<size_t>(FLAGS_max_target_window_size)); + decoder.SetAllowVcdTarget(FLAGS_allow_vcd_target); string output; size_t input_size = 0; size_t output_size = 0; @@ -518,6 +515,7 @@ bool VCDiffFileBasedCoder::DecodeAndCompare() { static_cast<size_t>(FLAGS_max_target_file_size)); decoder.SetMaximumTargetWindowSize( static_cast<size_t>(FLAGS_max_target_window_size)); + decoder.SetAllowVcdTarget(FLAGS_allow_vcd_target); string output; size_t input_size = 0; size_t output_size = 0; diff --git a/src/vcdiff_test.sh b/src/vcdiff_test.sh index 8d474a9..6b5179b 100755 --- a/src/vcdiff_test.sh +++ b/src/vcdiff_test.sh @@ -433,10 +433,13 @@ echo "Test 33 ok"; # open-vcdiff bug 8 (http://code.google.com/p/open-vcdiff/issues/detail?id=8) # A malicious encoding that tries to produce a 4GB target file made up of 64 # windows, each window having a size of 64MB. -# Start by limiting memory usage to 96MB per process, so the test doesn't take -# forever to run out of memory. -ulimit -d 98304 -ulimit -m 98304 +# Limit memory usage to 256MB per process, so the test doesn't take forever +# to run out of memory. +OLD_ULIMIT=$(ulimit -v) +echo "Old ulimit: $OLD_ULIMIT" +ulimit -S -v 262144 +echo "New ulimit: $(ulimit -v)" + $VCDIFF $VCD_OPTIONS \ decode -dictionary $DICTIONARY_FILE \ -delta $MALICIOUS_ENCODING \ @@ -455,6 +458,8 @@ $VCDIFF $VCD_OPTIONS \ exit 1; } echo "Test 35 ok"; +ulimit -S -v $OLD_ULIMIT + # Decoding a small target with the -max_target_file_size option should succeed. $VCDIFF $VCD_OPTIONS \ test -dictionary $DICTIONARY_FILE \ @@ -477,4 +482,47 @@ echo "Test 37 ok"; rm $DELTA_FILE +# Test using -allow_vcd_target=false +$VCDIFF $VCD_OPTIONS \ + encode -dictionary $DICTIONARY_FILE \ + -target $TARGET_FILE \ + -delta $DELTA_FILE \ + -allow_vcd_target=false \ +|| { echo "Encode with -allow_vcd_target=false failed"; \ + exit 1; } +$VCDIFF $VCD_OPTIONS \ + decode -dictionary $DICTIONARY_FILE \ + -delta $DELTA_FILE \ + -target $OUTPUT_TARGET_FILE \ + -allow_vcd_target=false \ +|| { echo "Decode with -allow_vcd_target=false failed"; \ + exit 1; } +cmp $TARGET_FILE $OUTPUT_TARGET_FILE \ +|| { echo "Decoded target does not match original"; \ + exit 1; } +echo "Test 38 ok"; + +rm $DELTA_FILE +rm $OUTPUT_TARGET_FILE + +# Test using -allow_vcd_target=true +$VCDIFF $VCD_OPTIONS \ + encode -dictionary $DICTIONARY_FILE \ + -target $TARGET_FILE \ + -delta $DELTA_FILE \ + -allow_vcd_target=true \ +|| { echo "Encode with -allow_vcd_target=true failed"; \ + exit 1; } +$VCDIFF $VCD_OPTIONS \ + decode -dictionary $DICTIONARY_FILE \ + -delta $DELTA_FILE \ + -target $OUTPUT_TARGET_FILE \ + -allow_vcd_target=true \ +|| { echo "Decode with -allow_vcd_target=true failed"; \ + exit 1; } +cmp $TARGET_FILE $OUTPUT_TARGET_FILE \ +|| { echo "Decoded target does not match original"; \ + exit 1; } +echo "Test 39 ok"; + echo "PASS" diff --git a/src/vcencoder_test.cc b/src/vcencoder_test.cc index 752ab80..b32c42a 100644 --- a/src/vcencoder_test.cc +++ b/src/vcencoder_test.cc @@ -348,6 +348,18 @@ TEST_F(VCDiffEncoderTest, EncodeDecodeFixedChunkSizes) { } } +// If --allow_vcd_target=false is specified, the decoder will throw away some of +// the internally-stored decoded target beyond the current window. Try +// different numbers of encoded window sizes to make sure that this behavior +// does not affect the results. +TEST_F(VCDiffEncoderTest, EncodeDecodeFixedChunkSizesNoVcdTarget) { + decoder_.SetAllowVcdTarget(false); + // Loop through all possible chunk sizes + for (size_t chunk_size = 1; chunk_size < strlen(kTarget); ++chunk_size) { + TestWithFixedChunkSize(chunk_size); + } +} + // Splits the text to be encoded into fixed-size chunks. Encodes each // chunk and puts it into a vector of strings. Then decodes each string // in the vector and appends the result into result_target_. diff --git a/vsprojects/config.h b/vsprojects/config.h index b4a8984..0c5ef01 100644 --- a/vsprojects/config.h +++ b/vsprojects/config.h @@ -45,19 +45,19 @@ #define PACKAGE_NAME "open-vcdiff" /* Define to the full name and version of this package. */ -#define PACKAGE_STRING "open-vcdiff 0.5" +#define PACKAGE_STRING "open-vcdiff 0.6" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "open-vcdiff" /* Define to the version of this package. */ -#define PACKAGE_VERSION "0.5" +#define PACKAGE_VERSION "0.6" /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Version number of package */ -#define VERSION "0.5" +#define VERSION "0.6" // These functions have different names, but the same behavior, // for Visual Studio. diff --git a/vsprojects/open-vcdiff.sln b/vsprojects/open-vcdiff.sln index ec1defd..116d632 100644 --- a/vsprojects/open-vcdiff.sln +++ b/vsprojects/open-vcdiff.sln @@ -15,99 +15,92 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vcdenc", "vcdenc\vcdenc.vcp EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vcdiff", "vcdiff\vcdiff.vcproj", "{D11A04C5-0B05-4E08-AAB2-8BC64DE56A84}" ProjectSection(ProjectDependencies) = postProject - {C498DA26-B014-44BD-A387-EB6C3CE16FCF} = {C498DA26-B014-44BD-A387-EB6C3CE16FCF} - {1066F2E6-3F29-4D3D-9BBA-FD1D360099DD} = {1066F2E6-3F29-4D3D-9BBA-FD1D360099DD} {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} = {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} + {1066F2E6-3F29-4D3D-9BBA-FD1D360099DD} = {1066F2E6-3F29-4D3D-9BBA-FD1D360099DD} + {C498DA26-B014-44BD-A387-EB6C3CE16FCF} = {C498DA26-B014-44BD-A387-EB6C3CE16FCF} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "addrcache_test", "addrcache_test\addrcache_test.vcproj", "{23DDE803-E417-41CE-9D24-B823A990D0FC}" ProjectSection(ProjectDependencies) = postProject - {429392EB-55A9-4344-913C-DEE5F02B538D} = {429392EB-55A9-4344-913C-DEE5F02B538D} {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} = {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} + {429392EB-55A9-4344-913C-DEE5F02B538D} = {429392EB-55A9-4344-913C-DEE5F02B538D} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "headerparser_test", "headerparser_test\headerparser_test.vcproj", "{B1995AAE-F24B-4079-8F6B-8333ED6B13A6}" ProjectSection(ProjectDependencies) = postProject - {429392EB-55A9-4344-913C-DEE5F02B538D} = {429392EB-55A9-4344-913C-DEE5F02B538D} - {1066F2E6-3F29-4D3D-9BBA-FD1D360099DD} = {1066F2E6-3F29-4D3D-9BBA-FD1D360099DD} - {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} = {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vcdecoder_test", "vcdecoder_test\vcdecoder_test.vcproj", "{BA30F970-A2B3-4D04-81D5-B5C73794BEDE}" - ProjectSection(ProjectDependencies) = postProject - {429392EB-55A9-4344-913C-DEE5F02B538D} = {429392EB-55A9-4344-913C-DEE5F02B538D} {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} = {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} {1066F2E6-3F29-4D3D-9BBA-FD1D360099DD} = {1066F2E6-3F29-4D3D-9BBA-FD1D360099DD} + {429392EB-55A9-4344-913C-DEE5F02B538D} = {429392EB-55A9-4344-913C-DEE5F02B538D} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vcencoder_test", "vcencoder_test\vcencoder_test.vcproj", "{CB30C697-D33C-4410-94DE-D7CC481A5284}" ProjectSection(ProjectDependencies) = postProject - {429392EB-55A9-4344-913C-DEE5F02B538D} = {429392EB-55A9-4344-913C-DEE5F02B538D} - {1066F2E6-3F29-4D3D-9BBA-FD1D360099DD} = {1066F2E6-3F29-4D3D-9BBA-FD1D360099DD} - {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} = {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} {C498DA26-B014-44BD-A387-EB6C3CE16FCF} = {C498DA26-B014-44BD-A387-EB6C3CE16FCF} + {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} = {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} + {1066F2E6-3F29-4D3D-9BBA-FD1D360099DD} = {1066F2E6-3F29-4D3D-9BBA-FD1D360099DD} + {429392EB-55A9-4344-913C-DEE5F02B538D} = {429392EB-55A9-4344-913C-DEE5F02B538D} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "output_string_test", "output_string_test\output_string_test.vcproj", "{3E9B97B7-7C57-44EB-BBBC-2C3B56595F0E}" ProjectSection(ProjectDependencies) = postProject - {429392EB-55A9-4344-913C-DEE5F02B538D} = {429392EB-55A9-4344-913C-DEE5F02B538D} {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} = {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} + {429392EB-55A9-4344-913C-DEE5F02B538D} = {429392EB-55A9-4344-913C-DEE5F02B538D} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "blockhash_test", "blockhash_test\blockhash_test.vcproj", "{11C53677-B705-42C2-B50F-87F5E599ABF1}" ProjectSection(ProjectDependencies) = postProject - {429392EB-55A9-4344-913C-DEE5F02B538D} = {429392EB-55A9-4344-913C-DEE5F02B538D} - {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} = {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} {C498DA26-B014-44BD-A387-EB6C3CE16FCF} = {C498DA26-B014-44BD-A387-EB6C3CE16FCF} + {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} = {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} + {429392EB-55A9-4344-913C-DEE5F02B538D} = {429392EB-55A9-4344-913C-DEE5F02B538D} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "codetable_test", "codetable_test\codetable_test.vcproj", "{43DD2BA4-493D-49B7-825E-10279C89F0F9}" ProjectSection(ProjectDependencies) = postProject - {429392EB-55A9-4344-913C-DEE5F02B538D} = {429392EB-55A9-4344-913C-DEE5F02B538D} {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} = {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} + {429392EB-55A9-4344-913C-DEE5F02B538D} = {429392EB-55A9-4344-913C-DEE5F02B538D} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "decodetable_test", "decodetable_test\decodetable_test.vcproj", "{CCA8B377-0D14-4AD3-B5D8-7DD935A2D6D8}" ProjectSection(ProjectDependencies) = postProject - {429392EB-55A9-4344-913C-DEE5F02B538D} = {429392EB-55A9-4344-913C-DEE5F02B538D} - {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} = {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} {1066F2E6-3F29-4D3D-9BBA-FD1D360099DD} = {1066F2E6-3F29-4D3D-9BBA-FD1D360099DD} + {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} = {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} + {429392EB-55A9-4344-913C-DEE5F02B538D} = {429392EB-55A9-4344-913C-DEE5F02B538D} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "encodetable_test", "encodetable_test\encodetable_test.vcproj", "{893DCA29-2740-4C49-993F-42A9B1EF365B}" ProjectSection(ProjectDependencies) = postProject - {429392EB-55A9-4344-913C-DEE5F02B538D} = {429392EB-55A9-4344-913C-DEE5F02B538D} - {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} = {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} {C498DA26-B014-44BD-A387-EB6C3CE16FCF} = {C498DA26-B014-44BD-A387-EB6C3CE16FCF} + {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} = {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} + {429392EB-55A9-4344-913C-DEE5F02B538D} = {429392EB-55A9-4344-913C-DEE5F02B538D} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rolling_hash_test", "rolling_hash_test\rolling_hash_test.vcproj", "{A9879052-0DD1-413D-B631-A82044BFCF1A}" ProjectSection(ProjectDependencies) = postProject - {429392EB-55A9-4344-913C-DEE5F02B538D} = {429392EB-55A9-4344-913C-DEE5F02B538D} - {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} = {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} {C498DA26-B014-44BD-A387-EB6C3CE16FCF} = {C498DA26-B014-44BD-A387-EB6C3CE16FCF} + {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} = {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} + {429392EB-55A9-4344-913C-DEE5F02B538D} = {429392EB-55A9-4344-913C-DEE5F02B538D} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "varint_bigendian_test", "varint_bigendian_test\varint_bigendian_test.vcproj", "{9A887AB5-E053-4ED6-870B-3330A1F4ED83}" ProjectSection(ProjectDependencies) = postProject - {429392EB-55A9-4344-913C-DEE5F02B538D} = {429392EB-55A9-4344-913C-DEE5F02B538D} {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} = {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} + {429392EB-55A9-4344-913C-DEE5F02B538D} = {429392EB-55A9-4344-913C-DEE5F02B538D} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vcdiffengine_test", "vcdiffengine_test\vcdiffengine_test.vcproj", "{890398AC-020D-48C7-A054-6E03B1403AC7}" ProjectSection(ProjectDependencies) = postProject - {429392EB-55A9-4344-913C-DEE5F02B538D} = {429392EB-55A9-4344-913C-DEE5F02B538D} - {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} = {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} {C498DA26-B014-44BD-A387-EB6C3CE16FCF} = {C498DA26-B014-44BD-A387-EB6C3CE16FCF} + {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} = {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} + {429392EB-55A9-4344-913C-DEE5F02B538D} = {429392EB-55A9-4344-913C-DEE5F02B538D} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest", "gtest\gtest.vcproj", "{429392EB-55A9-4344-913C-DEE5F02B538D}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "instruction_map_test", "instruction_map_test\instruction_map_test.vcproj", "{ABFF6897-3B7F-41FB-BB70-15E47AC81856}" ProjectSection(ProjectDependencies) = postProject - {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} = {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} - {429392EB-55A9-4344-913C-DEE5F02B538D} = {429392EB-55A9-4344-913C-DEE5F02B538D} {C498DA26-B014-44BD-A387-EB6C3CE16FCF} = {C498DA26-B014-44BD-A387-EB6C3CE16FCF} + {429392EB-55A9-4344-913C-DEE5F02B538D} = {429392EB-55A9-4344-913C-DEE5F02B538D} + {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} = {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vcdiff_test", "vcdiff_test\vcdiff_test.vcproj", "{EDC1569F-95B3-4536-9674-6AD9A0ADAAF4}" @@ -115,6 +108,48 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vcdiff_test", "vcdiff_test\ {D11A04C5-0B05-4E08-AAB2-8BC64DE56A84} = {D11A04C5-0B05-4E08-AAB2-8BC64DE56A84} EndProjectSection EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vcdecoder1_test", "vcdecoder1_test\vcdecoder1_test.vcproj", "{BA30F970-A2B3-4D04-81D5-B5C73794BEDE}" + ProjectSection(ProjectDependencies) = postProject + {30B18111-3E93-4EA5-BEA9-17B08BC8E49D} = {30B18111-3E93-4EA5-BEA9-17B08BC8E49D} + {1066F2E6-3F29-4D3D-9BBA-FD1D360099DD} = {1066F2E6-3F29-4D3D-9BBA-FD1D360099DD} + {429392EB-55A9-4344-913C-DEE5F02B538D} = {429392EB-55A9-4344-913C-DEE5F02B538D} + {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} = {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vcdecoder2_test", "vcdecoder2_test\vcdecoder2_test.vcproj", "{DD8527B2-44B9-46A8-9E65-3A83A10418C9}" + ProjectSection(ProjectDependencies) = postProject + {30B18111-3E93-4EA5-BEA9-17B08BC8E49D} = {30B18111-3E93-4EA5-BEA9-17B08BC8E49D} + {1066F2E6-3F29-4D3D-9BBA-FD1D360099DD} = {1066F2E6-3F29-4D3D-9BBA-FD1D360099DD} + {429392EB-55A9-4344-913C-DEE5F02B538D} = {429392EB-55A9-4344-913C-DEE5F02B538D} + {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} = {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vcdecoder3_test", "vcdecoder3_test\vcdecoder3_test.vcproj", "{6927AEDE-A96D-42FD-9431-2007EAB11CB4}" + ProjectSection(ProjectDependencies) = postProject + {30B18111-3E93-4EA5-BEA9-17B08BC8E49D} = {30B18111-3E93-4EA5-BEA9-17B08BC8E49D} + {1066F2E6-3F29-4D3D-9BBA-FD1D360099DD} = {1066F2E6-3F29-4D3D-9BBA-FD1D360099DD} + {429392EB-55A9-4344-913C-DEE5F02B538D} = {429392EB-55A9-4344-913C-DEE5F02B538D} + {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} = {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vcdecoder4_test", "vcdecoder4_test\vcdecoder4_test.vcproj", "{02A1361F-ED8F-4280-8475-E79C8605D5A2}" + ProjectSection(ProjectDependencies) = postProject + {30B18111-3E93-4EA5-BEA9-17B08BC8E49D} = {30B18111-3E93-4EA5-BEA9-17B08BC8E49D} + {1066F2E6-3F29-4D3D-9BBA-FD1D360099DD} = {1066F2E6-3F29-4D3D-9BBA-FD1D360099DD} + {429392EB-55A9-4344-913C-DEE5F02B538D} = {429392EB-55A9-4344-913C-DEE5F02B538D} + {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} = {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vcdecoder5_test", "vcdecoder5_test\vcdecoder5_test.vcproj", "{033F203E-3AB6-4444-874A-F0EEE6938FEC}" + ProjectSection(ProjectDependencies) = postProject + {30B18111-3E93-4EA5-BEA9-17B08BC8E49D} = {30B18111-3E93-4EA5-BEA9-17B08BC8E49D} + {1066F2E6-3F29-4D3D-9BBA-FD1D360099DD} = {1066F2E6-3F29-4D3D-9BBA-FD1D360099DD} + {429392EB-55A9-4344-913C-DEE5F02B538D} = {429392EB-55A9-4344-913C-DEE5F02B538D} + {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} = {A49D16EE-E69E-4B5D-9CB7-ABEF79BB4246} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vcdecoder_test_common", "vcdecoder_test_common\vcdecoder_test_common.vcproj", "{30B18111-3E93-4EA5-BEA9-17B08BC8E49D}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -145,10 +180,6 @@ Global {B1995AAE-F24B-4079-8F6B-8333ED6B13A6}.Debug|Win32.Build.0 = Debug|Win32 {B1995AAE-F24B-4079-8F6B-8333ED6B13A6}.Release|Win32.ActiveCfg = Release|Win32 {B1995AAE-F24B-4079-8F6B-8333ED6B13A6}.Release|Win32.Build.0 = Release|Win32 - {BA30F970-A2B3-4D04-81D5-B5C73794BEDE}.Debug|Win32.ActiveCfg = Debug|Win32 - {BA30F970-A2B3-4D04-81D5-B5C73794BEDE}.Debug|Win32.Build.0 = Debug|Win32 - {BA30F970-A2B3-4D04-81D5-B5C73794BEDE}.Release|Win32.ActiveCfg = Release|Win32 - {BA30F970-A2B3-4D04-81D5-B5C73794BEDE}.Release|Win32.Build.0 = Release|Win32 {CB30C697-D33C-4410-94DE-D7CC481A5284}.Debug|Win32.ActiveCfg = Debug|Win32 {CB30C697-D33C-4410-94DE-D7CC481A5284}.Debug|Win32.Build.0 = Debug|Win32 {CB30C697-D33C-4410-94DE-D7CC481A5284}.Release|Win32.ActiveCfg = Release|Win32 @@ -197,6 +228,30 @@ Global {EDC1569F-95B3-4536-9674-6AD9A0ADAAF4}.Debug|Win32.Build.0 = Debug|Win32 {EDC1569F-95B3-4536-9674-6AD9A0ADAAF4}.Release|Win32.ActiveCfg = Release|Win32 {EDC1569F-95B3-4536-9674-6AD9A0ADAAF4}.Release|Win32.Build.0 = Release|Win32 + {BA30F970-A2B3-4D04-81D5-B5C73794BEDE}.Debug|Win32.ActiveCfg = Debug|Win32 + {BA30F970-A2B3-4D04-81D5-B5C73794BEDE}.Debug|Win32.Build.0 = Debug|Win32 + {BA30F970-A2B3-4D04-81D5-B5C73794BEDE}.Release|Win32.ActiveCfg = Release|Win32 + {BA30F970-A2B3-4D04-81D5-B5C73794BEDE}.Release|Win32.Build.0 = Release|Win32 + {DD8527B2-44B9-46A8-9E65-3A83A10418C9}.Debug|Win32.ActiveCfg = Debug|Win32 + {DD8527B2-44B9-46A8-9E65-3A83A10418C9}.Debug|Win32.Build.0 = Debug|Win32 + {DD8527B2-44B9-46A8-9E65-3A83A10418C9}.Release|Win32.ActiveCfg = Release|Win32 + {DD8527B2-44B9-46A8-9E65-3A83A10418C9}.Release|Win32.Build.0 = Release|Win32 + {6927AEDE-A96D-42FD-9431-2007EAB11CB4}.Debug|Win32.ActiveCfg = Debug|Win32 + {6927AEDE-A96D-42FD-9431-2007EAB11CB4}.Debug|Win32.Build.0 = Debug|Win32 + {6927AEDE-A96D-42FD-9431-2007EAB11CB4}.Release|Win32.ActiveCfg = Release|Win32 + {6927AEDE-A96D-42FD-9431-2007EAB11CB4}.Release|Win32.Build.0 = Release|Win32 + {02A1361F-ED8F-4280-8475-E79C8605D5A2}.Debug|Win32.ActiveCfg = Debug|Win32 + {02A1361F-ED8F-4280-8475-E79C8605D5A2}.Debug|Win32.Build.0 = Debug|Win32 + {02A1361F-ED8F-4280-8475-E79C8605D5A2}.Release|Win32.ActiveCfg = Release|Win32 + {02A1361F-ED8F-4280-8475-E79C8605D5A2}.Release|Win32.Build.0 = Release|Win32 + {033F203E-3AB6-4444-874A-F0EEE6938FEC}.Debug|Win32.ActiveCfg = Debug|Win32 + {033F203E-3AB6-4444-874A-F0EEE6938FEC}.Debug|Win32.Build.0 = Debug|Win32 + {033F203E-3AB6-4444-874A-F0EEE6938FEC}.Release|Win32.ActiveCfg = Release|Win32 + {033F203E-3AB6-4444-874A-F0EEE6938FEC}.Release|Win32.Build.0 = Release|Win32 + {30B18111-3E93-4EA5-BEA9-17B08BC8E49D}.Debug|Win32.ActiveCfg = Debug|Win32 + {30B18111-3E93-4EA5-BEA9-17B08BC8E49D}.Debug|Win32.Build.0 = Debug|Win32 + {30B18111-3E93-4EA5-BEA9-17B08BC8E49D}.Release|Win32.ActiveCfg = Release|Win32 + {30B18111-3E93-4EA5-BEA9-17B08BC8E49D}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/vsprojects/vcdecoder_test/vcdecoder_test.vcproj b/vsprojects/vcdecoder1_test/vcdecoder1_test.vcproj index 5f496b4..37a59e9 100644 --- a/vsprojects/vcdecoder_test/vcdecoder_test.vcproj +++ b/vsprojects/vcdecoder1_test/vcdecoder1_test.vcproj @@ -2,9 +2,9 @@ <VisualStudioProject ProjectType="Visual C++" Version="8.00" - Name="vcdecoder_test" + Name="vcdecoder1_test" ProjectGUID="{BA30F970-A2B3-4D04-81D5-B5C73794BEDE}" - RootNamespace="vcdecoder_test" + RootNamespace="vcdecoder1_test" Keyword="Win32Proj" > <Platforms> @@ -64,6 +64,7 @@ /> <Tool Name="VCLinkerTool" + AdditionalDependencies="$(OutDir)\vcddec.lib $(OutDir)\vcdcom.lib $(OutDir)\vcdecoder_test_common.lib" LinkIncremental="2" AdditionalLibraryDirectories="" GenerateDebugInformation="true" @@ -143,6 +144,7 @@ /> <Tool Name="VCLinkerTool" + AdditionalDependencies="$(OutDir)\vcddec.lib $(OutDir)\vcdcom.lib $(OutDir)\vcdecoder_test_common.lib" LinkIncremental="1" AdditionalLibraryDirectories="" GenerateDebugInformation="true" @@ -187,35 +189,15 @@ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" > <File - RelativePath="..\..\src\vcdecoder_test.cc" - > - </File> - <File RelativePath="..\..\src\vcdecoder1_test.cc" > </File> - <File - RelativePath="..\..\src\vcdecoder2_test.cc" - > - </File> - <File - RelativePath="..\..\src\vcdecoder3_test.cc" - > - </File> - <File - RelativePath="..\..\src\vcdecoder4_test.cc" - > - </File> </Filter> <Filter Name="Header Files" Filter="h;hpp;hxx;hm;inl;inc;xsd" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" > - <File - RelativePath="..\..\src\vcdecoder_test.h" - > - </File> </Filter> <Filter Name="Resource Files" diff --git a/vsprojects/vcdecoder2_test/vcdecoder2_test.vcproj b/vsprojects/vcdecoder2_test/vcdecoder2_test.vcproj new file mode 100644 index 0000000..50f8018 --- /dev/null +++ b/vsprojects/vcdecoder2_test/vcdecoder2_test.vcproj @@ -0,0 +1,211 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="8.00" + Name="vcdecoder2_test" + ProjectGUID="{DD8527B2-44B9-46A8-9E65-3A83A10418C9}" + RootNamespace="vcdecoder2_test" + Keyword="Win32Proj" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="1" + CharacterSet="1" + BuildLogFile="$(IntDir)\BuildLog_$(ProjectName).htm" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="../..;../../src;../../vsprojects" + PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE" + MinimalRebuild="true" + BasicRuntimeChecks="3" + RuntimeLibrary="3" + DefaultCharIsUnsigned="true" + UsePrecompiledHeader="0" + ProgramDataBaseFileName="$(IntDir)\$(ProjectName).pdb" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="4" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="$(OutDir)\vcddec.lib $(OutDir)\vcdcom.lib $(OutDir)\vcdecoder_test_common.lib" + LinkIncremental="2" + AdditionalLibraryDirectories="" + GenerateDebugInformation="true" + SubSystem="1" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + CommandLine="$(OutDir)\$(ProjectName).exe" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="1" + CharacterSet="1" + WholeProgramOptimization="1" + BuildLogFile="$(IntDir)\BuildLog_$(ProjectName).htm" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="../..;../../src;../../vsprojects" + PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE" + RuntimeLibrary="2" + DefaultCharIsUnsigned="true" + UsePrecompiledHeader="0" + ProgramDataBaseFileName="$(IntDir)\$(ProjectName).pdb" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="$(OutDir)\vcddec.lib $(OutDir)\vcdcom.lib $(OutDir)\vcdecoder_test_common.lib" + LinkIncremental="1" + AdditionalLibraryDirectories="" + GenerateDebugInformation="true" + SubSystem="1" + OptimizeReferences="2" + EnableCOMDATFolding="2" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + CommandLine="$(OutDir)\$(ProjectName).exe" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" + > + <File + RelativePath="..\..\src\vcdecoder2_test.cc" + > + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" + > + </Filter> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" + UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" + > + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/vsprojects/vcdecoder3_test/vcdecoder3_test.vcproj b/vsprojects/vcdecoder3_test/vcdecoder3_test.vcproj new file mode 100644 index 0000000..b0110cd --- /dev/null +++ b/vsprojects/vcdecoder3_test/vcdecoder3_test.vcproj @@ -0,0 +1,211 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="8.00" + Name="vcdecoder3_test" + ProjectGUID="{6927AEDE-A96D-42FD-9431-2007EAB11CB4}" + RootNamespace="vcdecoder3_test" + Keyword="Win32Proj" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="1" + CharacterSet="1" + BuildLogFile="$(IntDir)\BuildLog_$(ProjectName).htm" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="../..;../../src;../../vsprojects" + PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE" + MinimalRebuild="true" + BasicRuntimeChecks="3" + RuntimeLibrary="3" + DefaultCharIsUnsigned="true" + UsePrecompiledHeader="0" + ProgramDataBaseFileName="$(IntDir)\$(ProjectName).pdb" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="4" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="$(OutDir)\vcddec.lib $(OutDir)\vcdcom.lib $(OutDir)\vcdecoder_test_common.lib" + LinkIncremental="2" + AdditionalLibraryDirectories="" + GenerateDebugInformation="true" + SubSystem="1" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + CommandLine="$(OutDir)\$(ProjectName).exe" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="1" + CharacterSet="1" + WholeProgramOptimization="1" + BuildLogFile="$(IntDir)\BuildLog_$(ProjectName).htm" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="../..;../../src;../../vsprojects" + PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE" + RuntimeLibrary="2" + DefaultCharIsUnsigned="true" + UsePrecompiledHeader="0" + ProgramDataBaseFileName="$(IntDir)\$(ProjectName).pdb" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="$(OutDir)\vcddec.lib $(OutDir)\vcdcom.lib $(OutDir)\vcdecoder_test_common.lib" + LinkIncremental="1" + AdditionalLibraryDirectories="" + GenerateDebugInformation="true" + SubSystem="1" + OptimizeReferences="2" + EnableCOMDATFolding="2" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + CommandLine="$(OutDir)\$(ProjectName).exe" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" + > + <File + RelativePath="..\..\src\vcdecoder3_test.cc" + > + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" + > + </Filter> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" + UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" + > + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/vsprojects/vcdecoder4_test/vcdecoder4_test.vcproj b/vsprojects/vcdecoder4_test/vcdecoder4_test.vcproj new file mode 100644 index 0000000..81f7374 --- /dev/null +++ b/vsprojects/vcdecoder4_test/vcdecoder4_test.vcproj @@ -0,0 +1,211 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="8.00" + Name="vcdecoder4_test" + ProjectGUID="{02A1361F-ED8F-4280-8475-E79C8605D5A2}" + RootNamespace="vcdecoder4_test" + Keyword="Win32Proj" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="1" + CharacterSet="1" + BuildLogFile="$(IntDir)\BuildLog_$(ProjectName).htm" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="../..;../../src;../../vsprojects" + PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE" + MinimalRebuild="true" + BasicRuntimeChecks="3" + RuntimeLibrary="3" + DefaultCharIsUnsigned="true" + UsePrecompiledHeader="0" + ProgramDataBaseFileName="$(IntDir)\$(ProjectName).pdb" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="4" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="$(OutDir)\vcddec.lib $(OutDir)\vcdcom.lib $(OutDir)\vcdecoder_test_common.lib" + LinkIncremental="2" + AdditionalLibraryDirectories="" + GenerateDebugInformation="true" + SubSystem="1" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + CommandLine="$(OutDir)\$(ProjectName).exe" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="1" + CharacterSet="1" + WholeProgramOptimization="1" + BuildLogFile="$(IntDir)\BuildLog_$(ProjectName).htm" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="../..;../../src;../../vsprojects" + PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE" + RuntimeLibrary="2" + DefaultCharIsUnsigned="true" + UsePrecompiledHeader="0" + ProgramDataBaseFileName="$(IntDir)\$(ProjectName).pdb" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="$(OutDir)\vcddec.lib $(OutDir)\vcdcom.lib $(OutDir)\vcdecoder_test_common.lib" + LinkIncremental="1" + AdditionalLibraryDirectories="" + GenerateDebugInformation="true" + SubSystem="1" + OptimizeReferences="2" + EnableCOMDATFolding="2" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + CommandLine="$(OutDir)\$(ProjectName).exe" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" + > + <File + RelativePath="..\..\src\vcdecoder4_test.cc" + > + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" + > + </Filter> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" + UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" + > + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/vsprojects/vcdecoder5_test/vcdecoder5_test.vcproj b/vsprojects/vcdecoder5_test/vcdecoder5_test.vcproj new file mode 100644 index 0000000..e225bdf --- /dev/null +++ b/vsprojects/vcdecoder5_test/vcdecoder5_test.vcproj @@ -0,0 +1,211 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="8.00" + Name="vcdecoder5_test" + ProjectGUID="{033F203E-3AB6-4444-874A-F0EEE6938FEC}" + RootNamespace="vcdecoder5_test" + Keyword="Win32Proj" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="1" + CharacterSet="1" + BuildLogFile="$(IntDir)\BuildLog_$(ProjectName).htm" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="../..;../../src;../../vsprojects" + PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE" + MinimalRebuild="true" + BasicRuntimeChecks="3" + RuntimeLibrary="3" + DefaultCharIsUnsigned="true" + UsePrecompiledHeader="0" + ProgramDataBaseFileName="$(IntDir)\$(ProjectName).pdb" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="4" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="$(OutDir)\vcddec.lib $(OutDir)\vcdcom.lib $(OutDir)\vcdecoder_test_common.lib" + LinkIncremental="2" + AdditionalLibraryDirectories="" + GenerateDebugInformation="true" + SubSystem="1" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + CommandLine="$(OutDir)\$(ProjectName).exe" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="1" + CharacterSet="1" + WholeProgramOptimization="1" + BuildLogFile="$(IntDir)\BuildLog_$(ProjectName).htm" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="../..;../../src;../../vsprojects" + PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE" + RuntimeLibrary="2" + DefaultCharIsUnsigned="true" + UsePrecompiledHeader="0" + ProgramDataBaseFileName="$(IntDir)\$(ProjectName).pdb" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="$(OutDir)\vcddec.lib $(OutDir)\vcdcom.lib $(OutDir)\vcdecoder_test_common.lib" + LinkIncremental="1" + AdditionalLibraryDirectories="" + GenerateDebugInformation="true" + SubSystem="1" + OptimizeReferences="2" + EnableCOMDATFolding="2" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + CommandLine="$(OutDir)\$(ProjectName).exe" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" + > + <File + RelativePath="..\..\src\vcdecoder5_test.cc" + > + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" + > + </Filter> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" + UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" + > + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/vsprojects/vcdecoder_test_common/vcdecoder_test_common.vcproj b/vsprojects/vcdecoder_test_common/vcdecoder_test_common.vcproj new file mode 100644 index 0000000..dfc2da4 --- /dev/null +++ b/vsprojects/vcdecoder_test_common/vcdecoder_test_common.vcproj @@ -0,0 +1,175 @@ +<?xml version="1.0" encoding="UTF-8"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="8.00" + Name="vcdecoder_test_common" + ProjectGUID="{30B18111-3E93-4EA5-BEA9-17B08BC8E49D}" + Keyword="Win32Proj" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="Debug" + ConfigurationType="4" + BuildLogFile="$(IntDir)\BuildLog_$(ProjectName).htm" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="../..;../../src;../../vsprojects" + MinimalRebuild="true" + BasicRuntimeChecks="3" + RuntimeLibrary="3" + DefaultCharIsUnsigned="true" + UsePrecompiledHeader="0" + ProgramDataBaseFileName="$(IntDir)\$(ProjectName).pdb" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="4" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="Release" + ConfigurationType="4" + BuildLogFile="$(IntDir)\BuildLog_$(ProjectName).htm" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="../..;../../src;../../vsprojects" + RuntimeLibrary="2" + DefaultCharIsUnsigned="true" + UsePrecompiledHeader="0" + ProgramDataBaseFileName="$(IntDir)\$(ProjectName).pdb" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLibrarianTool" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" + > + <File + RelativePath="..\..\src\vcdecoder_test.h" + > + </File> + </Filter> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx" + UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" + > + </Filter> + <Filter + Name="Source Files" + Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" + > + <File + RelativePath="..\..\src\vcdecoder_test.cc" + > + </File> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> |