From: <dh...@us...> - 2014-11-01 21:44:34
|
Revision: 317 http://sourceforge.net/p/xlslib/code/317 Author: dhoerl Date: 2014-11-01 21:44:30 +0000 (Sat, 01 Nov 2014) Log Message: ----------- Turns out that having one C file in the test cpp build causes Linus problems, so added a md5cpp.cpp file so its all cpp when built Modified Paths: -------------- trunk/xlslib/targets/test/Makefile.am trunk/xlslib/targets/test/Makefile.in trunk/xlslib/targets/test/PR2859188.cpp trunk/xlslib/targets/test/PR3076678.cpp trunk/xlslib/targets/test/mainC.c trunk/xlslib/targets/test/mainCPP.cpp trunk/xlslib/targets/test/md5.c trunk/xlslib/targets/test/md5.h Added Paths: ----------- trunk/xlslib/targets/test/md5cpp.cpp Modified: trunk/xlslib/targets/test/Makefile.am =================================================================== --- trunk/xlslib/targets/test/Makefile.am 2014-11-01 21:43:13 UTC (rev 316) +++ trunk/xlslib/targets/test/Makefile.am 2014-11-01 21:44:30 UTC (rev 317) @@ -4,16 +4,16 @@ noinst_PROGRAMS = testCPP testC PR2859188 PR3076678 -testCPP_SOURCES = mainCPP.cpp md5.c +testCPP_SOURCES = mainCPP.cpp md5cpp.cpp testCPP_LDADD = $(top_builddir)/src/libxls.la testCPP_LDFLAGS = -static -lstdc++ testC_SOURCES = mainC.c md5.c testC_LDADD = $(top_builddir)/src/libxls.la testC_LDFLAGS = -static -lstdc++ -PR2859188_SOURCES = PR2859188.cpp md5.c +PR2859188_SOURCES = PR2859188.cpp md5cpp.cpp PR2859188_LDADD = $(top_builddir)/src/libxls.la PR2859188_LDFLAGS = -static -lstdc++ -PR3076678_SOURCES = PR3076678.cpp md5.c +PR3076678_SOURCES = PR3076678.cpp md5cpp.cpp PR3076678_LDADD = $(top_builddir)/src/libxls.la PR3076678_LDFLAGS = -static -lstdc++ Modified: trunk/xlslib/targets/test/Makefile.in =================================================================== --- trunk/xlslib/targets/test/Makefile.in 2014-11-01 21:43:13 UTC (rev 316) +++ trunk/xlslib/targets/test/Makefile.in 2014-11-01 21:44:30 UTC (rev 317) @@ -61,13 +61,13 @@ CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) -am_PR2859188_OBJECTS = PR2859188.$(OBJEXT) md5.$(OBJEXT) +am_PR2859188_OBJECTS = PR2859188.$(OBJEXT) md5cpp.$(OBJEXT) PR2859188_OBJECTS = $(am_PR2859188_OBJECTS) PR2859188_DEPENDENCIES = $(top_builddir)/src/libxls.la PR2859188_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(PR2859188_LDFLAGS) $(LDFLAGS) -o $@ -am_PR3076678_OBJECTS = PR3076678.$(OBJEXT) md5.$(OBJEXT) +am_PR3076678_OBJECTS = PR3076678.$(OBJEXT) md5cpp.$(OBJEXT) PR3076678_OBJECTS = $(am_PR3076678_OBJECTS) PR3076678_DEPENDENCIES = $(top_builddir)/src/libxls.la PR3076678_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ @@ -79,7 +79,7 @@ testC_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(testC_LDFLAGS) \ $(LDFLAGS) -o $@ -am_testCPP_OBJECTS = mainCPP.$(OBJEXT) md5.$(OBJEXT) +am_testCPP_OBJECTS = mainCPP.$(OBJEXT) md5cpp.$(OBJEXT) testCPP_OBJECTS = $(am_testCPP_OBJECTS) testCPP_DEPENDENCIES = $(top_builddir)/src/libxls.la testCPP_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ @@ -252,16 +252,16 @@ AM_CPPFLAGS = \ -I$(top_srcdir)/src -testCPP_SOURCES = mainCPP.cpp md5.c +testCPP_SOURCES = mainCPP.cpp md5cpp.cpp testCPP_LDADD = $(top_builddir)/src/libxls.la testCPP_LDFLAGS = -static -lstdc++ testC_SOURCES = mainC.c md5.c testC_LDADD = $(top_builddir)/src/libxls.la testC_LDFLAGS = -static -lstdc++ -PR2859188_SOURCES = PR2859188.cpp md5.c +PR2859188_SOURCES = PR2859188.cpp md5cpp.cpp PR2859188_LDADD = $(top_builddir)/src/libxls.la PR2859188_LDFLAGS = -static -lstdc++ -PR3076678_SOURCES = PR3076678.cpp md5.c +PR3076678_SOURCES = PR3076678.cpp md5cpp.cpp PR3076678_LDADD = $(top_builddir)/src/libxls.la PR3076678_LDFLAGS = -static -lstdc++ all: all-am @@ -340,6 +340,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mainC.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mainCPP.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5cpp.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< Modified: trunk/xlslib/targets/test/PR2859188.cpp =================================================================== --- trunk/xlslib/targets/test/PR2859188.cpp 2014-11-01 21:43:13 UTC (rev 316) +++ trunk/xlslib/targets/test/PR2859188.cpp 2014-11-01 21:44:30 UTC (rev 317) @@ -60,18 +60,18 @@ char check[NUM_TESTS][40]; -char *test1(const char *md5_checksum); -char *test2(const char *md5_checksum); -char *test3(const char *md5_checksum); +const char *test1(const char *md5_checksum); +const char *test2(const char *md5_checksum); +const char *test3(const char *md5_checksum); -char *test1(const char *md5_checksum) +const char *test1(const char *md5_checksum) { workbook book; worksheet* sheet = book.sheet("test1"); sheet->number(0, 1, 40065.0, FMT_DATE1, 0)->format(book.format("yyyy-mm-dd")); int err = book.Dump("PR2859188-1.xls"); - char *checkP = file_err; + const char *checkP = file_err; if (err != NO_ERRORS) { cerr << "test1 failed: I/O failure: " << err << std::endl; @@ -85,7 +85,7 @@ return checkP; } -char *test2(const char *md5_checksum) +const char *test2(const char *md5_checksum) { /* both cells formatted as date ??? */ workbook book; @@ -94,7 +94,7 @@ sheet->number(0, 1, 40065.0, FMT_DATE1, 0)->format(book.format("yyyy-mm-dd")); int err = book.Dump("PR2859188-2.xls"); - char *checkP = file_err; + const char *checkP = file_err; if (err != NO_ERRORS) { cerr << "test2 failed: I/O failure: " << err << std::endl; @@ -107,7 +107,7 @@ return checkP; } -char *test3(const char *md5_checksum) +const char *test3(const char *md5_checksum) { workbook book; worksheet* sheet = book.sheet("test2"); @@ -123,7 +123,7 @@ int err = book.Dump("PR2859188-3.xls"); - char *checkP = file_err; + const char *checkP = file_err; if (err != NO_ERRORS) { cerr << "test3 failed: I/O failure: " << err << std::endl; @@ -171,7 +171,7 @@ { int idx = 0; int failed = 1; - char *checkP; + const char *checkP; // comment and uncomment the below to try various tests #if 1 { @@ -219,7 +219,7 @@ FILE *fp = fopen(fileName, "w"); if(fp) { for(int i=0; i<NUM_TESTS; ++i) { - char *checkP = check[i]; + const char *checkP = check[i]; if(fp) { fprintf(fp, "%s\n", checkP); } Modified: trunk/xlslib/targets/test/PR3076678.cpp =================================================================== --- trunk/xlslib/targets/test/PR3076678.cpp 2014-11-01 21:43:13 UTC (rev 316) +++ trunk/xlslib/targets/test/PR3076678.cpp 2014-11-01 21:44:30 UTC (rev 317) @@ -33,9 +33,9 @@ to take care of? I observed that behaviour in Excel 2002, 2003 and 2010. The problem does not occur in Calc. */ -extern char *BorderTest(const char *md5_checksum); +extern const char *BorderTest(const char *md5_checksum); -char *BorderTest(const char *md5_checksum) +const char *BorderTest(const char *md5_checksum) { workbook wb; @@ -57,7 +57,7 @@ // test multiple Dump() calls: PR3083160 err |= wb.Dump("PR3083003-2.xls"); - char *checkP = file_err; + const char *checkP = file_err; if (err != NO_ERRORS) { cerr << "BorderTest failed: I/O failure: " << err << std::endl; @@ -111,7 +111,7 @@ { int idx = 0; int failed = 1; - char *checkP; + const char *checkP; // comment and uncomment the below to try various tests #if 1 { @@ -136,7 +136,7 @@ FILE *fp = fopen(fileName, "w"); if(fp) { for(int i=0; i<NUM_TESTS; ++i) { - char *checkP = check[i]; + const char *checkP = check[i]; if(fp) { fprintf(fp, "%s\n", checkP); } Modified: trunk/xlslib/targets/test/mainC.c =================================================================== --- trunk/xlslib/targets/test/mainC.c 2014-11-01 21:43:13 UTC (rev 316) +++ trunk/xlslib/targets/test/mainC.c 2014-11-01 21:44:30 UTC (rev 317) @@ -144,7 +144,8 @@ workbook *w; worksheet *ws; int ret; - char check[40], *checkP = check; + char check[40]; + const char *checkP = check; char fileName[128]; fileName[0] = 0; @@ -162,10 +163,10 @@ { FILE *fp = fopen(fileName, "r"); if(fp) { - fscanf(fp, "%s", checkP); + fscanf(fp, "%s", check); fclose(fp); } else { - strcpy(checkP, "00000000000000000000000000000000"); + strcpy(check, "00000000000000000000000000000000"); } //printf("MD5 = %s\n", checkP); } Modified: trunk/xlslib/targets/test/mainCPP.cpp =================================================================== --- trunk/xlslib/targets/test/mainCPP.cpp 2014-11-01 21:43:13 UTC (rev 316) +++ trunk/xlslib/targets/test/mainCPP.cpp 2014-11-01 21:44:30 UTC (rev 317) @@ -110,15 +110,15 @@ static void SeedRndNumber(unsigned32_t seed); static unsigned32_t GetRndNumber(unsigned32_t max); -char *StressTest(unsigned32_t a,unsigned32_t b,unsigned32_t c, const char *md5_checksum); -char *RandomTest(unsigned32_t a,unsigned32_t b,unsigned32_t c, unsigned32_t random_seed, const char *md5_checksum); -char *RandomCellAndFormatTest(unsigned32_t sheets_sz, unsigned32_t rows_sz, unsigned32_t cols_sz, unsigned32_t random_seed, const char *md5_checksum); -char *RandomFormatTest(unsigned32_t sheets_sz, unsigned32_t rows_sz, unsigned32_t cols_sz, unsigned32_t random_seed, const char *md5_checksum); -char *RandomCellAndFormatTestProf(unsigned32_t sheets_sz, unsigned32_t rows_sz, unsigned32_t cols_sz, unsigned32_t random_seed, const char *md5_checksum); -char *StandardTest(const char *md5_checksum); -char *StandardTest2(const char *md5_checksum); -char *BlankTest(const char *md5_checksum); -char *FormulaFunctionsTest(const char *md5_checksum); +const char *StressTest(unsigned32_t a,unsigned32_t b,unsigned32_t c, const char *md5_checksum); +const char *RandomTest(unsigned32_t a,unsigned32_t b,unsigned32_t c, unsigned32_t random_seed, const char *md5_checksum); +const char *RandomCellAndFormatTest(unsigned32_t sheets_sz, unsigned32_t rows_sz, unsigned32_t cols_sz, unsigned32_t random_seed, const char *md5_checksum); +const char *RandomFormatTest(unsigned32_t sheets_sz, unsigned32_t rows_sz, unsigned32_t cols_sz, unsigned32_t random_seed, const char *md5_checksum); +const char *RandomCellAndFormatTestProf(unsigned32_t sheets_sz, unsigned32_t rows_sz, unsigned32_t cols_sz, unsigned32_t random_seed, const char *md5_checksum); +const char *StandardTest(const char *md5_checksum); +const char *StandardTest2(const char *md5_checksum); +const char *BlankTest(const char *md5_checksum); +const char *FormulaFunctionsTest(const char *md5_checksum); /* ********************************* @@ -163,7 +163,7 @@ { int idx = 0; int failed = 1; - char *checkP; + const char *checkP; // comment and uncomment the below to try various tests #if 1 { @@ -310,7 +310,7 @@ return (rv == 0 ? EXIT_SUCCESS : EXIT_FAILURE); } -char *StandardTest(const char *md5_checksum) +const char *StandardTest(const char *md5_checksum) { // Get the workbook handler workbook wb; @@ -368,7 +368,7 @@ int err = wb.Dump("testCPP.xls"); - char *checkP = file_err; + const char *checkP = file_err; if (err != NO_ERRORS) { cerr << "StandardTest failed: I/O failure: " << err << std::endl; @@ -383,7 +383,7 @@ -char *BlankTest(const char *md5_checksum) +const char *BlankTest(const char *md5_checksum) { workbook wb; worksheet* sh = wb.sheet("Sheet_01"); @@ -391,7 +391,7 @@ int err = wb.Dump("blank.xls"); - char *checkP = file_err; + const char *checkP = file_err; if (err != NO_ERRORS) { cerr << "BlankTest failed: I/O failure: " << err << std::endl; @@ -419,7 +419,7 @@ return root; } -char *StandardTest2(const char *md5_checksum) +const char *StandardTest2(const char *md5_checksum) { // Get the workbook handler workbook wb; @@ -483,7 +483,7 @@ int err = wb.Dump("testCPP2.xls"); - char *checkP = file_err; + const char *checkP = file_err; if (err != NO_ERRORS) { cerr << "StandardTest2 failed: I/O failure: " << err << std::endl; @@ -551,7 +551,7 @@ } -char *RandomCellAndFormatTest(unsigned32_t sheets_sz, unsigned32_t rows_sz, unsigned32_t cols_sz, unsigned32_t random_seed, const char *md5_checksum) +const char *RandomCellAndFormatTest(unsigned32_t sheets_sz, unsigned32_t rows_sz, unsigned32_t cols_sz, unsigned32_t random_seed, const char *md5_checksum) { workbook wb; worksheet* sh; @@ -602,7 +602,7 @@ int err = wb.Dump("rndcellandformat.xls"); TIMESPAN_END(1,"Random Cell and Format test:"); - char *checkP = file_err; + const char *checkP = file_err; if (err != NO_ERRORS) { cerr << "RandomCellAndFormatTest failed: I/O failure: " << err << std::endl; @@ -615,7 +615,7 @@ return checkP; } -char *RandomCellAndFormatTestProf(unsigned32_t sheets_sz, unsigned32_t rows_sz, unsigned32_t cols_sz, unsigned32_t random_seed, const char *md5_checksum) +const char *RandomCellAndFormatTestProf(unsigned32_t sheets_sz, unsigned32_t rows_sz, unsigned32_t cols_sz, unsigned32_t random_seed, const char *md5_checksum) { workbook wb; worksheet* sh; @@ -689,7 +689,7 @@ int err = wb.Dump("rndcellandformat_prof.xls"); - char *checkP = file_err; + const char *checkP = file_err; if (err != NO_ERRORS) { cerr << "RandomCellAndFormatTestProf failed: I/O failure: " << err << std::endl; @@ -703,7 +703,7 @@ } -char *RandomFormatTest(unsigned32_t sheets_sz, unsigned32_t rows_sz, unsigned32_t cols_sz, unsigned32_t random_seed, const char *md5_checksum) +const char *RandomFormatTest(unsigned32_t sheets_sz, unsigned32_t rows_sz, unsigned32_t cols_sz, unsigned32_t random_seed, const char *md5_checksum) { SeedRndNumber(random_seed); @@ -751,7 +751,7 @@ int err = wb.Dump("rndformat.xls"); TIMESPAN_END(1,"Random Format test:"); - char *checkP = file_err; + const char *checkP = file_err; if (err != NO_ERRORS) { cerr << "RandomFormatTest failed: I/O failure: " << err << std::endl; @@ -1165,7 +1165,7 @@ ********************************* ********************************* */ -char *StressTest(unsigned32_t sheets_sz, unsigned32_t rows_sz, unsigned32_t cols_sz, const char *md5_checksum) +const char *StressTest(unsigned32_t sheets_sz, unsigned32_t rows_sz, unsigned32_t cols_sz, const char *md5_checksum) { // Get the workbook handler workbook swb; @@ -1206,7 +1206,7 @@ int err = swb.Dump(fnamebuf); TIMESPAN_END(1,"Cell-stress test:"); - char *checkP = file_err; + const char *checkP = file_err; if (err != NO_ERRORS) { cerr << "StressTest(" << sheets_sz << ", " << rows_sz << ", " << cols_sz << ") failed: I/O failure: " << err << std::endl; @@ -1224,7 +1224,7 @@ ********************************* */ -char *RandomTest(unsigned32_t sheets_sz, unsigned32_t rows_sz, unsigned32_t cols_sz, unsigned32_t random_seed, const char *md5_checksum) +const char *RandomTest(unsigned32_t sheets_sz, unsigned32_t rows_sz, unsigned32_t cols_sz, unsigned32_t random_seed, const char *md5_checksum) { SeedRndNumber(random_seed); TIMESPAN_START(1); @@ -1303,7 +1303,7 @@ TIMESPAN_END(1,"Random cell test:"); // cannot MD5 the file; not a real unit test, this one... - char *checkP = file_err; + const char *checkP = file_err; if (err != NO_ERRORS) { cerr << "RandomTest failed: I/O failure: " << err << std::endl; @@ -1860,7 +1860,7 @@ }; -char *FormulaFunctionsTest(const char *md5_checksum) +const char *FormulaFunctionsTest(const char *md5_checksum) { workbook wb; const unsigned32_t numSheets = 1; @@ -1877,7 +1877,7 @@ for (unsigned32_t r = 0; r < number_of_builtin_functions; r++) { expr_function_code_t fn = function_arr[r].code; - printf("FUNC: %s\n", function_arr[r].name); + // printf("FUNC: %s\n", function_arr[r].name); #if 0 // These just won't work for older excel programs @@ -1952,7 +1952,7 @@ int err = wb.Dump("formulas.xls"); - char *checkP = file_err; + const char *checkP = file_err; if (err != NO_ERRORS) { cerr << "FormulaFunctionsTest failed: I/O failure: " << err << std::endl; Modified: trunk/xlslib/targets/test/md5.c =================================================================== --- trunk/xlslib/targets/test/md5.c 2014-11-01 21:43:13 UTC (rev 316) +++ trunk/xlslib/targets/test/md5.c 2014-11-01 21:44:30 UTC (rev 317) @@ -509,7 +509,7 @@ static char digest[MD5_HEXSTRING_SIZE]; -char * check_file(const char *filepath, const char *md5_checksum) +const char * check_file(const char *filepath, const char *md5_checksum) { int rv; Modified: trunk/xlslib/targets/test/md5.h =================================================================== --- trunk/xlslib/targets/test/md5.h 2014-11-01 21:43:13 UTC (rev 316) +++ trunk/xlslib/targets/test/md5.h 2014-11-01 21:44:30 UTC (rev 317) @@ -25,10 +25,10 @@ #include "common/xlsys.h" #include "common/systype.h" -#if defined(__cplusplus) -extern "C" -{ -#endif +//#if defined(__cplusplus) +//extern "C" +//{ +//#endif @@ -84,12 +84,12 @@ value "File Not Found" indicates that a load/memory failure occurred, while other non-zero return values are due to an MD5 mismatch. */ -char * check_file(const char *filepath, const char *md5_checksum); +const char * check_file(const char *filepath, const char *md5_checksum); -#if defined(__cplusplus) -} -#endif +//#if defined(__cplusplus) +//} +//#endif #endif /* !MD5_H */ Added: trunk/xlslib/targets/test/md5cpp.cpp =================================================================== --- trunk/xlslib/targets/test/md5cpp.cpp (rev 0) +++ trunk/xlslib/targets/test/md5cpp.cpp 2014-11-01 21:44:30 UTC (rev 317) @@ -0,0 +1,578 @@ +/* + * This code implements the MD5 message-digest algorithm. + * The algorithm is due to Ron Rivest. This code was + * written by Colin Plumb in 1993, no copyright is claimed. + * This code is in the public domain; do with it what you wish. + * + * Equivalent code is available from RSA Data Security, Inc. + * This code has been tested against that, and is equivalent, + * except that you don't need to include two pages of legalese + * with every copy. + * + * To compute the message digest of a chunk of bytes, declare an + * MD5Context structure, pass it to MD5Init, call MD5Update as + * needed on buffers full of bytes, and then call MD5Final, which + * will fill a supplied 16-byte array with the digest. + */ + +/* +Code adapted from citadel (www.citadel.org ???) +*/ + + +#include "md5.h" + +#include <stdio.h> +#include <stdlib.h> + +#if defined(HAVE_STRINGS_H) +#include <strings.h> +#elif defined(HAVE_STRING_H) +#include <string.h> +#endif + +#if ! defined(HAVE_STRCASECMP) +#define NET_BSD_STRCASECMP +static int strcasecmp(const char *s1, const char *s2); +#endif + +/* + * Note: this code is harmless on little-endian machines. + */ + static void byteReverse(void *vbuf, size_t longs) +{ + unsigned8_t *buf = (unsigned char *)vbuf; + union { + unsigned8_t c[4]; + unsigned32_t t; + } tmp; + + do { + tmp.t = (unsigned32_t) ((unsigned32_t) buf[3] << 8 | (unsigned32_t) buf[2]) << 16 | ((unsigned32_t) buf[1] << 8 | (unsigned32_t) buf[0]); + buf[0] = tmp.c[0]; + buf[1] = tmp.c[1]; + buf[2] = tmp.c[2]; + buf[3] = tmp.c[3]; + buf += 4; + } while (--longs); +} + +/* + * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious + * initialization constants. + */ +void MD5Init(struct MD5Context *ctx) +{ + memset(ctx, 0, sizeof(*ctx)); + + ctx->buf[0] = 0x67452301; + ctx->buf[1] = 0xefcdab89; + ctx->buf[2] = 0x98badcfe; + ctx->buf[3] = 0x10325476; + + ctx->bits[0] = 0; + ctx->bits[1] = 0; +} + +/* + * Update context to reflect the concatenation of another buffer full + * of bytes. + */ +void MD5Update(struct MD5Context *ctx, unsigned char const *buf, size_t len) +{ + unsigned32_t t; + + /* Update bitcount */ + + t = ctx->bits[0]; + if ((ctx->bits[0] = t + ((unsigned32_t) len << 3)) < t) + ctx->bits[1]++; /* Carry from low to high */ + ctx->bits[1] += len >> 29; + + t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ + + /* Handle any leading odd-sized chunks */ + + if (t) + { + unsigned char *p = (unsigned char *) ctx->inp + t; + + t = 64 - t; + if (len < t) + { + memcpy(p, buf, len); + return; + } + memcpy(p, buf, t); + byteReverse(ctx->inp, 16); + MD5Transform(ctx->buf, ctx->inp); + buf += t; + len -= t; + } + /* Process data in 64-byte chunks */ + + while (len >= 64) + { + memcpy(ctx->inp, buf, 64); + byteReverse(ctx->inp, 16); + MD5Transform(ctx->buf, ctx->inp); + buf += 64; + len -= 64; + } + + /* Handle any remaining bytes of data. */ + + memcpy(ctx->inp, buf, len); +} + +/* + * Final wrapup - pad to 64-byte boundary with the bit pattern + * 1 0* (64-bit count of bits processed, MSB-first) + */ +void MD5Final(unsigned char digest[16], struct MD5Context *ctx) +{ + size_t count; + unsigned char *p; + + /* Compute number of bytes mod 64 */ + count = (ctx->bits[0] >> 3) & 0x3F; + + /* Set the first char of padding to 0x80. This is safe since there is + always at least one byte free */ + p = ((unsigned char*)ctx->inp) + count; + *p++ = 0x80; + + /* Bytes of padding needed to make 64 bytes */ + count = 64 - 1 - count; + + /* Pad out to 56 mod 64 */ + if (count < 8) + { + /* Two lots of padding: Pad the first block to 64 bytes */ + memset(p, 0, count); + byteReverse(ctx->inp, 16); + MD5Transform(ctx->buf, ctx->inp); + + /* Now fill the next block with 56 bytes */ + memset(ctx->inp, 0, 56); + } + else + { + /* Pad block to 56 bytes */ + memset(p, 0, count - 8); + } + byteReverse(ctx->inp, 14); + + /* Append length in bits and transform */ + ctx->inp[14] = ctx->bits[0]; + ctx->inp[15] = ctx->bits[1]; + + MD5Transform(ctx->buf, ctx->inp); + byteReverse((unsigned char *) ctx->buf, 4); + memcpy(digest, ctx->buf, 16); + memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */ +} + + +/* The four core functions - F1 is optimized somewhat */ + +/* #define F1(x, y, z) (x & y | ~x & z) */ +#define F1(x, y, z) (z ^ (x & (y ^ z))) +#define F2(x, y, z) F1(z, x, y) +#define F3(x, y, z) (x ^ y ^ z) +#define F4(x, y, z) (y ^ (x | ~z)) + +/* This is the central step in the MD5 algorithm. */ +#ifdef __PUREC__ +#define MD5STEP(f, w, x, y, z, data, s) \ + ( w += f /*(x, y, z)*/ + data, w = w<<s | w>>(32-s), w += x ) +#else +#define MD5STEP(f, w, x, y, z, data, s) \ + ( w += f(x, y, z) + data, w = w<<s | w>>(32-s), w += x ) +#endif + +/* + * The core of the MD5 algorithm, this alters an existing MD5 hash to + * reflect the addition of 16 longwords of new data. MD5Update blocks + * the data and converts bytes into longwords for this routine. + */ +void MD5Transform(unsigned32_t buf[4], unsigned32_t const in[16]) +{ + unsigned32_t a, b, c, d; + + a = buf[0]; + b = buf[1]; + c = buf[2]; + d = buf[3]; + +#ifdef __PUREC__ /* PureC Weirdness... (GG) */ + MD5STEP(F1(b,c,d), a, b, c, d, in[0] + 0xd76aa478L, 7); + MD5STEP(F1(a,b,c), d, a, b, c, in[1] + 0xe8c7b756L, 12); + MD5STEP(F1(d,a,b), c, d, a, b, in[2] + 0x242070dbL, 17); + MD5STEP(F1(c,d,a), b, c, d, a, in[3] + 0xc1bdceeeL, 22); + MD5STEP(F1(b,c,d), a, b, c, d, in[4] + 0xf57c0fafL, 7); + MD5STEP(F1(a,b,c), d, a, b, c, in[5] + 0x4787c62aL, 12); + MD5STEP(F1(d,a,b), c, d, a, b, in[6] + 0xa8304613L, 17); + MD5STEP(F1(c,d,a), b, c, d, a, in[7] + 0xfd469501L, 22); + MD5STEP(F1(b,c,d), a, b, c, d, in[8] + 0x698098d8L, 7); + MD5STEP(F1(a,b,c), d, a, b, c, in[9] + 0x8b44f7afL, 12); + MD5STEP(F1(d,a,b), c, d, a, b, in[10] + 0xffff5bb1L, 17); + MD5STEP(F1(c,d,a), b, c, d, a, in[11] + 0x895cd7beL, 22); + MD5STEP(F1(b,c,d), a, b, c, d, in[12] + 0x6b901122L, 7); + MD5STEP(F1(a,b,c), d, a, b, c, in[13] + 0xfd987193L, 12); + MD5STEP(F1(d,a,b), c, d, a, b, in[14] + 0xa679438eL, 17); + MD5STEP(F1(c,d,a), b, c, d, a, in[15] + 0x49b40821L, 22); + + MD5STEP(F2(b,c,d), a, b, c, d, in[1] + 0xf61e2562L, 5); + MD5STEP(F2(a,b,c), d, a, b, c, in[6] + 0xc040b340L, 9); + MD5STEP(F2(d,a,b), c, d, a, b, in[11] + 0x265e5a51L, 14); + MD5STEP(F2(c,d,a), b, c, d, a, in[0] + 0xe9b6c7aaL, 20); + MD5STEP(F2(b,c,d), a, b, c, d, in[5] + 0xd62f105dL, 5); + MD5STEP(F2(a,b,c), d, a, b, c, in[10] + 0x02441453L, 9); + MD5STEP(F2(d,a,b), c, d, a, b, in[15] + 0xd8a1e681L, 14); + MD5STEP(F2(c,d,a), b, c, d, a, in[4] + 0xe7d3fbc8L, 20); + MD5STEP(F2(b,c,d), a, b, c, d, in[9] + 0x21e1cde6L, 5); + MD5STEP(F2(a,b,c), d, a, b, c, in[14] + 0xc33707d6L, 9); + MD5STEP(F2(d,a,b), c, d, a, b, in[3] + 0xf4d50d87L, 14); + MD5STEP(F2(c,d,a), b, c, d, a, in[8] + 0x455a14edL, 20); + MD5STEP(F2(b,c,d), a, b, c, d, in[13] + 0xa9e3e905L, 5); + MD5STEP(F2(a,b,c), d, a, b, c, in[2] + 0xfcefa3f8L, 9); + MD5STEP(F2(d,a,b), c, d, a, b, in[7] + 0x676f02d9L, 14); + MD5STEP(F2(c,d,a), b, c, d, a, in[12] + 0x8d2a4c8aL, 20); + + MD5STEP(F3(b,c,d), a, b, c, d, in[5] + 0xfffa3942L, 4); + MD5STEP(F3(a,b,c), d, a, b, c, in[8] + 0x8771f681L, 11); + MD5STEP(F3(d,a,b), c, d, a, b, in[11] + 0x6d9d6122L, 16); + MD5STEP(F3(c,d,a), b, c, d, a, in[14] + 0xfde5380cL, 23); + MD5STEP(F3(b,c,d), a, b, c, d, in[1] + 0xa4beea44L, 4); + MD5STEP(F3(a,b,c), d, a, b, c, in[4] + 0x4bdecfa9L, 11); + MD5STEP(F3(d,a,b), c, d, a, b, in[7] + 0xf6bb4b60L, 16); + MD5STEP(F3(c,d,a), b, c, d, a, in[10] + 0xbebfbc70L, 23); + MD5STEP(F3(b,c,d), a, b, c, d, in[13] + 0x289b7ec6L, 4); + MD5STEP(F3(a,b,c), d, a, b, c, in[0] + 0xeaa127faL, 11); + MD5STEP(F3(d,a,b), c, d, a, b, in[3] + 0xd4ef3085L, 16); + MD5STEP(F3(c,d,a), b, c, d, a, in[6] + 0x04881d05L, 23); + MD5STEP(F3(b,c,d), a, b, c, d, in[9] + 0xd9d4d039L, 4); + MD5STEP(F3(a,b,c), d, a, b, c, in[12] + 0xe6db99e5L, 11); + MD5STEP(F3(d,a,b), c, d, a, b, in[15] + 0x1fa27cf8L, 16); + MD5STEP(F3(c,d,a), b, c, d, a, in[2] + 0xc4ac5665L, 23); + + MD5STEP(F4(b,c,d), a, b, c, d, in[0] + 0xf4292244L, 6); + MD5STEP(F4(a,b,c), d, a, b, c, in[7] + 0x432aff97L, 10); + MD5STEP(F4(d,a,b), c, d, a, b, in[14] + 0xab9423a7L, 15); + MD5STEP(F4(c,d,a), b, c, d, a, in[5] + 0xfc93a039L, 21); + MD5STEP(F4(b,c,d), a, b, c, d, in[12] + 0x655b59c3L, 6); + MD5STEP(F4(a,b,c), d, a, b, c, in[3] + 0x8f0ccc92L, 10); + MD5STEP(F4(d,a,b), c, d, a, b, in[10] + 0xffeff47dL, 15); + MD5STEP(F4(c,d,a), b, c, d, a, in[1] + 0x85845dd1L, 21); + MD5STEP(F4(b,c,d), a, b, c, d, in[8] + 0x6fa87e4fL, 6); + MD5STEP(F4(a,b,c), d, a, b, c, in[15] + 0xfe2ce6e0L, 10); + MD5STEP(F4(d,a,b), c, d, a, b, in[6] + 0xa3014314L, 15); + MD5STEP(F4(c,d,a), b, c, d, a, in[13] + 0x4e0811a1L, 21); + MD5STEP(F4(b,c,d), a, b, c, d, in[4] + 0xf7537e82L, 6); + MD5STEP(F4(a,b,c), d, a, b, c, in[11] + 0xbd3af235L, 10); + MD5STEP(F4(d,a,b), c, d, a, b, in[2] + 0x2ad7d2bbL, 15); + MD5STEP(F4(c,d,a), b, c, d, a, in[9] + 0xeb86d391L, 21); +#else + MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); + MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); + MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); + MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); + MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); + MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); + MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); + MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); + MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); + MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); + MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); + MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); + MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); + MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); + MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); + MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); + + MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); + MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); + MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); + MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); + MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); + MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); + MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); + MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); + MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); + MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); + MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); + MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); + MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); + MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); + MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); + MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); + + MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); + MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); + MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); + MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); + MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); + MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); + MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); + MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); + MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); + MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); + MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); + MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); + MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); + MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); + MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); + MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); + + MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); + MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); + MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); + MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); + MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); + MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); + MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); + MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); + MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); + MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); + MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); + MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); + MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); + MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); + MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); + MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); +#endif + + buf[0] += a; + buf[1] += b; + buf[2] += c; + buf[3] += d; +} + + +int load_file(unsigned8_t **buf_ref, size_t *buflen_ref, const char *filepath) +{ + FILE *f = NULL; + unsigned8_t *b = NULL; + size_t bsiz = 4096; + size_t blen = 0; + + f = fopen(filepath, "rb"); + + while (f && !feof(f)) + { + size_t bload2; + + if (!b) + { + b = (unsigned char *)malloc(bsiz); + } + else + { + bsiz += 4096; + b = (unsigned char *)realloc(b, bsiz); + } + if (!b) + goto fail_dramatically; + + bload2 = bsiz - blen; + bload2 = fread(b + blen, 1, bload2, f); + + if ((signed32_t)bload2 < 0) + goto fail_dramatically; + + blen += bload2; + } + + fclose(f); + if(!b) goto fail_dramatically; + + *buf_ref = b; + *buflen_ref = blen; + + /* + now blow away the timestamps in the CSummaryInfo section of the file + as that bit will differ with each creation. + + In fact, we're negating this bit of code in xlsLib right here: + + hpsf->addItem(SumInfo_CreateTime_Date, msTime); + hpsf->addItem(SumInfo_LastSavedTime_Date, msTime); + + in the section: + + hpsf->addItem(SumInfo_Unknown, (unsigned16_t)1200); + hpsf->addItem(SumInfo_CreateTime_Date, msTime); + hpsf->addItem(SumInfo_LastSavedTime_Date, msTime); + hpsf->addItem(SumInfo_Security, (unsigned32_t)0); + hpsf->addItem(SumInfo_NameofCreatingApplication, s = PACKAGE_NAME); + + where, thanks to the SumInfo_xxx IDs, the actual write order to the file is this: + + hpsf->addItem(SumInfo_Unknown, (unsigned16_t)1200); + hpsf->addItem(SumInfo_CreateTime_Date, msTime); + hpsf->addItem(SumInfo_LastSavedTime_Date, msTime); + hpsf->addItem(SumInfo_NameofCreatingApplication, s = PACKAGE_NAME); + hpsf->addItem(SumInfo_Security, (unsigned32_t)0); + + which explains why we blow away the 24 bytes (2 timestamps worth of data) + right smack /before/ the SumInfo_NameofCreatingApplication string... + */ + { + /* + the hex search data says: HPSF_STRING:len=6+1:data="xlsLib\0" + */ + unsigned8_t searchstring[16] = { 0x1e, 0, 0, 0, 0x07, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + static const int searchlen = 16; + size_t idlen = strlen(PACKAGE_NAME) + 1; + size_t l; + + searchstring[4] = (unsigned8_t)idlen; + if (idlen > (searchlen - 8)) + idlen = searchlen - 8; + memcpy(searchstring + 8, PACKAGE_NAME, idlen); + + l = blen - searchlen; + for ( ; l > 32; l--) + { + if (!memcmp(b + l, searchstring, searchlen)) + { +#if 0 + printf("\n"); + int x=0; + unsigned8_t *p = b + l - 2*(8+4) - x; + for(int i=0; i<2*(8+4) + 2*x; ++i) printf("%2.2x ", p[i]); + printf("\n"); +#endif + // blow away those ever varying timestamps: + memset(b + l - 2*(8+4), 0, 2*(8+4)); + break; + } + } + } + // Mac or PC bit + if(b) { + b[564] = 0; + } + + return 0; + +fail_dramatically: + *buf_ref = NULL; + *buflen_ref = 0; + + int bload = 0; + if (f) + { + bload = ferror(f); + fclose(f); + } + if (b) + { + free(b); + } + if (bload == 0) + { + bload = -1; + } + return bload; +} + +int mk_md5_4_file(char *md5_checksum, size_t md5_checksum_bufsize, const char *filepath) +{ + int rv; + unsigned8_t *buf; + size_t buflen; + struct MD5Context ctx; + int i; + unsigned8_t digest[MD5_DIGEST_LEN]; + + if (md5_checksum_bufsize < MD5_HEXSTRING_SIZE) + return -1; + + rv = load_file(&buf, &buflen, filepath); + if (rv != 0) + return -1; + + MD5Init(&ctx); + MD5Update(&ctx, buf, buflen); + MD5Final(digest, &ctx); + + free(buf); + + for (i = 0; i < MD5_DIGEST_LEN; i++) + { + sprintf(&md5_checksum[i*2], "%02x", (unsigned int)digest[i]); + } + return 0; +} + +static char digest[MD5_HEXSTRING_SIZE]; + +const char * check_file(const char *filepath, const char *md5_checksum) +{ + int rv; + + rv = mk_md5_4_file(digest, sizeof(digest), filepath); + if (rv != 0) + return "File Not Found"; + + rv = strcasecmp(digest, md5_checksum); + if (rv) + { + printf(" # md5: Actual=\"%s\" -- Expected=\"%s\"\n", digest, md5_checksum); + return digest; + } else { + return NULL; + } +} + +/* + * Copyright (c) 1987, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * From NetBSD: strcasecmp.c,v 1.12 2000/01/22 22:19:20 mycroft Exp + */ + +#ifdef NET_BSD_STRCASECMP + +#include <ctype.h> + +typedef unsigned char u_char; + +int +strcasecmp(const char *s1, const char *s2) +{ + const u_char *us1 = (const u_char *)s1, + *us2 = (const u_char *)s2; + + while (tolower(*us1) == tolower(*us2++)) + if (*us1++ == '\0') + return (0); + return (tolower(*us1) - tolower(*--us2)); +} +#endif Property changes on: trunk/xlslib/targets/test/md5cpp.cpp ___________________________________________________________________ Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |