From 3a0f2137ea0a62885984710c51070bffe1676c35 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 15 Aug 2015 14:29:07 -0400 Subject: [PATCH 01/22] Make messaging around query remembering less vague Closes #1989 --- Interfaces/English.lproj/Preferences.xib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Interfaces/English.lproj/Preferences.xib b/Interfaces/English.lproj/Preferences.xib index 28387db87..8ded24d3f 100644 --- a/Interfaces/English.lproj/Preferences.xib +++ b/Interfaces/English.lproj/Preferences.xib @@ -1262,7 +1262,7 @@ 68157504 272630784 - queries + queries (100 max) From e5255f2987215f74a1c8d33441eae343a19d1e55 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 15 Aug 2015 14:34:19 -0400 Subject: [PATCH 02/22] Rename 'Standard' to 'TCP/IP'. Refs #1739 --- Interfaces/English.lproj/ConnectionView.xib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Interfaces/English.lproj/ConnectionView.xib b/Interfaces/English.lproj/ConnectionView.xib index a6bfe95c9..ee6687b86 100644 --- a/Interfaces/English.lproj/ConnectionView.xib +++ b/Interfaces/English.lproj/ConnectionView.xib @@ -1231,7 +1231,7 @@ {{10, 33}, {420, 371}} - Standard + TCP/IP From 6caec7296e92053728c5d0b85c2beb68818a29b0 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 15 Aug 2015 14:34:58 -0400 Subject: [PATCH 03/22] Rename 'Standard' to 'TCP/IP'. Closes #1739 --- .../English.lproj/ConnectionView.strings | Bin 48636 -> 24314 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Resources/English.lproj/ConnectionView.strings b/Resources/English.lproj/ConnectionView.strings index c64cc3192571c9697037b272228e63018b00f2ad..7db4b7d6a05c3b7f912c987c2d24627466284762 100644 GIT binary patch literal 24314 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 literal 48636 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 From 13143f403a2553e1094668e614f96a9d50ce9c40 Mon Sep 17 00:00:00 2001 From: Alexander Turiak Date: Tue, 22 Sep 2015 18:07:40 +0200 Subject: [PATCH 04/22] Added Application folder shortcut, resolves #1842 --- Scripts/package-application.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Scripts/package-application.sh b/Scripts/package-application.sh index 002d51ce9..86b8082da 100755 --- a/Scripts/package-application.sh +++ b/Scripts/package-application.sh @@ -67,6 +67,12 @@ mkdir "${DISTTEMP}" # Copy in the required distribution files cp -R "${BUILT_PRODUCTS_DIR}/${TARGET_NAME}${WRAPPER_SUFFIX}" "${DMG_BUILD_PATH}/disttemp" +# Add a link to the Applications dir +echo "Add link to /Applications" +pushd "${DMG_BUILD_PATH}/disttemp" +ln -s /Applications +popd + # Create a disk image hdiutil create -srcfolder "${DISTTEMP}" -volname "$DMG_VOLUME_NAME" -fs HFS+ -fsargs '-c c=64,a=16,e=16' -format UDRW "${DMG_BUILD_PATH}/${DMG_NAME}.temp.dmg" > /dev/null From b88771821a3393a44c44e26225a8726943b4e99a Mon Sep 17 00:00:00 2001 From: Marius Ursache Date: Fri, 26 Feb 2016 22:00:40 +1100 Subject: [PATCH 05/22] Converted tests to XCTest Converted the unit tests from SenTestingKit to XCTest as SenTestingKit was deprecated a couple of SDK versions ago. --- .../xcshareddata/xcschemes/QueryKit.xcscheme | 20 ++++- UnitTests/SPDataAdditionsTests.m | 87 +++++++++++-------- UnitTests/SPDatabaseActionTest.m | 10 +-- UnitTests/SPMenuAdditionsTests.m | 6 +- UnitTests/SPMutableArrayAdditionsTests.m | 6 +- UnitTests/SPParserUtilsTest.m | 22 ++--- UnitTests/SPStringAdditionsTests.m | 64 +++++++------- UnitTests/SPTableCopyTest.m | 6 +- UnitTests/SPTableFilterParserTest.m | 10 +-- sequel-pro.xcodeproj/project.pbxproj | 41 +++++---- .../xcschemes/Sequel Pro (10.6 SDK).xcscheme | 19 ++-- .../Sequel Pro Release Build (10.6+).xcscheme | 13 +-- .../xcschemes/Sequel Pro.xcscheme | 19 ++-- 13 files changed, 184 insertions(+), 139 deletions(-) diff --git a/Frameworks/QueryKit/QueryKit.xcodeproj/xcshareddata/xcschemes/QueryKit.xcscheme b/Frameworks/QueryKit/QueryKit.xcodeproj/xcshareddata/xcschemes/QueryKit.xcscheme index fcff08314..57ddcc569 100644 --- a/Frameworks/QueryKit/QueryKit.xcodeproj/xcshareddata/xcschemes/QueryKit.xcscheme +++ b/Frameworks/QueryKit/QueryKit.xcodeproj/xcshareddata/xcschemes/QueryKit.xcscheme @@ -23,10 +23,10 @@ + shouldUseLaunchSchemeArgsEnv = "YES"> @@ -39,24 +39,36 @@ + + + + + + #import -#import +#import #import "SPDataAdditions.h" #import -@interface SPDataAdditionsTests : SenTestCase +@interface SPDataAdditionsTests : XCTestCase - (void)testSha1Hash; - (void)testDataEncryptedWithPassword; @@ -53,7 +53,7 @@ - (void)testSha1Hash NSString *input = @"Hello World!"; unsigned char bytes[] = {0x2e,0xf7,0xbd,0xe6,0x08,0xce,0x54,0x04,0xe9,0x7d,0x5f,0x04,0x2f,0x95,0xf8,0x9f,0x1c,0x23,0x28,0x71}; - STAssertTrue(memcmp([[[input dataUsingEncoding:NSUTF8StringEncoding] sha1Hash] bytes], bytes, 20) == 0, @"SHA1 simple hash from ASCII text"); + XCTAssertTrue(memcmp([[[input dataUsingEncoding:NSUTF8StringEncoding] sha1Hash] bytes], bytes, 20) == 0, @"SHA1 simple hash from ASCII text"); } // 16MB of all 8bit values { @@ -65,14 +65,14 @@ - (void)testSha1Hash NSData *input = [NSData dataWithBytesNoCopy:buf length:bufSz]; NSString *result = @"25E05EB8E9E2B06036DF4026630FE01A19BF0F16"; - STAssertEqualObjects([[input sha1Hash] dataToHexString], result, @"SHA1 hash from full ASCII range"); + XCTAssertEqualObjects([[input sha1Hash] dataToHexString], result, @"SHA1 hash from full ASCII range"); } // empty hash { NSData *input = [NSData data]; NSString *result = @"DA39A3EE5E6B4B0D3255BFEF95601890AFD80709"; - STAssertEqualObjects([[input sha1Hash] dataToHexString], result, @"SHA1 hash from empty data"); + XCTAssertEqualObjects([[input sha1Hash] dataToHexString], result, @"SHA1 hash from empty data"); } // test with > 4GB data (other code path) // HFS+ does not support sparse files, so enable this one only if you have enough disk space. @@ -109,7 +109,7 @@ - (void)testSha1Hash NSData *input = [@"føöbärbãz" dataUsingEncoding:NSUTF8StringEncoding]; NSString *result = @"8A8B6142281950CBB9B01C9DF0DADB0BDAE2D0E1"; - STAssertEqualObjects([[input sha1Hash] dataToHexString], result, @"SHA1 hash of UTF-8 string"); + XCTAssertEqualObjects([[input sha1Hash] dataToHexString], result, @"SHA1 hash of UTF-8 string"); } } @@ -123,11 +123,11 @@ - (void)testDataEncryptedWithPassword NSData *encrypted = [raw dataEncryptedWithPassword:password]; //check that our encrypted data is not the plaintext data NSData *encCore = [encrypted subdataWithRange:NSMakeRange(16, [raw length])]; - STAssertFalse([encCore isEqualToData:raw], @"encrypted equal to plain text!"); + XCTAssertFalse([encCore isEqualToData:raw], @"encrypted equal to plain text!"); //decrypt again and verify NSData *decrypted = [encrypted dataDecryptedWithPassword:password]; - STAssertEqualObjects(decrypted, raw, @"decrypted data not equal to plaintext data!"); + XCTAssertEqualObjects(decrypted, raw, @"decrypted data not equal to plaintext data!"); } - (void)testDataEncryptedWithKeyIV @@ -144,7 +144,7 @@ - (void)testDataEncryptedWithKeyIV { @try { [raw dataEncryptedWithKey:[@"password" dataUsingEncoding:NSASCIIStringEncoding] IV:iv]; - STFail(@"Password should not be a valid key!"); + XCTFail(@"Password should not be a valid key!"); } @catch (NSException *exception) { //expected @@ -154,7 +154,7 @@ - (void)testDataEncryptedWithKeyIV { @try { [raw dataEncryptedWithKey:key IV:[NSData data]]; - STFail(@"Empty IV should throw exception!"); + XCTFail(@"Empty IV should throw exception!"); } @catch (NSException *exception) { // expected @@ -171,7 +171,7 @@ - (void)testDataEncryptedWithKeyIV 0x1d, 0x9f, 0x0c, 0x7a }; // reference data generated with OpenSSL NSData *expData = [NSData dataWithBytesNoCopy:expect length:sizeof(expect) freeWhenDone:NO]; - STAssertEqualObjects(enc, expData, @"Encryption of empty data"); + XCTAssertEqualObjects(enc, expData, @"Encryption of empty data"); } //simple encryption test { @@ -185,7 +185,7 @@ - (void)testDataEncryptedWithKeyIV 0x44, 0x32, 0xb3, 0xda, 0x42, 0x58, 0x29, 0x78, 0xc3 }; // reference data generated with OpenSSL NSData *expData = [NSData dataWithBytesNoCopy:expect length:sizeof(expect) freeWhenDone:NO]; - STAssertEqualObjects(enc, expData, @"Simple encryption test"); + XCTAssertEqualObjects(enc, expData, @"Simple encryption test"); } } @@ -205,7 +205,7 @@ - (void)testDataDecryptedWithPassword NSData *decrypted = [encData dataDecryptedWithPassword:@""]; - STAssertEqualObjects(decrypted, raw, @"Decrypt simple data encrypted with empty password"); + XCTAssertEqualObjects(decrypted, raw, @"Decrypt simple data encrypted with empty password"); } - (void)testDataDecryptedWithKey @@ -229,7 +229,7 @@ - (void)testDataDecryptedWithKey { @try { [encData dataDecryptedWithKey:[NSData data]]; - STFail(@"Invalid key length!"); + XCTFail(@"Invalid key length!"); } @catch (NSException *exception) { //expected @@ -239,7 +239,7 @@ - (void)testDataDecryptedWithKey { @try { [[@"Hello World!" dataUsingEncoding:NSASCIIStringEncoding] dataDecryptedWithKey:key]; - STFail(@"Invalid data length!"); + XCTFail(@"Invalid data length!"); } @catch (NSException *exception) { //expected @@ -248,17 +248,17 @@ - (void)testDataDecryptedWithKey // wrong data with valid length { NSData *inp = [@"12345678901234567890123456789012" dataUsingEncoding:NSASCIIStringEncoding]; - STAssertNil([inp dataDecryptedWithKey:key], @"Trying to decrypt invalid data."); + XCTAssertNil([inp dataDecryptedWithKey:key], @"Trying to decrypt invalid data."); } // wrong data with invalid length { NSData *inp = [@"12345678901234567890123456789012345678901234567" dataUsingEncoding:NSASCIIStringEncoding]; - STAssertNil([inp dataDecryptedWithKey:key], @"Trying to decrypt data with invalid length."); + XCTAssertNil([inp dataDecryptedWithKey:key], @"Trying to decrypt data with invalid length."); } // simple decryption test { NSData *decrypted = [encData dataDecryptedWithKey:key]; - STAssertEqualObjects(decrypted, raw, @"Simple Decryption test"); + XCTAssertEqualObjects(decrypted, raw, @"Simple Decryption test"); } // malicious message test { @@ -274,7 +274,7 @@ - (void)testDataDecryptedWithKey @try { [_encData dataDecryptedWithKey:key]; - STFail(@"Malicious message with invalid data length"); + XCTFail(@"Malicious message with invalid data length"); } @catch (NSException *exception) { //expected @@ -291,85 +291,102 @@ - (void)testEnumerateLinesBreakingAt_withBlock [data enumerateLinesBreakingAt:SPLineTerminatorAny withBlock:^(NSRange line, BOOL *stop) { invocations++; }]; - STAssertTrue(invocations==0, @"Empty data never invokes block"); + XCTAssertTrue(invocations==0, @"Empty data never invokes block"); } //simple unix file { const char inp[] = "Two\nLines\n"; + NSValue *line1 = [NSValue valueWithRange:NSMakeRange(0, 3)]; + NSValue *line2 = [NSValue valueWithRange:NSMakeRange(4, 5)]; + __block NSUInteger invocations = 0; NSData *data = [NSData dataWithBytes:inp length:strlen(inp)]; [data enumerateLinesBreakingAt:SPLineTerminatorAny withBlock:^(NSRange line, BOOL *stop) { + NSValue *lineValue = [NSValue valueWithRange:line]; switch (invocations) { case 0: - STAssertEquals(line, NSMakeRange(0, 3), @"range of first line"); + XCTAssertTrue([lineValue isEqualToValue:line1], @"range of first line"); break; case 1: - STAssertEquals(line, NSMakeRange(4, 5), @"range of second line"); + XCTAssertTrue([lineValue isEqualToValue:line2], @"range of second line"); break; } invocations++; }]; - STAssertTrue(invocations==2, @"File with two lines, terminated with empty line"); + XCTAssertTrue(invocations==2, @"File with two lines, terminated with empty line"); } //simple windows file without ending empty line { const char inp[] = "A\r\nWindows\r\nfile"; + NSValue *line1 = [NSValue valueWithRange:NSMakeRange(0, 1)]; + NSValue *line2 = [NSValue valueWithRange:NSMakeRange(3, 7)]; + NSValue *line3 = [NSValue valueWithRange:NSMakeRange(12, 4)]; __block NSUInteger invocations = 0; NSData *data = [NSData dataWithBytes:inp length:strlen(inp)]; [data enumerateLinesBreakingAt:SPLineTerminatorAny withBlock:^(NSRange line, BOOL *stop) { + NSValue *lineValue = [NSValue valueWithRange:line]; switch (invocations) { case 0: - STAssertEquals(line, NSMakeRange(0, 1), @"range of first line"); + XCTAssertTrue([lineValue isEqualToValue:line1], @"range of first line"); break; case 1: - STAssertEquals(line, NSMakeRange(3, 7), @"range of second line"); + XCTAssertTrue([lineValue isEqualToValue:line2], @"range of second line"); break; case 2: - STAssertEquals(line, NSMakeRange(12, 4), @"range of third line"); + XCTAssertTrue([lineValue isEqualToValue:line3], @"range of third line"); break; } invocations++; }]; - STAssertTrue(invocations==3, @"File with three lines, CRLF, terminated with empty line"); + XCTAssertTrue(invocations==3, @"File with three lines, CRLF, terminated with empty line"); } //empty lines with all 3 endings { const char inp[] = "\n\r\n\r"; + NSValue *line1 = [NSValue valueWithRange:NSMakeRange(0, 0)]; + NSValue *line2 = [NSValue valueWithRange:NSMakeRange(1, 0)]; + NSValue *line3 = [NSValue valueWithRange:NSMakeRange(3, 0)]; + __block NSUInteger invocations = 0; NSData *data = [NSData dataWithBytes:inp length:strlen(inp)]; [data enumerateLinesBreakingAt:SPLineTerminatorAny withBlock:^(NSRange line, BOOL *stop) { + NSValue *lineValue = [NSValue valueWithRange:line]; switch (invocations) { case 0: - STAssertEquals(line, NSMakeRange(0, 0), @"range of first line"); + XCTAssertTrue([lineValue isEqualToValue:line1], @"range of first line"); break; case 1: - STAssertEquals(line, NSMakeRange(1, 0), @"range of second line"); + XCTAssertTrue([lineValue isEqualToValue:line2], @"range of second line"); break; case 2: - STAssertEquals(line, NSMakeRange(3, 0), @"range of third line"); + XCTAssertTrue([lineValue isEqualToValue:line3], @"range of third line"); break; } invocations++; }]; - STAssertTrue(invocations==3, @"LF, CRLF and CR mixed"); + XCTAssertTrue(invocations==3, @"LF, CRLF and CR mixed"); } //looking for specific line breaks only { const char inp[] = "foo\nbar\r\nbaz\r"; + NSValue *line1 = [NSValue valueWithRange:NSMakeRange(0, 7)]; + NSValue *line2 = [NSValue valueWithRange:NSMakeRange(9, 4)]; + __block NSUInteger invocations = 0; NSData *data = [NSData dataWithBytes:inp length:strlen(inp)]; [data enumerateLinesBreakingAt:SPLineTerminatorCRLF withBlock:^(NSRange line, BOOL *stop) { + NSValue *lineValue = [NSValue valueWithRange:line]; switch (invocations) { case 0: - STAssertEquals(line, NSMakeRange(0, 7), @"range of first line"); + XCTAssertTrue([lineValue isEqualToValue:line1], @"range of first line"); break; case 1: - STAssertEquals(line, NSMakeRange(9, 4), @"range of second line"); + XCTAssertTrue([lineValue isEqualToValue:line2], @"range of second line"); break; } invocations++; }]; - STAssertTrue(invocations==2, @"other line breaks when only CRLF is expected"); + XCTAssertTrue(invocations==2, @"other line breaks when only CRLF is expected"); } //stopping early { @@ -380,7 +397,7 @@ - (void)testEnumerateLinesBreakingAt_withBlock invocations++; *stop = YES; }]; - STAssertTrue(invocations==1, @"File with two lines, stopped after first"); + XCTAssertTrue(invocations==1, @"File with two lines, stopped after first"); } } diff --git a/UnitTests/SPDatabaseActionTest.m b/UnitTests/SPDatabaseActionTest.m index f7704df5d..a74dc0f04 100644 --- a/UnitTests/SPDatabaseActionTest.m +++ b/UnitTests/SPDatabaseActionTest.m @@ -29,14 +29,14 @@ // More info at #import -#import +#import #import "SPDatabaseAction.h" #import -@interface SPDatabaseActionTest : SenTestCase +@interface SPDatabaseActionTest : XCTestCase - (void)testCreateDatabase_01_emptyName; - (void)testCreateDatabase_02_allParams; @@ -53,7 +53,7 @@ - (void)testCreateDatabase_01_emptyName SPDatabaseAction *createDb = [[[SPDatabaseAction alloc] init] autorelease]; [createDb setConnection:mockConnection]; - STAssertFalse([createDb createDatabase:@"" withEncoding:nil collation:nil],@"create database = NO with empty db name"); + XCTAssertFalse([createDb createDatabase:@"" withEncoding:nil collation:nil],@"create database = NO with empty db name"); OCMVerifyAll(mockConnection); } @@ -69,7 +69,7 @@ - (void)testCreateDatabase_02_allParams SPDatabaseAction *createDb = [[[SPDatabaseAction alloc] init] autorelease]; [createDb setConnection:mockConnection]; - STAssertTrue([createDb createDatabase:@"target_name" withEncoding:@"utf8" collation:@"utf8_bin_ci"], @"create database return"); + XCTAssertTrue([createDb createDatabase:@"target_name" withEncoding:@"utf8" collation:@"utf8_bin_ci"], @"create database return"); OCMVerifyAll(mockConnection); } @@ -84,7 +84,7 @@ - (void)testCreateDatabase_03_nameOnly SPDatabaseAction *createDb = [[[SPDatabaseAction alloc] init] autorelease]; [createDb setConnection:mockConnection]; - STAssertTrue([createDb createDatabase:@"target_name" withEncoding:@"" collation:nil], @"create database return"); + XCTAssertTrue([createDb createDatabase:@"target_name" withEncoding:@"" collation:nil], @"create database return"); OCMVerifyAll(mockConnection); } diff --git a/UnitTests/SPMenuAdditionsTests.m b/UnitTests/SPMenuAdditionsTests.m index 83647e6f8..7e8b5ecc6 100644 --- a/UnitTests/SPMenuAdditionsTests.m +++ b/UnitTests/SPMenuAdditionsTests.m @@ -30,7 +30,7 @@ #import "SPMenuAdditions.h" -#import +#import /** * @class SPMenuAdditionsTests SPMenuAdditionsTests.h @@ -39,7 +39,7 @@ * * SPMenuAdditionsTests tests class. */ -@interface SPMenuAdditionsTests : SenTestCase +@interface SPMenuAdditionsTests : XCTestCase { NSMenu *menu; } @@ -71,7 +71,7 @@ - (void)testCompatibleRemoveAllItems { [menu compatibleRemoveAllItems]; - STAssertFalse([menu numberOfItems], @"The menu should have no menu items."); + XCTAssertFalse([menu numberOfItems], @"The menu should have no menu items."); } @end diff --git a/UnitTests/SPMutableArrayAdditionsTests.m b/UnitTests/SPMutableArrayAdditionsTests.m index e09f00a43..82fec4001 100644 --- a/UnitTests/SPMutableArrayAdditionsTests.m +++ b/UnitTests/SPMutableArrayAdditionsTests.m @@ -30,7 +30,7 @@ #import "SPMutableArrayAdditions.h" -#import +#import /** * @class SPMutableArrayAdditionsTest SPMutableArrayAdditionsTest.h @@ -39,7 +39,7 @@ * * SPMutableArrayAdditions tests class. */ -@interface SPMutableArrayAdditionsTests : SenTestCase +@interface SPMutableArrayAdditionsTests : XCTestCase @end @@ -55,7 +55,7 @@ - (void)testReverse [testArray reverse]; - STAssertEqualObjects(testArray, expectedArray, @"The reversed array should look like: %@, but actually looks like: %@", expectedArray, testArray); + XCTAssertEqualObjects(testArray, expectedArray, @"The reversed array should look like: %@, but actually looks like: %@", expectedArray, testArray); } @end diff --git a/UnitTests/SPParserUtilsTest.m b/UnitTests/SPParserUtilsTest.m index 994b166a4..6796a2504 100644 --- a/UnitTests/SPParserUtilsTest.m +++ b/UnitTests/SPParserUtilsTest.m @@ -31,11 +31,11 @@ #define USE_APPLICATION_UNIT_TEST 1 #import -#import +#import #include "SPParserUtils.h" -@interface SPParserUtilsTest : SenTestCase +@interface SPParserUtilsTest : XCTestCase - (void)testUtf8strlen; @@ -49,39 +49,39 @@ - (void)testUtf8strlen { const char *empty = ""; NSString *emptyString = [NSString stringWithCString:empty encoding:NSUTF8StringEncoding]; - STAssertEquals(utf8strlen(empty),[emptyString length], @"empty string"); + XCTAssertEqual(utf8strlen(empty),[emptyString length], @"empty string"); // This is just a little safeguard. // If any of those conditions fail, all of the following assumptions are moot. const char *charSeq = "\xF0\x9F\x8D\x8F"; //🍏 NSString *charString = [NSString stringWithCString:charSeq encoding:NSUTF8StringEncoding]; - STAssertEquals(strlen(charSeq), (size_t)4, @"assumption about storage for binary C string"); - STAssertEquals([charString length], (NSUInteger)2, @"assumption about NSString internal storage of string"); + XCTAssertEqual(strlen(charSeq), (size_t)4, @"assumption about storage for binary C string"); + XCTAssertEqual([charString length], (NSUInteger)2, @"assumption about NSString internal storage of string"); const char *singleByteSeq = "Hello World!"; NSString *singleByteString = [NSString stringWithCString:singleByteSeq encoding:NSUTF8StringEncoding]; - STAssertEquals(utf8strlen(singleByteSeq), [singleByteString length], @"ASCII UTF-8 subset"); + XCTAssertEqual(utf8strlen(singleByteSeq), [singleByteString length], @"ASCII UTF-8 subset"); const char *twoByteSeq = "H\xC3\xA4ll\xC3\xB6 W\xC3\x9Crld\xC3\x9F!"; // Hällö WÜrldß! NSString *twoByteString = [NSString stringWithCString:twoByteSeq encoding:NSUTF8StringEncoding]; - STAssertEquals(utf8strlen(twoByteSeq), [twoByteString length], @"String containing two-byte utf8 characters"); + XCTAssertEqual(utf8strlen(twoByteSeq), [twoByteString length], @"String containing two-byte utf8 characters"); const char *threeByteSeq = "\xE3\x81\x93.\xE3\x82\x93.\xE3\x81\xAB.\xE3\x81\xA1.\xE3\x81\xAF"; // こ.ん.に.ち.は NSString *threeByteString = [NSString stringWithCString:threeByteSeq encoding:NSUTF8StringEncoding]; - STAssertEquals(utf8strlen(threeByteSeq), [threeByteString length], @"String containing three-byte utf8 characters"); + XCTAssertEqual(utf8strlen(threeByteSeq), [threeByteString length], @"String containing three-byte utf8 characters"); const char *fourByteSeq = "\xF0\x9F\x8D\x8F\xF0\x9F\x8D\x8B\xF0\x9F\x8D\x92"; //🍏🍋🍒 NSString *fourByteString = [NSString stringWithCString:fourByteSeq encoding:NSUTF8StringEncoding]; - STAssertEquals(utf8strlen(fourByteSeq), [fourByteString length], @"String containing only 4-byte utf8 characters (outside BMP)"); + XCTAssertEqual(utf8strlen(fourByteSeq), [fourByteString length], @"String containing only 4-byte utf8 characters (outside BMP)"); const char *mixedSeq = "\xE3\x81\x82\xE3\x82\x81\xE3\x80\x90\xE9\xA3\xB4\xE3\x80\x91\xF0\x9F\x8D\xAD \xE2\x89\x88 S\xC3\xBC\xC3\x9Figkeit"; // あめ【飴】🍭 ≈ Süßigkeit NSString *mixedString = [NSString stringWithCString:mixedSeq encoding:NSUTF8StringEncoding]; - STAssertEquals(utf8strlen(mixedSeq), [mixedString length], @"utf8 characters with all 4 lengths mixed together."); + XCTAssertEqual(utf8strlen(mixedSeq), [mixedString length], @"utf8 characters with all 4 lengths mixed together."); //composed vs. decomposed chars const char *decompSeq = "\xC3\xA4 - a\xCC\x88"; // ä - ä NSString *decompString = [NSString stringWithCString:decompSeq encoding:NSUTF8StringEncoding]; - STAssertEquals(utf8strlen(decompSeq), [decompString length], @"\"LATIN SMALL LETTER A WITH DIAERESIS\" vs. \"LATIN SMALL LETTER A\" + \"COMBINING DIAERESIS\""); + XCTAssertEqual(utf8strlen(decompSeq), [decompString length], @"\"LATIN SMALL LETTER A WITH DIAERESIS\" vs. \"LATIN SMALL LETTER A\" + \"COMBINING DIAERESIS\""); } @end diff --git a/UnitTests/SPStringAdditionsTests.m b/UnitTests/SPStringAdditionsTests.m index 00cbdc14d..eca9f7aba 100644 --- a/UnitTests/SPStringAdditionsTests.m +++ b/UnitTests/SPStringAdditionsTests.m @@ -31,9 +31,9 @@ #import "SPStringAdditions.h" #import "RegexKitLite.h" -#import +#import -@interface SPStringAdditionsTests : SenTestCase +@interface SPStringAdditionsTests : XCTestCase - (void)testStringByRemovingCharactersInSet; - (void)testStringWithNewUUID; @@ -65,12 +65,12 @@ - (void)testStringByRemovingCharactersInSet NSString *expectedUTFString = @"In der Krze liegt die Wrz"; NSString *expectedASCIIString = @"this is ig rzy test string with some rndom spes nd quotes"; - STAssertEqualObjects([actualASCIIString stringByRemovingCharactersInSet:junk], + XCTAssertEqualObjects([actualASCIIString stringByRemovingCharactersInSet:junk], expectedASCIIString, @"The following characters should have been removed %@", charsToRemove); - STAssertEqualObjects([actualUTFString stringByRemovingCharactersInSet:junk], + XCTAssertEqualObjects([actualUTFString stringByRemovingCharactersInSet:junk], expectedUTFString, @"The following characters should have been removed %@", charsToRemove); @@ -83,7 +83,7 @@ - (void)testStringWithNewUUID { NSString *uuid = [NSString stringWithNewUUID]; - STAssertTrue([uuid isMatchedByRegex:@"[A-F0-9]{8}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{12}"], @"UUID %@ doesn't match regex", uuid); + XCTAssertTrue([uuid isMatchedByRegex:@"[A-F0-9]{8}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{12}"], @"UUID %@ doesn't match regex", uuid); } /** @@ -96,7 +96,7 @@ - (void)testCreateViewSyntaxPrettifier NSString *actualSyntax = [originalSyntax createViewSyntaxPrettifier]; - STAssertEqualObjects([actualSyntax description], [expectedSyntax description], @"Actual view syntax '%@' does not equal expected syntax '%@'", actualSyntax, expectedSyntax); + XCTAssertEqualObjects([actualSyntax description], [expectedSyntax description], @"Actual view syntax '%@' does not equal expected syntax '%@'", actualSyntax, expectedSyntax); } - (void)testNonConsecutivelySearchStringMatchingRanges @@ -104,48 +104,48 @@ - (void)testNonConsecutivelySearchStringMatchingRanges //basic tests { NSArray *matches = nil; - STAssertTrue([@"" nonConsecutivelySearchString:@"" matchingRanges:&matches], @"Equality of empty strings"); - STAssertTrue(([matches count] == 1) && NSEqualRanges(NSMakeRange(0, 0), RangeFromArray(matches, 0)), @"Returned matches in empty string"); + XCTAssertTrue([@"" nonConsecutivelySearchString:@"" matchingRanges:&matches], @"Equality of empty strings"); + XCTAssertTrue(([matches count] == 1) && NSEqualRanges(NSMakeRange(0, 0), RangeFromArray(matches, 0)), @"Returned matches in empty string"); } { NSArray *matches = (void *)0xdeadbeef; - STAssertFalse([@"" nonConsecutivelySearchString:@"R" matchingRanges:&matches], @"Inequality with empty left side"); - STAssertTrue((matches == (void *)0xdeadbeef), @"out variable not touched by mismatch"); + XCTAssertFalse([@"" nonConsecutivelySearchString:@"R" matchingRanges:&matches], @"Inequality with empty left side"); + XCTAssertTrue((matches == (void *)0xdeadbeef), @"out variable not touched by mismatch"); } - STAssertFalse([@"L" nonConsecutivelySearchString:@"" matchingRanges:NULL], @"Inequality with empty right side"); + XCTAssertFalse([@"L" nonConsecutivelySearchString:@"" matchingRanges:NULL], @"Inequality with empty right side"); { NSArray *matches = nil; - STAssertTrue([@"left" nonConsecutivelySearchString:@"le" matchingRanges:&matches], @"Anchored match left"); - STAssertTrue(([matches count] == 1) && NSEqualRanges(NSMakeRange(0, 2), RangeFromArray(matches, 0)), @"Returned matches in anchored left match"); + XCTAssertTrue([@"left" nonConsecutivelySearchString:@"le" matchingRanges:&matches], @"Anchored match left"); + XCTAssertTrue(([matches count] == 1) && NSEqualRanges(NSMakeRange(0, 2), RangeFromArray(matches, 0)), @"Returned matches in anchored left match"); } { NSArray *matches = nil; - STAssertTrue([@"right" nonConsecutivelySearchString:@"ht" matchingRanges:&matches], @"Anchored match right"); - STAssertTrue(([matches count] == 1) && NSEqualRanges(NSMakeRange(3, 2), RangeFromArray(matches, 0)), @"Returned matches in anchroed right match"); + XCTAssertTrue([@"right" nonConsecutivelySearchString:@"ht" matchingRanges:&matches], @"Anchored match right"); + XCTAssertTrue(([matches count] == 1) && NSEqualRanges(NSMakeRange(3, 2), RangeFromArray(matches, 0)), @"Returned matches in anchroed right match"); } - STAssertFalse([@"ht" nonConsecutivelySearchString:@"right" matchingRanges:NULL], @"Left and Right are not commutative"); + XCTAssertFalse([@"ht" nonConsecutivelySearchString:@"right" matchingRanges:NULL], @"Left and Right are not commutative"); //real tests { NSArray *matches = nil; - STAssertTrue([@"... is not secure anymore!" nonConsecutivelySearchString:@"NSA" matchingRanges:&matches], @"Non-consecutive match, ignoring case"); - STAssertTrue(([matches count] == 3) && + XCTAssertTrue([@"... is not secure anymore!" nonConsecutivelySearchString:@"NSA" matchingRanges:&matches], @"Non-consecutive match, ignoring case"); + XCTAssertTrue(([matches count] == 3) && NSEqualRanges(NSMakeRange( 7, 1), RangeFromArray(matches, 0)) && NSEqualRanges(NSMakeRange(11, 1), RangeFromArray(matches, 1)) && NSEqualRanges(NSMakeRange(18, 1), RangeFromArray(matches, 2)), @"Returned matches in non-consecutive string"); } - STAssertFalse([@"Deoxyribonucleic Acid" nonConsecutivelySearchString:@"DNS" matchingRanges:NULL], @"Non-consecutive mismatch"); + XCTAssertFalse([@"Deoxyribonucleic Acid" nonConsecutivelySearchString:@"DNS" matchingRanges:NULL], @"Non-consecutive mismatch"); { NSArray *matches = nil; - STAssertTrue([@"Turn left, then right at the corner" nonConsecutivelySearchString:@"left right" matchingRanges:&matches], @"Partly consecutive match"); - STAssertTrue(([matches count] == 2) && + XCTAssertTrue([@"Turn left, then right at the corner" nonConsecutivelySearchString:@"left right" matchingRanges:&matches], @"Partly consecutive match"); + XCTAssertTrue(([matches count] == 2) && (NSEqualRanges(NSMakeRange( 5, 4), RangeFromArray(matches, 0))) && (NSEqualRanges(NSMakeRange(15, 6), RangeFromArray(matches, 1))), @"Returned matches in partly-consecutive string"); } @@ -159,8 +159,8 @@ - (void)testNonConsecutivelySearchStringMatchingRanges // ^^^^^^^ ^ ^ ^ ^ = 5 (after optimizing consecutive atomic matches) // Desired: "central_private_rabbit_park" // ^^^^^^^ ^^^^ = 2 - STAssertTrue([@"central_private_rabbit_park" nonConsecutivelySearchString:@"centralpark" matchingRanges:&matches], @"Optimization partly consecutive match"); - STAssertTrue((([matches count] == 2) && + XCTAssertTrue([@"central_private_rabbit_park" nonConsecutivelySearchString:@"centralpark" matchingRanges:&matches], @"Optimization partly consecutive match"); + XCTAssertTrue((([matches count] == 2) && (NSEqualRanges(NSMakeRange( 0, 7), RangeFromArray(matches, 0))) && (NSEqualRanges(NSMakeRange(23, 4), RangeFromArray(matches, 1)))), @"Returned matches set is minimal"); } @@ -172,8 +172,8 @@ - (void)testNonConsecutivelySearchStringMatchingRanges // Unoptimized: ^ ^ ^ ^ ^ ^ ^ = 7 // Desired: ^ ^^^ ^^^ = 3 NSArray *matches = nil; - STAssertTrue([@"a.?a?ab?abc?1?12?123?" nonConsecutivelySearchString:@".abc123" matchingRanges:&matches], @"Optimization non-consecutive match"); - STAssertTrue((([matches count] == 3) && + XCTAssertTrue([@"a.?a?ab?abc?1?12?123?" nonConsecutivelySearchString:@".abc123" matchingRanges:&matches], @"Optimization non-consecutive match"); + XCTAssertTrue((([matches count] == 3) && (NSEqualRanges(NSMakeRange( 1, 1), RangeFromArray(matches, 0))) && (NSEqualRanges(NSMakeRange( 8, 3), RangeFromArray(matches, 1))) && (NSEqualRanges(NSMakeRange(17, 3), RangeFromArray(matches, 2)))), @"Returned matches set is minimal (2)"); @@ -184,15 +184,15 @@ - (void)testNonConsecutivelySearchStringMatchingRanges // LATIN CAPITAL LETTER A == LATIN SMALL LETTER A // LATIN SMALL LETTER O WITH DIAERESIS == LATIN SMALL LETTER O // FULLWIDTH LATIN SMALL LETTER b == LATIN SMALL LETTER B - STAssertTrue([@"A:\xC3\xB6:\xEF\xBD\x82" nonConsecutivelySearchString:@"aob" matchingRanges:NULL], @"Fuzzy matching of defined characters"); + XCTAssertTrue([@"A:\xC3\xB6:\xEF\xBD\x82" nonConsecutivelySearchString:@"aob" matchingRanges:NULL], @"Fuzzy matching of defined characters"); //all bytes on the right are contained on the left, but on a character level "ä" is not contained in "Hütte Ф" - STAssertFalse([@"H\xC3\xBCtte \xD0\xA4" nonConsecutivelySearchString:@"\xC3\xA4" matchingRanges:NULL], @"Mismatch of composed characters with same prefix"); + XCTAssertFalse([@"H\xC3\xBCtte \xD0\xA4" nonConsecutivelySearchString:@"\xC3\xA4" matchingRanges:NULL], @"Mismatch of composed characters with same prefix"); // ":😥:𠘄:" vs "😄" (according to wikipedia "𠘄" is the arachic variant of "印") // TECHNICALLY THIS SHOULD NOT MATCH! // However Apple doesn't correctly handle characters in the 4-Byte UTF range, so let's use this test to check for changes in Apples behaviour :) - STAssertTrue([@":\xF0\x9F\x98\x84:\xF0\xA0\x98\x84:" nonConsecutivelySearchString:@"\xF0\x9F\x98\x84" matchingRanges:NULL], @"Mismatch of composed characters (4-byte) with same prefix"); + XCTAssertTrue([@":\xF0\x9F\x98\x84:\xF0\xA0\x98\x84:" nonConsecutivelySearchString:@"\xF0\x9F\x98\x84" matchingRanges:NULL], @"Mismatch of composed characters (4-byte) with same prefix"); } @@ -200,19 +200,19 @@ - (void)testStringByReplacingCharactersInSetWithString { { //test against empty string - STAssertEqualObjects([@"" stringByReplacingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] withString:@"x"], @"", @"replacement on empty string must result in empty string"); + XCTAssertEqualObjects([@"" stringByReplacingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] withString:@"x"], @"", @"replacement on empty string must result in empty string"); } { //test match at begin, middle, end / consecutive matches - STAssertEqualObjects([@" ab c " stringByReplacingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] withString:@"_"], @"_ab__c_", @"Testing matches at both end, replacement of consecutive matches"); + XCTAssertEqualObjects([@" ab c " stringByReplacingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] withString:@"_"], @"_ab__c_", @"Testing matches at both end, replacement of consecutive matches"); } { //test replacement of different characters - STAssertEqualObjects([@"ab\r\ncd" stringByReplacingCharactersInSet:[NSCharacterSet newlineCharacterSet] withString:@"*"], @"ab**cd", @"Testing replacement of different characters in set"); + XCTAssertEqualObjects([@"ab\r\ncd" stringByReplacingCharactersInSet:[NSCharacterSet newlineCharacterSet] withString:@"*"], @"ab**cd", @"Testing replacement of different characters in set"); } { // nil for replacement char - STAssertEqualObjects([@"ab\r\ncd" stringByReplacingCharactersInSet:[NSCharacterSet newlineCharacterSet] withString:nil], @"abcd", @"testing replacement with nil"); + XCTAssertEqualObjects([@"ab\r\ncd" stringByReplacingCharactersInSet:[NSCharacterSet newlineCharacterSet] withString:nil], @"abcd", @"testing replacement with nil"); } } diff --git a/UnitTests/SPTableCopyTest.m b/UnitTests/SPTableCopyTest.m index 05ab4a761..208017861 100644 --- a/UnitTests/SPTableCopyTest.m +++ b/UnitTests/SPTableCopyTest.m @@ -31,12 +31,12 @@ #import "SPTableCopy.h" #import -#import +#import #import #define USE_APPLICATION_UNIT_TEST 1 -@interface SPTableCopyTest : SenTestCase +@interface SPTableCopyTest : XCTestCase - (void)testCopyTableFromToWithData; - (void)testCopyTableFromTo_NoPermissions; @@ -89,7 +89,7 @@ - (void)testCopyTableFromTo_NoPermissions { SPTableCopy *tableCopy = [[SPTableCopy alloc] init]; - STAssertFalse([tableCopy copyTable:@"table_name" from:@"source_db" to:@"target_db"],@"copy operation must fail."); + XCTAssertFalse([tableCopy copyTable:@"table_name" from:@"source_db" to:@"target_db"],@"copy operation must fail."); [tableCopy release]; } diff --git a/UnitTests/SPTableFilterParserTest.m b/UnitTests/SPTableFilterParserTest.m index d5f469694..1ff69e7f7 100644 --- a/UnitTests/SPTableFilterParserTest.m +++ b/UnitTests/SPTableFilterParserTest.m @@ -12,9 +12,9 @@ #define USE_APPLICATION_UNIT_TEST 1 #import -#import +#import -@interface SPTableFilterParserTest : SenTestCase +@interface SPTableFilterParserTest : XCTestCase - (void)testFilterString; @@ -29,7 +29,7 @@ - (void)testFilterString { [p setCurrentField:@"FLD"]; // binary matches as "$BINARY ", eating the one additional whitespace - STAssertEqualObjects([p filterString],@"`FLD` constant string", @"Constant replacement"); + XCTAssertEqualObjects([p filterString],@"`FLD` constant string", @"Constant replacement"); } //simple one argument case with binary { @@ -38,7 +38,7 @@ - (void)testFilterString { [p setCaseSensitive:YES]; [p setArgument:@"arg1"]; - STAssertEqualObjects([p filterString], @"`FLD2` = FOO(BINARY arg1)", @"One Argument, $BINARY variable"); + XCTAssertEqualObjects([p filterString], @"`FLD2` = FOO(BINARY arg1)", @"One Argument, $BINARY variable"); } //simple two argument case with explicit current field { @@ -48,7 +48,7 @@ - (void)testFilterString { [p setFirstBetweenArgument:@"LA"]; [p setSecondBetweenArgument:@"RA"]; - STAssertEqualObjects([p filterString], @"MIN(`FLD3`,LA) = RA", @"Two Arguments, $CURRENT_FIELD variable"); + XCTAssertEqualObjects([p filterString], @"MIN(`FLD3`,LA) = RA", @"Two Arguments, $CURRENT_FIELD variable"); } } diff --git a/sequel-pro.xcodeproj/project.pbxproj b/sequel-pro.xcodeproj/project.pbxproj index b1521906a..aaca3759b 100644 --- a/sequel-pro.xcodeproj/project.pbxproj +++ b/sequel-pro.xcodeproj/project.pbxproj @@ -538,6 +538,13 @@ remoteGlobalIDString = 17E5969E14F307CE0054EE08; remoteInfo = Tests; }; + 29B70BD51C805B2A00D1BE0C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 584D876015140D3500F24774 /* SPMySQLFramework.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 507FF1D51BC0D7D300104523; + remoteInfo = "SPMySQL Unit Tests"; + }; 5847571D120A1C6D0057631F /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 2A37F4A9FDCFA73011CA2CEA /* Project object */; @@ -910,7 +917,7 @@ 29FA88221114619E00D1AF3D /* SPTableTriggers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPTableTriggers.m; sourceTree = ""; }; 2A37F4C4FDCFA73011CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 2A37F4C5FDCFA73011CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; - 380F4ED90FC0B50500B0BFD7 /* Unit Tests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Unit Tests.octest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 380F4ED90FC0B50500B0BFD7 /* Unit Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Unit Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 380F4EF40FC0B68F00B0BFD7 /* SPStringAdditionsTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPStringAdditionsTests.m; sourceTree = ""; }; 384582C30FB95FF800DDACB6 /* func-small.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "func-small.png"; sourceTree = ""; }; 384582C60FB9603600DDACB6 /* proc-small.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "proc-small.png"; sourceTree = ""; }; @@ -2364,7 +2371,7 @@ isa = PBXGroup; children = ( 8D15AC370486D014006FF6A4 /* Sequel Pro.app */, - 380F4ED90FC0B50500B0BFD7 /* Unit Tests.octest */, + 380F4ED90FC0B50500B0BFD7 /* Unit Tests.xctest */, 58CDB3360FCE13C900F8ACA3 /* SequelProTunnelAssistant */, 58B906E611BD989A000826E5 /* PSMTabBar.framework */, 58B9096111C3A42B000826E5 /* xibLocalizationPostprocessor */, @@ -2487,6 +2494,7 @@ isa = PBXGroup; children = ( 584D876815140D3500F24774 /* SPMySQL.framework */, + 29B70BD61C805B2A00D1BE0C /* SPMySQL Unit Tests.xctest */, ); name = Products; sourceTree = ""; @@ -2746,8 +2754,8 @@ ); name = "Unit Tests"; productName = "Unit Tests"; - productReference = 380F4ED90FC0B50500B0BFD7 /* Unit Tests.octest */; - productType = "com.apple.product-type.bundle.ocunit-test"; + productReference = 380F4ED90FC0B50500B0BFD7 /* Unit Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; }; 584754C1120A04560057631F /* Sequel Pro QLGenerator */ = { isa = PBXNativeTarget; @@ -2903,6 +2911,13 @@ remoteRef = 17E596A114F307CE0054EE08 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + 29B70BD61C805B2A00D1BE0C /* SPMySQL Unit Tests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "SPMySQL Unit Tests.xctest"; + remoteRef = 29B70BD51C805B2A00D1BE0C /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; 584D876815140D3500F24774 /* SPMySQL.framework */ = { isa = PBXReferenceProxy; fileType = wrapper.framework; @@ -3846,7 +3861,7 @@ COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ( "$(SRCROOT)/Frameworks", - "$(DEVELOPER_LIBRARY_DIR)/Frameworks", + "$(inherited)", ); GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; @@ -3861,13 +3876,9 @@ "-framework", Cocoa, "-framework", - SenTestingKit, - "-framework", OCMock, ); PRODUCT_NAME = "Unit Tests"; - TEST_AFTER_BUILD = YES; - WRAPPER_EXTENSION = octest; }; name = Debug; }; @@ -3879,7 +3890,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; FRAMEWORK_SEARCH_PATHS = ( "$(SRCROOT)/Frameworks", - "$(DEVELOPER_LIBRARY_DIR)/Frameworks", + "$(inherited)", ); GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_MODEL_TUNING = G5; @@ -3892,13 +3903,9 @@ "-framework", Cocoa, "-framework", - SenTestingKit, - "-framework", OCMock, ); PRODUCT_NAME = "Unit Tests"; - TEST_AFTER_BUILD = YES; - WRAPPER_EXTENSION = octest; }; name = Release; }; @@ -3909,7 +3916,7 @@ COMBINE_HIDPI_IMAGES = YES; FRAMEWORK_SEARCH_PATHS = ( "$(SRCROOT)/Frameworks", - "$(DEVELOPER_LIBRARY_DIR)/Frameworks", + "$(inherited)", ); GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_MODEL_TUNING = G5; @@ -3922,13 +3929,9 @@ "-framework", Foundation, "-framework", - SenTestingKit, - "-framework", OCMock, ); PRODUCT_NAME = "Unit Tests"; - TEST_AFTER_BUILD = YES; - WRAPPER_EXTENSION = octest; }; name = Distribution; }; diff --git a/sequel-pro.xcodeproj/xcshareddata/xcschemes/Sequel Pro (10.6 SDK).xcscheme b/sequel-pro.xcodeproj/xcshareddata/xcschemes/Sequel Pro (10.6 SDK).xcscheme index e6b89ad74..dd55da7e9 100644 --- a/sequel-pro.xcodeproj/xcshareddata/xcschemes/Sequel Pro (10.6 SDK).xcscheme +++ b/sequel-pro.xcodeproj/xcshareddata/xcschemes/Sequel Pro (10.6 SDK).xcscheme @@ -23,17 +23,17 @@ + shouldUseLaunchSchemeArgsEnv = "YES"> @@ -48,17 +48,21 @@ ReferencedContainer = "container:sequel-pro.xcodeproj"> + + - + - + + shouldUseLaunchSchemeArgsEnv = "YES"> @@ -57,15 +57,18 @@ ReferencedContainer = "container:sequel-pro.xcodeproj"> + + @@ -81,10 +84,10 @@ diff --git a/sequel-pro.xcodeproj/xcshareddata/xcschemes/Sequel Pro.xcscheme b/sequel-pro.xcodeproj/xcshareddata/xcschemes/Sequel Pro.xcscheme index 579336f67..a47905dbb 100644 --- a/sequel-pro.xcodeproj/xcshareddata/xcschemes/Sequel Pro.xcscheme +++ b/sequel-pro.xcodeproj/xcshareddata/xcschemes/Sequel Pro.xcscheme @@ -23,17 +23,17 @@ + shouldUseLaunchSchemeArgsEnv = "NO"> @@ -55,17 +55,21 @@ isEnabled = "YES"> + + - + - + Date: Fri, 26 Feb 2016 22:45:29 +1100 Subject: [PATCH 06/22] Fixed testCopyTableFromTo_NoPermissions test Fixing testCopyTableFromTo_NoPermissions not using the mockConnection. --- UnitTests/SPTableCopyTest.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/UnitTests/SPTableCopyTest.m b/UnitTests/SPTableCopyTest.m index 208017861..563322df8 100644 --- a/UnitTests/SPTableCopyTest.m +++ b/UnitTests/SPTableCopyTest.m @@ -88,8 +88,9 @@ - (void)testCopyTableFromTo_NoPermissions { SPTableCopy *tableCopy = [[SPTableCopy alloc] init]; + [tableCopy setConnection:mockConnection]; - XCTAssertFalse([tableCopy copyTable:@"table_name" from:@"source_db" to:@"target_db"],@"copy operation must fail."); + XCTAssertFalse([tableCopy copyTable:@"table_name" from:@"source_db" to:@"target_db"], @"copy operation must fail."); [tableCopy release]; } From 0f3ce372c0c777287f81f6db2f8431a4d32f1cd4 Mon Sep 17 00:00:00 2001 From: Marius Ursache Date: Sat, 27 Feb 2016 09:21:29 +1100 Subject: [PATCH 07/22] Revert "Fixed testCopyTableFromTo_NoPermissions test" This reverts commit 4d2ec773b833b06fd6925502eb4ac512b1274b86. --- UnitTests/SPTableCopyTest.m | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/UnitTests/SPTableCopyTest.m b/UnitTests/SPTableCopyTest.m index 563322df8..208017861 100644 --- a/UnitTests/SPTableCopyTest.m +++ b/UnitTests/SPTableCopyTest.m @@ -88,9 +88,8 @@ - (void)testCopyTableFromTo_NoPermissions { SPTableCopy *tableCopy = [[SPTableCopy alloc] init]; - [tableCopy setConnection:mockConnection]; - XCTAssertFalse([tableCopy copyTable:@"table_name" from:@"source_db" to:@"target_db"], @"copy operation must fail."); + XCTAssertFalse([tableCopy copyTable:@"table_name" from:@"source_db" to:@"target_db"],@"copy operation must fail."); [tableCopy release]; } From 5e0ebdade91f72ca614c67b58d2d7a8470441b2e Mon Sep 17 00:00:00 2001 From: Marius Ursache Date: Mon, 29 Feb 2016 10:41:07 +1100 Subject: [PATCH 08/22] Revert Xcode xcscheme shuffling --- .../xcshareddata/xcschemes/QueryKit.xcscheme | 8 ++++---- .../xcshareddata/xcschemes/Sequel Pro (10.6 SDK).xcscheme | 8 ++++---- .../xcschemes/Sequel Pro Release Build (10.6+).xcscheme | 8 ++++---- .../xcshareddata/xcschemes/Sequel Pro.xcscheme | 8 ++++---- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Frameworks/QueryKit/QueryKit.xcodeproj/xcshareddata/xcschemes/QueryKit.xcscheme b/Frameworks/QueryKit/QueryKit.xcodeproj/xcshareddata/xcschemes/QueryKit.xcscheme index 57ddcc569..365be9e59 100644 --- a/Frameworks/QueryKit/QueryKit.xcodeproj/xcshareddata/xcschemes/QueryKit.xcscheme +++ b/Frameworks/QueryKit/QueryKit.xcodeproj/xcshareddata/xcschemes/QueryKit.xcscheme @@ -23,10 +23,10 @@ + shouldUseLaunchSchemeArgsEnv = "YES" + buildConfiguration = "Debug"> @@ -43,11 +43,11 @@ + shouldUseLaunchSchemeArgsEnv = "YES" + buildConfiguration = "Debug"> @@ -52,11 +52,11 @@ diff --git a/sequel-pro.xcodeproj/xcshareddata/xcschemes/Sequel Pro Release Build (10.6+).xcscheme b/sequel-pro.xcodeproj/xcshareddata/xcschemes/Sequel Pro Release Build (10.6+).xcscheme index 5496673e6..2492f3200 100644 --- a/sequel-pro.xcodeproj/xcshareddata/xcschemes/Sequel Pro Release Build (10.6+).xcscheme +++ b/sequel-pro.xcodeproj/xcshareddata/xcschemes/Sequel Pro Release Build (10.6+).xcscheme @@ -32,10 +32,10 @@ + shouldUseLaunchSchemeArgsEnv = "YES" + buildConfiguration = "Debug"> @@ -61,11 +61,11 @@ diff --git a/sequel-pro.xcodeproj/xcshareddata/xcschemes/Sequel Pro.xcscheme b/sequel-pro.xcodeproj/xcshareddata/xcschemes/Sequel Pro.xcscheme index a47905dbb..34c76c45c 100644 --- a/sequel-pro.xcodeproj/xcshareddata/xcschemes/Sequel Pro.xcscheme +++ b/sequel-pro.xcodeproj/xcshareddata/xcschemes/Sequel Pro.xcscheme @@ -23,10 +23,10 @@ + shouldUseLaunchSchemeArgsEnv = "NO" + buildConfiguration = "Debug"> @@ -59,11 +59,11 @@ From 65319342f02d10ffee5cdcb02e554edf796089ef Mon Sep 17 00:00:00 2001 From: Marius Ursache Date: Mon, 29 Feb 2016 10:42:21 +1100 Subject: [PATCH 09/22] Reapply "Fixed testCopyTableFromTo_NoPermissions test" This reverts commit 0f3ce372c0c777287f81f6db2f8431a4d32f1cd4. --- UnitTests/SPTableCopyTest.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/UnitTests/SPTableCopyTest.m b/UnitTests/SPTableCopyTest.m index 208017861..563322df8 100644 --- a/UnitTests/SPTableCopyTest.m +++ b/UnitTests/SPTableCopyTest.m @@ -88,8 +88,9 @@ - (void)testCopyTableFromTo_NoPermissions { SPTableCopy *tableCopy = [[SPTableCopy alloc] init]; + [tableCopy setConnection:mockConnection]; - XCTAssertFalse([tableCopy copyTable:@"table_name" from:@"source_db" to:@"target_db"],@"copy operation must fail."); + XCTAssertFalse([tableCopy copyTable:@"table_name" from:@"source_db" to:@"target_db"], @"copy operation must fail."); [tableCopy release]; } From 1a9c39929f7c8a7102f54a31a8b7875482845240 Mon Sep 17 00:00:00 2001 From: Marius Ursache Date: Mon, 29 Feb 2016 10:53:25 +1100 Subject: [PATCH 10/22] Updated test to use NSEqualRanges Previous tests where using NSValue wrapping for NSRange 'XCTAssertTrue result. --- UnitTests/SPDataAdditionsTests.m | 37 +++++++++----------------------- 1 file changed, 10 insertions(+), 27 deletions(-) diff --git a/UnitTests/SPDataAdditionsTests.m b/UnitTests/SPDataAdditionsTests.m index a7620edd0..4769e4996 100644 --- a/UnitTests/SPDataAdditionsTests.m +++ b/UnitTests/SPDataAdditionsTests.m @@ -296,19 +296,15 @@ - (void)testEnumerateLinesBreakingAt_withBlock //simple unix file { const char inp[] = "Two\nLines\n"; - NSValue *line1 = [NSValue valueWithRange:NSMakeRange(0, 3)]; - NSValue *line2 = [NSValue valueWithRange:NSMakeRange(4, 5)]; - __block NSUInteger invocations = 0; NSData *data = [NSData dataWithBytes:inp length:strlen(inp)]; [data enumerateLinesBreakingAt:SPLineTerminatorAny withBlock:^(NSRange line, BOOL *stop) { - NSValue *lineValue = [NSValue valueWithRange:line]; switch (invocations) { case 0: - XCTAssertTrue([lineValue isEqualToValue:line1], @"range of first line"); + XCTAssertTrue(NSEqualRanges(line, NSMakeRange(0, 3)), @"range of first line"); break; case 1: - XCTAssertTrue([lineValue isEqualToValue:line2], @"range of second line"); + XCTAssertTrue(NSEqualRanges(line, NSMakeRange(4, 5)), @"range of second line"); break; } invocations++; @@ -318,22 +314,18 @@ - (void)testEnumerateLinesBreakingAt_withBlock //simple windows file without ending empty line { const char inp[] = "A\r\nWindows\r\nfile"; - NSValue *line1 = [NSValue valueWithRange:NSMakeRange(0, 1)]; - NSValue *line2 = [NSValue valueWithRange:NSMakeRange(3, 7)]; - NSValue *line3 = [NSValue valueWithRange:NSMakeRange(12, 4)]; __block NSUInteger invocations = 0; NSData *data = [NSData dataWithBytes:inp length:strlen(inp)]; [data enumerateLinesBreakingAt:SPLineTerminatorAny withBlock:^(NSRange line, BOOL *stop) { - NSValue *lineValue = [NSValue valueWithRange:line]; switch (invocations) { case 0: - XCTAssertTrue([lineValue isEqualToValue:line1], @"range of first line"); + XCTAssertTrue(NSEqualRanges(line, NSMakeRange(0, 1)), @"range of first line"); break; case 1: - XCTAssertTrue([lineValue isEqualToValue:line2], @"range of second line"); + XCTAssertTrue(NSEqualRanges(line, NSMakeRange(3, 7)), @"range of second line"); break; case 2: - XCTAssertTrue([lineValue isEqualToValue:line3], @"range of third line"); + XCTAssertTrue(NSEqualRanges(line, NSMakeRange(12, 4)), @"range of third line"); break; } invocations++; @@ -343,23 +335,18 @@ - (void)testEnumerateLinesBreakingAt_withBlock //empty lines with all 3 endings { const char inp[] = "\n\r\n\r"; - NSValue *line1 = [NSValue valueWithRange:NSMakeRange(0, 0)]; - NSValue *line2 = [NSValue valueWithRange:NSMakeRange(1, 0)]; - NSValue *line3 = [NSValue valueWithRange:NSMakeRange(3, 0)]; - __block NSUInteger invocations = 0; NSData *data = [NSData dataWithBytes:inp length:strlen(inp)]; [data enumerateLinesBreakingAt:SPLineTerminatorAny withBlock:^(NSRange line, BOOL *stop) { - NSValue *lineValue = [NSValue valueWithRange:line]; switch (invocations) { case 0: - XCTAssertTrue([lineValue isEqualToValue:line1], @"range of first line"); + XCTAssertTrue(NSEqualRanges(line, NSMakeRange(0, 0)), @"range of first line"); break; case 1: - XCTAssertTrue([lineValue isEqualToValue:line2], @"range of second line"); + XCTAssertTrue(NSEqualRanges(line, NSMakeRange(1, 0)), @"range of second line"); break; case 2: - XCTAssertTrue([lineValue isEqualToValue:line3], @"range of third line"); + XCTAssertTrue(NSEqualRanges(line, NSMakeRange(3, 0)), @"range of third line"); break; } invocations++; @@ -369,19 +356,15 @@ - (void)testEnumerateLinesBreakingAt_withBlock //looking for specific line breaks only { const char inp[] = "foo\nbar\r\nbaz\r"; - NSValue *line1 = [NSValue valueWithRange:NSMakeRange(0, 7)]; - NSValue *line2 = [NSValue valueWithRange:NSMakeRange(9, 4)]; - __block NSUInteger invocations = 0; NSData *data = [NSData dataWithBytes:inp length:strlen(inp)]; [data enumerateLinesBreakingAt:SPLineTerminatorCRLF withBlock:^(NSRange line, BOOL *stop) { - NSValue *lineValue = [NSValue valueWithRange:line]; switch (invocations) { case 0: - XCTAssertTrue([lineValue isEqualToValue:line1], @"range of first line"); + XCTAssertTrue(NSEqualRanges(line, NSMakeRange(0, 7)), @"range of first line"); break; case 1: - XCTAssertTrue([lineValue isEqualToValue:line2], @"range of second line"); + XCTAssertTrue(NSEqualRanges(line, NSMakeRange(9, 4)), @"range of second line"); break; } invocations++; From 7e9ba2cf6f42ef7d2e0dca07382b090a78e3c7c3 Mon Sep 17 00:00:00 2001 From: Marius Ursache Date: Mon, 29 Feb 2016 21:39:49 +1100 Subject: [PATCH 11/22] Fixed fabs compiler warnings --- Source/SPComboPopupButton.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/SPComboPopupButton.m b/Source/SPComboPopupButton.m index 8c090911a..3df3d6ec8 100644 --- a/Source/SPComboPopupButton.m +++ b/Source/SPComboPopupButton.m @@ -129,9 +129,9 @@ - (void)drawRect:(NSRect)dirtyRect CGContextSaveGState(context); CGContextSetStrokeColor(context, lineColorParts); - CGContextAddRect(context, CGRectMake(boundingLinePosition - 0.5, boundsRect.origin.y + heightIndent, 1.f, boundsRect.size.height - abs(2 * heightIndent))); + CGContextAddRect(context, CGRectMake(boundingLinePosition - 0.5, boundsRect.origin.y + heightIndent, 1.f, boundsRect.size.height - fabs(2 * heightIndent))); CGContextClip(context); - CGContextDrawLinearGradient(context, lineGradient, CGPointMake(boundingLinePosition - 0.5, boundsRect.origin.y + heightIndent), CGPointMake(boundingLinePosition - 0.5, boundsRect.origin.y + boundsRect.size.height - abs(heightIndent)), 0); + CGContextDrawLinearGradient(context, lineGradient, CGPointMake(boundingLinePosition - 0.5, boundsRect.origin.y + heightIndent), CGPointMake(boundingLinePosition - 0.5, boundsRect.origin.y + boundsRect.size.height - fabs(heightIndent)), 0); CGContextRestoreGState(context); CGGradientRelease(lineGradient); @@ -281,7 +281,7 @@ - (BOOL)trackMouse:(NSEvent *)theEvent inRect:(NSRect)cellFrame ofView:(NSView * // Custom tracking to be performed - indent the vertical button area slightly - activeRect = NSMakeRect(cellFrame.origin.x, cellFrame.origin.y + heightIndent, cellFrame.size.width - [(SPComboPopupButton *)controlView lineOffset] + 1, cellFrame.size.height - fabsf(2 * heightIndent)); + activeRect = NSMakeRect(cellFrame.origin.x, cellFrame.origin.y + heightIndent, cellFrame.size.width - [(SPComboPopupButton *)controlView lineOffset] + 1, cellFrame.size.height - fabs(2 * heightIndent)); // Continue tracking the mouse while it's down, updating the state as it enters and leaves the cell, // until it is released; if still within the cell, perform a click. From 9eb7efd01442d36f543e3056cdf060ffb35202c2 Mon Sep 17 00:00:00 2001 From: Marius Ursache Date: Mon, 29 Feb 2016 21:51:25 +1100 Subject: [PATCH 12/22] Updated project specs, per Xcode 7 suggestions --- .../QueryKit.xcodeproj/project.pbxproj | 23 +++++++++++++++---- .../xcshareddata/xcschemes/QueryKit.xcscheme | 2 +- Frameworks/QueryKit/Resources/Info.plist | 2 +- .../QueryKit/Resources/Tests-Info.plist | 2 +- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/Frameworks/QueryKit/QueryKit.xcodeproj/project.pbxproj b/Frameworks/QueryKit/QueryKit.xcodeproj/project.pbxproj index 62059d077..f81e4a45c 100644 --- a/Frameworks/QueryKit/QueryKit.xcodeproj/project.pbxproj +++ b/Frameworks/QueryKit/QueryKit.xcodeproj/project.pbxproj @@ -330,7 +330,7 @@ name = Tests; productName = Tests; productReference = 17E5969E14F307CE0054EE08 /* Tests.octest */; - productType = "com.apple.product-type.bundle"; + productType = "com.apple.product-type.bundle.ocunit-test"; }; 8DC2EF4F0486A6940098B216 /* QueryKit */ = { isa = PBXNativeTarget; @@ -357,7 +357,7 @@ 0867D690FE84028FC02AAC07 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0510; + LastUpgradeCheck = 0720; }; buildConfigurationList = 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "QueryKit" */; compatibilityVersion = "Xcode 3.2"; @@ -436,7 +436,6 @@ 17E5952D14F302740054EE08 /* Distribution */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; CLANG_LINK_OBJC_RUNTIME = NO; CLANG_STATIC_ANALYZER_MODE = deep; CLANG_WARN_BOOL_CONVERSION = YES; @@ -444,8 +443,11 @@ CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Source/QueryKit-Prefix.pch"; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; @@ -498,6 +500,7 @@ GCC_WARN_UNUSED_VALUE = YES; INFOPLIST_FILE = Resources/Info.plist; INSTALL_PATH = "@executable_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.sequelpro.querykit; PRODUCT_NAME = QueryKit; SKIP_INSTALL = YES; WARNING_CFLAGS = "-Wmost"; @@ -526,6 +529,7 @@ "-framework", SenTestingKit, ); + PRODUCT_BUNDLE_IDENTIFIER = com.sequelpro.querykit.tests; PRODUCT_NAME = Tests; TEST_AFTER_BUILD = YES; WRAPPER_EXTENSION = octest; @@ -552,6 +556,7 @@ "-framework", SenTestingKit, ); + PRODUCT_BUNDLE_IDENTIFIER = com.sequelpro.querykit.tests; PRODUCT_NAME = Tests; TEST_AFTER_BUILD = YES; WRAPPER_EXTENSION = octest; @@ -577,6 +582,7 @@ "-framework", SenTestingKit, ); + PRODUCT_BUNDLE_IDENTIFIER = com.sequelpro.querykit.tests; PRODUCT_NAME = Tests; TEST_AFTER_BUILD = YES; WRAPPER_EXTENSION = octest; @@ -623,6 +629,7 @@ GENERATE_PKGINFO_FILE = YES; INFOPLIST_FILE = Resources/Info.plist; INSTALL_PATH = "@executable_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.sequelpro.querykit; PRODUCT_NAME = QueryKit; SKIP_INSTALL = YES; WARNING_CFLAGS = "-Wmost"; @@ -666,6 +673,7 @@ GCC_WARN_UNUSED_VALUE = YES; INFOPLIST_FILE = Resources/Info.plist; INSTALL_PATH = "@executable_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.sequelpro.querykit; PRODUCT_NAME = QueryKit; SKIP_INSTALL = YES; WARNING_CFLAGS = "-Wmost"; @@ -676,7 +684,6 @@ 1DEB91B208733DA50010E9CD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; CLANG_LINK_OBJC_RUNTIME = NO; CLANG_STATIC_ANALYZER_MODE = deep; CLANG_WARN_BOOL_CONVERSION = YES; @@ -684,8 +691,12 @@ CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Source/QueryKit-Prefix.pch"; @@ -707,7 +718,6 @@ 1DEB91B308733DA50010E9CD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; CLANG_LINK_OBJC_RUNTIME = NO; CLANG_STATIC_ANALYZER_MODE = deep; CLANG_WARN_BOOL_CONVERSION = YES; @@ -715,8 +725,11 @@ CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Source/QueryKit-Prefix.pch"; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; diff --git a/Frameworks/QueryKit/QueryKit.xcodeproj/xcshareddata/xcschemes/QueryKit.xcscheme b/Frameworks/QueryKit/QueryKit.xcodeproj/xcshareddata/xcschemes/QueryKit.xcscheme index 365be9e59..bbe02bce6 100644 --- a/Frameworks/QueryKit/QueryKit.xcodeproj/xcshareddata/xcschemes/QueryKit.xcscheme +++ b/Frameworks/QueryKit/QueryKit.xcodeproj/xcshareddata/xcschemes/QueryKit.xcscheme @@ -1,6 +1,6 @@ CFBundleExecutable QueryKit CFBundleIdentifier - com.sequelpro.querykit + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType diff --git a/Frameworks/QueryKit/Resources/Tests-Info.plist b/Frameworks/QueryKit/Resources/Tests-Info.plist index add26ae73..ddbc4bf77 100644 --- a/Frameworks/QueryKit/Resources/Tests-Info.plist +++ b/Frameworks/QueryKit/Resources/Tests-Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable Tests CFBundleIdentifier - com.sequelpro.querykit.tests + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType From 16831b8eb9e1947deb82118411acf0b8fd9862c8 Mon Sep 17 00:00:00 2001 From: Marius Ursache Date: Mon, 29 Feb 2016 21:55:05 +1100 Subject: [PATCH 13/22] Converted QueryKit tests from SenTestingKit to XCTest --- .../QueryKit.xcodeproj/project.pbxproj | 26 +++++-------------- .../xcshareddata/xcschemes/QueryKit.xcscheme | 2 +- .../QueryKit/Tests/QKDeleteQueryTests.h | 4 +-- .../QueryKit/Tests/QKDeleteQueryTests.m | 16 ++++++------ Frameworks/QueryKit/Tests/QKQueryTests.m | 24 ++++++++--------- .../Tests/QKSelectQueryGroupByTests.h | 4 +-- .../Tests/QKSelectQueryGroupByTests.m | 12 ++++----- .../Tests/QKSelectQueryOrderByTests.h | 4 +-- .../Tests/QKSelectQueryOrderByTests.m | 16 ++++++------ .../QueryKit/Tests/QKSelectQueryTests.h | 4 +-- .../QueryKit/Tests/QKSelectQueryTests.m | 16 ++++++------ Frameworks/QueryKit/Tests/QKTestCase.h | 4 +-- .../QueryKit/Tests/QKUpdateQueryTests.h | 4 +-- .../QueryKit/Tests/QKUpdateQueryTests.m | 14 +++++----- 14 files changed, 69 insertions(+), 81 deletions(-) diff --git a/Frameworks/QueryKit/QueryKit.xcodeproj/project.pbxproj b/Frameworks/QueryKit/QueryKit.xcodeproj/project.pbxproj index f81e4a45c..4d1c2ef72 100644 --- a/Frameworks/QueryKit/QueryKit.xcodeproj/project.pbxproj +++ b/Frameworks/QueryKit/QueryKit.xcodeproj/project.pbxproj @@ -87,7 +87,7 @@ 17E5951E14F301DF0054EE08 /* QueryKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QueryKit.h; sourceTree = ""; }; 17E595F114F3058F0054EE08 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 17E5969814F307B70054EE08 /* QKSelectQueryTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QKSelectQueryTests.m; sourceTree = ""; }; - 17E5969E14F307CE0054EE08 /* Tests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; + 17E5969E14F307CE0054EE08 /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 17E5969F14F307CE0054EE08 /* Tests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Tests-Info.plist"; path = "Resources/Tests-Info.plist"; sourceTree = ""; }; 17F48BA615B27F6400C6455B /* QKQueryOrderBy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QKQueryOrderBy.h; sourceTree = ""; }; 17F48BA715B27F6400C6455B /* QKQueryOrderBy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QKQueryOrderBy.m; sourceTree = ""; }; @@ -123,7 +123,7 @@ isa = PBXGroup; children = ( 8DC2EF5B0486A6940098B216 /* QueryKit.framework */, - 17E5969E14F307CE0054EE08 /* Tests.octest */, + 17E5969E14F307CE0054EE08 /* Tests.xctest */, ); name = Products; sourceTree = ""; @@ -329,8 +329,8 @@ ); name = Tests; productName = Tests; - productReference = 17E5969E14F307CE0054EE08 /* Tests.octest */; - productType = "com.apple.product-type.bundle.ocunit-test"; + productReference = 17E5969E14F307CE0054EE08 /* Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; }; 8DC2EF4F0486A6940098B216 /* QueryKit */ = { isa = PBXNativeTarget; @@ -514,7 +514,7 @@ ALWAYS_SEARCH_USER_PATHS = NO; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; - FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks"; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_MODEL_TUNING = G5; @@ -526,13 +526,9 @@ OTHER_LDFLAGS = ( "-framework", Cocoa, - "-framework", - SenTestingKit, ); PRODUCT_BUNDLE_IDENTIFIER = com.sequelpro.querykit.tests; PRODUCT_NAME = Tests; - TEST_AFTER_BUILD = YES; - WRAPPER_EXTENSION = octest; }; name = Debug; }; @@ -543,7 +539,7 @@ COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks"; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; @@ -553,13 +549,9 @@ OTHER_LDFLAGS = ( "-framework", Cocoa, - "-framework", - SenTestingKit, ); PRODUCT_BUNDLE_IDENTIFIER = com.sequelpro.querykit.tests; PRODUCT_NAME = Tests; - TEST_AFTER_BUILD = YES; - WRAPPER_EXTENSION = octest; ZERO_LINK = NO; }; name = Release; @@ -569,7 +561,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks"; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; @@ -579,13 +571,9 @@ OTHER_LDFLAGS = ( "-framework", Cocoa, - "-framework", - SenTestingKit, ); PRODUCT_BUNDLE_IDENTIFIER = com.sequelpro.querykit.tests; PRODUCT_NAME = Tests; - TEST_AFTER_BUILD = YES; - WRAPPER_EXTENSION = octest; }; name = Distribution; }; diff --git a/Frameworks/QueryKit/QueryKit.xcodeproj/xcshareddata/xcschemes/QueryKit.xcscheme b/Frameworks/QueryKit/QueryKit.xcodeproj/xcshareddata/xcschemes/QueryKit.xcscheme index bbe02bce6..b5c97922d 100644 --- a/Frameworks/QueryKit/QueryKit.xcodeproj/xcshareddata/xcschemes/QueryKit.xcscheme +++ b/Frameworks/QueryKit/QueryKit.xcodeproj/xcshareddata/xcschemes/QueryKit.xcscheme @@ -33,7 +33,7 @@ diff --git a/Frameworks/QueryKit/Tests/QKDeleteQueryTests.h b/Frameworks/QueryKit/Tests/QKDeleteQueryTests.h index ef0e26ca0..379fdaf4a 100644 --- a/Frameworks/QueryKit/Tests/QKDeleteQueryTests.h +++ b/Frameworks/QueryKit/Tests/QKDeleteQueryTests.h @@ -29,10 +29,10 @@ #import "QKTestCase.h" #import -#import +#import @interface QKDeleteQueryTests : QKTestCase -+ (void)addTestForDatabase:(QKQueryDatabase)database withIdentifierQuote:(NSString *)quote toTestSuite:(SenTestSuite *)testSuite; ++ (void)addTestForDatabase:(QKQueryDatabase)database withIdentifierQuote:(NSString *)quote toTestSuite:(XCTestSuite *)testSuite; @end diff --git a/Frameworks/QueryKit/Tests/QKDeleteQueryTests.m b/Frameworks/QueryKit/Tests/QKDeleteQueryTests.m index 438f45dd7..8862fee5f 100644 --- a/Frameworks/QueryKit/Tests/QKDeleteQueryTests.m +++ b/Frameworks/QueryKit/Tests/QKDeleteQueryTests.m @@ -36,7 +36,7 @@ @implementation QKDeleteQueryTests + (id)defaultTestSuite { - SenTestSuite *testSuite = [[SenTestSuite alloc] initWithName:NSStringFromClass(self)]; + XCTestSuite *testSuite = [[XCTestSuite alloc] initWithName:NSStringFromClass(self)]; [self addTestForDatabase:QKDatabaseUnknown withIdentifierQuote:EMPTY_STRING toTestSuite:testSuite]; [self addTestForDatabase:QKDatabaseMySQL withIdentifierQuote:QKMySQLIdentifierQuote toTestSuite:testSuite]; @@ -45,11 +45,11 @@ + (id)defaultTestSuite return [testSuite autorelease]; } -+ (void)addTestForDatabase:(QKQueryDatabase)database withIdentifierQuote:(NSString *)quote toTestSuite:(SenTestSuite *)testSuite ++ (void)addTestForDatabase:(QKQueryDatabase)database withIdentifierQuote:(NSString *)quote toTestSuite:(XCTestSuite *)testSuite { for (NSInvocation *invocation in [self testInvocations]) { - SenTestCase *test = [[QKDeleteQueryTests alloc] initWithInvocation:invocation database:database identifierQuote:quote]; + XCTestCase *test = [[QKDeleteQueryTests alloc] initWithInvocation:invocation database:database identifierQuote:quote]; [testSuite addTest:test]; @@ -77,14 +77,14 @@ - (void)setUp - (void)testDeleteQueryTypeIsCorrect { - STAssertTrue([[[self query] query] hasPrefix:@"DELETE"], nil); + XCTAssertTrue([[[self query] query] hasPrefix:@"DELETE"]); } - (void)testDeleteQueryFromTableIsCorrect { NSString *query = [NSString stringWithFormat:@"DELETE FROM %1$@%2$@%1$@", [self identifierQuote], QKTestTableName]; - STAssertTrue([[[self query] query] isEqualToString:query], nil); + XCTAssertTrue([[[self query] query] isEqualToString:query]); } - (void)testDeleteQueryFromDatabaseTableIsCorrect @@ -93,7 +93,7 @@ - (void)testDeleteQueryFromDatabaseTableIsCorrect NSString *query = [NSString stringWithFormat:@"DELETE FROM %1$@%2$@%1$@.%1$@%3$@%1$@", [self identifierQuote], QKTestDatabaseName, QKTestTableName]; - STAssertTrue([[[self query] query] isEqualToString:query] , nil); + XCTAssertTrue([[[self query] query] isEqualToString:query] ); } - (void)testDeleteQueryWithSingleConstraintIsCorrect @@ -102,7 +102,7 @@ - (void)testDeleteQueryWithSingleConstraintIsCorrect NSString *query = [NSString stringWithFormat:@"DELETE FROM %1$@%2$@%1$@ WHERE %1$@%3$@%1$@ %4$@ %5$@", [self identifierQuote], QKTestTableName, QKTestFieldOne, [QKQueryUtilities stringRepresentationOfQueryOperator:QKEqualityOperator], [NSNumber numberWithUnsignedInteger:QKTestParameterOne]]; - STAssertTrue([[[self query] query] isEqualToString:query] , nil); + XCTAssertTrue([[[self query] query] isEqualToString:query] ); } - (void)testDeleteQueryWithMultipleConstraintsIsCorrect @@ -115,7 +115,7 @@ - (void)testDeleteQueryWithMultipleConstraintsIsCorrect NSString *query = [NSString stringWithFormat:@"DELETE FROM %1$@%2$@%1$@ WHERE %1$@%3$@%1$@ %4$@ %5$@ AND %1$@%6$@%1$@ %7$@ '%8$@'", [self identifierQuote], QKTestTableName, QKTestFieldOne, opOne, [NSNumber numberWithUnsignedInteger:QKTestParameterOne], QKTestFieldTwo, opTwo, QKTestParameterTwo]; - STAssertTrue([[[self query] query] isEqualToString:query] , nil); + XCTAssertTrue([[[self query] query] isEqualToString:query] ); } @end diff --git a/Frameworks/QueryKit/Tests/QKQueryTests.m b/Frameworks/QueryKit/Tests/QKQueryTests.m index 0043e6078..2064fad63 100644 --- a/Frameworks/QueryKit/Tests/QKQueryTests.m +++ b/Frameworks/QueryKit/Tests/QKQueryTests.m @@ -30,7 +30,7 @@ #import "QKTestCase.h" #import -#import +#import @interface QKQueryTests : QKTestCase @end @@ -68,19 +68,19 @@ - (void)testCallingClearOnAQueryCorretlyResetsItToItsDefaultState { [[self query] clear]; - STAssertNil([[self query] table], @"query table"); - STAssertNil([[self query] database], @"query database"); + XCTAssertNil([[self query] table], @"query table"); + XCTAssertNil([[self query] database], @"query database"); - STAssertTrue([[self query] useQuotedIdentifiers], @"query use quoted identifiers"); - STAssertTrue([[[self query] identifierQuote] isEqualToString:EMPTY_STRING], @"query identifier quote"); - STAssertTrue([[[self query] fields] count] == 0, @"query fields"); - STAssertTrue([[[self query] parameters] count] == 0, @"query parameters"); - STAssertTrue([[[self query] updateParameters] count] == 0, @"query update parameters"); - STAssertTrue([[[self query] groupByFields] count] == 0, @"query group by fields"); - STAssertTrue([[[self query] orderByFields] count] == 0, @"query order by fields"); + XCTAssertTrue([[self query] useQuotedIdentifiers], @"query use quoted identifiers"); + XCTAssertTrue([[[self query] identifierQuote] isEqualToString:EMPTY_STRING], @"query identifier quote"); + XCTAssertTrue([[[self query] fields] count] == 0, @"query fields"); + XCTAssertTrue([[[self query] parameters] count] == 0, @"query parameters"); + XCTAssertTrue([[[self query] updateParameters] count] == 0, @"query update parameters"); + XCTAssertTrue([[[self query] groupByFields] count] == 0, @"query group by fields"); + XCTAssertTrue([[[self query] orderByFields] count] == 0, @"query order by fields"); - STAssertEquals([[self query] queryType], QKUnknownQuery, @"query type"); - STAssertEquals([[self query] queryDatabase], QKDatabaseUnknown, @"query database"); + XCTAssertEqual([[self query] queryType], QKUnknownQuery, @"query type"); + XCTAssertEqual([[self query] queryDatabase], QKDatabaseUnknown, @"query database"); } @end diff --git a/Frameworks/QueryKit/Tests/QKSelectQueryGroupByTests.h b/Frameworks/QueryKit/Tests/QKSelectQueryGroupByTests.h index 9a1349d8e..f7966a665 100644 --- a/Frameworks/QueryKit/Tests/QKSelectQueryGroupByTests.h +++ b/Frameworks/QueryKit/Tests/QKSelectQueryGroupByTests.h @@ -29,10 +29,10 @@ #import "QKTestCase.h" #import -#import +#import @interface QKSelectQueryGroupByTests : QKTestCase -+ (void)addTestForDatabase:(QKQueryDatabase)database withIdentifierQuote:(NSString *)quote toTestSuite:(SenTestSuite *)testSuite; ++ (void)addTestForDatabase:(QKQueryDatabase)database withIdentifierQuote:(NSString *)quote toTestSuite:(XCTestSuite *)testSuite; @end diff --git a/Frameworks/QueryKit/Tests/QKSelectQueryGroupByTests.m b/Frameworks/QueryKit/Tests/QKSelectQueryGroupByTests.m index d8e627bc9..76aa1a808 100644 --- a/Frameworks/QueryKit/Tests/QKSelectQueryGroupByTests.m +++ b/Frameworks/QueryKit/Tests/QKSelectQueryGroupByTests.m @@ -36,7 +36,7 @@ @implementation QKSelectQueryGroupByTests + (id)defaultTestSuite { - SenTestSuite *testSuite = [[SenTestSuite alloc] initWithName:NSStringFromClass(self)]; + XCTestSuite *testSuite = [[XCTestSuite alloc] initWithName:NSStringFromClass(self)]; [self addTestForDatabase:QKDatabaseUnknown withIdentifierQuote:EMPTY_STRING toTestSuite:testSuite]; [self addTestForDatabase:QKDatabaseMySQL withIdentifierQuote:QKMySQLIdentifierQuote toTestSuite:testSuite]; @@ -45,11 +45,11 @@ + (id)defaultTestSuite return [testSuite autorelease]; } -+ (void)addTestForDatabase:(QKQueryDatabase)database withIdentifierQuote:(NSString *)quote toTestSuite:(SenTestSuite *)testSuite ++ (void)addTestForDatabase:(QKQueryDatabase)database withIdentifierQuote:(NSString *)quote toTestSuite:(XCTestSuite *)testSuite { for (NSInvocation *invocation in [self testInvocations]) { - SenTestCase *test = [[QKSelectQueryGroupByTests alloc] initWithInvocation:invocation database:database identifierQuote:quote]; + XCTestCase *test = [[QKSelectQueryGroupByTests alloc] initWithInvocation:invocation database:database identifierQuote:quote]; [testSuite addTest:test]; @@ -78,7 +78,7 @@ - (void)setUp - (void)testSelectQueryTypeIsCorrect { - STAssertTrue([[[self query] query] hasPrefix:@"SELECT"], nil); + XCTAssertTrue([[[self query] query] hasPrefix:@"SELECT"]); } - (void)testSelectQueryGroupByIsCorrect @@ -87,7 +87,7 @@ - (void)testSelectQueryGroupByIsCorrect NSString *query = [NSString stringWithFormat:@"GROUP BY %1$@%2$@%1$@", [self identifierQuote], QKTestFieldOne]; - STAssertTrue([[[self query] query] hasSuffix:query], nil); + XCTAssertTrue([[[self query] query] hasSuffix:query]); } - (void)testSelectQueryGroupByMultipleFieldsIsCorrect @@ -96,7 +96,7 @@ - (void)testSelectQueryGroupByMultipleFieldsIsCorrect NSString *query = [NSString stringWithFormat:@"GROUP BY %1$@%2$@%1$@, %1$@%3$@%1$@", [self identifierQuote], QKTestFieldOne, QKTestFieldTwo]; - STAssertTrue([[[self query] query] hasSuffix:query], nil); + XCTAssertTrue([[[self query] query] hasSuffix:query]); } @end diff --git a/Frameworks/QueryKit/Tests/QKSelectQueryOrderByTests.h b/Frameworks/QueryKit/Tests/QKSelectQueryOrderByTests.h index efd7eb2f7..ffca69294 100644 --- a/Frameworks/QueryKit/Tests/QKSelectQueryOrderByTests.h +++ b/Frameworks/QueryKit/Tests/QKSelectQueryOrderByTests.h @@ -29,10 +29,10 @@ #import "QKTestCase.h" #import -#import +#import @interface QKSelectQueryOrderByTests : QKTestCase -+ (void)addTestForDatabase:(QKQueryDatabase)database withIdentifierQuote:(NSString *)quote toTestSuite:(SenTestSuite *)testSuite; ++ (void)addTestForDatabase:(QKQueryDatabase)database withIdentifierQuote:(NSString *)quote toTestSuite:(XCTestSuite *)testSuite; @end diff --git a/Frameworks/QueryKit/Tests/QKSelectQueryOrderByTests.m b/Frameworks/QueryKit/Tests/QKSelectQueryOrderByTests.m index b6847d112..a1be1d0ce 100644 --- a/Frameworks/QueryKit/Tests/QKSelectQueryOrderByTests.m +++ b/Frameworks/QueryKit/Tests/QKSelectQueryOrderByTests.m @@ -36,7 +36,7 @@ @implementation QKSelectQueryOrderByTests + (id)defaultTestSuite { - SenTestSuite *testSuite = [[SenTestSuite alloc] initWithName:NSStringFromClass(self)]; + XCTestSuite *testSuite = [[XCTestSuite alloc] initWithName:NSStringFromClass(self)]; [self addTestForDatabase:QKDatabaseUnknown withIdentifierQuote:EMPTY_STRING toTestSuite:testSuite]; [self addTestForDatabase:QKDatabaseMySQL withIdentifierQuote:QKMySQLIdentifierQuote toTestSuite:testSuite]; @@ -45,11 +45,11 @@ + (id)defaultTestSuite return [testSuite autorelease]; } -+ (void)addTestForDatabase:(QKQueryDatabase)database withIdentifierQuote:(NSString *)quote toTestSuite:(SenTestSuite *)testSuite ++ (void)addTestForDatabase:(QKQueryDatabase)database withIdentifierQuote:(NSString *)quote toTestSuite:(XCTestSuite *)testSuite { for (NSInvocation *invocation in [self testInvocations]) { - SenTestCase *test = [[QKSelectQueryOrderByTests alloc] initWithInvocation:invocation database:database identifierQuote:quote]; + XCTestCase *test = [[QKSelectQueryOrderByTests alloc] initWithInvocation:invocation database:database identifierQuote:quote]; [testSuite addTest:test]; @@ -78,7 +78,7 @@ - (void)setUp - (void)testSelectQueryTypeIsCorrect { - STAssertTrue([[[self query] query] hasPrefix:@"SELECT"], nil); + XCTAssertTrue([[[self query] query] hasPrefix:@"SELECT"]); } - (void)testSelectQueryOrderByAscendingIsCorrect @@ -87,7 +87,7 @@ - (void)testSelectQueryOrderByAscendingIsCorrect NSString *query = [NSString stringWithFormat:@"ORDER BY %1$@%2$@%1$@ ASC", [self identifierQuote], QKTestFieldOne]; - STAssertTrue([[[self query] query] hasSuffix:query], nil); + XCTAssertTrue([[[self query] query] hasSuffix:query]); } - (void)testSelectQueryOrderByMultipleFieldsAscendingIsCorrect @@ -97,7 +97,7 @@ - (void)testSelectQueryOrderByMultipleFieldsAscendingIsCorrect NSString *query = [NSString stringWithFormat:@"ORDER BY %1$@%2$@%1$@ ASC, %1$@%3$@%1$@ ASC", [self identifierQuote], QKTestFieldOne, QKTestFieldTwo]; - STAssertTrue([[[self query] query] hasSuffix:query], nil); + XCTAssertTrue([[[self query] query] hasSuffix:query]); } - (void)testSelectQueryOrderByDescendingIsCorrect @@ -106,7 +106,7 @@ - (void)testSelectQueryOrderByDescendingIsCorrect NSString *query = [NSString stringWithFormat:@"ORDER BY %1$@%2$@%1$@ DESC", [self identifierQuote], QKTestFieldOne]; - STAssertTrue([[[self query] query] hasSuffix:query], nil); + XCTAssertTrue([[[self query] query] hasSuffix:query]); } - (void)testSelectQueryOrderByMultipleFieldsDescendingIsCorrect @@ -116,7 +116,7 @@ - (void)testSelectQueryOrderByMultipleFieldsDescendingIsCorrect NSString *query = [NSString stringWithFormat:@"ORDER BY %1$@%2$@%1$@ DESC, %1$@%3$@%1$@ DESC", [self identifierQuote], QKTestFieldOne, QKTestFieldTwo]; - STAssertTrue([[[self query] query] hasSuffix:query], nil); + XCTAssertTrue([[[self query] query] hasSuffix:query]); } @end diff --git a/Frameworks/QueryKit/Tests/QKSelectQueryTests.h b/Frameworks/QueryKit/Tests/QKSelectQueryTests.h index 5845ad061..43eda8062 100644 --- a/Frameworks/QueryKit/Tests/QKSelectQueryTests.h +++ b/Frameworks/QueryKit/Tests/QKSelectQueryTests.h @@ -29,10 +29,10 @@ #import "QKTestCase.h" #import -#import +#import @interface QKSelectQueryTests : QKTestCase -+ (void)addTestForDatabase:(QKQueryDatabase)database withIdentifierQuote:(NSString *)quote toTestSuite:(SenTestSuite *)testSuite; ++ (void)addTestForDatabase:(QKQueryDatabase)database withIdentifierQuote:(NSString *)quote toTestSuite:(XCTestSuite *)testSuite; @end diff --git a/Frameworks/QueryKit/Tests/QKSelectQueryTests.m b/Frameworks/QueryKit/Tests/QKSelectQueryTests.m index 0f1153c65..ec5328be5 100644 --- a/Frameworks/QueryKit/Tests/QKSelectQueryTests.m +++ b/Frameworks/QueryKit/Tests/QKSelectQueryTests.m @@ -36,7 +36,7 @@ @implementation QKSelectQueryTests + (id)defaultTestSuite { - SenTestSuite *testSuite = [[SenTestSuite alloc] initWithName:NSStringFromClass(self)]; + XCTestSuite *testSuite = [[XCTestSuite alloc] initWithName:NSStringFromClass(self)]; [self addTestForDatabase:QKDatabaseUnknown withIdentifierQuote:EMPTY_STRING toTestSuite:testSuite]; [self addTestForDatabase:QKDatabaseMySQL withIdentifierQuote:QKMySQLIdentifierQuote toTestSuite:testSuite]; @@ -45,11 +45,11 @@ + (id)defaultTestSuite return [testSuite autorelease]; } -+ (void)addTestForDatabase:(QKQueryDatabase)database withIdentifierQuote:(NSString *)quote toTestSuite:(SenTestSuite *)testSuite ++ (void)addTestForDatabase:(QKQueryDatabase)database withIdentifierQuote:(NSString *)quote toTestSuite:(XCTestSuite *)testSuite { for (NSInvocation *invocation in [self testInvocations]) { - SenTestCase *test = [[QKSelectQueryTests alloc] initWithInvocation:invocation database:database identifierQuote:quote]; + XCTestCase *test = [[QKSelectQueryTests alloc] initWithInvocation:invocation database:database identifierQuote:quote]; [testSuite addTest:test]; @@ -82,14 +82,14 @@ - (void)setUp - (void)testSelectQueryTypeIsCorrect { - STAssertTrue([[[self query] query] hasPrefix:@"SELECT"], nil); + XCTAssertTrue([[[self query] query] hasPrefix:@"SELECT"]); } - (void)testSelectQueryFieldIsCorrect { NSString *query = [NSString stringWithFormat:@"SELECT %1$@%2$@%1$@", [self identifierQuote], QKTestFieldOne]; - STAssertTrue([[[self query] query] hasPrefix:query], nil); + XCTAssertTrue([[[self query] query] hasPrefix:query]); } - (void)testSelectQueryFromDatabaseAndTableIsCorrect @@ -98,21 +98,21 @@ - (void)testSelectQueryFromDatabaseAndTableIsCorrect NSString *query = [NSString stringWithFormat:@"FROM %1$@%2$@%1$@.%1$@%3$@%1$@", [self identifierQuote], QKTestDatabaseName, QKTestTableName]; - STAssertTrue([[[self query] query] rangeOfString:query].location != NSNotFound, nil); + XCTAssertTrue([[[self query] query] rangeOfString:query].location != NSNotFound); } - (void)testSelectQueryMultipleFieldsAreCorrect { NSString *query = [NSString stringWithFormat:@"SELECT %1$@%2$@%1$@, %1$@%3$@%1$@, %1$@%4$@%1$@, %1$@%5$@%1$@", [self identifierQuote], QKTestFieldOne, QKTestFieldTwo, QKTestFieldThree, QKTestFieldFour]; - STAssertTrue([[[self query] query] hasPrefix:query], nil); + XCTAssertTrue([[[self query] query] hasPrefix:query]); } - (void)testSelectQueryConstraintsAreCorrect { NSString *query = [NSString stringWithFormat:@"WHERE %1$@%2$@%1$@ %3$@ %4$@", [self identifierQuote], QKTestFieldOne, [QKQueryUtilities stringRepresentationOfQueryOperator:QKEqualityOperator], [NSNumber numberWithUnsignedInteger:QKTestParameterOne]]; - STAssertTrue(([[[self query] query] rangeOfString:query].location != NSNotFound), nil); + XCTAssertTrue(([[[self query] query] rangeOfString:query].location != NSNotFound)); } @end diff --git a/Frameworks/QueryKit/Tests/QKTestCase.h b/Frameworks/QueryKit/Tests/QKTestCase.h index 47efec045..baa4f0508 100644 --- a/Frameworks/QueryKit/Tests/QKTestCase.h +++ b/Frameworks/QueryKit/Tests/QKTestCase.h @@ -27,9 +27,9 @@ // OTHER DEALINGS IN THE SOFTWARE. #import -#import +#import -@interface QKTestCase : SenTestCase +@interface QKTestCase : XCTestCase { @private QKQuery *_query; diff --git a/Frameworks/QueryKit/Tests/QKUpdateQueryTests.h b/Frameworks/QueryKit/Tests/QKUpdateQueryTests.h index aede8979a..7c3ea7c59 100644 --- a/Frameworks/QueryKit/Tests/QKUpdateQueryTests.h +++ b/Frameworks/QueryKit/Tests/QKUpdateQueryTests.h @@ -29,10 +29,10 @@ #import "QKTestCase.h" #import -#import +#import @interface QKUpdateQueryTests : QKTestCase -+ (void)addTestForDatabase:(QKQueryDatabase)database withIdentifierQuote:(NSString *)quote toTestSuite:(SenTestSuite *)testSuite; ++ (void)addTestForDatabase:(QKQueryDatabase)database withIdentifierQuote:(NSString *)quote toTestSuite:(XCTestSuite *)testSuite; @end diff --git a/Frameworks/QueryKit/Tests/QKUpdateQueryTests.m b/Frameworks/QueryKit/Tests/QKUpdateQueryTests.m index 1beff6d5f..039840bb7 100644 --- a/Frameworks/QueryKit/Tests/QKUpdateQueryTests.m +++ b/Frameworks/QueryKit/Tests/QKUpdateQueryTests.m @@ -36,7 +36,7 @@ @implementation QKUpdateQueryTests + (id)defaultTestSuite { - SenTestSuite *testSuite = [[SenTestSuite alloc] initWithName:NSStringFromClass(self)]; + XCTestSuite *testSuite = [[XCTestSuite alloc] initWithName:NSStringFromClass(self)]; [self addTestForDatabase:QKDatabaseUnknown withIdentifierQuote:EMPTY_STRING toTestSuite:testSuite]; [self addTestForDatabase:QKDatabaseMySQL withIdentifierQuote:QKMySQLIdentifierQuote toTestSuite:testSuite]; @@ -45,11 +45,11 @@ + (id)defaultTestSuite return [testSuite autorelease]; } -+ (void)addTestForDatabase:(QKQueryDatabase)database withIdentifierQuote:(NSString *)quote toTestSuite:(SenTestSuite *)testSuite ++ (void)addTestForDatabase:(QKQueryDatabase)database withIdentifierQuote:(NSString *)quote toTestSuite:(XCTestSuite *)testSuite { for (NSInvocation *invocation in [self testInvocations]) { - SenTestCase *test = [[NSClassFromString(@"QKUpdateQueryTests") alloc] initWithInvocation:invocation database:database identifierQuote:quote]; + XCTestCase *test = [[NSClassFromString(@"QKUpdateQueryTests") alloc] initWithInvocation:invocation database:database identifierQuote:quote]; [testSuite addTest:test]; @@ -81,7 +81,7 @@ - (void)setUp - (void)testUpdateQueryTypeIsCorrect { - STAssertTrue([[[self query] query] hasPrefix:@"UPDATE"], nil); + XCTAssertTrue([[[self query] query] hasPrefix:@"UPDATE"]); } - (void)testUpdateQueryUsingDatabaseAndTableIsCorrect @@ -90,21 +90,21 @@ - (void)testUpdateQueryUsingDatabaseAndTableIsCorrect NSString *query = [NSString stringWithFormat:@"UPDATE %1$@%2$@%1$@.%1$@%3$@%1$@", [self identifierQuote], QKTestDatabaseName, QKTestTableName]; - STAssertTrue([[[self query] query] hasPrefix:query], nil); + XCTAssertTrue([[[self query] query] hasPrefix:query]); } - (void)testUpdateQueryFieldsAreCorrect { NSString *query = [NSString stringWithFormat:@"UPDATE %1$@%2$@%1$@ SET %1$@%3$@%1$@ = '%4$@', %1$@%5$@%1$@ = '%6$@'", [self identifierQuote], QKTestTableName, QKTestFieldOne, QKTestUpdateValueOne, QKTestFieldTwo, QKTestUpdateValueTwo]; - STAssertTrue([[[self query] query] hasPrefix:query], nil); + XCTAssertTrue([[[self query] query] hasPrefix:query]); } - (void)testUpdateQueryConstraintIsCorrect { NSString *query = [NSString stringWithFormat:@"WHERE %1$@%2$@%1$@ %3$@ %4$@", [self identifierQuote], QKTestFieldOne, [QKQueryUtilities stringRepresentationOfQueryOperator:QKEqualityOperator], [NSNumber numberWithUnsignedInteger:QKTestParameterOne]]; - STAssertTrue(([[[self query] query] rangeOfString:query].location != NSNotFound), nil); + XCTAssertTrue(([[[self query] query] rangeOfString:query].location != NSNotFound)); } @end From 722a7a0438224fed3d9a711c211608503d956a2e Mon Sep 17 00:00:00 2001 From: Marius Ursache Date: Mon, 29 Feb 2016 21:59:39 +1100 Subject: [PATCH 14/22] Restored archs flag to build settings --- Frameworks/QueryKit/QueryKit.xcodeproj/project.pbxproj | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Frameworks/QueryKit/QueryKit.xcodeproj/project.pbxproj b/Frameworks/QueryKit/QueryKit.xcodeproj/project.pbxproj index 4d1c2ef72..52ef17743 100644 --- a/Frameworks/QueryKit/QueryKit.xcodeproj/project.pbxproj +++ b/Frameworks/QueryKit/QueryKit.xcodeproj/project.pbxproj @@ -436,6 +436,7 @@ 17E5952D14F302740054EE08 /* Distribution */ = { isa = XCBuildConfiguration; buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; CLANG_LINK_OBJC_RUNTIME = NO; CLANG_STATIC_ANALYZER_MODE = deep; CLANG_WARN_BOOL_CONVERSION = YES; @@ -672,6 +673,7 @@ 1DEB91B208733DA50010E9CD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; CLANG_LINK_OBJC_RUNTIME = NO; CLANG_STATIC_ANALYZER_MODE = deep; CLANG_WARN_BOOL_CONVERSION = YES; @@ -706,6 +708,7 @@ 1DEB91B308733DA50010E9CD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; CLANG_LINK_OBJC_RUNTIME = NO; CLANG_STATIC_ANALYZER_MODE = deep; CLANG_WARN_BOOL_CONVERSION = YES; From 5180b7290b052382145649d359de82b280b248f7 Mon Sep 17 00:00:00 2001 From: Marius Ursache Date: Mon, 29 Feb 2016 22:05:33 +1100 Subject: [PATCH 15/22] Updated SPMySQL Framework Settings --- Frameworks/SPMySQLFramework/Resources/Info.plist | 2 +- .../SPMySQLFramework/SPMySQL Unit Tests/Info.plist | 2 +- .../SPMySQLFramework.xcodeproj/project.pbxproj | 11 ++++++++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Frameworks/SPMySQLFramework/Resources/Info.plist b/Frameworks/SPMySQLFramework/Resources/Info.plist index 84b64d04e..0932b287a 100644 --- a/Frameworks/SPMySQLFramework/Resources/Info.plist +++ b/Frameworks/SPMySQLFramework/Resources/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable SPMySQL CFBundleIdentifier - com.sequelpro.spmysql + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType diff --git a/Frameworks/SPMySQLFramework/SPMySQL Unit Tests/Info.plist b/Frameworks/SPMySQLFramework/SPMySQL Unit Tests/Info.plist index 38544a849..ba72822e8 100644 --- a/Frameworks/SPMySQLFramework/SPMySQL Unit Tests/Info.plist +++ b/Frameworks/SPMySQLFramework/SPMySQL Unit Tests/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.sequelpro.spmysql-unittests + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/Frameworks/SPMySQLFramework/SPMySQLFramework.xcodeproj/project.pbxproj b/Frameworks/SPMySQLFramework/SPMySQLFramework.xcodeproj/project.pbxproj index 32dca24c2..778b97f96 100644 --- a/Frameworks/SPMySQLFramework/SPMySQLFramework.xcodeproj/project.pbxproj +++ b/Frameworks/SPMySQLFramework/SPMySQLFramework.xcodeproj/project.pbxproj @@ -500,7 +500,7 @@ 0867D690FE84028FC02AAC07 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0510; + LastUpgradeCheck = 0720; TargetAttributes = { 507FF1D41BC0D7D300104523 = { CreatedOnToolsVersion = 6.2; @@ -628,6 +628,7 @@ "$(inherited)", "\"$(SRCROOT)/MySQL Client Libraries/lib\"", ); + PRODUCT_BUNDLE_IDENTIFIER = com.sequelpro.spmysql; PRODUCT_NAME = SPMySQL; SKIP_INSTALL = YES; WRAPPER_EXTENSION = framework; @@ -652,6 +653,7 @@ "$(inherited)", "\"$(SRCROOT)/MySQL Client Libraries/lib\"", ); + PRODUCT_BUNDLE_IDENTIFIER = com.sequelpro.spmysql; PRODUCT_NAME = SPMySQL; SKIP_INSTALL = YES; WRAPPER_EXTENSION = framework; @@ -669,6 +671,7 @@ CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_OPTIMIZATION_LEVEL = 0; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -758,6 +761,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.9; MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.sequelpro.spmysql-unittests"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; @@ -788,6 +792,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.9; MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.sequelpro.spmysql-unittests"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; @@ -818,6 +823,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.9; MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.sequelpro.spmysql-unittests"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Distribution; @@ -880,6 +886,7 @@ "$(inherited)", "\"$(SRCROOT)/MySQL Client Libraries/lib\"", ); + PRODUCT_BUNDLE_IDENTIFIER = com.sequelpro.spmysql; PRODUCT_NAME = SPMySQL; SKIP_INSTALL = YES; WRAPPER_EXTENSION = framework; @@ -916,6 +923,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.9; MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.sequelpro.spmysql-unittests"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = "Unit Testing"; @@ -972,6 +980,7 @@ "$(inherited)", "\"$(SRCROOT)/MySQL Client Libraries/lib\"", ); + PRODUCT_BUNDLE_IDENTIFIER = com.sequelpro.spmysql; PRODUCT_NAME = SPMySQL; SKIP_INSTALL = YES; WRAPPER_EXTENSION = framework; From 8a4bc2f3a38da7cea67c4cc5e8bb85fa2c5c2d07 Mon Sep 17 00:00:00 2001 From: Marius Ursache Date: Mon, 29 Feb 2016 22:13:30 +1100 Subject: [PATCH 16/22] Added shared scheme for SPMySQL Framework --- .../xcschemes/SPMySQL.framework.xcscheme | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 Frameworks/SPMySQLFramework/SPMySQLFramework.xcodeproj/xcshareddata/xcschemes/SPMySQL.framework.xcscheme diff --git a/Frameworks/SPMySQLFramework/SPMySQLFramework.xcodeproj/xcshareddata/xcschemes/SPMySQL.framework.xcscheme b/Frameworks/SPMySQLFramework/SPMySQLFramework.xcodeproj/xcshareddata/xcschemes/SPMySQL.framework.xcscheme new file mode 100644 index 000000000..6b85f25bd --- /dev/null +++ b/Frameworks/SPMySQLFramework/SPMySQLFramework.xcodeproj/xcshareddata/xcschemes/SPMySQL.framework.xcscheme @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 7887ad6932b02ca149520b1624608504da3494bf Mon Sep 17 00:00:00 2001 From: Marius Ursache Date: Tue, 1 Mar 2016 10:45:24 +1100 Subject: [PATCH 17/22] Converted PostgresKit tests to XCTest --- .../PostgresKit.xcodeproj/project.pbxproj | 44 ++++++++++--------- .../xcschemes/PostgresKit.xcscheme | 16 ++++++- Frameworks/PostgresKit/Resources/Info.plist | 2 +- .../PostgresKit/Resources/Tests-Info.plist | 2 +- .../PostgresKit/Tests/PGDataTypeTests.h | 2 +- .../PostgresKit/Tests/PGDataTypeTests.m | 12 ++--- .../Tests/PGPostgresIntegrationTestCase.h | 4 +- .../Tests/PGPostgresIntegrationTestCase.m | 2 +- .../PostgresKit/Tests/PGPostgresResultTests.h | 2 +- .../PostgresKit/Tests/PGPostgresResultTests.m | 4 +- 10 files changed, 53 insertions(+), 37 deletions(-) diff --git a/Frameworks/PostgresKit/PostgresKit.xcodeproj/project.pbxproj b/Frameworks/PostgresKit/PostgresKit.xcodeproj/project.pbxproj index 479474da6..bf8e55458 100644 --- a/Frameworks/PostgresKit/PostgresKit.xcodeproj/project.pbxproj +++ b/Frameworks/PostgresKit/PostgresKit.xcodeproj/project.pbxproj @@ -81,7 +81,7 @@ 1724CA3B15F9EE7300AB2291 /* libpqtypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = libpqtypes.h; sourceTree = ""; }; 1724CC9015FB4CC200AB2291 /* PGPostgresTimeTZ.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PGPostgresTimeTZ.h; sourceTree = ""; }; 1724CC9115FB4CC200AB2291 /* PGPostgresTimeTZ.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PGPostgresTimeTZ.m; sourceTree = ""; }; - 1724CD0415FB68E800AB2291 /* Tests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; + 1724CD0415FB68E800AB2291 /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 1724CD0515FB68E800AB2291 /* Tests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Tests-Info.plist"; path = "Resources/Tests-Info.plist"; sourceTree = ""; }; 1724CD5715FB8A3300AB2291 /* PGPostgresTimeInterval.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PGPostgresTimeInterval.h; sourceTree = ""; }; 1724CD5815FB8A3300AB2291 /* PGPostgresTimeInterval.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PGPostgresTimeInterval.m; sourceTree = ""; }; @@ -167,7 +167,7 @@ isa = PBXGroup; children = ( 8DC2EF5B0486A6940098B216 /* PostgresKit.framework */, - 1724CD0415FB68E800AB2291 /* Tests.octest */, + 1724CD0415FB68E800AB2291 /* Tests.xctest */, ); name = Products; sourceTree = ""; @@ -460,8 +460,8 @@ ); name = Tests; productName = Tests; - productReference = 1724CD0415FB68E800AB2291 /* Tests.octest */; - productType = "com.apple.product-type.bundle"; + productReference = 1724CD0415FB68E800AB2291 /* Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; }; 8DC2EF4F0486A6940098B216 /* PostgresKit */ = { isa = PBXNativeTarget; @@ -487,7 +487,7 @@ 0867D690FE84028FC02AAC07 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0500; + LastUpgradeCheck = 0720; }; buildConfigurationList = 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "PostgresKit" */; compatibilityVersion = "Xcode 3.2"; @@ -565,7 +565,7 @@ CLANG_LINK_OBJC_RUNTIME = NO; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; - FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks"; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; @@ -576,12 +576,9 @@ OTHER_LDFLAGS = ( "-framework", Cocoa, - "-framework", - SenTestingKit, ); + PRODUCT_BUNDLE_IDENTIFIER = com.sequelpro.postgreskit.tests; PRODUCT_NAME = Tests; - TEST_AFTER_BUILD = YES; - WRAPPER_EXTENSION = octest; }; name = Debug; }; @@ -592,7 +589,7 @@ CLANG_LINK_OBJC_RUNTIME = NO; COMBINE_HIDPI_IMAGES = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks"; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; GCC_ENABLE_FIX_AND_CONTINUE = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; @@ -601,12 +598,9 @@ OTHER_LDFLAGS = ( "-framework", Cocoa, - "-framework", - SenTestingKit, ); + PRODUCT_BUNDLE_IDENTIFIER = com.sequelpro.postgreskit.tests; PRODUCT_NAME = Tests; - TEST_AFTER_BUILD = YES; - WRAPPER_EXTENSION = octest; ZERO_LINK = NO; }; name = Release; @@ -617,7 +611,7 @@ ALWAYS_SEARCH_USER_PATHS = NO; CLANG_LINK_OBJC_RUNTIME = NO; COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks"; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; GCC_ENABLE_FIX_AND_CONTINUE = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; @@ -626,12 +620,9 @@ OTHER_LDFLAGS = ( "-framework", Cocoa, - "-framework", - SenTestingKit, ); + PRODUCT_BUNDLE_IDENTIFIER = com.sequelpro.postgreskit.tests; PRODUCT_NAME = Tests; - TEST_AFTER_BUILD = YES; - WRAPPER_EXTENSION = octest; }; name = Distribution; }; @@ -645,8 +636,11 @@ CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Source/PostgresKit-Prefix.pch"; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; @@ -704,6 +698,7 @@ "$(inherited)", "\"$(SRCROOT)/Libs\"/**", ); + PRODUCT_BUNDLE_IDENTIFIER = com.sequelpro.postgreskit; PRODUCT_NAME = PostgresKit; WARNING_CFLAGS = "-Wmost"; WRAPPER_EXTENSION = framework; @@ -756,6 +751,7 @@ "$(inherited)", "\"$(SRCROOT)/Libs\"/**", ); + PRODUCT_BUNDLE_IDENTIFIER = com.sequelpro.postgreskit; PRODUCT_NAME = PostgresKit; WARNING_CFLAGS = "-Wmost"; WRAPPER_EXTENSION = framework; @@ -803,6 +799,7 @@ "$(inherited)", "\"$(SRCROOT)/Libs\"/**", ); + PRODUCT_BUNDLE_IDENTIFIER = com.sequelpro.postgreskit; PRODUCT_NAME = PostgresKit; WARNING_CFLAGS = "-Wmost"; WRAPPER_EXTENSION = framework; @@ -819,8 +816,12 @@ CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Source/PostgresKit-Prefix.pch"; @@ -849,8 +850,11 @@ CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Source/PostgresKit-Prefix.pch"; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; diff --git a/Frameworks/PostgresKit/PostgresKit.xcodeproj/xcshareddata/xcschemes/PostgresKit.xcscheme b/Frameworks/PostgresKit/PostgresKit.xcodeproj/xcshareddata/xcschemes/PostgresKit.xcscheme index ca74a70ba..04dd4beac 100644 --- a/Frameworks/PostgresKit/PostgresKit.xcodeproj/xcshareddata/xcschemes/PostgresKit.xcscheme +++ b/Frameworks/PostgresKit/PostgresKit.xcodeproj/xcshareddata/xcschemes/PostgresKit.xcscheme @@ -1,6 +1,6 @@ + + + + + + diff --git a/Frameworks/PostgresKit/Resources/Info.plist b/Frameworks/PostgresKit/Resources/Info.plist index b961331f3..0da2c36be 100644 --- a/Frameworks/PostgresKit/Resources/Info.plist +++ b/Frameworks/PostgresKit/Resources/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable PostgresKit CFBundleIdentifier - com.sequelpro.postgreskit + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType diff --git a/Frameworks/PostgresKit/Resources/Tests-Info.plist b/Frameworks/PostgresKit/Resources/Tests-Info.plist index b88d8638e..ddbc4bf77 100644 --- a/Frameworks/PostgresKit/Resources/Tests-Info.plist +++ b/Frameworks/PostgresKit/Resources/Tests-Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable Tests CFBundleIdentifier - com.sequelpro.postgreskit.tests + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType diff --git a/Frameworks/PostgresKit/Tests/PGDataTypeTests.h b/Frameworks/PostgresKit/Tests/PGDataTypeTests.h index 8f6b54adc..7322823f1 100644 --- a/Frameworks/PostgresKit/Tests/PGDataTypeTests.h +++ b/Frameworks/PostgresKit/Tests/PGDataTypeTests.h @@ -27,7 +27,7 @@ // OTHER DEALINGS IN THE SOFTWARE. #import -#import +#import #import "PGPostgresIntegrationTestCase.h" diff --git a/Frameworks/PostgresKit/Tests/PGDataTypeTests.m b/Frameworks/PostgresKit/Tests/PGDataTypeTests.m index a2048ed6d..8ffd8b473 100644 --- a/Frameworks/PostgresKit/Tests/PGDataTypeTests.m +++ b/Frameworks/PostgresKit/Tests/PGDataTypeTests.m @@ -33,7 +33,7 @@ @interface PGDataTypeTests () + (void)_addTestForField:(NSString *)field withExpectedResult:(id)result connection:(PGPostgresConnection *)connection - toTestSuite:(SenTestSuite *)testSuite; + toTestSuite:(XCTestSuite *)testSuite; @end @@ -48,7 +48,7 @@ @implementation PGDataTypeTests + (id)defaultTestSuite { - SenTestSuite *testSuite = [[SenTestSuite alloc] initWithName:[self className]]; + XCTestSuite *testSuite = [[XCTestSuite alloc] initWithName:[self className]]; PGPostgresConnection *connection = [[PGPostgresConnection alloc] init]; @@ -109,12 +109,12 @@ - (void)setUp - (void)testResultValueIsNotNil { - STAssertNotNil(_result, nil); + XCTAssertNotNil(_result); } - (void)testResultIsOfCorrectTypeAndValue { - STAssertEqualObjects(_result, _expectedResult, nil); + XCTAssertEqualObjects(_result, _expectedResult); } #pragma mark - @@ -123,11 +123,11 @@ - (void)testResultIsOfCorrectTypeAndValue + (void)_addTestForField:(NSString *)field withExpectedResult:(id)result connection:(PGPostgresConnection *)connection - toTestSuite:(SenTestSuite *)testSuite + toTestSuite:(XCTestSuite *)testSuite { for (NSInvocation *invocation in [self testInvocations]) { - SenTestCase *test = [[[self class] alloc] initWithInvocation:invocation connection:connection expectedResult:result field:field]; + XCTestCase *test = [[[self class] alloc] initWithInvocation:invocation connection:connection expectedResult:result field:field]; [testSuite addTest:test]; diff --git a/Frameworks/PostgresKit/Tests/PGPostgresIntegrationTestCase.h b/Frameworks/PostgresKit/Tests/PGPostgresIntegrationTestCase.h index c67061567..7a654f5f7 100644 --- a/Frameworks/PostgresKit/Tests/PGPostgresIntegrationTestCase.h +++ b/Frameworks/PostgresKit/Tests/PGPostgresIntegrationTestCase.h @@ -27,9 +27,9 @@ // OTHER DEALINGS IN THE SOFTWARE. #import -#import +#import -@interface PGPostgresIntegrationTestCase : SenTestCase +@interface PGPostgresIntegrationTestCase : XCTestCase { PGPostgresConnection *_connection; } diff --git a/Frameworks/PostgresKit/Tests/PGPostgresIntegrationTestCase.m b/Frameworks/PostgresKit/Tests/PGPostgresIntegrationTestCase.m index e6c965055..96de8a40f 100644 --- a/Frameworks/PostgresKit/Tests/PGPostgresIntegrationTestCase.m +++ b/Frameworks/PostgresKit/Tests/PGPostgresIntegrationTestCase.m @@ -67,7 +67,7 @@ - (void)_establishConnection [_connection setPassword:PGTestDatabasePassword]; if (![_connection connect]) { - STFail(@"Request to establish connection to local database failed."); + XCTFail(@"Request to establish connection to local database failed."); exit(1); } diff --git a/Frameworks/PostgresKit/Tests/PGPostgresResultTests.h b/Frameworks/PostgresKit/Tests/PGPostgresResultTests.h index 93c36427b..e01aedec9 100644 --- a/Frameworks/PostgresKit/Tests/PGPostgresResultTests.h +++ b/Frameworks/PostgresKit/Tests/PGPostgresResultTests.h @@ -27,7 +27,7 @@ // OTHER DEALINGS IN THE SOFTWARE. #import -#import +#import #import "PGPostgresIntegrationTestCase.h" diff --git a/Frameworks/PostgresKit/Tests/PGPostgresResultTests.m b/Frameworks/PostgresKit/Tests/PGPostgresResultTests.m index ef64ea530..8e27b1638 100644 --- a/Frameworks/PostgresKit/Tests/PGPostgresResultTests.m +++ b/Frameworks/PostgresKit/Tests/PGPostgresResultTests.m @@ -63,7 +63,7 @@ - (void)testResultDescriptionIsCorrect "}"); // Compare the output after getting rid of newlines and spaces - STAssertTrue([[[[_result description] stringByReplacingOccurrencesOfString:@"\n" withString:@""] stringByReplacingOccurrencesOfString:@" " withString:@""] isEqualToString:@"{" + XCTAssertTrue([[[[_result description] stringByReplacingOccurrencesOfString:@"\n" withString:@""] stringByReplacingOccurrencesOfString:@" " withString:@""] isEqualToString:@"{" "\"bigint_field\" = 123456789;" "\"bool_field\" = 1;" "\"char_field\" = CHAR;" @@ -77,7 +77,7 @@ - (void)testResultDescriptionIsCorrect "\"timestamptz_field\" = \"8 Apr 1987 03:02:02 GMT+01:00\";" "\"timetz_field\" = \"02:02:02 GMT+10:00\";" "\"varchar_field\" = VARCHAR;" - "}"], nil); + "}"]); } #pragma mark - From cbbd6e05d65015d26f90e001cabcc5857c9b2134 Mon Sep 17 00:00:00 2001 From: Marius Ursache Date: Tue, 1 Mar 2016 11:08:27 +1100 Subject: [PATCH 18/22] Failed postgres tests if cannot connect to host/db Otherwise the tests will just wait indefinitely --- .../Tests/PGPostgresIntegrationTestCase.m | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Frameworks/PostgresKit/Tests/PGPostgresIntegrationTestCase.m b/Frameworks/PostgresKit/Tests/PGPostgresIntegrationTestCase.m index 96de8a40f..231e1bfa3 100644 --- a/Frameworks/PostgresKit/Tests/PGPostgresIntegrationTestCase.m +++ b/Frameworks/PostgresKit/Tests/PGPostgresIntegrationTestCase.m @@ -35,6 +35,8 @@ static NSUInteger PGTestDatabasePort = 5432; +static double PGTestConnectionTimeout = 0.2; + @interface PGPostgresIntegrationTestCase () - (void)_establishConnection; @@ -72,8 +74,20 @@ - (void)_establishConnection exit(1); } + NSDate *startDate = [NSDate date]; + do { sleep(0.1); + + if([[NSDate date] timeIntervalSinceDate:startDate] > PGTestConnectionTimeout) { + XCTFail(@"Failed to connect to database after %f seconds. Host:%@ Database:%@ User:%@ Password:%@", + PGTestConnectionTimeout, + PGTestDatabaseHost, + PGTestDatabaseName, + PGTestDatabaseUser, + PGTestDatabasePassword); + exit(1); + } } while (![_connection isConnected]); } From 67f1ef6e43027380cbdc976115164fbeee1c2dc2 Mon Sep 17 00:00:00 2001 From: Abhi Beckert Date: Fri, 4 Mar 2016 17:46:00 +1000 Subject: [PATCH 19/22] Comment out debug code for #2297 --- Source/SPObjectAdditions.m | 71 +++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 35 deletions(-) diff --git a/Source/SPObjectAdditions.m b/Source/SPObjectAdditions.m index bf8210ea2..9dfe8559c 100644 --- a/Source/SPObjectAdditions.m +++ b/Source/SPObjectAdditions.m @@ -51,38 +51,39 @@ - (BOOL)isInArray:(NSArray *)list @end -#pragma mark - - -@interface NSAlert (ApplePrivate) - -- (IBAction)buttonPressed:(id)sender; - -@end - -@implementation NSAlert (SPAlertDebug) - -+ (void)load -{ - static dispatch_once_t onceToken; - - dispatch_once(&onceToken, ^{ - Class alertClass = [self class]; - - SEL orig = @selector(buttonPressed:); - SEL exch = @selector(sp_buttonPressed:); - - Method origM = class_getInstanceMethod(alertClass, orig); - Method exchM = class_getInstanceMethod(alertClass, exch); - - method_exchangeImplementations(origM, exchM); - }); -} - -- (IBAction)sp_buttonPressed:(id)obj -{ - NSLog(@"%s of %@ title=\n%@\ntext=\n%@",__func__,self,[self messageText],[self informativeText]); - - [self sp_buttonPressed:obj]; -} - -@end +// method swizzling to try and reproduce #2297 +//#pragma mark - +// +//@interface NSAlert (ApplePrivate) +// +//- (IBAction)buttonPressed:(id)sender; +// +//@end +// +//@implementation NSAlert (SPAlertDebug) +// +//+ (void)load +//{ +// static dispatch_once_t onceToken; +// +// dispatch_once(&onceToken, ^{ +// Class alertClass = [self class]; +// +// SEL orig = @selector(buttonPressed:); +// SEL exch = @selector(sp_buttonPressed:); +// +// Method origM = class_getInstanceMethod(alertClass, orig); +// Method exchM = class_getInstanceMethod(alertClass, exch); +// +// method_exchangeImplementations(origM, exchM); +// }); +//} +// +//- (IBAction)sp_buttonPressed:(id)obj +//{ +// NSLog(@"%s of %@ title=\n%@\ntext=\n%@",__func__,self,[self messageText],[self informativeText]); +// +// [self sp_buttonPressed:obj]; +//} +// +//@end From faafa14b29d618a5342891214101da1bf2fbff80 Mon Sep 17 00:00:00 2001 From: Abhi Beckert Date: Fri, 4 Mar 2016 18:02:44 +1000 Subject: [PATCH 20/22] Remove bundled zlib #1927 --- Frameworks/zlib/libz.a | Bin 317564 -> 0 bytes Frameworks/zlib/zlib.1.2.4.h | 1605 -------------------------- Source/SPFileHandle.m | 2 +- sequel-pro.xcodeproj/project.pbxproj | 28 +- 4 files changed, 13 insertions(+), 1622 deletions(-) delete mode 100644 Frameworks/zlib/libz.a delete mode 100644 Frameworks/zlib/zlib.1.2.4.h diff --git a/Frameworks/zlib/libz.a b/Frameworks/zlib/libz.a deleted file mode 100644 index 08144dda0025c1de6c128996221d8277ce8a04ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 317564 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ⅇK5zR8`rMScYbu^-IoLRqvNyh^#4nN1gfQ)U3 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≫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%0Ds+8q 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�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�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 T`KpModr4iSeakv~y+8g0FCN>_ diff --git a/Frameworks/zlib/zlib.1.2.4.h b/Frameworks/zlib/zlib.1.2.4.h deleted file mode 100644 index f5785be7e..000000000 --- a/Frameworks/zlib/zlib.1.2.4.h +++ /dev/null @@ -1,1605 +0,0 @@ -/* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.4, Mar 14th, 2010 - - Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - - - The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt - (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). -*/ - -#ifndef ZLIB_H -#define ZLIB_H - -#include "zconf.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define ZLIB_VERSION "1.2.4" -#define ZLIB_VERNUM 0x1240 -#define ZLIB_VER_MAJOR 1 -#define ZLIB_VER_MINOR 2 -#define ZLIB_VER_REVISION 4 -#define ZLIB_VER_SUBREVISION 0 - -/* - The 'zlib' compression library provides in-memory compression and - decompression functions, including integrity checks of the uncompressed data. - This version of the library supports only one compression method (deflation) - but other algorithms will be added later and will have the same stream - interface. - - Compression can be done in a single step if the buffers are large enough, - or can be done by repeated calls of the compression function. In the latter - case, the application must provide more input and/or consume the output - (providing more output space) before each call. - - The compressed data format used by default by the in-memory functions is - the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped - around a deflate stream, which is itself documented in RFC 1951. - - The library also supports reading and writing files in gzip (.gz) format - with an interface similar to that of stdio using the functions that start - with "gz". The gzip format is different from the zlib format. gzip is a - gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. - - This library can optionally read and write gzip streams in memory as well. - - The zlib format was designed to be compact and fast for use in memory - and on communications channels. The gzip format was designed for single- - file compression on file systems, has a larger header than zlib to maintain - directory information, and uses a different, slower check method than zlib. - - The library does not install any signal handler. The decoder checks - the consistency of the compressed data, so the library should never crash - even in case of corrupted input. -*/ - -typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); -typedef void (*free_func) OF((voidpf opaque, voidpf address)); - -struct internal_state; - -typedef struct z_stream_s { - Bytef *next_in; /* next input byte */ - uInt avail_in; /* number of bytes available at next_in */ - uLong total_in; /* total nb of input bytes read so far */ - - Bytef *next_out; /* next output byte should be put there */ - uInt avail_out; /* remaining free space at next_out */ - uLong total_out; /* total nb of bytes output so far */ - - char *msg; /* last error message, NULL if no error */ - struct internal_state FAR *state; /* not visible by applications */ - - alloc_func zalloc; /* used to allocate the internal state */ - free_func zfree; /* used to free the internal state */ - voidpf opaque; /* private data object passed to zalloc and zfree */ - - int data_type; /* best guess about the data type: binary or text */ - uLong adler; /* adler32 value of the uncompressed data */ - uLong reserved; /* reserved for future use */ -} z_stream; - -typedef z_stream FAR *z_streamp; - -/* - gzip header information passed to and from zlib routines. See RFC 1952 - for more details on the meanings of these fields. -*/ -typedef struct gz_header_s { - int text; /* true if compressed data believed to be text */ - uLong time; /* modification time */ - int xflags; /* extra flags (not used when writing a gzip file) */ - int os; /* operating system */ - Bytef *extra; /* pointer to extra field or Z_NULL if none */ - uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ - uInt extra_max; /* space at extra (only when reading header) */ - Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ - uInt name_max; /* space at name (only when reading header) */ - Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ - uInt comm_max; /* space at comment (only when reading header) */ - int hcrc; /* true if there was or will be a header crc */ - int done; /* true when done reading gzip header (not used - when writing a gzip file) */ -} gz_header; - -typedef gz_header FAR *gz_headerp; - -/* - The application must update next_in and avail_in when avail_in has dropped - to zero. It must update next_out and avail_out when avail_out has dropped - to zero. The application must initialize zalloc, zfree and opaque before - calling the init function. All other fields are set by the compression - library and must not be updated by the application. - - The opaque value provided by the application will be passed as the first - parameter for calls of zalloc and zfree. This can be useful for custom - memory management. The compression library attaches no meaning to the - opaque value. - - zalloc must return Z_NULL if there is not enough memory for the object. - If zlib is used in a multi-threaded application, zalloc and zfree must be - thread safe. - - On 16-bit systems, the functions zalloc and zfree must be able to allocate - exactly 65536 bytes, but will not be required to allocate more than this if - the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers - returned by zalloc for objects of exactly 65536 bytes *must* have their - offset normalized to zero. The default allocation function provided by this - library ensures this (see zutil.c). To reduce memory requirements and avoid - any allocation of 64K objects, at the expense of compression ratio, compile - the library with -DMAX_WBITS=14 (see zconf.h). - - The fields total_in and total_out can be used for statistics or progress - reports. After compression, total_in holds the total size of the - uncompressed data and may be saved for use in the decompressor (particularly - if the decompressor wants to decompress everything in a single step). -*/ - - /* constants */ - -#define Z_NO_FLUSH 0 -#define Z_PARTIAL_FLUSH 1 -#define Z_SYNC_FLUSH 2 -#define Z_FULL_FLUSH 3 -#define Z_FINISH 4 -#define Z_BLOCK 5 -#define Z_TREES 6 -/* Allowed flush values; see deflate() and inflate() below for details */ - -#define Z_OK 0 -#define Z_STREAM_END 1 -#define Z_NEED_DICT 2 -#define Z_ERRNO (-1) -#define Z_STREAM_ERROR (-2) -#define Z_DATA_ERROR (-3) -#define Z_MEM_ERROR (-4) -#define Z_BUF_ERROR (-5) -#define Z_VERSION_ERROR (-6) -/* Return codes for the compression/decompression functions. Negative values - * are errors, positive values are used for special but normal events. - */ - -#define Z_NO_COMPRESSION 0 -#define Z_BEST_SPEED 1 -#define Z_BEST_COMPRESSION 9 -#define Z_DEFAULT_COMPRESSION (-1) -/* compression levels */ - -#define Z_FILTERED 1 -#define Z_HUFFMAN_ONLY 2 -#define Z_RLE 3 -#define Z_FIXED 4 -#define Z_DEFAULT_STRATEGY 0 -/* compression strategy; see deflateInit2() below for details */ - -#define Z_BINARY 0 -#define Z_TEXT 1 -#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ -#define Z_UNKNOWN 2 -/* Possible values of the data_type field (though see inflate()) */ - -#define Z_DEFLATED 8 -/* The deflate compression method (the only one supported in this version) */ - -#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ - -#define zlib_version zlibVersion() -/* for compatibility with versions < 1.0.2 */ - - - /* basic functions */ - -ZEXTERN const char * ZEXPORT zlibVersion OF((void)); -/* The application can compare zlibVersion and ZLIB_VERSION for consistency. - If the first character differs, the library code actually used is not - compatible with the zlib.h header file used by the application. This check - is automatically made by deflateInit and inflateInit. - */ - -/* -ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); - - Initializes the internal stream state for compression. The fields - zalloc, zfree and opaque must be initialized before by the caller. If - zalloc and zfree are set to Z_NULL, deflateInit updates them to use default - allocation functions. - - The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: - 1 gives best speed, 9 gives best compression, 0 gives no compression at all - (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION - requests a default compromise between speed and compression (currently - equivalent to level 6). - - deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if level is not a valid compression level, or - Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible - with the version assumed by the caller (ZLIB_VERSION). msg is set to null - if there is no error message. deflateInit does not perform any compression: - this will be done by deflate(). -*/ - - -ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); -/* - deflate compresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce - some output latency (reading input without producing any output) except when - forced to flush. - - The detailed semantics are as follows. deflate performs one or both of the - following actions: - - - Compress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not - enough room in the output buffer), next_in and avail_in are updated and - processing will resume at this point for the next call of deflate(). - - - Provide more output starting at next_out and update next_out and avail_out - accordingly. This action is forced if the parameter flush is non zero. - Forcing flush frequently degrades the compression ratio, so this parameter - should be set only when necessary (in interactive applications). Some - output may be provided even if flush is not set. - - Before the call of deflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming more - output, and updating avail_in or avail_out accordingly; avail_out should - never be zero before the call. The application can consume the compressed - output when it wants, for example when the output buffer is full (avail_out - == 0), or after each call of deflate(). If deflate returns Z_OK and with - zero avail_out, it must be called again after making room in the output - buffer because there might be more output pending. - - Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to - decide how much data to accumulate before producing output, in order to - maximize compression. - - If the parameter flush is set to Z_SYNC_FLUSH, all pending output is - flushed to the output buffer and the output is aligned on a byte boundary, so - that the decompressor can get all input data available so far. (In - particular avail_in is zero after the call if enough output space has been - provided before the call.) Flushing may degrade compression for some - compression algorithms and so it should be used only when necessary. This - completes the current deflate block and follows it with an empty stored block - that is three bits plus filler bits to the next byte, followed by four bytes - (00 00 ff ff). - - If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the - output buffer, but the output is not aligned to a byte boundary. All of the - input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. - This completes the current deflate block and follows it with an empty fixed - codes block that is 10 bits long. This assures that enough bytes are output - in order for the decompressor to finish the block before the empty fixed code - block. - - If flush is set to Z_BLOCK, a deflate block is completed and emitted, as - for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to - seven bits of the current block are held to be written as the next byte after - the next deflate block is completed. In this case, the decompressor may not - be provided enough bits at this point in order to complete decompression of - the data provided so far to the compressor. It may need to wait for the next - block to be emitted. This is for advanced applications that need to control - the emission of deflate blocks. - - If flush is set to Z_FULL_FLUSH, all output is flushed as with - Z_SYNC_FLUSH, and the compression state is reset so that decompression can - restart from this point if previous compressed data has been damaged or if - random access is desired. Using Z_FULL_FLUSH too often can seriously degrade - compression. - - If deflate returns with avail_out == 0, this function must be called again - with the same value of the flush parameter and more output space (updated - avail_out), until the flush is complete (deflate returns with non-zero - avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that - avail_out is greater than six to avoid repeated flush markers due to - avail_out == 0 on return. - - If the parameter flush is set to Z_FINISH, pending input is processed, - pending output is flushed and deflate returns with Z_STREAM_END if there was - enough output space; if deflate returns with Z_OK, this function must be - called again with Z_FINISH and more output space (updated avail_out) but no - more input data, until it returns with Z_STREAM_END or an error. After - deflate has returned Z_STREAM_END, the only possible operations on the stream - are deflateReset or deflateEnd. - - Z_FINISH can be used immediately after deflateInit if all the compression - is to be done in a single step. In this case, avail_out must be at least the - value returned by deflateBound (see below). If deflate does not return - Z_STREAM_END, then it must be called again as described above. - - deflate() sets strm->adler to the adler32 checksum of all input read - so far (that is, total_in bytes). - - deflate() may update strm->data_type if it can make a good guess about - the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered - binary. This field is only for information purposes and does not affect the - compression algorithm in any manner. - - deflate() returns Z_OK if some progress has been made (more input - processed or more output produced), Z_STREAM_END if all input has been - consumed and all output has been produced (only when flush is set to - Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example - if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible - (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not - fatal, and deflate() can be called again with more input and more output - space to continue compressing. -*/ - - -ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); -/* - All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any pending - output. - - deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the - stream state was inconsistent, Z_DATA_ERROR if the stream was freed - prematurely (some input or output was discarded). In the error case, msg - may be set but then points to a static string (which must not be - deallocated). -*/ - - -/* -ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); - - Initializes the internal stream state for decompression. The fields - next_in, avail_in, zalloc, zfree and opaque must be initialized before by - the caller. If next_in is not Z_NULL and avail_in is large enough (the - exact value depends on the compression method), inflateInit determines the - compression method from the zlib header and allocates all data structures - accordingly; otherwise the allocation will be deferred to the first call of - inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to - use default allocation functions. - - inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_VERSION_ERROR if the zlib library version is incompatible with the - version assumed by the caller, or Z_STREAM_ERROR if the parameters are - invalid, such as a null pointer to the structure. msg is set to null if - there is no error message. inflateInit does not perform any decompression - apart from possibly reading the zlib header if present: actual decompression - will be done by inflate(). (So next_in and avail_in may be modified, but - next_out and avail_out are unused and unchanged.) The current implementation - of inflateInit() does not process any header information -- that is deferred - until inflate() is called. -*/ - - -ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); -/* - inflate decompresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce - some output latency (reading input without producing any output) except when - forced to flush. - - The detailed semantics are as follows. inflate performs one or both of the - following actions: - - - Decompress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not - enough room in the output buffer), next_in is updated and processing will - resume at this point for the next call of inflate(). - - - Provide more output starting at next_out and update next_out and avail_out - accordingly. inflate() provides as much output as possible, until there is - no more input data or no more space in the output buffer (see below about - the flush parameter). - - Before the call of inflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming more - output, and updating the next_* and avail_* values accordingly. The - application can consume the uncompressed output when it wants, for example - when the output buffer is full (avail_out == 0), or after each call of - inflate(). If inflate returns Z_OK and with zero avail_out, it must be - called again after making room in the output buffer because there might be - more output pending. - - The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, - Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much - output as possible to the output buffer. Z_BLOCK requests that inflate() - stop if and when it gets to the next deflate block boundary. When decoding - the zlib or gzip format, this will cause inflate() to return immediately - after the header and before the first block. When doing a raw inflate, - inflate() will go ahead and process the first block, and will return when it - gets to the end of that block, or when it runs out of data. - - The Z_BLOCK option assists in appending to or combining deflate streams. - Also to assist in this, on return inflate() will set strm->data_type to the - number of unused bits in the last byte taken from strm->next_in, plus 64 if - inflate() is currently decoding the last block in the deflate stream, plus - 128 if inflate() returned immediately after decoding an end-of-block code or - decoding the complete header up to just before the first byte of the deflate - stream. The end-of-block will not be indicated until all of the uncompressed - data from that block has been written to strm->next_out. The number of - unused bits may in general be greater than seven, except when bit 7 of - data_type is set, in which case the number of unused bits will be less than - eight. data_type is set as noted here every time inflate() returns for all - flush options, and so can be used to determine the amount of currently - consumed input in bits. - - The Z_TREES option behaves as Z_BLOCK does, but it also returns when the - end of each deflate block header is reached, before any actual data in that - block is decoded. This allows the caller to determine the length of the - deflate block header for later use in random access within a deflate block. - 256 is added to the value of strm->data_type when inflate() returns - immediately after reaching the end of the deflate block header. - - inflate() should normally be called until it returns Z_STREAM_END or an - error. However if all decompression is to be performed in a single step (a - single call of inflate), the parameter flush should be set to Z_FINISH. In - this case all pending input is processed and all pending output is flushed; - avail_out must be large enough to hold all the uncompressed data. (The size - of the uncompressed data may have been saved by the compressor for this - purpose.) The next operation on this stream must be inflateEnd to deallocate - the decompression state. The use of Z_FINISH is never required, but can be - used to inform inflate that a faster approach may be used for the single - inflate() call. - - In this implementation, inflate() always flushes as much output as - possible to the output buffer, and always uses the faster approach on the - first call. So the only effect of the flush parameter in this implementation - is on the return value of inflate(), as noted below, or when it returns early - because Z_BLOCK or Z_TREES is used. - - If a preset dictionary is needed after this call (see inflateSetDictionary - below), inflate sets strm->adler to the adler32 checksum of the dictionary - chosen by the compressor and returns Z_NEED_DICT; otherwise it sets - strm->adler to the adler32 checksum of all output produced so far (that is, - total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described - below. At the end of the stream, inflate() checks that its computed adler32 - checksum is equal to that saved by the compressor and returns Z_STREAM_END - only if the checksum is correct. - - inflate() can decompress and check either zlib-wrapped or gzip-wrapped - deflate data. The header type is detected automatically, if requested when - initializing with inflateInit2(). Any information contained in the gzip - header is not retained, so applications that need that information should - instead use raw inflate, see inflateInit2() below, or inflateBack() and - perform their own processing of the gzip header and trailer. - - inflate() returns Z_OK if some progress has been made (more input processed - or more output produced), Z_STREAM_END if the end of the compressed data has - been reached and all uncompressed output has been produced, Z_NEED_DICT if a - preset dictionary is needed at this point, Z_DATA_ERROR if the input data was - corrupted (input stream not conforming to the zlib format or incorrect check - value), Z_STREAM_ERROR if the stream structure was inconsistent (for example - next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory, - Z_BUF_ERROR if no progress is possible or if there was not enough room in the - output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and - inflate() can be called again with more input and more output space to - continue decompressing. If Z_DATA_ERROR is returned, the application may - then call inflateSync() to look for a good compression block if a partial - recovery of the data is desired. -*/ - - -ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); -/* - All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any pending - output. - - inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state - was inconsistent. In the error case, msg may be set but then points to a - static string (which must not be deallocated). -*/ - - - /* Advanced functions */ - -/* - The following functions are needed only in some special applications. -*/ - -/* -ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, - int level, - int method, - int windowBits, - int memLevel, - int strategy)); - - This is another version of deflateInit with more compression options. The - fields next_in, zalloc, zfree and opaque must be initialized before by the - caller. - - The method parameter is the compression method. It must be Z_DEFLATED in - this version of the library. - - The windowBits parameter is the base two logarithm of the window size - (the size of the history buffer). It should be in the range 8..15 for this - version of the library. Larger values of this parameter result in better - compression at the expense of memory usage. The default value is 15 if - deflateInit is used instead. - - windowBits can also be -8..-15 for raw deflate. In this case, -windowBits - determines the window size. deflate() will then generate raw deflate data - with no zlib header or trailer, and will not compute an adler32 check value. - - windowBits can also be greater than 15 for optional gzip encoding. Add - 16 to windowBits to write a simple gzip header and trailer around the - compressed data instead of a zlib wrapper. The gzip header will have no - file name, no extra data, no comment, no modification time (set to zero), no - header crc, and the operating system will be set to 255 (unknown). If a - gzip stream is being written, strm->adler is a crc32 instead of an adler32. - - The memLevel parameter specifies how much memory should be allocated - for the internal compression state. memLevel=1 uses minimum memory but is - slow and reduces compression ratio; memLevel=9 uses maximum memory for - optimal speed. The default value is 8. See zconf.h for total memory usage - as a function of windowBits and memLevel. - - The strategy parameter is used to tune the compression algorithm. Use the - value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a - filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no - string match), or Z_RLE to limit match distances to one (run-length - encoding). Filtered data consists mostly of small values with a somewhat - random distribution. In this case, the compression algorithm is tuned to - compress them better. The effect of Z_FILTERED is to force more Huffman - coding and less string matching; it is somewhat intermediate between - Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as - fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The - strategy parameter only affects the compression ratio but not the - correctness of the compressed output even if it is not set appropriately. - Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler - decoder for special applications. - - deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid - method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is - incompatible with the version assumed by the caller (ZLIB_VERSION). msg is - set to null if there is no error message. deflateInit2 does not perform any - compression: this will be done by deflate(). -*/ - -ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); -/* - Initializes the compression dictionary from the given byte sequence - without producing any compressed output. This function must be called - immediately after deflateInit, deflateInit2 or deflateReset, before any call - of deflate. The compressor and decompressor must use exactly the same - dictionary (see inflateSetDictionary). - - The dictionary should consist of strings (byte sequences) that are likely - to be encountered later in the data to be compressed, with the most commonly - used strings preferably put towards the end of the dictionary. Using a - dictionary is most useful when the data to be compressed is short and can be - predicted with good accuracy; the data can then be compressed better than - with the default empty dictionary. - - Depending on the size of the compression data structures selected by - deflateInit or deflateInit2, a part of the dictionary may in effect be - discarded, for example if the dictionary is larger than the window size - provided in deflateInit or deflateInit2. Thus the strings most likely to be - useful should be put at the end of the dictionary, not at the front. In - addition, the current implementation of deflate will use at most the window - size minus 262 bytes of the provided dictionary. - - Upon return of this function, strm->adler is set to the adler32 value - of the dictionary; the decompressor may later use this value to determine - which dictionary has been used by the compressor. (The adler32 value - applies to the whole dictionary even if only a subset of the dictionary is - actually used by the compressor.) If a raw deflate was requested, then the - adler32 value is not computed and strm->adler is not set. - - deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a - parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is - inconsistent (for example if deflate has already been called for this stream - or if the compression method is bsort). deflateSetDictionary does not - perform any compression: this will be done by deflate(). -*/ - -ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, - z_streamp source)); -/* - Sets the destination stream as a complete copy of the source stream. - - This function can be useful when several compression strategies will be - tried, for example when there are several ways of pre-processing the input - data with a filter. The streams that will be discarded should then be freed - by calling deflateEnd. Note that deflateCopy duplicates the internal - compression state which can be quite large, so this strategy is slow and can - consume lots of memory. - - deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being Z_NULL). msg is left unchanged in both source and - destination. -*/ - -ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); -/* - This function is equivalent to deflateEnd followed by deflateInit, - but does not free and reallocate all the internal compression state. The - stream will keep the same compression level and any other attributes that - may have been set by deflateInit2. - - deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being Z_NULL). -*/ - -ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, - int level, - int strategy)); -/* - Dynamically update the compression level and compression strategy. The - interpretation of level and strategy is as in deflateInit2. This can be - used to switch between compression and straight copy of the input data, or - to switch to a different kind of input data requiring a different strategy. - If the compression level is changed, the input available so far is - compressed with the old level (and may be flushed); the new level will take - effect only at the next call of deflate(). - - Before the call of deflateParams, the stream state must be set as for - a call of deflate(), since the currently available input may have to be - compressed and flushed. In particular, strm->avail_out must be non-zero. - - deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source - stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if - strm->avail_out was zero. -*/ - -ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, - int good_length, - int max_lazy, - int nice_length, - int max_chain)); -/* - Fine tune deflate's internal compression parameters. This should only be - used by someone who understands the algorithm used by zlib's deflate for - searching for the best matching string, and even then only by the most - fanatic optimizer trying to squeeze out the last compressed bit for their - specific input data. Read the deflate.c source code for the meaning of the - max_lazy, good_length, nice_length, and max_chain parameters. - - deflateTune() can be called after deflateInit() or deflateInit2(), and - returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. - */ - -ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, - uLong sourceLen)); -/* - deflateBound() returns an upper bound on the compressed size after - deflation of sourceLen bytes. It must be called after deflateInit() or - deflateInit2(), and after deflateSetHeader(), if used. This would be used - to allocate an output buffer for deflation in a single pass, and so would be - called before deflate(). -*/ - -ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, - int bits, - int value)); -/* - deflatePrime() inserts bits in the deflate output stream. The intent - is that this function is used to start off the deflate output with the bits - leftover from a previous deflate stream when appending to it. As such, this - function can only be used for raw deflate, and must be used before the first - deflate() call after a deflateInit2() or deflateReset(). bits must be less - than or equal to 16, and that many of the least significant bits of value - will be inserted in the output. - - deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, - gz_headerp head)); -/* - deflateSetHeader() provides gzip header information for when a gzip - stream is requested by deflateInit2(). deflateSetHeader() may be called - after deflateInit2() or deflateReset() and before the first call of - deflate(). The text, time, os, extra field, name, and comment information - in the provided gz_header structure are written to the gzip header (xflag is - ignored -- the extra flags are set according to the compression level). The - caller must assure that, if not Z_NULL, name and comment are terminated with - a zero byte, and that if extra is not Z_NULL, that extra_len bytes are - available there. If hcrc is true, a gzip header crc is included. Note that - the current versions of the command-line version of gzip (up through version - 1.3.x) do not support header crc's, and will report that it is a "multi-part - gzip file" and give up. - - If deflateSetHeader is not used, the default gzip header has text false, - the time set to zero, and os set to 255, with no extra, name, or comment - fields. The gzip header is returned to the default state by deflateReset(). - - deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -/* -ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, - int windowBits)); - - This is another version of inflateInit with an extra parameter. The - fields next_in, avail_in, zalloc, zfree and opaque must be initialized - before by the caller. - - The windowBits parameter is the base two logarithm of the maximum window - size (the size of the history buffer). It should be in the range 8..15 for - this version of the library. The default value is 15 if inflateInit is used - instead. windowBits must be greater than or equal to the windowBits value - provided to deflateInit2() while compressing, or it must be equal to 15 if - deflateInit2() was not used. If a compressed stream with a larger window - size is given as input, inflate() will return with the error code - Z_DATA_ERROR instead of trying to allocate a larger window. - - windowBits can also be zero to request that inflate use the window size in - the zlib header of the compressed stream. - - windowBits can also be -8..-15 for raw inflate. In this case, -windowBits - determines the window size. inflate() will then process raw deflate data, - not looking for a zlib or gzip header, not generating a check value, and not - looking for any check values for comparison at the end of the stream. This - is for use with other formats that use the deflate compressed data format - such as zip. Those formats provide their own check values. If a custom - format is developed using the raw deflate format for compressed data, it is - recommended that a check value such as an adler32 or a crc32 be applied to - the uncompressed data as is done in the zlib, gzip, and zip formats. For - most applications, the zlib format should be used as is. Note that comments - above on the use in deflateInit2() applies to the magnitude of windowBits. - - windowBits can also be greater than 15 for optional gzip decoding. Add - 32 to windowBits to enable zlib and gzip decoding with automatic header - detection, or add 16 to decode only the gzip format (the zlib format will - return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a - crc32 instead of an adler32. - - inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_VERSION_ERROR if the zlib library version is incompatible with the - version assumed by the caller, or Z_STREAM_ERROR if the parameters are - invalid, such as a null pointer to the structure. msg is set to null if - there is no error message. inflateInit2 does not perform any decompression - apart from possibly reading the zlib header if present: actual decompression - will be done by inflate(). (So next_in and avail_in may be modified, but - next_out and avail_out are unused and unchanged.) The current implementation - of inflateInit2() does not process any header information -- that is - deferred until inflate() is called. -*/ - -ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); -/* - Initializes the decompression dictionary from the given uncompressed byte - sequence. This function must be called immediately after a call of inflate, - if that call returned Z_NEED_DICT. The dictionary chosen by the compressor - can be determined from the adler32 value returned by that call of inflate. - The compressor and decompressor must use exactly the same dictionary (see - deflateSetDictionary). For raw inflate, this function can be called - immediately after inflateInit2() or inflateReset() and before any call of - inflate() to set the dictionary. The application must insure that the - dictionary that was used for compression is provided. - - inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a - parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is - inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the - expected one (incorrect adler32 value). inflateSetDictionary does not - perform any decompression: this will be done by subsequent calls of - inflate(). -*/ - -ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); -/* - Skips invalid compressed data until a full flush point (see above the - description of deflate with Z_FULL_FLUSH) can be found, or until all - available input is skipped. No output is provided. - - inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR - if no more input was provided, Z_DATA_ERROR if no flush point has been - found, or Z_STREAM_ERROR if the stream structure was inconsistent. In the - success case, the application may save the current current value of total_in - which indicates where valid compressed data was found. In the error case, - the application may repeatedly call inflateSync, providing more input each - time, until success or end of the input data. -*/ - -ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, - z_streamp source)); -/* - Sets the destination stream as a complete copy of the source stream. - - This function can be useful when randomly accessing a large stream. The - first pass through the stream can periodically record the inflate state, - allowing restarting inflate at those points when randomly accessing the - stream. - - inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being Z_NULL). msg is left unchanged in both source and - destination. -*/ - -ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); -/* - This function is equivalent to inflateEnd followed by inflateInit, - but does not free and reallocate all the internal decompression state. The - stream will keep attributes that may have been set by inflateInit2. - - inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being Z_NULL). -*/ - -ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, - int windowBits)); -/* - This function is the same as inflateReset, but it also permits changing - the wrap and window size requests. The windowBits parameter is interpreted - the same as it is for inflateInit2. - - inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being Z_NULL), or if - the windowBits parameter is invalid. -*/ - -ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, - int bits, - int value)); -/* - This function inserts bits in the inflate input stream. The intent is - that this function is used to start inflating at a bit position in the - middle of a byte. The provided bits will be used before any bytes are used - from next_in. This function should only be used with raw inflate, and - should be used before the first inflate() call after inflateInit2() or - inflateReset(). bits must be less than or equal to 16, and that many of the - least significant bits of value will be inserted in the input. - - If bits is negative, then the input stream bit buffer is emptied. Then - inflatePrime() can be called again to put bits in the buffer. This is used - to clear out bits leftover after feeding inflate a block description prior - to feeding inflate codes. - - inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); -/* - This function returns two values, one in the lower 16 bits of the return - value, and the other in the remaining upper bits, obtained by shifting the - return value down 16 bits. If the upper value is -1 and the lower value is - zero, then inflate() is currently decoding information outside of a block. - If the upper value is -1 and the lower value is non-zero, then inflate is in - the middle of a stored block, with the lower value equaling the number of - bytes from the input remaining to copy. If the upper value is not -1, then - it is the number of bits back from the current bit position in the input of - the code (literal or length/distance pair) currently being processed. In - that case the lower value is the number of bytes already emitted for that - code. - - A code is being processed if inflate is waiting for more input to complete - decoding of the code, or if it has completed decoding but is waiting for - more output space to write the literal or match data. - - inflateMark() is used to mark locations in the input data for random - access, which may be at bit positions, and to note those cases where the - output of a code may span boundaries of random access blocks. The current - location in the input stream can be determined from avail_in and data_type - as noted in the description for the Z_BLOCK flush parameter for inflate. - - inflateMark returns the value noted above or -1 << 16 if the provided - source stream state was inconsistent. -*/ - -ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, - gz_headerp head)); -/* - inflateGetHeader() requests that gzip header information be stored in the - provided gz_header structure. inflateGetHeader() may be called after - inflateInit2() or inflateReset(), and before the first call of inflate(). - As inflate() processes the gzip stream, head->done is zero until the header - is completed, at which time head->done is set to one. If a zlib stream is - being decoded, then head->done is set to -1 to indicate that there will be - no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be - used to force inflate() to return immediately after header processing is - complete and before any actual data is decompressed. - - The text, time, xflags, and os fields are filled in with the gzip header - contents. hcrc is set to true if there is a header CRC. (The header CRC - was valid if done is set to one.) If extra is not Z_NULL, then extra_max - contains the maximum number of bytes to write to extra. Once done is true, - extra_len contains the actual extra field length, and extra contains the - extra field, or that field truncated if extra_max is less than extra_len. - If name is not Z_NULL, then up to name_max characters are written there, - terminated with a zero unless the length is greater than name_max. If - comment is not Z_NULL, then up to comm_max characters are written there, - terminated with a zero unless the length is greater than comm_max. When any - of extra, name, or comment are not Z_NULL and the respective field is not - present in the header, then that field is set to Z_NULL to signal its - absence. This allows the use of deflateSetHeader() with the returned - structure to duplicate the header. However if those fields are set to - allocated memory, then the application will need to save those pointers - elsewhere so that they can be eventually freed. - - If inflateGetHeader is not used, then the header information is simply - discarded. The header is always checked for validity, including the header - CRC if present. inflateReset() will reset the process to discard the header - information. The application would need to call inflateGetHeader() again to - retrieve the header from the next gzip stream. - - inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -/* -ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, - unsigned char FAR *window)); - - Initialize the internal stream state for decompression using inflateBack() - calls. The fields zalloc, zfree and opaque in strm must be initialized - before the call. If zalloc and zfree are Z_NULL, then the default library- - derived memory allocation routines are used. windowBits is the base two - logarithm of the window size, in the range 8..15. window is a caller - supplied buffer of that size. Except for special applications where it is - assured that deflate was used with small window sizes, windowBits must be 15 - and a 32K byte window must be supplied to be able to decompress general - deflate streams. - - See inflateBack() for the usage of these routines. - - inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of - the paramaters are invalid, Z_MEM_ERROR if the internal state could not be - allocated, or Z_VERSION_ERROR if the version of the library does not match - the version of the header file. -*/ - -typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); -typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); - -ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, - in_func in, void FAR *in_desc, - out_func out, void FAR *out_desc)); -/* - inflateBack() does a raw inflate with a single call using a call-back - interface for input and output. This is more efficient than inflate() for - file i/o applications in that it avoids copying between the output and the - sliding window by simply making the window itself the output buffer. This - function trusts the application to not change the output buffer passed by - the output function, at least until inflateBack() returns. - - inflateBackInit() must be called first to allocate the internal state - and to initialize the state with the user-provided window buffer. - inflateBack() may then be used multiple times to inflate a complete, raw - deflate stream with each call. inflateBackEnd() is then called to free the - allocated state. - - A raw deflate stream is one with no zlib or gzip header or trailer. - This routine would normally be used in a utility that reads zip or gzip - files and writes out uncompressed files. The utility would decode the - header and process the trailer on its own, hence this routine expects only - the raw deflate stream to decompress. This is different from the normal - behavior of inflate(), which expects either a zlib or gzip header and - trailer around the deflate stream. - - inflateBack() uses two subroutines supplied by the caller that are then - called by inflateBack() for input and output. inflateBack() calls those - routines until it reads a complete deflate stream and writes out all of the - uncompressed data, or until it encounters an error. The function's - parameters and return types are defined above in the in_func and out_func - typedefs. inflateBack() will call in(in_desc, &buf) which should return the - number of bytes of provided input, and a pointer to that input in buf. If - there is no input available, in() must return zero--buf is ignored in that - case--and inflateBack() will return a buffer error. inflateBack() will call - out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() - should return zero on success, or non-zero on failure. If out() returns - non-zero, inflateBack() will return with an error. Neither in() nor out() - are permitted to change the contents of the window provided to - inflateBackInit(), which is also the buffer that out() uses to write from. - The length written by out() will be at most the window size. Any non-zero - amount of input may be provided by in(). - - For convenience, inflateBack() can be provided input on the first call by - setting strm->next_in and strm->avail_in. If that input is exhausted, then - in() will be called. Therefore strm->next_in must be initialized before - calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called - immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in - must also be initialized, and then if strm->avail_in is not zero, input will - initially be taken from strm->next_in[0 .. strm->avail_in - 1]. - - The in_desc and out_desc parameters of inflateBack() is passed as the - first parameter of in() and out() respectively when they are called. These - descriptors can be optionally used to pass any information that the caller- - supplied in() and out() functions need to do their job. - - On return, inflateBack() will set strm->next_in and strm->avail_in to - pass back any unused input that was provided by the last in() call. The - return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR - if in() or out() returned an error, Z_DATA_ERROR if there was a format error - in the deflate stream (in which case strm->msg is set to indicate the nature - of the error), or Z_STREAM_ERROR if the stream was not properly initialized. - In the case of Z_BUF_ERROR, an input or output error can be distinguished - using strm->next_in which will be Z_NULL only if in() returned an error. If - strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning - non-zero. (in() will always be called before out(), so strm->next_in is - assured to be defined if out() returns non-zero.) Note that inflateBack() - cannot return Z_OK. -*/ - -ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); -/* - All memory allocated by inflateBackInit() is freed. - - inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream - state was inconsistent. -*/ - -ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); -/* Return flags indicating compile-time options. - - Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: - 1.0: size of uInt - 3.2: size of uLong - 5.4: size of voidpf (pointer) - 7.6: size of z_off_t - - Compiler, assembler, and debug options: - 8: DEBUG - 9: ASMV or ASMINF -- use ASM code - 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention - 11: 0 (reserved) - - One-time table building (smaller code, but not thread-safe if true): - 12: BUILDFIXED -- build static block decoding tables when needed - 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed - 14,15: 0 (reserved) - - Library content (indicates missing functionality): - 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking - deflate code when not needed) - 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect - and decode gzip streams (to avoid linking crc code) - 18-19: 0 (reserved) - - Operation variations (changes in library functionality): - 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate - 21: FASTEST -- deflate algorithm with only one, lowest compression level - 22,23: 0 (reserved) - - The sprintf variant used by gzprintf (zero is best): - 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format - 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! - 26: 0 = returns value, 1 = void -- 1 means inferred string length returned - - Remainder: - 27-31: 0 (reserved) - */ - - - /* utility functions */ - -/* - The following utility functions are implemented on top of the basic - stream-oriented functions. To simplify the interface, some default options - are assumed (compression level and memory usage, standard memory allocation - functions). The source code of these utility functions can be modified if - you need special options. -*/ - -ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); -/* - Compresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total size - of the destination buffer, which must be at least the value returned by - compressBound(sourceLen). Upon exit, destLen is the actual size of the - compressed buffer. - - compress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer. -*/ - -ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen, - int level)); -/* - Compresses the source buffer into the destination buffer. The level - parameter has the same meaning as in deflateInit. sourceLen is the byte - length of the source buffer. Upon entry, destLen is the total size of the - destination buffer, which must be at least the value returned by - compressBound(sourceLen). Upon exit, destLen is the actual size of the - compressed buffer. - - compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_BUF_ERROR if there was not enough room in the output buffer, - Z_STREAM_ERROR if the level parameter is invalid. -*/ - -ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); -/* - compressBound() returns an upper bound on the compressed size after - compress() or compress2() on sourceLen bytes. It would be used before a - compress() or compress2() call to allocate the destination buffer. -*/ - -ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); -/* - Decompresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total size - of the destination buffer, which must be large enough to hold the entire - uncompressed data. (The size of the uncompressed data must have been saved - previously by the compressor and transmitted to the decompressor by some - mechanism outside the scope of this compression library.) Upon exit, destLen - is the actual size of the uncompressed buffer. - - uncompress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. -*/ - - - /* gzip file access functions */ - -/* - This library supports reading and writing files in gzip (.gz) format with - an interface similar to that of stdio, using the functions that start with - "gz". The gzip format is different from the zlib format. gzip is a gzip - wrapper, documented in RFC 1952, wrapped around a deflate stream. -*/ - -typedef voidp gzFile; /* opaque gzip file descriptor */ - -/* -ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); - - Opens a gzip (.gz) file for reading or writing. The mode parameter is as - in fopen ("rb" or "wb") but can also include a compression level ("wb9") or - a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only - compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' - for fixed code compression as in "wb9F". (See the description of - deflateInit2 for more information about the strategy parameter.) Also "a" - can be used instead of "w" to request that the gzip stream that will be - written be appended to the file. "+" will result in an error, since reading - and writing to the same gzip file is not supported. - - gzopen can be used to read a file which is not in gzip format; in this - case gzread will directly read from the file without decompression. - - gzopen returns NULL if the file could not be opened, if there was - insufficient memory to allocate the gzFile state, or if an invalid mode was - specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). - errno can be checked to determine if the reason gzopen failed was that the - file could not be opened. -*/ - -ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); -/* - gzdopen associates a gzFile with the file descriptor fd. File descriptors - are obtained from calls like open, dup, creat, pipe or fileno (if the file - has been previously opened with fopen). The mode parameter is as in gzopen. - - The next call of gzclose on the returned gzFile will also close the file - descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor - fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, - mode);. The duplicated descriptor should be saved to avoid a leak, since - gzdopen does not close fd if it fails. - - gzdopen returns NULL if there was insufficient memory to allocate the - gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not - provided, or '+' was provided), or if fd is -1. The file descriptor is not - used until the next gz* read, write, seek, or close operation, so gzdopen - will not detect if fd is invalid (unless fd is -1). -*/ - -ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); -/* - Set the internal buffer size used by this library's functions. The - default buffer size is 8192 bytes. This function must be called after - gzopen() or gzdopen(), and before any other calls that read or write the - file. The buffer memory allocation is always deferred to the first read or - write. Two buffers are allocated, either both of the specified size when - writing, or one of the specified size and the other twice that size when - reading. A larger buffer size of, for example, 64K or 128K bytes will - noticeably increase the speed of decompression (reading). - - The new buffer size also affects the maximum length for gzprintf(). - - gzbuffer() returns 0 on success, or -1 on failure, such as being called - too late. -*/ - -ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); -/* - Dynamically update the compression level or strategy. See the description - of deflateInit2 for the meaning of these parameters. - - gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not - opened for writing. -*/ - -ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); -/* - Reads the given number of uncompressed bytes from the compressed file. If - the input file was not in gzip format, gzread copies the given number of - bytes into the buffer. - - After reaching the end of a gzip stream in the input, gzread will continue - to read, looking for another gzip stream, or failing that, reading the rest - of the input file directly without decompression. The entire input file - will be read if gzread is called until it returns less than the requested - len. - - gzread returns the number of uncompressed bytes actually read, less than - len for end of file, or -1 for error. -*/ - -ZEXTERN int ZEXPORT gzwrite OF((gzFile file, - voidpc buf, unsigned len)); -/* - Writes the given number of uncompressed bytes into the compressed file. - gzwrite returns the number of uncompressed bytes written or 0 in case of - error. -*/ - -ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); -/* - Converts, formats, and writes the arguments to the compressed file under - control of the format string, as in fprintf. gzprintf returns the number of - uncompressed bytes actually written, or 0 in case of error. The number of - uncompressed bytes written is limited to 8191, or one less than the buffer - size given to gzbuffer(). The caller should assure that this limit is not - exceeded. If it is exceeded, then gzprintf() will return an error (0) with - nothing written. In this case, there may also be a buffer overflow with - unpredictable consequences, which is possible only if zlib was compiled with - the insecure functions sprintf() or vsprintf() because the secure snprintf() - or vsnprintf() functions were not available. This can be determined using - zlibCompileFlags(). -*/ - -ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); -/* - Writes the given null-terminated string to the compressed file, excluding - the terminating null character. - - gzputs returns the number of characters written, or -1 in case of error. -*/ - -ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); -/* - Reads bytes from the compressed file until len-1 characters are read, or a - newline character is read and transferred to buf, or an end-of-file - condition is encountered. If any characters are read or if len == 1, the - string is terminated with a null character. If no characters are read due - to an end-of-file or len < 1, then the buffer is left untouched. - - gzgets returns buf which is a null-terminated string, or it returns NULL - for end-of-file or in case of error. If there was an error, the contents at - buf are indeterminate. -*/ - -ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); -/* - Writes c, converted to an unsigned char, into the compressed file. gzputc - returns the value that was written, or -1 in case of error. -*/ - -ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); -/* - Reads one byte from the compressed file. gzgetc returns this byte or -1 - in case of end of file or error. -*/ - -ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); -/* - Push one character back onto the stream to be read as the first character - on the next read. At least one character of push-back is allowed. - gzungetc() returns the character pushed, or -1 on failure. gzungetc() will - fail if c is -1, and may fail if a character has been pushed but not read - yet. If gzungetc is used immediately after gzopen or gzdopen, at least the - output buffer size of pushed characters is allowed. (See gzbuffer above.) - The pushed character will be discarded if the stream is repositioned with - gzseek() or gzrewind(). -*/ - -ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); -/* - Flushes all pending output into the compressed file. The parameter flush - is as in the deflate() function. The return value is the zlib error number - (see function gzerror below). gzflush is only permitted when writing. - - If the flush parameter is Z_FINISH, the remaining data is written and the - gzip stream is completed in the output. If gzwrite() is called again, a new - gzip stream will be started in the output. gzread() is able to read such - concatented gzip streams. - - gzflush should be called only when strictly necessary because it will - degrade compression if called too often. -*/ - -/* -ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, - z_off_t offset, int whence)); - - Sets the starting position for the next gzread or gzwrite on the given - compressed file. The offset represents a number of bytes in the - uncompressed data stream. The whence parameter is defined as in lseek(2); - the value SEEK_END is not supported. - - If the file is opened for reading, this function is emulated but can be - extremely slow. If the file is opened for writing, only forward seeks are - supported; gzseek then compresses a sequence of zeroes up to the new - starting position. - - gzseek returns the resulting offset location as measured in bytes from - the beginning of the uncompressed stream, or -1 in case of error, in - particular if the file is opened for writing and the new starting position - would be before the current position. -*/ - -ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); -/* - Rewinds the given file. This function is supported only for reading. - - gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) -*/ - -/* -ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); - - Returns the starting position for the next gzread or gzwrite on the given - compressed file. This position represents a number of bytes in the - uncompressed data stream, and is zero when starting, even if appending or - reading a gzip stream from the middle of a file using gzdopen(). - - gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) -*/ - -/* -ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); - - Returns the current offset in the file being read or written. This offset - includes the count of bytes that precede the gzip stream, for example when - appending or when using gzdopen() for reading. When reading, the offset - does not include as yet unused buffered input. This information can be used - for a progress indicator. On error, gzoffset() returns -1. -*/ - -ZEXTERN int ZEXPORT gzeof OF((gzFile file)); -/* - Returns true (1) if the end-of-file indicator has been set while reading, - false (0) otherwise. Note that the end-of-file indicator is set only if the - read tried to go past the end of the input, but came up short. Therefore, - just like feof(), gzeof() may return false even if there is no more data to - read, in the event that the last read request was for the exact number of - bytes remaining in the input file. This will happen if the input file size - is an exact multiple of the buffer size. - - If gzeof() returns true, then the read functions will return no more data, - unless the end-of-file indicator is reset by gzclearerr() and the input file - has grown since the previous end of file was detected. -*/ - -ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); -/* - Returns true (1) if file is being copied directly while reading, or false - (0) if file is a gzip stream being decompressed. This state can change from - false to true while reading the input file if the end of a gzip stream is - reached, but is followed by data that is not another gzip stream. - - If the input file is empty, gzdirect() will return true, since the input - does not contain a gzip stream. - - If gzdirect() is used immediately after gzopen() or gzdopen() it will - cause buffers to be allocated to allow reading the file to determine if it - is a gzip file. Therefore if gzbuffer() is used, it should be called before - gzdirect(). -*/ - -ZEXTERN int ZEXPORT gzclose OF((gzFile file)); -/* - Flushes all pending output if necessary, closes the compressed file and - deallocates the (de)compression state. Note that once file is closed, you - cannot call gzerror with file, since its structures have been deallocated. - gzclose must not be called more than once on the same file, just as free - must not be called more than once on the same allocation. - - gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a - file operation error, or Z_OK on success. -*/ - -ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); -ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); -/* - Same as gzclose(), but gzclose_r() is only for use when reading, and - gzclose_w() is only for use when writing or appending. The advantage to - using these instead of gzclose() is that they avoid linking in zlib - compression or decompression code that is not used when only reading or only - writing respectively. If gzclose() is used, then both compression and - decompression code will be included the application when linking to a static - zlib library. -*/ - -ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); -/* - Returns the error message for the last error which occurred on the given - compressed file. errnum is set to zlib error number. If an error occurred - in the file system and not in the compression library, errnum is set to - Z_ERRNO and the application may consult errno to get the exact error code. - - The application must not modify the returned string. Future calls to - this function may invalidate the previously returned string. If file is - closed, then the string previously returned by gzerror will no longer be - available. - - gzerror() should be used to distinguish errors from end-of-file for those - functions above that do not distinguish those cases in their return values. -*/ - -ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); -/* - Clears the error and end-of-file flags for file. This is analogous to the - clearerr() function in stdio. This is useful for continuing to read a gzip - file that is being written concurrently. -*/ - - - /* checksum functions */ - -/* - These functions are not related to compression but are exported - anyway because they might be useful in applications using the compression - library. -*/ - -ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); -/* - Update a running Adler-32 checksum with the bytes buf[0..len-1] and - return the updated checksum. If buf is Z_NULL, this function returns the - required initial value for the checksum. - - An Adler-32 checksum is almost as reliable as a CRC32 but can be computed - much faster. - - Usage example: - - uLong adler = adler32(0L, Z_NULL, 0); - - while (read_buffer(buffer, length) != EOF) { - adler = adler32(adler, buffer, length); - } - if (adler != original_adler) error(); -*/ - -/* -ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, - z_off_t len2)); - - Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 - and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for - each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of - seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. -*/ - -ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); -/* - Update a running CRC-32 with the bytes buf[0..len-1] and return the - updated CRC-32. If buf is Z_NULL, this function returns the required - initial value for the for the crc. Pre- and post-conditioning (one's - complement) is performed within this function so it shouldn't be done by the - application. - - Usage example: - - uLong crc = crc32(0L, Z_NULL, 0); - - while (read_buffer(buffer, length) != EOF) { - crc = crc32(crc, buffer, length); - } - if (crc != original_crc) error(); -*/ - -/* -ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); - - Combine two CRC-32 check values into one. For two sequences of bytes, - seq1 and seq2 with lengths len1 and len2, CRC-32 check values were - calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 - check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and - len2. -*/ - - - /* various hacks, don't look :) */ - -/* deflateInit and inflateInit are macros to allow checking the zlib version - * and the compiler's view of z_stream: - */ -ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, - int windowBits, int memLevel, - int strategy, const char *version, - int stream_size)); -ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, - unsigned char FAR *window, - const char *version, - int stream_size)); -#define deflateInit(strm, level) \ - deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) -#define inflateInit(strm) \ - inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) -#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ - deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ - (strategy), ZLIB_VERSION, sizeof(z_stream)) -#define inflateInit2(strm, windowBits) \ - inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) -#define inflateBackInit(strm, windowBits, window) \ - inflateBackInit_((strm), (windowBits), (window), \ - ZLIB_VERSION, sizeof(z_stream)) - -#ifdef _LARGEFILE64_SOURCE - ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); - ZEXTERN off64_t ZEXPORT gzseek64 OF((gzFile, off64_t, int)); - ZEXTERN off64_t ZEXPORT gztell64 OF((gzFile)); - ZEXTERN off64_t ZEXPORT gzoffset64 OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, off64_t)); - ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, off64_t)); -#endif - -#if !defined(ZLIB_INTERNAL) && _FILE_OFFSET_BITS == 64 -# define gzopen gzopen64 -# define gzseek gzseek64 -# define gztell gztell64 -# define gzoffset gzoffset64 -# define adler32_combine adler32_combine64 -# define crc32_combine crc32_combine64 -# ifndef _LARGEFILE64_SOURCE - ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); - ZEXTERN off_t ZEXPORT gzseek64 OF((gzFile, off_t, int)); - ZEXTERN off_t ZEXPORT gztell64 OF((gzFile)); - ZEXTERN off_t ZEXPORT gzoffset64 OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, off_t)); - ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, off_t)); -# endif -#else - ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); - ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); - ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); - ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); -#endif - -#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) - struct internal_state {int dummy;}; /* hack for buggy compilers */ -#endif - -ZEXTERN const char * ZEXPORT zError OF((int)); -ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); -ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); -ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); - -#ifdef __cplusplus -} -#endif - -#endif /* ZLIB_H */ diff --git a/Source/SPFileHandle.m b/Source/SPFileHandle.m index 49bcd4a4f..8cc6bed41 100644 --- a/Source/SPFileHandle.m +++ b/Source/SPFileHandle.m @@ -29,8 +29,8 @@ // More info at #import "SPFileHandle.h" -#import "zlib.1.2.4.h" #import "bzlib.h" +#import "zlib.h" #import "pthread.h" // Define the maximum size of the background write buffer before the writing thread diff --git a/sequel-pro.xcodeproj/project.pbxproj b/sequel-pro.xcodeproj/project.pbxproj index aaca3759b..1ddbc8ded 100644 --- a/sequel-pro.xcodeproj/project.pbxproj +++ b/sequel-pro.xcodeproj/project.pbxproj @@ -171,6 +171,7 @@ 384582C40FB95FF800DDACB6 /* func-small.png in Resources */ = {isa = PBXBuildFile; fileRef = 384582C30FB95FF800DDACB6 /* func-small.png */; }; 384582C70FB9603600DDACB6 /* proc-small.png in Resources */ = {isa = PBXBuildFile; fileRef = 384582C60FB9603600DDACB6 /* proc-small.png */; }; 387BBBA80FBCB6CB00B31746 /* SPTableRelations.m in Sources */ = {isa = PBXBuildFile; fileRef = 387BBBA70FBCB6CB00B31746 /* SPTableRelations.m */; }; + 38C613731C8977E600B3B6EF /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 38C613721C8977E600B3B6EF /* libz.tbd */; }; 4D90B79A101E0CDF00D116A1 /* SPUserManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D90B799101E0CDF00D116A1 /* SPUserManager.m */; }; 4D90B79E101E0CF200D116A1 /* SPUserManager.xcdatamodel in Sources */ = {isa = PBXBuildFile; fileRef = 4D90B79B101E0CF200D116A1 /* SPUserManager.xcdatamodel */; }; 4D90B79F101E0CF200D116A1 /* SPUserMO.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D90B79D101E0CF200D116A1 /* SPUserMO.m */; }; @@ -923,6 +924,8 @@ 384582C60FB9603600DDACB6 /* proc-small.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "proc-small.png"; sourceTree = ""; }; 387BBBA60FBCB6CB00B31746 /* SPTableRelations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPTableRelations.h; sourceTree = ""; }; 387BBBA70FBCB6CB00B31746 /* SPTableRelations.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPTableRelations.m; sourceTree = ""; }; + 38C613701C89777B00B3B6EF /* libz.1.2.5.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.1.2.5.tbd; path = usr/lib/libz.1.2.5.tbd; sourceTree = SDKROOT; }; + 38C613721C8977E600B3B6EF /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; 38F37194182F0621008EB031 /* readme.md */ = {isa = PBXFileReference; lastKnownFileType = text; path = readme.md; sourceTree = ""; }; 4D90B798101E0CDF00D116A1 /* SPUserManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPUserManager.h; sourceTree = ""; }; 4D90B799101E0CDF00D116A1 /* SPUserManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPUserManager.m; sourceTree = ""; }; @@ -1034,7 +1037,6 @@ 582F02301370B52600B30621 /* SPExportFileNameTokenObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPExportFileNameTokenObject.m; sourceTree = ""; }; 583CA21312EC8B2200C9E763 /* SPWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPWindow.h; sourceTree = ""; }; 583CA21412EC8B2200C9E763 /* SPWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPWindow.m; sourceTree = ""; }; - 583CE39C11722B84008F148E /* zlib.1.2.4.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = zlib.1.2.4.h; path = Frameworks/zlib/zlib.1.2.4.h; sourceTree = SOURCE_ROOT; }; 584094CC1107BD0500260CFD /* SPAlertSheets.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPAlertSheets.h; sourceTree = ""; }; 584095181107CB6600260CFD /* SPAlertSheets.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPAlertSheets.m; sourceTree = ""; }; 5841423D0F97E11000A34B47 /* NoodleLineNumberView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NoodleLineNumberView.h; sourceTree = ""; }; @@ -1376,6 +1378,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 38C613731C8977E600B3B6EF /* libz.tbd in Frameworks */, 503CDBB21ACDC204004F8A2F /* Quartz.framework in Frameworks */, 17AED4161888BD67008E380F /* Security.framework in Frameworks */, 296DC8BF0F9091DF002A3258 /* libicucore.dylib in Frameworks */, @@ -1463,14 +1466,6 @@ name = "Table Triggers"; sourceTree = ""; }; - 170DBD5815BEBE39007E95AB /* zlib */ = { - isa = PBXGroup; - children = ( - 583CE39C11722B84008F148E /* zlib.1.2.4.h */, - ); - name = zlib; - sourceTree = ""; - }; 171312CF109D23CA00FB465F /* Cells */ = { isa = PBXGroup; children = ( @@ -1938,7 +1933,6 @@ 584D88A81515034200F24774 /* NSNotificationCenterThreadingAdditions.m */, 5841929F101E57BB0089807F /* NSMutableArray-MultipleSort.h */, 584192A0101E57BB0089807F /* NSMutableArray-MultipleSort.m */, - 170DBD5815BEBE39007E95AB /* zlib */, 17DC8826126B22F200E9AAEC /* Views */, 58B909A111C3B8EC000826E5 /* Localization */, 177486451528EE820036121C /* RegexKitLite */, @@ -2024,7 +2018,7 @@ isa = PBXGroup; children = ( 17E5955314F304000054EE08 /* QueryKit.framework */, - 17E596A214F307CE0054EE08 /* Tests.octest */, + 17E596A214F307CE0054EE08 /* Tests.xctest */, ); name = Products; sourceTree = ""; @@ -2421,6 +2415,8 @@ 2A37F4C3FDCFA73011CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( + 38C613721C8977E600B3B6EF /* libz.tbd */, + 38C613701C89777B00B3B6EF /* libz.1.2.5.tbd */, 1058C7A6FEA54F5311CA2CBB /* Linked Frameworks */, ); name = Frameworks; @@ -2904,10 +2900,10 @@ remoteRef = 17E5955214F304000054EE08 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - 17E596A214F307CE0054EE08 /* Tests.octest */ = { + 17E596A214F307CE0054EE08 /* Tests.xctest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; - path = Tests.octest; + path = Tests.xctest; remoteRef = 17E596A114F307CE0054EE08 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -4050,7 +4046,7 @@ INSTALL_PATH = "$(HOME)/Applications"; LIBRARY_SEARCH_PATHS = "$(SRCROOT)/Frameworks/zlib"; MACOSX_DEPLOYMENT_TARGET = 10.6; - OTHER_LDFLAGS = "$(SRCROOT)/Frameworks/zlib/libz.a"; + OTHER_LDFLAGS = ""; PRODUCT_NAME = "Sequel Pro"; SEPARATE_STRIP = NO; }; @@ -4250,7 +4246,7 @@ INSTALL_PATH = "$(HOME)/Applications"; LIBRARY_SEARCH_PATHS = "$(SRCROOT)/Frameworks/zlib"; MACOSX_DEPLOYMENT_TARGET = 10.6; - OTHER_LDFLAGS = "$(SRCROOT)/Frameworks/zlib/libz.a"; + OTHER_LDFLAGS = ""; PRODUCT_NAME = "Sequel Pro"; SEPARATE_STRIP = NO; }; @@ -4274,7 +4270,7 @@ INSTALL_PATH = "$(HOME)/Applications"; LIBRARY_SEARCH_PATHS = "$(SRCROOT)/Frameworks/zlib"; MACOSX_DEPLOYMENT_TARGET = 10.6; - OTHER_LDFLAGS = "$(SRCROOT)/Frameworks/zlib/libz.a"; + OTHER_LDFLAGS = ""; PRODUCT_NAME = "Sequel Pro"; SEPARATE_STRIP = NO; }; From 80b2af8b69ce90ac334e04a8eb6f510cddc5670f Mon Sep 17 00:00:00 2001 From: Abhi Beckert Date: Fri, 4 Mar 2016 18:45:21 +1000 Subject: [PATCH 21/22] Bump version number --- Resources/Plists/Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Plists/Info.plist b/Resources/Plists/Info.plist index 278ded518..6ec8ccfee 100644 --- a/Resources/Plists/Info.plist +++ b/Resources/Plists/Info.plist @@ -162,7 +162,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.1 + 1.2 Snapshot CFBundleURLTypes From 96619853ae80f40e34c53105f08f79e89bb9df13 Mon Sep 17 00:00:00 2001 From: Abhi Beckert Date: Sat, 5 Mar 2016 08:07:16 +1000 Subject: [PATCH 22/22] Restore bundled zlib (#1972) --- Frameworks/zlib/libz.a | Bin 0 -> 317564 bytes Frameworks/zlib/zlib.1.2.4.h | 1605 ++++++++++++++++++++++++++ Source/SPFileHandle.m | 2 +- sequel-pro.xcodeproj/project.pbxproj | 20 +- 4 files changed, 1621 insertions(+), 6 deletions(-) create mode 100644 Frameworks/zlib/libz.a create mode 100644 Frameworks/zlib/zlib.1.2.4.h diff --git a/Frameworks/zlib/libz.a b/Frameworks/zlib/libz.a new file mode 100644 index 0000000000000000000000000000000000000000..08144dda0025c1de6c128996221d8277ce8a04ce GIT binary patch literal 317564 zcmdq~cUV(R^EeJ~LV$!W21F@FL8KQ820;jjNK;XQB7*cD0TCr&0->nbK`f{U*u{ca zP!vSPF5Ze2v7lJ7f{Go;Z}#Lw(cAm^+|Tp9uJ?~OUdP!wJ3BiwJG*E1aIyPnEkZ~J z9(8!|&jnGIX#u3dBM*-Z!~+l|ok*id(`1yA5#V!tek3$UNTmwWN088&gcA|!9SrGy zB#a{A0)#jXke)}vViN8m;b9VF^qXY5lB6CL_)OqigD4b?7y5ZK7+@3$ zQ%G1!=IBV(5LA>VIw#DI4~J+{7)D2cpU8fRVpLHP$+%2Va!4o-8Viqzv43Nmk z5|tJ@ zJ2Dbi#+eZzNsx}i;R%Tm@i-8X5J>=O@r1}of~Kf6Nr+%mnzS^Al9Z%~lo-r|sI*xT z5phx|$xDvl@o)-;k`#ijAW6$HNfBWLvB3Q>Tnr#EC@L)px{2ZJcxjHLS_)2#D@#_)CV+eyrrUXTX z%mNb0*pGlj0?5>!7{>k_BQjSi6Fs6o(T@vB`biBb5oAG9B6`M#{Am9-0U-(z#RI^5BoRx!94h{ewOnPg&Re4 zIKENb!41oC5Y(FTImO667g`jEMlwxv#O<67NXgzsEM{jRRe?)CrfC+L<_u}hNR`VG z=?RcN-wnwyEprGWDNe;QbkliA)oBA_3Cd))K|2WW8n_`eEEp)1KBn_D_ClFpH$+*9 z({Q`&97GX3r!oa$Bbm-f+-|ynY;P>I_Xw%lBawVC63rCIAWbe>+|6aMY`9dQ!ClQ; z;0*PgwY<5`5P#SkXrhW7OGWZw$3!#Ph%(Kt`K7mDi9TPzkl9AG2ebAZ(e@L|qk0n5e64y9B98;?6)j(2quva0m%aNH~dv{u21mgDD6lcw{de+^Q)I zYt=L@*4WF=(Wvk>Ufk^)2agfU#&@7d&o>reF!00;c%*=UPf!>7A$Y|076fZ~J8kHG zVyTCa(>jWqX)#iTF@M6IE^g;Kw>ZEUQv~iZ+wj;dG(Z%)W^wz%aNw5<@QVigI*k+w zUOnl-D}x@q3h%)ymma*L_2AW$9=tLDIV1Q0yb6bLAi}^a7o;rZ6SS)WazgU$cYcxl zK~jE^eErEUwxq8}C*y*oU%$(oRK|p1NK+t>G%+u+tocTRtSLz3%{K=4>7nK=G;$;4 zPH0T>GX~@j^BURl1u`=HYS1n4@L5>i1a#`QKr-$;{Cm>I# z%@=GoS5 z2Am2=QyA*cv^yq#H>D`YA!D%{$~g9j$(32$ow23Wn;QyrW4fp?{-_^Q5bW(O5cXp_ z6(b#cPqElG6sejnCUuRBgHuciM&g!?Y{Vh#z-VzdI~3`eW|QScgHA#{_5kF~4HM~! zpihFZY5Z#3N4m^5X}^P!MCbpz{(t}fi~fW8E&}s>9Uc-Qit0~GJy;T^!TJU%NWwBW ztox&g)X)B-e;pJwBOyFIX6WBC|NHsYdgu`8d@G&$drr9jFyHdfkNK7Y7UEAo3ar5? zx$pq|G2i0(>R-;c6qo~XeLN4!z!ZYi{=4}W*T+8@4gtvjL_Ox)prEi>$>6HOB8~X{ zeaHSZ0Ho*rH*S`YX(9I5P8KlgODX8U!Iiw4a zIx#;9g8MPCzDae=xdh3QHYSk`m@`_b+pygcxgcb>5xM2TV}BeL{wI-FUI^j}p4efV zln75WJUsSR%91=MDsBBEaXk3!5~1|Y|CtzAJVn?*pA?INDHwn zCgyu1yA$H?zyOwrf&y?}o({HaVkcZa7-+%|*p9r6Qy=(HhW;nJ@xS(mEfR}=?GLK? zwLjfQ{@$PNt$*)Ncm99wPxs7!(;sV#Ar`RN06$6|$OhO0yr)6H0FW6R2Uf{m--ReJ zT$HMfL|N3i8&QC3M7#!)I^j7XsfS8QxI|JP@g?<9bdUOGyAkq|#3@h?nZe^g+Mjj^ ztC3+AgnQa0;~(}1p&>oO+CRdu){w02rOS9S3QM3KYwe$l>mSL)VoX{Y+bL_(@DS#Q z*jK~rg5m$LF0dXxLQ+0hf!HG;jnw~cpNwxn*K-lV@PDyS46;79Po^-I$WVlX#wDpQfb-1&yC7DZkIP|yh_Fqt_Q2)Y!Qh8x z$uqGM1^(5Q%Alt<>W7>gk zqFqxZlo<)3bs5rjM?$;)@cb|B z_WOTm_vO!aF`qqrf8n!0;UO_rM1L7TvnPzzK%g1HSfNSa*L(1tQP&rc7a8!2c_1sD z5?N`l?I|l*{zM=zFs@i$It8KXl5zc?+7nmdc?jlN4qmt5_JlcM{Qo5Hf0K12ej*6d z`T}e9gTBtL4!)ez7QXJzdRU*ZAK~kKLItmN37V*ZJ!YDlP01wE5tk$TpE^~`RIxD)iu>!0)t^A10mfryr=i|B;Db%Czk2mkLF zVv06M^o@{pPhW|SfxL;_)j+p&kgt0W-2>UpjA4SVQTZYTEkfr2r&f*->l-P5SPpvN z$t3Y`0gqJw2zdZJSkFXMEr25leZ%qpjgBEd@>>J}b z6zl5B0o@I-Z>Gj6rn;EU2VZ*w)!rVxsj?k_4A>lSAX`vrFv@0u|I31Tv_IbO%5%qa z8QtF27|~!~t;3cBb_wzY9vll>V2osLMZ<)Q(La21%&$bi2lK0v2;MXbnn(8z`kCwlzsuORI2{pDW#lJ33p3lfy6Bnk(4@`bKG ze8JA4slbyz^?g{+z61Jy$Z+gs)U%WWlTIOKjU=Y#MqAI zFT%DCFAiU|S>mudPw!LjF6=JI*Rb@O!(tA)o_u-<<- zGSe-m)~UJQog2a#_n*A#xKTMV`}(|dy?KR`!{c_G=nDOswkYDlYbGUNLYN${>6_}P zu%&e6k9P5_^IkD(({BblJ=qjBGs#}&$yHCI=7a z*L>v+xy^e#=0U*hd$*LY?7BK?s$rAW?upH4xAngb4YR8Br{TK~$?Rcot` zZB;d*Ruu=y=F-n9HSOQ0_`<+4L9oCt+N;;e5ZzseBF#t5x#yHexjR#?@EWV8?WUT^ z%zg6~${nigUvm7(*4C;UL;3O-HmRbo!&WnPENf9I)XIoeuBOizWu70-Tk|X|fD#us zu|tO!5;`x!>h}9kG@d87>WwyK>)b4Q$H|YXr>8_zG@VsH{K9*2ZPm-pBe{am`??P_ z?wGqTxi0wd{f1Y>xcwo1BP%Cf-dux{Z&X`7@_4Y-Y1Hjija#mso^kzF$M?}OFJgzq zH+Alb%5}XHT-D%0GoLk7M)&DX1+Sp{%7P2tvNP=mQ=N9!DypenP-4xW5?winl`!wX zk;og2%OOunrZ<08F>bn0SkX{8@Lc1LgHsQT>SJ+GIrH$b0J{@Md3)YeWwX{DKX6Fq z&?BYfeb?5#ygAl(!?l#Xw7Z5Hv+ikTKMqq=Um0$fqdX(lAuZN_#}kz+iUkbu1_e|; zSSVk-uU)mkWdVKjH9gAv=oq=W?$4o90!0x~^?i9ZGvnjro_F8Sp0n_}=|i(=JhjaLiO*|+OXPk8Wt($(syciU>FL^)Q<-FMq> z<9S=z^v+%dZ7&-ck55jtwBQH9ZKrlbJ@B=TU)JUtQ=3{Ja$reKWOlzn3D-&|ML)8+ zq?EF%T5+t*K&s{uUs*%TGe_-e_a9RcTekk` z&01x_y|%-OcOMLxfBo8xcQ+n6N8dm2rT?Am_{>_(zdju?oR(0L(xP>EY)UTO|Cv}d zHZfAp?qV;BV!-l7>iB`kG>g+A9#w(S+EkMS)0GDmYe$??TDH+&_JOuJ zwQVWZ|GwJRPD5-$vrNr>PKEQ%(1a-+V? za)MH2dHT5GZ1ZIc3U#h{)TvMOY0_8YcO+g9X>(d(QQqh~qVgG2r?9e7Hall^mUiLP z^{7m%!u;FaGMoB!&r$*d#XO$Q4JXG3fBCBvugWplw4_Ai@%H_$tlF}akaw*u+gd*~ zJU`W(ZE)wz{)oW9@|`ZOC9e|VE*Z^9?256qjw@%G__ry_GtAU=*fSou+I%=0D8K(r zB6ns-T!dA%$%oIItm_Uf)XATnCto_OPf5*pm7JwV2bDFa+V5{;&-#!mj%{_TbvmOh z^lLV;Z%>^d`yw>mrEY@xg1cOuvnw?gQI@JybGGTXW*=ua)v-&@C=aOa@KRX4eR=Pt zt1ky!LX0tu)^73NLKmmB_*^_%9mw5W%G1bQ>Ub-EwaS|2#zOCNm&$s*ZuxfYP zq|nBIxYTF59ByUv)CoBynkwpksv7!z4cLiyM(I1PkLZfqE_mkuY)U<2(D(*+I3>S) zv(}=LM?<$?8eme>6}-owW$!`9hPNf^+2->Z`*|1K40bj6XuSNM?rQufA|=|=G4+#; zf!kqShITSd-DJ3@PtE&DZc7iOMl>e|r?*)@fA*ofyQ}W_&4zrzrTWrQ*^6wxt;?6M z-dDrr@7Nw;YnNTMGf?9cfZctm`1lJCp%8Vw*zmn@zmVEG6AN|rvpL&v) zc=C3NlW2`i2vjd#~IDjZ5>nE>b9@^)U^6$xqQuw!#YcM6j?XN%`<5; zxfqxF=6a&r?k|Db2`#QB7Lm<1Eg5IzOS!GwuyG$E22%Hbc&c4ix5X+aKgzhI)bPof z@~W=plCQTuTpD?$wQH`ZEUsqle*dohB@BmMIqVEG9fOMD@*3~-Ok9V^Tc^x&OKdqf zF|OfbnrpUASm6GY`frWnueCf={d%eL(!<7_rF&PadmLJ-uehN!@qA9T(?S{jK-Ye3 zp1ie&<7p!mm3dJU3Z2urWir00-%fai)@Nq2&-5?U@0fl-W&4Jm8msR;Z<)}?`&;_txsB$lLNDpuFkiZ;_psH~lloV;=F62fHB3+c@Oo@S-5#D> ze*A2oQp=I*Hm&*$`7*izH@25!gz4(-sZW;IxNY5%uN`@8k;&lq^)(M)H7wnDqN_Qy z=~;k^7e*K!$sMSj`{o36B`VU#MEniaen4%H?1or?OsG&<(YKS5OQXJ4(lJbE58(3uF6lO3~8`)-~3)RNUR~ zO~`t!T@UK|##DY(AO8M)@6UzeUi%EUsm=1r*Rc0zGP|wxHLI4T^+|g&jy=xxq3v?B zM!O3umW@>Wa>UW)t-Zti97X#RBPWfbdPmqy@8dV3NSHAE&MBK=T4faLDaUiHR^2=> zg4dR~W4Juo{eQ=v~x1ss83;LnsyatvIp38c+cHjVm4;m)?gGQ!DoBJDg z2D=(LD9kjUsncP0V9qIvkLTA}j@Yy(aoy4rGyR@_o~1XnJn7!hwJ8OIbmmN)V4B?L zUDE8E>&K)oyvNV*JTyV5OxF}#2_29sO5VbE)+HSm$^hM!lE+;T7Ww?{9TIy{>SqT>IWJobjJrvJ6f- z{WZjeqv|)y+5MTx=*3HPx$mOAeTPz`rp&H!n0)va!{^J1C6h+(to9Z#A5E-Hzv=(T zwsjiI=fTv-H}n0rEZ7(LDt}mj@pqZ&31j?&_E^qn8LlmQ_<82xNBge4eLQPx(=+=6 z0nfXe;+|GT4SABLEZb)2!G8OMrTThP@#Htb9U-ljkDk1ElY9NuE}KO!V*-wK^{#5~ zyn5|i_ZnWY*jKLXTR%0k@3+&mzZRc%{t{3=`vZF6_P#DVqdjMo;XBtUy*e09D?iqo zZvMP<)wfR*#D6vM1A}iL9Wmuj=R%dc4v%e{XMU`CaG+%I{f`5#-5cTgv@uTU_N}tW zwi|7?58X81pV<()g?6>{^3dzg5@W9!^b0&Qy<6>c(aOPR@0g^Y)8e?-O__Y@)GGV$ zC$DF1I?=0jRsFcVJ1#CiQ*!>o+_M)Hd%e5lBA@)%{28OKoVecaGWCdg{@&G`ycwM- zD@>g&3SJoXUA@hrXiYeG*Q$Xp->-ZqI#W_}?n`m{o-0M{-m5o!OWjylnP9LsMYi{P z>uQg6AFc|QE*x&P#4|{KnR3hYn5_jIjZD9-gXpNkIGfBDZQA6nt*3mUPBWag+ZHfO{{)#WyYpm|MCt=~)d2<@!E9#MxeZ zIP0&4`~SMDbU<~V-9C5K(2B(ozSWHbqmOF11y%Wck~@-LWL?v|=-@G(huO#dr{Ae9 z9QFq5e^pIX#7@Tf#p;!N-!2bbGi5|``;b9#LH9N^vX7iOXw)X8Pgs<2>|uB#WdX(G z*72(MvA6F(e2_BKFHCK+ci$-`ty`_WeN!u8I`956^TFH`=cCST-!nUjKKifA35Kio zWF(sR($a9;a`^iKt%l-$S6T;enzh`y;w)=7J#FlT(jj{tw3eNpreGIUxqks_u=Hlf zta%-zG;eDAqft-SEQpxD;OhO64-Z~hKEXd_sFCB#Cu;L2`K3JOyt%FXW#aMZcGE8# z-PV+x_8(|v@~C*qgbeqDPv<_;3vP0@3uknm&>CLSFn+22VbhY;T4x5EWRxE58rzrZ z#1g1=EMKw1t@ZPIrr#+29gcq1x_O5dZv1?mIp<33?u$EAYcu3qNTU@=e>ZV!yqR)lU&KWmVm3p}(6n^ZyF3x)! z>773L&IoOlBZJ2slI0j}sc1W^qm;Wj^KL~y+o;A2(`)?vg82R&c7~s2ve)HB=36@E z8W;GzIp`A1Rr(@ttv7DRgKh7w9PM85;I*qo)k5z2K2fg+CsJp&yH#KCvTVNlRb&-5 z=DBa2V`~mjF+C=wBU8I`yBydE1K#OkF20$1$jz?E@+$cyKR%a&ys zy(zwtH}UJftS6I$M*3Ng+`gQV-G6BOGv)aw>6Ih5%{azs*&^FH|70I`W6QlC$9oJJ zIOoHn;$Eu@O>6nAHBGwwjtibA+{!Jkbx}^lIz?{%yn4FM1QXlTz>?K#p6b7QKQ6AX z?8nCR;OC)NmjyK+dR50*HYu(0#fWI++SE`ppeFZ$^-HU;$;$`c`Wmt>wwNY=Y}>Kp zl#{pj9E`Wopfh}Qlg6*xdf8Zfc<%gOs^?mgSEx1pWwN_=2fJ@CSJBov`nS(U&JIqa zs3lz~@4h(e!uly&-VJQiT0ORFk8RnQUehnl8TVH1^1Fp$_goB@hJSHt{c4#y(WyXh zn2+JUJFnK=I)32m*%yjqHZJMgt`fS@D@NXa{lwaw!8UhSuUI?W!lK*Tkb7ipacgtu zlE9hj!&)>`%4{qy_gdt>OUCipnCk3I*5ilybEXA+>h1nwYS%koheBSK+<+SnAueYZ zU*4HMqU_483@3K{DZ@a)oP`HYUwnIOs_w0XmW}%qJ}~v3c|GzzxGP0v|B^@g} zpM~D&YYuMT`Rw7uX>)Zdps{( z?Xd29Rz#?fhDyk7ZS2k#WlhRp(7mE892ofxNc}4r}(hWH|$~^K=p3}WKax?Ez zYFO6_P1J6-Eu6P+X8+1Va$BDqFBy8Hs&&%^dH%4kNOjo`#%irXm6mGd*bMVgGw5r0 z;rWz+uxA|;0UTJ_`Eriuvf7l+kfR@E*R zXX2DR~ldS>wJlAK`fvK6w2QBOZjvd~^J9>hZ zUG?VBf#d6x9vzZdcWqy??bw?y_oiIipka8ImaTbjmbzlt;~cy2l@75ply~^YrYT-g zd9p#wC>UIh6!sO%3tb9S+ple=FNl6m(d(|0iwT?(`nf(TLNwEc*Y~+xT>KpE8{H30 zuP^jZyQ6l=<9<}agCk$Rw$&~hU3<9C&1DtAt($M%N-wy&@pRp7_N4a@CcKNPz8W>9 zX4`$aN=Hwd{cd+mm2Z1#EA0K`A!8GqMsqsV7W}~XLDY`6W%1UjwK1+s4usVA%Z{um zy_PV@=27&dRVhlBWX391AJL=^v^13Ut+hLP#z^tl{uTZQO=+#VOdR4y)V zGSe+@o>oy8zTWVC*z2Orv9lElW>CxI7)6dYDzD~6$tU%mf@HHij;~^-RXr*<-8Yx5 zeMo8jvTG}pYi~Y1+;ⅇK5zR8`rMScYbu^-IoLRqvNyh^#4nN1gfQ)U3 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≫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%0Ds+8q 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�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�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 T`KpModr4iSeakv~y+8g0FCN>_ literal 0 HcmV?d00001 diff --git a/Frameworks/zlib/zlib.1.2.4.h b/Frameworks/zlib/zlib.1.2.4.h new file mode 100644 index 000000000..f5785be7e --- /dev/null +++ b/Frameworks/zlib/zlib.1.2.4.h @@ -0,0 +1,1605 @@ +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.4, Mar 14th, 2010 + + Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt + (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). +*/ + +#ifndef ZLIB_H +#define ZLIB_H + +#include "zconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZLIB_VERSION "1.2.4" +#define ZLIB_VERNUM 0x1240 +#define ZLIB_VER_MAJOR 1 +#define ZLIB_VER_MINOR 2 +#define ZLIB_VER_REVISION 4 +#define ZLIB_VER_SUBREVISION 0 + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed data. + This version of the library supports only one compression method (deflation) + but other algorithms will be added later and will have the same stream + interface. + + Compression can be done in a single step if the buffers are large enough, + or can be done by repeated calls of the compression function. In the latter + case, the application must provide more input and/or consume the output + (providing more output space) before each call. + + The compressed data format used by default by the in-memory functions is + the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped + around a deflate stream, which is itself documented in RFC 1951. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio using the functions that start + with "gz". The gzip format is different from the zlib format. gzip is a + gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. + + This library can optionally read and write gzip streams in memory as well. + + The zlib format was designed to be compact and fast for use in memory + and on communications channels. The gzip format was designed for single- + file compression on file systems, has a larger header than zlib to maintain + directory information, and uses a different, slower check method than zlib. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never crash + even in case of corrupted input. +*/ + +typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +typedef void (*free_func) OF((voidpf opaque, voidpf address)); + +struct internal_state; + +typedef struct z_stream_s { + Bytef *next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total nb of input bytes read so far */ + + Bytef *next_out; /* next output byte should be put there */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total nb of bytes output so far */ + + char *msg; /* last error message, NULL if no error */ + struct internal_state FAR *state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: binary or text */ + uLong adler; /* adler32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} z_stream; + +typedef z_stream FAR *z_streamp; + +/* + gzip header information passed to and from zlib routines. See RFC 1952 + for more details on the meanings of these fields. +*/ +typedef struct gz_header_s { + int text; /* true if compressed data believed to be text */ + uLong time; /* modification time */ + int xflags; /* extra flags (not used when writing a gzip file) */ + int os; /* operating system */ + Bytef *extra; /* pointer to extra field or Z_NULL if none */ + uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ + uInt extra_max; /* space at extra (only when reading header) */ + Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ + uInt name_max; /* space at name (only when reading header) */ + Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ + uInt comm_max; /* space at comment (only when reading header) */ + int hcrc; /* true if there was or will be a header crc */ + int done; /* true when done reading gzip header (not used + when writing a gzip file) */ +} gz_header; + +typedef gz_header FAR *gz_headerp; + +/* + The application must update next_in and avail_in when avail_in has dropped + to zero. It must update next_out and avail_out when avail_out has dropped + to zero. The application must initialize zalloc, zfree and opaque before + calling the init function. All other fields are set by the compression + library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this if + the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers + returned by zalloc for objects of exactly 65536 bytes *must* have their + offset normalized to zero. The default allocation function provided by this + library ensures this (see zutil.c). To reduce memory requirements and avoid + any allocation of 64K objects, at the expense of compression ratio, compile + the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or progress + reports. After compression, total_in holds the total size of the + uncompressed data and may be saved for use in the decompressor (particularly + if the decompressor wants to decompress everything in a single step). +*/ + + /* constants */ + +#define Z_NO_FLUSH 0 +#define Z_PARTIAL_FLUSH 1 +#define Z_SYNC_FLUSH 2 +#define Z_FULL_FLUSH 3 +#define Z_FINISH 4 +#define Z_BLOCK 5 +#define Z_TREES 6 +/* Allowed flush values; see deflate() and inflate() below for details */ + +#define Z_OK 0 +#define Z_STREAM_END 1 +#define Z_NEED_DICT 2 +#define Z_ERRNO (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR (-3) +#define Z_MEM_ERROR (-4) +#define Z_BUF_ERROR (-5) +#define Z_VERSION_ERROR (-6) +/* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. + */ + +#define Z_NO_COMPRESSION 0 +#define Z_BEST_SPEED 1 +#define Z_BEST_COMPRESSION 9 +#define Z_DEFAULT_COMPRESSION (-1) +/* compression levels */ + +#define Z_FILTERED 1 +#define Z_HUFFMAN_ONLY 2 +#define Z_RLE 3 +#define Z_FIXED 4 +#define Z_DEFAULT_STRATEGY 0 +/* compression strategy; see deflateInit2() below for details */ + +#define Z_BINARY 0 +#define Z_TEXT 1 +#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ +#define Z_UNKNOWN 2 +/* Possible values of the data_type field (though see inflate()) */ + +#define Z_DEFLATED 8 +/* The deflate compression method (the only one supported in this version) */ + +#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + +#define zlib_version zlibVersion() +/* for compatibility with versions < 1.0.2 */ + + + /* basic functions */ + +ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +/* The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is not + compatible with the zlib.h header file used by the application. This check + is automatically made by deflateInit and inflateInit. + */ + +/* +ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. If + zalloc and zfree are set to Z_NULL, deflateInit updates them to use default + allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at all + (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION + requests a default compromise between speed and compression (currently + equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if level is not a valid compression level, or + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). msg is set to null + if there is no error message. deflateInit does not perform any compression: + this will be done by deflate(). +*/ + + +ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary (in interactive applications). Some + output may be provided even if flush is not set. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating avail_in or avail_out accordingly; avail_out should + never be zero before the call. The application can consume the compressed + output when it wants, for example when the output buffer is full (avail_out + == 0), or after each call of deflate(). If deflate returns Z_OK and with + zero avail_out, it must be called again after making room in the output + buffer because there might be more output pending. + + Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to + decide how much data to accumulate before producing output, in order to + maximize compression. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In + particular avail_in is zero after the call if enough output space has been + provided before the call.) Flushing may degrade compression for some + compression algorithms and so it should be used only when necessary. This + completes the current deflate block and follows it with an empty stored block + that is three bits plus filler bits to the next byte, followed by four bytes + (00 00 ff ff). + + If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the + output buffer, but the output is not aligned to a byte boundary. All of the + input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. + This completes the current deflate block and follows it with an empty fixed + codes block that is 10 bits long. This assures that enough bytes are output + in order for the decompressor to finish the block before the empty fixed code + block. + + If flush is set to Z_BLOCK, a deflate block is completed and emitted, as + for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to + seven bits of the current block are held to be written as the next byte after + the next deflate block is completed. In this case, the decompressor may not + be provided enough bits at this point in order to complete decompression of + the data provided so far to the compressor. It may need to wait for the next + block to be emitted. This is for advanced applications that need to control + the emission of deflate blocks. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out is greater than six to avoid repeated flush markers due to + avail_out == 0 on return. + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there was + enough output space; if deflate returns with Z_OK, this function must be + called again with Z_FINISH and more output space (updated avail_out) but no + more input data, until it returns with Z_STREAM_END or an error. After + deflate has returned Z_STREAM_END, the only possible operations on the stream + are deflateReset or deflateEnd. + + Z_FINISH can be used immediately after deflateInit if all the compression + is to be done in a single step. In this case, avail_out must be at least the + value returned by deflateBound (see below). If deflate does not return + Z_STREAM_END, then it must be called again as described above. + + deflate() sets strm->adler to the adler32 checksum of all input read + so far (that is, total_in bytes). + + deflate() may update strm->data_type if it can make a good guess about + the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered + binary. This field is only for information purposes and does not affect the + compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible + (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not + fatal, and deflate() can be called again with more input and more output + space to continue compressing. +*/ + + +ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, msg + may be set but then points to a static string (which must not be + deallocated). +*/ + + +/* +ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. If next_in is not Z_NULL and avail_in is large enough (the + exact value depends on the compression method), inflateInit determines the + compression method from the zlib header and allocates all data structures + accordingly; otherwise the allocation will be deferred to the first call of + inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to + use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit() does not process any header information -- that is deferred + until inflate() is called. +*/ + + +ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in is updated and processing will + resume at this point for the next call of inflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there is + no more input data or no more space in the output buffer (see below about + the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating the next_* and avail_* values accordingly. The + application can consume the uncompressed output when it wants, for example + when the output buffer is full (avail_out == 0), or after each call of + inflate(). If inflate returns Z_OK and with zero avail_out, it must be + called again after making room in the output buffer because there might be + more output pending. + + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, + Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() + stop if and when it gets to the next deflate block boundary. When decoding + the zlib or gzip format, this will cause inflate() to return immediately + after the header and before the first block. When doing a raw inflate, + inflate() will go ahead and process the first block, and will return when it + gets to the end of that block, or when it runs out of data. + + The Z_BLOCK option assists in appending to or combining deflate streams. + Also to assist in this, on return inflate() will set strm->data_type to the + number of unused bits in the last byte taken from strm->next_in, plus 64 if + inflate() is currently decoding the last block in the deflate stream, plus + 128 if inflate() returned immediately after decoding an end-of-block code or + decoding the complete header up to just before the first byte of the deflate + stream. The end-of-block will not be indicated until all of the uncompressed + data from that block has been written to strm->next_out. The number of + unused bits may in general be greater than seven, except when bit 7 of + data_type is set, in which case the number of unused bits will be less than + eight. data_type is set as noted here every time inflate() returns for all + flush options, and so can be used to determine the amount of currently + consumed input in bits. + + The Z_TREES option behaves as Z_BLOCK does, but it also returns when the + end of each deflate block header is reached, before any actual data in that + block is decoded. This allows the caller to determine the length of the + deflate block header for later use in random access within a deflate block. + 256 is added to the value of strm->data_type when inflate() returns + immediately after reaching the end of the deflate block header. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step (a + single call of inflate), the parameter flush should be set to Z_FINISH. In + this case all pending input is processed and all pending output is flushed; + avail_out must be large enough to hold all the uncompressed data. (The size + of the uncompressed data may have been saved by the compressor for this + purpose.) The next operation on this stream must be inflateEnd to deallocate + the decompression state. The use of Z_FINISH is never required, but can be + used to inform inflate that a faster approach may be used for the single + inflate() call. + + In this implementation, inflate() always flushes as much output as + possible to the output buffer, and always uses the faster approach on the + first call. So the only effect of the flush parameter in this implementation + is on the return value of inflate(), as noted below, or when it returns early + because Z_BLOCK or Z_TREES is used. + + If a preset dictionary is needed after this call (see inflateSetDictionary + below), inflate sets strm->adler to the adler32 checksum of the dictionary + chosen by the compressor and returns Z_NEED_DICT; otherwise it sets + strm->adler to the adler32 checksum of all output produced so far (that is, + total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described + below. At the end of the stream, inflate() checks that its computed adler32 + checksum is equal to that saved by the compressor and returns Z_STREAM_END + only if the checksum is correct. + + inflate() can decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically, if requested when + initializing with inflateInit2(). Any information contained in the gzip + header is not retained, so applications that need that information should + instead use raw inflate, see inflateInit2() below, or inflateBack() and + perform their own processing of the gzip header and trailer. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect check + value), Z_STREAM_ERROR if the stream structure was inconsistent (for example + next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory, + Z_BUF_ERROR if no progress is possible or if there was not enough room in the + output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + inflate() can be called again with more input and more output space to + continue decompressing. If Z_DATA_ERROR is returned, the application may + then call inflateSync() to look for a good compression block if a partial + recovery of the data is desired. +*/ + + +ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state + was inconsistent. In the error case, msg may be set but then points to a + static string (which must not be deallocated). +*/ + + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +/* +ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy)); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by the + caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data + with no zlib header or trailer, and will not compute an adler32 check value. + + windowBits can also be greater than 15 for optional gzip encoding. Add + 16 to windowBits to write a simple gzip header and trailer around the + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), no + header crc, and the operating system will be set to 255 (unknown). If a + gzip stream is being written, strm->adler is a crc32 instead of an adler32. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but is + slow and reduces compression ratio; memLevel=9 uses maximum memory for + optimal speed. The default value is 8. See zconf.h for total memory usage + as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match), or Z_RLE to limit match distances to one (run-length + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman + coding and less string matching; it is somewhat intermediate between + Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as + fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The + strategy parameter only affects the compression ratio but not the + correctness of the compressed output even if it is not set appropriately. + Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler + decoder for special applications. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid + method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is + incompatible with the version assumed by the caller (ZLIB_VERSION). msg is + set to null if there is no error message. deflateInit2 does not perform any + compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. This function must be called + immediately after deflateInit, deflateInit2 or deflateReset, before any call + of deflate. The compressor and decompressor must use exactly the same + dictionary (see inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size + provided in deflateInit or deflateInit2. Thus the strings most likely to be + useful should be put at the end of the dictionary, not at the front. In + addition, the current implementation of deflate will use at most the window + size minus 262 bytes of the provided dictionary. + + Upon return of this function, strm->adler is set to the adler32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The adler32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) If a raw deflate was requested, then the + adler32 value is not computed and strm->adler is not set. + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if the compression method is bsort). deflateSetDictionary does not + perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and can + consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +/* + This function is equivalent to deflateEnd followed by deflateInit, + but does not free and reallocate all the internal compression state. The + stream will keep the same compression level and any other attributes that + may have been set by deflateInit2. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, + int level, + int strategy)); +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2. This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different strategy. + If the compression level is changed, the input available so far is + compressed with the old level (and may be flushed); the new level will take + effect only at the next call of deflate(). + + Before the call of deflateParams, the stream state must be set as for + a call of deflate(), since the currently available input may have to be + compressed and flushed. In particular, strm->avail_out must be non-zero. + + deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source + stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if + strm->avail_out was zero. +*/ + +ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain)); +/* + Fine tune deflate's internal compression parameters. This should only be + used by someone who understands the algorithm used by zlib's deflate for + searching for the best matching string, and even then only by the most + fanatic optimizer trying to squeeze out the last compressed bit for their + specific input data. Read the deflate.c source code for the meaning of the + max_lazy, good_length, nice_length, and max_chain parameters. + + deflateTune() can be called after deflateInit() or deflateInit2(), and + returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. + */ + +ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, + uLong sourceLen)); +/* + deflateBound() returns an upper bound on the compressed size after + deflation of sourceLen bytes. It must be called after deflateInit() or + deflateInit2(), and after deflateSetHeader(), if used. This would be used + to allocate an output buffer for deflation in a single pass, and so would be + called before deflate(). +*/ + +ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + deflatePrime() inserts bits in the deflate output stream. The intent + is that this function is used to start off the deflate output with the bits + leftover from a previous deflate stream when appending to it. As such, this + function can only be used for raw deflate, and must be used before the first + deflate() call after a deflateInit2() or deflateReset(). bits must be less + than or equal to 16, and that many of the least significant bits of value + will be inserted in the output. + + deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, + gz_headerp head)); +/* + deflateSetHeader() provides gzip header information for when a gzip + stream is requested by deflateInit2(). deflateSetHeader() may be called + after deflateInit2() or deflateReset() and before the first call of + deflate(). The text, time, os, extra field, name, and comment information + in the provided gz_header structure are written to the gzip header (xflag is + ignored -- the extra flags are set according to the compression level). The + caller must assure that, if not Z_NULL, name and comment are terminated with + a zero byte, and that if extra is not Z_NULL, that extra_len bytes are + available there. If hcrc is true, a gzip header crc is included. Note that + the current versions of the command-line version of gzip (up through version + 1.3.x) do not support header crc's, and will report that it is a "multi-part + gzip file" and give up. + + If deflateSetHeader is not used, the default gzip header has text false, + the time set to zero, and os set to 255, with no extra, name, or comment + fields. The gzip header is returned to the default state by deflateReset(). + + deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, + int windowBits)); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value + provided to deflateInit2() while compressing, or it must be equal to 15 if + deflateInit2() was not used. If a compressed stream with a larger window + size is given as input, inflate() will return with the error code + Z_DATA_ERROR instead of trying to allocate a larger window. + + windowBits can also be zero to request that inflate use the window size in + the zlib header of the compressed stream. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, + not looking for a zlib or gzip header, not generating a check value, and not + looking for any check values for comparison at the end of the stream. This + is for use with other formats that use the deflate compressed data format + such as zip. Those formats provide their own check values. If a custom + format is developed using the raw deflate format for compressed data, it is + recommended that a check value such as an adler32 or a crc32 be applied to + the uncompressed data as is done in the zlib, gzip, and zip formats. For + most applications, the zlib format should be used as is. Note that comments + above on the use in deflateInit2() applies to the magnitude of windowBits. + + windowBits can also be greater than 15 for optional gzip decoding. Add + 32 to windowBits to enable zlib and gzip decoding with automatic header + detection, or add 16 to decode only the gzip format (the zlib format will + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a + crc32 instead of an adler32. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit2 does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit2() does not process any header information -- that is + deferred until inflate() is called. +*/ + +ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the adler32 value returned by that call of inflate. + The compressor and decompressor must use exactly the same dictionary (see + deflateSetDictionary). For raw inflate, this function can be called + immediately after inflateInit2() or inflateReset() and before any call of + inflate() to set the dictionary. The application must insure that the + dictionary that was used for compression is provided. + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect adler32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +/* + Skips invalid compressed data until a full flush point (see above the + description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR + if no more input was provided, Z_DATA_ERROR if no flush point has been + found, or Z_STREAM_ERROR if the stream structure was inconsistent. In the + success case, the application may save the current current value of total_in + which indicates where valid compressed data was found. In the error case, + the application may repeatedly call inflateSync, providing more input each + time, until success or end of the input data. +*/ + +ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when randomly accessing a large stream. The + first pass through the stream can periodically record the inflate state, + allowing restarting inflate at those points when randomly accessing the + stream. + + inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate all the internal decompression state. The + stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, + int windowBits)); +/* + This function is the same as inflateReset, but it also permits changing + the wrap and window size requests. The windowBits parameter is interpreted + the same as it is for inflateInit2. + + inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL), or if + the windowBits parameter is invalid. +*/ + +ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + This function inserts bits in the inflate input stream. The intent is + that this function is used to start inflating at a bit position in the + middle of a byte. The provided bits will be used before any bytes are used + from next_in. This function should only be used with raw inflate, and + should be used before the first inflate() call after inflateInit2() or + inflateReset(). bits must be less than or equal to 16, and that many of the + least significant bits of value will be inserted in the input. + + If bits is negative, then the input stream bit buffer is emptied. Then + inflatePrime() can be called again to put bits in the buffer. This is used + to clear out bits leftover after feeding inflate a block description prior + to feeding inflate codes. + + inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); +/* + This function returns two values, one in the lower 16 bits of the return + value, and the other in the remaining upper bits, obtained by shifting the + return value down 16 bits. If the upper value is -1 and the lower value is + zero, then inflate() is currently decoding information outside of a block. + If the upper value is -1 and the lower value is non-zero, then inflate is in + the middle of a stored block, with the lower value equaling the number of + bytes from the input remaining to copy. If the upper value is not -1, then + it is the number of bits back from the current bit position in the input of + the code (literal or length/distance pair) currently being processed. In + that case the lower value is the number of bytes already emitted for that + code. + + A code is being processed if inflate is waiting for more input to complete + decoding of the code, or if it has completed decoding but is waiting for + more output space to write the literal or match data. + + inflateMark() is used to mark locations in the input data for random + access, which may be at bit positions, and to note those cases where the + output of a code may span boundaries of random access blocks. The current + location in the input stream can be determined from avail_in and data_type + as noted in the description for the Z_BLOCK flush parameter for inflate. + + inflateMark returns the value noted above or -1 << 16 if the provided + source stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, + gz_headerp head)); +/* + inflateGetHeader() requests that gzip header information be stored in the + provided gz_header structure. inflateGetHeader() may be called after + inflateInit2() or inflateReset(), and before the first call of inflate(). + As inflate() processes the gzip stream, head->done is zero until the header + is completed, at which time head->done is set to one. If a zlib stream is + being decoded, then head->done is set to -1 to indicate that there will be + no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be + used to force inflate() to return immediately after header processing is + complete and before any actual data is decompressed. + + The text, time, xflags, and os fields are filled in with the gzip header + contents. hcrc is set to true if there is a header CRC. (The header CRC + was valid if done is set to one.) If extra is not Z_NULL, then extra_max + contains the maximum number of bytes to write to extra. Once done is true, + extra_len contains the actual extra field length, and extra contains the + extra field, or that field truncated if extra_max is less than extra_len. + If name is not Z_NULL, then up to name_max characters are written there, + terminated with a zero unless the length is greater than name_max. If + comment is not Z_NULL, then up to comm_max characters are written there, + terminated with a zero unless the length is greater than comm_max. When any + of extra, name, or comment are not Z_NULL and the respective field is not + present in the header, then that field is set to Z_NULL to signal its + absence. This allows the use of deflateSetHeader() with the returned + structure to duplicate the header. However if those fields are set to + allocated memory, then the application will need to save those pointers + elsewhere so that they can be eventually freed. + + If inflateGetHeader is not used, then the header information is simply + discarded. The header is always checked for validity, including the header + CRC if present. inflateReset() will reset the process to discard the header + information. The application would need to call inflateGetHeader() again to + retrieve the header from the next gzip stream. + + inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, + unsigned char FAR *window)); + + Initialize the internal stream state for decompression using inflateBack() + calls. The fields zalloc, zfree and opaque in strm must be initialized + before the call. If zalloc and zfree are Z_NULL, then the default library- + derived memory allocation routines are used. windowBits is the base two + logarithm of the window size, in the range 8..15. window is a caller + supplied buffer of that size. Except for special applications where it is + assured that deflate was used with small window sizes, windowBits must be 15 + and a 32K byte window must be supplied to be able to decompress general + deflate streams. + + See inflateBack() for the usage of these routines. + + inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of + the paramaters are invalid, Z_MEM_ERROR if the internal state could not be + allocated, or Z_VERSION_ERROR if the version of the library does not match + the version of the header file. +*/ + +typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); +typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); + +ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +/* + inflateBack() does a raw inflate with a single call using a call-back + interface for input and output. This is more efficient than inflate() for + file i/o applications in that it avoids copying between the output and the + sliding window by simply making the window itself the output buffer. This + function trusts the application to not change the output buffer passed by + the output function, at least until inflateBack() returns. + + inflateBackInit() must be called first to allocate the internal state + and to initialize the state with the user-provided window buffer. + inflateBack() may then be used multiple times to inflate a complete, raw + deflate stream with each call. inflateBackEnd() is then called to free the + allocated state. + + A raw deflate stream is one with no zlib or gzip header or trailer. + This routine would normally be used in a utility that reads zip or gzip + files and writes out uncompressed files. The utility would decode the + header and process the trailer on its own, hence this routine expects only + the raw deflate stream to decompress. This is different from the normal + behavior of inflate(), which expects either a zlib or gzip header and + trailer around the deflate stream. + + inflateBack() uses two subroutines supplied by the caller that are then + called by inflateBack() for input and output. inflateBack() calls those + routines until it reads a complete deflate stream and writes out all of the + uncompressed data, or until it encounters an error. The function's + parameters and return types are defined above in the in_func and out_func + typedefs. inflateBack() will call in(in_desc, &buf) which should return the + number of bytes of provided input, and a pointer to that input in buf. If + there is no input available, in() must return zero--buf is ignored in that + case--and inflateBack() will return a buffer error. inflateBack() will call + out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() + should return zero on success, or non-zero on failure. If out() returns + non-zero, inflateBack() will return with an error. Neither in() nor out() + are permitted to change the contents of the window provided to + inflateBackInit(), which is also the buffer that out() uses to write from. + The length written by out() will be at most the window size. Any non-zero + amount of input may be provided by in(). + + For convenience, inflateBack() can be provided input on the first call by + setting strm->next_in and strm->avail_in. If that input is exhausted, then + in() will be called. Therefore strm->next_in must be initialized before + calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called + immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in + must also be initialized, and then if strm->avail_in is not zero, input will + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + + The in_desc and out_desc parameters of inflateBack() is passed as the + first parameter of in() and out() respectively when they are called. These + descriptors can be optionally used to pass any information that the caller- + supplied in() and out() functions need to do their job. + + On return, inflateBack() will set strm->next_in and strm->avail_in to + pass back any unused input that was provided by the last in() call. The + return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR + if in() or out() returned an error, Z_DATA_ERROR if there was a format error + in the deflate stream (in which case strm->msg is set to indicate the nature + of the error), or Z_STREAM_ERROR if the stream was not properly initialized. + In the case of Z_BUF_ERROR, an input or output error can be distinguished + using strm->next_in which will be Z_NULL only if in() returned an error. If + strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning + non-zero. (in() will always be called before out(), so strm->next_in is + assured to be defined if out() returns non-zero.) Note that inflateBack() + cannot return Z_OK. +*/ + +ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +/* + All memory allocated by inflateBackInit() is freed. + + inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream + state was inconsistent. +*/ + +ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +/* Return flags indicating compile-time options. + + Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: + 1.0: size of uInt + 3.2: size of uLong + 5.4: size of voidpf (pointer) + 7.6: size of z_off_t + + Compiler, assembler, and debug options: + 8: DEBUG + 9: ASMV or ASMINF -- use ASM code + 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention + 11: 0 (reserved) + + One-time table building (smaller code, but not thread-safe if true): + 12: BUILDFIXED -- build static block decoding tables when needed + 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed + 14,15: 0 (reserved) + + Library content (indicates missing functionality): + 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking + deflate code when not needed) + 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect + and decode gzip streams (to avoid linking crc code) + 18-19: 0 (reserved) + + Operation variations (changes in library functionality): + 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate + 21: FASTEST -- deflate algorithm with only one, lowest compression level + 22,23: 0 (reserved) + + The sprintf variant used by gzprintf (zero is best): + 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format + 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! + 26: 0 = returns value, 1 = void -- 1 means inferred string length returned + + Remainder: + 27-31: 0 (reserved) + */ + + + /* utility functions */ + +/* + The following utility functions are implemented on top of the basic + stream-oriented functions. To simplify the interface, some default options + are assumed (compression level and memory usage, standard memory allocation + functions). The source code of these utility functions can be modified if + you need special options. +*/ + +ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level)); +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +/* + compressBound() returns an upper bound on the compressed size after + compress() or compress2() on sourceLen bytes. It would be used before a + compress() or compress2() call to allocate the destination buffer. +*/ + +ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be large enough to hold the entire + uncompressed data. (The size of the uncompressed data must have been saved + previously by the compressor and transmitted to the decompressor by some + mechanism outside the scope of this compression library.) Upon exit, destLen + is the actual size of the uncompressed buffer. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. +*/ + + + /* gzip file access functions */ + +/* + This library supports reading and writing files in gzip (.gz) format with + an interface similar to that of stdio, using the functions that start with + "gz". The gzip format is different from the zlib format. gzip is a gzip + wrapper, documented in RFC 1952, wrapped around a deflate stream. +*/ + +typedef voidp gzFile; /* opaque gzip file descriptor */ + +/* +ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); + + Opens a gzip (.gz) file for reading or writing. The mode parameter is as + in fopen ("rb" or "wb") but can also include a compression level ("wb9") or + a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only + compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' + for fixed code compression as in "wb9F". (See the description of + deflateInit2 for more information about the strategy parameter.) Also "a" + can be used instead of "w" to request that the gzip stream that will be + written be appended to the file. "+" will result in an error, since reading + and writing to the same gzip file is not supported. + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. + + gzopen returns NULL if the file could not be opened, if there was + insufficient memory to allocate the gzFile state, or if an invalid mode was + specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). + errno can be checked to determine if the reason gzopen failed was that the + file could not be opened. +*/ + +ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +/* + gzdopen associates a gzFile with the file descriptor fd. File descriptors + are obtained from calls like open, dup, creat, pipe or fileno (if the file + has been previously opened with fopen). The mode parameter is as in gzopen. + + The next call of gzclose on the returned gzFile will also close the file + descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor + fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, + mode);. The duplicated descriptor should be saved to avoid a leak, since + gzdopen does not close fd if it fails. + + gzdopen returns NULL if there was insufficient memory to allocate the + gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not + provided, or '+' was provided), or if fd is -1. The file descriptor is not + used until the next gz* read, write, seek, or close operation, so gzdopen + will not detect if fd is invalid (unless fd is -1). +*/ + +ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); +/* + Set the internal buffer size used by this library's functions. The + default buffer size is 8192 bytes. This function must be called after + gzopen() or gzdopen(), and before any other calls that read or write the + file. The buffer memory allocation is always deferred to the first read or + write. Two buffers are allocated, either both of the specified size when + writing, or one of the specified size and the other twice that size when + reading. A larger buffer size of, for example, 64K or 128K bytes will + noticeably increase the speed of decompression (reading). + + The new buffer size also affects the maximum length for gzprintf(). + + gzbuffer() returns 0 on success, or -1 on failure, such as being called + too late. +*/ + +ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +/* + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. + + gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not + opened for writing. +*/ + +ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +/* + Reads the given number of uncompressed bytes from the compressed file. If + the input file was not in gzip format, gzread copies the given number of + bytes into the buffer. + + After reaching the end of a gzip stream in the input, gzread will continue + to read, looking for another gzip stream, or failing that, reading the rest + of the input file directly without decompression. The entire input file + will be read if gzread is called until it returns less than the requested + len. + + gzread returns the number of uncompressed bytes actually read, less than + len for end of file, or -1 for error. +*/ + +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, + voidpc buf, unsigned len)); +/* + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes written or 0 in case of + error. +*/ + +ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); +/* + Converts, formats, and writes the arguments to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written, or 0 in case of error. The number of + uncompressed bytes written is limited to 8191, or one less than the buffer + size given to gzbuffer(). The caller should assure that this limit is not + exceeded. If it is exceeded, then gzprintf() will return an error (0) with + nothing written. In this case, there may also be a buffer overflow with + unpredictable consequences, which is possible only if zlib was compiled with + the insecure functions sprintf() or vsprintf() because the secure snprintf() + or vsnprintf() functions were not available. This can be determined using + zlibCompileFlags(). +*/ + +ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +/* + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + + gzputs returns the number of characters written, or -1 in case of error. +*/ + +ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +/* + Reads bytes from the compressed file until len-1 characters are read, or a + newline character is read and transferred to buf, or an end-of-file + condition is encountered. If any characters are read or if len == 1, the + string is terminated with a null character. If no characters are read due + to an end-of-file or len < 1, then the buffer is left untouched. + + gzgets returns buf which is a null-terminated string, or it returns NULL + for end-of-file or in case of error. If there was an error, the contents at + buf are indeterminate. +*/ + +ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +/* + Writes c, converted to an unsigned char, into the compressed file. gzputc + returns the value that was written, or -1 in case of error. +*/ + +ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +/* + Reads one byte from the compressed file. gzgetc returns this byte or -1 + in case of end of file or error. +*/ + +ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +/* + Push one character back onto the stream to be read as the first character + on the next read. At least one character of push-back is allowed. + gzungetc() returns the character pushed, or -1 on failure. gzungetc() will + fail if c is -1, and may fail if a character has been pushed but not read + yet. If gzungetc is used immediately after gzopen or gzdopen, at least the + output buffer size of pushed characters is allowed. (See gzbuffer above.) + The pushed character will be discarded if the stream is repositioned with + gzseek() or gzrewind(). +*/ + +ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +/* + Flushes all pending output into the compressed file. The parameter flush + is as in the deflate() function. The return value is the zlib error number + (see function gzerror below). gzflush is only permitted when writing. + + If the flush parameter is Z_FINISH, the remaining data is written and the + gzip stream is completed in the output. If gzwrite() is called again, a new + gzip stream will be started in the output. gzread() is able to read such + concatented gzip streams. + + gzflush should be called only when strictly necessary because it will + degrade compression if called too often. +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, + z_off_t offset, int whence)); + + Sets the starting position for the next gzread or gzwrite on the given + compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + +ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +/* + Rewinds the given file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); + + Returns the starting position for the next gzread or gzwrite on the given + compressed file. This position represents a number of bytes in the + uncompressed data stream, and is zero when starting, even if appending or + reading a gzip stream from the middle of a file using gzdopen(). + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); + + Returns the current offset in the file being read or written. This offset + includes the count of bytes that precede the gzip stream, for example when + appending or when using gzdopen() for reading. When reading, the offset + does not include as yet unused buffered input. This information can be used + for a progress indicator. On error, gzoffset() returns -1. +*/ + +ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +/* + Returns true (1) if the end-of-file indicator has been set while reading, + false (0) otherwise. Note that the end-of-file indicator is set only if the + read tried to go past the end of the input, but came up short. Therefore, + just like feof(), gzeof() may return false even if there is no more data to + read, in the event that the last read request was for the exact number of + bytes remaining in the input file. This will happen if the input file size + is an exact multiple of the buffer size. + + If gzeof() returns true, then the read functions will return no more data, + unless the end-of-file indicator is reset by gzclearerr() and the input file + has grown since the previous end of file was detected. +*/ + +ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +/* + Returns true (1) if file is being copied directly while reading, or false + (0) if file is a gzip stream being decompressed. This state can change from + false to true while reading the input file if the end of a gzip stream is + reached, but is followed by data that is not another gzip stream. + + If the input file is empty, gzdirect() will return true, since the input + does not contain a gzip stream. + + If gzdirect() is used immediately after gzopen() or gzdopen() it will + cause buffers to be allocated to allow reading the file to determine if it + is a gzip file. Therefore if gzbuffer() is used, it should be called before + gzdirect(). +*/ + +ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +/* + Flushes all pending output if necessary, closes the compressed file and + deallocates the (de)compression state. Note that once file is closed, you + cannot call gzerror with file, since its structures have been deallocated. + gzclose must not be called more than once on the same file, just as free + must not be called more than once on the same allocation. + + gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a + file operation error, or Z_OK on success. +*/ + +ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); +/* + Same as gzclose(), but gzclose_r() is only for use when reading, and + gzclose_w() is only for use when writing or appending. The advantage to + using these instead of gzclose() is that they avoid linking in zlib + compression or decompression code that is not used when only reading or only + writing respectively. If gzclose() is used, then both compression and + decompression code will be included the application when linking to a static + zlib library. +*/ + +ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +/* + Returns the error message for the last error which occurred on the given + compressed file. errnum is set to zlib error number. If an error occurred + in the file system and not in the compression library, errnum is set to + Z_ERRNO and the application may consult errno to get the exact error code. + + The application must not modify the returned string. Future calls to + this function may invalidate the previously returned string. If file is + closed, then the string previously returned by gzerror will no longer be + available. + + gzerror() should be used to distinguish errors from end-of-file for those + functions above that do not distinguish those cases in their return values. +*/ + +ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +/* + Clears the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip + file that is being written concurrently. +*/ + + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the compression + library. +*/ + +ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is Z_NULL, this function returns the + required initial value for the checksum. + + An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + much faster. + + Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +/* +ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, + z_off_t len2)); + + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 + and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for + each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. +*/ + +ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +/* + Update a running CRC-32 with the bytes buf[0..len-1] and return the + updated CRC-32. If buf is Z_NULL, this function returns the required + initial value for the for the crc. Pre- and post-conditioning (one's + complement) is performed within this function so it shouldn't be done by the + application. + + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + +/* +ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); + + Combine two CRC-32 check values into one. For two sequences of bytes, + seq1 and seq2 with lengths len1 and len2, CRC-32 check values were + calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 + check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and + len2. +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size)); +ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size)); +#define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) +#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) +#define inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, sizeof(z_stream)) + +#ifdef _LARGEFILE64_SOURCE + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN off64_t ZEXPORT gzseek64 OF((gzFile, off64_t, int)); + ZEXTERN off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN off64_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, off64_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, off64_t)); +#endif + +#if !defined(ZLIB_INTERNAL) && _FILE_OFFSET_BITS == 64 +# define gzopen gzopen64 +# define gzseek gzseek64 +# define gztell gztell64 +# define gzoffset gzoffset64 +# define adler32_combine adler32_combine64 +# define crc32_combine crc32_combine64 +# ifndef _LARGEFILE64_SOURCE + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN off_t ZEXPORT gzseek64 OF((gzFile, off_t, int)); + ZEXTERN off_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN off_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, off_t)); +# endif +#else + ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); +#endif + +#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) + struct internal_state {int dummy;}; /* hack for buggy compilers */ +#endif + +ZEXTERN const char * ZEXPORT zError OF((int)); +ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); +ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); +ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); + +#ifdef __cplusplus +} +#endif + +#endif /* ZLIB_H */ diff --git a/Source/SPFileHandle.m b/Source/SPFileHandle.m index 8cc6bed41..7da3d100a 100644 --- a/Source/SPFileHandle.m +++ b/Source/SPFileHandle.m @@ -30,7 +30,7 @@ #import "SPFileHandle.h" #import "bzlib.h" -#import "zlib.h" +#import "zlib.1.2.4.h" #import "pthread.h" // Define the maximum size of the background write buffer before the writing thread diff --git a/sequel-pro.xcodeproj/project.pbxproj b/sequel-pro.xcodeproj/project.pbxproj index 1ddbc8ded..c7a3ba2ba 100644 --- a/sequel-pro.xcodeproj/project.pbxproj +++ b/sequel-pro.xcodeproj/project.pbxproj @@ -170,8 +170,8 @@ 380F4EF50FC0B68F00B0BFD7 /* SPStringAdditionsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 380F4EF40FC0B68F00B0BFD7 /* SPStringAdditionsTests.m */; }; 384582C40FB95FF800DDACB6 /* func-small.png in Resources */ = {isa = PBXBuildFile; fileRef = 384582C30FB95FF800DDACB6 /* func-small.png */; }; 384582C70FB9603600DDACB6 /* proc-small.png in Resources */ = {isa = PBXBuildFile; fileRef = 384582C60FB9603600DDACB6 /* proc-small.png */; }; + 386083461C8A3D97006D1B47 /* zlib.1.2.4.h in Headers */ = {isa = PBXBuildFile; fileRef = 386083451C8A3D97006D1B47 /* zlib.1.2.4.h */; }; 387BBBA80FBCB6CB00B31746 /* SPTableRelations.m in Sources */ = {isa = PBXBuildFile; fileRef = 387BBBA70FBCB6CB00B31746 /* SPTableRelations.m */; }; - 38C613731C8977E600B3B6EF /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 38C613721C8977E600B3B6EF /* libz.tbd */; }; 4D90B79A101E0CDF00D116A1 /* SPUserManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D90B799101E0CDF00D116A1 /* SPUserManager.m */; }; 4D90B79E101E0CF200D116A1 /* SPUserManager.xcdatamodel in Sources */ = {isa = PBXBuildFile; fileRef = 4D90B79B101E0CF200D116A1 /* SPUserManager.xcdatamodel */; }; 4D90B79F101E0CF200D116A1 /* SPUserMO.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D90B79D101E0CF200D116A1 /* SPUserMO.m */; }; @@ -922,6 +922,7 @@ 380F4EF40FC0B68F00B0BFD7 /* SPStringAdditionsTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPStringAdditionsTests.m; sourceTree = ""; }; 384582C30FB95FF800DDACB6 /* func-small.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "func-small.png"; sourceTree = ""; }; 384582C60FB9603600DDACB6 /* proc-small.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "proc-small.png"; sourceTree = ""; }; + 386083451C8A3D97006D1B47 /* zlib.1.2.4.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = zlib.1.2.4.h; path = Frameworks/zlib/zlib.1.2.4.h; sourceTree = ""; }; 387BBBA60FBCB6CB00B31746 /* SPTableRelations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPTableRelations.h; sourceTree = ""; }; 387BBBA70FBCB6CB00B31746 /* SPTableRelations.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPTableRelations.m; sourceTree = ""; }; 38C613701C89777B00B3B6EF /* libz.1.2.5.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.1.2.5.tbd; path = usr/lib/libz.1.2.5.tbd; sourceTree = SDKROOT; }; @@ -1378,7 +1379,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 38C613731C8977E600B3B6EF /* libz.tbd in Frameworks */, 503CDBB21ACDC204004F8A2F /* Quartz.framework in Frameworks */, 17AED4161888BD67008E380F /* Security.framework in Frameworks */, 296DC8BF0F9091DF002A3258 /* libicucore.dylib in Frameworks */, @@ -2338,6 +2338,7 @@ 17FC36AE141425D600AC3602 /* Frameworks */ = { isa = PBXGroup; children = ( + 386083441C8A3D89006D1B47 /* zlib */, 17E5954E14F304000054EE08 /* QueryKit.xcodeproj */, 584D876015140D3500F24774 /* SPMySQLFramework.xcodeproj */, 58B906F811BD9B34000826E5 /* PSMTabBar */, @@ -2433,6 +2434,14 @@ path = UnitTests; sourceTree = ""; }; + 386083441C8A3D89006D1B47 /* zlib */ = { + isa = PBXGroup; + children = ( + 386083451C8A3D97006D1B47 /* zlib.1.2.4.h */, + ); + name = zlib; + sourceTree = ""; + }; 507FF10E1BBCC4A900104523 /* Utility */ = { isa = PBXGroup; children = ( @@ -2701,6 +2710,7 @@ 58B9075811BD9B34000826E5 /* NSString_AITruncation.h in Headers */, 58B9075A11BD9B34000826E5 /* PSMOverflowPopUpButton.h in Headers */, 58B9075C11BD9B34000826E5 /* PSMProgressIndicator.h in Headers */, + 386083461C8A3D97006D1B47 /* zlib.1.2.4.h in Headers */, 58B9075E11BD9B34000826E5 /* PSMRolloverButton.h in Headers */, 58B9076011BD9B34000826E5 /* PSMTabBarCell.h in Headers */, 58B9076211BD9B34000826E5 /* PSMTabBarControl.h in Headers */, @@ -4046,7 +4056,7 @@ INSTALL_PATH = "$(HOME)/Applications"; LIBRARY_SEARCH_PATHS = "$(SRCROOT)/Frameworks/zlib"; MACOSX_DEPLOYMENT_TARGET = 10.6; - OTHER_LDFLAGS = ""; + OTHER_LDFLAGS = "$(SRCROOT)/Frameworks/zlib/libz.a"; PRODUCT_NAME = "Sequel Pro"; SEPARATE_STRIP = NO; }; @@ -4246,7 +4256,7 @@ INSTALL_PATH = "$(HOME)/Applications"; LIBRARY_SEARCH_PATHS = "$(SRCROOT)/Frameworks/zlib"; MACOSX_DEPLOYMENT_TARGET = 10.6; - OTHER_LDFLAGS = ""; + OTHER_LDFLAGS = "$(SRCROOT)/Frameworks/zlib/libz.a"; PRODUCT_NAME = "Sequel Pro"; SEPARATE_STRIP = NO; }; @@ -4270,7 +4280,7 @@ INSTALL_PATH = "$(HOME)/Applications"; LIBRARY_SEARCH_PATHS = "$(SRCROOT)/Frameworks/zlib"; MACOSX_DEPLOYMENT_TARGET = 10.6; - OTHER_LDFLAGS = ""; + OTHER_LDFLAGS = "$(SRCROOT)/Frameworks/zlib/libz.a"; PRODUCT_NAME = "Sequel Pro"; SEPARATE_STRIP = NO; };