aboutsummaryrefslogtreecommitdiffhomepage
path: root/Example/Database/Tests/third_party
diff options
context:
space:
mode:
authorGravatar Paul Beusterien <paulbeusterien@google.com>2017-05-15 12:27:07 -0700
committerGravatar Paul Beusterien <paulbeusterien@google.com>2017-05-15 12:27:07 -0700
commit98ba64449a632518bd2b86fe8d927f4a960d3ddc (patch)
tree131d9c4272fa6179fcda6c5a33fcb3b1bd57ad2e /Example/Database/Tests/third_party
parent32461366c9e204a527ca05e6e9b9404a2454ac51 (diff)
Initial
Diffstat (limited to 'Example/Database/Tests/third_party')
-rw-r--r--Example/Database/Tests/third_party/Base64.h53
-rw-r--r--Example/Database/Tests/third_party/Base64.m202
2 files changed, 255 insertions, 0 deletions
diff --git a/Example/Database/Tests/third_party/Base64.h b/Example/Database/Tests/third_party/Base64.h
new file mode 100644
index 0000000..6db1028
--- /dev/null
+++ b/Example/Database/Tests/third_party/Base64.h
@@ -0,0 +1,53 @@
+//
+// Base64.h
+//
+// Version 1.1
+//
+// Created by Nick Lockwood on 12/01/2012.
+// Copyright (C) 2012 Charcoal Design
+//
+// Distributed under the permissive zlib License
+// Get the latest version from here:
+//
+// https://github.com/nicklockwood/Base64
+//
+// 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.
+//
+
+#import <Foundation/Foundation.h>
+
+
+@interface NSData (Base64)
+
++ (NSData *)dataWithBase64EncodedString:(NSString *)string;
+- (NSString *)base64EncodedStringWithWrapWidth:(NSUInteger)wrapWidth;
+- (NSString *)base64EncodedString;
+
+@end
+
+
+@interface NSString (Base64)
+
++ (NSString *)stringWithBase64EncodedString:(NSString *)string;
+- (NSString *)base64EncodedStringWithWrapWidth:(NSUInteger)wrapWidth;
+- (NSString *)base64EncodedString;
+- (NSString *)base64DecodedString;
+- (NSData *)base64DecodedData;
+
+@end
diff --git a/Example/Database/Tests/third_party/Base64.m b/Example/Database/Tests/third_party/Base64.m
new file mode 100644
index 0000000..b3d73db
--- /dev/null
+++ b/Example/Database/Tests/third_party/Base64.m
@@ -0,0 +1,202 @@
+//
+// Base64.m
+//
+// Version 1.1
+//
+// Created by Nick Lockwood on 12/01/2012.
+// Copyright (C) 2012 Charcoal Design
+//
+// Distributed under the permissive zlib License
+// Get the latest version from here:
+//
+// https://github.com/nicklockwood/Base64
+//
+// 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.
+//
+
+#import "Base64.h"
+
+
+#import <Availability.h>
+#if !__has_feature(objc_arc)
+#error This library requires automatic reference counting
+#endif
+
+
+@implementation NSData (Base64)
+
++ (NSData *)dataWithBase64EncodedString:(NSString *)string
+{
+ const char lookup[] =
+ {
+ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 62, 99, 99, 99, 63,
+ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 99, 99, 99, 99, 99, 99,
+ 99, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 99, 99, 99, 99, 99,
+ 99, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 99, 99, 99, 99, 99
+ };
+
+ NSData *inputData = [string dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
+ long long inputLength = [inputData length];
+ const unsigned char *inputBytes = [inputData bytes];
+
+ long long maxOutputLength = (inputLength / 4 + 1) * 3;
+ NSMutableData *outputData = [NSMutableData dataWithLength:maxOutputLength];
+ unsigned char *outputBytes = (unsigned char *)[outputData mutableBytes];
+
+ int accumulator = 0;
+ long long outputLength = 0;
+ unsigned char accumulated[] = {0, 0, 0, 0};
+ for (long long i = 0; i < inputLength; i++)
+ {
+ unsigned char decoded = lookup[inputBytes[i] & 0x7F];
+ if (decoded != 99)
+ {
+ accumulated[accumulator] = decoded;
+ if (accumulator == 3)
+ {
+ outputBytes[outputLength++] = (accumulated[0] << 2) | (accumulated[1] >> 4);
+ outputBytes[outputLength++] = (accumulated[1] << 4) | (accumulated[2] >> 2);
+ outputBytes[outputLength++] = (accumulated[2] << 6) | accumulated[3];
+ }
+ accumulator = (accumulator + 1) % 4;
+ }
+ }
+
+ //handle left-over data
+ if (accumulator > 0) outputBytes[outputLength] = (accumulated[0] << 2) | (accumulated[1] >> 4);
+ if (accumulator > 1) outputBytes[++outputLength] = (accumulated[1] << 4) | (accumulated[2] >> 2);
+ if (accumulator > 2) outputLength++;
+
+ //truncate data to match actual output length
+ outputData.length = outputLength;
+ return outputLength? outputData: nil;
+}
+
+- (NSString *)base64EncodedStringWithWrapWidth:(NSUInteger)wrapWidth
+{
+ //ensure wrapWidth is a multiple of 4
+ wrapWidth = (wrapWidth / 4) * 4;
+
+ const char lookup[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+ long long inputLength = [self length];
+ const unsigned char *inputBytes = [self bytes];
+
+ long long maxOutputLength = (inputLength / 3 + 1) * 4;
+ maxOutputLength += wrapWidth? (maxOutputLength / wrapWidth) * 2: 0;
+ unsigned char *outputBytes = (unsigned char *)malloc(maxOutputLength);
+
+ long long i;
+ long long outputLength = 0;
+ for (i = 0; i < inputLength - 2; i += 3)
+ {
+ outputBytes[outputLength++] = lookup[(inputBytes[i] & 0xFC) >> 2];
+ outputBytes[outputLength++] = lookup[((inputBytes[i] & 0x03) << 4) | ((inputBytes[i + 1] & 0xF0) >> 4)];
+ outputBytes[outputLength++] = lookup[((inputBytes[i + 1] & 0x0F) << 2) | ((inputBytes[i + 2] & 0xC0) >> 6)];
+ outputBytes[outputLength++] = lookup[inputBytes[i + 2] & 0x3F];
+
+ //add line break
+ if (wrapWidth && (outputLength + 2) % (wrapWidth + 2) == 0)
+ {
+ outputBytes[outputLength++] = '\r';
+ outputBytes[outputLength++] = '\n';
+ }
+ }
+
+ //handle left-over data
+ if (i == inputLength - 2)
+ {
+ // = terminator
+ outputBytes[outputLength++] = lookup[(inputBytes[i] & 0xFC) >> 2];
+ outputBytes[outputLength++] = lookup[((inputBytes[i] & 0x03) << 4) | ((inputBytes[i + 1] & 0xF0) >> 4)];
+ outputBytes[outputLength++] = lookup[(inputBytes[i + 1] & 0x0F) << 2];
+ outputBytes[outputLength++] = '=';
+ }
+ else if (i == inputLength - 1)
+ {
+ // == terminator
+ outputBytes[outputLength++] = lookup[(inputBytes[i] & 0xFC) >> 2];
+ outputBytes[outputLength++] = lookup[(inputBytes[i] & 0x03) << 4];
+ outputBytes[outputLength++] = '=';
+ outputBytes[outputLength++] = '=';
+ }
+
+ if (outputLength >= 4)
+ {
+ //truncate data to match actual output length
+ outputBytes = realloc(outputBytes, outputLength);
+ return [[NSString alloc] initWithBytesNoCopy:outputBytes
+ length:outputLength
+ encoding:NSASCIIStringEncoding
+ freeWhenDone:YES];
+ }
+ else if (outputBytes)
+ {
+ free(outputBytes);
+ }
+ return nil;
+}
+
+- (NSString *)base64EncodedString
+{
+ return [self base64EncodedStringWithWrapWidth:0];
+}
+
+@end
+
+
+@implementation NSString (Base64)
+
++ (NSString *)stringWithBase64EncodedString:(NSString *)string
+{
+ NSData *data = [NSData dataWithBase64EncodedString:string];
+ if (data)
+ {
+ return [[self alloc] initWithData:data encoding:NSUTF8StringEncoding];
+ }
+ return nil;
+}
+
+- (NSString *)base64EncodedStringWithWrapWidth:(NSUInteger)wrapWidth
+{
+ NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
+ return [data base64EncodedStringWithWrapWidth:wrapWidth];
+}
+
+- (NSString *)base64EncodedString
+{
+ NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
+ return [data base64EncodedString];
+}
+
+- (NSString *)base64DecodedString
+{
+ return [NSString stringWithBase64EncodedString:self];
+}
+
+- (NSData *)base64DecodedData
+{
+ return [NSData dataWithBase64EncodedString:self];
+}
+
+@end