Index: Doxyfile ================================================================== --- Doxyfile +++ Doxyfile @@ -4,10 +4,11 @@ FILE_PATTERNS = *.h *.m HTML_OUTPUT = . GENERATE_LATEX = NO HIDE_UNDOC_CLASSES = YES HIDE_UNDOC_MEMBERS = YES +TYPEDEF_HIDES_STRUCT = YES PREDEFINED = __OBJC__ \ DOXYGEN \ OF_BOXABLE \ OF_CONSUMED \ OF_DESIGNATED_INITIALIZER \ Index: README.md ================================================================== --- README.md +++ README.md @@ -159,19 +159,19 @@ $ clang="clang -isysroot $(xcrun --sdk iphoneos --show-sdk-path)" $ export OBJC="$clang -arch armv7 -arch arm64" $ export OBJCPP="$clang -arch armv7 -E" $ export IPHONEOS_DEPLOYMENT_TARGET="9.0" - $ ./configure --prefix=/usr/local/ios --host=arm-apple-darwin + $ ./configure --prefix=/usr/local/ios --host=arm64-apple-darwin To build for the iOS simulator, use something like this: $ clang="clang -isysroot $(xcrun --sdk iphonesimulator --show-sdk-path)" $ export OBJC="$clang -arch i386 -arch x86_64" $ export OBJCPP="$clang -arch i386 -E" $ export IPHONEOS_DEPLOYMENT_TARGET="9.0" - $ ./configure --prefix=/usr/local/iossim --host=i386-apple-darwin + $ ./configure --prefix=/usr/local/iossim --host=x86_64-apple-darwin

Using the macOS or iOS framework in Xcode

To use the macOS framework in Xcode, you need to add the `.framework`s to your project and add the following flags to `Other C Flags`: @@ -315,11 +315,11 @@ This creates a file `MyFirstApp.m`. The `-[applicationDidFinishLaunching]` method is called as soon as ObjFW finished all initialization. Use this as the entry point to your own code. For example, you could add the following line there to create a "Hello World": - [of_stdout writeLine: @"Hello World!"]; + [OFStdOut writeLine: @"Hello World!"]; You can compile your new app using `objfw-compile`: $ objfw-compile -o MyFirstApp MyFirstApp.m Index: generators/unicode/TableGenerator.h ================================================================== --- generators/unicode/TableGenerator.h +++ generators/unicode/TableGenerator.h @@ -20,31 +20,31 @@ @interface TableGenerator: OFObject { OFHTTPClient *_HTTPClient; - of_unichar_t _uppercaseTable[0x110000]; - of_unichar_t _lowercaseTable[0x110000]; - of_unichar_t _titlecaseTable[0x110000]; - of_unichar_t _casefoldingTable[0x110000]; + OFUnichar _uppercaseTable[0x110000]; + OFUnichar _lowercaseTable[0x110000]; + OFUnichar _titlecaseTable[0x110000]; + OFUnichar _caseFoldingTable[0x110000]; OFString *_decompositionTable[0x110000]; OFString *_decompositionCompatTable[0x110000]; char _uppercaseTableUsed[0x1100]; char _lowercaseTableUsed[0x1100]; char _titlecaseTableUsed[0x1100]; - char _casefoldingTableUsed[0x1100]; + char _caseFoldingTableUsed[0x1100]; char _decompositionTableUsed[0x1100]; char _decompositionCompatTableUsed[0x1100]; size_t _uppercaseTableSize; size_t _lowercaseTableSize; size_t _titlecaseTableSize; - size_t _casefoldingTableSize; + size_t _caseFoldingTableSize; size_t _decompositionTableSize; size_t _decompositionCompatTableSize; enum { - STATE_UNICODE_DATA, - STATE_CASE_FOLDING + stateUnicodeData, + stateCaseFolding } _state; } - (void)parseUnicodeData: (OFHTTPResponse *)response; - (void)parseCaseFolding: (OFHTTPResponse *)response; Index: generators/unicode/TableGenerator.m ================================================================== --- generators/unicode/TableGenerator.m +++ generators/unicode/TableGenerator.m @@ -30,14 +30,14 @@ #import "OFOutOfRangeException.h" #import "TableGenerator.h" #import "copyright.h" -#define UNICODE_DATA_URL \ - @"http://www.unicode.org/Public/UNIDATA/UnicodeData.txt" -#define CASE_FOLDING_URL \ - @"http://www.unicode.org/Public/UNIDATA/CaseFolding.txt" +static OFString *const unicodeDataURL = + @"http://www.unicode.org/Public/UNIDATA/UnicodeData.txt"; +static OFString *const caseFoldingURL = + @"http://www.unicode.org/Public/UNIDATA/CaseFolding.txt"; OF_APPLICATION_DELEGATE(TableGenerator) @implementation TableGenerator - (instancetype)init @@ -49,11 +49,11 @@ _HTTPClient.delegate = self; _uppercaseTableSize = SIZE_MAX; _lowercaseTableSize = SIZE_MAX; _titlecaseTableSize = SIZE_MAX; - _casefoldingTableSize = SIZE_MAX; + _caseFoldingTableSize = SIZE_MAX; _decompositionTableSize = SIZE_MAX; _decompositionCompatTableSize = SIZE_MAX; } @catch (id e) { @throw e; [self release]; @@ -64,14 +64,14 @@ - (void)applicationDidFinishLaunching { OFHTTPRequest *request; - [of_stdout writeString: @"Downloading UnicodeData.txt…"]; - _state = STATE_UNICODE_DATA; + [OFStdOut writeString: @"Downloading UnicodeData.txt…"]; + _state = stateUnicodeData; request = [OFHTTPRequest requestWithURL: - [OFURL URLWithString: UNICODE_DATA_URL]]; + [OFURL URLWithString: unicodeDataURL]]; [_HTTPClient asyncPerformRequest: request]; } - (void)client: (OFHTTPClient *)client didPerformRequest: (OFHTTPRequest *)request @@ -79,17 +79,17 @@ exception: (id)exception { if (exception != nil) @throw exception; - [of_stdout writeLine: @" done"]; + [OFStdOut writeLine: @" done"]; switch (_state) { - case STATE_UNICODE_DATA: + case stateUnicodeData: [self parseUnicodeData: response]; break; - case STATE_CASE_FOLDING: + case stateCaseFolding: [self parseCaseFolding: response]; break; } } @@ -96,39 +96,39 @@ - (void)parseUnicodeData: (OFHTTPResponse *)response { OFString *line; OFHTTPRequest *request; - [of_stdout writeString: @"Parsing UnicodeData.txt…"]; + [OFStdOut writeString: @"Parsing UnicodeData.txt…"]; while ((line = [response readLine]) != nil) { void *pool2; OFArray OF_GENERIC(OFString *) *components; - of_unichar_t codePoint; + OFUnichar codePoint; if (line.length == 0) continue; pool2 = objc_autoreleasePoolPush(); components = [line componentsSeparatedByString: @";"]; if (components.count != 15) { - of_log(@"Invalid line: %@\n", line); + OFLog(@"Invalid line: %@\n", line); [OFApplication terminateWithStatus: 1]; } - codePoint = (of_unichar_t)[[components objectAtIndex: 0] + codePoint = (OFUnichar)[[components objectAtIndex: 0] unsignedLongLongValueWithBase: 16]; if (codePoint > 0x10FFFF) @throw [OFOutOfRangeException exception]; - _uppercaseTable[codePoint] = (of_unichar_t)[[components + _uppercaseTable[codePoint] = (OFUnichar)[[components objectAtIndex: 12] unsignedLongLongValueWithBase: 16]; - _lowercaseTable[codePoint] = (of_unichar_t)[[components + _lowercaseTable[codePoint] = (OFUnichar)[[components objectAtIndex: 13] unsignedLongLongValueWithBase: 16]; - _titlecaseTable[codePoint] = (of_unichar_t)[[components + _titlecaseTable[codePoint] = (OFUnichar)[[components objectAtIndex: 14] unsignedLongLongValueWithBase: 16]; if ([[components objectAtIndex: 5] length] > 0) { OFArray *decomposed = [[components objectAtIndex: 5] componentsSeparatedByString: @" "]; @@ -135,18 +135,18 @@ bool compat = false; OFMutableString *string; if ([decomposed.firstObject hasPrefix: @"<"]) { decomposed = [decomposed objectsInRange: - of_range(1, decomposed.count - 1)]; + OFRangeMake(1, decomposed.count - 1)]; compat = true; } string = [OFMutableString string]; for (OFString *character in decomposed) { - of_unichar_t unichar = (of_unichar_t)[character + OFUnichar unichar = (OFUnichar)[character unsignedLongLongValueWithBase: 16]; [string appendCharacters: &unichar length: 1]; } @@ -162,58 +162,58 @@ } [self applyDecompositionRecursivelyForTable: _decompositionTable]; [self applyDecompositionRecursivelyForTable: _decompositionCompatTable]; - [of_stdout writeLine: @" done"]; + [OFStdOut writeLine: @" done"]; - [of_stdout writeString: @"Downloading CaseFolding.txt…"]; - _state = STATE_CASE_FOLDING; + [OFStdOut writeString: @"Downloading CaseFolding.txt…"]; + _state = stateCaseFolding; request = [OFHTTPRequest requestWithURL: - [OFURL URLWithString: CASE_FOLDING_URL]]; + [OFURL URLWithString: caseFoldingURL]]; [_HTTPClient asyncPerformRequest: request]; } - (void)parseCaseFolding: (OFHTTPResponse *)response { OFString *line; - [of_stdout writeString: @"Parsing CaseFolding.txt…"]; + [OFStdOut writeString: @"Parsing CaseFolding.txt…"]; while ((line = [response readLine]) != nil) { void *pool2; OFArray OF_GENERIC(OFString *) *components; - of_unichar_t codePoint; + OFUnichar codePoint; if (line.length == 0 || [line hasPrefix: @"#"]) continue; pool2 = objc_autoreleasePoolPush(); components = [line componentsSeparatedByString: @"; "]; if (components.count != 4) { - of_log(@"Invalid line: %s\n", line); + OFLog(@"Invalid line: %s\n", line); [OFApplication terminateWithStatus: 1]; } if (![[components objectAtIndex: 1] isEqual: @"S"] && ![[components objectAtIndex: 1] isEqual: @"C"]) continue; - codePoint = (of_unichar_t)[[components objectAtIndex: 0] + codePoint = (OFUnichar)[[components objectAtIndex: 0] unsignedLongLongValueWithBase: 16]; if (codePoint > 0x10FFFF) @throw [OFOutOfRangeException exception]; - _casefoldingTable[codePoint] = (of_unichar_t)[[components + _caseFoldingTable[codePoint] = (OFUnichar)[[components objectAtIndex: 2] unsignedLongLongValueWithBase: 16]; objc_autoreleasePoolPop(pool2); } - [of_stdout writeLine: @" done"]; + [OFStdOut writeLine: @" done"]; [self writeFiles]; } - (void)applyDecompositionRecursivelyForTable: (OFString *[0x110000])table @@ -221,13 +221,13 @@ bool done; do { done = true; - for (of_unichar_t i = 0; i < 0x110000; i++) { + for (OFUnichar i = 0; i < 0x110000; i++) { void *pool; - const of_unichar_t *characters; + const OFUnichar *characters; size_t length; OFMutableString *replacement; bool changed = false; if (table[i] == nil) @@ -270,19 +270,19 @@ - (void)writeFiles { OFURL *URL; - [of_stdout writeString: @"Writing files…"]; + [OFStdOut writeString: @"Writing files…"]; URL = [OFURL fileURLWithPath: @"../../src/unicode.m"]; [self writeTablesToFile: URL.fileSystemRepresentation]; URL = [OFURL fileURLWithPath: @"../../src/unicode.h"]; [self writeHeaderToFile: URL.fileSystemRepresentation]; - [of_stdout writeLine: @" done"]; + [OFStdOut writeLine: @" done"]; [OFApplication terminate]; } - (void)writeTablesToFile: (OFString *)path @@ -293,19 +293,19 @@ [file writeString: COPYRIGHT @"#include \"config.h\"\n" @"\n" @"#import \"OFString.h\"\n\n" - @"static const of_unichar_t emptyPage[0x100] = { 0 };\n" + @"static const OFUnichar emptyPage[0x100] = { 0 };\n" @"static const char *emptyDecompositionPage[0x100] = { NULL };\n" @"\n"]; /* Write uppercasePage%u */ - for (of_unichar_t i = 0; i < 0x110000; i += 0x100) { + for (OFUnichar i = 0; i < 0x110000; i += 0x100) { bool isEmpty = true; - for (of_unichar_t j = i; j < i + 0x100; j++) { + for (OFUnichar j = i; j < i + 0x100; j++) { if (_uppercaseTable[j] != 0) { isEmpty = false; _uppercaseTableSize = i >> 8; _uppercaseTableUsed[_uppercaseTableSize] = 1; break; @@ -313,15 +313,15 @@ } if (!isEmpty) { void *pool2 = objc_autoreleasePoolPush(); - [file writeFormat: @"static const of_unichar_t " + [file writeFormat: @"static const OFUnichar " @"uppercasePage%u[0x100] = {\n", i >> 8]; - for (of_unichar_t j = i; j < i + 0x100; j += 8) + for (OFUnichar j = i; j < i + 0x100; j += 8) [file writeFormat: @"\t%u, %u, %u, %u, %u, %u, %u, %u,\n", _uppercaseTable[j], _uppercaseTable[j + 1], _uppercaseTable[j + 2], @@ -336,14 +336,14 @@ objc_autoreleasePoolPop(pool2); } } /* Write lowercasePage%u */ - for (of_unichar_t i = 0; i < 0x110000; i += 0x100) { + for (OFUnichar i = 0; i < 0x110000; i += 0x100) { bool isEmpty = true; - for (of_unichar_t j = i; j < i + 0x100; j++) { + for (OFUnichar j = i; j < i + 0x100; j++) { if (_lowercaseTable[j] != 0) { isEmpty = false; _lowercaseTableSize = i >> 8; _lowercaseTableUsed[_lowercaseTableSize] = 1; break; @@ -351,15 +351,15 @@ } if (!isEmpty) { void *pool2 = objc_autoreleasePoolPush(); - [file writeFormat: @"static const of_unichar_t " + [file writeFormat: @"static const OFUnichar " @"lowercasePage%u[0x100] = {\n", i >> 8]; - for (of_unichar_t j = i; j < i + 0x100; j += 8) + for (OFUnichar j = i; j < i + 0x100; j += 8) [file writeFormat: @"\t%u, %u, %u, %u, %u, %u, %u, %u,\n", _lowercaseTable[j], _lowercaseTable[j + 1], _lowercaseTable[j + 2], @@ -374,18 +374,18 @@ objc_autoreleasePoolPop(pool2); } } /* Write titlecasePage%u if it does NOT match uppercasePage%u */ - for (of_unichar_t i = 0; i < 0x110000; i += 0x100) { + for (OFUnichar i = 0; i < 0x110000; i += 0x100) { bool isEmpty = true; - for (of_unichar_t j = i; j < i + 0x100; j++) { + for (OFUnichar j = i; j < i + 0x100; j++) { if (_titlecaseTable[j] != 0) { isEmpty = !memcmp(_uppercaseTable + i, _titlecaseTable + i, - 256 * sizeof(of_unichar_t)); + 256 * sizeof(OFUnichar)); _titlecaseTableSize = i >> 8; _titlecaseTableUsed[_titlecaseTableSize] = (isEmpty ? 2 : 1); break; } @@ -392,15 +392,15 @@ } if (!isEmpty) { void *pool2 = objc_autoreleasePoolPush(); - [file writeFormat: @"static const of_unichar_t " + [file writeFormat: @"static const OFUnichar " @"titlecasePage%u[0x100] = {\n", i >> 8]; - for (of_unichar_t j = i; j < i + 0x100; j += 8) + for (OFUnichar j = i; j < i + 0x100; j += 8) [file writeFormat: @"\t%u, %u, %u, %u, %u, %u, %u, %u,\n", _titlecaseTable[j], _titlecaseTable[j + 1], _titlecaseTable[j + 2], @@ -414,56 +414,56 @@ objc_autoreleasePoolPop(pool2); } } - /* Write casefoldingPage%u if it does NOT match lowercasePage%u */ - for (of_unichar_t i = 0; i < 0x110000; i += 0x100) { + /* Write caseFoldingPage%u if it does NOT match lowercasePage%u */ + for (OFUnichar i = 0; i < 0x110000; i += 0x100) { bool isEmpty = true; - for (of_unichar_t j = i; j < i + 0x100; j++) { - if (_casefoldingTable[j] != 0) { + for (OFUnichar j = i; j < i + 0x100; j++) { + if (_caseFoldingTable[j] != 0) { isEmpty = !memcmp(_lowercaseTable + i, - _casefoldingTable + i, - 256 * sizeof(of_unichar_t)); - _casefoldingTableSize = i >> 8; - _casefoldingTableUsed[_casefoldingTableSize] = + _caseFoldingTable + i, + 256 * sizeof(OFUnichar)); + _caseFoldingTableSize = i >> 8; + _caseFoldingTableUsed[_caseFoldingTableSize] = (isEmpty ? 2 : 1); break; } } if (!isEmpty) { void *pool2 = objc_autoreleasePoolPush(); - [file writeFormat: @"static const of_unichar_t " - @"casefoldingPage%u[0x100] = {\n", + [file writeFormat: @"static const OFUnichar " + @"caseFoldingPage%u[0x100] = {\n", i >> 8]; - for (of_unichar_t j = i; j < i + 0x100; j += 8) + for (OFUnichar j = i; j < i + 0x100; j += 8) [file writeFormat: @"\t%u, %u, %u, %u, %u, %u, %u, %u,\n", - _casefoldingTable[j], - _casefoldingTable[j + 1], - _casefoldingTable[j + 2], - _casefoldingTable[j + 3], - _casefoldingTable[j + 4], - _casefoldingTable[j + 5], - _casefoldingTable[j + 6], - _casefoldingTable[j + 7]]; + _caseFoldingTable[j], + _caseFoldingTable[j + 1], + _caseFoldingTable[j + 2], + _caseFoldingTable[j + 3], + _caseFoldingTable[j + 4], + _caseFoldingTable[j + 5], + _caseFoldingTable[j + 6], + _caseFoldingTable[j + 7]]; [file writeString: @"};\n\n"]; objc_autoreleasePoolPop(pool2); } } /* Write decompositionPage%u */ - for (of_unichar_t i = 0; i < 0x110000; i += 0x100) { + for (OFUnichar i = 0; i < 0x110000; i += 0x100) { bool isEmpty = true; - for (of_unichar_t j = i; j < i + 0x100; j++) { + for (OFUnichar j = i; j < i + 0x100; j++) { if (_decompositionTable[j] != nil) { isEmpty = false; _decompositionTableSize = i >> 8; _decompositionTableUsed[ _decompositionTableSize] = 1; @@ -476,11 +476,11 @@ [file writeFormat: @"static const char *const " @"decompositionPage%u[0x100] = {\n", i >> 8]; - for (of_unichar_t j = i; j < i + 0x100; j++) { + for (OFUnichar j = i; j < i + 0x100; j++) { if ((j - i) % 2 == 0) [file writeString: @"\t"]; else [file writeString: @" "]; @@ -510,14 +510,14 @@ objc_autoreleasePoolPop(pool2); } } /* Write decompCompatPage%u if it does NOT match decompositionPage%u */ - for (of_unichar_t i = 0; i < 0x110000; i += 0x100) { + for (OFUnichar i = 0; i < 0x110000; i += 0x100) { bool isEmpty = true; - for (of_unichar_t j = i; j < i + 0x100; j++) { + for (OFUnichar j = i; j < i + 0x100; j++) { if (_decompositionCompatTable[j] != 0) { /* * We bulk-compare pointers via memcmp here. * This is safe, as we always set the same * pointer in both tables if both are the same. @@ -539,11 +539,11 @@ [file writeFormat: @"static const char *const " @"decompCompatPage%u[0x100] = {\n", i >> 8]; - for (of_unichar_t j = i; j < i + 0x100; j++) { + for (OFUnichar j = i; j < i + 0x100; j++) { if ((j - i) % 2 == 0) [file writeString: @"\t"]; else [file writeString: @" "]; @@ -581,20 +581,20 @@ * But from now on, we need the size. */ _uppercaseTableSize++; _lowercaseTableSize++; _titlecaseTableSize++; - _casefoldingTableSize++; + _caseFoldingTableSize++; _decompositionTableSize++; _decompositionCompatTableSize++; - /* Write of_unicode_uppercase_table */ - [file writeFormat: @"const of_unichar_t *const " - @"of_unicode_uppercase_table[0x%X] = {\n\t", + /* Write OFUnicodeUppercaseTable */ + [file writeFormat: @"const OFUnichar *const " + @"OFUnicodeUppercaseTable[0x%X] = {\n\t", _uppercaseTableSize]; - for (of_unichar_t i = 0; i < _uppercaseTableSize; i++) { + for (OFUnichar i = 0; i < _uppercaseTableSize; i++) { if (_uppercaseTableUsed[i]) [file writeFormat: @"uppercasePage%u", i]; else [file writeString: @"emptyPage"]; @@ -606,16 +606,16 @@ } } [file writeString: @"\n};\n\n"]; - /* Write of_unicode_lowercase_table */ - [file writeFormat: @"const of_unichar_t *const " - @"of_unicode_lowercase_table[0x%X] = {\n\t", + /* Write OFUnicodeLowercaseTable */ + [file writeFormat: @"const OFUnichar *const " + @"OFUnicodeLowercaseTable[0x%X] = {\n\t", _lowercaseTableSize]; - for (of_unichar_t i = 0; i < _lowercaseTableSize; i++) { + for (OFUnichar i = 0; i < _lowercaseTableSize; i++) { if (_lowercaseTableUsed[i]) [file writeFormat: @"lowercasePage%u", i]; else [file writeString: @"emptyPage"]; @@ -627,16 +627,16 @@ } } [file writeString: @"\n};\n\n"]; - /* Write of_unicode_titlecase_table */ - [file writeFormat: @"const of_unichar_t *const " - @"of_unicode_titlecase_table[0x%X] = {\n\t", + /* Write OFUnicodeTitlecaseTable */ + [file writeFormat: @"const OFUnichar *const " + @"OFUnicodeTitlecaseTable[0x%X] = {\n\t", _titlecaseTableSize]; - for (of_unichar_t i = 0; i < _titlecaseTableSize; i++) { + for (OFUnichar i = 0; i < _titlecaseTableSize; i++) { if (_titlecaseTableUsed[i] == 1) [file writeFormat: @"titlecasePage%u", i]; else if (_titlecaseTableUsed[i] == 2) [file writeFormat: @"uppercasePage%u", i]; else @@ -650,39 +650,39 @@ } } [file writeString: @"\n};\n\n"]; - /* Write of_unicode_casefolding_table */ - [file writeFormat: @"const of_unichar_t *const " - @"of_unicode_casefolding_table[0x%X] = {\n\t", - _casefoldingTableSize]; - - for (of_unichar_t i = 0; i < _casefoldingTableSize; i++) { - if (_casefoldingTableUsed[i] == 1) - [file writeFormat: @"casefoldingPage%u", i]; - else if (_casefoldingTableUsed[i] == 2) + /* Write OFUnicodeCaseFoldingTable */ + [file writeFormat: @"const OFUnichar *const " + @"OFUnicodeCaseFoldingTable[0x%X] = {\n\t", + _caseFoldingTableSize]; + + for (OFUnichar i = 0; i < _caseFoldingTableSize; i++) { + if (_caseFoldingTableUsed[i] == 1) + [file writeFormat: @"caseFoldingPage%u", i]; + else if (_caseFoldingTableUsed[i] == 2) [file writeFormat: @"lowercasePage%u", i]; else [file writeString: @"emptyPage"]; - if (i + 1 < _casefoldingTableSize) { + if (i + 1 < _caseFoldingTableSize) { if ((i + 1) % 3 == 0) [file writeString: @",\n\t"]; else [file writeString: @", "]; } } [file writeString: @"\n};\n\n"]; - /* Write of_unicode_decomposition_table */ + /* Write OFUnicodeDecompositionTable */ [file writeFormat: @"const char *const " - @"*of_unicode_decomposition_table[0x%X] = {\n\t", + @"*OFUnicodeDecompositionTable[0x%X] = {\n\t", _decompositionTableSize]; - for (of_unichar_t i = 0; i < _decompositionTableSize; i++) { + for (OFUnichar i = 0; i < _decompositionTableSize; i++) { if (_decompositionTableUsed[i]) [file writeFormat: @"decompositionPage%u", i]; else [file writeString: @"emptyDecompositionPage"]; @@ -694,17 +694,17 @@ } } [file writeString: @"\n};\n\n"]; - /* Write of_unicode_decomposition_compat_table */ + /* Write OFUnicodeDecompositionCompatTable */ [file writeFormat: @"const char *const " - @"*of_unicode_decomposition_compat_table[0x%X] = {" + @"*OFUnicodeDecompositionCompatTable[0x%X] = {" @"\n\t", _decompositionCompatTableSize]; - for (of_unichar_t i = 0; i < _decompositionCompatTableSize; i++) { + for (OFUnichar i = 0; i < _decompositionCompatTableSize; i++) { if (_decompositionCompatTableUsed[i] == 1) [file writeFormat: @"decompCompatPage%u", i]; else if (_decompositionCompatTableUsed[i] == 2) [file writeFormat: @"decompositionPage%u", i]; else @@ -731,44 +731,40 @@ [file writeString: COPYRIGHT @"#import \"OFString.h\"\n\n"]; [file writeFormat: - @"#define OF_UNICODE_UPPERCASE_TABLE_SIZE 0x%X\n" - @"#define OF_UNICODE_LOWERCASE_TABLE_SIZE 0x%X\n" - @"#define OF_UNICODE_TITLECASE_TABLE_SIZE 0x%X\n" - @"#define OF_UNICODE_CASEFOLDING_TABLE_SIZE 0x%X\n" - @"#define OF_UNICODE_DECOMPOSITION_TABLE_SIZE 0x%X\n" - @"#define OF_UNICODE_DECOMPOSITION_COMPAT_TABLE_SIZE 0x%X\n\n", + @"#define OFUnicodeUppercaseTableSize 0x%X\n" + @"#define OFUnicodeLowercaseTableSize 0x%X\n" + @"#define OFUnicodeTitlecaseTableSize 0x%X\n" + @"#define OFUnicodeCaseFoldingTableSize 0x%X\n" + @"#define OFUnicodeDecompositionTableSize 0x%X\n" + @"#define OFUnicodeDecompositionCompatTableSize 0x%X\n\n", _uppercaseTableSize, _lowercaseTableSize, _titlecaseTableSize, - _casefoldingTableSize, _decompositionTableSize, + _caseFoldingTableSize, _decompositionTableSize, _decompositionCompatTableSize]; [file writeString: @"#ifdef __cplusplus\n" @"extern \"C\" {\n" @"#endif\n" - @"extern const of_unichar_t *const _Nonnull\n" - @" of_unicode_uppercase_table[" - @"OF_UNICODE_UPPERCASE_TABLE_SIZE];\n" - @"extern const of_unichar_t *const _Nonnull\n" - @" of_unicode_lowercase_table[" - @"OF_UNICODE_LOWERCASE_TABLE_SIZE];\n" - @"extern const of_unichar_t *const _Nonnull\n" - @" of_unicode_titlecase_table[" - @"OF_UNICODE_TITLECASE_TABLE_SIZE];\n" - @"extern const of_unichar_t *const _Nonnull\n" - @" of_unicode_casefolding_table[" - @"OF_UNICODE_CASEFOLDING_TABLE_SIZE];\n" - @"extern const char *const _Nullable *const _Nonnull\n" - @" of_unicode_decomposition_table[" - @"OF_UNICODE_DECOMPOSITION_TABLE_SIZE];\n" - @"extern const char *const _Nullable *const _Nonnull\n" - @" of_unicode_decomposition_compat_table[" - @"OF_UNICODE_DECOMPOSITION_COMPAT_TABLE_SIZE];\n" + @"extern const OFUnichar *const _Nonnull\n" + @" OFUnicodeUppercaseTable[OFUnicodeUppercaseTableSize];\n" + @"extern const OFUnichar *const _Nonnull\n" + @" OFUnicodeLowercaseTable[OFUnicodeLowercaseTableSize];\n" + @"extern const OFUnichar *const _Nonnull\n" + @" OFUnicodeTitlecaseTable[OFUnicodeTitlecaseTableSize];\n" + @"extern const OFUnichar *const _Nonnull\n" + @" OFUnicodeCaseFoldingTable[OFUnicodeCaseFoldingTableSize];\n" + @"extern const char *const _Nullable *const _Nonnull\n" + @" OFUnicodeDecompositionTable[" + @"OFUnicodeDecompositionTableSize];\n" + @"extern const char *const _Nullable *const _Nonnull\n" + @" OFUnicodeDecompositionCompatTable[" + @"OFUnicodeDecompositionCompatTableSize];\n" @"#ifdef __cplusplus\n" @"}\n" @"#endif\n"]; objc_autoreleasePoolPop(pool); } @end Index: src/Makefile ================================================================== --- src/Makefile +++ src/Makefile @@ -8,13 +8,17 @@ STATIC_LIB = ${OBJFW_STATIC_LIB} FRAMEWORK = ${OBJFW_FRAMEWORK} LIB_MAJOR = ${OBJFW_LIB_MAJOR} LIB_MINOR = ${OBJFW_LIB_MINOR} -SRCS = OFApplication.m \ +SRCS = OFASPrintF.m \ + OFApplication.m \ OFArray.m \ + OFBase64.m \ OFBlock.m \ + OFCRC16.m \ + OFCRC32.m \ OFCharacterSet.m \ OFColor.m \ OFConstantString.m \ OFCountedSet.m \ OFData.m \ @@ -24,19 +28,20 @@ OFDictionary.m \ OFEnumerator.m \ OFFileManager.m \ OFGZIPStream.m \ OFHMAC.m \ + OFHuffmanTree.m \ OFInflate64Stream.m \ OFInflateStream.m \ OFInvocation.m \ OFLHAArchive.m \ OFLHAArchiveEntry.m \ OFList.m \ OFLocale.m \ - OFMapTable.m \ OFMD5Hash.m \ + OFMapTable.m \ OFMessagePackExtension.m \ OFMethodSignature.m \ OFMutableArray.m \ OFMutableData.m \ OFMutableDictionary.m \ @@ -51,27 +56,31 @@ OFNull.m \ OFNumber.m \ OFObject.m \ OFObject+KeyValueCoding.m \ OFObject+Serialization.m \ + OFOnce.m \ OFOptionsParser.m \ + OFPBKDF2.m \ OFPair.m \ OFRIPEMD160Hash.m \ OFRunLoop.m \ - OFSandbox.m \ - OFSecureData.m \ - OFSeekableStream.m \ - OFSet.m \ OFSHA1Hash.m \ OFSHA224Hash.m \ OFSHA224Or256Hash.m \ OFSHA256Hash.m \ OFSHA384Hash.m \ OFSHA384Or512Hash.m \ OFSHA512Hash.m \ + OFScrypt.m \ + OFSecureData.m \ + OFSeekableStream.m \ + OFSerialization.m \ + OFSet.m \ OFSortedList.m \ OFStdIOStream.m \ + OFStrPTime.m \ OFStream.m \ OFString.m \ OFString+CryptographicHashing.m \ OFString+JSONParsing.m \ OFString+PropertyListParsing.m \ @@ -96,23 +105,13 @@ OFXMLElement.m \ OFXMLElement+Serialization.m \ OFXMLElementBuilder.m \ OFXMLNode.m \ OFXMLParser.m \ - OFXMLProcessingInstructions.m \ + OFXMLProcessingInstruction.m \ OFZIPArchive.m \ OFZIPArchiveEntry.m \ - base64.m \ - crc16.m \ - crc32.m \ - huffman_tree.m \ - of_asprintf.m \ - of_strptime.m \ - once.m \ - pbkdf2.m \ - scrypt.m \ - ${UNICODE_M} \ ${USE_SRCS_FILES} \ ${USE_SRCS_PLUGINS} \ ${USE_SRCS_SOCKETS} \ ${USE_SRCS_THREADS} \ ${USE_SRCS_WINDOWS} @@ -135,45 +134,43 @@ OFHTTPCookieManager.m \ OFHTTPRequest.m \ OFHTTPResponse.m \ OFHTTPServer.m \ OFSequencedPacketSocket.m \ + OFSocket.m \ OFStreamSocket.m \ OFTCPSocket.m \ OFUDPSocket.m \ - socket.m \ ${USE_SRCS_IPX} SRCS_THREADS = OFCondition.m \ OFMutex.m \ + OFPlainCondition.m \ + OFPlainMutex.m \ + OFPlainThread.m \ OFRecursiveMutex.m \ - OFThreadPool.m \ - condition.m \ - mutex.m \ - thread.m \ - tlskey.m + OFTLSKey.m \ + OFThreadPool.m SRCS_WINDOWS = OFWin32ConsoleStdIOStream.m \ OFWindowsRegistryKey.m -INCLUDES_ATOMIC = atomic.h \ - atomic_builtins.h \ - atomic_no_threads.h \ - atomic_osatomic.h \ - atomic_powerpc.h \ - atomic_sync_builtins.h \ - atomic_x86.h +INCLUDES_ATOMIC = OFAtomic.h \ + OFAtomic_builtins.h \ + OFAtomic_no_threads.h \ + OFAtomic_osatomic.h \ + OFAtomic_powerpc.h \ + OFAtomic_sync_builtins.h \ + OFAtomic_x86.h INCLUDES := ${SRCS:.m=.h} \ OFCollection.h \ OFCryptographicHash.h \ OFJSONRepresentation.h \ OFKernelEventObserver.h \ OFKeyValueCoding.h \ OFLocking.h \ OFMessagePackRepresentation.h \ - OFSerialization.h \ OFTLSSocket.h \ ObjFW.h \ - block.h \ macros.h \ objfw-defs.h \ platform.h \ ${USE_INCLUDES_ATOMIC} @@ -180,11 +177,10 @@ SRCS += OFAdjacentArray.m \ OFAdjacentSubarray.m \ OFBitSetCharacterSet.m \ OFBytesValue.m \ OFCountedMapTableSet.m \ - OFDimensionValue.m \ OFInvertedCharacterSet.m \ OFLHADecompressingStream.m \ OFMapTableDictionary.m \ OFMapTableSet.m \ OFMutableAdjacentArray.m \ @@ -194,16 +190,19 @@ OFNonretainedObjectValue.m \ OFPointValue.m \ OFPointerValue.m \ OFRangeCharacterSet.m \ OFRangeValue.m \ - OFRectangleValue.m \ + OFRectValue.m \ + OFSandbox.m \ + OFSizeValue.m \ OFSubarray.m \ OFUTF8String.m \ ${LIBBASES_M} \ ${RUNTIME_AUTORELEASE_M} \ - ${RUNTIME_INSTANCE_M} + ${RUNTIME_INSTANCE_M} \ + ${UNICODE_M} SRCS_FILES += OFFileURLHandler.m \ OFINIFileSettings.m SRCS_SOCKETS += OFDNSResolverSettings.m \ OFHTTPURLHandler.m \ OFHostAddressResolver.m \ ADDED src/OFASPrintF.h Index: src/OFASPrintF.h ================================================================== --- src/OFASPrintF.h +++ src/OFASPrintF.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#ifndef __STDC_LIMIT_MACROS +# define __STDC_LIMIT_MACROS +#endif +#ifndef __STDC_CONSTANT_MACROS +# define __STDC_CONSTANT_MACROS +#endif + +#include + +#import "macros.h" + +OF_ASSUME_NONNULL_BEGIN + +#ifdef __cplusplus +extern "C" { +#endif +extern int OFVASPrintF( + char *_Nullable *_Nonnull, const char *_Nonnull, va_list); +#ifdef __cplusplus +} +#endif + +OF_ASSUME_NONNULL_END ADDED src/OFASPrintF.m Index: src/OFASPrintF.m ================================================================== --- src/OFASPrintF.m +++ src/OFASPrintF.m @@ -0,0 +1,783 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#include +#include +#include +#include +#include + +#ifdef HAVE_WCHAR_H +# include +#endif + +#ifdef HAVE_ASPRINTF_L +# include +#endif +#ifdef HAVE_XLOCALE_H +# include +#endif + +#ifdef OF_HAVE_SYS_TYPES_H +# include +#endif + +#import "OFString.h" +#import "OFLocale.h" + +#import "OFInitializationFailedException.h" + +#define maxSubformatLen 64 + +#ifndef HAVE_ASPRINTF +/* + * (v)asprintf might be declared, but HAVE_ASPRINTF not defined because + * configure determined it is broken. In this case, we must make sure there is + * no name clash. + */ +# define asprintf asprintf_ +# define vasprintf vasprintf_ +#endif + +struct context { + const char *format; + size_t formatLen; + char subformat[maxSubformatLen + 1]; + size_t subformatLen; + va_list arguments; + char *buffer; + size_t bufferLen; + size_t i, last; + enum { + stateString, + stateFormatFlags, + stateFormatFieldWidth, + stateFormatLengthModifier, + stateFormatConversionSpecifier + } state; + enum { + lengthModifierNone, + lengthModifierHH, + lengthModifierH, + lengthModifierL, + lengthModifierLL, + lengthModifierJ, + lengthModifierZ, + lengthModifierT, + lengthModifierCapitalL + } lengthModifier; + bool useLocale; +}; + +#ifdef HAVE_ASPRINTF_L +static locale_t cLocale; + +OF_CONSTRUCTOR() +{ + if ((cLocale = newlocale(LC_ALL_MASK, "C", NULL)) == NULL) + @throw [OFInitializationFailedException exception]; +} +#endif + +#ifndef HAVE_ASPRINTF +static int +vasprintf(char **string, const char *format, va_list arguments) +{ + int length; + size_t bufferLength = 128; + + *string = NULL; + + for (;;) { + free(*string); + + if ((*string = malloc(bufferLength)) == NULL) + return -1; + + length = vsnprintf(*string, bufferLength - 1, format, + arguments); + + if (length >= 0 && (size_t)length < bufferLength - 1) + break; + + if (bufferLength > INT_MAX / 2) { + free(*string); + return -1; + } + + bufferLength <<= 1; + } + + if (length > 0 && (size_t)length != bufferLength - 1) { + char *resized = realloc(*string, length + 1); + + /* Ignore if making it smaller failed. */ + if (resized != NULL) + *string = resized; + } + + return length; +} + +static int +asprintf(char **string, const char *format, ...) +{ + int ret; + va_list arguments; + + va_start(arguments, format); + ret = vasprintf(string, format, arguments); + va_end(arguments); + + return ret; +} +#endif + +static bool +appendString(struct context *ctx, const char *append, size_t appendLen) +{ + char *newBuf; + + if (appendLen == 0) + return true; + + if ((newBuf = realloc(ctx->buffer, + ctx->bufferLen + appendLen + 1)) == NULL) + return false; + + memcpy(newBuf + ctx->bufferLen, append, appendLen); + + ctx->buffer = newBuf; + ctx->bufferLen += appendLen; + + return true; +} + +static bool +appendSubformat(struct context *ctx, const char *subformat, + size_t subformatLen) +{ + if (ctx->subformatLen + subformatLen > maxSubformatLen) + return false; + + memcpy(ctx->subformat + ctx->subformatLen, subformat, subformatLen); + ctx->subformatLen += subformatLen; + ctx->subformat[ctx->subformatLen] = 0; + + return true; +} + +static bool +stringState(struct context *ctx) +{ + if (ctx->format[ctx->i] == '%') { + if (ctx->i > 0) + if (!appendString(ctx, ctx->format + ctx->last, + ctx->i - ctx->last)) + return false; + + if (!appendSubformat(ctx, ctx->format + ctx->i, 1)) + return false; + + ctx->last = ctx->i + 1; + ctx->state = stateFormatFlags; + } + + return true; +} + +static bool +formatFlagsState(struct context *ctx) +{ + switch (ctx->format[ctx->i]) { + case '-': + case '+': + case ' ': + case '#': + case '0': + if (!appendSubformat(ctx, ctx->format + ctx->i, 1)) + return false; + + break; + case ',': + /* ObjFW extension: Use decimal point from locale */ + ctx->useLocale = true; + break; + default: + ctx->state = stateFormatFieldWidth; + ctx->i--; + + break; + } + + return true; +} + +static bool +formatFieldWidthState(struct context *ctx) +{ + if ((ctx->format[ctx->i] >= '0' && ctx->format[ctx->i] <= '9') || + ctx->format[ctx->i] == '*' || ctx->format[ctx->i] == '.') { + if (!appendSubformat(ctx, ctx->format + ctx->i, 1)) + return false; + } else { + ctx->state = stateFormatLengthModifier; + ctx->i--; + } + + return true; +} + +static bool +formatLengthModifierState(struct context *ctx) +{ + /* Only one allowed */ + switch (ctx->format[ctx->i]) { + case 'h': /* and also hh */ + if (ctx->formatLen > ctx->i + 1 && + ctx->format[ctx->i + 1] == 'h') { + if (!appendSubformat(ctx, ctx->format + ctx->i, 2)) + return false; + + ctx->i++; + ctx->lengthModifier = lengthModifierHH; + } else { + if (!appendSubformat(ctx, ctx->format + ctx->i, 1)) + return false; + + ctx->lengthModifier = lengthModifierH; + } + + break; + case 'l': /* and also ll */ + if (ctx->formatLen > ctx->i + 1 && + ctx->format[ctx->i + 1] == 'l') { +#ifndef OF_WINDOWS + if (!appendSubformat(ctx, ctx->format + ctx->i, 2)) + return false; +#else + if (!appendSubformat(ctx, "I64", 3)) + return false; +#endif + + ctx->i++; + ctx->lengthModifier = lengthModifierLL; + } else { + if (!appendSubformat(ctx, ctx->format + ctx->i, 1)) + return false; + + ctx->lengthModifier = lengthModifierL; + } + + break; + case 'j': +#if defined(OF_WINDOWS) + if (!appendSubformat(ctx, "I64", 3)) + return false; +#elif defined(_NEWLIB_VERSION) || defined(OF_HPUX) + if (!appendSubformat(ctx, "ll", 2)) + return false; +#else + if (!appendSubformat(ctx, ctx->format + ctx->i, 1)) + return false; +#endif + + ctx->lengthModifier = lengthModifierJ; + + break; + case 'z': +#if defined(OF_WINDOWS) + if (sizeof(size_t) == 8) + if (!appendSubformat(ctx, "I64", 3)) + return false; +#elif defined(_NEWLIB_VERSION) || defined(OF_HPUX) + if (!appendSubformat(ctx, "l", 1)) + return false; +#else + if (!appendSubformat(ctx, ctx->format + ctx->i, 1)) + return false; +#endif + + ctx->lengthModifier = lengthModifierZ; + + break; + case 't': +#if defined(OF_WINDOWS) + if (sizeof(ptrdiff_t) == 8) + if (!appendSubformat(ctx, "I64", 3)) + return false; +#elif defined(_NEWLIB_VERSION) || defined(OF_HPUX) + if (!appendSubformat(ctx, "l", 1)) + return false; +#else + if (!appendSubformat(ctx, ctx->format + ctx->i, 1)) + return false; +#endif + + ctx->lengthModifier = lengthModifierT; + + break; + case 'L': + if (!appendSubformat(ctx, ctx->format + ctx->i, 1)) + return false; + + ctx->lengthModifier = lengthModifierCapitalL; + + break; +#ifdef OF_WINDOWS + case 'I': /* win32 strangeness (I64 instead of ll or j) */ + if (ctx->formatLen > ctx->i + 2 && + ctx->format[ctx->i + 1] == '6' && + ctx->format[ctx->i + 2] == '4') { + if (!appendSubformat(ctx, ctx->format + ctx->i, 3)) + return false; + + ctx->i += 2; + ctx->lengthModifier = lengthModifierLL; + } else + ctx->i--; + + break; +#endif +#ifdef OF_IOS + case 'q': /* iOS uses this for PRI?64 */ + if (!appendSubformat(ctx, ctx->format + ctx->i, 1)) + return false; + + ctx->lengthModifier = lengthModifierLL; + + break; +#endif + default: + ctx->i--; + + break; + } + + ctx->state = stateFormatConversionSpecifier; + return true; +} + +static bool +formatConversionSpecifierState(struct context *ctx) +{ + char *tmp = NULL; + int tmpLen = 0; +#ifndef HAVE_ASPRINTF_L + OFString *point; +#endif + + if (!appendSubformat(ctx, ctx->format + ctx->i, 1)) + return false; + + switch (ctx->format[ctx->i]) { + case '@': + if (ctx->lengthModifier != lengthModifierNone) + return false; + + ctx->subformat[ctx->subformatLen - 1] = 's'; + + @try { + id object; + + if ((object = va_arg(ctx->arguments, id)) != nil) { + void *pool = objc_autoreleasePoolPush(); + + tmpLen = asprintf(&tmp, ctx->subformat, + [object description].UTF8String); + + objc_autoreleasePoolPop(pool); + } else + tmpLen = asprintf(&tmp, ctx->subformat, + "(nil)"); + } @catch (id e) { + free(ctx->buffer); + @throw e; + } + + break; + case 'C': + if (ctx->lengthModifier != lengthModifierNone) + return false; + + ctx->subformat[ctx->subformatLen - 1] = 's'; + + { + char buffer[5]; + size_t len = OFUTF8StringEncode( + va_arg(ctx->arguments, OFUnichar), buffer); + + if (len == 0) + return false; + + buffer[len] = 0; + tmpLen = asprintf(&tmp, ctx->subformat, buffer); + } + + break; + case 'S': + if (ctx->lengthModifier != lengthModifierNone) + return false; + + ctx->subformat[ctx->subformatLen - 1] = 's'; + + { + const OFUnichar *arg = + va_arg(ctx->arguments, const OFUnichar *); + size_t j, len = OFUTF32StringLength(arg); + char *buffer; + + if (SIZE_MAX / 4 < len || (SIZE_MAX / 4) - len < 1) + return false; + + if ((buffer = malloc((len * 4) + 1)) == NULL) + return false; + + j = 0; + for (size_t i = 0; i < len; i++) { + size_t clen = OFUTF8StringEncode(arg[i], + buffer + j); + + if (clen == 0) { + free(buffer); + return false; + } + + j += clen; + } + buffer[j] = 0; + + tmpLen = asprintf(&tmp, ctx->subformat, buffer); + + free(buffer); + } + + break; + case 'd': + case 'i': + switch (ctx->lengthModifier) { + case lengthModifierNone: + case lengthModifierHH: + case lengthModifierH: + tmpLen = asprintf(&tmp, ctx->subformat, + va_arg(ctx->arguments, int)); + break; + case lengthModifierL: + tmpLen = asprintf(&tmp, ctx->subformat, + va_arg(ctx->arguments, long)); + break; + case lengthModifierLL: + tmpLen = asprintf(&tmp, ctx->subformat, + va_arg(ctx->arguments, long long)); + break; + case lengthModifierJ: + tmpLen = asprintf(&tmp, ctx->subformat, + va_arg(ctx->arguments, intmax_t)); + break; + case lengthModifierZ: + tmpLen = asprintf(&tmp, ctx->subformat, + va_arg(ctx->arguments, ssize_t)); + break; + case lengthModifierT: + tmpLen = asprintf(&tmp, ctx->subformat, + va_arg(ctx->arguments, ptrdiff_t)); + break; + default: + return false; + } + + break; + case 'o': + case 'u': + case 'x': + case 'X': + switch (ctx->lengthModifier) { + case lengthModifierNone: + case lengthModifierHH: + case lengthModifierH: + tmpLen = asprintf(&tmp, ctx->subformat, + va_arg(ctx->arguments, unsigned int)); + break; + case lengthModifierL: + tmpLen = asprintf(&tmp, ctx->subformat, + va_arg(ctx->arguments, unsigned long)); + break; + case lengthModifierLL: + tmpLen = asprintf(&tmp, ctx->subformat, + va_arg(ctx->arguments, unsigned long long)); + break; + case lengthModifierJ: + tmpLen = asprintf(&tmp, ctx->subformat, + va_arg(ctx->arguments, uintmax_t)); + break; + case lengthModifierZ: + tmpLen = asprintf(&tmp, ctx->subformat, + va_arg(ctx->arguments, size_t)); + break; + case lengthModifierT: + tmpLen = asprintf(&tmp, ctx->subformat, + va_arg(ctx->arguments, ptrdiff_t)); + break; + default: + return false; + } + + break; + case 'f': + case 'F': + case 'e': + case 'E': + case 'g': + case 'G': + case 'a': + case 'A': + switch (ctx->lengthModifier) { + case lengthModifierNone: + case lengthModifierL: +#ifdef HAVE_ASPRINTF_L + if (!ctx->useLocale) + tmpLen = asprintf_l(&tmp, cLocale, + ctx->subformat, + va_arg(ctx->arguments, double)); + else +#endif + tmpLen = asprintf(&tmp, ctx->subformat, + va_arg(ctx->arguments, double)); + break; + case lengthModifierCapitalL: +#ifdef HAVE_ASPRINTF_L + if (!ctx->useLocale) + tmpLen = asprintf_l(&tmp, cLocale, + ctx->subformat, + va_arg(ctx->arguments, long double)); + else +#endif + tmpLen = asprintf(&tmp, ctx->subformat, + va_arg(ctx->arguments, long double)); + break; + default: + return false; + } + +#ifndef HAVE_ASPRINTF_L + if (tmpLen == -1) + return false; + + /* + * If there's no asprintf_l, we have no other choice than to + * use this ugly hack to replace the locale's decimal point + * back to ".". + */ + point = [OFLocale decimalPoint]; + + if (!ctx->useLocale && point != nil && ![point isEqual: @"."]) { + void *pool = objc_autoreleasePoolPush(); + char *tmp2; + + @try { + OFMutableString *tmpStr = [OFMutableString + stringWithUTF8String: tmp + length: tmpLen]; + [tmpStr replaceOccurrencesOfString: point + withString: @"."]; + + if (tmpStr.UTF8StringLength > INT_MAX) + return false; + + tmpLen = (int)tmpStr.UTF8StringLength; + tmp2 = malloc(tmpLen); + memcpy(tmp2, tmpStr.UTF8String, tmpLen); + } @finally { + free(tmp); + objc_autoreleasePoolPop(pool); + } + + tmp = tmp2; + } +#endif + + break; + case 'c': + switch (ctx->lengthModifier) { + case lengthModifierNone: + tmpLen = asprintf(&tmp, ctx->subformat, + va_arg(ctx->arguments, int)); + break; + case lengthModifierL: +#ifdef HAVE_WCHAR_H +# if WINT_MAX >= INT_MAX + tmpLen = asprintf(&tmp, ctx->subformat, + va_arg(ctx->arguments, wint_t)); +# else + tmpLen = asprintf(&tmp, ctx->subformat, + va_arg(ctx->arguments, int)); +# endif + break; +#endif + default: + return false; + } + + break; + case 's': + switch (ctx->lengthModifier) { + case lengthModifierNone: + tmpLen = asprintf(&tmp, ctx->subformat, + va_arg(ctx->arguments, const char *)); + break; +#ifdef HAVE_WCHAR_T + case lengthModifierL: + tmpLen = asprintf(&tmp, ctx->subformat, + va_arg(ctx->arguments, const wchar_t *)); + break; +#endif + default: + return false; + } + + break; + case 'p': + if (ctx->lengthModifier != lengthModifierNone) + return false; + + tmpLen = asprintf(&tmp, ctx->subformat, + va_arg(ctx->arguments, void *)); + + break; + case 'n': + switch (ctx->lengthModifier) { + case lengthModifierNone: + *va_arg(ctx->arguments, int *) = (int)ctx->bufferLen; + break; + case lengthModifierHH: + *va_arg(ctx->arguments, signed char *) = + (signed char)ctx->bufferLen; + break; + case lengthModifierH: + *va_arg(ctx->arguments, short *) = + (short)ctx->bufferLen; + break; + case lengthModifierL: + *va_arg(ctx->arguments, long *) = + (long)ctx->bufferLen; + break; + case lengthModifierLL: + *va_arg(ctx->arguments, long long *) = + (long long)ctx->bufferLen; + break; + case lengthModifierJ: + *va_arg(ctx->arguments, intmax_t *) = + (intmax_t)ctx->bufferLen; + break; + case lengthModifierZ: + *va_arg(ctx->arguments, size_t *) = + (size_t)ctx->bufferLen; + break; + case lengthModifierT: + *va_arg(ctx->arguments, ptrdiff_t *) = + (ptrdiff_t)ctx->bufferLen; + break; + default: + return false; + } + + break; + case '%': + if (ctx->lengthModifier != lengthModifierNone) + return false; + + if (!appendString(ctx, "%", 1)) + return false; + + break; + default: + return false; + } + + if (tmpLen == -1) + return false; + + if (tmp != NULL) { + if (!appendString(ctx, tmp, tmpLen)) { + free(tmp); + return false; + } + + free(tmp); + } + + memset(ctx->subformat, 0, maxSubformatLen); + ctx->subformatLen = 0; + ctx->lengthModifier = lengthModifierNone; + ctx->useLocale = false; + + ctx->last = ctx->i + 1; + ctx->state = stateString; + + return true; +} + +static bool (*states[])(struct context *) = { + stringState, + formatFlagsState, + formatFieldWidthState, + formatLengthModifierState, + formatConversionSpecifierState +}; + +int +OFVASPrintF(char **string, const char *format, va_list arguments) +{ + struct context ctx; + + ctx.format = format; + ctx.formatLen = strlen(format); + memset(ctx.subformat, 0, maxSubformatLen + 1); + ctx.subformatLen = 0; + va_copy(ctx.arguments, arguments); + ctx.bufferLen = 0; + ctx.last = 0; + ctx.state = stateString; + ctx.lengthModifier = lengthModifierNone; + ctx.useLocale = false; + + if ((ctx.buffer = malloc(1)) == NULL) + return -1; + + for (ctx.i = 0; ctx.i < ctx.formatLen; ctx.i++) { + if (!states[ctx.state](&ctx)) { + free(ctx.buffer); + return -1; + } + } + + if (ctx.state != stateString) { + free(ctx.buffer); + return -1; + } + + if (!appendString(&ctx, ctx.format + ctx.last, + ctx.formatLen - ctx.last)) { + free(ctx.buffer); + return -1; + } + + ctx.buffer[ctx.bufferLen] = 0; + + *string = ctx.buffer; + return (ctx.bufferLen <= INT_MAX ? (int)ctx.bufferLen : -1); +} Index: src/OFAdjacentArray.m ================================================================== --- src/OFAdjacentArray.m +++ src/OFAdjacentArray.m @@ -160,15 +160,15 @@ @try { void *pool = objc_autoreleasePoolPush(); if ((![element.name isEqual: @"OFArray"] && ![element.name isEqual: @"OFMutableArray"]) || - ![element.namespace isEqual: OF_SERIALIZATION_NS]) + ![element.namespace isEqual: OFSerializationNS]) @throw [OFInvalidArgumentException exception]; for (OFXMLElement *child in - [element elementsForNamespace: OF_SERIALIZATION_NS]) { + [element elementsForNamespace: OFSerializationNS]) { void *pool2 = objc_autoreleasePoolPush(); id object; object = child.objectByDeserializing; [_array addItem: &object]; @@ -204,11 +204,11 @@ - (id)objectAtIndexedSubscript: (size_t)idx { return *((id *)[_array itemAtIndex: idx]); } -- (void)getObjects: (id *)buffer inRange: (of_range_t)range +- (void)getObjects: (id *)buffer inRange: (OFRange)range { id const *objects = _array.items; size_t count = _array.count; if (range.length > SIZE_MAX - range.location || @@ -223,42 +223,42 @@ { id const *objects; size_t count; if (object == nil) - return OF_NOT_FOUND; + return OFNotFound; objects = _array.items; count = _array.count; for (size_t i = 0; i < count; i++) if ([objects[i] isEqual: object]) return i; - return OF_NOT_FOUND; + return OFNotFound; } - (size_t)indexOfObjectIdenticalTo: (id)object { id const *objects; size_t count; if (object == nil) - return OF_NOT_FOUND; + return OFNotFound; objects = _array.items; count = _array.count; for (size_t i = 0; i < count; i++) if (objects[i] == object) return i; - return OF_NOT_FOUND; + return OFNotFound; } -- (OFArray *)objectsInRange: (of_range_t)range +- (OFArray *)objectsInRange: (OFRange)range { if (range.length > SIZE_MAX - range.location || range.location + range.length > _array.count) @throw [OFOutOfRangeException exception]; @@ -302,23 +302,23 @@ - (unsigned long)hash { id const *objects = _array.items; size_t count = _array.count; - uint32_t hash; + unsigned long hash; - OF_HASH_INIT(hash); + OFHashInit(&hash); for (size_t i = 0; i < count; i++) - OF_HASH_ADD_HASH(hash, [objects[i] hash]); + OFHashAddHash(&hash, [objects[i] hash]); - OF_HASH_FINALIZE(hash); + OFHashFinalize(&hash); return hash; } -- (int)countByEnumeratingWithState: (of_fast_enumeration_state_t *)state +- (int)countByEnumeratingWithState: (OFFastEnumerationState *)state objects: (id *)objects count: (int)count_ { size_t count = _array.count; @@ -340,11 +340,11 @@ return (int)count; } #ifdef OF_HAVE_BLOCKS -- (void)enumerateObjectsUsingBlock: (of_array_enumeration_block_t)block +- (void)enumerateObjectsUsingBlock: (OFArrayEnumerationBlock)block { id const *objects = _array.items; size_t count = _array.count; bool stop = false; Index: src/OFAdjacentSubarray.m ================================================================== --- src/OFAdjacentSubarray.m +++ src/OFAdjacentSubarray.m @@ -51,15 +51,15 @@ return true; } #ifdef OF_HAVE_BLOCKS -- (void)enumerateObjectsUsingBlock: (of_array_enumeration_block_t)block +- (void)enumerateObjectsUsingBlock: (OFArrayEnumerationBlock)block { id const *objects = self.objects; bool stop = false; for (size_t i = 0; i < _range.length && !stop; i++) block(objects[i], i, &stop); } #endif @end Index: src/OFApplication.h ================================================================== --- src/OFApplication.h +++ src/OFApplication.h @@ -50,16 +50,16 @@ * [OFApplication terminate]; * } * @end * @endcode */ -#define OF_APPLICATION_DELEGATE(class_) \ - int \ - main(int argc, char *argv[]) \ - { \ - return of_application_main(&argc, &argv, \ - (class_ *)[[class_ alloc] init]); \ +#define OF_APPLICATION_DELEGATE(class_) \ + int \ + main(int argc, char *argv[]) \ + { \ + return OFApplicationMain(&argc, &argv, \ + (class_ *)[[class_ alloc] init]); \ } #ifdef OF_HAVE_PLEDGE # define OF_HAVE_SANDBOX #endif @@ -198,18 +198,11 @@ */ @property OF_NULLABLE_PROPERTY (assign, nonatomic) id delegate; #ifdef OF_HAVE_SANDBOX -/** - * @brief The sandbox currently active for this application. - */ @property OF_NULLABLE_PROPERTY (readonly, nonatomic) OFSandbox *activeSandbox; - -/** - * @brief The sandbox currently active for child processes of this application. - */ @property OF_NULLABLE_PROPERTY (readonly, nonatomic) OFSandbox *activeSandboxForChildProcesses; #endif /** @@ -251,41 +244,12 @@ * @param status The status with which the application will terminate */ + (void)terminateWithStatus: (int)status OF_NO_RETURN; #ifdef OF_HAVE_SANDBOX -/** - * @brief Activates the specified sandbox for the application. - * - * This is only available if `OF_HAVE_SANDBOX` is defined. - * - * @warning If you allow `exec()`, but do not call - * @ref activateSandboxForChildProcesses:, an `exec()`'d process does - * not have its permissions restricted! - * - * @note Once a sandbox has been activated, you cannot activate a different - * sandbox. You can however change the active sandbox and reactivate it. - * - * @param sandbox The sandbox to activate - */ -+ (void)activateSandbox: (OFSandbox *)sandbox; - -/** - * @brief Activates the specified sandbox for child processes of the - * application. - * - * This is only available if `OF_HAVE_SANDBOX` is defined. - * - * `unveiledPaths` on the sandbox must *not* be empty, otherwise an - * @ref OFInvalidArgumentException is raised. - * - * @note Once a sandbox has been activated, you cannot activate a different - * sandbox. You can however change the active sandbox and reactivate it. - * - * @param sandbox The sandbox to activate - */ -+ (void)activateSandboxForChildProcesses: (OFSandbox *)sandbox; ++ (void)of_activateSandbox: (OFSandbox *)sandbox; ++ (void)of_activateSandboxForChildProcesses: (OFSandbox *)sandbox; #endif - (instancetype)init OF_UNAVAILABLE; /** @@ -308,49 +272,20 @@ * @param status The status with which the application will terminate */ - (void)terminateWithStatus: (int)status OF_NO_RETURN; #ifdef OF_HAVE_SANDBOX -/** - * @brief Activates the specified sandbox for the application. - * - * This is only available if `OF_HAVE_SANDBOX` is defined. - * - * @warning If you allow `exec()`, but do not call - * @ref activateSandboxForChildProcesses:, an `exec()`'d process does - * not have its permissions restricted! - * - * @note Once a sandbox has been activated, you cannot activate a different - * sandbox. You can however change the active sandbox and reactivate it. - * - * @param sandbox The sandbox to activate - */ -- (void)activateSandbox: (OFSandbox *)sandbox; - -/** - * @brief Activates the specified sandbox for child processes of the - * application. - * - * This is only available if `OF_HAVE_SANDBOX` is defined. - * - * `unveiledPaths` on the sandbox must *not* be empty, otherwise an - * @ref OFInvalidArgumentException is raised. - * - * @note Once a sandbox has been activated, you cannot activate a different - * sandbox. You can however change the active sandbox and reactivate it. - * - * @param sandbox The sandbox to activate - */ -- (void)activateSandboxForChildProcesses: (OFSandbox *)sandbox; +- (void)of_activateSandbox: (OFSandbox *)sandbox; +- (void)of_activateSandboxForChildProcesses: (OFSandbox *)sandbox; #endif @end #ifdef __cplusplus extern "C" { #endif -extern int of_application_main(int *_Nonnull, - char *_Nullable *_Nonnull[_Nonnull], id ); +extern int OFApplicationMain(int *_Nonnull, char *_Nullable *_Nonnull[_Nonnull], + id ); #ifdef __cplusplus } #endif OF_ASSUME_NONNULL_END Index: src/OFApplication.m ================================================================== --- src/OFApplication.m +++ src/OFApplication.m @@ -92,17 +92,16 @@ [delegate release]; #if defined(OF_HAVE_THREADS) && defined(OF_HAVE_SOCKETS) && \ defined(OF_AMIGAOS) && !defined(OF_MORPHOS) - of_socket_deinit(); + OFSocketDeinit(); #endif } int -of_application_main(int *argc, char **argv[], - id delegate) +OFApplicationMain(int *argc, char **argv[], id delegate) { #ifdef OF_WINDOWS wchar_t **wargv, **wenvp; int wargc, si = 0; #endif @@ -194,18 +193,18 @@ OF_UNREACHABLE #endif } #ifdef OF_HAVE_SANDBOX -+ (void)activateSandbox: (OFSandbox *)sandbox -{ - [app activateSandbox: sandbox]; -} - -+ (void)activateSandboxForChildProcesses: (OFSandbox *)sandbox -{ - [app activateSandboxForChildProcesses: sandbox]; ++ (void)of_activateSandbox: (OFSandbox *)sandbox +{ + [app of_activateSandbox: sandbox]; +} + ++ (void)of_activateSandboxForChildProcesses: (OFSandbox *)sandbox +{ + [app of_activateSandboxForChildProcesses: sandbox]; } #endif - (instancetype)init { @@ -221,19 +220,19 @@ atexit(atexitHandler); #if defined(OF_WINDOWS) if ([OFSystemInfo isWindowsNT]) { - of_char16_t *env, *env0; + OFChar16 *env, *env0; env = env0 = GetEnvironmentStringsW(); while (*env != 0) { void *pool = objc_autoreleasePoolPush(); OFString *tmp, *key, *value; size_t length, pos; - length = of_string_utf16_length(env); + length = OFUTF16StringLength(env); tmp = [OFString stringWithUTF16String: env length: length]; env += length + 1; /* @@ -245,11 +244,11 @@ objc_autoreleasePoolPop(pool); continue; } pos = [tmp rangeOfString: @"="].location; - if (pos == OF_NOT_FOUND) { + if (pos == OFNotFound) { fprintf(stderr, "Warning: Invalid environment " "variable: %s\n", tmp.UTF8String); continue; } @@ -287,11 +286,11 @@ objc_autoreleasePoolPop(pool); continue; } pos = [tmp rangeOfString: @"="].location; - if (pos == OF_NOT_FOUND) { + if (pos == OFNotFound) { fprintf(stderr, "Warning: Invalid environment " "variable: %s\n", tmp.UTF8String); continue; } @@ -308,11 +307,11 @@ #elif defined(OF_AMIGAOS) void *pool = objc_autoreleasePoolPush(); OFFileManager *fileManager = [OFFileManager defaultManager]; OFArray *envContents = [fileManager contentsOfDirectoryAtPath: @"ENV:"]; - const of_string_encoding_t encoding = [OFLocale encoding]; + OFStringEncoding encoding = [OFLocale encoding]; struct Process *proc; struct LocalVar *firstLocalVar; for (OFString *name in envContents) { void *pool2 = objc_autoreleasePoolPush(); @@ -374,12 +373,11 @@ # else char **env = *_NSGetEnviron(); # endif if (env != NULL) { - const of_string_encoding_t encoding = - [OFLocale encoding]; + OFStringEncoding encoding = [OFLocale encoding]; for (; *env != NULL; env++) { void *pool = objc_autoreleasePoolPush(); OFString *key, *value; char *sep; @@ -466,11 +464,11 @@ - (void)of_setArgumentCount: (int *)argc andArgumentValues: (char ***)argv { void *pool = objc_autoreleasePoolPush(); OFMutableArray *arguments; - of_string_encoding_t encoding; + OFStringEncoding encoding; _argc = argc; _argv = argv; encoding = [OFLocale encoding]; @@ -601,16 +599,16 @@ OF_UNREACHABLE } #ifdef OF_HAVE_SANDBOX -- (void)activateSandbox: (OFSandbox *)sandbox +- (void)of_activateSandbox: (OFSandbox *)sandbox { # ifdef OF_HAVE_PLEDGE void *pool = objc_autoreleasePoolPush(); - of_string_encoding_t encoding = [OFLocale encoding]; - OFArray OF_GENERIC(of_sandbox_unveil_path_t) *unveiledPaths; + OFStringEncoding encoding = [OFLocale encoding]; + OFArray OF_GENERIC(OFSandboxUnveilPath) *unveiledPaths; size_t unveiledPathsCount; const char *promises; if (_activeSandbox != nil && sandbox != _activeSandbox) @throw [OFInvalidArgumentException exception]; @@ -618,11 +616,11 @@ unveiledPaths = sandbox.unveiledPaths; unveiledPathsCount = unveiledPaths.count; for (size_t i = sandbox->_unveiledPathsIndex; i < unveiledPathsCount; i++) { - of_sandbox_unveil_path_t unveiledPath = + OFSandboxUnveilPath unveiledPath = [unveiledPaths objectAtIndex: i]; OFString *path = unveiledPath.firstObject; OFString *permissions = unveiledPath.secondObject; if (path == nil || permissions == nil) @@ -646,11 +644,11 @@ if (_activeSandbox == nil) _activeSandbox = [sandbox retain]; # endif } -- (void)activateSandboxForChildProcesses: (OFSandbox *)sandbox +- (void)of_activateSandboxForChildProcesses: (OFSandbox *)sandbox { # ifdef OF_HAVE_PLEDGE void *pool = objc_autoreleasePoolPush(); const char *promises; Index: src/OFArray.h ================================================================== --- src/OFArray.h +++ src/OFArray.h @@ -33,14 +33,29 @@ /** @file */ @class OFString; -enum { - OF_ARRAY_SKIP_EMPTY = 1, - OF_ARRAY_SORT_DESCENDING = 2 -}; +/** + * @brief Options for joining the objects of an array. + * + * This is a bit mask. + */ +typedef enum { + /** Skip empty components */ + OFArraySkipEmptyComponents = 1 +} OFArrayJoinOptions; + +/** + * @brief Options for sorting an array. + * + * This is a bit mask. + */ +typedef enum { + /** Sort the array descending */ + OFArraySortDescending = 1 +} OFArraySortOptions; #ifdef OF_HAVE_BLOCKS /** * @brief A block for enumerating an OFArray. * @@ -47,39 +62,38 @@ * @param object The current object * @param index The index of the current object * @param stop A pointer to a variable that can be set to true to stop the * enumeration */ -typedef void (^of_array_enumeration_block_t)(id object, size_t index, - bool *stop); +typedef void (^OFArrayEnumerationBlock)(id object, size_t index, bool *stop); /** * @brief A block for filtering an OFArray. * * @param object The object to inspect * @param index The index of the object to inspect * @return Whether the object should be in the filtered array */ -typedef bool (^of_array_filter_block_t)(id object, size_t index); +typedef bool (^OFArrayFilterBlock)(id object, size_t index); /** * @brief A block for mapping objects to objects in an OFArray. * * @param object The object to map * @param index The index of the object to map * @return The object to map to */ -typedef id _Nonnull (^of_array_map_block_t)(id object, size_t index); +typedef id _Nonnull (^OFArrayMapBlock)(id object, size_t index); /** * @brief A block for folding an OFArray. * * @param left The object to which the object has been folded so far * @param right The object that should be added to the left object * @return The left and right side folded into one object */ -typedef id _Nullable (^of_array_fold_block_t)(id _Nullable left, id right); +typedef id _Nullable (^OFArrayFoldBlock)(id _Nullable left, id right); #endif /** * @class OFArray OFArray.h ObjFW/OFArray.h * @@ -268,29 +282,29 @@ * * @param buffer The buffer to copy the objects to * @param range The range to copy */ - (void)getObjects: (ObjectType __unsafe_unretained _Nonnull *_Nonnull)buffer - inRange: (of_range_t)range; + inRange: (OFRange)range; /** * @brief Returns the index of the first object that is equivalent to the - * specified object or `OF_NOT_FOUND` if it was not found. + * specified object or `OFNotFound` if it was not found. * * @param object The object whose index is returned * @return The index of the first object equivalent to the specified object - * or `OF_NOT_FOUND` if it was not found + * or `OFNotFound` if it was not found */ - (size_t)indexOfObject: (ObjectType)object; /** * @brief Returns the index of the first object that has the same address as the - * specified object or `OF_NOT_FOUND` if it was not found. + * specified object or `OFNotFound` if it was not found. * * @param object The object whose index is returned * @return The index of the first object that has the same address as - * the specified object or `OF_NOT_FOUND` if it was not found + * the specified object or `OFNotFound` if it was not found */ - (size_t)indexOfObjectIdenticalTo: (ObjectType)object; /** * @brief Checks whether the array contains an object equal to the specified @@ -315,11 +329,11 @@ * @brief Returns the objects in the specified range as a new OFArray. * * @param range The range for the subarray * @return The subarray as a new autoreleased OFArray */ -- (OFArray OF_GENERIC(ObjectType) *)objectsInRange: (of_range_t)range; +- (OFArray OF_GENERIC(ObjectType) *)objectsInRange: (OFRange)range; /** * @brief Creates a string by joining all objects of the array. * * @param separator The string with which the objects should be joined @@ -329,19 +343,15 @@ /** * @brief Creates a string by joining all objects of the array. * * @param separator The string with which the objects should be joined - * @param options Options according to which the objects should be joined.@n - * Possible values are: - * Value | Description - * ----------------------|---------------------- - * `OF_ARRAY_SKIP_EMPTY` | Skip empty components + * @param options Options according to which the objects should be joined * @return A string containing all objects joined by the separator */ - (OFString *)componentsJoinedByString: (OFString *)separator - options: (int)options; + options: (OFArrayJoinOptions)options; /** * @brief Creates a string by calling the selector on all objects of the array * and joining the strings returned by calling the selector. * @@ -356,20 +366,16 @@ * @brief Creates a string by calling the selector on all objects of the array * and joining the strings returned by calling the selector. * * @param separator The string with which the objects should be joined * @param selector The selector to perform on the objects - * @param options Options according to which the objects should be joined.@n - * Possible values are: - * Value | Description - * ----------------------|---------------------- - * `OF_ARRAY_SKIP_EMPTY` | Skip empty components + * @param options Options according to which the objects should be joined * @return A string containing all objects joined by the separator */ - (OFString *)componentsJoinedByString: (OFString *)separator usingSelector: (SEL)selector - options: (int)options; + options: (OFArrayJoinOptions)options; /** * @brief Performs the specified selector on all objects in the array. * * @param selector The selector to perform on all objects in the array @@ -391,36 +397,29 @@ * @brief Returns a copy of the array sorted using the specified selector and * options. * * @param selector The selector to use to sort the array. It's signature * should be the same as that of -[compare:]. - * @param options The options to use when sorting the array.@n - * Possible values are: - * Value | Description - * ---------------------------|------------------------- - * `OF_ARRAY_SORT_DESCENDING` | Sort in descending order + * @param options The options to use when sorting the array * @return A sorted copy of the array */ -- (OFArray OF_GENERIC(ObjectType) *)sortedArrayUsingSelector: (SEL)selector - options: (int)options; +- (OFArray OF_GENERIC(ObjectType) *) + sortedArrayUsingSelector: (SEL)selector + options: (OFArraySortOptions)options; #ifdef OF_HAVE_BLOCKS /** * @brief Returns a copy of the array sorted using the specified selector and * options. * * @param comparator The comparator to use to sort the array - * @param options The options to use when sorting the array.@n - * Possible values are: - * Value | Description - * ---------------------------|------------------------- - * `OF_ARRAY_SORT_DESCENDING` | Sort in descending order + * @param options The options to use when sorting the array * @return A sorted copy of the array */ - (OFArray OF_GENERIC(ObjectType) *) - sortedArrayUsingComparator: (of_comparator_t)comparator - options: (int)options; + sortedArrayUsingComparator: (OFComparator)comparator + options: (OFArraySortOptions)options; #endif /** * @brief Creates a new array with the specified object added. * @@ -450,19 +449,19 @@ /** * @brief Executes a block for each object. * * @param block The block to execute for each object */ -- (void)enumerateObjectsUsingBlock: (of_array_enumeration_block_t)block; +- (void)enumerateObjectsUsingBlock: (OFArrayEnumerationBlock)block; /** * @brief Creates a new array, mapping each object using the specified block. * * @param block A block which maps an object for each object * @return A new, autoreleased OFArray */ -- (OFArray *)mappedArrayUsingBlock: (of_array_map_block_t)block; +- (OFArray *)mappedArrayUsingBlock: (OFArrayMapBlock)block; /** * @brief Creates a new array, only containing the objects for which the block * returns true. * @@ -469,11 +468,11 @@ * @param block A block which determines if the object should be in the new * array * @return A new, autoreleased OFArray */ - (OFArray OF_GENERIC(ObjectType) *)filteredArrayUsingBlock: - (of_array_filter_block_t)block; + (OFArrayFilterBlock)block; /** * @brief Folds the array to a single object using the specified block. * * If the array is empty, it will return `nil`. @@ -487,11 +486,11 @@ * * @param block A block which folds two objects into one, which is called for * all objects except the first * @return The array folded to a single object */ -- (nullable id)foldUsingBlock: (of_array_fold_block_t)block; +- (nullable id)foldUsingBlock: (OFArrayFoldBlock)block; #endif #if !defined(OF_HAVE_GENERICS) && !defined(DOXYGEN) # undef ObjectType #endif @end Index: src/OFArray.m ================================================================== --- src/OFArray.m +++ src/OFArray.m @@ -36,12 +36,13 @@ static struct { Class isa; } placeholder; @interface OFArray () -- (OFString *)of_JSONRepresentationWithOptions: (int)options - depth: (size_t)depth; +- (OFString *) + of_JSONRepresentationWithOptions: (OFJSONRepresentationOptions)options + depth: (size_t)depth; @end @interface OFPlaceholderArray: OFArray @end @@ -226,30 +227,30 @@ - (size_t)count { OF_UNRECOGNIZED_SELECTOR } -- (void)getObjects: (id *)buffer inRange: (of_range_t)range +- (void)getObjects: (id *)buffer inRange: (OFRange)range { for (size_t i = 0; i < range.length; i++) buffer[i] = [self objectAtIndex: range.location + i]; } - (id const *)objects { size_t count = self.count; - id *buffer = of_alloc(count, sizeof(id)); + id *buffer = OFAllocMemory(count, sizeof(id)); @try { - [self getObjects: buffer inRange: of_range(0, count)]; + [self getObjects: buffer inRange: OFRangeMake(0, count)]; return [[OFData dataWithItemsNoCopy: buffer count: count itemSize: sizeof(id) freeWhenDone: true] items]; } @catch (id e) { - free(buffer); + OFFreeMemory(buffer); @throw e; } } - (id)copy @@ -304,47 +305,47 @@ - (size_t)indexOfObject: (id)object { size_t i = 0; if (object == nil) - return OF_NOT_FOUND; + return OFNotFound; for (id objectIter in self) { if ([objectIter isEqual: object]) return i; i++; } - return OF_NOT_FOUND; + return OFNotFound; } - (size_t)indexOfObjectIdenticalTo: (id)object { size_t i = 0; if (object == nil) - return OF_NOT_FOUND; + return OFNotFound; for (id objectIter in self) { if (objectIter == object) return i; i++; } - return OF_NOT_FOUND; + return OFNotFound; } - (bool)containsObject: (id)object { - return ([self indexOfObject: object] != OF_NOT_FOUND); + return ([self indexOfObject: object] != OFNotFound); } - (bool)containsObjectIdenticalTo: (id)object { - return ([self indexOfObjectIdenticalTo: object] != OF_NOT_FOUND); + return ([self indexOfObjectIdenticalTo: object] != OFNotFound); } - (id)firstObject { if (self.count > 0) @@ -361,11 +362,11 @@ return [self objectAtIndex: count - 1]; return nil; } -- (OFArray *)objectsInRange: (of_range_t)range +- (OFArray *)objectsInRange: (OFRange)range { OFArray *ret; id *buffer; if (range.length > SIZE_MAX - range.location || @@ -373,17 +374,17 @@ @throw [OFOutOfRangeException exception]; if (![self isKindOfClass: [OFMutableArray class]]) return [OFSubarray arrayWithArray: self range: range]; - buffer = of_alloc(range.length, sizeof(*buffer)); + buffer = OFAllocMemory(range.length, sizeof(*buffer)); @try { [self getObjects: buffer inRange: range]; ret = [OFArray arrayWithObjects: buffer count: range.length]; } @finally { - free(buffer); + OFFreeMemory(buffer); } return ret; } @@ -393,11 +394,11 @@ usingSelector: @selector(description) options: 0]; } - (OFString *)componentsJoinedByString: (OFString *)separator - options: (int)options + options: (OFArrayJoinOptions)options { return [self componentsJoinedByString: separator usingSelector: @selector(description) options: options]; } @@ -410,11 +411,11 @@ options: 0]; } - (OFString *)componentsJoinedByString: (OFString *)separator usingSelector: (SEL)selector - options: (int)options + options: (OFArrayJoinOptions)options { OFMutableString *ret; if (separator == nil) @throw [OFInvalidArgumentException exception]; @@ -432,11 +433,11 @@ return component; } ret = [OFMutableString string]; - if (options & OF_ARRAY_SKIP_EMPTY) { + if (options & OFArraySkipEmptyComponents) { for (id object in self) { void *pool = objc_autoreleasePoolPush(); OFString *component = [object performSelector: selector]; @@ -505,18 +506,18 @@ return true; } - (unsigned long)hash { - uint32_t hash; + unsigned long hash; - OF_HASH_INIT(hash); + OFHashInit(&hash); for (id object in self) - OF_HASH_ADD_HASH(hash, [object hash]); + OFHashAddHash(&hash, [object hash]); - OF_HASH_FINALIZE(hash); + OFHashFinalize(&hash); return hash; } - (OFString *)description @@ -551,14 +552,14 @@ void *pool = objc_autoreleasePoolPush(); OFXMLElement *element; if ([self isKindOfClass: [OFMutableArray class]]) element = [OFXMLElement elementWithName: @"OFMutableArray" - namespace: OF_SERIALIZATION_NS]; + namespace: OFSerializationNS]; else element = [OFXMLElement elementWithName: @"OFArray" - namespace: OF_SERIALIZATION_NS]; + namespace: OFSerializationNS]; for (id object in self) { void *pool2 = objc_autoreleasePoolPush(); [element addChild: object.XMLElementBySerializing]; @@ -576,23 +577,25 @@ - (OFString *)JSONRepresentation { return [self of_JSONRepresentationWithOptions: 0 depth: 0]; } -- (OFString *)JSONRepresentationWithOptions: (int)options +- (OFString *)JSONRepresentationWithOptions: + (OFJSONRepresentationOptions)options { return [self of_JSONRepresentationWithOptions: options depth: 0]; } -- (OFString *)of_JSONRepresentationWithOptions: (int)options - depth: (size_t)depth +- (OFString *) + of_JSONRepresentationWithOptions: (OFJSONRepresentationOptions)options + depth: (size_t)depth { OFMutableString *JSON = [OFMutableString stringWithString: @"["]; void *pool = objc_autoreleasePoolPush(); size_t i, count = self.count; - if (options & OF_JSON_REPRESENTATION_PRETTY) { + if (options & OFJSONRepresentationOptionPretty) { OFMutableString *indentation = [OFMutableString string]; for (i = 0; i < depth; i++) [indentation appendString: @"\t"]; @@ -653,17 +656,17 @@ if (count <= 15) { uint8_t tmp = 0x90 | ((uint8_t)count & 0xF); [data addItem: &tmp]; } else if (count <= UINT16_MAX) { uint8_t type = 0xDC; - uint16_t tmp = OF_BSWAP16_IF_LE((uint16_t)count); + uint16_t tmp = OFToBigEndian16((uint16_t)count); [data addItem: &type]; [data addItems: &tmp count: sizeof(tmp)]; } else if (count <= UINT32_MAX) { uint8_t type = 0xDD; - uint32_t tmp = OF_BSWAP32_IF_LE((uint32_t)count); + uint32_t tmp = OFToBigEndian32((uint32_t)count); [data addItem: &type]; [data addItems: &tmp count: sizeof(tmp)]; } else @throw [OFOutOfRangeException exception]; @@ -712,21 +715,21 @@ [new makeImmutable]; return new; } - (OFArray *)sortedArrayUsingSelector: (SEL)selector - options: (int)options + options: (OFArraySortOptions)options { OFMutableArray *new = [[self mutableCopy] autorelease]; [new sortUsingSelector: selector options: options]; [new makeImmutable]; return new; } #ifdef OF_HAVE_BLOCKS -- (OFArray *)sortedArrayUsingComparator: (of_comparator_t)comparator - options: (int)options +- (OFArray *)sortedArrayUsingComparator: (OFComparator)comparator + options: (OFArraySortOptions)options { OFMutableArray *new = [[self mutableCopy] autorelease]; [new sortUsingComparator: comparator options: options]; [new makeImmutable]; return new; @@ -739,15 +742,15 @@ [new reverse]; [new makeImmutable]; return new; } -- (int)countByEnumeratingWithState: (of_fast_enumeration_state_t *)state +- (int)countByEnumeratingWithState: (OFFastEnumerationState *)state objects: (id *)objects count: (int)count { - of_range_t range = of_range(state->state, count); + OFRange range = OFRangeMake(state->state, count); if (range.length > SIZE_MAX - range.location) @throw [OFOutOfRangeException exception]; if (range.location + range.length > self.count) @@ -770,11 +773,11 @@ return [[[OFArrayEnumerator alloc] initWithArray: self mutationsPtr: NULL] autorelease]; } #ifdef OF_HAVE_BLOCKS -- (void)enumerateObjectsUsingBlock: (of_array_enumeration_block_t)block +- (void)enumerateObjectsUsingBlock: (OFArrayEnumerationBlock)block { size_t i = 0; bool stop = false; for (id object in self) { @@ -816,35 +819,35 @@ [ret makeImmutable]; return ret; } #ifdef OF_HAVE_BLOCKS -- (OFArray *)mappedArrayUsingBlock: (of_array_map_block_t)block +- (OFArray *)mappedArrayUsingBlock: (OFArrayMapBlock)block { OFArray *ret; size_t count = self.count; - id *tmp = of_alloc(count, sizeof(id)); + id *tmp = OFAllocMemory(count, sizeof(id)); @try { [self enumerateObjectsUsingBlock: ^ (id object, size_t idx, bool *stop) { tmp[idx] = block(object, idx); }]; ret = [OFArray arrayWithObjects: tmp count: count]; } @finally { - free(tmp); + OFFreeMemory(tmp); } return ret; } -- (OFArray *)filteredArrayUsingBlock: (of_array_filter_block_t)block +- (OFArray *)filteredArrayUsingBlock: (OFArrayFilterBlock)block { OFArray *ret; size_t count = self.count; - id *tmp = of_alloc(count, sizeof(id)); + id *tmp = OFAllocMemory(count, sizeof(id)); @try { __block size_t i = 0; [self enumerateObjectsUsingBlock: ^ (id object, size_t idx, @@ -853,17 +856,17 @@ tmp[i++] = object; }]; ret = [OFArray arrayWithObjects: tmp count: i]; } @finally { - free(tmp); + OFFreeMemory(tmp); } return ret; } -- (id)foldUsingBlock: (of_array_fold_block_t)block +- (id)foldUsingBlock: (OFArrayFoldBlock)block { size_t count = self.count; __block id current; if (count == 0) ADDED src/OFAtomic.h Index: src/OFAtomic.h ================================================================== --- src/OFAtomic.h +++ src/OFAtomic.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include + +#import "macros.h" + +#ifndef OF_HAVE_ATOMIC_OPS +# error No atomic operations available! +#endif + +#if !defined(OF_HAVE_THREADS) +# import "OFAtomic_no_threads.h" +#elif (defined(OF_X86_64) || defined(OF_X86)) && defined(__GNUC__) +# import "OFAtomic_x86.h" +#elif defined(OF_POWERPC) && defined(__GNUC__) && !defined(__APPLE_CC__) && \ + !defined(OF_AIX) +# import "OFAtomic_powerpc.h" +#elif defined(OF_HAVE_ATOMIC_BUILTINS) +# import "OFAtomic_builtins.h" +#elif defined(OF_HAVE_SYNC_BUILTINS) +# import "OFAtomic_sync_builtins.h" +#elif defined(OF_HAVE_OSATOMIC) +# import "OFAtomic_osatomic.h" +#else +# error No atomic operations available! +#endif ADDED src/OFAtomic_builtins.h Index: src/OFAtomic_builtins.h ================================================================== --- src/OFAtomic_builtins.h +++ src/OFAtomic_builtins.h @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +static OF_INLINE int +OFAtomicIntAdd(volatile int *_Nonnull p, int i) +{ + return __atomic_add_fetch(p, i, __ATOMIC_RELAXED); +} + +static OF_INLINE int32_t +OFAtomicInt32Add(volatile int32_t *_Nonnull p, int32_t i) +{ + return __atomic_add_fetch(p, i, __ATOMIC_RELAXED); +} + +static OF_INLINE void *_Nullable +OFAtomicPointerAdd(void *volatile _Nullable *_Nonnull p, intptr_t i) +{ + return __atomic_add_fetch(p, i, __ATOMIC_RELAXED); +} + +static OF_INLINE int +OFAtomicIntSubtract(volatile int *_Nonnull p, int i) +{ + return __atomic_sub_fetch(p, i, __ATOMIC_RELAXED); +} + +static OF_INLINE int32_t +OFAtomicInt32Subtract(volatile int32_t *_Nonnull p, int32_t i) +{ + return __atomic_sub_fetch(p, i, __ATOMIC_RELAXED); +} + +static OF_INLINE void *_Nullable +OFAtomicPointerSubtract(void *volatile _Nullable *_Nonnull p, intptr_t i) +{ + return __atomic_sub_fetch(p, i, __ATOMIC_RELAXED); +} + +static OF_INLINE int +OFAtomicIntIncrease(volatile int *_Nonnull p) +{ + return __atomic_add_fetch(p, 1, __ATOMIC_RELAXED); +} + +static OF_INLINE int32_t +OFAtomicInt32Increase(volatile int32_t *_Nonnull p) +{ + return __atomic_add_fetch(p, 1, __ATOMIC_RELAXED); +} + +static OF_INLINE int +OFAtomicIntDecrease(volatile int *_Nonnull p) +{ + return __atomic_sub_fetch(p, 1, __ATOMIC_RELAXED); +} + +static OF_INLINE int32_t +OFAtomicInt32Decrease(volatile int32_t *_Nonnull p) +{ + return __atomic_sub_fetch(p, 1, __ATOMIC_RELAXED); +} + +static OF_INLINE unsigned int +OFAtomicIntOr(volatile unsigned int *_Nonnull p, unsigned int i) +{ + return __atomic_or_fetch(p, i, __ATOMIC_RELAXED); +} + +static OF_INLINE uint32_t +OFAtomicInt32Or(volatile uint32_t *_Nonnull p, uint32_t i) +{ + return __atomic_or_fetch(p, i, __ATOMIC_RELAXED); +} + +static OF_INLINE unsigned int +OFAtomicIntAnd(volatile unsigned int *_Nonnull p, unsigned int i) +{ + return __atomic_and_fetch(p, i, __ATOMIC_RELAXED); +} + +static OF_INLINE uint32_t +OFAtomicInt32And(volatile uint32_t *_Nonnull p, uint32_t i) +{ + return __atomic_and_fetch(p, i, __ATOMIC_RELAXED); +} + +static OF_INLINE unsigned int +OFAtomicIntXor(volatile unsigned int *_Nonnull p, unsigned int i) +{ + return __atomic_xor_fetch(p, i, __ATOMIC_RELAXED); +} + +static OF_INLINE uint32_t +OFAtomicInt32Xor(volatile uint32_t *_Nonnull p, uint32_t i) +{ + return __atomic_xor_fetch(p, i, __ATOMIC_RELAXED); +} + +static OF_INLINE bool +OFAtomicIntCompareAndSwap(volatile int *_Nonnull p, int o, int n) +{ + return __atomic_compare_exchange(p, &o, &n, false, + __ATOMIC_RELAXED, __ATOMIC_RELAXED); +} + +static OF_INLINE bool +OFAtomicInt32CompareAndSwap(volatile int32_t *_Nonnull p, int32_t o, int32_t n) +{ + return __atomic_compare_exchange(p, &o, &n, false, + __ATOMIC_RELAXED, __ATOMIC_RELAXED); +} + +static OF_INLINE bool +OFAtomicPointerCompareAndSwap(void *volatile _Nullable *_Nonnull p, + void *_Nullable o, void *_Nullable n) +{ + return __atomic_compare_exchange(p, &o, &n, false, + __ATOMIC_RELAXED, __ATOMIC_RELAXED); +} + +static OF_INLINE void +OFMemoryBarrier(void) +{ + __atomic_thread_fence(__ATOMIC_SEQ_CST); +} + +static OF_INLINE void +OFAcquireMemoryBarrier(void) +{ + __atomic_thread_fence(__ATOMIC_ACQUIRE); +} + +static OF_INLINE void +OFReleaseMemoryBarrier(void) +{ + __atomic_thread_fence(__ATOMIC_RELEASE); +} ADDED src/OFAtomic_no_threads.h Index: src/OFAtomic_no_threads.h ================================================================== --- src/OFAtomic_no_threads.h +++ src/OFAtomic_no_threads.h @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +static OF_INLINE int +OFAtomicIntAdd(volatile int *_Nonnull p, int i) +{ + return (*p += i); +} + +static OF_INLINE int32_t +OFAtomicInt32Add(volatile int32_t *_Nonnull p, int32_t i) +{ + return (*p += i); +} + +static OF_INLINE void *_Nullable +OFAtomicPointerAdd(void *volatile _Nullable *_Nonnull p, intptr_t i) +{ + return (*(char *volatile *)p += i); +} + +static OF_INLINE int +OFAtomicIntSubtract(volatile int *_Nonnull p, int i) +{ + return (*p -= i); +} + +static OF_INLINE int32_t +OFAtomicInt32Subtract(volatile int32_t *_Nonnull p, int32_t i) +{ + return (*p -= i); +} + +static OF_INLINE void *_Nullable +OFAtomicPointerSubtract(void *volatile _Nullable *_Nonnull p, intptr_t i) +{ + return (*(char *volatile *)p -= i); +} + +static OF_INLINE int +OFAtomicIntIncrease(volatile int *_Nonnull p) +{ + return ++*p; +} + +static OF_INLINE int32_t +OFAtomicInt32Increase(volatile int32_t *_Nonnull p) +{ + return ++*p; +} + +static OF_INLINE int +OFAtomicIntDecrease(volatile int *_Nonnull p) +{ + return --*p; +} + +static OF_INLINE int32_t +OFAtomicInt32Decrease(volatile int32_t *_Nonnull p) +{ + return --*p; +} + +static OF_INLINE unsigned int +OFAtomicIntOr(volatile unsigned int *_Nonnull p, unsigned int i) +{ + return (*p |= i); +} + +static OF_INLINE uint32_t +OFAtomicInt32Or(volatile uint32_t *_Nonnull p, uint32_t i) +{ + return (*p |= i); +} + +static OF_INLINE unsigned int +OFAtomicIntAnd(volatile unsigned int *_Nonnull p, unsigned int i) +{ + return (*p &= i); +} + +static OF_INLINE uint32_t +OFAtomicInt32And(volatile uint32_t *_Nonnull p, uint32_t i) +{ + return (*p &= i); +} + +static OF_INLINE unsigned int +OFAtomicIntXor(volatile unsigned int *_Nonnull p, unsigned int i) +{ + return (*p ^= i); +} + +static OF_INLINE uint32_t +OFAtomicInt32Xor(volatile uint32_t *_Nonnull p, uint32_t i) +{ + return (*p ^= i); +} + +static OF_INLINE bool +OFAtomicIntCompareAndSwap(volatile int *_Nonnull p, int o, int n) +{ + if (*p == o) { + *p = n; + return true; + } + + return false; +} + +static OF_INLINE bool +OFAtomicInt32CompareAndSwap(volatile int32_t *_Nonnull p, int32_t o, int32_t n) +{ + if (*p == o) { + *p = n; + return true; + } + + return false; +} + +static OF_INLINE bool +OFAtomicPointerCompareAndSwap(void *volatile _Nullable *_Nonnull p, + void *_Nullable o, void *_Nullable n) +{ + if (*p == o) { + *p = n; + return true; + } + + return false; +} + +static OF_INLINE void +OFMemoryBarrier(void) +{ + /* nop */ +} + +static OF_INLINE void +OFAcquireMemoryBarrier(void) +{ + /* nop */ +} + +static OF_INLINE void +OFReleaseMemoryBarrier(void) +{ + /* nop */ +} ADDED src/OFAtomic_osatomic.h Index: src/OFAtomic_osatomic.h ================================================================== --- src/OFAtomic_osatomic.h +++ src/OFAtomic_osatomic.h @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include + +static OF_INLINE int +OFAtomicIntAdd(volatile int *_Nonnull p, int i) +{ + return OSAtomicAdd32(i, p); +} + +static OF_INLINE int32_t +OFAtomicInt32Add(volatile int32_t *_Nonnull p, int32_t i) +{ + return OSAtomicAdd32(i, p); +} + +static OF_INLINE void *_Nullable +OFAtomicPointerAdd(void *volatile _Nullable *_Nonnull p, intptr_t i) +{ +#ifdef __LP64__ + return (void *)OSAtomicAdd64(i, (int64_t *)p); +#else + return (void *)OSAtomicAdd32(i, (int32_t *)p); +#endif +} + +static OF_INLINE int +OFAtomicIntSubtract(volatile int *_Nonnull p, int i) +{ + return OSAtomicAdd32(-i, p); +} + +static OF_INLINE int32_t +OFAtomicInt32Subtract(volatile int32_t *_Nonnull p, int32_t i) +{ + return OSAtomicAdd32(-i, p); +} + +static OF_INLINE void *_Nullable +OFAtomicPointerSubtract(void *volatile _Nullable *_Nonnull p, intptr_t i) +{ +#ifdef __LP64__ + return (void *)OSAtomicAdd64(-i, (int64_t *)p); +#else + return (void *)OSAtomicAdd32(-i, (int32_t *)p); +#endif +} + +static OF_INLINE int +OFAtomicIntIncrease(volatile int *_Nonnull p) +{ + return OSAtomicIncrement32(p); +} + +static OF_INLINE int32_t +OFAtomicInt32Increase(volatile int32_t *_Nonnull p) +{ + return OSAtomicIncrement32(p); +} + +static OF_INLINE int +OFAtomicIntDecrease(volatile int *_Nonnull p) +{ + return OSAtomicDecrement32(p); +} + +static OF_INLINE int32_t +OFAtomicInt32Decrease(volatile int32_t *_Nonnull p) +{ + return OSAtomicDecrement32(p); +} + +static OF_INLINE unsigned int +OFAtomicIntOr(volatile unsigned int *_Nonnull p, unsigned int i) +{ + return OSAtomicOr32(i, p); +} + +static OF_INLINE uint32_t +OFAtomicInt32Or(volatile uint32_t *_Nonnull p, uint32_t i) +{ + return OSAtomicOr32(i, p); +} + +static OF_INLINE unsigned int +OFAtomicIntAnd(volatile unsigned int *_Nonnull p, unsigned int i) +{ + return OSAtomicAnd32(i, p); +} + +static OF_INLINE uint32_t +OFAtomicInt32And(volatile uint32_t *_Nonnull p, uint32_t i) +{ + return OSAtomicAnd32(i, p); +} + +static OF_INLINE unsigned int +OFAtomicIntXor(volatile unsigned int *_Nonnull p, unsigned int i) +{ + return OSAtomicXor32(i, p); +} + +static OF_INLINE uint32_t +OFAtomicInt32Xor(volatile uint32_t *_Nonnull p, uint32_t i) +{ + return OSAtomicXor32(i, p); +} + +static OF_INLINE bool +OFAtomicIntCompareAndSwap(volatile int *_Nonnull p, int o, int n) +{ + return OSAtomicCompareAndSwapInt(o, n, p); +} + +static OF_INLINE bool +OFAtomicInt32CompareAndSwap(volatile int32_t *_Nonnull p, int32_t o, int32_t n) +{ + return OSAtomicCompareAndSwap32(o, n, p); +} + +static OF_INLINE bool +OFAtomicPointerCompareAndSwap(void *volatile _Nullable *_Nonnull p, + void *_Nullable o, void *_Nullable n) +{ + return OSAtomicCompareAndSwapPtr(o, n, p); +} + +static OF_INLINE void +OFMemoryBarrier(void) +{ + OSMemoryBarrier(); +} + +static OF_INLINE void +OFAcquireMemoryBarrier(void) +{ + OSMemoryBarrier(); +} + +static OF_INLINE void +OFReleaseMemoryBarrier(void) +{ + OSMemoryBarrier(); +} ADDED src/OFAtomic_powerpc.h Index: src/OFAtomic_powerpc.h ================================================================== --- src/OFAtomic_powerpc.h +++ src/OFAtomic_powerpc.h @@ -0,0 +1,397 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +static OF_INLINE int +OFAtomicIntAdd(volatile int *_Nonnull p, int i) +{ + __asm__ __volatile__ ( + "0:\n\t" + "lwarx %0, 0, %2\n\t" + "add %0, %0, %1\n\t" + "stwcx. %0, 0, %2\n\t" + "bne- 0b" + : "=&r"(i) + : "r"(i), "r"(p) + : "cc", "memory" + ); + + return i; +} + +static OF_INLINE int32_t +OFAtomicInt32Add(volatile int32_t *_Nonnull p, int32_t i) +{ + __asm__ __volatile__ ( + "0:\n\t" + "lwarx %0, 0, %2\n\t" + "add %0, %0, %1\n\t" + "stwcx. %0, 0, %2\n\t" + "bne- 0b" + : "=&r"(i) + : "r"(i), "r"(p) + : "cc", "memory" + ); + + return i; +} + +static OF_INLINE void *_Nullable +OFAtomicPointerAdd(void *volatile _Nullable *_Nonnull p, intptr_t i) +{ + __asm__ __volatile__ ( + "0:\n\t" + "lwarx %0, 0, %2\n\t" + "add %0, %0, %1\n\t" + "stwcx. %0, 0, %2\n\t" + "bne- 0b" + : "=&r"(i) + : "r"(i), "r"(p) + : "cc", "memory" + ); + + return (void *)i; +} + +static OF_INLINE int +OFAtomicIntSubtract(volatile int *_Nonnull p, int i) +{ + __asm__ __volatile__ ( + "0:\n\t" + "lwarx %0, 0, %2\n\t" + "sub %0, %0, %1\n\t" + "stwcx. %0, 0, %2\n\t" + "bne- 0b" + : "=&r"(i) + : "r"(i), "r"(p) + : "cc", "memory" + ); + + return i; +} + +static OF_INLINE int32_t +OFAtomicInt32Subtract(volatile int32_t *_Nonnull p, int32_t i) +{ + __asm__ __volatile__ ( + "0:\n\t" + "lwarx %0, 0, %2\n\t" + "sub %0, %0, %1\n\t" + "stwcx. %0, 0, %2\n\t" + "bne- 0b" + : "=&r"(i) + : "r"(i), "r"(p) + : "cc", "memory" + ); + + return i; +} + +static OF_INLINE void *_Nullable +OFAtomicPointerSubtract(void *volatile _Nullable *_Nonnull p, intptr_t i) +{ + __asm__ __volatile__ ( + "0:\n\t" + "lwarx %0, 0, %2\n\t" + "sub %0, %0, %1\n\t" + "stwcx. %0, 0, %2\n\t" + "bne- 0b" + : "=&r"(i) + : "r"(i), "r"(p) + : "cc", "memory" + ); + + return (void *)i; +} + +static OF_INLINE int +OFAtomicIntIncrease(volatile int *_Nonnull p) +{ + int i; + + __asm__ __volatile__ ( + "0:\n\t" + "lwarx %0, 0, %1\n\t" + "addi %0, %0, 1\n\t" + "stwcx. %0, 0, %1\n\t" + "bne- 0b" + : "=&r"(i) + : "r"(p) + : "cc", "memory" + ); + + return i; +} + +static OF_INLINE int32_t +OFAtomicInt32Increase(volatile int32_t *_Nonnull p) +{ + int32_t i; + + __asm__ __volatile__ ( + "0:\n\t" + "lwarx %0, 0, %1\n\t" + "addi %0, %0, 1\n\t" + "stwcx. %0, 0, %1\n\t" + "bne- 0b" + : "=&r"(i) + : "r"(p) + : "cc", "memory" + ); + + return i; +} + +static OF_INLINE int +OFAtomicIntDecrease(volatile int *_Nonnull p) +{ + int i; + + __asm__ __volatile__ ( + "0:\n\t" + "lwarx %0, 0, %1\n\t" + "subi %0, %0, 1\n\t" + "stwcx. %0, 0, %1\n\t" + "bne- 0b" + : "=&r"(i) + : "r"(p) + : "cc", "memory" + ); + + return i; +} + +static OF_INLINE int32_t +OFAtomicInt32Decrease(volatile int32_t *_Nonnull p) +{ + int32_t i; + + __asm__ __volatile__ ( + "0:\n\t" + "lwarx %0, 0, %1\n\t" + "subi %0, %0, 1\n\t" + "stwcx. %0, 0, %1\n\t" + "bne- 0b" + : "=&r"(i) + : "r"(p) + : "cc", "memory" + ); + + return i; +} + +static OF_INLINE unsigned int +OFAtomicIntOr(volatile unsigned int *_Nonnull p, unsigned int i) +{ + __asm__ __volatile__ ( + "0:\n\t" + "lwarx %0, 0, %2\n\t" + "or %0, %0, %1\n\t" + "stwcx. %0, 0, %2\n\t" + "bne- 0b" + : "=&r"(i) + : "r"(i), "r"(p) + : "cc", "memory" + ); + + return i; +} + +static OF_INLINE uint32_t +OFAtomicInt32Or(volatile uint32_t *_Nonnull p, uint32_t i) +{ + __asm__ __volatile__ ( + "0:\n\t" + "lwarx %0, 0, %2\n\t" + "or %0, %0, %1\n\t" + "stwcx. %0, 0, %2\n\t" + "bne- 0b" + : "=&r"(i) + : "r"(i), "r"(p) + : "cc", "memory" + ); + + return i; +} + +static OF_INLINE unsigned int +OFAtomicIntAnd(volatile unsigned int *_Nonnull p, unsigned int i) +{ + __asm__ __volatile__ ( + "0:\n\t" + "lwarx %0, 0, %2\n\t" + "and %0, %0, %1\n\t" + "stwcx. %0, 0, %2\n\t" + "bne- 0b" + : "=&r"(i) + : "r"(i), "r"(p) + : "cc", "memory" + ); + + return i; +} + +static OF_INLINE uint32_t +OFAtomicInt32And(volatile uint32_t *_Nonnull p, uint32_t i) +{ + __asm__ __volatile__ ( + "0:\n\t" + "lwarx %0, 0, %2\n\t" + "and %0, %0, %1\n\t" + "stwcx. %0, 0, %2\n\t" + "bne- 0b" + : "=&r"(i) + : "r"(i), "r"(p) + : "cc", "memory" + ); + + return i; +} + +static OF_INLINE unsigned int +OFAtomicIntXor(volatile unsigned int *_Nonnull p, unsigned int i) +{ + __asm__ __volatile__ ( + "0:\n\t" + "lwarx %0, 0, %2\n\t" + "xor %0, %0, %1\n\t" + "stwcx. %0, 0, %2\n\t" + "bne- 0b" + : "=&r"(i) + : "r"(i), "r"(p) + : "cc", "memory" + ); + + return i; +} + +static OF_INLINE uint32_t +OFAtomicInt32Xor(volatile uint32_t *_Nonnull p, uint32_t i) +{ + __asm__ __volatile__ ( + "0:\n\t" + "lwarx %0, 0, %2\n\t" + "xor %0, %0, %1\n\t" + "stwcx. %0, 0, %2\n\t" + "bne- 0b" + : "=&r"(i) + : "r"(i), "r"(p) + : "cc", "memory" + ); + + return i; +} + +static OF_INLINE bool +OFAtomicIntCompAndSwap(volatile int *_Nonnull p, int o, int n) +{ + int r; + + __asm__ __volatile__ ( + "0:\n\t" + "lwarx %0, 0, %3\n\t" + "cmpw %0, %1\n\t" + "bne 1f\n\t" + "stwcx. %2, 0, %3\n\t" + "bne- 0b\n\t" + "li %0, 1\n\t" + "b 2f\n\t" + "1:\n\t" + "stwcx. %0, 0, %3\n\t" + "li %0, 0\n\t" + "2:" + : "=&r"(r) + : "r"(o), "r"(n), "r"(p) + : "cc", "memory" + ); + + return r; +} + +static OF_INLINE bool +OFAtomicInt32CompareAndSwap(volatile int32_t *_Nonnull p, int32_t o, int32_t n) +{ + int r; + + __asm__ __volatile__ ( + "0:\n\t" + "lwarx %0, 0, %3\n\t" + "cmpw %0, %1\n\t" + "bne 1f\n\t" + "stwcx. %2, 0, %3\n\t" + "bne- 0b\n\t" + "li %0, 1\n\t" + "b 2f\n\t" + "1:\n\t" + "stwcx. %0, 0, %3\n\t" + "li %0, 0\n\t" + "2:" + : "=&r"(r) + : "r"(o), "r"(n), "r"(p) + : "cc", "memory" + ); + + return r; +} + +static OF_INLINE bool +OFAtomicPointerCompareAndSwap(void *volatile _Nullable *_Nonnull p, + void *_Nullable o, void *_Nullable n) +{ + int r; + + __asm__ __volatile__ ( + "0:\n\t" + "lwarx %0, 0, %3\n\t" + "cmpw %0, %1\n\t" + "bne 1f\n\t" + "stwcx. %2, 0, %3\n\t" + "bne- 0b\n\t" + "li %0, 1\n\t" + "b 2f\n\t" + "1:\n\t" + "stwcx. %0, 0, %3\n\t" + "li %0, 0\n\t" + "2:" + : "=&r"(r) + : "r"(o), "r"(n), "r"(p) + : "cc", "memory" + ); + + return r; +} + +static OF_INLINE void +OFMemoryBarrier(void) +{ + __asm__ __volatile__ ( + ".long 0x7C2004AC /* lwsync */" ::: "memory" + ); +} + +static OF_INLINE void +OFAcquireMemoryBarrier(void) +{ + __asm__ __volatile__ ( + ".long 0x7C2004AC /* lwsync */" ::: "memory" + ); +} + +static OF_INLINE void +OFReleaseMemoryBarrier(void) +{ + __asm__ __volatile__ ( + ".long 0x7C2004AC /* lwsync */" ::: "memory" + ); +} ADDED src/OFAtomic_sync_builtins.h Index: src/OFAtomic_sync_builtins.h ================================================================== --- src/OFAtomic_sync_builtins.h +++ src/OFAtomic_sync_builtins.h @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +static OF_INLINE int +OFAtomicIntAdd(volatile int *_Nonnull p, int i) +{ + return __sync_add_and_fetch(p, i); +} + +static OF_INLINE int32_t +OFAtomicInt32Add(volatile int32_t *_Nonnull p, int32_t i) +{ + return __sync_add_and_fetch(p, i); +} + +static OF_INLINE void *_Nullable +OFAtomicPointerAdd(void *volatile _Nullable *_Nonnull p, intptr_t i) +{ + return __sync_add_and_fetch(p, (void *)i); +} + +static OF_INLINE int +OFAtomicIntSubtract(volatile int *_Nonnull p, int i) +{ + return __sync_sub_and_fetch(p, i); +} + +static OF_INLINE int32_t +OFAtomicInt32Subtract(volatile int32_t *_Nonnull p, int32_t i) +{ + return __sync_sub_and_fetch(p, i); +} + +static OF_INLINE void *_Nullable +OFAtomicPointerSubtract(void *volatile _Nullable *_Nonnull p, intptr_t i) +{ + return __sync_sub_and_fetch(p, (void *)i); +} + +static OF_INLINE int +OFAtomicIntIncrease(volatile int *_Nonnull p) +{ + return __sync_add_and_fetch(p, 1); +} + +static OF_INLINE int32_t +OFAtomicInt32Increase(volatile int32_t *_Nonnull p) +{ + return __sync_add_and_fetch(p, 1); +} + +static OF_INLINE int +OFAtomicIntDecrease(volatile int *_Nonnull p) +{ + return __sync_sub_and_fetch(p, 1); +} + +static OF_INLINE int32_t +OFAtomicInt32Decrease(volatile int32_t *_Nonnull p) +{ + return __sync_sub_and_fetch(p, 1); +} + +static OF_INLINE unsigned int +OFAtomicIntOr(volatile unsigned int *_Nonnull p, unsigned int i) +{ + return __sync_or_and_fetch(p, i); +} + +static OF_INLINE uint32_t +OFAtomicInt32Or(volatile uint32_t *_Nonnull p, uint32_t i) +{ + return __sync_or_and_fetch(p, i); +} + +static OF_INLINE unsigned int +OFAtomicIntAnd(volatile unsigned int *_Nonnull p, unsigned int i) +{ + return __sync_and_and_fetch(p, i); +} + +static OF_INLINE uint32_t +OFAtomicInt32And(volatile uint32_t *_Nonnull p, uint32_t i) +{ + return __sync_and_and_fetch(p, i); +} + +static OF_INLINE unsigned int +OFAtomicIntXor(volatile unsigned int *_Nonnull p, unsigned int i) +{ + return __sync_xor_and_fetch(p, i); +} + +static OF_INLINE uint32_t +OFAtomicInt32Xor(volatile uint32_t *_Nonnull p, uint32_t i) +{ + return __sync_xor_and_fetch(p, i); +} + +static OF_INLINE bool +OFAtomicIntCompareAndSwap(volatile int *_Nonnull p, int o, int n) +{ + return __sync_bool_compare_and_swap(p, o, n); +} + +static OF_INLINE bool +OFAtomicInt32CompAndSwap(volatile int32_t *_Nonnull p, int32_t o, int32_t n) +{ + return __sync_bool_compare_and_swap(p, o, n); +} + +static OF_INLINE bool +OFAtomicPointerCompareAndSwap(void *volatile _Nullable *_Nonnull p, + void *_Nullable o, void *_Nullable n) +{ + return __sync_bool_compare_and_swap(p, o, n); +} + +static OF_INLINE void +OFMemoryBarrier(void) +{ + __sync_synchronize(); +} + +static OF_INLINE void +OFAcquireMemoryBarrier(void) +{ + __sync_synchronize(); +} + +static OF_INLINE void +OFReleaseMemoryBarrier(void) +{ + __sync_synchronize(); +} ADDED src/OFAtomic_x86.h Index: src/OFAtomic_x86.h ================================================================== --- src/OFAtomic_x86.h +++ src/OFAtomic_x86.h @@ -0,0 +1,502 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +OF_ASSUME_NONNULL_BEGIN + +static OF_INLINE int +OFAtomicIntAdd(volatile int *_Nonnull p, int i) +{ + if (sizeof(int) == 4) + __asm__ __volatile__ ( + "lock\n\t" + "xaddl %0, %2\n\t" + "addl %1, %0" + : "+&r"(i) + : "r"(i), "m"(*p) + ); +#ifdef OF_X86_64 + else if (sizeof(int) == 8) + __asm__ __volatile__ ( + "lock\n\t" + "xaddq %0, %2\n\t" + "addq %1, %0" + : "+&r"(i) + : "r"(i), "m"(*p) + ); +#endif + else + abort(); + + return i; +} + +static OF_INLINE int32_t +OFAtomicInt32Add(volatile int32_t *_Nonnull p, int32_t i) +{ + __asm__ __volatile__ ( + "lock\n\t" + "xaddl %0, %2\n\t" + "addl %1, %0" + : "+&r"(i) + : "r"(i), "m"(*p) + ); + + return i; +} + +static OF_INLINE void *_Nullable +OFAtomicPointerAdd(void *volatile _Nullable *_Nonnull p, intptr_t i) +{ +#if defined(OF_X86_64) + __asm__ __volatile__ ( + "lock\n\t" + "xaddq %0, %2\n\t" + "addq %1, %0" + : "+&r"(i) + : "r"(i), "m"(*p) + ); + + return (void *)i; +#elif defined(OF_X86) + __asm__ __volatile__ ( + "lock\n\t" + "xaddl %0, %2\n\t" + "addl %1, %0" + : "+&r"(i) + : "r"(i), "m"(*p) + ); + + return (void *)i; +#endif +} + +static OF_INLINE int +OFAtomicIntSubtract(volatile int *_Nonnull p, int i) +{ + if (sizeof(int) == 4) + __asm__ __volatile__ ( + "negl %0\n\t" + "lock\n\t" + "xaddl %0, %2\n\t" + "subl %1, %0" + : "+&r"(i) + : "r"(i), "m"(*p) + ); +#ifdef OF_X86_64 + else if (sizeof(int) == 8) + __asm__ __volatile__ ( + "negq %0\n\t" + "lock\n\t" + "xaddq %0, %2\n\t" + "subq %1, %0" + : "+&r"(i) + : "r"(i), "m"(*p) + ); +#endif + else + abort(); + + return i; +} + +static OF_INLINE int32_t +OFAtomicInt32Subtract(volatile int32_t *_Nonnull p, int32_t i) +{ + __asm__ __volatile__ ( + "negl %0\n\t" + "lock\n\t" + "xaddl %0, %2\n\t" + "subl %1, %0" + : "+&r"(i) + : "r"(i), "m"(*p) + ); + + return i; +} + +static OF_INLINE void *_Nullable +OFAtomicPointerSubtract(void *volatile _Nullable *_Nonnull p, intptr_t i) +{ +#if defined(OF_X86_64) + __asm__ __volatile__ ( + "negq %0\n\t" + "lock\n\t" + "xaddq %0, %2\n\t" + "subq %1, %0" + : "+&r"(i) + : "r"(i), "m"(*p) + ); + + return (void *)i; +#elif defined(OF_X86) + __asm__ __volatile__ ( + "negl %0\n\t" + "lock\n\t" + "xaddl %0, %2\n\t" + "subl %1, %0" + : "+&r"(i) + : "r"(i), "m"(*p) + ); + + return (void *)i; +#endif +} + +static OF_INLINE int +OFAtomicIntIncrease(volatile int *_Nonnull p) +{ + int i; + + if (sizeof(int) == 4) + __asm__ __volatile__ ( + "xorl %0, %0\n\t" + "incl %0\n\t" + "lock\n\t" + "xaddl %0, %1\n\t" + "incl %0" + : "=&r"(i) + : "m"(*p) + ); +#ifdef OF_X86_64 + else if (sizeof(int) == 8) + __asm__ __volatile__ ( + "xorq %0, %0\n\t" + "incq %0\n\t" + "lock\n\t" + "xaddq %0, %1\n\t" + "incq %0" + : "=&r"(i) + : "m"(*p) + ); +#endif + else + abort(); + + return i; +} + +static OF_INLINE int32_t +OFAtomicInt32Increase(volatile int32_t *_Nonnull p) +{ + int32_t i; + + __asm__ __volatile__ ( + "xorl %0, %0\n\t" + "incl %0\n\t" + "lock\n\t" + "xaddl %0, %1\n\t" + "incl %0" + : "=&r"(i) + : "m"(*p) + ); + + return i; +} + +static OF_INLINE int +OFAtomicIntDecrease(volatile int *_Nonnull p) +{ + int i; + + if (sizeof(int) == 4) + __asm__ __volatile__ ( + "xorl %0, %0\n\t" + "decl %0\n\t" + "lock\n\t" + "xaddl %0, %1\n\t" + "decl %0" + : "=&r"(i) + : "m"(*p) + ); +#ifdef OF_X86_64 + else if (sizeof(int) == 8) + __asm__ __volatile__ ( + "xorq %0, %0\n\t" + "decq %0\n\t" + "lock\n\t" + "xaddq %0, %1\n\t" + "decq %0" + : "=&r"(i) + : "m"(*p) + ); +#endif + else + abort(); + + return i; +} + +static OF_INLINE int32_t +OFAtomicInt32Decrease(volatile int32_t *_Nonnull p) +{ + int32_t i; + + __asm__ __volatile__ ( + "xorl %0, %0\n\t" + "decl %0\n\t" + "lock\n\t" + "xaddl %0, %1\n\t" + "decl %0" + : "=&r"(i) + : "m"(*p) + ); + + return i; +} + +static OF_INLINE unsigned int +OFAtomicIntOr(volatile unsigned int *_Nonnull p, unsigned int i) +{ + if (sizeof(int) == 4) + __asm__ __volatile__ ( + "0:\n\t" + "movl %2, %0\n\t" + "movl %0, %%eax\n\t" + "orl %1, %0\n\t" + "lock\n\t" + "cmpxchg %0, %2\n\t" + "jne 0b" + : "=&r"(i) + : "r"(i), "m"(*p) + : "eax", "cc" + ); +#ifdef OF_X86_64 + else if (sizeof(int) == 8) + __asm__ __volatile__ ( + "0:\n\t" + "movq %2, %0\n\t" + "movq %0, %%rax\n\t" + "orq %1, %0\n\t" + "lock\n\t" + "cmpxchg %0, %2\n\t" + "jne 0b" + : "=&r"(i) + : "r"(i), "m"(*p) + : "rax", "cc" + ); +#endif + else + abort(); + + return i; +} + +static OF_INLINE uint32_t +OFAtomicInt32Or(volatile uint32_t *_Nonnull p, uint32_t i) +{ + __asm__ __volatile__ ( + "0:\n\t" + "movl %2, %0\n\t" + "movl %0, %%eax\n\t" + "orl %1, %0\n\t" + "lock\n\t" + "cmpxchg %0, %2\n\t" + "jne 0b" + : "=&r"(i) + : "r"(i), "m"(*p) + : "eax", "cc" + ); + + return i; +} + +static OF_INLINE unsigned int +OFAtomicIntAnd(volatile unsigned int *_Nonnull p, unsigned int i) +{ + if (sizeof(int) == 4) + __asm__ __volatile__ ( + "0:\n\t" + "movl %2, %0\n\t" + "movl %0, %%eax\n\t" + "andl %1, %0\n\t" + "lock\n\t" + "cmpxchg %0, %2\n\t" + "jne 0b" + : "=&r"(i) + : "r"(i), "m"(*p) + : "eax", "cc" + ); +#ifdef OF_X86_64 + else if (sizeof(int) == 8) + __asm__ __volatile__ ( + "0:\n\t" + "movq %2, %0\n\t" + "movq %0, %%rax\n\t" + "andq %1, %0\n\t" + "lock\n\t" + "cmpxchg %0, %2\n\t" + "jne 0b" + : "=&r"(i) + : "r"(i), "m"(*p) + : "rax", "cc" + ); +#endif + else + abort(); + + return i; +} + +static OF_INLINE uint32_t +OFAtomicInt32And(volatile uint32_t *_Nonnull p, uint32_t i) +{ + __asm__ __volatile__ ( + "0:\n\t" + "movl %2, %0\n\t" + "movl %0, %%eax\n\t" + "andl %1, %0\n\t" + "lock\n\t" + "cmpxchg %0, %2\n\t" + "jne 0b" + : "=&r"(i) + : "r"(i), "m"(*p) + : "eax", "cc" + ); + + return i; +} + +static OF_INLINE unsigned int +OFAtomicIntXor(volatile unsigned int *_Nonnull p, unsigned int i) +{ + if (sizeof(int) == 4) + __asm__ __volatile__ ( + "0:\n\t" + "movl %2, %0\n\t" + "movl %0, %%eax\n\t" + "xorl %1, %0\n\t" + "lock\n\t" + "cmpxchg %0, %2\n\t" + "jne 0b" + : "=&r"(i) + : "r"(i), "m"(*p) + : "eax", "cc" + ); +#ifdef OF_X86_64 + else if (sizeof(int) == 8) + __asm__ __volatile__ ( + "0:\n\t" + "movq %2, %0\n\t" + "movq %0, %%rax\n\t" + "xorq %1, %0\n\t" + "lock\n\t" + "cmpxchg %0, %2\n\t" + "jne 0b" + : "=&r"(i) + : "r"(i), "m"(*p) + : "rax", "cc" + ); +#endif + else + abort(); + + return i; +} + +static OF_INLINE uint32_t +OFAtomicInt32Xor(volatile uint32_t *_Nonnull p, uint32_t i) +{ + __asm__ __volatile__ ( + "0:\n\t" + "movl %2, %0\n\t" + "movl %0, %%eax\n\t" + "xorl %1, %0\n\t" + "lock\n\t" + "cmpxchgl %0, %2\n\t" + "jne 0b" + : "=&r"(i) + : "r"(i), "m"(*p) + : "eax", "cc" + ); + + return i; +} + +static OF_INLINE bool +OFAtomicIntCompareAndSwap(volatile int *_Nonnull p, int o, int n) +{ + int r; + + __asm__ __volatile__ ( + "lock\n\t" + "cmpxchg %2, %3\n\t" + "sete %b0\n\t" + "movzbl %b0, %0" + : "=&d"(r), "+a"(o) /* use d instead of r to avoid a gcc bug */ + : "r"(n), "m"(*p) + : "cc" + ); + + return r; +} + +static OF_INLINE bool +OFAtomicInt32CompareAndSwap(volatile int32_t *_Nonnull p, int32_t o, int32_t n) +{ + int r; + + __asm__ __volatile__ ( + "lock\n\t" + "cmpxchg %2, %3\n\t" + "sete %b0\n\t" + "movzbl %b0, %0" + : "=&d"(r), "+a"(o) /* use d instead of r to avoid a gcc bug */ + : "r"(n), "m"(*p) + : "cc" + ); + + return r; +} + +static OF_INLINE bool +OFAtomicPointerCompareAndSwap(void *volatile _Nullable *_Nonnull p, + void *_Nullable o, void *_Nullable n) +{ + int r; + + __asm__ __volatile__ ( + "lock\n\t" + "cmpxchg %2, %3\n\t" + "sete %b0\n\t" + "movzbl %b0, %0" + : "=&d"(r), "+a"(o) /* use d instead of r to avoid a gcc bug */ + : "r"(n), "m"(*p) + : "cc" + ); + + return r; +} + +static OF_INLINE void +OFMemoryBarrier(void) +{ + __asm__ __volatile__ ( + "mfence" ::: "memory" + ); +} + +static OF_INLINE void +OFAcquireMemoryBarrier(void) +{ + __asm__ __volatile__ ("" ::: "memory"); +} + +static OF_INLINE void +OFReleaseMemoryBarrier(void) +{ + __asm__ __volatile__ ("" ::: "memory"); +} + +OF_ASSUME_NONNULL_END ADDED src/OFBase64.h Index: src/OFBase64.h ================================================================== --- src/OFBase64.h +++ src/OFBase64.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#ifndef __STDC_LIMIT_MACROS +# define __STDC_LIMIT_MACROS +#endif +#ifndef __STDC_CONSTANT_MACROS +# define __STDC_CONSTANT_MACROS +#endif + +#import "macros.h" + +OF_ASSUME_NONNULL_BEGIN + +@class OFString; +@class OFMutableData; + +#ifdef __cplusplus +extern "C" { +#endif +extern OFString *OFBase64Encode(const void *, size_t); +extern bool OFBase64Decode(OFMutableData *, const char *, size_t); +#ifdef __cplusplus +} +#endif + +OF_ASSUME_NONNULL_END ADDED src/OFBase64.m Index: src/OFBase64.m ================================================================== --- src/OFBase64.m +++ src/OFBase64.m @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#import "OFBase64.h" +#import "OFString.h" +#import "OFData.h" + +static const unsigned char encodeTable[64] = { + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', + 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', + 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', + 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', + '4', '5', '6', '7', '8', '9', '+', '/' +}; + +static const signed char decodeTable[128] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, 0, -1, -1, -1, 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, -1, -1, -1, -1, -1, -1, 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, -1, -1, -1, -1, -1 +}; + +OFString * +OFBase64Encode(const void *data, size_t length) +{ + OFMutableString *ret = [OFMutableString string]; + uint8_t *buffer = (uint8_t *)data; + size_t i; + uint8_t rest; + char tb[4]; + uint32_t sb; + + rest = length % 3; + + for (i = 0; i < length - rest; i += 3) { + sb = (buffer[i] << 16) | (buffer[i + 1] << 8) | buffer[i + 2]; + + tb[0] = encodeTable[(sb & 0xFC0000) >> 18]; + tb[1] = encodeTable[(sb & 0x03F000) >> 12]; + tb[2] = encodeTable[(sb & 0x000FC0) >> 6]; + tb[3] = encodeTable[sb & 0x00003F]; + + [ret appendCString: tb + encoding: OFStringEncodingASCII + length: 4]; + } + + switch (rest) { + case 1: + tb[0] = encodeTable[buffer[i] >> 2]; + tb[1] = encodeTable[(buffer[i] & 3) << 4]; + tb[2] = tb[3] = '='; + + [ret appendCString: tb + encoding: OFStringEncodingASCII + length: 4]; + + break; + case 2: + sb = (buffer[i] << 16) | (buffer[i + 1] << 8); + + tb[0] = encodeTable[(sb & 0xFC0000) >> 18]; + tb[1] = encodeTable[(sb & 0x03F000) >> 12]; + tb[2] = encodeTable[(sb & 0x000FC0) >> 6]; + tb[3] = '='; + + [ret appendCString: tb + encoding: OFStringEncodingASCII + length: 4]; + + break; + } + + [ret makeImmutable]; + + return ret; +} + +bool +OFBase64Decode(OFMutableData *data, const char *string, size_t length) +{ + const uint8_t *buffer = (const uint8_t *)string; + size_t i; + + if ((length & 3) != 0) + return false; + + if (data.itemSize != 1) + return false; + + for (i = 0; i < length; i += 4) { + uint32_t sb = 0; + uint8_t count = 3; + char db[3]; + int8_t tmp; + + if (buffer[i] > 0x7F || buffer[i + 1] > 0x7F || + buffer[i + 2] > 0x7F || buffer[i + 3] > 0x7F) + return false; + + if (buffer[i] == '=' || buffer[i + 1] == '=' || + (buffer[i + 2] == '=' && buffer[i + 3] != '=')) + return false; + + if (buffer[i + 2] == '=') + count--; + if (buffer[i + 3] == '=') + count--; + + if ((tmp = decodeTable[buffer[i]]) == -1) + return false; + + sb |= tmp << 18; + + if ((tmp = decodeTable[buffer[i + 1]]) == -1) + return false; + + sb |= tmp << 12; + + if ((tmp = decodeTable[buffer[i + 2]]) == -1) + return false; + + sb |= tmp << 6; + + if ((tmp = decodeTable[buffer[i + 3]]) == -1) + return false; + + sb |= tmp; + + db[0] = (sb & 0xFF0000) >> 16; + db[1] = (sb & 0x00FF00) >> 8; + db[2] = sb & 0x0000FF; + + [data addItems: db count: count]; + } + + return true; +} Index: src/OFBitSetCharacterSet.m ================================================================== --- src/OFBitSetCharacterSet.m +++ src/OFBitSetCharacterSet.m @@ -30,33 +30,33 @@ { self = [super init]; @try { void *pool = objc_autoreleasePoolPush(); - const of_unichar_t *characters = string.characters; + const OFUnichar *characters = string.characters; size_t length = string.length; for (size_t i = 0; i < length; i++) { - of_unichar_t c = characters[i]; + OFUnichar c = characters[i]; if (c / CHAR_BIT >= _size) { size_t newSize; if (UINT32_MAX - c < 1) @throw [OFOutOfRangeException exception]; - newSize = OF_ROUND_UP_POW2(CHAR_BIT, c + 1) / + newSize = OFRoundUpToPowerOf2(CHAR_BIT, c + 1) / CHAR_BIT; - _bitset = of_realloc(_bitset, newSize, 1); + _bitset = OFResizeMemory(_bitset, newSize, 1); memset(_bitset + _size, '\0', newSize - _size); _size = newSize; } - of_bitset_set(_bitset, c); + OFBitsetSet(_bitset, c); } objc_autoreleasePoolPop(pool); } @catch (id e) { [self release]; @@ -66,18 +66,18 @@ return self; } - (void)dealloc { - free(_bitset); + OFFreeMemory(_bitset); [super dealloc]; } -- (bool)characterIsMember: (of_unichar_t)character +- (bool)characterIsMember: (OFUnichar)character { if (character / CHAR_BIT >= _size) return false; - return of_bitset_isset(_bitset, character); + return OFBitsetIsSet(_bitset, character); } @end Index: src/OFBlock.h ================================================================== --- src/OFBlock.h +++ src/OFBlock.h @@ -13,12 +13,10 @@ * file. */ #import "OFObject.h" -#import "block.h" - OF_ASSUME_NONNULL_BEGIN /** * @class OFBlock OFBlock.h ObjFW/OFBlock.h * @@ -38,7 +36,39 @@ @end OF_SUBCLASSING_RESTRICTED @interface OFMallocBlock: OFBlock @end + +#ifdef __cplusplus +extern "C" { +#endif +extern void *_Block_copy(const void *); +extern void _Block_release(const void *); + +# if defined(OF_WINDOWS) && \ + (defined(OF_NO_SHARED) || defined(OF_COMPILING_OBJFW)) +/* + * Clang has implicit declarations for these, but they are dllimport. When + * compiling ObjFW itself or using it as a static library, these need to be + * dllexport. Interestingly, this still works when using it as a shared library. + */ +extern __declspec(dllexport) struct objc_class _NSConcreteStackBlock; +extern __declspec(dllexport) struct objc_class _NSConcreteGlobalBlock; +extern __declspec(dllexport) void _Block_object_assign(void *, const void *, + const int); +extern __declspec(dllexport) void _Block_object_dispose(const void *, + const int); +# endif +#ifdef __cplusplus +} +#endif + +#ifndef Block_copy +# define Block_copy(...) \ + ((__typeof__(__VA_ARGS__))_Block_copy((const void *)(__VA_ARGS__))) +#endif +#ifndef Block_release +# define Block_release(...) _Block_release((const void *)(__VA_ARGS__)) +#endif OF_ASSUME_NONNULL_END Index: src/OFBlock.m ================================================================== --- src/OFBlock.m +++ src/OFBlock.m @@ -18,50 +18,62 @@ #include #include #include #import "OFBlock.h" +#ifdef OF_HAVE_ATOMIC_OPS +# import "OFAtomic.h" +#endif +#ifdef OF_HAVE_THREADS +# import "OFPlainMutex.h" +#endif #import "OFAllocFailedException.h" #import "OFInitializationFailedException.h" #if defined(OF_OBJFW_RUNTIME) # import "runtime/private.h" #endif -#ifdef OF_HAVE_ATOMIC_OPS -# import "atomic.h" -#endif -#ifdef OF_HAVE_THREADS -# import "mutex.h" -#endif - -typedef struct of_block_byref_t of_block_byref_t; -struct of_block_byref_t { +struct Block { + Class isa; + int flags; + int reserved; + void (*invoke)(void *block, ...); + struct { + unsigned long reserved; + unsigned long size; + void (*_Nullable copyHelper)(void *dest, void *src); + void (*_Nullable disposeHelper)(void *src); + const char *signature; + } *descriptor; +}; + +struct Byref { Class isa; - of_block_byref_t *forwarding; + struct Byref *forwarding; int flags; int size; - void (*byref_keep)(void *dest, void *src); - void (*byref_dispose)(void *); -}; - -enum { - OF_BLOCK_HAS_COPY_DISPOSE = (1 << 25), - OF_BLOCK_HAS_CTOR = (1 << 26), - OF_BLOCK_IS_GLOBAL = (1 << 28), - OF_BLOCK_HAS_STRET = (1 << 29), - OF_BLOCK_HAS_SIGNATURE = (1 << 30) -}; -#define OF_BLOCK_REFCOUNT_MASK 0xFFFF - -enum { - OF_BLOCK_FIELD_IS_OBJECT = 3, - OF_BLOCK_FIELD_IS_BLOCK = 7, - OF_BLOCK_FIELD_IS_BYREF = 8, - OF_BLOCK_FIELD_IS_WEAK = 16, - OF_BLOCK_BYREF_CALLER = 128 + void (*keepByref)(void *dest, void *src); + void (*disposeByref)(void *); +}; + +enum { + OFBlockHasCopyDispose = (1 << 25), + OFBlockHasCtor = (1 << 26), + OFBlockIsGlobal = (1 << 28), + OFBlockHasStret = (1 << 29), + OFBlockHasSignature = (1 << 30) +}; +#define OFBlockRefCountMask 0xFFFF + +enum { + OFBlockFieldIsObject = 3, + OFBlockFieldIsBlock = 7, + OFBlockFieldIsByref = 8, + OFBlockFieldIsWeak = 16, + OFBlockByrefCaller = 128 }; @protocol RetainRelease - (instancetype)retain; - (void)release; @@ -74,11 +86,11 @@ sizeof(_NSConcreteStackBlock_metaclass), NULL, NULL }; struct objc_class _NSConcreteStackBlock = { &_NSConcreteStackBlock_metaclass, (Class)(void *)"OFBlock", - "OFStackBlock", 8, OBJC_CLASS_INFO_CLASS, sizeof(of_block_literal_t), + "OFStackBlock", 8, OBJC_CLASS_INFO_CLASS, sizeof(struct Block), NULL, NULL }; static struct objc_class _NSConcreteGlobalBlock_metaclass = { Nil, Nil, "OFGlobalBlock", 8, OBJC_CLASS_INFO_METACLASS, @@ -85,11 +97,11 @@ sizeof(_NSConcreteGlobalBlock_metaclass), NULL, NULL }; struct objc_class _NSConcreteGlobalBlock = { &_NSConcreteGlobalBlock_metaclass, (Class)(void *)"OFBlock", - "OFGlobalBlock", 8, OBJC_CLASS_INFO_CLASS, sizeof(of_block_literal_t), + "OFGlobalBlock", 8, OBJC_CLASS_INFO_CLASS, sizeof(struct Block), NULL, NULL }; static struct objc_class _NSConcreteMallocBlock_metaclass = { Nil, Nil, "OFMallocBlock", 8, OBJC_CLASS_INFO_METACLASS, @@ -96,11 +108,11 @@ sizeof(_NSConcreteMallocBlock_metaclass), NULL, NULL }; struct objc_class _NSConcreteMallocBlock = { &_NSConcreteMallocBlock_metaclass, (Class)(void *)"OFBlock", - "OFMallocBlock", 8, OBJC_CLASS_INFO_CLASS, sizeof(of_block_literal_t), + "OFMallocBlock", 8, OBJC_CLASS_INFO_CLASS, sizeof(struct Block), NULL, NULL }; static struct { unsigned long unknown; @@ -152,23 +164,23 @@ static struct { Class isa; } alloc_failed_exception; #ifndef OF_HAVE_ATOMIC_OPS -# define NUM_SPINLOCKS 8 /* needs to be a power of 2 */ -# define SPINLOCK_HASH(p) ((uintptr_t)p >> 4) & (NUM_SPINLOCKS - 1) -static of_spinlock_t blockSpinlocks[NUM_SPINLOCKS]; -static of_spinlock_t byrefSpinlocks[NUM_SPINLOCKS]; +# define numSpinlocks 8 /* needs to be a power of 2 */ +# define SPINLOCK_HASH(p) ((uintptr_t)p >> 4) & (numSpinlocks - 1) +static OFSpinlock blockSpinlocks[numSpinlocks]; +static OFSpinlock byrefSpinlocks[numSpinlocks]; #endif void * _Block_copy(const void *block_) { - of_block_literal_t *block = (of_block_literal_t *)block_; + struct Block *block = (struct Block *)block_; if ([(id)block isMemberOfClass: (Class)&_NSConcreteStackBlock]) { - of_block_literal_t *copy; + struct Block *copy; if ((copy = malloc(block->descriptor->size)) == NULL) { alloc_failed_exception.isa = [OFAllocFailedException class]; @throw (OFAllocFailedException *) @@ -177,198 +189,196 @@ memcpy(copy, block, block->descriptor->size); object_setClass((id)copy, (Class)&_NSConcreteMallocBlock); copy->flags++; - if (block->flags & OF_BLOCK_HAS_COPY_DISPOSE) - block->descriptor->copy_helper(copy, block); + if (block->flags & OFBlockHasCopyDispose) + block->descriptor->copyHelper(copy, block); return copy; } if ([(id)block isMemberOfClass: (Class)&_NSConcreteMallocBlock]) { #ifdef OF_HAVE_ATOMIC_OPS - of_atomic_int_inc(&block->flags); + OFAtomicIntIncrease(&block->flags); #else unsigned hash = SPINLOCK_HASH(block); - OF_ENSURE(of_spinlock_lock(&blockSpinlocks[hash]) == 0); + OFEnsure(OFSpinlockLock(&blockSpinlocks[hash]) == 0); block->flags++; - OF_ENSURE(of_spinlock_unlock(&blockSpinlocks[hash]) == 0); + OFEnsure(OFSpinlockUnlock(&blockSpinlocks[hash]) == 0); #endif } return block; } void _Block_release(const void *block_) { - of_block_literal_t *block = (of_block_literal_t *)block_; + struct Block *block = (struct Block *)block_; if (object_getClass((id)block) != (Class)&_NSConcreteMallocBlock) return; #ifdef OF_HAVE_ATOMIC_OPS - if ((of_atomic_int_dec(&block->flags) & OF_BLOCK_REFCOUNT_MASK) == 0) { - if (block->flags & OF_BLOCK_HAS_COPY_DISPOSE) - block->descriptor->dispose_helper(block); + if ((OFAtomicIntDecrease(&block->flags) & OFBlockRefCountMask) == 0) { + if (block->flags & OFBlockHasCopyDispose) + block->descriptor->disposeHelper(block); free(block); } #else unsigned hash = SPINLOCK_HASH(block); - OF_ENSURE(of_spinlock_lock(&blockSpinlocks[hash]) == 0); - if ((--block->flags & OF_BLOCK_REFCOUNT_MASK) == 0) { - OF_ENSURE(of_spinlock_unlock(&blockSpinlocks[hash]) == 0); + OFEnsure(OFSpinlockLock(&blockSpinlocks[hash]) == 0); + if ((--block->flags & OFBlockRefCountMask) == 0) { + OFEnsure(OFSpinlockUnlock(&blockSpinlocks[hash]) == 0); - if (block->flags & OF_BLOCK_HAS_COPY_DISPOSE) - block->descriptor->dispose_helper(block); + if (block->flags & OFBlockHasCopyDispose) + block->descriptor->disposeHelper(block); free(block); return; } - OF_ENSURE(of_spinlock_unlock(&blockSpinlocks[hash]) == 0); + OFEnsure(OFSpinlockUnlock(&blockSpinlocks[hash]) == 0); #endif } void _Block_object_assign(void *dst_, const void *src_, const int flags_) { - int flags = flags_ & (OF_BLOCK_FIELD_IS_BLOCK | - OF_BLOCK_FIELD_IS_OBJECT | OF_BLOCK_FIELD_IS_BYREF); + int flags = flags_ & (OFBlockFieldIsBlock | OFBlockFieldIsObject | + OFBlockFieldIsByref); if (src_ == NULL) return; switch (flags) { - case OF_BLOCK_FIELD_IS_BLOCK: - *(of_block_literal_t **)dst_ = _Block_copy(src_); + case OFBlockFieldIsBlock: + *(struct Block **)dst_ = _Block_copy(src_); break; - case OF_BLOCK_FIELD_IS_OBJECT: - if (!(flags_ & OF_BLOCK_BYREF_CALLER)) + case OFBlockFieldIsObject: + if (!(flags_ & OFBlockByrefCaller)) *(id *)dst_ = [(id)src_ retain]; break; - case OF_BLOCK_FIELD_IS_BYREF:; - of_block_byref_t *src = (of_block_byref_t *)src_; - of_block_byref_t **dst = (of_block_byref_t **)dst_; + case OFBlockFieldIsByref:; + struct Byref *src = (struct Byref *)src_; + struct Byref **dst = (struct Byref **)dst_; src = src->forwarding; - if ((src->flags & OF_BLOCK_REFCOUNT_MASK) == 0) { + if ((src->flags & OFBlockRefCountMask) == 0) { if ((*dst = malloc(src->size)) == NULL) { alloc_failed_exception.isa = [OFAllocFailedException class]; @throw (OFAllocFailedException *) &alloc_failed_exception; } memcpy(*dst, src, src->size); (*dst)->flags = - ((*dst)->flags & ~OF_BLOCK_REFCOUNT_MASK) | 1; + ((*dst)->flags & ~OFBlockRefCountMask) | 1; (*dst)->forwarding = *dst; - if (src->flags & OF_BLOCK_HAS_COPY_DISPOSE) - src->byref_keep(*dst, src); + if (src->flags & OFBlockHasCopyDispose) + src->keepByref(*dst, src); #ifdef OF_HAVE_ATOMIC_OPS - if (!of_atomic_ptr_cmpswap((void **)&src->forwarding, - src, *dst)) { - src->byref_dispose(*dst); + if (!OFAtomicPointerCompareAndSwap( + (void **)&src->forwarding, src, *dst)) { + src->disposeByref(*dst); free(*dst); *dst = src->forwarding; } #else unsigned hash = SPINLOCK_HASH(src); - OF_ENSURE(of_spinlock_lock(&byrefSpinlocks[hash]) == 0); + OFEnsure(OFSpinlockLock(&byrefSpinlocks[hash]) == 0); if (src->forwarding == src) src->forwarding = *dst; else { - src->byref_dispose(*dst); + src->disposeByref(*dst); free(*dst); *dst = src->forwarding; } - OF_ENSURE( - of_spinlock_unlock(&byrefSpinlocks[hash]) == 0); + OFEnsure(OFSpinlockUnlock(&byrefSpinlocks[hash]) == 0); #endif } else *dst = src; #ifdef OF_HAVE_ATOMIC_OPS - of_atomic_int_inc(&(*dst)->flags); + OFAtomicIntIncrease(&(*dst)->flags); #else unsigned hash = SPINLOCK_HASH(*dst); - OF_ENSURE(of_spinlock_lock(&byrefSpinlocks[hash]) == 0); + OFEnsure(OFSpinlockLock(&byrefSpinlocks[hash]) == 0); (*dst)->flags++; - OF_ENSURE(of_spinlock_unlock(&byrefSpinlocks[hash]) == 0); + OFEnsure(OFSpinlockUnlock(&byrefSpinlocks[hash]) == 0); #endif break; } } void _Block_object_dispose(const void *object_, const int flags_) { - const int flags = flags_ & (OF_BLOCK_FIELD_IS_BLOCK | - OF_BLOCK_FIELD_IS_OBJECT | OF_BLOCK_FIELD_IS_BYREF); + const int flags = flags_ & (OFBlockFieldIsBlock | OFBlockFieldIsObject | + OFBlockFieldIsByref); if (object_ == NULL) return; switch (flags) { - case OF_BLOCK_FIELD_IS_BLOCK: + case OFBlockFieldIsBlock: _Block_release(object_); break; - case OF_BLOCK_FIELD_IS_OBJECT: - if (!(flags_ & OF_BLOCK_BYREF_CALLER)) + case OFBlockFieldIsObject: + if (!(flags_ & OFBlockByrefCaller)) [(id)object_ release]; break; - case OF_BLOCK_FIELD_IS_BYREF:; - of_block_byref_t *object = (of_block_byref_t *)object_; + case OFBlockFieldIsByref:; + struct Byref *object = (struct Byref *)object_; object = object->forwarding; #ifdef OF_HAVE_ATOMIC_OPS - if ((of_atomic_int_dec(&object->flags) & - OF_BLOCK_REFCOUNT_MASK) == 0) { - if (object->flags & OF_BLOCK_HAS_COPY_DISPOSE) - object->byref_dispose(object); + if ((OFAtomicIntDecrease(&object->flags) & + OFBlockRefCountMask) == 0) { + if (object->flags & OFBlockHasCopyDispose) + object->disposeByref(object); free(object); } #else unsigned hash = SPINLOCK_HASH(object); - OF_ENSURE(of_spinlock_lock(&byrefSpinlocks[hash]) == 0); - if ((--object->flags & OF_BLOCK_REFCOUNT_MASK) == 0) { - OF_ENSURE( - of_spinlock_unlock(&byrefSpinlocks[hash]) == 0); + OFEnsure(OFSpinlockLock(&byrefSpinlocks[hash]) == 0); + if ((--object->flags & OFBlockRefCountMask) == 0) { + OFEnsure(OFSpinlockUnlock(&byrefSpinlocks[hash]) == 0); - if (object->flags & OF_BLOCK_HAS_COPY_DISPOSE) - object->byref_dispose(object); + if (object->flags & OFBlockHasCopyDispose) + object->disposeByref(object); free(object); } - OF_ENSURE(of_spinlock_unlock(&byrefSpinlocks[hash]) == 0); + OFEnsure(OFSpinlockUnlock(&byrefSpinlocks[hash]) == 0); #endif break; } } @implementation OFBlock + (void)load { #ifndef OF_HAVE_ATOMIC_OPS - for (size_t i = 0; i < NUM_SPINLOCKS; i++) - if (of_spinlock_new(&blockSpinlocks[i]) != 0 || - of_spinlock_new(&byrefSpinlocks[i]) != 0) + for (size_t i = 0; i < numSpinlocks; i++) + if (OFSpinlockNew(&blockSpinlocks[i]) != 0 || + OFSpinlockNew(&byrefSpinlocks[i]) != 0) @throw [OFInitializationFailedException exceptionWithClass: self]; #endif #ifdef OF_APPLE_RUNTIME @@ -461,14 +471,13 @@ } - (unsigned int)retainCount { if ([self isMemberOfClass: (Class)&_NSConcreteMallocBlock]) - return ((of_block_literal_t *)self)->flags & - OF_BLOCK_REFCOUNT_MASK; + return ((struct Block *)self)->flags & OFBlockRefCountMask; - return OF_RETAIN_COUNT_MAX; + return OFMaxRetainCount; } - (void)release { if ([self isMemberOfClass: (Class)&_NSConcreteMallocBlock]) Index: src/OFBytesValue.m ================================================================== --- src/OFBytesValue.m +++ src/OFBytesValue.m @@ -25,13 +25,13 @@ objCType: (const char *)objCType { self = [super init]; @try { - _size = of_sizeof_type_encoding(objCType); + _size = OFSizeOfTypeEncoding(objCType); _objCType = objCType; - _bytes = of_alloc(1, _size); + _bytes = OFAllocMemory(1, _size); memcpy(_bytes, bytes, _size); } @catch (id e) { [self release]; @throw e; @@ -40,11 +40,11 @@ return self; } - (void)dealloc { - free(_bytes); + OFFreeMemory(_bytes); [super dealloc]; } - (void)getValue: (void *)value size: (size_t)size ADDED src/OFCRC16.h Index: src/OFCRC16.h ================================================================== --- src/OFCRC16.h +++ src/OFCRC16.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#ifndef __STDC_LIMIT_MACROS +# define __STDC_LIMIT_MACROS +#endif +#ifndef __STDC_CONSTANT_MACROS +# define __STDC_CONSTANT_MACROS +#endif + +#import "macros.h" + +#ifdef __cplusplus +extern "C" { +#endif +extern uint16_t OFCRC16(uint16_t crc, const void *_Nonnull bytes, + size_t length); +#ifdef __cplusplus +} +#endif ADDED src/OFCRC16.m Index: src/OFCRC16.m ================================================================== --- src/OFCRC16.m +++ src/OFCRC16.m @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#import "OFCRC16.h" + +static const uint16_t CRC16Magic = 0xA001; + +uint16_t +OFCRC16(uint16_t CRC, const void *bytes_, size_t length) +{ + const unsigned char *bytes = bytes_; + + for (size_t i = 0; i < length; i++) { + CRC ^= bytes[i]; + + for (uint8_t j = 0; j < 8; j++) + CRC = (CRC >> 1) ^ (CRC16Magic & (~(CRC & 1) + 1)); + } + + return CRC; +} ADDED src/OFCRC32.h Index: src/OFCRC32.h ================================================================== --- src/OFCRC32.h +++ src/OFCRC32.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#ifndef __STDC_LIMIT_MACROS +# define __STDC_LIMIT_MACROS +#endif +#ifndef __STDC_CONSTANT_MACROS +# define __STDC_CONSTANT_MACROS +#endif + +#import "macros.h" + +#ifdef __cplusplus +extern "C" { +#endif +extern uint32_t OFCRC32(uint32_t crc, const void *_Nonnull bytes, + size_t length); +#ifdef __cplusplus +} +#endif ADDED src/OFCRC32.m Index: src/OFCRC32.m ================================================================== --- src/OFCRC32.m +++ src/OFCRC32.m @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#import "OFCRC32.h" + +static const uint32_t CRC32Magic = 0xEDB88320; + +uint32_t +OFCRC32(uint32_t CRC, const void *bytes_, size_t length) +{ + const unsigned char *bytes = bytes_; + + for (size_t i = 0; i < length; i++) { + CRC ^= bytes[i]; + + for (uint8_t j = 0; j < 8; j++) + CRC = (CRC >> 1) ^ (CRC32Magic & (~(CRC & 1) + 1)); + } + + return CRC; +} Index: src/OFCharacterSet.h ================================================================== --- src/OFCharacterSet.h +++ src/OFCharacterSet.h @@ -54,11 +54,11 @@ * range. * * @param range The range of characters for the character set * @return A new OFCharacterSet */ -+ (instancetype)characterSetWithRange: (of_range_t)range; ++ (instancetype)characterSetWithRange: (OFRange)range; /** * @brief A character set containing all Unicode characters in the category * `Zs` plus CHARACTER TABULATION (U+0009). */ @@ -78,19 +78,19 @@ * the specified range. * * @param range The range of characters for the character set * @return An initialized OFCharacterSet */ -- (instancetype)initWithRange: (of_range_t)range; +- (instancetype)initWithRange: (OFRange)range; /** * @brief Returns whether the specified character is a member of the character * set. * * @param character The character that is checked for being a member of the * character set * @return Whether the specified character is a member of the character set. */ -- (bool)characterIsMember: (of_unichar_t)character; +- (bool)characterIsMember: (OFUnichar)character; @end OF_ASSUME_NONNULL_END Index: src/OFCharacterSet.m ================================================================== --- src/OFCharacterSet.m +++ src/OFCharacterSet.m @@ -16,14 +16,13 @@ #include "config.h" #import "OFCharacterSet.h" #import "OFBitSetCharacterSet.h" #import "OFInvertedCharacterSet.h" +#import "OFOnce.h" #import "OFRangeCharacterSet.h" -#import "once.h" - @interface OFPlaceholderCharacterSet: OFCharacterSet @end @interface OFWhitespaceCharacterSet: OFCharacterSet @end @@ -50,11 +49,11 @@ { return (id)[[OFBitSetCharacterSet alloc] initWithCharactersInString: characters]; } -- (instancetype)initWithRange: (of_range_t)range +- (instancetype)initWithRange: (OFRange)range { return (id)[[OFRangeCharacterSet alloc] initWithRange: range]; } - (instancetype)retain @@ -98,19 +97,19 @@ { return [[[self alloc] initWithCharactersInString: characters] autorelease]; } -+ (instancetype)characterSetWithRange: (of_range_t)range ++ (instancetype)characterSetWithRange: (OFRange)range { return [[[self alloc] initWithRange: range] autorelease]; } + (OFCharacterSet *)whitespaceCharacterSet { - static of_once_t onceControl = OF_ONCE_INIT; - of_once(&onceControl, initWhitespaceCharacterSet); + static OFOnceControl onceControl = OFOnceControlInitValue; + OFOnce(&onceControl, initWhitespaceCharacterSet); return whitespaceCharacterSet; } - (instancetype)init @@ -132,16 +131,16 @@ - (instancetype)initWithCharactersInString: (OFString *)characters { OF_INVALID_INIT_METHOD } -- (instancetype)initWithRange: (of_range_t)range +- (instancetype)initWithRange: (OFRange)range { OF_INVALID_INIT_METHOD } -- (bool)characterIsMember: (of_unichar_t)character +- (bool)characterIsMember: (OFUnichar)character { OF_UNRECOGNIZED_SELECTOR } - (OFCharacterSet *)invertedSet @@ -166,14 +165,14 @@ { } - (unsigned int)retainCount { - return OF_RETAIN_COUNT_MAX; + return OFMaxRetainCount; } -- (bool)characterIsMember: (of_unichar_t)character +- (bool)characterIsMember: (OFUnichar)character { switch (character) { case 0x0009: case 0x0020: case 0x00A0: Index: src/OFColor.m ================================================================== --- src/OFColor.m +++ src/OFColor.m @@ -14,34 +14,33 @@ */ #include "config.h" #import "OFColor.h" - -#import "once.h" +#import "OFOnce.h" #import "OFInvalidArgumentException.h" @implementation OFColor -#define PREDEFINED_COLOR(name, r, g, b) \ - static OFColor *name##Color = nil; \ - \ - static void \ - initPredefinedColor_##name(void) \ - { \ - name##Color = [[OFColor alloc] initWithRed: r \ - green: g \ - blue: b \ - alpha: 1]; \ - } \ - \ - + (OFColor *)name \ - { \ - static of_once_t onceControl = OF_ONCE_INIT; \ - of_once(&onceControl, initPredefinedColor_##name); \ - \ - return name##Color; \ +#define PREDEFINED_COLOR(name, redValue, greenValue, blueValue) \ + static OFColor *name##Color = nil; \ + \ + static void \ + initPredefinedColor_##name(void) \ + { \ + name##Color = [[OFColor alloc] initWithRed: redValue \ + green: greenValue \ + blue: blueValue \ + alpha: 1]; \ + } \ + \ + + (OFColor *)name \ + { \ + static OFOnceControl onceControl = OFOnceControlInitValue; \ + OFOnce(&onceControl, initPredefinedColor_##name); \ + \ + return name##Color; \ } PREDEFINED_COLOR(black, 0.00f, 0.00f, 0.00f) PREDEFINED_COLOR(silver, 0.75f, 0.75f, 0.75f) PREDEFINED_COLOR(grey, 0.50f, 0.50f, 0.50f) @@ -120,32 +119,32 @@ return true; } - (unsigned long)hash { - uint32_t hash; + unsigned long hash; float tmp; - OF_HASH_INIT(hash); - - tmp = OF_BSWAP_FLOAT_IF_LE(_red); - for (uint_fast8_t i = 0; i < sizeof(float); i++) - OF_HASH_ADD(hash, ((char *)&tmp)[i]); - - tmp = OF_BSWAP_FLOAT_IF_LE(_green); - for (uint_fast8_t i = 0; i < sizeof(float); i++) - OF_HASH_ADD(hash, ((char *)&tmp)[i]); - - tmp = OF_BSWAP_FLOAT_IF_LE(_blue); - for (uint_fast8_t i = 0; i < sizeof(float); i++) - OF_HASH_ADD(hash, ((char *)&tmp)[i]); - - tmp = OF_BSWAP_FLOAT_IF_LE(_alpha); - for (uint_fast8_t i = 0; i < sizeof(float); i++) - OF_HASH_ADD(hash, ((char *)&tmp)[i]); - - OF_HASH_FINALIZE(hash); + OFHashInit(&hash); + + tmp = OFToLittleEndianFloat(_red); + for (uint_fast8_t i = 0; i < sizeof(float); i++) + OFHashAdd(&hash, ((char *)&tmp)[i]); + + tmp = OFToLittleEndianFloat(_green); + for (uint_fast8_t i = 0; i < sizeof(float); i++) + OFHashAdd(&hash, ((char *)&tmp)[i]); + + tmp = OFToLittleEndianFloat(_blue); + for (uint_fast8_t i = 0; i < sizeof(float); i++) + OFHashAdd(&hash, ((char *)&tmp)[i]); + + tmp = OFToLittleEndianFloat(_alpha); + for (uint_fast8_t i = 0; i < sizeof(float); i++) + OFHashAdd(&hash, ((char *)&tmp)[i]); + + OFHashFinalize(&hash); return hash; } - (void)getRed: (float *)red Index: src/OFCondition.h ================================================================== --- src/OFCondition.h +++ src/OFCondition.h @@ -12,12 +12,11 @@ * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #import "OFMutex.h" - -#import "condition.h" +#import "OFPlainCondition.h" OF_ASSUME_NONNULL_BEGIN @class OFDate; @@ -27,11 +26,11 @@ * @brief A class implementing a condition variable for thread synchronization. */ OF_SUBCLASSING_RESTRICTED @interface OFCondition: OFMutex { - of_condition_t _condition; + OFPlainCondition _condition; bool _conditionInitialized; } /** * @brief Creates a new condition. @@ -70,11 +69,11 @@ * to check the condition again after @ref waitForTimeInterval: returned! * * @param timeInterval The time interval until the timeout is reached * @return Whether the condition has been signaled */ -- (bool)waitForTimeInterval: (of_time_interval_t)timeInterval; +- (bool)waitForTimeInterval: (OFTimeInterval)timeInterval; #ifdef OF_AMIGAOS /** * @brief Blocks the current thread until another thread calls @ref signal, * @ref broadcast, the timeout is reached or an Exec Signal is received. @@ -84,11 +83,11 @@ * @param timeInterval The time interval until the timeout is reached * @param signalMask A pointer to a signal mask of Exec Signals to receive. * This is modified and set to the mask of signals received. * @return Whether the condition has been signaled or a signal received */ -- (bool)waitForTimeInterval: (of_time_interval_t)timeInterval +- (bool)waitForTimeInterval: (OFTimeInterval)timeInterval orExecSignal: (ULONG *)signalMask; #endif /** * @brief Blocks the current thread until another thread calls @ref signal, Index: src/OFCondition.m ================================================================== --- src/OFCondition.m +++ src/OFCondition.m @@ -34,11 +34,11 @@ - (instancetype)init { self = [super init]; - if (of_condition_new(&_condition) != 0) { + if (OFPlainConditionNew(&_condition) != 0) { Class c = self.class; [self release]; @throw [OFInitializationFailedException exceptionWithClass: c]; } @@ -48,14 +48,14 @@ } - (void)dealloc { if (_conditionInitialized) { - int error = of_condition_free(&_condition); + int error = OFPlainConditionFree(&_condition); if (error != 0) { - OF_ENSURE(error == EBUSY); + OFEnsure(error == EBUSY); @throw [OFConditionStillWaitingException exceptionWithCondition: self]; } } @@ -63,11 +63,11 @@ [super dealloc]; } - (void)wait { - int error = of_condition_wait(&_condition, &_mutex); + int error = OFPlainConditionWait(&_condition, &_mutex); if (error != 0) @throw [OFConditionWaitFailedException exceptionWithCondition: self errNo: error]; @@ -74,23 +74,24 @@ } #ifdef OF_AMIGAOS - (void)waitForConditionOrExecSignal: (ULONG *)signalMask { - int error = of_condition_wait_or_signal(&_condition, &_mutex, + int error = OFPlainConditionWaitOrExecSignal(&_condition, &_mutex, signalMask); if (error != 0) @throw [OFConditionWaitFailedException exceptionWithCondition: self errNo: error]; } #endif -- (bool)waitForTimeInterval: (of_time_interval_t)timeInterval +- (bool)waitForTimeInterval: (OFTimeInterval)timeInterval { - int error = of_condition_timed_wait(&_condition, &_mutex, timeInterval); + int error = OFPlainConditionTimedWait(&_condition, &_mutex, + timeInterval); if (error == ETIMEDOUT) return false; if (error != 0) @@ -100,14 +101,14 @@ return true; } #ifdef OF_AMIGAOS -- (bool)waitForTimeInterval: (of_time_interval_t)timeInterval +- (bool)waitForTimeInterval: (OFTimeInterval)timeInterval orExecSignal: (ULONG *)signalMask { - int error = of_condition_timed_wait_or_signal(&_condition, &_mutex, + int error = OFPlainConditionTimedWaitExecOrSignal(&_condition, &_mutex, timeInterval, signalMask); if (error == ETIMEDOUT) return false; @@ -133,23 +134,23 @@ } #endif - (void)signal { - int error = of_condition_signal(&_condition); + int error = OFPlainConditionSignal(&_condition); if (error != 0) @throw [OFConditionSignalFailedException exceptionWithCondition: self errNo: error]; } - (void)broadcast { - int error = of_condition_broadcast(&_condition); + int error = OFPlainConditionBroadcast(&_condition); if (error != 0) @throw [OFConditionBroadcastFailedException exceptionWithCondition: self errNo: error]; } @end Index: src/OFConstantString.m ================================================================== --- src/OFConstantString.m +++ src/OFConstantString.m @@ -62,11 +62,11 @@ return self; } - (unsigned int)retainCount { - return OF_RETAIN_COUNT_MAX; + return OFMaxRetainCount; } - (void)release { } @@ -104,26 +104,26 @@ } - (void)finishInitialization { @synchronized (self) { - struct of_string_utf8_ivars *ivars; + struct OFUTF8StringIvars *ivars; if ([self isMemberOfClass: [OFConstantUTF8String class]]) return; - ivars = of_alloc_zeroed(1, sizeof(*ivars)); + ivars = OFAllocZeroedMemory(1, sizeof(*ivars)); ivars->cString = _cString; ivars->cStringLength = _cStringLength; - switch (of_string_utf8_check(ivars->cString, - ivars->cStringLength, &ivars->length)) { + switch (OFUTF8StringCheck(ivars->cString, ivars->cStringLength, + &ivars->length)) { case 1: ivars->isUTF8 = true; break; case -1: - free(ivars); + OFFreeMemory(ivars); @throw [OFInvalidEncodingException exception]; } _cString = (char *)ivars; object_setClass(self, [OFConstantUTF8String class]); @@ -145,11 +145,11 @@ return self; } - (unsigned int)retainCount { - return OF_RETAIN_COUNT_MAX; + return OFMaxRetainCount; } - (void)release { } @@ -177,11 +177,11 @@ [self finishInitialization]; return [self mutableCopy]; } /* From protocol OFComparing, but overridden in OFString */ -- (of_comparison_result_t)compare: (OFString *)string +- (OFComparisonResult)compare: (OFString *)string { [self finishInitialization]; return [self compare: string]; } @@ -211,19 +211,19 @@ return self.UTF8String; } - (size_t)getCString: (char *)cString_ maxLength: (size_t)maxLength - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { [self finishInitialization]; return [self getCString: cString_ maxLength: maxLength encoding: encoding]; } -- (const char *)cStringWithEncoding: (of_string_encoding_t)encoding +- (const char *)cStringWithEncoding: (OFStringEncoding)encoding { [self finishInitialization]; return [self cStringWithEncoding: encoding]; } @@ -237,49 +237,50 @@ { [self finishInitialization]; return self.UTF8StringLength; } -- (size_t)cStringLengthWithEncoding: (of_string_encoding_t)encoding +- (size_t)cStringLengthWithEncoding: (OFStringEncoding)encoding { [self finishInitialization]; return [self cStringLengthWithEncoding: encoding]; } -- (of_comparison_result_t)caseInsensitiveCompare: (OFString *)string +- (OFComparisonResult)caseInsensitiveCompare: (OFString *)string { [self finishInitialization]; return [self caseInsensitiveCompare: string]; } -- (of_unichar_t)characterAtIndex: (size_t)idx +- (OFUnichar)characterAtIndex: (size_t)idx { [self finishInitialization]; return [self characterAtIndex: idx]; } -- (void)getCharacters: (of_unichar_t *)buffer inRange: (of_range_t)range +- (void)getCharacters: (OFUnichar *)buffer inRange: (OFRange)range { [self finishInitialization]; [self getCharacters: buffer inRange: range]; } -- (of_range_t)rangeOfString: (OFString *)string +- (OFRange)rangeOfString: (OFString *)string { [self finishInitialization]; return [self rangeOfString: string]; } -- (of_range_t)rangeOfString: (OFString *)string options: (int)options +- (OFRange)rangeOfString: (OFString *)string + options: (OFStringSearchOptions)options { [self finishInitialization]; return [self rangeOfString: string options: options]; } -- (of_range_t)rangeOfString: (OFString *)string - options: (int)options - range: (of_range_t)range +- (OFRange)rangeOfString: (OFString *)string + options: (OFStringSearchOptions)options + range: (OFRange)range { [self finishInitialization]; return [self rangeOfString: string options: options range: range]; } @@ -288,19 +289,19 @@ [self finishInitialization]; return [self indexOfCharacterFromSet: characterSet]; } - (size_t)indexOfCharacterFromSet: (OFCharacterSet *)characterSet - options: (int)options + options: (OFStringSearchOptions)options { [self finishInitialization]; return [self indexOfCharacterFromSet: characterSet options: options]; } - (size_t)indexOfCharacterFromSet: (OFCharacterSet *)characterSet - options: (int)options - range: (of_range_t)range + options: (OFStringSearchOptions)options + range: (OFRange)range { [self finishInitialization]; return [self indexOfCharacterFromSet: characterSet options: options range: range]; @@ -322,11 +323,11 @@ { [self finishInitialization]; return [self substringToIndex: idx]; } -- (OFString *)substringWithRange: (of_range_t)range +- (OFString *)substringWithRange: (OFRange)range { [self finishInitialization]; return [self substringWithRange: range]; } @@ -364,11 +365,11 @@ } - (OFString *)stringByReplacingOccurrencesOfString: (OFString *)string withString: (OFString *)replacement options: (int)options - range: (of_range_t)range + range: (OFRange)range { [self finishInitialization]; return [self stringByReplacingOccurrencesOfString: string withString: replacement options: options @@ -428,11 +429,11 @@ [self finishInitialization]; return [self componentsSeparatedByString: delimiter]; } - (OFArray *)componentsSeparatedByString: (OFString *)delimiter - options: (int)options + options: (OFStringSeparationOptions)options { [self finishInitialization]; return [self componentsSeparatedByString: delimiter options: options]; } @@ -443,11 +444,11 @@ return [self componentsSeparatedByCharactersInSet: characterSet]; } - (OFArray *) componentsSeparatedByCharactersInSet: (OFCharacterSet *)characterSet - options: (int)options + options: (OFStringSeparationOptions)options { [self finishInitialization]; return [self componentsSeparatedByCharactersInSet: characterSet options: options]; } @@ -504,23 +505,23 @@ { [self finishInitialization]; return self.doubleValue; } -- (const of_unichar_t *)characters +- (const OFUnichar *)characters { [self finishInitialization]; return self.characters; } -- (const of_char16_t *)UTF16String +- (const OFChar16 *)UTF16String { [self finishInitialization]; return self.UTF16String; } -- (const of_char16_t *)UTF16StringWithByteOrder: (of_byte_order_t)byteOrder +- (const OFChar16 *)UTF16StringWithByteOrder: (OFByteOrder)byteOrder { [self finishInitialization]; return [self UTF16StringWithByteOrder: byteOrder]; } @@ -528,23 +529,23 @@ { [self finishInitialization]; return self.UTF16StringLength; } -- (const of_char32_t *)UTF32String +- (const OFChar32 *)UTF32String { [self finishInitialization]; return self.UTF32String; } -- (const of_char32_t *)UTF32StringWithByteOrder: (of_byte_order_t)byteOrder +- (const OFChar32 *)UTF32StringWithByteOrder: (OFByteOrder)byteOrder { [self finishInitialization]; return [self UTF32StringWithByteOrder: byteOrder]; } -- (OFData *)dataWithEncoding: (of_string_encoding_t)encoding +- (OFData *)dataWithEncoding: (OFStringEncoding)encoding { [self finishInitialization]; return [self dataWithEncoding: encoding]; } @@ -575,11 +576,11 @@ { [self finishInitialization]; [self writeToFile: path]; } -- (void)writeToFile: (OFString *)path encoding: (of_string_encoding_t)encoding +- (void)writeToFile: (OFString *)path encoding: (OFStringEncoding)encoding { [self finishInitialization]; [self writeToFile: path encoding: encoding]; } #endif @@ -588,19 +589,19 @@ { [self finishInitialization]; [self writeToURL: URL]; } -- (void)writeToURL: (OFURL *)URL encoding: (of_string_encoding_t)encoding +- (void)writeToURL: (OFURL *)URL encoding: (OFStringEncoding)encoding { [self finishInitialization]; [self writeToURL: URL encoding: encoding]; } #ifdef OF_HAVE_BLOCKS -- (void)enumerateLinesUsingBlock: (of_string_line_enumeration_block_t)block +- (void)enumerateLinesUsingBlock: (OFStringLineEnumerationBlock)block { [self finishInitialization]; [self enumerateLinesUsingBlock: block]; } #endif @end Index: src/OFCountedMapTableSet.m ================================================================== --- src/OFCountedMapTableSet.m +++ src/OFCountedMapTableSet.m @@ -123,23 +123,23 @@ @try { void *pool = objc_autoreleasePoolPush(); if (![element.name isEqual: @"OFCountedSet"] || - ![element.namespace isEqual: OF_SERIALIZATION_NS]) + ![element.namespace isEqual: OFSerializationNS]) @throw [OFInvalidArgumentException exception]; for (OFXMLElement *objectElement in [element elementsForName: @"object" - namespace: OF_SERIALIZATION_NS]) { + namespace: OFSerializationNS]) { void *pool2 = objc_autoreleasePoolPush(); OFXMLElement *object; OFXMLAttribute *countAttribute; unsigned long long count; object = [objectElement elementsForNamespace: - OF_SERIALIZATION_NS].firstObject; + OFSerializationNS].firstObject; countAttribute = [objectElement attributeForName: @"count"]; if (object == nil || countAttribute == nil) @throw [OFInvalidFormatException exception]; @@ -167,12 +167,11 @@ { return (size_t)(uintptr_t)[_mapTable objectForKey: object]; } #ifdef OF_HAVE_BLOCKS -- (void)enumerateObjectsAndCountUsingBlock: - (of_counted_set_enumeration_block_t)block +- (void)enumerateObjectsAndCountUsingBlock: (OFCountedSetEnumerationBlock)block { @try { [_mapTable enumerateKeysAndObjectsUsingBlock: ^ (void *key, void *object, bool *stop) { block(key, (size_t)(uintptr_t)object, stop); Index: src/OFCountedSet.h ================================================================== --- src/OFCountedSet.h +++ src/OFCountedSet.h @@ -26,11 +26,11 @@ * @param object The current object * @param count The count of the object * @param stop A pointer to a variable that can be set to true to stop the * enumeration */ -typedef void (^of_counted_set_enumeration_block_t)(id object, size_t count, +typedef void (^OFCountedSetEnumerationBlock)(id object, size_t count, bool *stop); #endif /** * @class OFCountedSet OFCountedSet.h ObjFW/OFCountedSet.h @@ -57,14 +57,13 @@ /** * @brief Executes a block for each object in the set. * * @param block The block to execute for each object in the set */ -- (void)enumerateObjectsAndCountUsingBlock: - (of_counted_set_enumeration_block_t)block; +- (void)enumerateObjectsAndCountUsingBlock: (OFCountedSetEnumerationBlock)block; #endif #if !defined(OF_HAVE_GENERICS) && !defined(DOXYGEN) # undef ObjectType #endif @end OF_ASSUME_NONNULL_END Index: src/OFCountedSet.m ================================================================== --- src/OFCountedSet.m +++ src/OFCountedSet.m @@ -181,11 +181,11 @@ { void *pool = objc_autoreleasePoolPush(); OFXMLElement *element; element = [OFXMLElement elementWithName: @"OFCountedSet" - namespace: OF_SERIALIZATION_NS]; + namespace: OFSerializationNS]; for (id object in self) { void *pool2 = objc_autoreleasePoolPush(); OFXMLElement *objectElement; @@ -195,11 +195,11 @@ [OFString stringWithFormat: @"%zu", [self countForObject: object]]; objectElement = [OFXMLElement elementWithName: @"object" - namespace: OF_SERIALIZATION_NS]; + namespace: OFSerializationNS]; [objectElement addAttributeWithName: @"count" stringValue: count]; [objectElement addChild: object.XMLElementBySerializing]; [element addChild: objectElement]; @@ -212,12 +212,11 @@ return [element autorelease]; } #ifdef OF_HAVE_BLOCKS -- (void)enumerateObjectsAndCountUsingBlock: - (of_counted_set_enumeration_block_t)block +- (void)enumerateObjectsAndCountUsingBlock: (OFCountedSetEnumerationBlock)block { [self enumerateObjectsUsingBlock: ^ (id object, bool *stop) { block(object, [self countForObject: object], stop); }]; } Index: src/OFDNSQuery.h ================================================================== --- src/OFDNSQuery.h +++ src/OFDNSQuery.h @@ -26,12 +26,12 @@ * @brief A class representing a DNS query. */ @interface OFDNSQuery: OFObject { OFString *_domainName; - of_dns_class_t _DNSClass; - of_dns_record_type_t _recordType; + OFDNSClass _DNSClass; + OFDNSRecordType _recordType; OF_RESERVE_IVARS(OFDNSQuery, 4) } /** * @brief The domain name of the query. @@ -39,16 +39,16 @@ @property (readonly, nonatomic) OFString *domainName; /** * @brief The DNS class of the query. */ -@property (readonly, nonatomic) of_dns_class_t DNSClass; +@property (readonly, nonatomic) OFDNSClass DNSClass; /** * @brief The record type of the query. */ -@property (readonly, nonatomic) of_dns_record_type_t recordType; +@property (readonly, nonatomic) OFDNSRecordType recordType; /** * @brief Creates a new, autoreleased OFDNSQuery. * * @param domainName The domain name to query @@ -55,12 +55,12 @@ * @param DNSClass The DNS class of the query * @param recordType The record type of the query * @return A new, autoreleased OFDNSQuery */ + (instancetype)queryWithDomainName: (OFString *)domainName - DNSClass: (of_dns_class_t)DNSClass - recordType: (of_dns_record_type_t)recordType; + DNSClass: (OFDNSClass)DNSClass + recordType: (OFDNSRecordType)recordType; /** * @brief Initializes an already allocated OFDNSQuery. * * @param domainName The domain name to query @@ -67,13 +67,13 @@ * @param DNSClass The DNS class of the query * @param recordType The record type of the query * @return An initialized OFDNSQuery */ - (instancetype)initWithDomainName: (OFString *)domainName - DNSClass: (of_dns_class_t)DNSClass - recordType: (of_dns_record_type_t)recordType + DNSClass: (OFDNSClass)DNSClass + recordType: (OFDNSRecordType)recordType OF_DESIGNATED_INITIALIZER; - (instancetype)init OF_UNAVAILABLE; @end OF_ASSUME_NONNULL_END Index: src/OFDNSQuery.m ================================================================== --- src/OFDNSQuery.m +++ src/OFDNSQuery.m @@ -21,21 +21,21 @@ @implementation OFDNSQuery @synthesize domainName = _domainName, DNSClass = _DNSClass; @synthesize recordType = _recordType; + (instancetype)queryWithDomainName: (OFString *)domainName - DNSClass: (of_dns_class_t)DNSClass - recordType: (of_dns_record_type_t)recordType + DNSClass: (OFDNSClass)DNSClass + recordType: (OFDNSRecordType)recordType { return [[[self alloc] initWithDomainName: domainName DNSClass: DNSClass recordType: recordType] autorelease]; } - (instancetype)initWithDomainName: (OFString *)domainName - DNSClass: (of_dns_class_t)DNSClass - recordType: (of_dns_record_type_t)recordType + DNSClass: (OFDNSClass)DNSClass + recordType: (OFDNSRecordType)recordType { self = [super init]; @try { void *pool = objc_autoreleasePoolPush(); @@ -91,17 +91,17 @@ return true; } - (unsigned long)hash { - uint32_t hash; + unsigned long hash; - OF_HASH_INIT(hash); - OF_HASH_ADD_HASH(hash, _domainName.hash); - OF_HASH_ADD(hash, _DNSClass); - OF_HASH_ADD(hash, _recordType); - OF_HASH_FINALIZE(hash); + OFHashInit(&hash); + OFHashAddHash(&hash, _domainName.hash); + OFHashAdd(&hash, _DNSClass); + OFHashAdd(&hash, _recordType); + OFHashFinalize(&hash); return hash; } - (id)copy @@ -110,9 +110,9 @@ } - (OFString *)description { return [OFString stringWithFormat: @"<%@ %@ %@ %@>", - self.className, _domainName, of_dns_class_to_string(_DNSClass), - of_dns_record_type_to_string(_recordType)]; + self.className, _domainName, OFDNSClassName(_DNSClass), + OFDNSRecordTypeName(_recordType)]; } @end Index: src/OFDNSResolver.h ================================================================== --- src/OFDNSResolver.h +++ src/OFDNSResolver.h @@ -20,11 +20,11 @@ #import "OFRunLoop.h" #import "OFString.h" OF_ASSUME_NONNULL_BEGIN -#define OF_DNS_RESOLVER_BUFFER_LENGTH 512 +#define OFDNSResolverBufferLength 512 @class OFArray OF_GENERIC(ObjectType); @class OFDNSResolver; @class OFDNSResolverContext; @class OFDNSResolverSettings; @@ -34,41 +34,41 @@ @class OFNumber; @class OFTCPSocket; @class OFUDPSocket; /** - * @enum of_dns_resolver_error_t OFDNSResolver.h ObjFW/OFDNSResolver.h + * @enum OFDNSResolverErrorCode OFDNSResolver.h ObjFW/OFDNSResolver.h * * @brief An enum describing why resolving a host failed. */ -typedef enum of_dns_resolver_error_t { +typedef enum { /** An unknown error */ - OF_DNS_RESOLVER_ERROR_UNKNOWN, + OFDNSResolverErrorCodeUnknown, /** The query timed out */ - OF_DNS_RESOLVER_ERROR_TIMEOUT, + OFDNSResolverErrorCodeTimeout, /** The query was canceled */ - OF_DNS_RESOLVER_ERROR_CANCELED, + OFDNSResolverErrorCodeCanceled, /** * No result for the specified host with the specified type and class. * * This is only used in situations where this is an error, e.g. when * trying to connect to a host. */ - OF_DNS_RESOLVER_ERROR_NO_RESULT, + OFDNSResolverErrorCodeNoResult, /** The server considered the query to be malformed */ - OF_DNS_RESOLVER_ERROR_SERVER_INVALID_FORMAT, + OFDNSResolverErrorCodeServerInvalidFormat, /** The server was unable to process due to an internal error */ - OF_DNS_RESOLVER_ERROR_SERVER_FAILURE, + OFDNSResolverErrorCodeServerFailure, /** The server returned an error that the domain does not exist */ - OF_DNS_RESOLVER_ERROR_SERVER_NAME_ERROR, + OFDNSResolverErrorCodeServerNameError, /** The server does not have support for the requested query */ - OF_DNS_RESOLVER_ERROR_SERVER_NOT_IMPLEMENTED, + OFDNSResolverErrorCodeServerNotImplemented, /** The server refused the query */ - OF_DNS_RESOLVER_ERROR_SERVER_REFUSED, + OFDNSResolverErrorCodeServerRefused, /** There was no name server to query */ - OF_DNS_RESOLVER_ERROR_NO_NAME_SERVER -} of_dns_resolver_error_t; + OFDNSResolverErrorCodeNoNameServer +} OFDNSResolverErrorCode; /** * @protocol OFDNSResolverQueryDelegate OFDNSResolver.h ObjFW/OFDNSResolver.h * * @brief A delegate for performed DNS queries. @@ -99,11 +99,11 @@ * @brief This method is called when a DNS resolver resolved a host to * addresses. * * @param resolver The acting resolver * @param host The host the resolver resolved - * @param addresses OFData containing several of_socket_address_t + * @param addresses OFData containing several OFSocketAddress * @param exception The exception that occurred during resolving, or nil on * success */ - (void)resolver: (OFDNSResolver *)resolver didResolveHost: (OFString *)host @@ -127,11 +127,11 @@ OFDNSResolverSettings *_settings; OFUDPSocket *_IPv4Socket; #ifdef OF_HAVE_IPV6 OFUDPSocket *_IPv6Socket; #endif - char _buffer[OF_DNS_RESOLVER_BUFFER_LENGTH]; + char _buffer[OFDNSResolverBufferLength]; OFMutableDictionary OF_GENERIC(OFNumber *, OFDNSResolverContext *) *_queries; OFMutableDictionary OF_GENERIC(OFTCPSocket *, OFDNSResolverContext *) *_TCPQueries; } @@ -163,11 +163,11 @@ /** * @brief The timeout, in seconds, after which the next name server should be * tried. */ -@property (nonatomic) of_time_interval_t timeout; +@property (nonatomic) OFTimeInterval timeout; /** * @brief The number of attempts before giving up to resolve a host. * * Trying all name servers once is considered a single attempt. @@ -187,11 +187,11 @@ /** * @brief The interval in seconds in which the config should be reloaded. * * Setting this to 0 disables config reloading. */ -@property (nonatomic) of_time_interval_t configReloadInterval; +@property (nonatomic) OFTimeInterval configReloadInterval; /** * @brief Creates a new, autoreleased OFDNSResolver. */ + (instancetype)resolver; @@ -216,11 +216,11 @@ * @param query The query to perform * @param runLoopMode The run loop mode in which to resolve * @param delegate The delegate to use for callbacks */ - (void)asyncPerformQuery: (OFDNSQuery *)query - runLoopMode: (of_run_loop_mode_t)runLoopMode + runLoopMode: (OFRunLoopMode)runLoopMode delegate: (id )delegate; /** * @brief Asynchronously resolves the specified host to socket addresses. * @@ -236,11 +236,11 @@ * @param host The host to resolve * @param addressFamily The desired socket address family * @param delegate The delegate to use for callbacks */ - (void)asyncResolveAddressesForHost: (OFString *)host - addressFamily: (of_socket_address_family_t)addressFamily + addressFamily: (OFSocketAddressFamily)addressFamily delegate: (id )delegate; /** * @brief Asynchronously resolves the specified host to socket addresses. * @@ -248,26 +248,26 @@ * @param addressFamily The desired socket address family * @param runLoopMode The run loop mode in which to resolve * @param delegate The delegate to use for callbacks */ - (void)asyncResolveAddressesForHost: (OFString *)host - addressFamily: (of_socket_address_family_t)addressFamily - runLoopMode: (of_run_loop_mode_t)runLoopMode + addressFamily: (OFSocketAddressFamily)addressFamily + runLoopMode: (OFRunLoopMode)runLoopMode delegate: (id )delegate; /** * @brief Synchronously resolves the specified host to socket addresses. * * @param host The host to resolve * @param addressFamily The desired socket address family - * @return OFData containing several of_socket_address_t + * @return OFData containing several OFSocketAddress */ - (OFData *)resolveAddressesForHost: (OFString *)host - addressFamily: (of_socket_address_family_t)addressFamily; + addressFamily: (OFSocketAddressFamily)addressFamily; /** * @brief Closes all sockets and cancels all ongoing queries. */ - (void)close; @end OF_ASSUME_NONNULL_END Index: src/OFDNSResolver.m ================================================================== --- src/OFDNSResolver.m +++ src/OFDNSResolver.m @@ -44,22 +44,20 @@ #ifndef SOCK_DNS # define SOCK_DNS 0 #endif -#define BUFFER_LENGTH OF_DNS_RESOLVER_BUFFER_LENGTH -#define MAX_DNS_RESPONSE_LENGTH 65536 +static const size_t bufferLength = OFDNSResolverBufferLength; +static const size_t maxDNSResponseLength = 65536; /* * RFC 1035 doesn't specify if pointers to pointers are allowed, and if so how * many. Since it's unspecified, we have to assume that it might happen, but we * also want to limit it to avoid DoS. Limiting it to 16 levels of pointers and * immediately rejecting pointers to itself seems like a fair balance. */ -#define MAX_ALLOWED_POINTERS 16 - -#define CNAME_RECURSION 3 +static const uint_fast8_t maxAllowedPointers = 16; @interface OFDNSResolver () - (void)of_contextTimedOut: (OFDNSResolverContext *)context; @end @@ -72,11 +70,11 @@ OFDNSResolverSettings *_settings; size_t _nameServersIndex; unsigned int _attempt; id _delegate; OFData *_queryData; - of_socket_address_t _usedNameServer; + OFSocketAddress _usedNameServer; OFTCPSocket *_TCPSocket; OFMutableData *_TCPQueryData; void *_TCPBuffer; size_t _responseLength; OFTimer *_cancelTimer; @@ -166,70 +164,70 @@ return [components componentsJoinedByString: @"."]; } static OF_KINDOF(OFDNSResourceRecord *) -parseResourceRecord(OFString *name, of_dns_class_t DNSClass, - of_dns_record_type_t recordType, uint32_t TTL, const unsigned char *buffer, +parseResourceRecord(OFString *name, OFDNSClass DNSClass, + OFDNSRecordType recordType, uint32_t TTL, const unsigned char *buffer, size_t length, size_t i, uint16_t dataLength) { - if (recordType == OF_DNS_RECORD_TYPE_A && DNSClass == OF_DNS_CLASS_IN) { - of_socket_address_t address; + if (recordType == OFDNSRecordTypeA && DNSClass == OFDNSClassIN) { + OFSocketAddress address; if (dataLength != 4) @throw [OFInvalidServerReplyException exception]; memset(&address, 0, sizeof(address)); - address.family = OF_SOCKET_ADDRESS_FAMILY_IPV4; + address.family = OFSocketAddressFamilyIPv4; address.length = sizeof(address.sockaddr.in); address.sockaddr.in.sin_family = AF_INET; memcpy(&address.sockaddr.in.sin_addr.s_addr, buffer + i, 4); return [[[OFADNSResourceRecord alloc] initWithName: name address: &address TTL: TTL] autorelease]; - } else if (recordType == OF_DNS_RECORD_TYPE_NS) { + } else if (recordType == OFDNSRecordTypeNS) { size_t j = i; OFString *authoritativeHost = parseName(buffer, length, &j, - MAX_ALLOWED_POINTERS); + maxAllowedPointers); if (j != i + dataLength) @throw [OFInvalidServerReplyException exception]; return [[[OFNSDNSResourceRecord alloc] initWithName: name DNSClass: DNSClass authoritativeHost: authoritativeHost TTL: TTL] autorelease]; - } else if (recordType == OF_DNS_RECORD_TYPE_CNAME) { + } else if (recordType == OFDNSRecordTypeCNAME) { size_t j = i; OFString *alias = parseName(buffer, length, &j, - MAX_ALLOWED_POINTERS); + maxAllowedPointers); if (j != i + dataLength) @throw [OFInvalidServerReplyException exception]; return [[[OFCNAMEDNSResourceRecord alloc] initWithName: name DNSClass: DNSClass alias: alias TTL: TTL] autorelease]; - } else if (recordType == OF_DNS_RECORD_TYPE_SOA) { + } else if (recordType == OFDNSRecordTypeSOA) { size_t j = i; OFString *primaryNameServer = parseName(buffer, length, &j, - MAX_ALLOWED_POINTERS); + maxAllowedPointers); OFString *responsiblePerson; uint32_t serialNumber, refreshInterval, retryInterval; uint32_t expirationInterval, minTTL; if (j > i + dataLength) @throw [OFInvalidServerReplyException exception]; responsiblePerson = parseName(buffer, length, &j, - MAX_ALLOWED_POINTERS); + maxAllowedPointers); if (dataLength - (j - i) != 20) @throw [OFInvalidServerReplyException exception]; serialNumber = (buffer[j] << 24) | (buffer[j + 1] << 16) | @@ -254,24 +252,24 @@ refreshInterval: refreshInterval retryInterval: retryInterval expirationInterval: expirationInterval minTTL: minTTL TTL: TTL] autorelease]; - } else if (recordType == OF_DNS_RECORD_TYPE_PTR) { + } else if (recordType == OFDNSRecordTypePTR) { size_t j = i; OFString *domainName = parseName(buffer, length, &j, - MAX_ALLOWED_POINTERS); + maxAllowedPointers); if (j != i + dataLength) @throw [OFInvalidServerReplyException exception]; return [[[OFPTRDNSResourceRecord alloc] initWithName: name DNSClass: DNSClass domainName: domainName TTL: TTL] autorelease]; - } else if (recordType == OF_DNS_RECORD_TYPE_HINFO) { + } else if (recordType == OFDNSRecordTypeHINFO) { size_t j = i; OFString *CPU = parseString(buffer, length, &j); OFString *OS; if (j > i + dataLength) @@ -286,11 +284,11 @@ initWithName: name DNSClass: DNSClass CPU: CPU OS: OS TTL: TTL] autorelease]; - } else if (recordType == OF_DNS_RECORD_TYPE_MX) { + } else if (recordType == OFDNSRecordTypeMX) { uint16_t preference; size_t j; OFString *mailExchange; if (dataLength < 2) @@ -298,11 +296,11 @@ preference = (buffer[i] << 8) | buffer[i + 1]; j = i + 2; mailExchange = parseName(buffer, length, &j, - MAX_ALLOWED_POINTERS); + maxAllowedPointers); if (j != i + dataLength) @throw [OFInvalidServerReplyException exception]; return [[[OFMXDNSResourceRecord alloc] @@ -309,11 +307,11 @@ initWithName: name DNSClass: DNSClass preference: preference mailExchange: mailExchange TTL: TTL] autorelease]; - } else if (recordType == OF_DNS_RECORD_TYPE_TXT) { + } else if (recordType == OFDNSRecordTypeTXT) { OFMutableArray *textStrings = [OFMutableArray array]; while (dataLength > 0) { uint_fast8_t stringLength = buffer[i++]; dataLength--; @@ -335,21 +333,21 @@ return [[[OFTXTDNSResourceRecord alloc] initWithName: name DNSClass: DNSClass textStrings: textStrings TTL: TTL] autorelease]; - } else if (recordType == OF_DNS_RECORD_TYPE_RP) { + } else if (recordType == OFDNSRecordTypeRP) { size_t j = i; OFString *mailbox = parseName(buffer, length, &j, - MAX_ALLOWED_POINTERS); + maxAllowedPointers); OFString *TXTDomainName; if (j > i + dataLength) @throw [OFInvalidServerReplyException exception]; TXTDomainName = parseName(buffer, length, &j, - MAX_ALLOWED_POINTERS); + maxAllowedPointers); if (j != i + dataLength) @throw [OFInvalidServerReplyException exception]; return [[[OFRPDNSResourceRecord alloc] @@ -356,19 +354,19 @@ initWithName: name DNSClass: DNSClass mailbox: mailbox TXTDomainName: TXTDomainName TTL: TTL] autorelease]; - } else if (recordType == OF_DNS_RECORD_TYPE_AAAA && - DNSClass == OF_DNS_CLASS_IN) { - of_socket_address_t address; + } else if (recordType == OFDNSRecordTypeAAAA && + DNSClass == OFDNSClassIN) { + OFSocketAddress address; if (dataLength != 16) @throw [OFInvalidServerReplyException exception]; memset(&address, 0, sizeof(address)); - address.family = OF_SOCKET_ADDRESS_FAMILY_IPV6; + address.family = OFSocketAddressFamilyIPv6; address.length = sizeof(address.sockaddr.in6); #ifdef AF_INET6 address.sockaddr.in6.sin6_family = AF_INET6; #else @@ -378,12 +376,12 @@ return [[[OFAAAADNSResourceRecord alloc] initWithName: name address: &address TTL: TTL] autorelease]; - } else if (recordType == OF_DNS_RECORD_TYPE_SRV && - DNSClass == OF_DNS_CLASS_IN) { + } else if (recordType == OFDNSRecordTypeSRV && + DNSClass == OFDNSClassIN) { uint16_t priority, weight, port; size_t j; OFString *target; if (dataLength < 6) @@ -392,11 +390,11 @@ priority = (buffer[i] << 8) | buffer[i + 1]; weight = (buffer[i + 2] << 8) | buffer[i + 3]; port = (buffer[i + 4] << 8) | buffer[i + 5]; j = i + 6; - target = parseName(buffer, length, &j, MAX_ALLOWED_POINTERS); + target = parseName(buffer, length, &j, maxAllowedPointers); if (j != i + dataLength) @throw [OFInvalidServerReplyException exception]; return [[[OFSRVDNSResourceRecord alloc] @@ -422,13 +420,13 @@ OFEnumerator OF_GENERIC(OFMutableArray *) *objectEnumerator; OFMutableArray *array; for (uint_fast16_t j = 0; j < count; j++) { OFString *name = parseName(buffer, length, i, - MAX_ALLOWED_POINTERS); - of_dns_class_t DNSClass; - of_dns_record_type_t recordType; + maxAllowedPointers); + OFDNSClass DNSClass; + OFDNSRecordType recordType; uint32_t TTL; uint16_t dataLength; OFDNSResourceRecord *record; if (*i + 10 > length) @@ -488,17 +486,17 @@ queryData = [OFMutableData dataWithCapacity: 512]; /* Header */ - tmp = OF_BSWAP16_IF_LE(_ID.unsignedShortValue); + tmp = OFToBigEndian16(_ID.unsignedShortValue); [queryData addItems: &tmp count: 2]; /* RD */ - tmp = OF_BSWAP16_IF_LE(1u << 8); + tmp = OFToBigEndian16(1u << 8); [queryData addItems: &tmp count: 2]; /* QDCOUNT */ - tmp = OF_BSWAP16_IF_LE(1); + tmp = OFToBigEndian16(1); [queryData addItems: &tmp count: 2]; /* ANCOUNT, NSCOUNT and ARCOUNT */ [queryData increaseCountBy: 6]; /* Question */ @@ -517,14 +515,14 @@ [queryData addItems: component.UTF8String count: length]; } /* QTYPE */ - tmp = OF_BSWAP16_IF_LE(_query.recordType); + tmp = OFToBigEndian16(_query.recordType); [queryData addItems: &tmp count: 2]; /* QCLASS */ - tmp = OF_BSWAP16_IF_LE(_query.DNSClass); + tmp = OFToBigEndian16(_query.DNSClass); [queryData addItems: &tmp count: 2]; [queryData makeImmutable]; _queryData = [queryData copy]; @@ -544,11 +542,11 @@ [_settings release]; [_delegate release]; [_queryData release]; [_TCPSocket release]; [_TCPQueryData release]; - free(_TCPBuffer); + OFFreeMemory(_TCPBuffer); [_cancelTimer release]; [super dealloc]; } @end @@ -558,11 +556,11 @@ + (void)initialize { if (self != [OFDNSResolver class]) return; - if (!of_socket_init()) + if (!OFSocketInit()) @throw [OFInitializationFailedException exceptionWithClass: self]; } #endif @@ -645,16 +643,16 @@ OFArray *old = _settings->_searchDomains; _settings->_searchDomains = [searchDomains copy]; [old release]; } -- (of_time_interval_t)timeout +- (OFTimeInterval)timeout { return _settings->_timeout; } -- (void)setTimeout: (of_time_interval_t)timeout +- (void)setTimeout: (OFTimeInterval)timeout { _settings->_timeout = timeout; } - (unsigned int)maxAttempts @@ -687,22 +685,22 @@ - (void)setUsesTCP: (bool)usesTCP { _settings->_usesTCP = usesTCP; } -- (of_time_interval_t)configReloadInterval +- (OFTimeInterval)configReloadInterval { return _settings->_configReloadInterval; } -- (void)setConfigReloadInterval: (of_time_interval_t)configReloadInterval +- (void)setConfigReloadInterval: (OFTimeInterval)configReloadInterval { _settings->_configReloadInterval = configReloadInterval; } - (void)of_sendQueryForContext: (OFDNSResolverContext *)context - runLoopMode: (of_run_loop_mode_t)runLoopMode + runLoopMode: (OFRunLoopMode)runLoopMode { OFUDPSocket *sock; OFString *nameServer; [_queries setObject: context forKey: context->_ID]; @@ -723,11 +721,11 @@ nameServer = [context->_settings->_nameServers objectAtIndex: context->_nameServersIndex]; if (context->_settings->_usesTCP) { - OF_ENSURE(context->_TCPSocket == nil); + OFEnsure(context->_TCPSocket == nil); context->_TCPSocket = [[OFTCPSocket alloc] init]; [_TCPQueries setObject: context forKey: context->_TCPSocket]; context->_TCPSocket.delegate = self; @@ -735,18 +733,18 @@ port: 53 runLoopMode: runLoopMode]; return; } - context->_usedNameServer = of_socket_address_parse_ip(nameServer, 53); + context->_usedNameServer = OFSocketAddressParseIP(nameServer, 53); switch (context->_usedNameServer.family) { #ifdef OF_HAVE_IPV6 - case OF_SOCKET_ADDRESS_FAMILY_IPV6: + case OFSocketAddressFamilyIPv6: if (_IPv6Socket == nil) { - of_socket_address_t address = - of_socket_address_parse_ip(@"::", 0); + OFSocketAddress address = + OFSocketAddressParseIPv6(@"::", 0); _IPv6Socket = [[OFUDPSocket alloc] init]; [_IPv6Socket of_bindToAddress: &address extraType: SOCK_DNS]; _IPv6Socket.canBlock = false; @@ -754,14 +752,14 @@ } sock = _IPv6Socket; break; #endif - case OF_SOCKET_ADDRESS_FAMILY_IPV4: + case OFSocketAddressFamilyIPv4: if (_IPv4Socket == nil) { - of_socket_address_t address = - of_socket_address_parse_ip(@"0.0.0.0", 0); + OFSocketAddress address = + OFSocketAddressParseIPv4(@"0.0.0.0", 0); _IPv4Socket = [[OFUDPSocket alloc] init]; [_IPv4Socket of_bindToAddress: &address extraType: SOCK_DNS]; _IPv4Socket.canBlock = false; @@ -776,42 +774,42 @@ [sock asyncSendData: context->_queryData receiver: &context->_usedNameServer runLoopMode: runLoopMode]; [sock asyncReceiveIntoBuffer: _buffer - length: BUFFER_LENGTH + length: bufferLength runLoopMode: runLoopMode]; } - (void)asyncPerformQuery: (OFDNSQuery *)query delegate: (id )delegate { [self asyncPerformQuery: query - runLoopMode: of_run_loop_mode_default + runLoopMode: OFDefaultRunLoopMode delegate: delegate]; } - (void)asyncPerformQuery: (OFDNSQuery *)query - runLoopMode: (of_run_loop_mode_t)runLoopMode + runLoopMode: (OFRunLoopMode)runLoopMode delegate: (id )delegate { void *pool = objc_autoreleasePoolPush(); OFNumber *ID; OFDNSResolverContext *context; /* Random, unused ID */ do { - ID = [OFNumber numberWithUnsignedShort: of_random16()]; + ID = [OFNumber numberWithUnsignedShort: OFRandom16()]; } while ([_queries objectForKey: ID] != nil); if (query.domainName.UTF8StringLength > 253) @throw [OFOutOfRangeException exception]; if (_settings->_nameServers.count == 0) { id exception = [OFDNSQueryFailedException exceptionWithQuery: query - error: OF_DNS_RESOLVER_ERROR_NO_NAME_SERVER]; + errorCode: OFDNSResolverErrorCodeNoNameServer]; [delegate resolver: self didPerformQuery: query response: nil exception: exception]; return; @@ -827,11 +825,11 @@ objc_autoreleasePoolPop(pool); } - (void)of_contextTimedOut: (OFDNSResolverContext *)context { - of_run_loop_mode_t runLoopMode = [OFRunLoop currentRunLoop].currentMode; + OFRunLoopMode runLoopMode = [OFRunLoop currentRunLoop].currentMode; OFDNSQueryFailedException *exception; if (context->_TCPSocket != nil) { context->_TCPSocket.delegate = nil; [context->_TCPSocket cancelAsyncRequests]; @@ -861,29 +859,29 @@ /* * Cancel any pending queries, to avoid a send being still pending and * trying to access the query once it no longer exists. */ [_IPv4Socket cancelAsyncRequests]; - [_IPv4Socket asyncReceiveIntoBuffer: _buffer length: BUFFER_LENGTH]; + [_IPv4Socket asyncReceiveIntoBuffer: _buffer length: bufferLength]; #ifdef OF_HAVE_IPV6 [_IPv6Socket cancelAsyncRequests]; - [_IPv6Socket asyncReceiveIntoBuffer: _buffer length: BUFFER_LENGTH]; + [_IPv6Socket asyncReceiveIntoBuffer: _buffer length: bufferLength]; #endif exception = [OFDNSQueryFailedException exceptionWithQuery: context->_query - error: OF_DNS_RESOLVER_ERROR_TIMEOUT]; + errorCode: OFDNSResolverErrorCodeTimeout]; [context->_delegate resolver: self didPerformQuery: context->_query response: nil exception: exception]; } - (bool)of_handleResponseBuffer: (unsigned char *)buffer length: (size_t)length - sender: (const of_socket_address_t *)sender + sender: (const OFSocketAddress *)sender { OFDictionary *answerRecords = nil, *authorityRecords = nil; OFDictionary *additionalRecords = nil; OFDNSResponse *response = nil; id exception = nil; @@ -901,20 +899,20 @@ return true; if (context->_TCPSocket != nil) { if ([_TCPQueries objectForKey: context->_TCPSocket] != context) return true; - } else if (!of_socket_address_equal(sender, &context->_usedNameServer)) + } else if (!OFSocketAddressEqual(sender, &context->_usedNameServer)) return true; [context->_cancelTimer invalidate]; [context->_cancelTimer release]; context->_cancelTimer = nil; [_queries removeObjectForKey: ID]; @try { - of_dns_resolver_error_t error = 0; + OFDNSResolverErrorCode errorCode = 0; bool tryNextNameServer = false; const unsigned char *queryDataBuffer; size_t i; uint16_t numQuestions, numAnswers, numAuthorityRecords; uint16_t numAdditionalRecords; @@ -936,11 +934,11 @@ if ((buffer[2] & 0x78) != (queryDataBuffer[2] & 0x78)) @throw [OFInvalidServerReplyException exception]; /* TC */ if (buffer[2] & 0x02) { - of_run_loop_mode_t runLoopMode; + OFRunLoopMode runLoopMode; if (context->_settings->_usesTCP) @throw [OFTruncatedDataException exception]; context->_settings->_usesTCP = true; @@ -953,37 +951,37 @@ /* RCODE */ switch (buffer[3] & 0x0F) { case 0: break; case 1: - error = OF_DNS_RESOLVER_ERROR_SERVER_INVALID_FORMAT; + errorCode = OFDNSResolverErrorCodeServerInvalidFormat; break; case 2: - error = OF_DNS_RESOLVER_ERROR_SERVER_FAILURE; + errorCode = OFDNSResolverErrorCodeServerFailure; tryNextNameServer = true; break; case 3: - error = OF_DNS_RESOLVER_ERROR_SERVER_NAME_ERROR; + errorCode = OFDNSResolverErrorCodeServerNameError; break; case 4: - error = OF_DNS_RESOLVER_ERROR_SERVER_NOT_IMPLEMENTED; + errorCode = OFDNSResolverErrorCodeServerNotImplemented; tryNextNameServer = true; break; case 5: - error = OF_DNS_RESOLVER_ERROR_SERVER_REFUSED; + errorCode = OFDNSResolverErrorCodeServerRefused; tryNextNameServer = true; break; default: - error = OF_DNS_RESOLVER_ERROR_UNKNOWN; + errorCode = OFDNSResolverErrorCodeUnknown; tryNextNameServer = true; break; } if (tryNextNameServer) { if (context->_nameServersIndex + 1 < context->_settings->_nameServers.count) { - of_run_loop_mode_t runLoopMode = + OFRunLoopMode runLoopMode = [OFRunLoop currentRunLoop].currentMode; context->_nameServersIndex++; [self of_sendQueryForContext: context @@ -993,11 +991,11 @@ } if (buffer[3] & 0x0F) @throw [OFDNSQueryFailedException exceptionWithQuery: context->_query - error: error]; + errorCode: errorCode]; numQuestions = (buffer[4] << 8) | buffer[5]; numAnswers = (buffer[6] << 8) | buffer[7]; numAuthorityRecords = (buffer[8] << 8) | buffer[9]; numAdditionalRecords = (buffer[10] << 8) | buffer[11]; @@ -1009,11 +1007,11 @@ * query. * * TODO: Compare to our query, just in case? */ for (uint_fast16_t j = 0; j < numQuestions; j++) { - parseName(buffer, length, &i, MAX_ALLOWED_POINTERS); + parseName(buffer, length, &i, maxAllowedPointers); i += 4; } answerRecords = parseSection(buffer, length, &i, numAnswers); authorityRecords = parseSection(buffer, length, &i, @@ -1041,11 +1039,11 @@ } - (bool)socket: (OFDatagramSocket *)sock didReceiveIntoBuffer: (void *)buffer length: (size_t)length - sender: (const of_socket_address_t *)sender + sender: (const OFSocketAddress *)sender exception: (id)exception { if (exception != nil) return true; @@ -1059,11 +1057,11 @@ port: (uint16_t)port exception: (id)exception { OFDNSResolverContext *context = [_TCPQueries objectForKey: sock]; - OF_ENSURE(context != nil); + OFEnsure(context != nil); if (exception != nil) { /* * TODO: Handle error immediately instead of waiting for the * timer to try the next nameserver or to retry. @@ -1083,11 +1081,11 @@ @throw [OFOutOfRangeException exception]; context->_TCPQueryData = [[OFMutableData alloc] initWithCapacity: queryDataCount + 2]; - tmp = OF_BSWAP16_IF_LE(queryDataCount); + tmp = OFToBigEndian16(queryDataCount); [context->_TCPQueryData addItems: &tmp count: sizeof(tmp)]; [context->_TCPQueryData addItems: context->_queryData.items count: queryDataCount]; } @@ -1100,11 +1098,11 @@ exception: (id)exception { OFTCPSocket *sock = (OFTCPSocket *)stream; OFDNSResolverContext *context = [_TCPQueries objectForKey: sock]; - OF_ENSURE(context != nil); + OFEnsure(context != nil); if (exception != nil) { /* * TODO: Handle error immediately instead of waiting for the * timer to try the next nameserver or to retry. @@ -1115,11 +1113,11 @@ context->_responseLength = 0; return nil; } if (context->_TCPBuffer == nil) - context->_TCPBuffer = of_alloc(MAX_DNS_RESPONSE_LENGTH, 1); + context->_TCPBuffer = OFAllocMemory(maxDNSResponseLength, 1); [sock asyncReadIntoBuffer: context->_TCPBuffer exactLength: 2]; return nil; } @@ -1129,11 +1127,11 @@ exception: (id)exception { OFTCPSocket *sock = (OFTCPSocket *)stream; OFDNSResolverContext *context = [_TCPQueries objectForKey: sock]; - OF_ENSURE(context != nil); + OFEnsure(context != nil); if (exception != nil) { /* * TODO: Handle error immediately instead of waiting for the * timer to try the next nameserver or to retry. @@ -1142,15 +1140,15 @@ } if (context->_responseLength == 0) { unsigned char *ucBuffer = buffer; - OF_ENSURE(length == 2); + OFEnsure(length == 2); context->_responseLength = (ucBuffer[0] << 8) | ucBuffer[1]; - if (context->_responseLength > MAX_DNS_RESPONSE_LENGTH) + if (context->_responseLength > maxDNSResponseLength) @throw [OFOutOfRangeException exception]; if (context->_responseLength == 0) goto done; @@ -1179,28 +1177,28 @@ - (void)asyncResolveAddressesForHost: (OFString *)host delegate: (id )delegate { [self asyncResolveAddressesForHost: host - addressFamily: OF_SOCKET_ADDRESS_FAMILY_ANY - runLoopMode: of_run_loop_mode_default + addressFamily: OFSocketAddressFamilyAny + runLoopMode: OFDefaultRunLoopMode delegate: delegate]; } - (void)asyncResolveAddressesForHost: (OFString *)host - addressFamily: (of_socket_address_family_t)addressFamily + addressFamily: (OFSocketAddressFamily)addressFamily delegate: (id )delegate { [self asyncResolveAddressesForHost: host addressFamily: addressFamily - runLoopMode: of_run_loop_mode_default + runLoopMode: OFDefaultRunLoopMode delegate: delegate]; } - (void)asyncResolveAddressesForHost: (OFString *)host - addressFamily: (of_socket_address_family_t)addressFamily - runLoopMode: (of_run_loop_mode_t)runLoopMode + addressFamily: (OFSocketAddressFamily)addressFamily + runLoopMode: (OFRunLoopMode)runLoopMode delegate: (id )delegate { void *pool = objc_autoreleasePoolPush(); OFHostAddressResolver *resolver = [[[OFHostAddressResolver alloc] initWithHost: host @@ -1214,11 +1212,11 @@ objc_autoreleasePoolPop(pool); } - (OFData *)resolveAddressesForHost: (OFString *)host - addressFamily: (of_socket_address_family_t)addressFamily + addressFamily: (OFSocketAddressFamily)addressFamily { void *pool = objc_autoreleasePoolPush(); OFHostAddressResolver *resolver = [[[OFHostAddressResolver alloc] initWithHost: host addressFamily: addressFamily @@ -1255,11 +1253,11 @@ while ((context = [enumerator nextObject]) != nil) { OFDNSQueryFailedException *exception; exception = [OFDNSQueryFailedException exceptionWithQuery: context->_query - error: OF_DNS_RESOLVER_ERROR_CANCELED]; + errorCode: OFDNSResolverErrorCodeCanceled]; [context->_delegate resolver: self didPerformQuery: context->_query response: nil exception: exception]; Index: src/OFDNSResolverSettings.h ================================================================== --- src/OFDNSResolverSettings.h +++ src/OFDNSResolverSettings.h @@ -27,17 +27,17 @@ OFDictionary OF_GENERIC(OFString *, OFArray OF_GENERIC(OFString *) *) *_staticHosts; OFArray OF_GENERIC(OFString *) *_nameServers; OFString *_Nullable _localDomain; OFArray OF_GENERIC(OFString *) *_searchDomains; - of_time_interval_t _timeout; + OFTimeInterval _timeout; unsigned int _maxAttempts, _minNumberOfDotsInAbsoluteName; bool _usesTCP; - of_time_interval_t _configReloadInterval; + OFTimeInterval _configReloadInterval; @protected OFDate *_lastConfigReload; } - (void)reload; @end OF_ASSUME_NONNULL_END Index: src/OFDNSResolverSettings.m ================================================================== --- src/OFDNSResolverSettings.m +++ src/OFDNSResolverSettings.m @@ -22,10 +22,11 @@ #import "OFCharacterSet.h" #import "OFDate.h" #import "OFDictionary.h" #import "OFFile.h" #import "OFLocale.h" +#import "OFSocket+Private.h" #import "OFString.h" #ifdef OF_WINDOWS # import "OFWindowsRegistryKey.h" #endif @@ -51,12 +52,10 @@ # include # include # include #endif -#import "socket_helpers.h" - #if defined(OF_HAIKU) # define HOSTS_PATH @"/system/settings/network/hosts" # define RESOLV_CONF_PATH @"/system/settings/network/resolv.conf" #elif defined(OF_AMIGAOS4) # define HOSTS_PATH @"DEVS:Internet/hosts" @@ -74,11 +73,11 @@ { if (hostname == nil) return nil; @try { - of_socket_address_parse_ip(hostname, 0); + OFSocketAddressParseIP(hostname, 0); /* * If we are still here, the host name is a valid IP address. * We can't use that as local domain. */ @@ -85,11 +84,11 @@ return nil; } @catch (OFInvalidFormatException *e) { /* Not an IP address -> we can use it if it contains a dot. */ size_t pos = [hostname rangeOfString: @"."].location; - if (pos == OF_NOT_FOUND) + if (pos == OFNotFound) return nil; return [hostname substringFromIndex: pos + 1]; } } @@ -173,11 +172,11 @@ parseNetStackArray(OFString *string) { if (![string hasPrefix: @"["] || ![string hasSuffix: @"]"]) return nil; - string = [string substringWithRange: of_range(1, string.length - 2)]; + string = [string substringWithRange: OFRangeMake(1, string.length - 2)]; return [string componentsSeparatedByString: @"|"]; } #endif @@ -265,23 +264,23 @@ OFArray *components, *hosts; size_t pos; OFString *address; pos = [line rangeOfString: @"#"].location; - if (pos != OF_NOT_FOUND) + if (pos != OFNotFound) line = [line substringToIndex: pos]; components = [line componentsSeparatedByCharactersInSet: whitespaceCharacterSet - options: OF_STRING_SKIP_EMPTY]; + options: OFStringSkipEmptyComponents]; if (components.count < 2) continue; address = components.firstObject; hosts = [components objectsInRange: - of_range(1, components.count - 1)]; + OFRangeMake(1, components.count - 1)]; for (OFString *host in hosts) { OFMutableArray *addresses = [staticHosts objectForKey: host]; @@ -366,25 +365,25 @@ size_t pos; OFArray *components, *arguments; OFString *option; pos = [line indexOfCharacterFromSet: commentCharacters]; - if (pos != OF_NOT_FOUND) + if (pos != OFNotFound) line = [line substringToIndex: pos]; components = [line componentsSeparatedByCharactersInSet: whitespaceCharacterSet - options: OF_STRING_SKIP_EMPTY]; + options: OFStringSkipEmptyComponents]; if (components.count < 2) { objc_autoreleasePoolPop(pool2); continue; } option = components.firstObject; arguments = [components objectsInRange: - of_range(1, components.count - 1)]; + OFRangeMake(1, components.count - 1)]; if ([option isEqual: @"nameserver"]) { if (arguments.count != 1) { objc_autoreleasePoolPop(pool2); continue; @@ -420,11 +419,11 @@ #endif #ifdef OF_WINDOWS - (void)obtainWindowsSystemConfig { - of_string_encoding_t encoding = [OFLocale encoding]; + OFStringEncoding encoding = [OFLocale encoding]; OFMutableArray *nameServers; /* * We need more space than FIXED_INFO in case we have more than one * name server, but we also want it to be properly aligned, meaning we * can't just get a buffer of bytes. Thus, we just get space for 8. @@ -479,11 +478,11 @@ if (components.count < 2) continue; address = components.firstObject; hosts = [components objectsInRange: - of_range(1, components.count - 1)]; + OFRangeMake(1, components.count - 1)]; for (OFString *host in hosts) { OFMutableArray *addresses = [staticHosts objectForKey: host]; @@ -507,11 +506,11 @@ #ifdef OF_AMIGAOS4 - (void)obtainAmigaOS4SystemConfig { OFMutableArray *nameServers = [OFMutableArray array]; - of_string_encoding_t encoding = [OFLocale encoding]; + OFStringEncoding encoding = [OFLocale encoding]; struct List *nameServerList = ObtainDomainNameServerList(); char buffer[MAXHOSTNAMELEN]; if (nameServerList == NULL) @throw [OFOutOfMemoryException exception]; @@ -572,11 +571,11 @@ */ if (optLen < sizeof(buffer.entries)) return; for (uint_fast8_t i = 0; i < 2; i++) { - uint32_t ip = OF_BSWAP32_IF_LE(buffer.entries[i].ip.s_addr); + uint32_t ip = OFFromBigEndian32(buffer.entries[i].ip.s_addr); if (ip == 0) continue; [nameServers addObject: [OFString stringWithFormat: Index: src/OFDNSResourceRecord.h ================================================================== --- src/OFDNSResourceRecord.h +++ src/OFDNSResourceRecord.h @@ -12,14 +12,13 @@ * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #import "OFObject.h" +#import "OFSocket.h" #import "OFString.h" -#import "socket.h" - OF_ASSUME_NONNULL_BEGIN /** @file */ @class OFArray OF_GENERIC(ObjectType); @@ -28,55 +27,55 @@ /** * @brief The DNS class. */ typedef enum { /** IN */ - OF_DNS_CLASS_IN = 1, + OFDNSClassIN = 1, /** Any class. Only for queries. */ - OF_DNS_CLASS_ANY = 255, -} of_dns_class_t; + OFDNSClassAny = 255, +} OFDNSClass; /** * @brief The type of a DNS resource record. */ typedef enum { /** A */ - OF_DNS_RECORD_TYPE_A = 1, + OFDNSRecordTypeA = 1, /** NS */ - OF_DNS_RECORD_TYPE_NS = 2, + OFDNSRecordTypeNS = 2, /** CNAME */ - OF_DNS_RECORD_TYPE_CNAME = 5, + OFDNSRecordTypeCNAME = 5, /** SOA */ - OF_DNS_RECORD_TYPE_SOA = 6, + OFDNSRecordTypeSOA = 6, /** PTR */ - OF_DNS_RECORD_TYPE_PTR = 12, + OFDNSRecordTypePTR = 12, /** HINFO */ - OF_DNS_RECORD_TYPE_HINFO = 13, + OFDNSRecordTypeHINFO = 13, /** MX */ - OF_DNS_RECORD_TYPE_MX = 15, + OFDNSRecordTypeMX = 15, /** TXT */ - OF_DNS_RECORD_TYPE_TXT = 16, + OFDNSRecordTypeTXT = 16, /** RP */ - OF_DNS_RECORD_TYPE_RP = 17, + OFDNSRecordTypeRP = 17, /** AAAA */ - OF_DNS_RECORD_TYPE_AAAA = 28, + OFDNSRecordTypeAAAA = 28, /** SRV */ - OF_DNS_RECORD_TYPE_SRV = 33, + OFDNSRecordTypeSRV = 33, /** All types. Only for queries. */ - OF_DNS_RECORD_TYPE_ALL = 255, -} of_dns_record_type_t; + OFDNSRecordTypeAll = 255, +} OFDNSRecordType; /** * @class OFDNSResourceRecord OFDNSResourceRecord.h ObjFW/OFDNSResourceRecord.h * * @brief A class representing a DNS resource record. */ @interface OFDNSResourceRecord: OFObject { OFString *_name; - of_dns_class_t _DNSClass; - of_dns_record_type_t _recordType; + OFDNSClass _DNSClass; + OFDNSRecordType _recordType; uint32_t _TTL; OF_RESERVE_IVARS(OFDNSResourceRecord, 4) } /** @@ -85,16 +84,16 @@ @property (readonly, nonatomic) OFString *name; /** * @brief The DNS class. */ -@property (readonly, nonatomic) of_dns_class_t DNSClass; +@property (readonly, nonatomic) OFDNSClass DNSClass; /** * @brief The resource record type code. */ -@property (readonly, nonatomic) of_dns_record_type_t recordType; +@property (readonly, nonatomic) OFDNSRecordType recordType; /** * @brief The number of seconds after which the resource record should be * discarded from the cache. */ @@ -109,12 +108,12 @@ * @param recordType The type code for the resource record * @param TTL The time to live for the resource record * @return An initialized OFDNSResourceRecord */ - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass - recordType: (of_dns_record_type_t)recordType + DNSClass: (OFDNSClass)DNSClass + recordType: (OFDNSRecordType)recordType TTL: (uint32_t)TTL OF_DESIGNATED_INITIALIZER; @end /** * @class OFADNSResourceRecord OFDNSResourceRecord.h ObjFW/OFDNSResourceRecord.h @@ -122,21 +121,21 @@ * @brief A class representing an A DNS resource record. */ OF_SUBCLASSING_RESTRICTED @interface OFADNSResourceRecord: OFDNSResourceRecord { - of_socket_address_t _address; + OFSocketAddress _address; } /** * @brief The IPv4 address of the resource record. */ -@property (readonly, nonatomic) const of_socket_address_t *address; +@property (readonly, nonatomic) const OFSocketAddress *address; - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass - recordType: (of_dns_record_type_t)recordType + DNSClass: (OFDNSClass)DNSClass + recordType: (OFDNSRecordType)recordType TTL: (uint32_t)TTL OF_UNAVAILABLE; /** * @brief Initializes an already allocated OFADNSResourceRecord with the * specified name, class, address and time to live. @@ -145,11 +144,11 @@ * @param address The address for the resource record * @param TTL The time to live for the resource record * @return An initialized OFADNSResourceRecord */ - (instancetype)initWithName: (OFString *)name - address: (const of_socket_address_t *)address + address: (const OFSocketAddress *)address TTL: (uint32_t)TTL OF_DESIGNATED_INITIALIZER; @end /** * @class OFAAAADNSResourceRecord \ @@ -158,21 +157,21 @@ * @brief A class represenging a DNS resource record. */ OF_SUBCLASSING_RESTRICTED @interface OFAAAADNSResourceRecord: OFDNSResourceRecord { - of_socket_address_t _address; + OFSocketAddress _address; } /** * @brief The IPv6 address of the resource record. */ -@property (readonly, nonatomic) const of_socket_address_t *address; +@property (readonly, nonatomic) const OFSocketAddress *address; - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass - recordType: (of_dns_record_type_t)recordType + DNSClass: (OFDNSClass)DNSClass + recordType: (OFDNSRecordType)recordType TTL: (uint32_t)TTL OF_UNAVAILABLE; /** * @brief Initializes an already allocated OFAAAADNSResourceRecord with the * specified name, class, address and time to live. @@ -181,11 +180,11 @@ * @param address The address for the resource record * @param TTL The time to live for the resource record * @return An initialized OFAAAADNSResourceRecord */ - (instancetype)initWithName: (OFString *)name - address: (const of_socket_address_t *)address + address: (const OFSocketAddress *)address TTL: (uint32_t)TTL OF_DESIGNATED_INITIALIZER; @end /** * @class OFCNAMEDNSResourceRecord \ @@ -203,12 +202,12 @@ * @brief The alias of the resource record. */ @property (readonly, nonatomic) OFString *alias; - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass - recordType: (of_dns_record_type_t)recordType + DNSClass: (OFDNSClass)DNSClass + recordType: (OFDNSRecordType)recordType TTL: (uint32_t)TTL OF_UNAVAILABLE; /** * @brief Initializes an already allocated OFCNAMEDNSResourceRecord with the * specified name, class, alias and time to live. @@ -218,11 +217,11 @@ * @param alias The alias for the resource record * @param TTL The time to live for the resource record * @return An initialized OFCNAMEDNSResourceRecord */ - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass + DNSClass: (OFDNSClass)DNSClass alias: (OFString *)alias TTL: (uint32_t)TTL OF_DESIGNATED_INITIALIZER; @end /** @@ -246,12 +245,12 @@ * @brief The OS of the host info of the resource record. */ @property (readonly, nonatomic) OFString *OS; - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass - recordType: (of_dns_record_type_t)recordType + DNSClass: (OFDNSClass)DNSClass + recordType: (OFDNSRecordType)recordType TTL: (uint32_t)TTL OF_UNAVAILABLE; /** * @brief Initializes an already allocated OFHINFODNSResourceRecord with the * specified name, class, domain name and time to live. @@ -262,11 +261,11 @@ * @param OS The OS of the host info for the resource record * @param TTL The time to live for the resource record * @return An initialized OFHINFODNSResourceRecord */ - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass + DNSClass: (OFDNSClass)DNSClass CPU: (OFString *)CPU OS: (OFString *)OS TTL: (uint32_t)TTL OF_DESIGNATED_INITIALIZER; @end @@ -292,12 +291,12 @@ * @brief The mail exchange of the resource record. */ @property (readonly, nonatomic) OFString *mailExchange; - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass - recordType: (of_dns_record_type_t)recordType + DNSClass: (OFDNSClass)DNSClass + recordType: (OFDNSRecordType)recordType TTL: (uint32_t)TTL OF_UNAVAILABLE; /** * @brief Initializes an already allocated OFMXDNSResourceRecord with the * specified name, class, preference, mail exchange and time to live. @@ -308,11 +307,11 @@ * @param mailExchange The mail exchange for the resource record * @param TTL The time to live for the resource record * @return An initialized OFMXDNSResourceRecord */ - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass + DNSClass: (OFDNSClass)DNSClass preference: (uint16_t)preference mailExchange: (OFString *)mailExchange TTL: (uint32_t)TTL OF_DESIGNATED_INITIALIZER; @end @@ -332,12 +331,12 @@ * @brief The authoritative host of the resource record. */ @property (readonly, nonatomic) OFString *authoritativeHost; - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass - recordType: (of_dns_record_type_t)recordType + DNSClass: (OFDNSClass)DNSClass + recordType: (OFDNSRecordType)recordType TTL: (uint32_t)TTL OF_UNAVAILABLE; /** * @brief Initializes an already allocated OFNSDNSResourceRecord with the * specified name, class, authoritative host and time to live. @@ -347,11 +346,11 @@ * @param authoritativeHost The authoritative host for the resource record * @param TTL The time to live for the resource record * @return An initialized OFNSDNSResourceRecord */ - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass + DNSClass: (OFDNSClass)DNSClass authoritativeHost: (OFString *)authoritativeHost TTL: (uint32_t)TTL OF_DESIGNATED_INITIALIZER; @end /** @@ -370,12 +369,12 @@ * @brief The domain name of the resource record. */ @property (readonly, nonatomic) OFString *domainName; - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass - recordType: (of_dns_record_type_t)recordType + DNSClass: (OFDNSClass)DNSClass + recordType: (OFDNSRecordType)recordType TTL: (uint32_t)TTL OF_UNAVAILABLE; /** * @brief Initializes an already allocated OFPTRDNSResourceRecord with the * specified name, class, domain name and time to live. @@ -385,11 +384,11 @@ * @param domainName The domain name for the resource record * @param TTL The time to live for the resource record * @return An initialized OFPTRDNSResourceRecord */ - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass + DNSClass: (OFDNSClass)DNSClass domainName: (OFString *)domainName TTL: (uint32_t)TTL OF_DESIGNATED_INITIALIZER; @end /** @@ -414,12 +413,12 @@ * person of the resource record. */ @property (readonly, nonatomic) OFString *TXTDomainName; - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass - recordType: (of_dns_record_type_t)recordType + DNSClass: (OFDNSClass)DNSClass + recordType: (OFDNSRecordType)recordType TTL: (uint32_t)TTL OF_UNAVAILABLE; /** * @brief Initializes an already allocated OFRPDNSResourceRecord with the * specified name, class, alias and time to live. @@ -431,11 +430,11 @@ * the responsible person of the resource record * @param TTL The time to live for the resource record * @return An initialized OFRPDNSResourceRecord */ - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass + DNSClass: (OFDNSClass)DNSClass mailbox: (OFString *)mailbox TXTDomainName: (OFString *)TXTDomainName TTL: (uint32_t)TTL OF_DESIGNATED_INITIALIZER; @end @@ -487,12 +486,12 @@ * @brief The minimum TTL of the zone. */ @property (readonly, nonatomic) uint32_t minTTL; - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass - recordType: (of_dns_record_type_t)recordType + DNSClass: (OFDNSClass)DNSClass + recordType: (OFDNSRecordType)recordType TTL: (uint32_t)TTL OF_UNAVAILABLE; /** * @brief Initializes an already allocated OFSOADNSResourceRecord with the * specified name, class, text data and time to live. @@ -508,11 +507,11 @@ * @param minTTL The minimum TTL of the zone * @param TTL The time to live for the resource record * @return An initialized OFSOADNSResourceRecord */ - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass + DNSClass: (OFDNSClass)DNSClass primaryNameServer: (OFString *)primaryNameServer responsiblePerson: (OFString *)responsiblePerson serialNumber: (uint32_t)serialNumber refreshInterval: (uint32_t)refreshInterval retryInterval: (uint32_t)retryInterval @@ -554,12 +553,12 @@ * @brief The port on the target of the resource record. */ @property (readonly, nonatomic) uint16_t port; - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass - recordType: (of_dns_record_type_t)recordType + DNSClass: (OFDNSClass)DNSClass + recordType: (OFDNSRecordType)recordType TTL: (uint32_t)TTL OF_UNAVAILABLE; /** * @brief Initializes an already allocated OFSRVDNSResourceRecord with the * specified name, class, preference, mail exchange and time to live. @@ -596,12 +595,12 @@ * @brief The text of the resource record. */ @property (readonly, nonatomic) OFArray OF_GENERIC(OFData *) *textStrings; - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass - recordType: (of_dns_record_type_t)recordType + DNSClass: (OFDNSClass)DNSClass + recordType: (OFDNSRecordType)recordType TTL: (uint32_t)TTL OF_UNAVAILABLE; /** * @brief Initializes an already allocated OFTXTDNSResourceRecord with the * specified name, class, text data and time to live. @@ -611,23 +610,22 @@ * @param textStrings An array of text strings for the resource record * @param TTL The time to live for the resource record * @return An initialized OFTXTDNSResourceRecord */ - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass + DNSClass: (OFDNSClass)DNSClass textStrings: (OFArray OF_GENERIC(OFData *) *)textStrings TTL: (uint32_t)TTL OF_DESIGNATED_INITIALIZER; @end #ifdef __cplusplus extern "C" { #endif -extern OFString *_Nonnull of_dns_class_to_string(of_dns_class_t DNSClass); -extern OFString *_Nonnull of_dns_record_type_to_string( - of_dns_record_type_t recordType); -extern of_dns_class_t of_dns_class_parse(OFString *_Nonnull string); -extern of_dns_record_type_t of_dns_record_type_parse(OFString *_Nonnull string); +extern OFString *_Nonnull OFDNSClassName(OFDNSClass DNSClass); +extern OFString *_Nonnull OFDNSRecordTypeName(OFDNSRecordType recordType); +extern OFDNSClass OFDNSClassParseName(OFString *_Nonnull string); +extern OFDNSRecordType OFDNSRecordTypeParseName(OFString *_Nonnull string); #ifdef __cplusplus } #endif OF_ASSUME_NONNULL_END Index: src/OFDNSResourceRecord.m ================================================================== --- src/OFDNSResourceRecord.m +++ src/OFDNSResourceRecord.m @@ -21,67 +21,68 @@ #import "OFInvalidArgumentException.h" #import "OFInvalidFormatException.h" OFString * -of_dns_class_to_string(of_dns_class_t DNSClass) +OFDNSClassName(OFDNSClass DNSClass) { switch (DNSClass) { - case OF_DNS_CLASS_IN: + case OFDNSClassIN: return @"IN"; - case OF_DNS_CLASS_ANY: + case OFDNSClassAny: return @"any"; default: return [OFString stringWithFormat: @"%u", DNSClass]; } } OFString * -of_dns_record_type_to_string(of_dns_record_type_t recordType) +OFDNSRecordTypeName(OFDNSRecordType recordType) { switch (recordType) { - case OF_DNS_RECORD_TYPE_A: + case OFDNSRecordTypeA: return @"A"; - case OF_DNS_RECORD_TYPE_NS: + case OFDNSRecordTypeNS: return @"NS"; - case OF_DNS_RECORD_TYPE_CNAME: + case OFDNSRecordTypeCNAME: return @"CNAME"; - case OF_DNS_RECORD_TYPE_SOA: + case OFDNSRecordTypeSOA: return @"SOA"; - case OF_DNS_RECORD_TYPE_PTR: + case OFDNSRecordTypePTR: return @"PTR"; - case OF_DNS_RECORD_TYPE_HINFO: + case OFDNSRecordTypeHINFO: return @"HINFO"; - case OF_DNS_RECORD_TYPE_MX: + case OFDNSRecordTypeMX: return @"MX"; - case OF_DNS_RECORD_TYPE_TXT: + case OFDNSRecordTypeTXT: return @"TXT"; - case OF_DNS_RECORD_TYPE_RP: + case OFDNSRecordTypeRP: return @"RP"; - case OF_DNS_RECORD_TYPE_AAAA: + case OFDNSRecordTypeAAAA: return @"AAAA"; - case OF_DNS_RECORD_TYPE_SRV: + case OFDNSRecordTypeSRV: return @"SRV"; - case OF_DNS_RECORD_TYPE_ALL: + case OFDNSRecordTypeAll: return @"all"; default: return [OFString stringWithFormat: @"%u", recordType]; } } -of_dns_class_t of_dns_class_parse(OFString *string) +OFDNSClass +OFDNSClassParseName(OFString *string) { void *pool = objc_autoreleasePoolPush(); - of_dns_class_t DNSClass; + OFDNSClass DNSClass; string = string.uppercaseString; if ([string isEqual: @"IN"]) - DNSClass = OF_DNS_CLASS_IN; + DNSClass = OFDNSClassIN; else { @try { - DNSClass = (of_dns_class_t) + DNSClass = (OFDNSClass) [string unsignedLongLongValueWithBase: 0]; } @catch (OFInvalidFormatException *e) { @throw [OFInvalidArgumentException exception]; } } @@ -89,44 +90,45 @@ objc_autoreleasePoolPop(pool); return DNSClass; } -of_dns_record_type_t of_dns_record_type_parse(OFString *string) +OFDNSRecordType +OFDNSRecordTypeParseName(OFString *string) { void *pool = objc_autoreleasePoolPush(); - of_dns_record_type_t recordType; + OFDNSRecordType recordType; string = string.uppercaseString; if ([string isEqual: @"A"]) - recordType = OF_DNS_RECORD_TYPE_A; + recordType = OFDNSRecordTypeA; else if ([string isEqual: @"NS"]) - recordType = OF_DNS_RECORD_TYPE_NS; + recordType = OFDNSRecordTypeNS; else if ([string isEqual: @"CNAME"]) - recordType = OF_DNS_RECORD_TYPE_CNAME; + recordType = OFDNSRecordTypeCNAME; else if ([string isEqual: @"SOA"]) - recordType = OF_DNS_RECORD_TYPE_SOA; + recordType = OFDNSRecordTypeSOA; else if ([string isEqual: @"PTR"]) - recordType = OF_DNS_RECORD_TYPE_PTR; + recordType = OFDNSRecordTypePTR; else if ([string isEqual: @"HINFO"]) - recordType = OF_DNS_RECORD_TYPE_HINFO; + recordType = OFDNSRecordTypeHINFO; else if ([string isEqual: @"MX"]) - recordType = OF_DNS_RECORD_TYPE_MX; + recordType = OFDNSRecordTypeMX; else if ([string isEqual: @"TXT"]) - recordType = OF_DNS_RECORD_TYPE_TXT; + recordType = OFDNSRecordTypeTXT; else if ([string isEqual: @"RP"]) - recordType = OF_DNS_RECORD_TYPE_RP; + recordType = OFDNSRecordTypeRP; else if ([string isEqual: @"AAAA"]) - recordType = OF_DNS_RECORD_TYPE_AAAA; + recordType = OFDNSRecordTypeAAAA; else if ([string isEqual: @"SRV"]) - recordType = OF_DNS_RECORD_TYPE_SRV; + recordType = OFDNSRecordTypeSRV; else if ([string isEqual: @"ALL"]) - recordType = OF_DNS_RECORD_TYPE_ALL; + recordType = OFDNSRecordTypeAll; else { @try { - recordType = (of_dns_record_type_t) + recordType = (OFDNSRecordType) [string unsignedLongLongValueWithBase: 0]; } @catch (OFInvalidFormatException *e) { @throw [OFInvalidArgumentException exception]; } } @@ -139,12 +141,12 @@ @implementation OFDNSResourceRecord @synthesize name = _name, DNSClass = _DNSClass, recordType = _recordType; @synthesize TTL = _TTL; - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass - recordType: (of_dns_record_type_t)recordType + DNSClass: (OFDNSClass)DNSClass + recordType: (OFDNSRecordType)recordType TTL: (uint32_t)TTL { self = [super init]; @try { @@ -179,39 +181,39 @@ @"\tName = %@\n" @"\tClass = %@\n" @"\tType = %@\n" @"\tTTL = %" PRIu32 "\n" @">", - self.className, _name, of_dns_class_to_string(_DNSClass), - of_dns_record_type_to_string(_recordType), _TTL]; + self.className, _name, OFDNSClassName(_DNSClass), + OFDNSRecordTypeName(_recordType), _TTL]; } @end @implementation OFADNSResourceRecord - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass - recordType: (of_dns_record_type_t)recordType + DNSClass: (OFDNSClass)DNSClass + recordType: (OFDNSRecordType)recordType TTL: (uint32_t)TTL { OF_INVALID_INIT_METHOD } - (instancetype)initWithName: (OFString *)name - address: (const of_socket_address_t *)address + address: (const OFSocketAddress *)address TTL: (uint32_t)TTL { self = [super initWithName: name - DNSClass: OF_DNS_CLASS_IN - recordType: OF_DNS_RECORD_TYPE_A + DNSClass: OFDNSClassIN + recordType: OFDNSRecordTypeA TTL: TTL]; _address = *address; return self; } -- (const of_socket_address_t *)address +- (const OFSocketAddress *)address { return &_address; } - (bool)isEqual: (id)object @@ -233,30 +235,30 @@ return false; if (record->_recordType != _recordType) return false; - if (!of_socket_address_equal(&record->_address, &_address)) + if (!OFSocketAddressEqual(&record->_address, &_address)) return false; return true; } - (unsigned long)hash { - uint32_t hash; - - OF_HASH_INIT(hash); - - OF_HASH_ADD_HASH(hash, _name.hash); - OF_HASH_ADD(hash, _DNSClass >> 8); - OF_HASH_ADD(hash, _DNSClass); - OF_HASH_ADD(hash, _recordType >> 8); - OF_HASH_ADD(hash, _recordType); - OF_HASH_ADD_HASH(hash, of_socket_address_hash(&_address)); - - OF_HASH_FINALIZE(hash); + unsigned long hash; + + OFHashInit(&hash); + + OFHashAddHash(&hash, _name.hash); + OFHashAdd(&hash, _DNSClass >> 8); + OFHashAdd(&hash, _DNSClass); + OFHashAdd(&hash, _recordType >> 8); + OFHashAdd(&hash, _recordType); + OFHashAddHash(&hash, OFSocketAddressHash(&_address)); + + OFHashFinalize(&hash); return hash; } - (OFString *)description @@ -265,39 +267,38 @@ @"<%@:\n" @"\tName = %@\n" @"\tAddress = %@\n" @"\tTTL = %" PRIu32 "\n" @">", - self.className, _name, - of_socket_address_ip_string(&_address, NULL), _TTL]; + self.className, _name, OFSocketAddressString(&_address), _TTL]; } @end @implementation OFAAAADNSResourceRecord - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass - recordType: (of_dns_record_type_t)recordType + DNSClass: (OFDNSClass)DNSClass + recordType: (OFDNSRecordType)recordType TTL: (uint32_t)TTL { OF_INVALID_INIT_METHOD } - (instancetype)initWithName: (OFString *)name - address: (const of_socket_address_t *)address + address: (const OFSocketAddress *)address TTL: (uint32_t)TTL { self = [super initWithName: name - DNSClass: OF_DNS_CLASS_IN - recordType: OF_DNS_RECORD_TYPE_AAAA + DNSClass: OFDNSClassIN + recordType: OFDNSRecordTypeAAAA TTL: TTL]; _address = *address; return self; } -- (const of_socket_address_t *)address +- (const OFSocketAddress *)address { return &_address; } - (bool)isEqual: (id)object @@ -319,30 +320,30 @@ return false; if (record->_recordType != _recordType) return false; - if (!of_socket_address_equal(&record->_address, &_address)) + if (!OFSocketAddressEqual(&record->_address, &_address)) return false; return true; } - (unsigned long)hash { - uint32_t hash; - - OF_HASH_INIT(hash); - - OF_HASH_ADD_HASH(hash, _name.hash); - OF_HASH_ADD(hash, _DNSClass >> 8); - OF_HASH_ADD(hash, _DNSClass); - OF_HASH_ADD(hash, _recordType >> 8); - OF_HASH_ADD(hash, _recordType); - OF_HASH_ADD_HASH(hash, of_socket_address_hash(&_address)); - - OF_HASH_FINALIZE(hash); + unsigned long hash; + + OFHashInit(&hash); + + OFHashAddHash(&hash, _name.hash); + OFHashAdd(&hash, _DNSClass >> 8); + OFHashAdd(&hash, _DNSClass); + OFHashAdd(&hash, _recordType >> 8); + OFHashAdd(&hash, _recordType); + OFHashAddHash(&hash, OFSocketAddressHash(&_address)); + + OFHashFinalize(&hash); return hash; } - (OFString *)description @@ -351,34 +352,33 @@ @"<%@:\n" @"\tName = %@\n" @"\tAddress = %@\n" @"\tTTL = %" PRIu32 "\n" @">", - self.className, _name, - of_socket_address_ip_string(&_address, NULL), _TTL]; + self.className, _name, OFSocketAddressString(&_address), _TTL]; } @end @implementation OFCNAMEDNSResourceRecord @synthesize alias = _alias; - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass - recordType: (of_dns_record_type_t)recordType + DNSClass: (OFDNSClass)DNSClass + recordType: (OFDNSRecordType)recordType TTL: (uint32_t)TTL { OF_INVALID_INIT_METHOD } - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass + DNSClass: (OFDNSClass)DNSClass alias: (OFString *)alias TTL: (uint32_t)TTL { self = [super initWithName: name DNSClass: DNSClass - recordType: OF_DNS_RECORD_TYPE_CNAME + recordType: OFDNSRecordTypeCNAME TTL: TTL]; @try { _alias = [alias copy]; } @catch (id e) { @@ -423,22 +423,22 @@ return true; } - (unsigned long)hash { - uint32_t hash; - - OF_HASH_INIT(hash); - - OF_HASH_ADD_HASH(hash, _name.hash); - OF_HASH_ADD(hash, _DNSClass >> 8); - OF_HASH_ADD(hash, _DNSClass); - OF_HASH_ADD(hash, _recordType >> 8); - OF_HASH_ADD(hash, _recordType); - OF_HASH_ADD_HASH(hash, _alias.hash); - - OF_HASH_FINALIZE(hash); + unsigned long hash; + + OFHashInit(&hash); + + OFHashAddHash(&hash, _name.hash); + OFHashAdd(&hash, _DNSClass >> 8); + OFHashAdd(&hash, _DNSClass); + OFHashAdd(&hash, _recordType >> 8); + OFHashAdd(&hash, _recordType); + OFHashAddHash(&hash, _alias.hash); + + OFHashFinalize(&hash); return hash; } - (OFString *)description @@ -448,35 +448,34 @@ @"\tName = %@\n" @"\tClass = %@\n" @"\tAlias = %@\n" @"\tTTL = %" PRIu32 "\n" @">", - self.className, _name, of_dns_class_to_string(_DNSClass), _alias, - _TTL]; + self.className, _name, OFDNSClassName(_DNSClass), _alias, _TTL]; } @end @implementation OFHINFODNSResourceRecord @synthesize CPU = _CPU, OS = _OS; - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass - recordType: (of_dns_record_type_t)recordType + DNSClass: (OFDNSClass)DNSClass + recordType: (OFDNSRecordType)recordType TTL: (uint32_t)TTL { OF_INVALID_INIT_METHOD } - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass + DNSClass: (OFDNSClass)DNSClass CPU: (OFString *)CPU OS: (OFString *)OS TTL: (uint32_t)TTL { self = [super initWithName: name DNSClass: DNSClass - recordType: OF_DNS_RECORD_TYPE_HINFO + recordType: OFDNSRecordTypeHINFO TTL: TTL]; @try { _CPU = [CPU copy]; _OS = [OS copy]; @@ -526,23 +525,23 @@ return true; } - (unsigned long)hash { - uint32_t hash; - - OF_HASH_INIT(hash); - - OF_HASH_ADD_HASH(hash, _name.hash); - OF_HASH_ADD(hash, _DNSClass >> 8); - OF_HASH_ADD(hash, _DNSClass); - OF_HASH_ADD(hash, _recordType >> 8); - OF_HASH_ADD(hash, _recordType); - OF_HASH_ADD_HASH(hash, _CPU.hash); - OF_HASH_ADD_HASH(hash, _OS.hash); - - OF_HASH_FINALIZE(hash); + unsigned long hash; + + OFHashInit(&hash); + + OFHashAddHash(&hash, _name.hash); + OFHashAdd(&hash, _DNSClass >> 8); + OFHashAdd(&hash, _DNSClass); + OFHashAdd(&hash, _recordType >> 8); + OFHashAdd(&hash, _recordType); + OFHashAddHash(&hash, _CPU.hash); + OFHashAddHash(&hash, _OS.hash); + + OFHashFinalize(&hash); return hash; } - (OFString *)description @@ -553,35 +552,34 @@ @"\tClass = %@\n" @"\tCPU = %@\n" @"\tOS = %@\n" @"\tTTL = %" PRIu32 "\n" @">", - self.className, _name, of_dns_class_to_string(_DNSClass), _CPU, _OS, - _TTL]; + self.className, _name, OFDNSClassName(_DNSClass), _CPU, _OS, _TTL]; } @end @implementation OFMXDNSResourceRecord @synthesize preference = _preference, mailExchange = _mailExchange; - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass - recordType: (of_dns_record_type_t)recordType + DNSClass: (OFDNSClass)DNSClass + recordType: (OFDNSRecordType)recordType TTL: (uint32_t)TTL { OF_INVALID_INIT_METHOD } - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass + DNSClass: (OFDNSClass)DNSClass preference: (uint16_t)preference mailExchange: (OFString *)mailExchange TTL: (uint32_t)TTL { self = [super initWithName: name DNSClass: DNSClass - recordType: OF_DNS_RECORD_TYPE_MX + recordType: OFDNSRecordTypeMX TTL: TTL]; @try { _preference = preference; _mailExchange = [mailExchange copy]; @@ -631,24 +629,24 @@ return true; } - (unsigned long)hash { - uint32_t hash; - - OF_HASH_INIT(hash); - - OF_HASH_ADD_HASH(hash, _name.hash); - OF_HASH_ADD(hash, _DNSClass >> 8); - OF_HASH_ADD(hash, _DNSClass); - OF_HASH_ADD(hash, _recordType >> 8); - OF_HASH_ADD(hash, _recordType); - OF_HASH_ADD(hash, _preference >> 8); - OF_HASH_ADD(hash, _preference); - OF_HASH_ADD_HASH(hash, _mailExchange.hash); - - OF_HASH_FINALIZE(hash); + unsigned long hash; + + OFHashInit(&hash); + + OFHashAddHash(&hash, _name.hash); + OFHashAdd(&hash, _DNSClass >> 8); + OFHashAdd(&hash, _DNSClass); + OFHashAdd(&hash, _recordType >> 8); + OFHashAdd(&hash, _recordType); + OFHashAdd(&hash, _preference >> 8); + OFHashAdd(&hash, _preference); + OFHashAddHash(&hash, _mailExchange.hash); + + OFHashFinalize(&hash); return hash; } - (OFString *)description @@ -659,34 +657,34 @@ @"\tClass = %@\n" @"\tPreference = %" PRIu16 "\n" @"\tMail Exchange = %@\n" @"\tTTL = %" PRIu32 "\n" @">", - self.className, _name, of_dns_class_to_string(_DNSClass), - _preference, _mailExchange, _TTL]; + self.className, _name, OFDNSClassName(_DNSClass), _preference, + _mailExchange, _TTL]; } @end @implementation OFNSDNSResourceRecord @synthesize authoritativeHost = _authoritativeHost; - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass - recordType: (of_dns_record_type_t)recordType + DNSClass: (OFDNSClass)DNSClass + recordType: (OFDNSRecordType)recordType TTL: (uint32_t)TTL { OF_INVALID_INIT_METHOD } - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass + DNSClass: (OFDNSClass)DNSClass authoritativeHost: (OFString *)authoritativeHost TTL: (uint32_t)TTL { self = [super initWithName: name DNSClass: DNSClass - recordType: OF_DNS_RECORD_TYPE_NS + recordType: OFDNSRecordTypeNS TTL: TTL]; @try { _authoritativeHost = [authoritativeHost copy]; } @catch (id e) { @@ -732,22 +730,22 @@ return true; } - (unsigned long)hash { - uint32_t hash; - - OF_HASH_INIT(hash); - - OF_HASH_ADD_HASH(hash, _name.hash); - OF_HASH_ADD(hash, _DNSClass >> 8); - OF_HASH_ADD(hash, _DNSClass); - OF_HASH_ADD(hash, _recordType >> 8); - OF_HASH_ADD(hash, _recordType); - OF_HASH_ADD_HASH(hash, _authoritativeHost.hash); - - OF_HASH_FINALIZE(hash); + unsigned long hash; + + OFHashInit(&hash); + + OFHashAddHash(&hash, _name.hash); + OFHashAdd(&hash, _DNSClass >> 8); + OFHashAdd(&hash, _DNSClass); + OFHashAdd(&hash, _recordType >> 8); + OFHashAdd(&hash, _recordType); + OFHashAddHash(&hash, _authoritativeHost.hash); + + OFHashFinalize(&hash); return hash; } - (OFString *)description @@ -757,34 +755,34 @@ @"\tName = %@\n" @"\tClass = %@\n" @"\tAuthoritative Host = %@\n" @"\tTTL = %" PRIu32 "\n" @">", - self.className, _name, of_dns_class_to_string(_DNSClass), + self.className, _name, OFDNSClassName(_DNSClass), _authoritativeHost, _TTL]; } @end @implementation OFPTRDNSResourceRecord @synthesize domainName = _domainName; - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass - recordType: (of_dns_record_type_t)recordType + DNSClass: (OFDNSClass)DNSClass + recordType: (OFDNSRecordType)recordType TTL: (uint32_t)TTL { OF_INVALID_INIT_METHOD } - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass + DNSClass: (OFDNSClass)DNSClass domainName: (OFString *)domainName TTL: (uint32_t)TTL { self = [super initWithName: name DNSClass: DNSClass - recordType: OF_DNS_RECORD_TYPE_PTR + recordType: OFDNSRecordTypePTR TTL: TTL]; @try { _domainName = [domainName copy]; } @catch (id e) { @@ -830,22 +828,22 @@ return true; } - (unsigned long)hash { - uint32_t hash; - - OF_HASH_INIT(hash); - - OF_HASH_ADD_HASH(hash, _name.hash); - OF_HASH_ADD(hash, _DNSClass >> 8); - OF_HASH_ADD(hash, _DNSClass); - OF_HASH_ADD(hash, _recordType >> 8); - OF_HASH_ADD(hash, _recordType); - OF_HASH_ADD_HASH(hash, _domainName.hash); - - OF_HASH_FINALIZE(hash); + unsigned long hash; + + OFHashInit(&hash); + + OFHashAddHash(&hash, _name.hash); + OFHashAdd(&hash, _DNSClass >> 8); + OFHashAdd(&hash, _DNSClass); + OFHashAdd(&hash, _recordType >> 8); + OFHashAdd(&hash, _recordType); + OFHashAddHash(&hash, _domainName.hash); + + OFHashFinalize(&hash); return hash; } - (OFString *)description @@ -855,35 +853,35 @@ @"\tName = %@\n" @"\tClass = %@\n" @"\tDomain Name = %@\n" @"\tTTL = %" PRIu32 "\n" @">", - self.className, _name, of_dns_class_to_string(_DNSClass), - _domainName, _TTL]; + self.className, _name, OFDNSClassName(_DNSClass), _domainName, + _TTL]; } @end @implementation OFRPDNSResourceRecord @synthesize mailbox = _mailbox, TXTDomainName = _TXTDomainName; - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass - recordType: (of_dns_record_type_t)recordType + DNSClass: (OFDNSClass)DNSClass + recordType: (OFDNSRecordType)recordType TTL: (uint32_t)TTL { OF_INVALID_INIT_METHOD } - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass + DNSClass: (OFDNSClass)DNSClass mailbox: (OFString *)mailbox TXTDomainName: (OFString *)TXTDomainName TTL: (uint32_t)TTL { self = [super initWithName: name DNSClass: DNSClass - recordType: OF_DNS_RECORD_TYPE_RP + recordType: OFDNSRecordTypeRP TTL: TTL]; @try { _mailbox = [mailbox copy]; _TXTDomainName = [TXTDomainName copy]; @@ -935,23 +933,23 @@ return true; } - (unsigned long)hash { - uint32_t hash; - - OF_HASH_INIT(hash); - - OF_HASH_ADD_HASH(hash, _name.hash); - OF_HASH_ADD(hash, _DNSClass >> 8); - OF_HASH_ADD(hash, _DNSClass); - OF_HASH_ADD(hash, _recordType >> 8); - OF_HASH_ADD(hash, _recordType); - OF_HASH_ADD_HASH(hash, _mailbox.hash); - OF_HASH_ADD_HASH(hash, _TXTDomainName.hash); - - OF_HASH_FINALIZE(hash); + unsigned long hash; + + OFHashInit(&hash); + + OFHashAddHash(&hash, _name.hash); + OFHashAdd(&hash, _DNSClass >> 8); + OFHashAdd(&hash, _DNSClass); + OFHashAdd(&hash, _recordType >> 8); + OFHashAdd(&hash, _recordType); + OFHashAddHash(&hash, _mailbox.hash); + OFHashAddHash(&hash, _TXTDomainName.hash); + + OFHashFinalize(&hash); return hash; } - (OFString *)description @@ -962,11 +960,11 @@ @"\tClass = %@\n" @"\tMailbox = %@\n" @"\tTXT Domain Name = %@\n" @"\tTTL = %" PRIu32 "\n" @">", - self.className, _name, of_dns_class_to_string(_DNSClass), _mailbox, + self.className, _name, OFDNSClassName(_DNSClass), _mailbox, _TXTDomainName, _TTL]; } @end @implementation OFSOADNSResourceRecord @@ -975,19 +973,19 @@ @synthesize serialNumber = _serialNumber, refreshInterval = _refreshInterval; @synthesize retryInterval = _retryInterval; @synthesize expirationInterval = _expirationInterval, minTTL = _minTTL; - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass - recordType: (of_dns_record_type_t)recordType + DNSClass: (OFDNSClass)DNSClass + recordType: (OFDNSRecordType)recordType TTL: (uint32_t)TTL { OF_INVALID_INIT_METHOD } - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass + DNSClass: (OFDNSClass)DNSClass primaryNameServer: (OFString *)primaryNameServer responsiblePerson: (OFString *)responsiblePerson serialNumber: (uint32_t)serialNumber refreshInterval: (uint32_t)refreshInterval retryInterval: (uint32_t)retryInterval @@ -995,11 +993,11 @@ minTTL: (uint32_t)minTTL TTL: (uint32_t)TTL { self = [super initWithName: name DNSClass: DNSClass - recordType: OF_DNS_RECORD_TYPE_SOA + recordType: OFDNSRecordTypeSOA TTL: TTL]; @try { _primaryNameServer = [primaryNameServer copy]; _responsiblePerson = [responsiblePerson copy]; @@ -1071,43 +1069,43 @@ return true; } - (unsigned long)hash { - uint32_t hash; - - OF_HASH_INIT(hash); - - OF_HASH_ADD_HASH(hash, _name.hash); - OF_HASH_ADD(hash, _DNSClass >> 8); - OF_HASH_ADD(hash, _DNSClass); - OF_HASH_ADD(hash, _recordType >> 8); - OF_HASH_ADD(hash, _recordType); - OF_HASH_ADD_HASH(hash, _primaryNameServer.hash); - OF_HASH_ADD_HASH(hash, _responsiblePerson.hash); - OF_HASH_ADD(hash, _serialNumber >> 24); - OF_HASH_ADD(hash, _serialNumber >> 16); - OF_HASH_ADD(hash, _serialNumber >> 8); - OF_HASH_ADD(hash, _serialNumber); - OF_HASH_ADD(hash, _refreshInterval >> 24); - OF_HASH_ADD(hash, _refreshInterval >> 16); - OF_HASH_ADD(hash, _refreshInterval >> 8); - OF_HASH_ADD(hash, _refreshInterval); - OF_HASH_ADD(hash, _retryInterval >> 24); - OF_HASH_ADD(hash, _retryInterval >> 16); - OF_HASH_ADD(hash, _retryInterval >> 8); - OF_HASH_ADD(hash, _retryInterval); - OF_HASH_ADD(hash, _expirationInterval >> 24); - OF_HASH_ADD(hash, _expirationInterval >> 16); - OF_HASH_ADD(hash, _expirationInterval >> 8); - OF_HASH_ADD(hash, _expirationInterval); - OF_HASH_ADD(hash, _minTTL >> 24); - OF_HASH_ADD(hash, _minTTL >> 16); - OF_HASH_ADD(hash, _minTTL >> 8); - OF_HASH_ADD(hash, _minTTL); - - OF_HASH_FINALIZE(hash); + unsigned long hash; + + OFHashInit(&hash); + + OFHashAddHash(&hash, _name.hash); + OFHashAdd(&hash, _DNSClass >> 8); + OFHashAdd(&hash, _DNSClass); + OFHashAdd(&hash, _recordType >> 8); + OFHashAdd(&hash, _recordType); + OFHashAddHash(&hash, _primaryNameServer.hash); + OFHashAddHash(&hash, _responsiblePerson.hash); + OFHashAdd(&hash, _serialNumber >> 24); + OFHashAdd(&hash, _serialNumber >> 16); + OFHashAdd(&hash, _serialNumber >> 8); + OFHashAdd(&hash, _serialNumber); + OFHashAdd(&hash, _refreshInterval >> 24); + OFHashAdd(&hash, _refreshInterval >> 16); + OFHashAdd(&hash, _refreshInterval >> 8); + OFHashAdd(&hash, _refreshInterval); + OFHashAdd(&hash, _retryInterval >> 24); + OFHashAdd(&hash, _retryInterval >> 16); + OFHashAdd(&hash, _retryInterval >> 8); + OFHashAdd(&hash, _retryInterval); + OFHashAdd(&hash, _expirationInterval >> 24); + OFHashAdd(&hash, _expirationInterval >> 16); + OFHashAdd(&hash, _expirationInterval >> 8); + OFHashAdd(&hash, _expirationInterval); + OFHashAdd(&hash, _minTTL >> 24); + OFHashAdd(&hash, _minTTL >> 16); + OFHashAdd(&hash, _minTTL >> 8); + OFHashAdd(&hash, _minTTL); + + OFHashFinalize(&hash); return hash; } - (OFString *)description @@ -1123,11 +1121,11 @@ @"\tRetry Interval = %" PRIu32 "\n" @"\tExpiration Interval = %" PRIu32 "\n" @"\tMinimum TTL = %" PRIu32 "\n" @"\tTTL = %" PRIu32 "\n" @">", - self.className, _name, of_dns_class_to_string(_DNSClass), + self.className, _name, OFDNSClassName(_DNSClass), _primaryNameServer, _responsiblePerson, _serialNumber, _refreshInterval, _retryInterval, _expirationInterval, _minTTL, _TTL]; } @end @@ -1135,12 +1133,12 @@ @implementation OFSRVDNSResourceRecord @synthesize priority = _priority, weight = _weight, target = _target; @synthesize port = _port; - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass - recordType: (of_dns_record_type_t)recordType + DNSClass: (OFDNSClass)DNSClass + recordType: (OFDNSRecordType)recordType TTL: (uint32_t)TTL { OF_INVALID_INIT_METHOD } @@ -1150,12 +1148,12 @@ target: (OFString *)target port: (uint16_t)port TTL: (uint32_t)TTL { self = [super initWithName: name - DNSClass: OF_DNS_CLASS_IN - recordType: OF_DNS_RECORD_TYPE_SRV + DNSClass: OFDNSClassIN + recordType: OFDNSRecordTypeSRV TTL: TTL]; @try { _priority = priority; _weight = weight; @@ -1212,28 +1210,28 @@ return true; } - (unsigned long)hash { - uint32_t hash; - - OF_HASH_INIT(hash); - - OF_HASH_ADD_HASH(hash, _name.hash); - OF_HASH_ADD(hash, _DNSClass >> 8); - OF_HASH_ADD(hash, _DNSClass); - OF_HASH_ADD(hash, _recordType >> 8); - OF_HASH_ADD(hash, _recordType); - OF_HASH_ADD(hash, _priority >> 8); - OF_HASH_ADD(hash, _priority); - OF_HASH_ADD(hash, _weight >> 8); - OF_HASH_ADD(hash, _weight); - OF_HASH_ADD_HASH(hash, _target.hash); - OF_HASH_ADD(hash, _port >> 8); - OF_HASH_ADD(hash, _port); - - OF_HASH_FINALIZE(hash); + unsigned long hash; + + OFHashInit(&hash); + + OFHashAddHash(&hash, _name.hash); + OFHashAdd(&hash, _DNSClass >> 8); + OFHashAdd(&hash, _DNSClass); + OFHashAdd(&hash, _recordType >> 8); + OFHashAdd(&hash, _recordType); + OFHashAdd(&hash, _priority >> 8); + OFHashAdd(&hash, _priority); + OFHashAdd(&hash, _weight >> 8); + OFHashAdd(&hash, _weight); + OFHashAddHash(&hash, _target.hash); + OFHashAdd(&hash, _port >> 8); + OFHashAdd(&hash, _port); + + OFHashFinalize(&hash); return hash; } - (OFString *)description @@ -1253,25 +1251,25 @@ @implementation OFTXTDNSResourceRecord @synthesize textStrings = _textStrings; - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass - recordType: (of_dns_record_type_t)recordType + DNSClass: (OFDNSClass)DNSClass + recordType: (OFDNSRecordType)recordType TTL: (uint32_t)TTL { OF_INVALID_INIT_METHOD } - (instancetype)initWithName: (OFString *)name - DNSClass: (of_dns_class_t)DNSClass + DNSClass: (OFDNSClass)DNSClass textStrings: (OFArray OF_GENERIC(OFData *) *)textStrings TTL: (uint32_t)TTL { self = [super initWithName: name DNSClass: DNSClass - recordType: OF_DNS_RECORD_TYPE_TXT + recordType: OFDNSRecordTypeTXT TTL: TTL]; @try { _textStrings = [textStrings copy]; } @catch (id e) { @@ -1317,22 +1315,22 @@ return true; } - (unsigned long)hash { - uint32_t hash; - - OF_HASH_INIT(hash); - - OF_HASH_ADD_HASH(hash, _name.hash); - OF_HASH_ADD(hash, _DNSClass >> 8); - OF_HASH_ADD(hash, _DNSClass); - OF_HASH_ADD(hash, _recordType >> 8); - OF_HASH_ADD(hash, _recordType); - OF_HASH_ADD_HASH(hash, _textStrings.hash); - - OF_HASH_FINALIZE(hash); + unsigned long hash; + + OFHashInit(&hash); + + OFHashAddHash(&hash, _name.hash); + OFHashAdd(&hash, _DNSClass >> 8); + OFHashAdd(&hash, _DNSClass); + OFHashAdd(&hash, _recordType >> 8); + OFHashAdd(&hash, _recordType); + OFHashAddHash(&hash, _textStrings.hash); + + OFHashFinalize(&hash); return hash; } - (OFString *)description @@ -1373,15 +1371,14 @@ @"\tName = %@\n" @"\tClass = %@\n" @"\tText strings = %@\n" @"\tTTL = %" PRIu32 "\n" @">", - self.className, _name, of_dns_class_to_string(_DNSClass), text, - _TTL]; + self.className, _name, OFDNSClassName(_DNSClass), text, _TTL]; [ret retain]; objc_autoreleasePoolPop(pool); return [ret autorelease]; } @end Index: src/OFDNSResponse.h ================================================================== --- src/OFDNSResponse.h +++ src/OFDNSResponse.h @@ -20,23 +20,22 @@ @class OFArray OF_GENERIC(ObjectType); @class OFDictionary OF_GENERIC(KeyType, ObjectType); typedef OFDictionary OF_GENERIC(OFString *, OFArray OF_GENERIC( - OF_KINDOF(OFDNSResourceRecord *)) *) *of_dns_response_records_t; + OF_KINDOF(OFDNSResourceRecord *)) *) *OFDNSResponseRecords; /** * @class OFDNSResponse OFDNSResponse.h ObjFW/OFDNSResponse.h * * @brief A class storing a response from @ref OFDNSResolver. */ @interface OFDNSResponse: OFObject { OFString *_domainName; - of_dns_response_records_t _answerRecords; - of_dns_response_records_t _authorityRecords; - of_dns_response_records_t _additionalRecords; + OFDNSResponseRecords _answerRecords, _authorityRecords; + OFDNSResponseRecords _additionalRecords; OF_RESERVE_IVARS(OFDNSResponse, 4) } /** * @brief The domain name of the response. @@ -47,27 +46,27 @@ * @brief The answer records of the response. * * This is a dictionary with the key being the domain name and the value being * an array of @ref OFDNSResourceRecord. */ -@property (readonly, nonatomic) of_dns_response_records_t answerRecords; +@property (readonly, nonatomic) OFDNSResponseRecords answerRecords; /** * @brief The authority records of the response. * * This is a dictionary with the key being the domain name and the value being * an array of @ref OFDNSResourceRecord. */ -@property (readonly, nonatomic) of_dns_response_records_t authorityRecords; +@property (readonly, nonatomic) OFDNSResponseRecords authorityRecords; /** * @brief The additional records of the response. * * This is a dictionary with the key being the domain name and the value being * an array of @ref OFDNSResourceRecord. */ -@property (readonly, nonatomic) of_dns_response_records_t additionalRecords; +@property (readonly, nonatomic) OFDNSResponseRecords additionalRecords; /** * @brief Creates a new, autoreleased OFDNSResponse. * * @param domainName The domain name the response is for @@ -74,15 +73,14 @@ * @param answerRecords The answer records of the response * @param authorityRecords The authority records of the response * @param additionalRecords The additional records of the response * @return A new, autoreleased OFDNSResponse */ -+ (instancetype) - responseWithDomainName: (OFString *)domainName - answerRecords: (of_dns_response_records_t)answerRecords - authorityRecords: (of_dns_response_records_t)authorityRecords - additionalRecords: (of_dns_response_records_t)additionalRecords; ++ (instancetype)responseWithDomainName: (OFString *)domainName + answerRecords: (OFDNSResponseRecords)answerRecords + authorityRecords: (OFDNSResponseRecords)authorityRecords + additionalRecords: (OFDNSResponseRecords)additionalRecords; /** * @brief Initializes an already allocated OFDNSResponse. * * @param domainName The domain name the response is for @@ -89,16 +87,15 @@ * @param answerRecords The answer records of the response * @param authorityRecords The authority records of the response * @param additionalRecords The additional records of the response * @return An initialized OFDNSResponse */ -- (instancetype) - initWithDomainName: (OFString *)domainName - answerRecords: (of_dns_response_records_t)answerRecords - authorityRecords: (of_dns_response_records_t)authorityRecords - additionalRecords: (of_dns_response_records_t)additionalRecords +- (instancetype)initWithDomainName: (OFString *)domainName + answerRecords: (OFDNSResponseRecords)answerRecords + authorityRecords: (OFDNSResponseRecords)authorityRecords + additionalRecords: (OFDNSResponseRecords)additionalRecords OF_DESIGNATED_INITIALIZER; - (instancetype)init OF_UNAVAILABLE; @end OF_ASSUME_NONNULL_END Index: src/OFDNSResponse.m ================================================================== --- src/OFDNSResponse.m +++ src/OFDNSResponse.m @@ -22,27 +22,26 @@ @implementation OFDNSResponse @synthesize domainName = _domainName, answerRecords = _answerRecords; @synthesize authorityRecords = _authorityRecords; @synthesize additionalRecords = _additionalRecords; -+ (instancetype) - responseWithDomainName: (OFString *)domainName - answerRecords: (of_dns_response_records_t)answerRecords - authorityRecords: (of_dns_response_records_t)authorityRecords - additionalRecords: (of_dns_response_records_t)additionalRecords ++ (instancetype)responseWithDomainName: (OFString *)domainName + answerRecords: (OFDNSResponseRecords)answerRecords + authorityRecords: (OFDNSResponseRecords)authorityRecords + additionalRecords: (OFDNSResponseRecords)additionalRecords { return [[[self alloc] initWithDomainName: domainName answerRecords: answerRecords authorityRecords: authorityRecords additionalRecords: additionalRecords] autorelease]; } - (instancetype)initWithDomainName: (OFString *)domainName - answerRecords: (of_dns_response_records_t)answerRecords - authorityRecords: (of_dns_response_records_t)authorityRecords - additionalRecords: (of_dns_response_records_t)additionalRecords + answerRecords: (OFDNSResponseRecords)answerRecords + authorityRecords: (OFDNSResponseRecords)authorityRecords + additionalRecords: (OFDNSResponseRecords)additionalRecords { self = [super init]; @try { _domainName = [domainName copy]; @@ -100,18 +99,18 @@ return true; } - (unsigned long)hash { - uint32_t hash; - - OF_HASH_INIT(hash); - OF_HASH_ADD_HASH(hash, _domainName.hash); - OF_HASH_ADD_HASH(hash, [_answerRecords hash]); - OF_HASH_ADD_HASH(hash, [_authorityRecords hash]); - OF_HASH_ADD_HASH(hash, [_additionalRecords hash]); - OF_HASH_FINALIZE(hash); + unsigned long hash; + + OFHashInit(&hash); + OFHashAddHash(&hash, _domainName.hash); + OFHashAddHash(&hash, [_answerRecords hash]); + OFHashAddHash(&hash, [_authorityRecords hash]); + OFHashAddHash(&hash, [_additionalRecords hash]); + OFHashFinalize(&hash); return hash; } - (OFString *)description Index: src/OFData+CryptographicHashing.m ================================================================== --- src/OFData+CryptographicHashing.m +++ src/OFData+CryptographicHashing.m @@ -54,11 +54,11 @@ } objc_autoreleasePoolPop(pool); return [OFString stringWithCString: cString - encoding: OF_STRING_ENCODING_ASCII + encoding: OFStringEncodingASCII length: digestSize * 2]; } - (OFString *)stringByMD5Hashing { Index: src/OFData+MessagePackParsing.m ================================================================== --- src/OFData+MessagePackParsing.m +++ src/OFData+MessagePackParsing.m @@ -132,19 +132,19 @@ switch (data.count) { case 4: { uint32_t timestamp; memcpy(×tamp, data.items, 4); - timestamp = OF_BSWAP32_IF_LE(timestamp); + timestamp = OFFromBigEndian32(timestamp); return [OFDate dateWithTimeIntervalSince1970: timestamp]; } case 8: { uint64_t combined; memcpy(&combined, data.items, 8); - combined = OF_BSWAP64_IF_LE(combined); + combined = OFFromBigEndian64(combined); return [OFDate dateWithTimeIntervalSince1970: (double)(combined & 0x3FFFFFFFF) + (double)(combined >> 34) / 1000000000]; } @@ -153,12 +153,12 @@ int64_t seconds; memcpy(&nanoseconds, data.items, 4); memcpy(&seconds, (char *)data.items + 4, 8); - nanoseconds = OF_BSWAP32_IF_LE(nanoseconds); - seconds = OF_BSWAP64_IF_LE(seconds); + nanoseconds = OFFromBigEndian32(nanoseconds); + seconds = OFFromBigEndian64(seconds); return [OFDate dateWithTimeIntervalSince1970: (double)seconds + (double)nanoseconds / 1000000000]; } default: @@ -285,21 +285,21 @@ if (length < 5) @throw [OFTruncatedDataException exception]; memcpy(&f, buffer + 1, 4); - *object = [OFNumber numberWithFloat: OF_BSWAP_FLOAT_IF_LE(f)]; + *object = [OFNumber numberWithFloat: OFFromBigEndianFloat(f)]; return 5; case 0xCB:; /* float 64 */ double d; if (length < 9) @throw [OFTruncatedDataException exception]; memcpy(&d, buffer + 1, 8); - *object = [OFNumber numberWithDouble: OF_BSWAP_DOUBLE_IF_LE(d)]; + *object = [OFNumber numberWithDouble: OFFromBigEndianDouble(d)]; return 9; /* nil */ case 0xC0: *object = [OFNull null]; return 1; Index: src/OFData.h ================================================================== --- src/OFData.h +++ src/OFData.h @@ -14,19 +14,27 @@ */ #import "OFObject.h" #import "OFSerialization.h" #import "OFMessagePackRepresentation.h" + +/*! @file */ OF_ASSUME_NONNULL_BEGIN @class OFString; @class OFURL; -enum { - OF_DATA_SEARCH_BACKWARDS = 1 -}; +/** + * @brief Options for searching in data. + * + * This is a bit mask. + */ +typedef enum { + /** Search backwards in the data */ + OFDataSearchBackwards = 1 +} OFDataSearchOptions; /** * @class OFData OFData.h ObjFW/OFData.h * * @brief A class for storing arbitrary data in an array. @@ -274,11 +282,11 @@ * @brief Compares the data to other data. * * @param data Data to compare the data to * @return The result of the comparison */ -- (of_comparison_result_t)compare: (OFData *)data; +- (OFComparisonResult)compare: (OFData *)data; /** * @brief Returns a specific item of the OFData. * * @param index The number of the item to return @@ -290,28 +298,24 @@ * @brief Returns the data in the specified range as a new OFData. * * @param range The range of the data for the new OFData * @return The data in the specified range as a new OFData */ -- (OFData *)subdataWithRange: (of_range_t)range; +- (OFData *)subdataWithRange: (OFRange)range; /** * @brief Returns the range of the data. * * @param data The data to search for - * @param options Options modifying search behavior.@n - * Possible values are: - * Value | Description - * ---------------------------|----------------------------- - * `OF_DATA_SEARCH_BACKWARDS` | Search backwards in the data + * @param options Options modifying search behavior * @param range The range in which to search * @return The range of the first occurrence of the data or a range with - * `OF_NOT_FOUND` as start position if it was not found. + * `OFNotFound` as start position if it was not found. */ -- (of_range_t)rangeOfData: (OFData *)data - options: (int)options - range: (of_range_t)range; +- (OFRange)rangeOfData: (OFData *)data + options: (OFDataSearchOptions)options + range: (OFRange)range; #ifdef OF_HAVE_FILES /** * @brief Writes the OFData into the specified file. * Index: src/OFData.m ================================================================== --- src/OFData.m +++ src/OFData.m @@ -18,10 +18,11 @@ #include #include #include #import "OFData.h" +#import "OFBase64.h" #import "OFDictionary.h" #ifdef OF_HAVE_FILES # import "OFFile.h" # import "OFFileManager.h" #endif @@ -38,12 +39,10 @@ #import "OFOutOfMemoryException.h" #import "OFOutOfRangeException.h" #import "OFTruncatedDataException.h" #import "OFUnsupportedProtocolException.h" -#import "base64.h" - /* References for static linking */ void _references_to_categories_of_OFData(void) { _OFData_CryptographicHashing_reference = 1; @@ -123,11 +122,11 @@ @try { if (itemSize == 0) @throw [OFInvalidArgumentException exception]; - _items = of_alloc(count, itemSize); + _items = OFAllocMemory(count, itemSize); _count = count; _itemSize = itemSize; _freeWhenDone = true; memcpy(_items, items, count * itemSize); @@ -187,19 +186,19 @@ # if ULLONG_MAX > SIZE_MAX if (size > SIZE_MAX) @throw [OFOutOfRangeException exception]; # endif - buffer = of_alloc((size_t)size, 1); + buffer = OFAllocMemory((size_t)size, 1); file = [[OFFile alloc] initWithPath: path mode: @"r"]; @try { [file readIntoBuffer: buffer exactLength: (size_t)size]; } @finally { [file release]; } } @catch (id e) { - free(buffer); + OFFreeMemory(buffer); [self release]; @throw e; } @@ -206,11 +205,11 @@ @try { self = [self initWithItemsNoCopy: buffer count: (size_t)size freeWhenDone: true]; } @catch (id e) { - free(buffer); + OFFreeMemory(buffer); @throw e; } return self; } @@ -236,11 +235,11 @@ _count = 0; _itemSize = 1; _freeWhenDone = true; pageSize = [OFSystemInfo pageSize]; - buffer = of_alloc(1, pageSize); + buffer = OFAllocMemory(1, pageSize); @try { while (!stream.atEndOfStream) { size_t length = [stream readIntoBuffer: buffer @@ -248,16 +247,17 @@ if (SIZE_MAX - _count < length) @throw [OFOutOfRangeException exception]; - _items = of_realloc(_items, _count + length, 1); + _items = OFResizeMemory(_items, + _count + length, 1); memcpy(_items + _count, buffer, length); _count += length; } } @finally { - free(buffer); + OFFreeMemory(buffer); } objc_autoreleasePoolPop(pool); } @catch (id e) { [self release]; @@ -271,25 +271,24 @@ { self = [super init]; @try { size_t count = [string - cStringLengthWithEncoding: OF_STRING_ENCODING_ASCII]; + cStringLengthWithEncoding: OFStringEncodingASCII]; const char *cString; if (count % 2 != 0) @throw [OFInvalidFormatException exception]; count /= 2; - _items = of_alloc(count, 1); + _items = OFAllocMemory(count, 1); _count = count; _itemSize = 1; _freeWhenDone = true; - cString = [string - cStringWithEncoding: OF_STRING_ENCODING_ASCII]; + cString = [string cStringWithEncoding: OFStringEncodingASCII]; for (size_t i = 0; i < count; i++) { uint8_t c1 = cString[2 * i]; uint8_t c2 = cString[2 * i + 1]; uint8_t byte; @@ -332,14 +331,13 @@ } self = [(OFMutableData *)self initWithCapacity: string.length / 3]; @try { - if (!of_base64_decode((OFMutableData *)self, - [string cStringWithEncoding: OF_STRING_ENCODING_ASCII], - [string cStringLengthWithEncoding: - OF_STRING_ENCODING_ASCII])) + if (!OFBase64Decode((OFMutableData *)self, + [string cStringWithEncoding: OFStringEncodingASCII], + [string cStringLengthWithEncoding: OFStringEncodingASCII])) @throw [OFInvalidFormatException exception]; } @catch (id e) { [self release]; @throw e; } @@ -355,11 +353,11 @@ void *pool = objc_autoreleasePoolPush(); OFString *stringValue; @try { if (![element.name isEqual: self.className] || - ![element.namespace isEqual: OF_SERIALIZATION_NS]) + ![element.namespace isEqual: OFSerializationNS]) @throw [OFInvalidArgumentException exception]; stringValue = element.stringValue; } @catch (id e) { [self release]; @@ -374,11 +372,11 @@ } - (void)dealloc { if (_freeWhenDone) - free(_items); + OFFreeMemory(_items); [_parentData release]; [super dealloc]; } @@ -447,11 +445,11 @@ return false; return true; } -- (of_comparison_result_t)compare: (OFData *)data +- (OFComparisonResult)compare: (OFData *)data { int comparison; size_t count, minCount; if (![data isKindOfClass: [OFData class]]) @@ -464,38 +462,38 @@ minCount = (_count > count ? count : _count); if ((comparison = memcmp(_items, data.items, minCount * _itemSize)) == 0) { if (_count > count) - return OF_ORDERED_DESCENDING; + return OFOrderedDescending; if (_count < count) - return OF_ORDERED_ASCENDING; + return OFOrderedAscending; - return OF_ORDERED_SAME; + return OFOrderedSame; } if (comparison > 0) - return OF_ORDERED_DESCENDING; + return OFOrderedDescending; else - return OF_ORDERED_ASCENDING; + return OFOrderedAscending; } - (unsigned long)hash { - uint32_t hash; + unsigned long hash; - OF_HASH_INIT(hash); + OFHashInit(&hash); for (size_t i = 0; i < _count * _itemSize; i++) - OF_HASH_ADD(hash, ((uint8_t *)_items)[i]); + OFHashAdd(&hash, ((uint8_t *)_items)[i]); - OF_HASH_FINALIZE(hash); + OFHashFinalize(&hash); return hash; } -- (OFData *)subdataWithRange: (of_range_t)range +- (OFData *)subdataWithRange: (OFRange)range { OFData *ret; if (range.length > SIZE_MAX - range.location || range.location + range.length > _count) @@ -540,16 +538,16 @@ return ret; } - (OFString *)stringByBase64Encoding { - return of_base64_encode(_items, _count * _itemSize); + return OFBase64Encode(_items, _count * _itemSize); } -- (of_range_t)rangeOfData: (OFData *)data - options: (int)options - range: (of_range_t)range +- (OFRange)rangeOfData: (OFData *)data + options: (OFDataSearchOptions)options + range: (OFRange)range { const char *search; size_t searchLength; if (range.length > SIZE_MAX - range.location || @@ -558,22 +556,22 @@ if (data == nil || data.itemSize != _itemSize) @throw [OFInvalidArgumentException exception]; if ((searchLength = data.count) == 0) - return of_range(0, 0); + return OFRangeMake(0, 0); if (searchLength > range.length) - return of_range(OF_NOT_FOUND, 0); + return OFRangeMake(OFNotFound, 0); search = data.items; - if (options & OF_DATA_SEARCH_BACKWARDS) { + if (options & OFDataSearchBackwards) { for (size_t i = range.length - searchLength;; i--) { if (memcmp(_items + i * _itemSize, search, searchLength * _itemSize) == 0) - return of_range(i, searchLength); + return OFRangeMake(i, searchLength); /* No match and we're at the last item */ if (i == 0) break; } @@ -580,14 +578,14 @@ } else { for (size_t i = range.location; i <= range.length - searchLength; i++) if (memcmp(_items + i * _itemSize, search, searchLength * _itemSize) == 0) - return of_range(i, searchLength); + return OFRangeMake(i, searchLength); } - return of_range(OF_NOT_FOUND, 0); + return OFRangeMake(OFNotFound, 0); } #ifdef OF_HAVE_FILES - (void)writeToFile: (OFString *)path { @@ -622,12 +620,12 @@ @throw [OFInvalidArgumentException exception]; pool = objc_autoreleasePoolPush(); element = [OFXMLElement elementWithName: self.className - namespace: OF_SERIALIZATION_NS - stringValue: of_base64_encode(_items, _count * _itemSize)]; + namespace: OFSerializationNS + stringValue: OFBase64Encode(_items, _count * _itemSize)]; [element retain]; objc_autoreleasePoolPop(pool); @@ -648,18 +646,18 @@ data = [OFMutableData dataWithCapacity: _count + 2]; [data addItem: &type]; [data addItem: &tmp]; } else if (_count <= UINT16_MAX) { uint8_t type = 0xC5; - uint16_t tmp = OF_BSWAP16_IF_LE((uint16_t)_count); + uint16_t tmp = OFToBigEndian16((uint16_t)_count); data = [OFMutableData dataWithCapacity: _count + 3]; [data addItem: &type]; [data addItems: &tmp count: sizeof(tmp)]; } else if (_count <= UINT32_MAX) { uint8_t type = 0xC6; - uint32_t tmp = OF_BSWAP32_IF_LE((uint32_t)_count); + uint32_t tmp = OFToBigEndian32((uint32_t)_count); data = [OFMutableData dataWithCapacity: _count + 5]; [data addItem: &type]; [data addItems: &tmp count: sizeof(tmp)]; } else Index: src/OFDatagramSocket.h ================================================================== --- src/OFDatagramSocket.h +++ src/OFDatagramSocket.h @@ -14,12 +14,11 @@ */ #import "OFObject.h" #import "OFKernelEventObserver.h" #import "OFRunLoop.h" - -#import "socket.h" +#import "OFSocket.h" OF_ASSUME_NONNULL_BEGIN /** @file */ @@ -34,13 +33,12 @@ * @param sender The address of the sender of the packet * @param exception An exception which occurred while receiving or `nil` on * success * @return A bool whether the same block should be used for the next receive */ -typedef bool (^of_datagram_socket_async_receive_block_t)( - size_t length, const of_socket_address_t *_Nonnull sender, - id _Nullable exception); +typedef bool (^OFDatagramSocketAsyncReceiveBlock)(size_t length, + const OFSocketAddress *_Nonnull sender, id _Nullable exception); /** * @brief A block which is called when a packet has been sent. * * @param data The data which was sent @@ -47,12 +45,12 @@ * @param receiver The receiver for the packet * @param exception An exception which occurred while reading or `nil` on * success * @return The data to repeat the send with or nil if it should not repeat */ -typedef OFData *_Nullable (^of_datagram_socket_async_send_data_block_t)( - OFData *_Nonnull data, const of_socket_address_t *_Nonnull receiver, +typedef OFData *_Nullable (^OFDatagramSocketAsyncSendDataBlock)( + OFData *_Nonnull data, const OFSocketAddress *_Nonnull receiver, id _Nullable exception); #endif /** * @protocol OFDatagramSocketDelegate OFDatagramSocket.h \ @@ -74,11 +72,11 @@ * @return A bool whether the same block should be used for the next receive */ - (bool)socket: (OFDatagramSocket *)socket didReceiveIntoBuffer: (void *)buffer length: (size_t)length - sender: (const of_socket_address_t *_Nonnull)sender + sender: (const OFSocketAddress *_Nonnull)sender exception: (nullable id)exception; /** * @brief This method is called when a packet has been sent. * @@ -88,11 +86,11 @@ * @param exception An exception that occurred while sending, or nil on success * @return The data to repeat the send with or nil if it should not repeat */ - (nullable OFData *)socket: (OFDatagramSocket *)socket didSendData: (OFData *)data - receiver: (const of_socket_address_t *_Nonnull)receiver + receiver: (const OFSocketAddress *_Nonnull)receiver exception: (nullable id)exception; @end /** * @class OFDatagramSocket OFDatagramSocket.h ObjFW/OFDatagramSocket.h @@ -107,11 +105,11 @@ * was called to create one "instance" for every thread! */ @interface OFDatagramSocket: OFObject { - of_socket_t _socket; + OFSocketHandle _socket; bool _canBlock; #ifdef OF_WII bool _canSendToBroadcastAddresses; #endif id _Nullable _delegate; @@ -151,17 +149,17 @@ * * If the buffer is too small, the datagram is truncated. * * @param buffer The buffer to write the datagram to * @param length The length of the buffer - * @param sender A pointer to an @ref of_socket_address_t, which will be set to - * the address of the sender + * @param sender A pointer to an @ref OFSocketAddress, which will be set to the + * address of the sender * @return The length of the received datagram */ - (size_t)receiveIntoBuffer: (void *)buffer length: (size_t)length - sender: (of_socket_address_t *)sender; + sender: (OFSocketAddress *)sender; /** * @brief Asynchronously receives a datagram and stores it into the specified * buffer. * @@ -182,11 +180,11 @@ * @param length The length of the buffer * @param runLoopMode The run loop mode in which to perform the async receive */ - (void)asyncReceiveIntoBuffer: (void *)buffer length: (size_t)length - runLoopMode: (of_run_loop_mode_t)runLoopMode; + runLoopMode: (OFRunLoopMode)runLoopMode; #ifdef OF_HAVE_BLOCKS /** * @brief Asynchronously receives a datagram and stores it into the specified * buffer. @@ -202,11 +200,11 @@ * the datagram received next, you need to return false from the * method. */ - (void)asyncReceiveIntoBuffer: (void *)buffer length: (size_t)length - block: (of_datagram_socket_async_receive_block_t)block; + block: (OFDatagramSocketAsyncReceiveBlock)block; /** * @brief Asynchronously receives a datagram and stores it into the specified * buffer. * @@ -222,78 +220,78 @@ * the datagram received next, you need to return false from the * method. */ - (void)asyncReceiveIntoBuffer: (void *)buffer length: (size_t)length - runLoopMode: (of_run_loop_mode_t)runLoopMode - block: (of_datagram_socket_async_receive_block_t)block; + runLoopMode: (OFRunLoopMode)runLoopMode + block: (OFDatagramSocketAsyncReceiveBlock)block; #endif /** * @brief Sends the specified datagram to the specified address. * * @param buffer The buffer to send as a datagram * @param length The length of the buffer - * @param receiver A pointer to an @ref of_socket_address_t to which the - * datagram should be sent + * @param receiver A pointer to an @ref OFSocketAddress to which the datagram + * should be sent */ - (void)sendBuffer: (const void *)buffer length: (size_t)length - receiver: (const of_socket_address_t *)receiver; + receiver: (const OFSocketAddress *)receiver; /** * @brief Asynchronously sends the specified datagram to the specified address. * * @param data The data to send as a datagram - * @param receiver A pointer to an @ref of_socket_address_t to which the - * datagram should be sent. The receiver is copied. + * @param receiver A pointer to an @ref OFSocketAddress to which the datagram + * should be sent. The receiver is copied. */ - (void)asyncSendData: (OFData *)data - receiver: (const of_socket_address_t *)receiver; + receiver: (const OFSocketAddress *)receiver; /** * @brief Asynchronously sends the specified datagram to the specified address. * * @param data The data to send as a datagram - * @param receiver A pointer to an @ref of_socket_address_t to which the - * datagram should be sent. The receiver is copied. + * @param receiver A pointer to an @ref OFSocketAddress to which the datgram + * should be sent. The receiver is copied. * @param runLoopMode The run loop mode in which to perform the async send */ - (void)asyncSendData: (OFData *)data - receiver: (const of_socket_address_t *)receiver - runLoopMode: (of_run_loop_mode_t)runLoopMode; + receiver: (const OFSocketAddress *)receiver + runLoopMode: (OFRunLoopMode)runLoopMode; #ifdef OF_HAVE_BLOCKS /** * @brief Asynchronously sends the specified datagram to the specified address. * * @param data The data to send as a datagram - * @param receiver A pointer to an @ref of_socket_address_t to which the - * datagram should be sent. The receiver is copied. + * @param receiver A pointer to an @ref OFSocketAddress to which the datagram + * should be sent. The receiver is copied. * @param block The block to call when the packet has been sent. It should * return the data for the next send with the same callback or nil * if it should not repeat. */ - (void)asyncSendData: (OFData *)data - receiver: (const of_socket_address_t *)receiver - block: (of_datagram_socket_async_send_data_block_t)block; + receiver: (const OFSocketAddress *)receiver + block: (OFDatagramSocketAsyncSendDataBlock)block; /** * @brief Asynchronously sends the specified datagram to the specified address. * * @param data The data to send as a datagram - * @param receiver A pointer to an @ref of_socket_address_t to which the - * datagram should be sent. The receiver is copied. + * @param receiver A pointer to an @ref OFSocketAddress to which the datagram + * should be sent. The receiver is copied. * @param runLoopMode The run loop mode in which to perform the async send * @param block The block to call when the packet has been sent. It should * return the data for the next send with the same callback or nil * if it should not repeat. */ - (void)asyncSendData: (OFData *)data - receiver: (const of_socket_address_t *)receiver - runLoopMode: (of_run_loop_mode_t)runLoopMode - block: (of_datagram_socket_async_send_data_block_t)block; + receiver: (const OFSocketAddress *)receiver + runLoopMode: (OFRunLoopMode)runLoopMode + block: (OFDatagramSocketAsyncSendDataBlock)block; #endif /** * @brief Cancels all pending asynchronous requests on the socket. */ Index: src/OFDatagramSocket.m ================================================================== --- src/OFDatagramSocket.m +++ src/OFDatagramSocket.m @@ -26,12 +26,14 @@ # include #endif #import "OFDatagramSocket.h" #import "OFData.h" -#import "OFRunLoop+Private.h" #import "OFRunLoop.h" +#import "OFRunLoop+Private.h" +#import "OFSocket.h" +#import "OFSocket+Private.h" #import "OFGetOptionFailedException.h" #import "OFInitializationFailedException.h" #import "OFNotOpenException.h" #import "OFOutOfRangeException.h" @@ -38,22 +40,19 @@ #import "OFReadFailedException.h" #import "OFSetOptionFailedException.h" #import "OFSetOptionFailedException.h" #import "OFWriteFailedException.h" -#import "socket.h" -#import "socket_helpers.h" - @implementation OFDatagramSocket @synthesize delegate = _delegate; + (void)initialize { if (self != [OFDatagramSocket class]) return; - if (!of_socket_init()) + if (!OFSocketInit()) @throw [OFInitializationFailedException exceptionWithClass: self]; } + (instancetype)socket @@ -69,11 +68,11 @@ if (self.class == [OFDatagramSocket class]) { [self doesNotRecognizeSelector: _cmd]; abort(); } - _socket = INVALID_SOCKET; + _socket = OFInvalidSocketHandle; _canBlock = true; } @catch (id e) { [self release]; @throw e; } @@ -81,11 +80,11 @@ return self; } - (void)dealloc { - if (_socket != INVALID_SOCKET) + if (_socket != OFInvalidSocketHandle) [self close]; [super dealloc]; } @@ -122,11 +121,11 @@ u_long v = canBlock; if (ioctlsocket(_socket, FIONBIO, &v) == SOCKET_ERROR) @throw [OFSetOptionFailedException exceptionWithObject: self - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; _canBlock = canBlock; #else OF_UNRECOGNIZED_SELECTOR #endif @@ -138,11 +137,11 @@ if (setsockopt(_socket, SOL_SOCKET, SO_BROADCAST, (char *)&v, (socklen_t)sizeof(v)) != 0) @throw [OFSetOptionFailedException exceptionWithObject: self - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; #ifdef OF_WII _canSendToBroadcastAddresses = canSendToBroadcastAddresses; #endif } @@ -155,25 +154,25 @@ if (getsockopt(_socket, SOL_SOCKET, SO_BROADCAST, (char *)&v, &len) != 0 || len != sizeof(v)) @throw [OFGetOptionFailedException exceptionWithObject: self - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; return v; #else return _canSendToBroadcastAddresses; #endif } - (size_t)receiveIntoBuffer: (void *)buffer length: (size_t)length - sender: (of_socket_address_t *)sender + sender: (OFSocketAddress *)sender { ssize_t ret; - if (_socket == INVALID_SOCKET) + if (_socket == OFInvalidSocketHandle) @throw [OFNotOpenException exceptionWithObject: self]; sender->length = (socklen_t)sizeof(sender->sockaddr); #ifndef OF_WINDOWS @@ -180,39 +179,39 @@ if ((ret = recvfrom(_socket, buffer, length, 0, &sender->sockaddr.sockaddr, &sender->length)) < 0) @throw [OFReadFailedException exceptionWithObject: self requestedLength: length - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; #else if (length > INT_MAX) @throw [OFOutOfRangeException exception]; if ((ret = recvfrom(_socket, buffer, (int)length, 0, &sender->sockaddr.sockaddr, &sender->length)) < 0) @throw [OFReadFailedException exceptionWithObject: self requestedLength: length - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; #endif switch (sender->sockaddr.sockaddr.sa_family) { case AF_INET: - sender->family = OF_SOCKET_ADDRESS_FAMILY_IPV4; + sender->family = OFSocketAddressFamilyIPv4; break; #ifdef OF_HAVE_IPV6 case AF_INET6: - sender->family = OF_SOCKET_ADDRESS_FAMILY_IPV6; + sender->family = OFSocketAddressFamilyIPv6; break; #endif #ifdef OF_HAVE_IPX case AF_IPX: - sender->family = OF_SOCKET_ADDRESS_FAMILY_IPX; + sender->family = OFSocketAddressFamilyIPX; break; #endif default: - sender->family = OF_SOCKET_ADDRESS_FAMILY_UNKNOWN; + sender->family = OFSocketAddressFamilyUnknown; break; } return ret; } @@ -219,16 +218,16 @@ - (void)asyncReceiveIntoBuffer: (void *)buffer length: (size_t)length { [self asyncReceiveIntoBuffer: buffer length: length - runLoopMode: of_run_loop_mode_default]; + runLoopMode: OFDefaultRunLoopMode]; } - (void)asyncReceiveIntoBuffer: (void *)buffer length: (size_t)length - runLoopMode: (of_run_loop_mode_t)runLoopMode + runLoopMode: (OFRunLoopMode)runLoopMode { [OFRunLoop of_addAsyncReceiveForDatagramSocket: self buffer: buffer length: length mode: runLoopMode @@ -239,22 +238,22 @@ } #ifdef OF_HAVE_BLOCKS - (void)asyncReceiveIntoBuffer: (void *)buffer length: (size_t)length - block: (of_datagram_socket_async_receive_block_t)block + block: (OFDatagramSocketAsyncReceiveBlock)block { [self asyncReceiveIntoBuffer: buffer length: length - runLoopMode: of_run_loop_mode_default + runLoopMode: OFDefaultRunLoopMode block: block]; } - (void)asyncReceiveIntoBuffer: (void *)buffer length: (size_t)length - runLoopMode: (of_run_loop_mode_t)runLoopMode - block: (of_datagram_socket_async_receive_block_t)block + runLoopMode: (OFRunLoopMode)runLoopMode + block: (OFDatagramSocketAsyncReceiveBlock)block { [OFRunLoop of_addAsyncReceiveForDatagramSocket: self buffer: buffer length: length mode: runLoopMode @@ -263,13 +262,13 @@ } #endif - (void)sendBuffer: (const void *)buffer length: (size_t)length - receiver: (const of_socket_address_t *)receiver + receiver: (const OFSocketAddress *)receiver { - if (_socket == INVALID_SOCKET) + if (_socket == OFInvalidSocketHandle) @throw [OFNotOpenException exceptionWithObject: self]; #ifndef OF_WINDOWS ssize_t bytesWritten; @@ -281,11 +280,11 @@ receiver->length)) < 0) @throw [OFWriteFailedException exceptionWithObject: self requestedLength: length bytesWritten: 0 - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; #else int bytesWritten; if (length > INT_MAX) @throw [OFOutOfRangeException exception]; @@ -294,11 +293,11 @@ &receiver->sockaddr.sockaddr, receiver->length)) < 0) @throw [OFWriteFailedException exceptionWithObject: self requestedLength: length bytesWritten: 0 - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; #endif if ((size_t)bytesWritten != length) @throw [OFWriteFailedException exceptionWithObject: self requestedLength: length @@ -305,20 +304,20 @@ bytesWritten: bytesWritten errNo: 0]; } - (void)asyncSendData: (OFData *)data - receiver: (const of_socket_address_t *)receiver + receiver: (const OFSocketAddress *)receiver { [self asyncSendData: data receiver: receiver - runLoopMode: of_run_loop_mode_default]; + runLoopMode: OFDefaultRunLoopMode]; } - (void)asyncSendData: (OFData *)data - receiver: (const of_socket_address_t *)receiver - runLoopMode: (of_run_loop_mode_t)runLoopMode + receiver: (const OFSocketAddress *)receiver + runLoopMode: (OFRunLoopMode)runLoopMode { [OFRunLoop of_addAsyncSendForDatagramSocket: self data: data receiver: receiver mode: runLoopMode @@ -328,23 +327,23 @@ delegate: _delegate]; } #ifdef OF_HAVE_BLOCKS - (void)asyncSendData: (OFData *)data - receiver: (const of_socket_address_t *)receiver - block: (of_datagram_socket_async_send_data_block_t)block + receiver: (const OFSocketAddress *)receiver + block: (OFDatagramSocketAsyncSendDataBlock)block { [self asyncSendData: data receiver: receiver - runLoopMode: of_run_loop_mode_default + runLoopMode: OFDefaultRunLoopMode block: block]; } - (void)asyncSendData: (OFData *)data - receiver: (const of_socket_address_t *)receiver - runLoopMode: (of_run_loop_mode_t)runLoopMode - block: (of_datagram_socket_async_send_data_block_t)block + receiver: (const OFSocketAddress *)receiver + runLoopMode: (OFRunLoopMode)runLoopMode + block: (OFDatagramSocketAsyncSendDataBlock)block { [OFRunLoop of_addAsyncSendForDatagramSocket: self data: data receiver: receiver mode: runLoopMode @@ -354,19 +353,19 @@ #endif - (void)cancelAsyncRequests { [OFRunLoop of_cancelAsyncRequestsForObject: self - mode: of_run_loop_mode_default]; + mode: OFDefaultRunLoopMode]; } - (int)fileDescriptorForReading { #ifndef OF_WINDOWS return _socket; #else - if (_socket == INVALID_SOCKET) + if (_socket == OFInvalidSocketHandle) return -1; if (_socket > INT_MAX) @throw [OFOutOfRangeException exception]; @@ -377,11 +376,11 @@ - (int)fileDescriptorForWriting { #ifndef OF_WINDOWS return _socket; #else - if (_socket == INVALID_SOCKET) + if (_socket == OFInvalidSocketHandle) return -1; if (_socket > INT_MAX) @throw [OFOutOfRangeException exception]; @@ -389,12 +388,12 @@ #endif } - (void)close { - if (_socket == INVALID_SOCKET) + if (_socket == OFInvalidSocketHandle) @throw [OFNotOpenException exceptionWithObject: self]; closesocket(_socket); - _socket = INVALID_SOCKET; + _socket = OFInvalidSocketHandle; } @end Index: src/OFDate.h ================================================================== --- src/OFDate.h +++ src/OFDate.h @@ -31,11 +31,11 @@ OF_SUBCLASSING_RESTRICTED #endif @interface OFDate: OFObject { - of_time_interval_t _seconds; + OFTimeInterval _seconds; } #ifdef OF_HAVE_CLASS_PROPERTIES @property (class, readonly, nonatomic) OFDate *distantFuture; @property (class, readonly, nonatomic) OFDate *distantPast; @@ -122,16 +122,16 @@ @property (readonly, nonatomic) unsigned short localDayOfYear; /** * @brief The seconds since 1970-01-01T00:00:00Z. */ -@property (readonly, nonatomic) of_time_interval_t timeIntervalSince1970; +@property (readonly, nonatomic) OFTimeInterval timeIntervalSince1970; /** * @brief The seconds the date is in the future. */ -@property (readonly, nonatomic) of_time_interval_t timeIntervalSinceNow; +@property (readonly, nonatomic) OFTimeInterval timeIntervalSinceNow; /** * @brief Creates a new OFDate with the current date and time. * * @return A new, autoreleased OFDate with the current date and time @@ -143,19 +143,19 @@ * 1970-01-01T00:00:00Z. * * @param seconds The seconds since 1970-01-01T00:00:00Z * @return A new, autoreleased OFDate with the specified date and time */ -+ (instancetype)dateWithTimeIntervalSince1970: (of_time_interval_t)seconds; ++ (instancetype)dateWithTimeIntervalSince1970: (OFTimeInterval)seconds; /** * @brief Creates a new OFDate with the specified date and time since now. * * @param seconds The seconds since now * @return A new, autoreleased OFDate with the specified date and time */ -+ (instancetype)dateWithTimeIntervalSinceNow: (of_time_interval_t)seconds; ++ (instancetype)dateWithTimeIntervalSinceNow: (OFTimeInterval)seconds; /** * @brief Creates a new OFDate with the specified string in the specified * format. * @@ -215,21 +215,21 @@ * time since 1970-01-01T00:00:00Z. * * @param seconds The seconds since 1970-01-01T00:00:00Z * @return An initialized OFDate with the specified date and time */ -- (instancetype)initWithTimeIntervalSince1970: (of_time_interval_t)seconds +- (instancetype)initWithTimeIntervalSince1970: (OFTimeInterval)seconds OF_DESIGNATED_INITIALIZER; /** * @brief Initializes an already allocated OFDate with the specified date and * time since now. * * @param seconds The seconds since now * @return An initialized OFDate with the specified date and time */ -- (instancetype)initWithTimeIntervalSinceNow: (of_time_interval_t)seconds; +- (instancetype)initWithTimeIntervalSinceNow: (OFTimeInterval)seconds; /** * @brief Initializes an already allocated OFDate with the specified string in * the specified format. * @@ -271,11 +271,11 @@ * @brief Compares the date to another date. * * @param date The date to compare the date to * @return The result of the comparison */ -- (of_comparison_result_t)compare: (OFDate *)date; +- (OFComparisonResult)compare: (OFDate *)date; /** * @brief Creates a string of the date with the specified format. * * See the man page for `strftime` for information on the format. @@ -319,17 +319,17 @@ * @brief Returns the seconds the receiver is after the date. * * @param otherDate Date date to generate the difference with receiver * @return The seconds the receiver is after the date. */ -- (of_time_interval_t)timeIntervalSinceDate: (OFDate *)otherDate; +- (OFTimeInterval)timeIntervalSinceDate: (OFDate *)otherDate; /** * @brief Creates a new date with the specified time interval added. * * @param seconds The seconds after the date * @return A new, autoreleased OFDate */ -- (OFDate *)dateByAddingTimeInterval: (of_time_interval_t)seconds; +- (OFDate *)dateByAddingTimeInterval: (OFTimeInterval)seconds; @end OF_ASSUME_NONNULL_END Index: src/OFDate.m ================================================================== --- src/OFDate.m +++ src/OFDate.m @@ -28,10 +28,11 @@ #import "OFDictionary.h" #import "OFMessagePackExtension.h" #ifdef OF_HAVE_THREADS # import "OFMutex.h" #endif +#import "OFStrPTime.h" #import "OFString.h" #import "OFSystemInfo.h" #import "OFXMLElement.h" #import "OFInitializationFailedException.h" @@ -38,12 +39,10 @@ #import "OFInvalidArgumentException.h" #import "OFInvalidFormatException.h" #import "OFOutOfMemoryException.h" #import "OFOutOfRangeException.h" -#import "of_strptime.h" - #ifdef OF_AMIGAOS_M68K /* amiga-gcc does not have trunc() */ # define trunc(x) ((int64_t)(x)) #endif @@ -89,20 +88,20 @@ { distantPast = [[OFDateSingleton alloc] initWithTimeIntervalSince1970: -62167219200.0]; } -static of_time_interval_t +static OFTimeInterval now(void) { struct timeval tv; - of_time_interval_t seconds; + OFTimeInterval seconds; - OF_ENSURE(gettimeofday(&tv, NULL) == 0); + OFEnsure(gettimeofday(&tv, NULL) == 0); seconds = tv.tv_sec; - seconds += (of_time_interval_t)tv.tv_usec / 1000000; + seconds += (OFTimeInterval)tv.tv_usec / 1000000; return seconds; } #if (!defined(HAVE_GMTIME_R) || !defined(HAVE_LOCALTIME_R)) && \ @@ -115,16 +114,16 @@ [mutex release]; } #endif #ifdef OF_WINDOWS -static __time64_t (*func__mktime64)(struct tm *); +static __time64_t (*_mktime64FuncPtr)(struct tm *); #endif #ifdef HAVE_GMTIME_R # define GMTIME_RET(field) \ - of_time_interval_t timeInterval = self.timeIntervalSince1970; \ + OFTimeInterval timeInterval = self.timeIntervalSince1970; \ time_t seconds = (time_t)timeInterval; \ struct tm tm; \ \ if (seconds != trunc(timeInterval)) \ @throw [OFOutOfRangeException exception]; \ @@ -132,11 +131,11 @@ if (gmtime_r(&seconds, &tm) == NULL) \ @throw [OFOutOfRangeException exception]; \ \ return tm.field; # define LOCALTIME_RET(field) \ - of_time_interval_t timeInterval = self.timeIntervalSince1970; \ + OFTimeInterval timeInterval = self.timeIntervalSince1970; \ time_t seconds = (time_t)timeInterval; \ struct tm tm; \ \ if (seconds != trunc(timeInterval)) \ @throw [OFOutOfRangeException exception]; \ @@ -146,11 +145,11 @@ \ return tm.field; #else # ifdef OF_HAVE_THREADS # define GMTIME_RET(field) \ - of_time_interval_t timeInterval = self.timeIntervalSince1970; \ + OFTimeInterval timeInterval = self.timeIntervalSince1970; \ time_t seconds = (time_t)timeInterval; \ struct tm *tm; \ \ if (seconds != trunc(timeInterval)) \ @throw [OFOutOfRangeException exception]; \ @@ -164,11 +163,11 @@ return tm->field; \ } @finally { \ [mutex unlock]; \ } # define LOCALTIME_RET(field) \ - of_time_interval_t timeInterval = self.timeIntervalSince1970; \ + OFTimeInterval timeInterval = self.timeIntervalSince1970; \ time_t seconds = (time_t)timeInterval; \ struct tm *tm; \ \ if (seconds != trunc(timeInterval)) \ @throw [OFOutOfRangeException exception]; \ @@ -183,11 +182,11 @@ } @finally { \ [mutex unlock]; \ } # else # define GMTIME_RET(field) \ - of_time_interval_t timeInterval = self.timeIntervalSince1970; \ + OFTimeInterval timeInterval = self.timeIntervalSince1970; \ time_t seconds = (time_t)timeInterval; \ struct tm *tm; \ \ if (seconds != trunc(timeInterval)) \ @throw [OFOutOfRangeException exception]; \ @@ -195,11 +194,11 @@ if ((tm = gmtime(&seconds)) == NULL) \ @throw [OFOutOfRangeException exception]; \ \ return tm->field; # define LOCALTIME_RET(field) \ - of_time_interval_t timeInterval = self.timeIntervalSince1970; \ + OFTimeInterval timeInterval = self.timeIntervalSince1970; \ time_t seconds = (time_t)timeInterval; \ struct tm *tm; \ \ if (seconds != trunc(timeInterval)) \ @throw [OFOutOfRangeException exception]; \ @@ -275,11 +274,11 @@ { } - (unsigned int)retainCount { - return OF_RETAIN_COUNT_MAX; + return OFMaxRetainCount; } @end @implementation OFDatePlaceholder #ifdef __clang__ @@ -286,24 +285,24 @@ /* We intentionally don't call into super, so silence the warning. */ # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wunknown-pragmas" # pragma clang diagnostic ignored "-Wobjc-designated-initializers" #endif -- (instancetype)initWithTimeIntervalSince1970: (of_time_interval_t)seconds +- (instancetype)initWithTimeIntervalSince1970: (OFTimeInterval)seconds { #if defined(OF_OBJFW_RUNTIME) && UINTPTR_MAX == UINT64_MAX uint64_t value; #endif if (seconds == 0) { - static of_once_t once = OF_ONCE_INIT; - of_once(&once, initZeroDate); + static OFOnceControl once = OFOnceControlInitValue; + OFOnce(&once, initZeroDate); return (id)zeroDate; } #if defined(OF_OBJFW_RUNTIME) && UINTPTR_MAX == UINT64_MAX - value = OF_BSWAP64_IF_LE(OF_DOUBLE_TO_INT_RAW(OF_BSWAP_DOUBLE_IF_LE( + value = OFFromBigEndian64(OFDoubleToRawUInt64(OFToBigEndianDouble( seconds))); /* Almost all dates fall into this range. */ if (value & (UINT64_C(4) << 60)) { id ret = objc_createTaggedPointer(dateTag, @@ -321,17 +320,17 @@ #endif @end #if defined(OF_OBJFW_RUNTIME) && UINTPTR_MAX == UINT64_MAX @implementation OFTaggedPointerDate -- (of_time_interval_t)timeIntervalSince1970 +- (OFTimeInterval)timeIntervalSince1970 { uint64_t value = (uint64_t)object_getTaggedPointerValue(self); value |= UINT64_C(4) << 60; - return OF_BSWAP_DOUBLE_IF_LE(OF_INT_TO_DOUBLE_RAW(OF_BSWAP64_IF_LE( + return OFFromBigEndianDouble(OFRawUInt64ToDouble(OFToBigEndian64( value))); } @end #endif @@ -353,11 +352,11 @@ atexit(releaseMutex); #endif #ifdef OF_WINDOWS if ((module = LoadLibrary("msvcrt.dll")) != NULL) - func__mktime64 = (__time64_t (*)(struct tm *)) + _mktime64FuncPtr = (__time64_t (*)(struct tm *)) GetProcAddress(module, "_mktime64"); #endif #if defined(OF_OBJFW_RUNTIME) && UINTPTR_MAX == UINT64_MAX dateTag = objc_registerTaggedPointerClass([OFTaggedPointerDate class]); @@ -380,17 +379,17 @@ + (instancetype)date { return [[[self alloc] init] autorelease]; } -+ (instancetype)dateWithTimeIntervalSince1970: (of_time_interval_t)seconds ++ (instancetype)dateWithTimeIntervalSince1970: (OFTimeInterval)seconds { return [[[self alloc] initWithTimeIntervalSince1970: seconds] autorelease]; } -+ (instancetype)dateWithTimeIntervalSinceNow: (of_time_interval_t)seconds ++ (instancetype)dateWithTimeIntervalSinceNow: (OFTimeInterval)seconds { return [[[self alloc] initWithTimeIntervalSinceNow: seconds] autorelease]; } @@ -408,37 +407,37 @@ format: format] autorelease]; } + (instancetype)distantFuture { - static of_once_t once = OF_ONCE_INIT; - of_once(&once, initDistantFuture); + static OFOnceControl once = OFOnceControlInitValue; + OFOnce(&once, initDistantFuture); return distantFuture; } + (instancetype)distantPast { - static of_once_t once = OF_ONCE_INIT; - of_once(&once, initDistantPast); + static OFOnceControl once = OFOnceControlInitValue; + OFOnce(&once, initDistantPast); return distantPast; } - (instancetype)init { return [self initWithTimeIntervalSince1970: now()]; } -- (instancetype)initWithTimeIntervalSince1970: (of_time_interval_t)seconds +- (instancetype)initWithTimeIntervalSince1970: (OFTimeInterval)seconds { self = [super init]; _seconds = seconds; return self; } -- (instancetype)initWithTimeIntervalSinceNow: (of_time_interval_t)seconds +- (instancetype)initWithTimeIntervalSinceNow: (OFTimeInterval)seconds { return [self initWithTimeIntervalSince1970: now() + seconds]; } - (instancetype)initWithDateString: (OFString *)string @@ -447,11 +446,11 @@ void *pool = objc_autoreleasePoolPush(); const char *UTF8String = string.UTF8String; struct tm tm = { .tm_isdst = -1 }; short tz = 0; - if (of_strptime(UTF8String, format.UTF8String, &tm, &tz) != + if (OFStrPTime(UTF8String, format.UTF8String, &tm, &tz) != UTF8String + string.UTF8StringLength) @throw [OFInvalidFormatException exception]; objc_autoreleasePoolPop(pool); @@ -463,25 +462,25 @@ { void *pool = objc_autoreleasePoolPush(); const char *UTF8String = string.UTF8String; struct tm tm = { .tm_isdst = -1 }; /* - * of_strptime() can never set this to SHRT_MAX, no matter what is + * OFStrPTime() can never set this to SHRT_MAX, no matter what is * passed to it, so this is a safe way to figure out if the date * contains a time zone. */ short tz = SHRT_MAX; - of_time_interval_t seconds; + OFTimeInterval seconds; - if (of_strptime(UTF8String, format.UTF8String, &tm, &tz) != + if (OFStrPTime(UTF8String, format.UTF8String, &tm, &tz) != UTF8String + string.UTF8StringLength) @throw [OFInvalidFormatException exception]; if (tz == SHRT_MAX) { #ifdef OF_WINDOWS - if (func__mktime64 != NULL) { - if ((seconds = func__mktime64(&tm)) == -1) + if (_mktime64FuncPtr != NULL) { + if ((seconds = _mktime64FuncPtr(&tm)) == -1) @throw [OFInvalidFormatException exception]; } else { #endif if ((seconds = mktime(&tm)) == -1) @throw [OFInvalidFormatException exception]; @@ -496,27 +495,27 @@ return [self initWithTimeIntervalSince1970: seconds]; } - (instancetype)initWithSerialization: (OFXMLElement *)element { - of_time_interval_t seconds; + OFTimeInterval seconds; @try { void *pool = objc_autoreleasePoolPush(); unsigned long long value; if (![element.name isEqual: @"OFDate"] || - ![element.namespace isEqual: OF_SERIALIZATION_NS]) + ![element.namespace isEqual: OFSerializationNS]) @throw [OFInvalidArgumentException exception]; value = [element unsignedLongLongValueWithBase: 16]; if (value > UINT64_MAX) @throw [OFOutOfRangeException exception]; - seconds = OF_BSWAP_DOUBLE_IF_LE(OF_INT_TO_DOUBLE_RAW( - OF_BSWAP64_IF_LE(value))); + seconds = OFFromBigEndianDouble(OFRawUInt64ToDouble( + OFToBigEndian64(value))); objc_autoreleasePoolPop(pool); } @catch (id e) { [self release]; @throw e; @@ -543,41 +542,41 @@ return true; } - (unsigned long)hash { - uint32_t hash; + unsigned long hash; double tmp; - OF_HASH_INIT(hash); + OFHashInit(&hash); - tmp = OF_BSWAP_DOUBLE_IF_BE(self.timeIntervalSince1970); + tmp = OFToLittleEndianDouble(self.timeIntervalSince1970); for (size_t i = 0; i < sizeof(double); i++) - OF_HASH_ADD(hash, ((char *)&tmp)[i]); + OFHashAdd(&hash, ((char *)&tmp)[i]); - OF_HASH_FINALIZE(hash); + OFHashFinalize(&hash); return hash; } - (id)copy { return [self retain]; } -- (of_comparison_result_t)compare: (OFDate *)date +- (OFComparisonResult)compare: (OFDate *)date { if (![date isKindOfClass: [OFDate class]]) @throw [OFInvalidArgumentException exception]; if (self.timeIntervalSince1970 < date.timeIntervalSince1970) - return OF_ORDERED_ASCENDING; + return OFOrderedAscending; if (self.timeIntervalSince1970 > date.timeIntervalSince1970) - return OF_ORDERED_DESCENDING; + return OFOrderedDescending; - return OF_ORDERED_SAME; + return OFOrderedSame; } - (OFString *)description { return [self dateStringWithFormat: @"%Y-%m-%dT%H:%M:%SZ"]; @@ -587,14 +586,14 @@ { void *pool = objc_autoreleasePoolPush(); OFXMLElement *element; element = [OFXMLElement elementWithName: @"OFDate" - namespace: OF_SERIALIZATION_NS]; + namespace: OFSerializationNS]; element.stringValue = [OFString stringWithFormat: @"%016" PRIx64, - OF_BSWAP64_IF_LE(OF_DOUBLE_TO_INT_RAW(OF_BSWAP_DOUBLE_IF_LE( + OFFromBigEndian64(OFDoubleToRawUInt64(OFToBigEndianDouble( self.timeIntervalSince1970)))]; [element retain]; objc_autoreleasePoolPop(pool); @@ -603,11 +602,11 @@ } - (OFData *)messagePackRepresentation { void *pool = objc_autoreleasePoolPush(); - of_time_interval_t timeInterval = self.timeIntervalSince1970; + OFTimeInterval timeInterval = self.timeIntervalSince1970; int64_t seconds = (int64_t)timeInterval; uint32_t nanoseconds = (uint32_t)((timeInterval - trunc(timeInterval)) * 1000000000); OFData *ret; @@ -614,11 +613,11 @@ if (seconds >= 0 && seconds < 0x400000000) { if (seconds <= UINT32_MAX && nanoseconds == 0) { uint32_t seconds32 = (uint32_t)seconds; OFData *data; - seconds32 = OF_BSWAP32_IF_LE(seconds32); + seconds32 = OFToBigEndian32(seconds32); data = [OFData dataWithItems: &seconds32 count: sizeof(seconds32)]; ret = [[OFMessagePackExtension extensionWithType: -1 @@ -626,11 +625,11 @@ } else { uint64_t combined = ((uint64_t)nanoseconds << 34) | (uint64_t)seconds; OFData *data; - combined = OF_BSWAP64_IF_LE(combined); + combined = OFToBigEndian64(combined); data = [OFData dataWithItems: &combined count: sizeof(combined)]; ret = [[OFMessagePackExtension extensionWithType: -1 @@ -637,13 +636,13 @@ data: data] messagePackRepresentation]; } } else { OFMutableData *data = [OFMutableData dataWithCapacity: 12]; - nanoseconds = OF_BSWAP32_IF_LE(nanoseconds); + nanoseconds = OFToBigEndian32(nanoseconds); [data addItems: &nanoseconds count: sizeof(nanoseconds)]; - seconds = OF_BSWAP64_IF_LE(seconds); + seconds = OFToBigEndian64(seconds); [data addItems: &seconds count: sizeof(seconds)]; ret = [[OFMessagePackExtension extensionWithType: -1 data: data] messagePackRepresentation]; @@ -656,11 +655,11 @@ return [ret autorelease]; } - (unsigned long)microsecond { - of_time_interval_t timeInterval = self.timeIntervalSince1970; + OFTimeInterval timeInterval = self.timeIntervalSince1970; return (unsigned long)((timeInterval - trunc(timeInterval)) * 1000000); } - (unsigned char)second @@ -739,11 +738,11 @@ } - (OFString *)dateStringWithFormat: (OFConstantString *)format { OFString *ret; - of_time_interval_t timeInterval = self.timeIntervalSince1970; + OFTimeInterval timeInterval = self.timeIntervalSince1970; time_t seconds = (time_t)timeInterval; struct tm tm; size_t pageSize; #ifndef OF_WINDOWS char *buffer; @@ -775,11 +774,11 @@ } # endif #endif pageSize = [OFSystemInfo pageSize]; - buffer = of_alloc(1, pageSize); + buffer = OFAllocMemory(1, pageSize); @try { #ifndef OF_WINDOWS if (strftime(buffer, pageSize, format.UTF8String, &tm) == 0) @throw [OFOutOfRangeException exception]; @@ -790,20 +789,20 @@ @throw [OFOutOfRangeException exception]; ret = [OFString stringWithUTF16String: buffer]; #endif } @finally { - free(buffer); + OFFreeMemory(buffer); } return ret; } - (OFString *)localDateStringWithFormat: (OFConstantString *)format { OFString *ret; - of_time_interval_t timeInterval = self.timeIntervalSince1970; + OFTimeInterval timeInterval = self.timeIntervalSince1970; time_t seconds = (time_t)timeInterval; struct tm tm; size_t pageSize; #ifndef OF_WINDOWS char *buffer; @@ -835,11 +834,11 @@ } # endif #endif pageSize = [OFSystemInfo pageSize]; - buffer = of_alloc(1, pageSize); + buffer = OFAllocMemory(1, pageSize); @try { #ifndef OF_WINDOWS if (strftime(buffer, pageSize, format.UTF8String, &tm) == 0) @throw [OFOutOfRangeException exception]; @@ -850,11 +849,11 @@ @throw [OFOutOfRangeException exception]; ret = [OFString stringWithUTF16String: buffer]; #endif } @finally { - free(buffer); + OFFreeMemory(buffer); } return ret; } @@ -861,11 +860,11 @@ - (OFDate *)earlierDate: (OFDate *)otherDate { if (otherDate == nil) return self; - if ([self compare: otherDate] == OF_ORDERED_DESCENDING) + if ([self compare: otherDate] == OFOrderedDescending) return otherDate; return self; } @@ -872,40 +871,40 @@ - (OFDate *)laterDate: (OFDate *)otherDate { if (otherDate == nil) return self; - if ([self compare: otherDate] == OF_ORDERED_ASCENDING) + if ([self compare: otherDate] == OFOrderedAscending) return otherDate; return self; } -- (of_time_interval_t)timeIntervalSince1970 +- (OFTimeInterval)timeIntervalSince1970 { return _seconds; } -- (of_time_interval_t)timeIntervalSinceDate: (OFDate *)otherDate +- (OFTimeInterval)timeIntervalSinceDate: (OFDate *)otherDate { return self.timeIntervalSince1970 - otherDate.timeIntervalSince1970; } -- (of_time_interval_t)timeIntervalSinceNow +- (OFTimeInterval)timeIntervalSinceNow { struct timeval t; - of_time_interval_t seconds; + OFTimeInterval seconds; - OF_ENSURE(gettimeofday(&t, NULL) == 0); + OFEnsure(gettimeofday(&t, NULL) == 0); seconds = t.tv_sec; - seconds += (of_time_interval_t)t.tv_usec / 1000000; + seconds += (OFTimeInterval)t.tv_usec / 1000000; return self.timeIntervalSince1970 - seconds; } -- (OFDate *)dateByAddingTimeInterval: (of_time_interval_t)seconds +- (OFDate *)dateByAddingTimeInterval: (OFTimeInterval)seconds { return [OFDate dateWithTimeIntervalSince1970: self.timeIntervalSince1970 + seconds]; } @end Index: src/OFDictionary.h ================================================================== --- src/OFDictionary.h +++ src/OFDictionary.h @@ -32,14 +32,13 @@ OF_ASSUME_NONNULL_BEGIN @class OFArray OF_GENERIC(ObjectType); #ifdef OF_HAVE_BLOCKS -typedef void (^of_dictionary_enumeration_block_t)(id key, id object, - bool *stop); -typedef bool (^of_dictionary_filter_block_t)(id key, id object); -typedef id _Nonnull (^of_dictionary_map_block_t)(id key, id object); +typedef void (^OFDictionaryEnumerationBlock)(id key, id object, bool *stop); +typedef bool (^OFDictionaryFilterBlock)(id key, id object); +typedef id _Nonnull (^OFDictionaryMapBlock)(id key, id object); #endif /** * @class OFDictionary OFDictionary.h ObjFW/OFDictionary.h * @@ -270,33 +269,32 @@ /** * @brief Executes a block for each key / object pair. * * @param block The block to execute for each key / object pair. */ -- (void)enumerateKeysAndObjectsUsingBlock: - (of_dictionary_enumeration_block_t)block; +- (void)enumerateKeysAndObjectsUsingBlock: (OFDictionaryEnumerationBlock)block; /** * @brief Creates a new dictionary, mapping each object using the specified * block. * * @param block A block which maps an object for each object * @return A new autoreleased OFDictionary */ -- (OFDictionary OF_GENERIC(KeyType, id) *)mappedDictionaryUsingBlock: - (of_dictionary_map_block_t)block; +- (OFDictionary OF_GENERIC(KeyType, id) *) + mappedDictionaryUsingBlock: (OFDictionaryMapBlock)block; /** * @brief Creates a new dictionary, only containing the objects for which the * block returns true. * * @param block A block which determines if the object should be in the new * dictionary * @return A new autoreleased OFDictionary */ -- (OFDictionary OF_GENERIC(KeyType, ObjectType) *)filteredDictionaryUsingBlock: - (of_dictionary_filter_block_t)block; +- (OFDictionary OF_GENERIC(KeyType, ObjectType) *) + filteredDictionaryUsingBlock: (OFDictionaryFilterBlock)block; #endif #if !defined(OF_HAVE_GENERICS) && !defined(DOXYGEN) # undef KeyType # undef ObjectType #endif Index: src/OFDictionary.m ================================================================== --- src/OFDictionary.m +++ src/OFDictionary.m @@ -37,12 +37,13 @@ } placeholder; static OFCharacterSet *URLQueryPartAllowedCharacterSet = nil; @interface OFDictionary () -- (OFString *)of_JSONRepresentationWithOptions: (int)options - depth: (size_t)depth; +- (OFString *) + of_JSONRepresentationWithOptions: (OFJSONRepresentationOptions)options + depth: (size_t)depth; @end @interface OFDictionaryPlaceholder: OFDictionary @end @@ -169,16 +170,16 @@ { } - (unsigned int)retainCount { - return OF_RETAIN_COUNT_MAX; + return OFMaxRetainCount; } -- (bool)characterIsMember: (of_unichar_t)character +- (bool)characterIsMember: (OFUnichar)character { - if (character < CHAR_MAX && of_ascii_isalnum(character)) + if (character < CHAR_MAX && OFASCIIIsAlnum(character)) return true; switch (character) { case '-': case '.': @@ -505,11 +506,11 @@ { return [[[OFDictionaryObjectEnumerator alloc] initWithDictionary: self] autorelease]; } -- (int)countByEnumeratingWithState: (of_fast_enumeration_state_t *)state +- (int)countByEnumeratingWithState: (OFFastEnumerationState *)state objects: (id *)objects count: (int)count { OFEnumerator *enumerator; int i; @@ -535,12 +536,11 @@ return i; } #ifdef OF_HAVE_BLOCKS -- (void)enumerateKeysAndObjectsUsingBlock: - (of_dictionary_enumeration_block_t)block +- (void)enumerateKeysAndObjectsUsingBlock: (OFDictionaryEnumerationBlock)block { bool stop = false; for (id key in self) { block(key, [self objectForKey: key], &stop); @@ -548,11 +548,11 @@ if (stop) break; } } -- (OFDictionary *)mappedDictionaryUsingBlock: (of_dictionary_map_block_t)block +- (OFDictionary *)mappedDictionaryUsingBlock: (OFDictionaryMapBlock)block { OFMutableDictionary *new = [OFMutableDictionary dictionary]; [self enumerateKeysAndObjectsUsingBlock: ^ (id key, id object, bool *stop) { @@ -562,12 +562,11 @@ [new makeImmutable]; return new; } -- (OFDictionary *)filteredDictionaryUsingBlock: - (of_dictionary_filter_block_t)block +- (OFDictionary *)filteredDictionaryUsingBlock: (OFDictionaryFilterBlock)block { OFMutableDictionary *new = [OFMutableDictionary dictionary]; [self enumerateKeysAndObjectsUsingBlock: ^ (id key, id object, bool *stop) { @@ -679,14 +678,14 @@ OFEnumerator *keyEnumerator, *objectEnumerator; id key, object; if ([self isKindOfClass: [OFMutableDictionary class]]) element = [OFXMLElement elementWithName: @"OFMutableDictionary" - namespace: OF_SERIALIZATION_NS]; + namespace: OFSerializationNS]; else element = [OFXMLElement elementWithName: @"OFDictionary" - namespace: OF_SERIALIZATION_NS]; + namespace: OFSerializationNS]; keyEnumerator = [self keyEnumerator]; objectEnumerator = [self objectEnumerator]; while ((key = [keyEnumerator nextObject]) != nil && (object = [objectEnumerator nextObject]) != nil) { @@ -693,16 +692,16 @@ void *pool2 = objc_autoreleasePoolPush(); OFXMLElement *keyElement, *objectElement; keyElement = [OFXMLElement elementWithName: @"key" - namespace: OF_SERIALIZATION_NS]; + namespace: OFSerializationNS]; [keyElement addChild: key.XMLElementBySerializing]; objectElement = [OFXMLElement elementWithName: @"object" - namespace: OF_SERIALIZATION_NS]; + namespace: OFSerializationNS]; [objectElement addChild: object.XMLElementBySerializing]; [element addChild: keyElement]; [element addChild: objectElement]; @@ -719,26 +718,28 @@ - (OFString *)JSONRepresentation { return [self of_JSONRepresentationWithOptions: 0 depth: 0]; } -- (OFString *)JSONRepresentationWithOptions: (int)options +- (OFString *)JSONRepresentationWithOptions: + (OFJSONRepresentationOptions)options { return [self of_JSONRepresentationWithOptions: options depth: 0]; } -- (OFString *)of_JSONRepresentationWithOptions: (int)options - depth: (size_t)depth +- (OFString *) + of_JSONRepresentationWithOptions: (OFJSONRepresentationOptions)options + depth: (size_t)depth { OFMutableString *JSON = [OFMutableString stringWithString: @"{"]; void *pool = objc_autoreleasePoolPush(); OFEnumerator *keyEnumerator = [self keyEnumerator]; OFEnumerator *objectEnumerator = [self objectEnumerator]; size_t i, count = self.count; id key, object; - if (options & OF_JSON_REPRESENTATION_PRETTY) { + if (options & OFJSONRepresentationOptionPretty) { OFMutableString *indentation = [OFMutableString string]; for (i = 0; i < depth; i++) [indentation appendString: @"\t"]; @@ -747,11 +748,11 @@ i = 0; while ((key = [keyEnumerator nextObject]) != nil && (object = [objectEnumerator nextObject]) != nil) { void *pool2 = objc_autoreleasePoolPush(); int identifierOptions = - options | OF_JSON_REPRESENTATION_IDENTIFIER; + options | OFJSONRepresentationOptionIsIdentifier; if (![key isKindOfClass: [OFString class]]) @throw [OFInvalidArgumentException exception]; [JSON appendString: indentation]; @@ -777,11 +778,11 @@ i = 0; while ((key = [keyEnumerator nextObject]) != nil && (object = [objectEnumerator nextObject]) != nil) { void *pool2 = objc_autoreleasePoolPush(); int identifierOptions = - options | OF_JSON_REPRESENTATION_IDENTIFIER; + options | OFJSONRepresentationOptionIsIdentifier; if (![key isKindOfClass: [OFString class]]) @throw [OFInvalidArgumentException exception]; [JSON appendString: [key @@ -821,17 +822,17 @@ if (count <= 15) { uint8_t tmp = 0x80 | ((uint8_t)count & 0xF); [data addItem: &tmp]; } else if (count <= UINT16_MAX) { uint8_t type = 0xDE; - uint16_t tmp = OF_BSWAP16_IF_LE((uint16_t)count); + uint16_t tmp = OFToBigEndian16((uint16_t)count); [data addItem: &type]; [data addItems: &tmp count: sizeof(tmp)]; } else if (count <= UINT32_MAX) { uint8_t type = 0xDF; - uint32_t tmp = OF_BSWAP32_IF_LE((uint32_t)count); + uint32_t tmp = OFToBigEndian32((uint32_t)count); [data addItem: &type]; [data addItems: &tmp count: sizeof(tmp)]; } else @throw [OFOutOfRangeException exception]; DELETED src/OFDimensionValue.h Index: src/OFDimensionValue.h ================================================================== --- src/OFDimensionValue.h +++ src/OFDimensionValue.h @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#import "OFValue.h" - -OF_ASSUME_NONNULL_BEGIN - -@interface OFDimensionValue: OFValue -{ - of_dimension_t _dimension; -} -@end - -OF_ASSUME_NONNULL_END DELETED src/OFDimensionValue.m Index: src/OFDimensionValue.m ================================================================== --- src/OFDimensionValue.m +++ src/OFDimensionValue.m @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#import "OFDimensionValue.h" -#import "OFMethodSignature.h" -#import "OFString.h" - -#import "OFOutOfRangeException.h" - -@implementation OFDimensionValue -@synthesize dimensionValue = _dimension; - -- (instancetype)initWithDimension: (of_dimension_t)dimension -{ - self = [super init]; - - _dimension = dimension; - - return self; -} - -- (const char *)objCType -{ - return @encode(of_dimension_t); -} - -- (void)getValue: (void *)value size: (size_t)size -{ - if (size != sizeof(_dimension)) - @throw [OFOutOfRangeException exception]; - - memcpy(value, &_dimension, sizeof(_dimension)); -} - -- (OFString *)description -{ - return [OFString stringWithFormat: - @"", - _dimension.width, _dimension.height]; -} -@end Index: src/OFEnumerator.h ================================================================== --- src/OFEnumerator.h +++ src/OFEnumerator.h @@ -44,15 +44,15 @@ * * We need this bad check to see if we already imported Cocoa, which defines * this as well. */ /** - * @struct of_fast_enumeration_state_t OFEnumerator.h ObjFW/OFEnumerator.h + * @struct OFFastEnumerationState OFEnumerator.h ObjFW/OFEnumerator.h * * @brief State information for fast enumerations. */ -#define of_fast_enumeration_state_t NSFastEnumerationState +#define OFFastEnumerationState NSFastEnumerationState #ifndef NSINTEGER_DEFINED typedef struct { /** Arbitrary state information for the enumeration */ unsigned long state; /** Pointer to a C array of objects to return */ @@ -59,11 +59,11 @@ id __unsafe_unretained _Nullable *_Nullable itemsPtr; /** Arbitrary state information to detect mutations */ unsigned long *_Nullable mutationsPtr; /** Additional arbitrary state information */ unsigned long extra[5]; -} of_fast_enumeration_state_t; +} OFFastEnumerationState; #endif /** * @protocol OFFastEnumeration OFEnumerator.h ObjFW/OFEnumerator.h * @@ -81,11 +81,11 @@ * @param objects A pointer to an array where to put the objects * @param count The number of objects that can be stored at objects * @return The number of objects returned in objects or 0 when the enumeration * finished. */ -- (int)countByEnumeratingWithState: (of_fast_enumeration_state_t *)state +- (int)countByEnumeratingWithState: (OFFastEnumerationState *)state objects: (id __unsafe_unretained _Nonnull *_Nonnull) objects count: (int)count; @end Index: src/OFEnumerator.m ================================================================== --- src/OFEnumerator.m +++ src/OFEnumerator.m @@ -55,11 +55,11 @@ objc_autoreleasePoolPop(pool); return ret; } -- (int)countByEnumeratingWithState: (of_fast_enumeration_state_t *)state +- (int)countByEnumeratingWithState: (OFFastEnumerationState *)state objects: (id *)objects count: (int)count { int i; Index: src/OFEpollKernelEventObserver.m ================================================================== --- src/OFEpollKernelEventObserver.m +++ src/OFEpollKernelEventObserver.m @@ -31,13 +31,13 @@ #import "OFNull.h" #import "OFInitializationFailedException.h" #import "OFObserveFailedException.h" -#define EVENTLIST_SIZE 64 +#define eventListSize 64 -static const of_map_table_functions_t mapFunctions = { NULL }; +static const OFMapTableFunctions mapFunctions = { NULL }; @implementation OFEpollKernelEventObserver - (instancetype)init { self = [super init]; @@ -185,20 +185,20 @@ events: EPOLLOUT]; [super removeObjectForWriting: object]; } -- (void)observeForTimeInterval: (of_time_interval_t)timeInterval +- (void)observeForTimeInterval: (OFTimeInterval)timeInterval { OFNull *nullObject = [OFNull null]; - struct epoll_event eventList[EVENTLIST_SIZE]; + struct epoll_event eventList[eventListSize]; int events; if ([self of_processReadBuffers]) return; - events = epoll_wait(_epfd, eventList, EVENTLIST_SIZE, + events = epoll_wait(_epfd, eventList, eventListSize, (timeInterval != -1 ? timeInterval * 1000 : -1)); if (events < 0) @throw [OFObserveFailedException exceptionWithObserver: self errNo: errno]; @@ -207,11 +207,11 @@ if (eventList[i].events & EPOLLIN) { void *pool = objc_autoreleasePoolPush(); if (eventList[i].data.ptr == nullObject) { char buffer; - OF_ENSURE(read(_cancelFD[0], &buffer, 1) == 1); + OFEnsure(read(_cancelFD[0], &buffer, 1) == 1); continue; } if ([_delegate respondsToSelector: @selector(objectIsReadyForReading:)]) Index: src/OFFile.h ================================================================== --- src/OFFile.h +++ src/OFFile.h @@ -16,15 +16,15 @@ #import "OFSeekableStream.h" #import "OFKernelEventObserver.h" #ifndef OF_AMIGAOS # define OF_FILE_HANDLE_IS_FD -# define OF_INVALID_FILE_HANDLE (-1) -typedef int of_file_handle_t; +typedef int OFFileHandle; +static const OFFileHandle OFInvalidFileHandle = -1; #else -# define OF_INVALID_FILE_HANDLE NULL -typedef struct of_file_handle *of_file_handle_t; +typedef struct _OFFileHandle *OFFileHandle; +static const OFFileHandle OFInvalidFileHandle = NULL; #endif OF_ASSUME_NONNULL_BEGIN @class OFURL; @@ -38,11 +38,11 @@ @interface OFFile: OFSeekableStream #ifdef OF_FILE_HANDLE_IS_FD #endif { - of_file_handle_t _handle; + OFFileHandle _handle; bool _atEndOfStream; } /** * @brief Creates a new OFFile with the specified path and mode. @@ -91,11 +91,11 @@ * @param handle A native file handle. If OF_FILE_HANDLE_IS_FD is defined, this * is a file descriptor. The handle is closed when the OFFile * object is deallocated! * @return A new autoreleased OFFile */ -+ (instancetype)fileWithHandle: (of_file_handle_t)handle; ++ (instancetype)fileWithHandle: (OFFileHandle)handle; - (instancetype)init OF_UNAVAILABLE; /** * @brief Initializes an already allocated OFFile. @@ -151,10 +151,9 @@ * @param handle A native file handle. If OF_FILE_HANDLE_IS_FD is defined, this * is a file descriptor. The handle is closed when the OFFile * object is deallocated! * @return An initialized OFFile */ -- (instancetype)initWithHandle: (of_file_handle_t)handle - OF_DESIGNATED_INITIALIZER; +- (instancetype)initWithHandle: (OFFileHandle)handle OF_DESIGNATED_INITIALIZER; @end OF_ASSUME_NONNULL_END Index: src/OFFile.m ================================================================== --- src/OFFile.m +++ src/OFFile.m @@ -77,18 +77,18 @@ #endif #ifndef OF_AMIGAOS # define closeHandle(h) close(h) #else -static struct of_file_handle { - of_file_handle_t previous, next; +static struct _OFFileHandle + struct _OFFileHandle *previous, *next; BPTR handle; bool append; } *firstHandle = NULL; static void -closeHandle(of_file_handle_t handle) +closeHandle(OFFileHandle handle) { Close(handle->handle); if (handle->previous != NULL) handle->previous->next = handle->next; @@ -96,16 +96,16 @@ handle->next->previous = handle->previous; if (firstHandle == handle) firstHandle = handle->next; - free(handle); + OFFreeMemory(handle); } OF_DESTRUCTOR() { - for (of_file_handle_t iter = firstHandle; iter != NULL; + for (OFFileHandle iter = firstHandle; iter != NULL; iter = iter->next) Close(iter->handle); } #endif @@ -190,11 +190,11 @@ + (instancetype)fileWithURL: (OFURL *)URL mode: (OFString *)mode { return [[[self alloc] initWithURL: URL mode: mode] autorelease]; } -+ (instancetype)fileWithHandle: (of_file_handle_t)handle ++ (instancetype)fileWithHandle: (OFFileHandle)handle { return [[[self alloc] initWithHandle: handle] autorelease]; } - (instancetype)init @@ -202,11 +202,11 @@ OF_INVALID_INIT_METHOD } - (instancetype)initWithPath: (OFString *)path mode: (OFString *)mode { - of_file_handle_t handle; + OFFileHandle handle; @try { void *pool = objc_autoreleasePoolPush(); int flags; @@ -236,11 +236,11 @@ @throw [OFOpenItemFailedException exceptionWithPath: path mode: mode errNo: errno]; #else - handle = of_alloc(1, sizeof(*handle)); + handle = OFAllocMemory(1, sizeof(*handle)); @try { if ((flags = parseMode(mode.UTF8String, &handle->append)) == -1) @throw [OFInvalidArgumentException exception]; @@ -298,11 +298,11 @@ if (firstHandle != NULL) firstHandle->previous = handle; firstHandle = handle; } @catch (id e) { - free(handle); + OFFreeMemory(handle); @throw e; } #endif objc_autoreleasePoolPop(pool); @@ -338,11 +338,11 @@ objc_autoreleasePoolPop(pool); return self; } -- (instancetype)initWithHandle: (of_file_handle_t)handle +- (instancetype)initWithHandle: (OFFileHandle)handle { self = [super init]; _handle = handle; @@ -349,21 +349,21 @@ return self; } - (bool)lowlevelIsAtEndOfStream { - if (_handle == OF_INVALID_FILE_HANDLE) + if (_handle == OFInvalidFileHandle) @throw [OFNotOpenException exceptionWithObject: self]; return _atEndOfStream; } - (size_t)lowlevelReadIntoBuffer: (void *)buffer length: (size_t)length { ssize_t ret; - if (_handle == OF_INVALID_FILE_HANDLE) + if (_handle == OFInvalidFileHandle) @throw [OFNotOpenException exceptionWithObject: self]; #if defined(OF_WINDOWS) if (length > UINT_MAX) @throw [OFOutOfRangeException exception]; @@ -393,11 +393,11 @@ return ret; } - (size_t)lowlevelWriteBuffer: (const void *)buffer length: (size_t)length { - if (_handle == OF_INVALID_FILE_HANDLE) + if (_handle == OFInvalidFileHandle) @throw [OFNotOpenException exceptionWithObject: self]; #if defined(OF_WINDOWS) int bytesWritten; @@ -449,15 +449,15 @@ #endif return (size_t)bytesWritten; } -- (of_offset_t)lowlevelSeekToOffset: (of_offset_t)offset whence: (int)whence +- (OFFileOffset)lowlevelSeekToOffset: (OFFileOffset)offset whence: (int)whence { - of_offset_t ret; + OFFileOffset ret; - if (_handle == OF_INVALID_FILE_HANDLE) + if (_handle == OFInvalidFileHandle) @throw [OFNotOpenException exceptionWithObject: self]; #ifndef OF_AMIGAOS # if defined(OF_WINDOWS) ret = _lseeki64(_handle, offset, whence); @@ -523,22 +523,22 @@ } #endif - (void)close { - if (_handle == OF_INVALID_FILE_HANDLE) + if (_handle == OFInvalidFileHandle) @throw [OFNotOpenException exceptionWithObject: self]; closeHandle(_handle); - _handle = OF_INVALID_FILE_HANDLE; + _handle = OFInvalidFileHandle; [super close]; } - (void)dealloc { - if (_handle != OF_INVALID_FILE_HANDLE) + if (_handle != OFInvalidFileHandle) [self close]; [super dealloc]; } @end Index: src/OFFileManager.h ================================================================== --- src/OFFileManager.h +++ src/OFFileManager.h @@ -44,57 +44,57 @@ /** * @brief A key for a file attribute in the file attributes dictionary. * * Possible keys for file URLs are: * - * * @ref of_file_attribute_key_size - * * @ref of_file_attribute_key_type - * * @ref of_file_attribute_key_posix_permissions - * * @ref of_file_attribute_key_posix_uid - * * @ref of_file_attribute_key_posix_gid - * * @ref of_file_attribute_key_owner - * * @ref of_file_attribute_key_group - * * @ref of_file_attribute_key_last_access_date - * * @ref of_file_attribute_key_modification_date - * * @ref of_file_attribute_key_status_change_date - * * @ref of_file_attribute_key_creation_date - * * @ref of_file_attribute_key_symbolic_link_destination + * * @ref OFFileSize + * * @ref OFFileType + * * @ref OFFilePOSIXPermissions + * * @ref OFFileOwnerAccountID + * * @ref OFFileGroupOwnerAccountID + * * @ref OFFileOwnerAccountName + * * @ref OFFileGroupOwnerAccountName + * * @ref OFFileLastAccessDate + * * @ref OFFileModificationDate + * * @ref OFFileStatusChangeDate + * * @ref OFFileCreationDate + * * @ref OFFileSymbolicLinkDestination * * Other URL schemes might not have all keys and might have keys not listed. */ -typedef OFConstantString *of_file_attribute_key_t; +typedef OFConstantString *OFFileAttributeKey; /** * @brief The type of a file. * * Possibles values for file URLs are: * - * * @ref of_file_type_regular - * * @ref of_file_type_directory - * * @ref of_file_type_symbolic_link - * * @ref of_file_type_fifo - * * @ref of_file_type_character_special - * * @ref of_file_type_block_special - * * @ref of_file_type_socket + * * @ref OFFileTypeRegular + * * @ref OFFileTypeDirectory + * * @ref OFFileTypeSymbolicLink + * * @ref OFFileTypeFIFO + * * @ref OFFileTypeCharacterSpecial + * * @ref OFFileTypeBlockSpecial + * * @ref OFFileTypeSocket + * * @ref OFFileTypeUnknown * * Other URL schemes might not have all types and might have types not listed. */ -typedef OFConstantString *of_file_type_t; - -/** - * @brief A dictionary mapping keys of type @ref of_file_attribute_key_t - * to their attribute values. - */ -typedef OFDictionary OF_GENERIC(of_file_attribute_key_t, id) - *of_file_attributes_t; - -/** - * @brief A mutable dictionary mapping keys of type - * @ref of_file_attribute_key_t to their attribute values. - */ -typedef OFMutableDictionary OF_GENERIC(of_file_attribute_key_t, id) - *of_mutable_file_attributes_t; +typedef OFConstantString *OFFileAttributeType; + +/** + * @brief A dictionary mapping keys of type @ref OFFileAttributeKey to their + * attribute values. + */ +typedef OFDictionary OF_GENERIC(OFFileAttributeKey, id) *OFFileAttributes; + +/** + * @brief A mutable dictionary mapping keys of type @ref OFFileAttributeKey to + * their attribute values. + */ +typedef OFMutableDictionary OF_GENERIC(OFFileAttributeKey, id) + *OFMutableFileAttributes; #ifdef __cplusplus extern "C" { #endif /** @@ -101,137 +101,145 @@ * @brief The size of the file as an @ref OFNumber. * * For convenience, a category on @ref OFDictionary is provided to access this * via @ref OFDictionary#fileSize. */ -extern const of_file_attribute_key_t of_file_attribute_key_size; +extern const OFFileAttributeKey OFFileSize; /** * @brief The type of the file. * - * The corresponding value is of type @ref of_file_type_t. + * The corresponding value is of type @ref OFFileAttributeType. * * For convenience, a category on @ref OFDictionary is provided to access this * via @ref OFDictionary#fileType. */ -extern const of_file_attribute_key_t of_file_attribute_key_type; +extern const OFFileAttributeKey OFFileType; /** * @brief The POSIX permissions of the file as an @ref OFNumber. * * For convenience, a category on @ref OFDictionary is provided to access this * via @ref OFDictionary#filePOSIXPermissions. */ -extern const of_file_attribute_key_t of_file_attribute_key_posix_permissions; - -/** - * @brief The POSIX UID of the file as an @ref OFNumber. - * - * For convenience, a category on @ref OFDictionary is provided to access this - * via @ref OFDictionary#filePOSIXUID. - */ -extern const of_file_attribute_key_t of_file_attribute_key_posix_uid; - -/** - * @brief The POSIX GID of the file as an @ref OFNumber. - * - * For convenience, a category on @ref OFDictionary is provided to access this - * via @ref OFDictionary#filePOSIXGID. - */ -extern const of_file_attribute_key_t of_file_attribute_key_posix_gid; - -/** - * @brief The owner of the file as an OFString. - * - * For convenience, a category on @ref OFDictionary is provided to access this - * via @ref OFDictionary#fileOwner. - */ -extern const of_file_attribute_key_t of_file_attribute_key_owner; - -/** - * @brief The group of the file as an OFString. - * - * For convenience, a category on @ref OFDictionary is provided to access this - * via @ref OFDictionary#fileGroup. - */ -extern const of_file_attribute_key_t of_file_attribute_key_group; +extern const OFFileAttributeKey OFFilePOSIXPermissions; + +/** + * @brief The account ID of the owner of the file as an @ref OFNumber. + * + * For convenience, a category on @ref OFDictionary is provided to access this + * via @ref OFDictionary#fileOwnerAccountID. + */ +extern const OFFileAttributeKey OFFileOwnerAccountID; + +/** + * @brief The account ID of the group owner of the file as an @ref OFNumber. + * + * For convenience, a category on @ref OFDictionary is provided to access this + * via @ref OFDictionary#fileGroupOwnerAccountID. + */ +extern const OFFileAttributeKey OFFileGroupOwnerAccountID; + +/** + * @brief The account name of the owner of the file as an OFString. + * + * For convenience, a category on @ref OFDictionary is provided to access this + * via @ref OFDictionary#fileOwnerAccountName. + */ +extern const OFFileAttributeKey OFFileOwnerAccountName; + +/** + * @brief The account name of the group owner of the file as an OFString. + * + * For convenience, a category on @ref OFDictionary is provided to access this + * via @ref OFDictionary#fileGroupOwnerAccountName. + */ +extern const OFFileAttributeKey OFFileGroupOwnerAccountName; /** * @brief The last access date of the file as an @ref OFDate. * * For convenience, a category on @ref OFDictionary is provided to access this * via @ref OFDictionary#fileLastAccessDate. */ -extern const of_file_attribute_key_t of_file_attribute_key_last_access_date; +extern const OFFileAttributeKey OFFileLastAccessDate; /** * @brief The last modification date of the file as an @ref OFDate. * * For convenience, a category on @ref OFDictionary is provided to access this * via @ref OFDictionary#fileModificationDate. */ -extern const of_file_attribute_key_t of_file_attribute_key_modification_date; +extern const OFFileAttributeKey OFFileModificationDate; /** * @brief The last status change date of the file as an @ref OFDate. * * For convenience, a category on @ref OFDictionary is provided to access this * via @ref OFDictionary#fileStatusChangeDate. */ -extern const of_file_attribute_key_t of_file_attribute_key_status_change_date; +extern const OFFileAttributeKey OFFileStatusChangeDate; /** * @brief The creation date of the file as an @ref OFDate. * * For convenience, a category on @ref OFDictionary is provided to access this * via @ref OFDictionary#fileCreationDate. */ -extern const of_file_attribute_key_t of_file_attribute_key_creation_date; +extern const OFFileAttributeKey OFFileCreationDate; /** * @brief The destination of a symbolic link as an OFString. * * For convenience, a category on @ref OFDictionary is provided to access this * via @ref OFDictionary#fileSymbolicLinkDestination. */ -extern const of_file_attribute_key_t - of_file_attribute_key_symbolic_link_destination; +extern const OFFileAttributeKey OFFileSymbolicLinkDestination; /** * @brief A regular file. */ -extern const of_file_type_t of_file_type_regular; +extern const OFFileAttributeType OFFileTypeRegular; /** * @brief A directory. */ -extern const of_file_type_t of_file_type_directory; +extern const OFFileAttributeType OFFileTypeDirectory; /** * @brief A symbolic link. */ -extern const of_file_type_t of_file_type_symbolic_link; +extern const OFFileAttributeType OFFileTypeSymbolicLink; /** * @brief A FIFO. */ -extern const of_file_type_t of_file_type_fifo; +extern const OFFileAttributeType OFFileTypeFIFO; /** * @brief A character special file. */ -extern const of_file_type_t of_file_type_character_special; +extern const OFFileAttributeType OFFileTypeCharacterSpecial; /** * @brief A block special file. */ -extern const of_file_type_t of_file_type_block_special; +extern const OFFileAttributeType OFFileTypeBlockSpecial; /** * @brief A socket. */ -extern const of_file_type_t of_file_type_socket; +extern const OFFileAttributeType OFFileTypeSocket; + +/** + * @brief An unknown file type. + * + * This is different from not having an @ref OFFileType at all in that it means + * that retrieving file types is supported, but the particular file type is + * unknown. + */ +extern const OFFileAttributeType OFFileTypeUnknown; #ifdef __cplusplus } #endif /** @@ -269,23 +277,23 @@ /** * @brief Returns the attributes for the item at the specified path. * * @param path The path to return the attributes for * @return A dictionary of attributes for the specified path, with the keys of - * type @ref of_file_attribute_key_t + * type @ref OFFileAttributeKey */ -- (of_file_attributes_t)attributesOfItemAtPath: (OFString *)path; +- (OFFileAttributes)attributesOfItemAtPath: (OFString *)path; #endif /** * @brief Returns the attributes for the item at the specified URL. * * @param URL The URL to return the attributes for * @return A dictionary of attributes for the specified URL, with the keys of - * type @ref of_file_attribute_key_t + * type @ref OFFileAttributeKey */ -- (of_file_attributes_t)attributesOfItemAtURL: (OFURL *)URL; +- (OFFileAttributes)attributesOfItemAtURL: (OFURL *)URL; #ifdef OF_HAVE_FILES /** * @brief Sets the attributes for the item at the specified path. * @@ -292,11 +300,11 @@ * All attributes not part of the dictionary are left unchanged. * * @param attributes The attributes to set for the specified path * @param path The path of the item to set the attributes for */ -- (void)setAttributes: (of_file_attributes_t)attributes +- (void)setAttributes: (OFFileAttributes)attributes ofItemAtPath: (OFString *)path; #endif /** * @brief Sets the attributes for the item at the specified URL. @@ -304,12 +312,11 @@ * All attributes not part of the dictionary are left unchanged. * * @param attributes The attributes to set for the specified URL * @param URL The URL of the item to set the attributes for */ -- (void)setAttributes: (of_file_attributes_t)attributes - ofItemAtURL: (OFURL *)URL; +- (void)setAttributes: (OFFileAttributes)attributes ofItemAtURL: (OFURL *)URL; #ifdef OF_HAVE_FILES /** * @brief Checks whether a file exists at the specified path. * @@ -564,95 +571,90 @@ withDestinationPath: (OFString *)target; @end @interface OFDictionary (FileAttributes) /** - * @brief The @ref of_file_attribute_key_size key from the dictionary. + * @brief The @ref OFFileSize key from the dictionary. * * Raises an @ref OFUndefinedKeyException if the key is missing. */ @property (readonly, nonatomic) unsigned long long fileSize; /** - * @brief The @ref of_file_attribute_key_type key from the dictionary. + * @brief The @ref OFFileType key from the dictionary. * * Raises an @ref OFUndefinedKeyException if the key is missing. */ -@property (readonly, nonatomic) of_file_type_t fileType; +@property (readonly, nonatomic) OFFileAttributeType fileType; /** - * @brief The @ref of_file_attribute_key_posix_permissions key from the - * dictionary. + * @brief The @ref OFFilePOSIXPermissions key from the dictionary. * * Raises an @ref OFUndefinedKeyException if the key is missing. */ @property (readonly, nonatomic) unsigned long filePOSIXPermissions; /** - * @brief The @ref of_file_attribute_key_posix_uid key from the dictionary. - * - * Raises an @ref OFUndefinedKeyException if the key is missing. - */ -@property (readonly, nonatomic) unsigned long filePOSIXUID; - -/** - * @brief The @ref of_file_attribute_key_posix_gid key from the dictionary. - * - * Raises an @ref OFUndefinedKeyException if the key is missing. - */ -@property (readonly, nonatomic) unsigned long filePOSIXGID; - -/** - * @brief The @ref of_file_attribute_key_owner key from the dictionary. - * - * Raises an @ref OFUndefinedKeyException if the key is missing. - */ -@property (readonly, nonatomic) OFString *fileOwner; - -/** - * @brief The @ref of_file_attribute_key_group key from the dictionary. - * - * Raises an @ref OFUndefinedKeyException if the key is missing. - */ -@property (readonly, nonatomic) OFString *fileGroup; - -/** - * @brief The @ref of_file_attribute_key_last_access_date key from the - * dictionary. + * @brief The @ref OFFileOwnerAccountID key from the dictionary. + * + * Raises an @ref OFUndefinedKeyException if the key is missing. + */ +@property (readonly, nonatomic) unsigned long fileOwnerAccountID; + +/** + * @brief The @ref OFFileGroupOwnerAccountID key from the dictionary. + * + * Raises an @ref OFUndefinedKeyException if the key is missing. + */ +@property (readonly, nonatomic) unsigned long fileGroupOwnerAccountID; + +/** + * @brief The @ref OFFileOwnerAccountName key from the dictionary. + * + * Raises an @ref OFUndefinedKeyException if the key is missing. + */ +@property (readonly, nonatomic) OFString *fileOwnerAccountName; + +/** + * @brief The @ref OFFileGroupOwnerAccountName key from the dictionary. + * + * Raises an @ref OFUndefinedKeyException if the key is missing. + */ +@property (readonly, nonatomic) OFString *fileGroupOwnerAccountName; + +/** + * @brief The @ref OFFileLastAccessDate key from the dictionary. * * Raises an @ref OFUndefinedKeyException if the key is missing. */ @property (readonly, nonatomic) OFDate *fileLastAccessDate; /** - * @brief The @ref of_file_attribute_key_modification_date key from the - * dictionary. + * @brief The @ref OFFileModificationDate key from the dictionary. * * Raises an @ref OFUndefinedKeyException if the key is missing. */ @property (readonly, nonatomic) OFDate *fileModificationDate; /** - * @brief The @ref of_file_attribute_key_status_change_date key from the - * dictionary. + * @brief The @ref OFFileStatusChangeDate key from the dictionary. * * Raises an @ref OFUndefinedKeyException if the key is missing. */ @property (readonly, nonatomic) OFDate *fileStatusChangeDate; /** - * @brief The @ref of_file_attribute_key_creation_date key from the dictionary. + * @brief The @ref OFFileCreationDate key from the dictionary. * * Raises an @ref OFUndefinedKeyException if the key is missing. */ @property (readonly, nonatomic) OFDate *fileCreationDate; /** - * @brief The @ref of_file_attribute_key_symbolic_link_destination key from the - * dictionary. + * @brief The @ref OFFileSymbolicLinkDestination key from the dictionary. * * Raises an @ref OFUndefinedKeyException if the key is missing. */ @property (readonly, nonatomic) OFString *fileSymbolicLinkDestination; @end OF_ASSUME_NONNULL_END Index: src/OFFileManager.m ================================================================== --- src/OFFileManager.m +++ src/OFFileManager.m @@ -69,43 +69,35 @@ #endif @interface OFDefaultFileManager: OFFileManager @end -const of_file_attribute_key_t of_file_attribute_key_size = - @"of_file_attribute_key_size"; -const of_file_attribute_key_t of_file_attribute_key_type = - @"of_file_attribute_key_type"; -const of_file_attribute_key_t of_file_attribute_key_posix_permissions = - @"of_file_attribute_key_posix_permissions"; -const of_file_attribute_key_t of_file_attribute_key_posix_uid = - @"of_file_attribute_key_posix_uid"; -const of_file_attribute_key_t of_file_attribute_key_posix_gid = - @"of_file_attribute_key_posix_gid"; -const of_file_attribute_key_t of_file_attribute_key_owner = - @"of_file_attribute_key_owner"; -const of_file_attribute_key_t of_file_attribute_key_group = - @"of_file_attribute_key_group"; -const of_file_attribute_key_t of_file_attribute_key_last_access_date = - @"of_file_attribute_key_last_access_date"; -const of_file_attribute_key_t of_file_attribute_key_modification_date = - @"of_file_attribute_key_modification_date"; -const of_file_attribute_key_t of_file_attribute_key_status_change_date = - @"of_file_attribute_key_status_change_date"; -const of_file_attribute_key_t of_file_attribute_key_creation_date = - @"of_file_attribute_key_creation_date"; -const of_file_attribute_key_t of_file_attribute_key_symbolic_link_destination = - @"of_file_attribute_key_symbolic_link_destination"; - -const of_file_type_t of_file_type_regular = @"of_file_type_regular"; -const of_file_type_t of_file_type_directory = @"of_file_type_directory"; -const of_file_type_t of_file_type_symbolic_link = @"of_file_type_symbolic_link"; -const of_file_type_t of_file_type_fifo = @"of_file_type_fifo"; -const of_file_type_t of_file_type_character_special = - @"of_file_type_character_special"; -const of_file_type_t of_file_type_block_special = @"of_file_type_block_special"; -const of_file_type_t of_file_type_socket = @"of_file_type_socket"; +const OFFileAttributeKey OFFileSize = @"OFFileSize"; +const OFFileAttributeKey OFFileType = @"OFFileType"; +const OFFileAttributeKey OFFilePOSIXPermissions = @"OFFilePOSIXPermissions"; +const OFFileAttributeKey OFFileOwnerAccountID = @"OFFileOwnerAccountID"; +const OFFileAttributeKey OFFileGroupOwnerAccountID = + @"OFFileGroupOwnerAccountID"; +const OFFileAttributeKey OFFileOwnerAccountName = @"OFFileOwnerAccountName"; +const OFFileAttributeKey OFFileGroupOwnerAccountName = + @"OFFileGroupOwnerAccountName"; +const OFFileAttributeKey OFFileLastAccessDate = @"OFFileLastAccessDate"; +const OFFileAttributeKey OFFileModificationDate = @"OFFileModificationDate"; +const OFFileAttributeKey OFFileStatusChangeDate = @"OFFileStatusChangeDate"; +const OFFileAttributeKey OFFileCreationDate = @"OFFileCreationDate"; +const OFFileAttributeKey OFFileSymbolicLinkDestination = + @"OFFileSymbolicLinkDestination"; + +const OFFileAttributeType OFFileTypeRegular = @"OFFileTypeRegular"; +const OFFileAttributeType OFFileTypeDirectory = @"OFFileTypeDirectory"; +const OFFileAttributeType OFFileTypeSymbolicLink = @"OFFileTypeSymbolicLink"; +const OFFileAttributeType OFFileTypeFIFO = @"OFFileTypeFIFO"; +const OFFileAttributeType OFFileTypeCharacterSpecial = + @"OFFileTypeCharacterSpecial"; +const OFFileAttributeType OFFileTypeBlockSpecial = @"OFFileTypeBlockSpecial"; +const OFFileAttributeType OFFileTypeSocket = @"OFFileTypeSocket"; +const OFFileAttributeType OFFileTypeUnknown = @"OFFileTypeUnknown"; #ifdef OF_AMIGAOS4 # define CurrentDir(lock) SetCurrentDir(lock) #endif @@ -121,12 +113,11 @@ UnLock(CurrentDir(originalDirLock)); } #endif static id -attributeForKeyOrException(of_file_attributes_t attributes, - of_file_attribute_key_t key) +attributeForKeyOrException(OFFileAttributes attributes, OFFileAttributeKey key) { id object = [attributes objectForKey: key]; if (object == nil) @throw [OFUndefinedKeyException exceptionWithObject: attributes @@ -229,11 +220,11 @@ objc_autoreleasePoolPop(pool); return [ret autorelease]; } #endif -- (of_file_attributes_t)attributesOfItemAtURL: (OFURL *)URL +- (OFFileAttributes)attributesOfItemAtURL: (OFURL *)URL { OFURLHandler *URLHandler; if (URL == nil) @throw [OFInvalidArgumentException exception]; @@ -243,14 +234,14 @@ return [URLHandler attributesOfItemAtURL: URL]; } #ifdef OF_HAVE_FILES -- (of_file_attributes_t)attributesOfItemAtPath: (OFString *)path +- (OFFileAttributes)attributesOfItemAtPath: (OFString *)path { void *pool = objc_autoreleasePoolPush(); - of_file_attributes_t ret; + OFFileAttributes ret; ret = [self attributesOfItemAtURL: [OFURL fileURLWithPath: path]]; [ret retain]; @@ -258,12 +249,11 @@ return [ret autorelease]; } #endif -- (void)setAttributes: (of_file_attributes_t)attributes - ofItemAtURL: (OFURL *)URL +- (void)setAttributes: (OFFileAttributes)attributes ofItemAtURL: (OFURL *)URL { OFURLHandler *URLHandler; if (URL == nil) @throw [OFInvalidArgumentException exception]; @@ -273,11 +263,11 @@ [URLHandler setAttributes: attributes ofItemAtURL: URL]; } #ifdef OF_HAVE_FILES -- (void)setAttributes: (of_file_attributes_t)attributes +- (void)setAttributes: (OFFileAttributes)attributes ofItemAtPath: (OFString *)path { void *pool = objc_autoreleasePoolPush(); [self setAttributes: attributes ofItemAtURL: [OFURL fileURLWithPath: path]]; @@ -567,12 +557,12 @@ - (void)copyItemAtURL: (OFURL *)source toURL: (OFURL *)destination { void *pool; OFURLHandler *URLHandler; - of_file_attributes_t attributes; - of_file_type_t type; + OFFileAttributes attributes; + OFFileAttributeType type; if (source == nil || destination == nil) @throw [OFInvalidArgumentException exception]; pool = objc_autoreleasePoolPush(); @@ -599,22 +589,21 @@ errNo: e.errNo]; } type = attributes.fileType; - if ([type isEqual: of_file_type_directory]) { + if ([type isEqual: OFFileTypeDirectory]) { OFArray OF_GENERIC(OFURL *) *contents; @try { [self createDirectoryAtURL: destination]; @try { - of_file_attribute_key_t key = - of_file_attribute_key_posix_permissions; + OFFileAttributeKey key = OFFilePOSIXPermissions; OFNumber *permissions = [attributes objectForKey: key]; - of_file_attributes_t destinationAttributes; + OFFileAttributes destinationAttributes; if (permissions != nil) { destinationAttributes = [OFDictionary dictionaryWithObject: permissions forKey: key]; @@ -650,17 +639,17 @@ [self copyItemAtURL: item toURL: destinationURL]; objc_autoreleasePoolPop(pool2); } - } else if ([type isEqual: of_file_type_regular]) { + } else if ([type isEqual: OFFileTypeRegular]) { size_t pageSize = [OFSystemInfo pageSize]; OFStream *sourceStream = nil; OFStream *destinationStream = nil; char *buffer; - buffer = of_alloc(1, pageSize); + buffer = OFAllocMemory(1, pageSize); @try { sourceStream = [[OFURLHandler handlerForURL: source] openItemAtURL: source mode: @"r"]; destinationStream = [[OFURLHandler handlerForURL: @@ -676,15 +665,14 @@ [destinationStream writeBuffer: buffer length: length]; } @try { - of_file_attribute_key_t key = - of_file_attribute_key_posix_permissions; + OFFileAttributeKey key = OFFilePOSIXPermissions; OFNumber *permissions = [attributes objectForKey: key]; - of_file_attributes_t destinationAttributes; + OFFileAttributes destinationAttributes; if (permissions != nil) { destinationAttributes = [OFDictionary dictionaryWithObject: permissions forKey: key]; @@ -709,13 +697,13 @@ @throw e; } @finally { [sourceStream close]; [destinationStream close]; - free(buffer); + OFFreeMemory(buffer); } - } else if ([type isEqual: of_file_type_symbolic_link]) { + } else if ([type isEqual: OFFileTypeSymbolicLink]) { @try { OFString *linkDestination = attributes.fileSymbolicLinkDestination; [self createSymbolicLinkAtURL: destination @@ -905,79 +893,74 @@ { } - (unsigned int)retainCount { - return OF_RETAIN_COUNT_MAX; + return OFMaxRetainCount; } @end @implementation OFDictionary (FileAttributes) - (unsigned long long)fileSize { - return [attributeForKeyOrException(self, of_file_attribute_key_size) + return [attributeForKeyOrException(self, OFFileSize) unsignedLongLongValue]; } -- (of_file_type_t)fileType +- (OFFileAttributeType)fileType { - return attributeForKeyOrException(self, of_file_attribute_key_type); + return attributeForKeyOrException(self, OFFileType); } - (unsigned long)filePOSIXPermissions { return [attributeForKeyOrException(self, - of_file_attribute_key_posix_permissions) unsignedLongValue]; -} - -- (unsigned long)filePOSIXUID -{ - return [attributeForKeyOrException(self, - of_file_attribute_key_posix_uid) unsignedLongValue]; -} - -- (unsigned long)filePOSIXGID -{ - return [attributeForKeyOrException(self, - of_file_attribute_key_posix_gid) unsignedLongValue]; -} - -- (OFString *)fileOwner -{ - return attributeForKeyOrException(self, of_file_attribute_key_owner); -} - -- (OFString *)fileGroup -{ - return attributeForKeyOrException(self, of_file_attribute_key_group); + OFFilePOSIXPermissions) unsignedLongValue]; +} + +- (unsigned long)fileOwnerAccountID +{ + return [attributeForKeyOrException(self, + OFFileOwnerAccountID) unsignedLongValue]; +} + +- (unsigned long)fileGroupOwnerAccountID +{ + return [attributeForKeyOrException(self, + OFFileGroupOwnerAccountID) unsignedLongValue]; +} + +- (OFString *)fileOwnerAccountName +{ + return attributeForKeyOrException(self, OFFileOwnerAccountName); +} + +- (OFString *)fileGroupOwnerAccountName +{ + return attributeForKeyOrException(self, OFFileGroupOwnerAccountName); } - (OFDate *)fileLastAccessDate { - return attributeForKeyOrException(self, - of_file_attribute_key_last_access_date); + return attributeForKeyOrException(self, OFFileLastAccessDate); } - (OFDate *)fileModificationDate { - return attributeForKeyOrException(self, - of_file_attribute_key_modification_date); + return attributeForKeyOrException(self, OFFileModificationDate); } - (OFDate *)fileStatusChangeDate { - return attributeForKeyOrException(self, - of_file_attribute_key_status_change_date); + return attributeForKeyOrException(self, OFFileStatusChangeDate); } - (OFDate *)fileCreationDate { - return attributeForKeyOrException(self, - of_file_attribute_key_creation_date); + return attributeForKeyOrException(self, OFFileCreationDate); } - (OFString *)fileSymbolicLinkDestination { - return attributeForKeyOrException(self, - of_file_attribute_key_symbolic_link_destination); + return attributeForKeyOrException(self, OFFileSymbolicLinkDestination); } @end Index: src/OFFileURLHandler.m ================================================================== --- src/OFFileURLHandler.m +++ src/OFFileURLHandler.m @@ -85,23 +85,23 @@ # endif #endif #if defined(OF_WINDOWS) || defined(OF_AMIGAOS) typedef struct { - of_offset_t st_size; + OFFileOffset st_size; unsigned int st_mode; - of_time_interval_t st_atime, st_mtime, st_ctime; + OFTimeInterval st_atime, st_mtime, st_ctime; # ifdef OF_WINDOWS # define HAVE_STRUCT_STAT_ST_BIRTHTIME - of_time_interval_t st_birthtime; + OFTimeInterval st_birthtime; DWORD fileAttributes; # endif -} of_stat_t; +} Stat; #elif defined(HAVE_STAT64) -typedef struct stat64 of_stat_t; +typedef struct stat64 Stat; #else -typedef struct stat of_stat_t; +typedef struct stat Stat; #endif #ifdef OF_WINDOWS # define S_IFLNK 0x10000 # define S_ISLNK(mode) (mode & S_IFLNK) @@ -125,18 +125,18 @@ [readdirMutex release]; } #endif #ifdef OF_WINDOWS -static int (*func__wutime64)(const wchar_t *, struct __utimbuf64 *); -static WINAPI BOOLEAN (*func_CreateSymbolicLinkW)(LPCWSTR, LPCWSTR, DWORD); -static WINAPI BOOLEAN (*func_CreateHardLinkW)(LPCWSTR, LPCWSTR, +static int (*_wutime64FuncPtr)(const wchar_t *, struct __utimbuf64 *); +static WINAPI BOOLEAN (*createSymbolicLinkWFuncPtr)(LPCWSTR, LPCWSTR, DWORD); +static WINAPI BOOLEAN (*createHardLinkWFuncPtr)(LPCWSTR, LPCWSTR, LPSECURITY_ATTRIBUTES); #endif #ifdef OF_WINDOWS -static of_time_interval_t +static OFTimeInterval filetimeToTimeInterval(const FILETIME *filetime) { return (double)((int64_t)filetime->dwHighDateTime << 32 | filetime->dwLowDateTime) / 10000000.0 - 11644473600.0; } @@ -194,11 +194,11 @@ } } #endif static int -of_stat(OFString *path, of_stat_t *buffer) +statWrapper(OFString *path, Stat *buffer) { #if defined(OF_WINDOWS) WIN32_FILE_ATTRIBUTE_DATA data; bool success; @@ -260,11 +260,11 @@ # ifdef OF_AMIGAOS4 struct ExamineData *ed; # else struct FileInfoBlock fib; # endif - of_time_interval_t timeInterval; + OFTimeInterval timeInterval; struct Locale *locale; struct DateStamp *date; if ((lock = Lock([path cStringWithEncoding: [OFLocale encoding]], SHARED_LOCK)) == 0) @@ -313,11 +313,11 @@ # else date = &fib.fib_Date; # endif timeInterval += date->ds_Days * 86400.0; timeInterval += date->ds_Minute * 60.0; - timeInterval += date->ds_Tick / (of_time_interval_t)TICKS_PER_SECOND; + timeInterval += date->ds_Tick / (OFTimeInterval)TICKS_PER_SECOND; buffer->st_atime = buffer->st_mtime = buffer->st_ctime = timeInterval; # ifdef OF_AMIGAOS4 FreeDosObject(DOS_EXAMINEDATA, ed); @@ -337,11 +337,11 @@ return 0; #endif } static int -of_lstat(OFString *path, of_stat_t *buffer) +lstatWrapper(OFString *path, Stat *buffer) { #if defined(HAVE_LSTAT) && !defined(OF_WINDOWS) && !defined(OF_AMIGAOS) && \ !defined(OF_NINTENDO_3DS) && !defined(OF_WII) # ifdef HAVE_LSTAT64 if (lstat64([path cStringWithEncoding: [OFLocale encoding]], @@ -352,104 +352,101 @@ return errno; # endif return 0; #else - return of_stat(path, buffer); + return statWrapper(path, buffer); #endif } static void -setTypeAttribute(of_mutable_file_attributes_t attributes, of_stat_t *s) +setTypeAttribute(OFMutableFileAttributes attributes, Stat *s) { if (S_ISREG(s->st_mode)) - [attributes setObject: of_file_type_regular - forKey: of_file_attribute_key_type]; + [attributes setObject: OFFileTypeRegular forKey: OFFileType]; else if (S_ISDIR(s->st_mode)) - [attributes setObject: of_file_type_directory - forKey: of_file_attribute_key_type]; + [attributes setObject: OFFileTypeDirectory forKey: OFFileType]; #ifdef S_ISLNK else if (S_ISLNK(s->st_mode)) - [attributes setObject: of_file_type_symbolic_link - forKey: of_file_attribute_key_type]; + [attributes setObject: OFFileTypeSymbolicLink + forKey: OFFileType]; #endif #ifdef S_ISFIFO else if (S_ISFIFO(s->st_mode)) - [attributes setObject: of_file_type_fifo - forKey: of_file_attribute_key_type]; + [attributes setObject: OFFileTypeFIFO forKey: OFFileType]; #endif #ifdef S_ISCHR else if (S_ISCHR(s->st_mode)) - [attributes setObject: of_file_type_character_special - forKey: of_file_attribute_key_type]; + [attributes setObject: OFFileTypeCharacterSpecial + forKey: OFFileType]; #endif #ifdef S_ISBLK else if (S_ISBLK(s->st_mode)) - [attributes setObject: of_file_type_block_special - forKey: of_file_attribute_key_type]; + [attributes setObject: OFFileTypeBlockSpecial + forKey: OFFileType]; #endif #ifdef S_ISSOCK else if (S_ISSOCK(s->st_mode)) - [attributes setObject: of_file_type_socket - forKey: of_file_attribute_key_type]; + [attributes setObject: OFFileTypeSocket forKey: OFFileType]; #endif + else + [attributes setObject: OFFileTypeUnknown forKey: OFFileType]; } static void -setDateAttributes(of_mutable_file_attributes_t attributes, of_stat_t *s) +setDateAttributes(OFMutableFileAttributes attributes, Stat *s) { /* FIXME: We could be more precise on some OSes */ [attributes setObject: [OFDate dateWithTimeIntervalSince1970: s->st_atime] - forKey: of_file_attribute_key_last_access_date]; + forKey: OFFileLastAccessDate]; [attributes setObject: [OFDate dateWithTimeIntervalSince1970: s->st_mtime] - forKey: of_file_attribute_key_modification_date]; + forKey: OFFileModificationDate]; [attributes setObject: [OFDate dateWithTimeIntervalSince1970: s->st_ctime] - forKey: of_file_attribute_key_status_change_date]; + forKey: OFFileStatusChangeDate]; #ifdef HAVE_STRUCT_STAT_ST_BIRTHTIME [attributes setObject: [OFDate dateWithTimeIntervalSince1970: s->st_birthtime] - forKey: of_file_attribute_key_creation_date]; + forKey: OFFileCreationDate]; #endif } static void -setOwnerAndGroupAttributes(of_mutable_file_attributes_t attributes, - of_stat_t *s) +setOwnerAndGroupAttributes(OFMutableFileAttributes attributes, Stat *s) { #ifdef OF_FILE_MANAGER_SUPPORTS_OWNER [attributes setObject: [NSNumber numberWithUnsignedLong: s->st_uid] - forKey: of_file_attribute_key_posix_uid]; + forKey: OFFileOwnerAccountID]; [attributes setObject: [NSNumber numberWithUnsignedLong: s->st_gid] - forKey: of_file_attribute_key_posix_gid]; + forKey: OFFileGroupOwnerAccountID]; # ifdef OF_HAVE_THREADS [passwdMutex lock]; @try { # endif - of_string_encoding_t encoding = [OFLocale encoding]; + OFStringEncoding encoding = [OFLocale encoding]; struct passwd *passwd = getpwuid(s->st_uid); struct group *group_ = getgrgid(s->st_gid); if (passwd != NULL) { OFString *owner = [OFString stringWithCString: passwd->pw_name encoding: encoding]; [attributes setObject: owner - forKey: of_file_attribute_key_owner]; + forKey: OFFileOwnerAccountName]; } if (group_ != NULL) { OFString *group = [OFString stringWithCString: group_->gr_name encoding: encoding]; [attributes setObject: group - forKey: of_file_attribute_key_group]; + forKey: OFFileGroupOwnerAccountName]; } # ifdef OF_HAVE_THREADS } @finally { [passwdMutex unlock]; } @@ -457,20 +454,19 @@ #endif } #ifdef OF_FILE_MANAGER_SUPPORTS_SYMLINKS static void -setSymbolicLinkDestinationAttribute(of_mutable_file_attributes_t attributes, +setSymbolicLinkDestinationAttribute(OFMutableFileAttributes attributes, OFURL *URL) { OFString *path = URL.fileSystemRepresentation; # ifndef OF_WINDOWS - of_string_encoding_t encoding = [OFLocale encoding]; + OFStringEncoding encoding = [OFLocale encoding]; char destinationC[PATH_MAX]; ssize_t length; OFString *destination; - of_file_attribute_key_t key; length = readlink([path cStringWithEncoding: encoding], destinationC, PATH_MAX); if (length < 0) @@ -480,17 +476,17 @@ destination = [OFString stringWithCString: destinationC encoding: encoding length: length]; - key = of_file_attribute_key_symbolic_link_destination; - [attributes setObject: destination forKey: key]; + [attributes setObject: destination + forKey: OFFileSymbolicLinkDestination]; # else HANDLE handle; OFString *destination; - if (func_CreateSymbolicLinkW == NULL) + if (createSymbolicLinkWFuncPtr == NULL) return; if ((handle = CreateFileW(path.UTF16String, 0, (FILE_SHARE_READ | FILE_SHARE_WRITE), NULL, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT, NULL)) == INVALID_HANDLE_VALUE) @@ -503,11 +499,10 @@ char bytes[MAXIMUM_REPARSE_DATA_BUFFER_SIZE]; REPARSE_DATA_BUFFER data; } buffer; DWORD size; wchar_t *tmp; - of_file_attribute_key_t key; if (!DeviceIoControl(handle, FSCTL_GET_REPARSE_POINT, NULL, 0, buffer.bytes, MAXIMUM_REPARSE_DATA_BUFFER_SIZE, &size, NULL)) @throw [OFRetrieveItemAttributesFailedException @@ -526,14 +521,14 @@ destination = [OFString stringWithUTF16String: tmp length: slrb.SubstituteNameLength / sizeof(wchar_t)]; - [attributes setObject: of_file_type_symbolic_link - forKey: of_file_attribute_key_type]; - key = of_file_attribute_key_symbolic_link_destination; - [attributes setObject: destination forKey: key]; + [attributes setObject: OFFileTypeSymbolicLink + forKey: OFFileType]; + [attributes setObject: destination + forKey: OFFileSymbolicLinkDestination]; # undef slrb } @finally { CloseHandle(handle); } # endif @@ -559,18 +554,18 @@ atexit(releaseReaddirMutex); #endif #ifdef OF_WINDOWS if ((module = LoadLibrary("msvcrt.dll")) != NULL) - func__wutime64 = (int (*)(const wchar_t *, + _wutime64FuncPtr = (int (*)(const wchar_t *, struct __utimbuf64 *))GetProcAddress(module, "_wutime64"); if ((module = LoadLibrary("kernel32.dll")) != NULL) { - func_CreateSymbolicLinkW = + createSymbolicLinkWFuncPtr = (WINAPI BOOLEAN (*)(LPCWSTR, LPCWSTR, DWORD)) GetProcAddress(module, "CreateSymbolicLinkW"); - func_CreateHardLinkW = + createHardLinkWFuncPtr = (WINAPI BOOLEAN (*)(LPCWSTR, LPCWSTR, LPSECURITY_ATTRIBUTES)) GetProcAddress(module, "CreateHardLinkW"); } #endif @@ -582,13 +577,13 @@ [OFFile class]; } + (bool)of_directoryExistsAtPath: (OFString *)path { - of_stat_t s; + Stat s; - if (of_stat(path, &s) != 0) + if (statWrapper(path, &s) != 0) return false; return S_ISDIR(s.st_mode); } @@ -602,41 +597,41 @@ objc_autoreleasePoolPop(pool); return [file autorelease]; } -- (of_file_attributes_t)attributesOfItemAtURL: (OFURL *)URL +- (OFFileAttributes)attributesOfItemAtURL: (OFURL *)URL { - of_mutable_file_attributes_t ret = [OFMutableDictionary dictionary]; + OFMutableFileAttributes ret = [OFMutableDictionary dictionary]; void *pool = objc_autoreleasePoolPush(); OFString *path; int error; - of_stat_t s; + Stat s; if (URL == nil) @throw [OFInvalidArgumentException exception]; if (![[URL scheme] isEqual: _scheme]) @throw [OFInvalidArgumentException exception]; path = URL.fileSystemRepresentation; - if ((error = of_lstat(path, &s)) != 0) + if ((error = lstatWrapper(path, &s)) != 0) @throw [OFRetrieveItemAttributesFailedException exceptionWithURL: URL errNo: error]; if (s.st_size < 0) @throw [OFOutOfRangeException exception]; [ret setObject: [NSNumber numberWithUnsignedLongLong: s.st_size] - forKey: of_file_attribute_key_size]; + forKey: OFFileSize]; setTypeAttribute(ret, &s); [ret setObject: [NSNumber numberWithUnsignedLong: s.st_mode] - forKey: of_file_attribute_key_posix_permissions]; + forKey: OFFilePOSIXPermissions]; setOwnerAndGroupAttributes(ret, &s); setDateAttributes(ret, &s); #ifdef OF_FILE_MANAGER_SUPPORTS_SYMLINKS @@ -650,32 +645,31 @@ } - (void)of_setLastAccessDate: (OFDate *)lastAccessDate andModificationDate: (OFDate *)modificationDate ofItemAtURL: (OFURL *)URL - attributes: (of_file_attributes_t)attributes OF_DIRECT + attributes: (OFFileAttributes)attributes OF_DIRECT { OFString *path = URL.fileSystemRepresentation; - of_file_attribute_key_t attributeKey = (modificationDate != nil - ? of_file_attribute_key_modification_date - : of_file_attribute_key_last_access_date); + OFFileAttributeKey attributeKey = (modificationDate != nil + ? OFFileModificationDate : OFFileLastAccessDate); if (lastAccessDate == nil) lastAccessDate = modificationDate; if (modificationDate == nil) modificationDate = lastAccessDate; #if defined(OF_WINDOWS) - if (func__wutime64 != NULL) { + if (_wutime64FuncPtr != NULL) { struct __utimbuf64 times = { .actime = (__time64_t)lastAccessDate.timeIntervalSince1970, .modtime = (__time64_t)modificationDate.timeIntervalSince1970 }; - if (func__wutime64([path UTF16String], ×) != 0) + if (_wutime64FuncPtr([path UTF16String], ×) != 0) @throw [OFSetItemAttributesFailedException exceptionWithURL: URL attributes: attributes failedAttribute: attributeKey errNo: errno]; @@ -701,11 +695,11 @@ failedAttribute: attributeKey errNo: errno]; } #elif defined(OF_AMIGAOS) /* AmigaOS does not support access time. */ - of_time_interval_t modificationTime = + OFTimeInterval modificationTime = modificationDate.timeIntervalSince1970; struct Locale *locale; struct DateStamp date; modificationTime -= 252460800; /* 1978-01-01 */ @@ -737,13 +731,12 @@ exceptionWithURL: URL attributes: attributes failedAttribute: attributeKey errNo: retrieveError()]; #else - of_time_interval_t lastAccessTime = - lastAccessDate.timeIntervalSince1970; - of_time_interval_t modificationTime = + OFTimeInterval lastAccessTime = lastAccessDate.timeIntervalSince1970; + OFTimeInterval modificationTime = modificationDate.timeIntervalSince1970; struct timeval times[2] = { { .tv_sec = (time_t)lastAccessTime, .tv_usec = @@ -765,11 +758,11 @@ #endif } - (void)of_setPOSIXPermissions: (OFNumber *)permissions ofItemAtURL: (OFURL *)URL - attributes: (of_file_attributes_t)attributes OF_DIRECT + attributes: (OFFileAttributes)attributes OF_DIRECT { #ifdef OF_FILE_MANAGER_SUPPORTS_PERMISSIONS mode_t mode = (mode_t)permissions.unsignedLongValue; OFString *path = URL.fileSystemRepresentation; int status; @@ -784,28 +777,28 @@ if (status != 0) @throw [OFSetItemAttributesFailedException exceptionWithURL: URL attributes: attributes - failedAttribute: of_file_attribute_key_posix_permissions + failedAttribute: OFFilePOSIXPermissions errNo: errno]; #else OF_UNRECOGNIZED_SELECTOR #endif } -- (void)of_setOwner: (OFString *)owner - andGroup: (OFString *)group - ofItemAtURL: (OFURL *)URL - attributeKey: (of_file_attribute_key_t)attributeKey - attributes: (of_file_attributes_t)attributes OF_DIRECT +- (void)of_setOwnerAccountName: (OFString *)owner + andGroupOwnerAccountName: (OFString *)group + ofItemAtURL: (OFURL *)URL + attributeKey: (OFFileAttributeKey)attributeKey + attributes: (OFFileAttributes)attributes OF_DIRECT { #ifdef OF_FILE_MANAGER_SUPPORTS_OWNER OFString *path = URL.fileSystemRepresentation; uid_t uid = -1; gid_t gid = -1; - of_string_encoding_t encoding; + OFStringEncoding encoding; if (owner == nil && group == nil) @throw [OFInvalidArgumentException exception]; encoding = [OFLocale encoding]; @@ -856,17 +849,16 @@ #else OF_UNRECOGNIZED_SELECTOR #endif } -- (void)setAttributes: (of_file_attributes_t)attributes - ofItemAtURL: (OFURL *)URL +- (void)setAttributes: (OFFileAttributes)attributes ofItemAtURL: (OFURL *)URL { void *pool = objc_autoreleasePoolPush(); - OFEnumerator OF_GENERIC(of_file_attribute_key_t) *keyEnumerator; + OFEnumerator OF_GENERIC(OFFileAttributeKey) *keyEnumerator; OFEnumerator *objectEnumerator; - of_file_attribute_key_t key; + OFFileAttributeKey key; id object; OFDate *lastAccessDate, *modificationDate; if (URL == nil) @throw [OFInvalidArgumentException exception]; @@ -877,39 +869,37 @@ keyEnumerator = [attributes keyEnumerator]; objectEnumerator = [attributes objectEnumerator]; while ((key = [keyEnumerator nextObject]) != nil && (object = [objectEnumerator nextObject]) != nil) { - if ([key isEqual: of_file_attribute_key_modification_date] || - [key isEqual: of_file_attribute_key_last_access_date]) + if ([key isEqual: OFFileModificationDate] || + [key isEqual: OFFileLastAccessDate]) continue; - else if ([key isEqual: of_file_attribute_key_posix_permissions]) + else if ([key isEqual: OFFilePOSIXPermissions]) [self of_setPOSIXPermissions: object ofItemAtURL: URL attributes: attributes]; - else if ([key isEqual: of_file_attribute_key_owner]) - [self of_setOwner: object - andGroup: nil - ofItemAtURL: URL - attributeKey: key - attributes: attributes]; - else if ([key isEqual: of_file_attribute_key_group]) - [self of_setOwner: nil - andGroup: object - ofItemAtURL: URL - attributeKey: key - attributes: attributes]; + else if ([key isEqual: OFFileOwnerAccountName]) + [self of_setOwnerAccountName: object + andGroupOwnerAccountName: nil + ofItemAtURL: URL + attributeKey: key + attributes: attributes]; + else if ([key isEqual: OFFileGroupOwnerAccountName]) + [self of_setOwnerAccountName: nil + andGroupOwnerAccountName: object + ofItemAtURL: URL + attributeKey: key + attributes: attributes]; else @throw [OFNotImplementedException exceptionWithSelector: _cmd object: self]; } - lastAccessDate = [attributes - objectForKey: of_file_attribute_key_last_access_date]; - modificationDate = [attributes - objectForKey: of_file_attribute_key_modification_date]; + lastAccessDate = [attributes objectForKey: OFFileLastAccessDate]; + modificationDate = [attributes objectForKey: OFFileModificationDate]; if (lastAccessDate != nil || modificationDate != nil) [self of_setLastAccessDate: lastAccessDate andModificationDate: modificationDate ofItemAtURL: URL @@ -919,20 +909,20 @@ } - (bool)fileExistsAtURL: (OFURL *)URL { void *pool = objc_autoreleasePoolPush(); - of_stat_t s; + Stat s; bool ret; if (URL == nil) @throw [OFInvalidArgumentException exception]; if (![URL.scheme isEqual: _scheme]) @throw [OFInvalidArgumentException exception]; - if (of_stat(URL.fileSystemRepresentation, &s) != 0) { + if (statWrapper(URL.fileSystemRepresentation, &s) != 0) { objc_autoreleasePoolPop(pool); return false; } ret = S_ISREG(s.st_mode); @@ -943,20 +933,20 @@ } - (bool)directoryExistsAtURL: (OFURL *)URL { void *pool = objc_autoreleasePoolPush(); - of_stat_t s; + Stat s; bool ret; if (URL == nil) @throw [OFInvalidArgumentException exception]; if (![URL.scheme isEqual: _scheme]) @throw [OFInvalidArgumentException exception]; - if (of_stat(URL.fileSystemRepresentation, &s) != 0) { + if (statWrapper(URL.fileSystemRepresentation, &s) != 0) { objc_autoreleasePoolPop(pool); return false; } ret = S_ISDIR(s.st_mode); @@ -1066,11 +1056,11 @@ errNo: retrieveError()]; } @finally { FindClose(handle); } } else { - of_string_encoding_t encoding = [OFLocale encoding]; + OFStringEncoding encoding = [OFLocale encoding]; WIN32_FIND_DATA fd; if ((handle = FindFirstFileA( [path cStringWithEncoding: encoding], &fd)) == INVALID_HANDLE_VALUE) @@ -1106,11 +1096,11 @@ } @finally { FindClose(handle); } } #elif defined(OF_AMIGAOS) - of_string_encoding_t encoding = [OFLocale encoding]; + OFStringEncoding encoding = [OFLocale encoding]; BPTR lock; if ((lock = Lock([path cStringWithEncoding: encoding], SHARED_LOCK)) == 0) @throw [OFOpenItemFailedException @@ -1176,11 +1166,11 @@ errNo: retrieveError()]; } @finally { UnLock(lock); } #else - of_string_encoding_t encoding = [OFLocale encoding]; + OFStringEncoding encoding = [OFLocale encoding]; DIR *dir; if ((dir = opendir([path cStringWithEncoding: encoding])) == NULL) @throw [OFOpenItemFailedException exceptionWithURL: URL mode: nil errNo: errno]; @@ -1255,21 +1245,21 @@ - (void)removeItemAtURL: (OFURL *)URL { void *pool = objc_autoreleasePoolPush(); OFString *path; int error; - of_stat_t s; + Stat s; if (URL == nil) @throw [OFInvalidArgumentException exception]; if (![URL.scheme isEqual: _scheme]) @throw [OFInvalidArgumentException exception]; path = URL.fileSystemRepresentation; - if ((error = of_lstat(path, &s)) != 0) + if ((error = lstatWrapper(path, &s)) != 0) @throw [OFRemoveItemFailedException exceptionWithURL: URL errNo: error]; if (S_ISDIR(s.st_mode)) { OFArray OF_GENERIC(OFURL *) *contents; @@ -1358,24 +1348,24 @@ sourcePath = source.fileSystemRepresentation; destinationPath = destination.fileSystemRepresentation; # ifndef OF_WINDOWS - of_string_encoding_t encoding = [OFLocale encoding]; + OFStringEncoding encoding = [OFLocale encoding]; if (link([sourcePath cStringWithEncoding: encoding], [destinationPath cStringWithEncoding: encoding]) != 0) @throw [OFLinkFailedException exceptionWithSourceURL: source destinationURL: destination errNo: errno]; # else - if (func_CreateHardLinkW == NULL) + if (createHardLinkWFuncPtr == NULL) @throw [OFNotImplementedException exceptionWithSelector: _cmd object: self]; - if (!func_CreateHardLinkW(destinationPath.UTF16String, + if (!createHardLinkWFuncPtr(destinationPath.UTF16String, sourcePath.UTF16String, NULL)) @throw [OFLinkFailedException exceptionWithSourceURL: source destinationURL: destination errNo: retrieveError()]; @@ -1399,24 +1389,25 @@ @throw [OFInvalidArgumentException exception]; path = URL.fileSystemRepresentation; # ifndef OF_WINDOWS - of_string_encoding_t encoding = [OFLocale encoding]; + OFStringEncoding encoding = [OFLocale encoding]; if (symlink([target cStringWithEncoding: encoding], [path cStringWithEncoding: encoding]) != 0) @throw [OFCreateSymbolicLinkFailedException exceptionWithURL: URL target: target errNo: errno]; # else - if (func_CreateSymbolicLinkW == NULL) + if (createSymbolicLinkWFuncPtr == NULL) @throw [OFNotImplementedException exceptionWithSelector: _cmd object: self]; - if (!func_CreateSymbolicLinkW(path.UTF16String, target.UTF16String, 0)) + if (!createSymbolicLinkWFuncPtr(path.UTF16String, target.UTF16String, + 0)) @throw [OFCreateSymbolicLinkFailedException exceptionWithURL: URL target: target errNo: retrieveError()]; # endif @@ -1440,11 +1431,11 @@ errNo: EEXIST]; pool = objc_autoreleasePoolPush(); #ifdef OF_AMIGAOS - of_string_encoding_t encoding = [OFLocale encoding]; + OFStringEncoding encoding = [OFLocale encoding]; if (!Rename([source.fileSystemRepresentation cStringWithEncoding: encoding], [destination.fileSystemRepresentation cStringWithEncoding: encoding])) @@ -1459,11 +1450,11 @@ if ([OFSystemInfo isWindowsNT]) status = _wrename(source.fileSystemRepresentation.UTF16String, destination.fileSystemRepresentation.UTF16String); else { # endif - of_string_encoding_t encoding = [OFLocale encoding]; + OFStringEncoding encoding = [OFLocale encoding]; status = rename([source.fileSystemRepresentation cStringWithEncoding: encoding], [destination.fileSystemRepresentation cStringWithEncoding: encoding]); Index: src/OFGZIPStream.h ================================================================== --- src/OFGZIPStream.h +++ src/OFGZIPStream.h @@ -18,10 +18,31 @@ @class OFInflateStream; OF_ASSUME_NONNULL_BEGIN +/** + * @brief The operating system on which compressed the data. + */ +typedef enum { + OFGZIPStreamOperatingSystemFAT = 0, + OFGZIPStreamOperatingSystemAmiga = 1, + OFGZIPStreamOperatingSystemVMS = 2, + OFGZIPStreamOperatingSystemUNIX = 3, + OFGZIPStreamOperatingSystemVM_CMS = 4, + OFGZIPStreamOperatingSystemAtariTOS = 5, + OFGZIPStreamOperatingSystemHPFS = 6, + OFGZIPStreamOperatingSystemMacintosh = 7, + OFGZIPStreamOperatingSystemZSystem = 8, + OFGZIPStreamOperatingSystemCPM = 9, + OFGZIPStreamOperatingSystemTOPS20 = 10, + OFGZIPStreamOperatingSystemNTFS = 11, + OFGZIPStreamOperatingSystemQDO = 12, + OFGZIPStreamOperatingSystemAcornRISCOS = 13, + OFGZIPStreamOperatingSystemUnknown = 255 +} OFGZIPStreamOperatingSystem; + /** * @class OFGZIPStream OFGZIPStream.h ObjFW/OFGZIPStream.h * * @brief A class that handles GZIP compression and decompression transparently * for an underlying stream. @@ -29,52 +50,36 @@ OF_SUBCLASSING_RESTRICTED @interface OFGZIPStream: OFStream { OFStream *_stream; OFInflateStream *_Nullable _inflateStream; - enum of_gzip_stream_state { - OF_GZIP_STREAM_ID1, - OF_GZIP_STREAM_ID2, - OF_GZIP_STREAM_COMPRESSION_METHOD, - OF_GZIP_STREAM_FLAGS, - OF_GZIP_STREAM_MODIFICATION_TIME, - OF_GZIP_STREAM_EXTRA_FLAGS, - OF_GZIP_STREAM_OPERATING_SYSTEM, - OF_GZIP_STREAM_EXTRA_LENGTH, - OF_GZIP_STREAM_EXTRA, - OF_GZIP_STREAM_NAME, - OF_GZIP_STREAM_COMMENT, - OF_GZIP_STREAM_HEADER_CRC16, - OF_GZIP_STREAM_DATA, - OF_GZIP_STREAM_CRC32, - OF_GZIP_STREAM_UNCOMPRESSED_SIZE + enum { + OFGZIPStreamStateID1, + OFGZIPStreamStateID2, + OFGZIPStreamStateCompressionMethod, + OFGZIPStreamStateFlags, + OFGZIPStreamStateModificationDate, + OFGZIPStreamStateExtraFlags, + OFGZIPStreamStateOperatingSystem, + OFGZIPStreamStateExtraLength, + OFGZIPStreamStateExtra, + OFGZIPStreamStateName, + OFGZIPStreamStateComment, + OFGZIPStreamStateHeaderCRC16, + OFGZIPStreamStateData, + OFGZIPStreamStateCRC32, + OFGZIPStreamStateUncompressedSize } _state; - enum of_gzip_stream_flags { - OF_GZIP_STREAM_FLAG_TEXT = 0x01, - OF_GZIP_STREAM_FLAG_HEADER_CRC16 = 0x02, - OF_GZIP_STREAM_FLAG_EXTRA = 0x04, - OF_GZIP_STREAM_FLAG_NAME = 0x08, - OF_GZIP_STREAM_FLAG_COMMENT = 0x10 + enum { + OFGZIPStreamFlagText = 0x01, + OFGZIPStreamFlagHeaderCRC16 = 0x02, + OFGZIPStreamFlagExtra = 0x04, + OFGZIPStreamFlagName = 0x08, + OFGZIPStreamFlagComment = 0x10 } _flags; uint8_t _extraFlags; - enum of_gzip_stream_operating_system { - OF_GZIP_STREAM_OPERATING_SYSTEM_FAT = 0, - OF_GZIP_STREAM_OPERATING_SYSTEM_AMIGA = 1, - OF_GZIP_STREAM_OPERATING_SYSTEM_VMS = 2, - OF_GZIP_STREAM_OPERATING_SYSTEM_UNIX = 3, - OF_GZIP_STREAM_OPERATING_SYSTEM_VM_CMS = 4, - OF_GZIP_STREAM_OPERATING_SYSTEM_ATARI_TOS = 5, - OF_GZIP_STREAM_OPERATING_SYSTEM_HPFS = 6, - OF_GZIP_STREAM_OPERATING_SYSTEM_MACINTOSH = 7, - OF_GZIP_STREAM_OPERATING_SYSTEM_Z_SYSTEM = 8, - OF_GZIP_STREAM_OPERATING_SYSTEM_CP_M = 9, - OF_GZIP_STREAM_OPERATING_SYSTEM_TOPS_20 = 10, - OF_GZIP_STREAM_OPERATING_SYSTEM_NTFS = 11, - OF_GZIP_STREAM_OPERATING_SYSTEM_QDO = 12, - OF_GZIP_STREAM_OPERATING_SYSTEM_ACORN_RISC_OS = 13, - OF_GZIP_STREAM_OPERATING_SYSTEM_UNKNOWN = 255 - } _operatingSystemMadeOn; + OFGZIPStreamOperatingSystem _operatingSystemMadeOn; size_t _bytesRead; uint8_t _buffer[4]; OFDate *_Nullable _modificationDate; uint16_t _extraLength; uint32_t _CRC32, _uncompressedSize; @@ -85,11 +90,11 @@ * * This property is only guaranteed to be available once @ref atEndOfStream is * true. */ @property (readonly, nonatomic) - enum of_gzip_stream_operating_system operatingSystemMadeOn; + OFGZIPStreamOperatingSystem operatingSystemMadeOn; /** * @brief The modification date of the original file. * * This property is only guaranteed to be available once @ref atEndOfStream is Index: src/OFGZIPStream.m ================================================================== --- src/OFGZIPStream.m +++ src/OFGZIPStream.m @@ -14,14 +14,13 @@ */ #include "config.h" #import "OFGZIPStream.h" -#import "OFInflateStream.h" +#import "OFCRC32.h" #import "OFDate.h" - -#import "crc32.h" +#import "OFInflateStream.h" #import "OFChecksumMismatchException.h" #import "OFInvalidFormatException.h" #import "OFNotImplementedException.h" #import "OFNotOpenException.h" @@ -50,12 +49,11 @@ @throw [OFNotImplementedException exceptionWithSelector: _cmd object: nil]; _stream = [stream retain]; - _operatingSystemMadeOn = - OF_GZIP_STREAM_OPERATING_SYSTEM_UNKNOWN; + _operatingSystemMadeOn = OFGZIPStreamOperatingSystemUnknown; _CRC32 = ~0; } @catch (id e) { [self release]; @throw e; } @@ -82,39 +80,39 @@ for (;;) { uint8_t byte; uint32_t CRC32, uncompressedSize; if (_stream.atEndOfStream) { - if (_state != OF_GZIP_STREAM_ID1) + if (_state != OFGZIPStreamStateID1) @throw [OFTruncatedDataException exception]; return 0; } switch (_state) { - case OF_GZIP_STREAM_ID1: - case OF_GZIP_STREAM_ID2: - case OF_GZIP_STREAM_COMPRESSION_METHOD: + case OFGZIPStreamStateID1: + case OFGZIPStreamStateID2: + case OFGZIPStreamStateCompressionMethod: if ([_stream readIntoBuffer: &byte length: 1] < 1) return 0; - if ((_state == OF_GZIP_STREAM_ID1 && byte != 0x1F) || - (_state == OF_GZIP_STREAM_ID2 && byte != 0x8B) || - (_state == OF_GZIP_STREAM_COMPRESSION_METHOD && + if ((_state == OFGZIPStreamStateID1 && byte != 0x1F) || + (_state == OFGZIPStreamStateID2 && byte != 0x8B) || + (_state == OFGZIPStreamStateCompressionMethod && byte != 8)) @throw [OFInvalidFormatException exception]; _state++; break; - case OF_GZIP_STREAM_FLAGS: + case OFGZIPStreamStateFlags: if ([_stream readIntoBuffer: &byte length: 1] < 1) return 0; _flags = byte; _state++; break; - case OF_GZIP_STREAM_MODIFICATION_TIME: + case OFGZIPStreamStateModificationDate: _bytesRead += [_stream readIntoBuffer: _buffer + _bytesRead length: 4 - _bytesRead]; if (_bytesRead < 4) @@ -129,26 +127,26 @@ (_buffer[1] << 8) | _buffer[0]]; _bytesRead = 0; _state++; break; - case OF_GZIP_STREAM_EXTRA_FLAGS: + case OFGZIPStreamStateExtraFlags: if ([_stream readIntoBuffer: &byte length: 1] < 1) return 0; _extraFlags = byte; _state++; break; - case OF_GZIP_STREAM_OPERATING_SYSTEM: + case OFGZIPStreamStateOperatingSystem: if ([_stream readIntoBuffer: &byte length: 1] < 1) return 0; _operatingSystemMadeOn = byte; _state++; break; - case OF_GZIP_STREAM_EXTRA_LENGTH: - if (!(_flags & OF_GZIP_STREAM_FLAG_EXTRA)) { + case OFGZIPStreamStateExtraLength: + if (!(_flags & OFGZIPStreamFlagExtra)) { _state += 2; break; } _bytesRead += [_stream @@ -160,11 +158,11 @@ _extraLength = (_buffer[1] << 8) | _buffer[0]; _bytesRead = 0; _state++; break; - case OF_GZIP_STREAM_EXTRA: + case OFGZIPStreamStateExtra: { char tmp[512]; size_t toRead = _extraLength - _bytesRead; if (toRead > 512) @@ -178,12 +176,12 @@ return 0; _bytesRead = 0; _state++; break; - case OF_GZIP_STREAM_NAME: - if (!(_flags & OF_GZIP_STREAM_FLAG_NAME)) { + case OFGZIPStreamStateName: + if (!(_flags & OFGZIPStreamFlagName)) { _state++; break; } do { @@ -192,12 +190,12 @@ return 0; } while (byte != 0); _state++; break; - case OF_GZIP_STREAM_COMMENT: - if (!(_flags & OF_GZIP_STREAM_FLAG_COMMENT)) { + case OFGZIPStreamStateComment: + if (!(_flags & OFGZIPStreamFlagComment)) { _state++; break; } do { @@ -206,12 +204,12 @@ return 0; } while (byte != 0); _state++; break; - case OF_GZIP_STREAM_HEADER_CRC16: - if (!(_flags & OF_GZIP_STREAM_FLAG_HEADER_CRC16)) { + case OFGZIPStreamStateHeaderCRC16: + if (!(_flags & OFGZIPStreamFlagHeaderCRC16)) { _state++; break; } _bytesRead += [_stream @@ -228,21 +226,21 @@ */ _bytesRead = 0; _state++; break; - case OF_GZIP_STREAM_DATA: + case OFGZIPStreamStateData: if (_inflateStream == nil) _inflateStream = [[OFInflateStream alloc] initWithStream: _stream]; if (!_inflateStream.atEndOfStream) { size_t bytesRead = [_inflateStream readIntoBuffer: buffer length: length]; - _CRC32 = of_crc32(_CRC32, buffer, bytesRead); + _CRC32 = OFCRC32(_CRC32, buffer, bytesRead); _uncompressedSize += bytesRead; return bytesRead; } @@ -249,11 +247,11 @@ [_inflateStream release]; _inflateStream = nil; _state++; break; - case OF_GZIP_STREAM_CRC32: + case OFGZIPStreamStateCRC32: _bytesRead += [_stream readIntoBuffer: _buffer length: 4 - _bytesRead]; if (_bytesRead < 4) return 0; @@ -273,11 +271,11 @@ _bytesRead = 0; _CRC32 = ~0; _state++; break; - case OF_GZIP_STREAM_UNCOMPRESSED_SIZE: + case OFGZIPStreamStateUncompressedSize: _bytesRead += [_stream readIntoBuffer: _buffer length: 4 - _bytesRead]; uncompressedSize = ((uint32_t)_buffer[3] << 24) | (_buffer[2] << 16) | (_buffer[1] << 8) | _buffer[0]; @@ -292,11 +290,11 @@ expectedChecksum: expected]; } _bytesRead = 0; _uncompressedSize = 0; - _state = OF_GZIP_STREAM_ID1; + _state = OFGZIPStreamStateID1; break; } } } @@ -308,11 +306,11 @@ return _stream.atEndOfStream; } - (bool)hasDataInReadBuffer { - if (_state == OF_GZIP_STREAM_DATA) + if (_state == OFGZIPStreamStateData) return (super.hasDataInReadBuffer || _inflateStream.hasDataInReadBuffer); return (super.hasDataInReadBuffer || _stream.hasDataInReadBuffer); } Index: src/OFHTTPClient.m ================================================================== --- src/OFHTTPClient.m +++ src/OFHTTPClient.m @@ -26,10 +26,11 @@ #import "OFHTTPRequest.h" #import "OFHTTPResponse.h" #import "OFKernelEventObserver.h" #import "OFNumber.h" #import "OFRunLoop.h" +#import "OFSocket+Private.h" #import "OFString.h" #import "OFTCPSocket.h" #import "OFURL.h" #import "OFAlreadyConnectedException.h" @@ -45,13 +46,11 @@ #import "OFTruncatedDataException.h" #import "OFUnsupportedProtocolException.h" #import "OFUnsupportedVersionException.h" #import "OFWriteFailedException.h" -#import "socket_helpers.h" - -#define REDIRECTS_DEFAULT 10 +static const unsigned int defaultRedirects = 10; OF_DIRECT_MEMBERS @interface OFHTTPClientRequestHandler: OFObject { @public @@ -114,11 +113,11 @@ static OFString * constructRequestString(OFHTTPRequest *request) { void *pool = objc_autoreleasePoolPush(); - of_http_request_method_t method = request.method; + OFHTTPRequestMethod method = request.method; OFURL *URL = request.URL; OFString *path; OFString *user = URL.user, *password = URL.password; OFMutableString *requestString; OFMutableDictionary OF_GENERIC(OFString *, OFString *) *headers; @@ -130,11 +129,11 @@ path = URL.URLEncodedPath; else path = @"/"; requestString = [OFMutableString stringWithFormat: - @"%s %@", of_http_request_method_to_string(method), path]; + @"%s %@", OFHTTPRequestMethodName(method), path]; if (URL.query != nil) { [requestString appendString: @"?"]; [requestString appendString: URL.URLEncodedQuery]; } @@ -217,37 +216,36 @@ { unsigned char *str = (unsigned char *)str_; bool firstLetter = true; while (*str != '\0') { - if (!of_ascii_isalpha(*str)) { + if (!OFASCIIIsAlpha(*str)) { firstLetter = true; str++; continue; } *str = (firstLetter - ? of_ascii_toupper(*str) - : of_ascii_tolower(*str)); + ? OFASCIIToUpper(*str) : OFASCIIToLower(*str)); firstLetter = false; str++; } } static bool -defaultShouldFollow(of_http_request_method_t method, short statusCode) +defaultShouldFollow(OFHTTPRequestMethod method, short statusCode) { bool follow; /* * 301, 302 and 307 should only redirect with user confirmation if the * request method is not GET or HEAD. Asking the delegate and getting * true returned is considered user confirmation. */ - if (method == OF_HTTP_REQUEST_METHOD_GET || - method == OF_HTTP_REQUEST_METHOD_HEAD) + if (method == OFHTTPRequestMethodGet || + method == OFHTTPRequestMethodHead) follow = true; /* 303 should always be redirected and converted to a GET request. */ else if (statusCode == 303) follow = true; else @@ -319,11 +317,11 @@ else keepAlive = true; } else { if (connectionHeader != nil) keepAlive = ([connectionHeader caseInsensitiveCompare: - @"keep-alive"] == OF_ORDERED_SAME); + @"keep-alive"] == OFOrderedSame); else keepAlive = false; } if (keepAlive) { @@ -330,11 +328,11 @@ response.of_keepAlive = true; _client->_socket = [sock retain]; _client->_lastURL = [URL copy]; _client->_lastWasHEAD = - (_request.method == OF_HTTP_REQUEST_METHOD_HEAD); + (_request.method == OFHTTPRequestMethodHead); _client->_lastResponse = [response retain]; } if (_redirects > 0 && (_status == 301 || _status == 302 || _status == 303 || _status == 307) && @@ -346,20 +344,20 @@ newURL = [OFURL URLWithString: location relativeToURL: URL]; newURLScheme = newURL.scheme; if ([newURLScheme caseInsensitiveCompare: @"http"] != - OF_ORDERED_SAME && + OFOrderedSame && [newURLScheme caseInsensitiveCompare: @"https"] != - OF_ORDERED_SAME) + OFOrderedSame) follow = false; if (!_client->_allowsInsecureRedirects && [URL.scheme caseInsensitiveCompare: @"https"] == - OF_ORDERED_SAME && + OFOrderedSame && [newURLScheme caseInsensitiveCompare: @"http"] == - OF_ORDERED_SAME) + OFOrderedSame) follow = false; if (follow && [_client->_delegate respondsToSelector: @selector( client:shouldFollowRedirect:statusCode:request:response:)]) follow = [_client->_delegate client: _client @@ -399,11 +397,11 @@ if ([key hasPrefix: @"Content-"] || [key hasPrefix: @"Transfer-"]) [newHeaders removeObjectForKey: key]; - newRequest.method = OF_HTTP_REQUEST_METHOD_GET; + newRequest.method = OFHTTPRequestMethodGet; } newRequest.URL = newURL; newRequest.headers = newHeaders; @@ -458,27 +456,26 @@ if (![line hasPrefix: @"HTTP/"] || line.length < 9 || [line characterAtIndex: 8] != ' ') @throw [OFInvalidServerReplyException exception]; - _version = [[line substringWithRange: of_range(5, 3)] copy]; + _version = [[line substringWithRange: OFRangeMake(5, 3)] copy]; if (![_version isEqual: @"1.0"] && ![_version isEqual: @"1.1"]) @throw [OFUnsupportedVersionException exceptionWithVersion: _version]; - status = [line substringWithRange: of_range(9, 3)].longLongValue; + status = [line substringWithRange: OFRangeMake(9, 3)].longLongValue; if (status < 0 || status > 599) @throw [OFInvalidServerReplyException exception]; _status = (short)status; return true; } -- (bool)handleServerHeader: (OFString *)line - socket: (OFTCPSocket *)sock +- (bool)handleServerHeader: (OFString *)line socket: (OFTCPSocket *)sock { OFString *key, *value, *old; const char *lineC, *tmp; char *keyC; @@ -507,20 +504,20 @@ lineC = line.UTF8String; if ((tmp = strchr(lineC, ':')) == NULL) @throw [OFInvalidServerReplyException exception]; - keyC = of_alloc(tmp - lineC + 1, 1); + keyC = OFAllocMemory(tmp - lineC + 1, 1); memcpy(keyC, lineC, tmp - lineC); keyC[tmp - lineC] = '\0'; normalizeKey(keyC); @try { key = [OFString stringWithUTF8StringNoCopy: keyC freeWhenDone: true]; } @catch (id e) { - free(keyC); + OFFreeMemory(keyC); @throw e; } do { tmp++; @@ -567,11 +564,11 @@ return ret; } - (OFString *)stream: (OFStream *)stream didWriteString: (OFString *)string - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding bytesWritten: (size_t)bytesWritten exception: (id)exception { OFDictionary OF_GENERIC(OFString *, OFString *) *headers; bool chunked; @@ -699,16 +696,16 @@ OFNumber *URLPort; [_client close]; if ([URL.scheme caseInsensitiveCompare: @"https"] == - OF_ORDERED_SAME) { - if (of_tls_socket_class == Nil) + OFOrderedSame) { + if (OFTLSSocketClass == Nil) @throw [OFUnsupportedProtocolException exceptionWithURL: URL]; - sock = [[[of_tls_socket_class alloc] init] autorelease]; + sock = [[[OFTLSSocketClass alloc] init] autorelease]; port = 443; } else { sock = [OFTCPSocket socket]; port = 80; } @@ -995,19 +992,19 @@ if (line == nil) return 0; pos = [line rangeOfString: @";"].location; - if (pos != OF_NOT_FOUND) + if (pos != OFNotFound) line = [line substringToIndex: pos]; if (line.length < 1) { /* * We have read the empty string because the socket is * at end of stream. */ - if (_socket.atEndOfStream && pos == OF_NOT_FOUND) + if (_socket.atEndOfStream && pos == OFNotFound) @throw [OFTruncatedDataException exception]; else @throw [OFInvalidServerReplyException exception]; } @@ -1206,11 +1203,11 @@ [super dealloc]; } - (OFHTTPResponse *)performRequest: (OFHTTPRequest *)request { - return [self performRequest: request redirects: REDIRECTS_DEFAULT]; + return [self performRequest: request redirects: defaultRedirects]; } - (OFHTTPResponse *)performRequest: (OFHTTPRequest *)request redirects: (unsigned int)redirects { @@ -1228,22 +1225,22 @@ return [response autorelease]; } - (void)asyncPerformRequest: (OFHTTPRequest *)request { - [self asyncPerformRequest: request redirects: REDIRECTS_DEFAULT]; + [self asyncPerformRequest: request redirects: defaultRedirects]; } - (void)asyncPerformRequest: (OFHTTPRequest *)request redirects: (unsigned int)redirects { void *pool = objc_autoreleasePoolPush(); OFURL *URL = request.URL; OFString *scheme = URL.scheme; - if ([scheme caseInsensitiveCompare: @"http"] != OF_ORDERED_SAME && - [scheme caseInsensitiveCompare: @"https"] != OF_ORDERED_SAME) + if ([scheme caseInsensitiveCompare: @"http"] != OFOrderedSame && + [scheme caseInsensitiveCompare: @"https"] != OFOrderedSame) @throw [OFUnsupportedProtocolException exceptionWithURL: URL]; if (_inProgress) /* TODO: Find a better exception */ @throw [OFAlreadyConnectedException exception]; Index: src/OFHTTPCookie.m ================================================================== --- src/OFHTTPCookie.m +++ src/OFHTTPCookie.m @@ -66,117 +66,117 @@ { OFMutableArray OF_GENERIC(OFHTTPCookie *) *ret = [OFMutableArray array]; void *pool = objc_autoreleasePoolPush(); OFString *string = [headerFields objectForKey: @"Set-Cookie"]; OFString *domain = URL.host; - const of_unichar_t *characters = string.characters; - size_t length = string.length, last = 0; - enum { - STATE_PRE_NAME, - STATE_NAME, - STATE_EXPECT_VALUE, - STATE_VALUE, - STATE_QUOTED_VALUE, - STATE_POST_QUOTED_VALUE, - STATE_PRE_ATTR_NAME, - STATE_ATTR_NAME, - STATE_ATTR_VALUE - } state = STATE_PRE_NAME; - OFString *name = nil, *value = nil; - - for (size_t i = 0; i < length; i++) { - switch (state) { - case STATE_PRE_NAME: - if (characters[i] != ' ') { - state = STATE_NAME; - last = i; - i--; - } - break; - case STATE_NAME: - if (characters[i] == '=') { - name = [string substringWithRange: - of_range(last, i - last)]; - state = STATE_EXPECT_VALUE; - } - break; - case STATE_EXPECT_VALUE: - if (characters[i] == '"') { - state = STATE_QUOTED_VALUE; - last = i + 1; - } else { - state = STATE_VALUE; - last = i; - } - - i--; - break; - case STATE_VALUE: - if (characters[i] == ';' || characters[i] == ',') { - value = [string substringWithRange: - of_range(last, i - last)]; - - [ret addObject: - [OFHTTPCookie cookieWithName: name - value: value - domain: domain]]; - - state = (characters[i] == ';' - ? STATE_PRE_ATTR_NAME : STATE_PRE_NAME); - } - break; - case STATE_QUOTED_VALUE: - if (characters[i] == '"') { - value = [string substringWithRange: - of_range(last, i - last)]; - [ret addObject: - [OFHTTPCookie cookieWithName: name - value: value - domain: domain]]; - - state = STATE_POST_QUOTED_VALUE; - } - break; - case STATE_POST_QUOTED_VALUE: - if (characters[i] == ';') - state = STATE_PRE_ATTR_NAME; - else if (characters[i] == ',') - state = STATE_PRE_NAME; - else - @throw [OFInvalidFormatException exception]; - - break; - case STATE_PRE_ATTR_NAME: - if (characters[i] != ' ') { - state = STATE_ATTR_NAME; - last = i; - i--; - } - break; - case STATE_ATTR_NAME: - if (characters[i] == '=') { - name = [string substringWithRange: - of_range(last, i - last)]; - - state = STATE_ATTR_VALUE; - last = i + 1; - } else if (characters[i] == ';' || - characters[i] == ',') { - name = [string substringWithRange: - of_range(last, i - last)]; - - handleAttribute(ret.lastObject, name, nil); - - state = (characters[i] == ';' - ? STATE_PRE_ATTR_NAME : STATE_PRE_NAME); - } - - break; - case STATE_ATTR_VALUE: - if (characters[i] == ';' || characters[i] == ',') { - value = [string substringWithRange: - of_range(last, i - last)]; + const OFUnichar *characters = string.characters; + size_t length = string.length, last = 0; + enum { + statePreName, + stateName, + stateExpectValue, + stateValue, + stateQuotedValue, + statePostQuotedValue, + statePreAttrName, + stateAttrName, + stateAttrValue + } state = statePreName; + OFString *name = nil, *value = nil; + + for (size_t i = 0; i < length; i++) { + switch (state) { + case statePreName: + if (characters[i] != ' ') { + state = stateName; + last = i; + i--; + } + break; + case stateName: + if (characters[i] == '=') { + name = [string substringWithRange: + OFRangeMake(last, i - last)]; + state = stateExpectValue; + } + break; + case stateExpectValue: + if (characters[i] == '"') { + state = stateQuotedValue; + last = i + 1; + } else { + state = stateValue; + last = i; + } + + i--; + break; + case stateValue: + if (characters[i] == ';' || characters[i] == ',') { + value = [string substringWithRange: + OFRangeMake(last, i - last)]; + + [ret addObject: + [OFHTTPCookie cookieWithName: name + value: value + domain: domain]]; + + state = (characters[i] == ';' + ? statePreAttrName : statePreName); + } + break; + case stateQuotedValue: + if (characters[i] == '"') { + value = [string substringWithRange: + OFRangeMake(last, i - last)]; + [ret addObject: + [OFHTTPCookie cookieWithName: name + value: value + domain: domain]]; + + state = statePostQuotedValue; + } + break; + case statePostQuotedValue: + if (characters[i] == ';') + state = statePreAttrName; + else if (characters[i] == ',') + state = statePreName; + else + @throw [OFInvalidFormatException exception]; + + break; + case statePreAttrName: + if (characters[i] != ' ') { + state = stateAttrName; + last = i; + i--; + } + break; + case stateAttrName: + if (characters[i] == '=') { + name = [string substringWithRange: + OFRangeMake(last, i - last)]; + + state = stateAttrValue; + last = i + 1; + } else if (characters[i] == ';' || + characters[i] == ',') { + name = [string substringWithRange: + OFRangeMake(last, i - last)]; + + handleAttribute(ret.lastObject, name, nil); + + state = (characters[i] == ';' + ? statePreAttrName : statePreName); + } + + break; + case stateAttrValue: + if (characters[i] == ';' || characters[i] == ',') { + value = [string substringWithRange: + OFRangeMake(last, i - last)]; /* * Expires often contains a comma, even though * the comma is used as a separator for * concatenating headers as per RFC 2616, @@ -183,11 +183,11 @@ * meaning RFC 6265 contradicts RFC 2616. * Solve this by special casing this. */ if (characters[i] == ',' && [name caseInsensitiveCompare: @"expires"] == - OF_ORDERED_SAME && value.length == 3 && + OFOrderedSame && value.length == 3 && ([value isEqual: @"Mon"] || [value isEqual: @"Tue"] || [value isEqual: @"Wed"] || [value isEqual: @"Thu"] || [value isEqual: @"Fri"] || @@ -196,49 +196,49 @@ break; handleAttribute(ret.lastObject, name, value); state = (characters[i] == ';' - ? STATE_PRE_ATTR_NAME : STATE_PRE_NAME); + ? statePreAttrName : statePreName); } break; } } switch (state) { - case STATE_PRE_NAME: - case STATE_POST_QUOTED_VALUE: - case STATE_PRE_ATTR_NAME: + case statePreName: + case statePostQuotedValue: + case statePreAttrName: break; - case STATE_NAME: - case STATE_QUOTED_VALUE: + case stateName: + case stateQuotedValue: @throw [OFInvalidFormatException exception]; break; - case STATE_VALUE: + case stateValue: value = [string substringWithRange: - of_range(last, length - last)]; + OFRangeMake(last, length - last)]; [ret addObject: [OFHTTPCookie cookieWithName: name value: value domain: domain]]; break; /* We end up here if the cookie is just foo= */ - case STATE_EXPECT_VALUE: + case stateExpectValue: [ret addObject: [OFHTTPCookie cookieWithName: name value: @"" domain: domain]]; break; - case STATE_ATTR_NAME: + case stateAttrName: if (last != length) { name = [string substringWithRange: - of_range(last, length - last)]; + OFRangeMake(last, length - last)]; handleAttribute(ret.lastObject, name, nil); } break; - case STATE_ATTR_VALUE: + case stateAttrValue: value = [string substringWithRange: - of_range(last, length - last)]; + OFRangeMake(last, length - last)]; handleAttribute(ret.lastObject, name, value); break; } @@ -361,22 +361,22 @@ return true; } - (unsigned long)hash { - uint32_t hash; - - OF_HASH_INIT(hash); - OF_HASH_ADD_HASH(hash, _name.hash); - OF_HASH_ADD_HASH(hash, _value.hash); - OF_HASH_ADD_HASH(hash, _domain.hash); - OF_HASH_ADD_HASH(hash, _path.hash); - OF_HASH_ADD_HASH(hash, _expires.hash); - OF_HASH_ADD(hash, _secure); - OF_HASH_ADD(hash, _HTTPOnly); - OF_HASH_ADD_HASH(hash, _extensions.hash); - OF_HASH_FINALIZE(hash); + unsigned long hash; + + OFHashInit(&hash); + OFHashAddHash(&hash, _name.hash); + OFHashAddHash(&hash, _value.hash); + OFHashAddHash(&hash, _domain.hash); + OFHashAddHash(&hash, _path.hash); + OFHashAddHash(&hash, _expires.hash); + OFHashAdd(&hash, _secure); + OFHashAdd(&hash, _HTTPOnly); + OFHashAddHash(&hash, _extensions.hash); + OFHashFinalize(&hash); return hash; } - (id)copy Index: src/OFHTTPCookieManager.m ================================================================== --- src/OFHTTPCookieManager.m +++ src/OFHTTPCookieManager.m @@ -61,11 +61,11 @@ if (![cookie.path hasPrefix: @"/"]) cookie.path = @"/"; if (cookie.secure && - [URL.scheme caseInsensitiveCompare: @"https"] != OF_ORDERED_SAME) { + [URL.scheme caseInsensitiveCompare: @"https"] != OFOrderedSame) { objc_autoreleasePoolPop(pool); return; } cookieDomain = cookie.domain.lowercaseString; @@ -119,11 +119,11 @@ expires = cookie.expires; if (expires != nil && expires.timeIntervalSinceNow <= 0) continue; if (cookie.secure && [URL.scheme caseInsensitiveCompare: - @"https"] != OF_ORDERED_SAME) + @"https"] != OFOrderedSame) continue; pool = objc_autoreleasePoolPush(); cookieDomain = cookie.domain.lowercaseString; Index: src/OFHTTPRequest.h ================================================================== --- src/OFHTTPRequest.h +++ src/OFHTTPRequest.h @@ -12,14 +12,13 @@ * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #import "OFObject.h" +#import "OFSocket.h" #import "OFString.h" -#import "socket.h" - OF_ASSUME_NONNULL_BEGIN @class OFURL; @class OFDictionary OF_GENERIC(KeyType, ObjectType); @class OFData; @@ -30,54 +29,51 @@ /** * @brief The type of an HTTP request. */ typedef enum { /** OPTIONS */ - OF_HTTP_REQUEST_METHOD_OPTIONS, + OFHTTPRequestMethodOptions, /** GET */ - OF_HTTP_REQUEST_METHOD_GET, + OFHTTPRequestMethodGet, /** HEAD */ - OF_HTTP_REQUEST_METHOD_HEAD, + OFHTTPRequestMethodHead, /** POST */ - OF_HTTP_REQUEST_METHOD_POST, + OFHTTPRequestMethodPost, /** PUT */ - OF_HTTP_REQUEST_METHOD_PUT, + OFHTTPRequestMethodPut, /** DELETE */ - OF_HTTP_REQUEST_METHOD_DELETE, + OFHTTPRequestMethodDelete, /** TRACE */ - OF_HTTP_REQUEST_METHOD_TRACE, + OFHTTPRequestMethodTrace, /** CONNECT */ - OF_HTTP_REQUEST_METHOD_CONNECT -} of_http_request_method_t; + OFHTTPRequestMethodConnect +} OFHTTPRequestMethod; /** - * @struct of_http_request_protocol_version_t \ - * OFHTTPRequest.h ObjFW/OFHTTPRequest.h + * @struct OFHTTPRequestProtocolVersion OFHTTPRequest.h ObjFW/OFHTTPRequest.h * * @brief The HTTP version of the HTTP request. */ -struct OF_BOXABLE of_http_request_protocol_version_t { +typedef struct OF_BOXABLE { /** The major of the HTTP version */ unsigned char major; /** The minor of the HTTP version */ unsigned char minor; -}; -typedef struct of_http_request_protocol_version_t - of_http_request_protocol_version_t; +} OFHTTPRequestProtocolVersion; /** * @class OFHTTPRequest OFHTTPRequest.h ObjFW/OFHTTPRequest.h * * @brief A class for storing HTTP requests. */ @interface OFHTTPRequest: OFObject { OFURL *_URL; - of_http_request_method_t _method; - of_http_request_protocol_version_t _protocolVersion; + OFHTTPRequestMethod _method; + OFHTTPRequestProtocolVersion _protocolVersion; OFDictionary OF_GENERIC(OFString *, OFString *) *_Nullable _headers; - of_socket_address_t _remoteAddress; + OFSocketAddress _remoteAddress; bool _hasRemoteAddress; OF_RESERVE_IVARS(OFHTTPRequest, 4) } /** @@ -86,21 +82,21 @@ @property (copy, nonatomic) OFURL *URL; /** * @brief The protocol version of the HTTP request. */ -@property (nonatomic) of_http_request_protocol_version_t protocolVersion; +@property (nonatomic) OFHTTPRequestProtocolVersion protocolVersion; /** * @brief The protocol version of the HTTP request as a string. */ @property (copy, nonatomic) OFString *protocolVersionString; /** * @brief The request method of the HTTP request. */ -@property (nonatomic) of_http_request_method_t method; +@property (nonatomic) OFHTTPRequestMethod method; /** * @brief The headers for the HTTP request. */ @property OF_NULLABLE_PROPERTY (copy, nonatomic) @@ -109,12 +105,11 @@ /** * @brief The remote address from which the request originates. * * @note The setter creates a copy of the remote address. */ -@property OF_NULLABLE_PROPERTY (nonatomic) - const of_socket_address_t *remoteAddress; +@property OF_NULLABLE_PROPERTY (nonatomic) const OFSocketAddress *remoteAddress; /** * @brief Creates a new OFHTTPRequest. * * @return A new, autoreleased OFHTTPRequest @@ -145,21 +140,20 @@ * @brief Returns a C string describing the specified request method. * * @param method The request method which should be described as a C string * @return A C string describing the specified request method */ -extern const char *_Nullable of_http_request_method_to_string( - of_http_request_method_t method); +extern const char *_Nullable OFHTTPRequestMethodName( + OFHTTPRequestMethod method); /** * @brief Returns the request method for the specified string. * * @param string The string for which the request method should be returned * @return The request method for the specified string */ -extern of_http_request_method_t of_http_request_method_from_string( - OFString *string); +extern OFHTTPRequestMethod OFHTTPRequestMethodParseName(OFString *string); #ifdef __cplusplus } #endif OF_ASSUME_NONNULL_END Index: src/OFHTTPRequest.m ================================================================== --- src/OFHTTPRequest.m +++ src/OFHTTPRequest.m @@ -28,53 +28,53 @@ #import "OFInvalidFormatException.h" #import "OFOutOfRangeException.h" #import "OFUnsupportedVersionException.h" const char * -of_http_request_method_to_string(of_http_request_method_t method) +OFHTTPRequestMethodName(OFHTTPRequestMethod method) { switch (method) { - case OF_HTTP_REQUEST_METHOD_OPTIONS: + case OFHTTPRequestMethodOptions: return "OPTIONS"; - case OF_HTTP_REQUEST_METHOD_GET: + case OFHTTPRequestMethodGet: return "GET"; - case OF_HTTP_REQUEST_METHOD_HEAD: + case OFHTTPRequestMethodHead: return "HEAD"; - case OF_HTTP_REQUEST_METHOD_POST: + case OFHTTPRequestMethodPost: return "POST"; - case OF_HTTP_REQUEST_METHOD_PUT: + case OFHTTPRequestMethodPut: return "PUT"; - case OF_HTTP_REQUEST_METHOD_DELETE: + case OFHTTPRequestMethodDelete: return "DELETE"; - case OF_HTTP_REQUEST_METHOD_TRACE: + case OFHTTPRequestMethodTrace: return "TRACE"; - case OF_HTTP_REQUEST_METHOD_CONNECT: + case OFHTTPRequestMethodConnect: return "CONNECT"; } return NULL; } -of_http_request_method_t -of_http_request_method_from_string(OFString *string) +OFHTTPRequestMethod +OFHTTPRequestMethodParseName(OFString *string) { if ([string isEqual: @"OPTIONS"]) - return OF_HTTP_REQUEST_METHOD_OPTIONS; + return OFHTTPRequestMethodOptions; if ([string isEqual: @"GET"]) - return OF_HTTP_REQUEST_METHOD_GET; + return OFHTTPRequestMethodGet; if ([string isEqual: @"HEAD"]) - return OF_HTTP_REQUEST_METHOD_HEAD; + return OFHTTPRequestMethodHead; if ([string isEqual: @"POST"]) - return OF_HTTP_REQUEST_METHOD_POST; + return OFHTTPRequestMethodPost; if ([string isEqual: @"PUT"]) - return OF_HTTP_REQUEST_METHOD_PUT; + return OFHTTPRequestMethodPut; if ([string isEqual: @"DELETE"]) - return OF_HTTP_REQUEST_METHOD_DELETE; + return OFHTTPRequestMethodDelete; if ([string isEqual: @"TRACE"]) - return OF_HTTP_REQUEST_METHOD_TRACE; + return OFHTTPRequestMethodTrace; if ([string isEqual: @"CONNECT"]) - return OF_HTTP_REQUEST_METHOD_CONNECT; + return OFHTTPRequestMethodConnect; @throw [OFInvalidArgumentException exception]; } @implementation OFHTTPRequest @@ -92,11 +92,11 @@ - (instancetype)init { self = [super init]; - _method = OF_HTTP_REQUEST_METHOD_GET; + _method = OFHTTPRequestMethodGet; _protocolVersion.major = 1; _protocolVersion.minor = 1; return self; } @@ -121,19 +121,19 @@ [_headers release]; [super dealloc]; } -- (void)setRemoteAddress: (const of_socket_address_t *)remoteAddress +- (void)setRemoteAddress: (const OFSocketAddress *)remoteAddress { _hasRemoteAddress = (remoteAddress != NULL); if (_hasRemoteAddress) _remoteAddress = *remoteAddress; } -- (const of_socket_address_t *)remoteAddress +- (const OFSocketAddress *)remoteAddress { if (_hasRemoteAddress) return &_remoteAddress; return NULL; @@ -175,36 +175,36 @@ ![request->_URL isEqual: _URL] || ![request->_headers isEqual: _headers]) return false; if (request.remoteAddress != self.remoteAddress && - !of_socket_address_equal(request.remoteAddress, self.remoteAddress)) + !OFSocketAddressEqual(request.remoteAddress, self.remoteAddress)) return false; return true; } - (unsigned long)hash { - uint32_t hash; - - OF_HASH_INIT(hash); - - OF_HASH_ADD(hash, _method); - OF_HASH_ADD(hash, _protocolVersion.major); - OF_HASH_ADD(hash, _protocolVersion.minor); - OF_HASH_ADD_HASH(hash, _URL.hash); - OF_HASH_ADD_HASH(hash, _headers.hash); + unsigned long hash; + + OFHashInit(&hash); + + OFHashAdd(&hash, _method); + OFHashAdd(&hash, _protocolVersion.major); + OFHashAdd(&hash, _protocolVersion.minor); + OFHashAddHash(&hash, _URL.hash); + OFHashAddHash(&hash, _headers.hash); if (_hasRemoteAddress) - OF_HASH_ADD_HASH(hash, of_socket_address_hash(&_remoteAddress)); + OFHashAddHash(&hash, OFSocketAddressHash(&_remoteAddress)); - OF_HASH_FINALIZE(hash); + OFHashFinalize(&hash); return hash; } -- (void)setProtocolVersion: (of_http_request_protocol_version_t)protocolVersion +- (void)setProtocolVersion: (OFHTTPRequestProtocolVersion)protocolVersion { if (protocolVersion.major != 1 || protocolVersion.minor > 1) @throw [OFUnsupportedVersionException exceptionWithVersion: [OFString stringWithFormat: @"%hhu.%hhu", protocolVersion.major, @@ -211,21 +211,21 @@ protocolVersion.minor]]; _protocolVersion = protocolVersion; } -- (of_http_request_protocol_version_t)protocolVersion +- (OFHTTPRequestProtocolVersion)protocolVersion { return _protocolVersion; } - (void)setProtocolVersionString: (OFString *)string { void *pool = objc_autoreleasePoolPush(); OFArray *components = [string componentsSeparatedByString: @"."]; unsigned long long major, minor; - of_http_request_protocol_version_t protocolVersion; + OFHTTPRequestProtocolVersion protocolVersion; if (components.count != 2) @throw [OFInvalidFormatException exception]; major = [components.firstObject unsignedLongLongValue]; @@ -250,20 +250,19 @@ } - (OFString *)description { void *pool = objc_autoreleasePoolPush(); - const char *method = of_http_request_method_to_string(_method); + const char *method = OFHTTPRequestMethodName(_method); OFString *indentedHeaders, *remoteAddress, *ret; indentedHeaders = [_headers.description stringByReplacingOccurrencesOfString: @"\n" withString: @"\n\t"]; if (_hasRemoteAddress) - remoteAddress = - of_socket_address_ip_string(&_remoteAddress, NULL); + remoteAddress = OFSocketAddressString(&_remoteAddress); else remoteAddress = nil; ret = [[OFString alloc] initWithFormat: @"<%@:\n\tURL = %@\n" Index: src/OFHTTPResponse.h ================================================================== --- src/OFHTTPResponse.h +++ src/OFHTTPResponse.h @@ -26,20 +26,20 @@ * * @brief A class for representing an HTTP request reply as a stream. */ @interface OFHTTPResponse: OFStream { - of_http_request_protocol_version_t _protocolVersion; + OFHTTPRequestProtocolVersion _protocolVersion; short _statusCode; OFDictionary OF_GENERIC(OFString *, OFString *) *_headers; OF_RESERVE_IVARS(OFHTTPResponse, 4) } /** * @brief The protocol version of the HTTP request reply. */ -@property (nonatomic) of_http_request_protocol_version_t protocolVersion; +@property (nonatomic) OFHTTPRequestProtocolVersion protocolVersion; /** * @brief The protocol version of the HTTP request reply as a string. */ @property (copy, nonatomic) OFString *protocolVersionString; @@ -64,11 +64,11 @@ * @brief Returns the reply as a string, trying to detect the encoding and * falling back to the specified encoding if not detectable. * * @return The reply as a string */ -- (OFString *)stringWithEncoding: (of_string_encoding_t)encoding; +- (OFString *)stringWithEncoding: (OFStringEncoding)encoding; @end #ifdef __cplusplus extern "C" { #endif @@ -76,11 +76,11 @@ * @brief Returns a description string for the specified HTTP status code. * * @param code The HTTP status code to return a description string for * @return A description string for the specified HTTP status code */ -extern OFString *_Nonnull of_http_status_code_to_string(short code); +extern OFString *_Nonnull OFHTTPStatusCodeString(short code); #ifdef __cplusplus } #endif OF_ASSUME_NONNULL_END Index: src/OFHTTPResponse.m ================================================================== --- src/OFHTTPResponse.m +++ src/OFHTTPResponse.m @@ -26,11 +26,11 @@ #import "OFOutOfRangeException.h" #import "OFTruncatedDataException.h" #import "OFUnsupportedVersionException.h" OFString * -of_http_status_code_to_string(short code) +OFHTTPStatusCodeString(short code) { switch (code) { case 100: return @"Continue"; case 101: @@ -114,64 +114,64 @@ default: return @"(unknown)"; } } -static of_string_encoding_t +static OFStringEncoding encodingForContentType(OFString *contentType) { const char *UTF8String = contentType.UTF8String; size_t last, length = contentType.UTF8StringLength; enum { - STATE_TYPE, - STATE_BEFORE_PARAM_NAME, - STATE_PARAM_NAME, - STATE_PARAM_VALUE_OR_QUOTE, - STATE_PARAM_VALUE, - STATE_PARAM_QUOTED_VALUE, - STATE_AFTER_PARAM_VALUE - } state = STATE_TYPE; + stateType, + stateBeforeParamName, + stateParamName, + stateParamValueOrQuote, + stateParamValue, + stateParamQuotedValue, + stateAfterParamValue + } state = stateType; OFString *name = nil, *value = nil, *charset = nil; - of_string_encoding_t ret; + OFStringEncoding ret; last = 0; for (size_t i = 0; i < length; i++) { switch (state) { - case STATE_TYPE: + case stateType: if (UTF8String[i] == ';') { - state = STATE_BEFORE_PARAM_NAME; + state = stateBeforeParamName; last = i + 1; } break; - case STATE_BEFORE_PARAM_NAME: + case stateBeforeParamName: if (UTF8String[i] == ' ') last = i + 1; else { - state = STATE_PARAM_NAME; + state = stateParamName; i--; } break; - case STATE_PARAM_NAME: + case stateParamName: if (UTF8String[i] == '=') { name = [OFString stringWithUTF8String: UTF8String + last length: i - last]; - state = STATE_PARAM_VALUE_OR_QUOTE; + state = stateParamValueOrQuote; last = i + 1; } break; - case STATE_PARAM_VALUE_OR_QUOTE: + case stateParamValueOrQuote: if (UTF8String[i] == '"') { - state = STATE_PARAM_QUOTED_VALUE; + state = stateParamQuotedValue; last = i + 1; } else { - state = STATE_PARAM_VALUE; + state = stateParamValue; i--; } break; - case STATE_PARAM_VALUE: + case stateParamValue: if (UTF8String[i] == ';') { value = [OFString stringWithUTF8String: UTF8String + last length: i - last]; value = @@ -178,48 +178,48 @@ value.stringByDeletingTrailingWhitespaces; if ([name isEqual: @"charset"]) charset = value; - state = STATE_BEFORE_PARAM_NAME; + state = stateBeforeParamName; last = i + 1; } break; - case STATE_PARAM_QUOTED_VALUE: + case stateParamQuotedValue: if (UTF8String[i] == '"') { value = [OFString stringWithUTF8String: UTF8String + last length: i - last]; if ([name isEqual: @"charset"]) charset = value; - state = STATE_AFTER_PARAM_VALUE; + state = stateAfterParamValue; } break; - case STATE_AFTER_PARAM_VALUE: + case stateAfterParamValue: if (UTF8String[i] == ';') { - state = STATE_BEFORE_PARAM_NAME; + state = stateBeforeParamName; last = i + 1; } else if (UTF8String[i] != ' ') - return OF_STRING_ENCODING_AUTODETECT; + return OFStringEncodingAutodetect; break; } } - if (state == STATE_PARAM_VALUE) { + if (state == stateParamValue) { value = [OFString stringWithUTF8String: UTF8String + last length: length - last]; value = value.stringByDeletingTrailingWhitespaces; if ([name isEqual: @"charset"]) charset = value; } @try { - ret = of_string_parse_encoding(charset); + ret = OFStringEncodingParseName(charset); } @catch (OFInvalidArgumentException *e) { - ret = OF_STRING_ENCODING_AUTODETECT; + ret = OFStringEncodingAutodetect; } return ret; } @@ -247,11 +247,11 @@ [_headers release]; [super dealloc]; } -- (void)setProtocolVersion: (of_http_request_protocol_version_t)protocolVersion +- (void)setProtocolVersion: (OFHTTPRequestProtocolVersion)protocolVersion { if (protocolVersion.major != 1 || protocolVersion.minor > 1) @throw [OFUnsupportedVersionException exceptionWithVersion: [OFString stringWithFormat: @"%hhu.%hhu", protocolVersion.major, @@ -258,21 +258,21 @@ protocolVersion.minor]]; _protocolVersion = protocolVersion; } -- (of_http_request_protocol_version_t)protocolVersion +- (OFHTTPRequestProtocolVersion)protocolVersion { return _protocolVersion; } - (void)setProtocolVersionString: (OFString *)string { void *pool = objc_autoreleasePoolPush(); OFArray *components = [string componentsSeparatedByString: @"."]; unsigned long long major, minor; - of_http_request_protocol_version_t protocolVersion; + OFHTTPRequestProtocolVersion protocolVersion; if (components.count != 2) @throw [OFInvalidFormatException exception]; major = [components.firstObject unsignedLongLongValue]; @@ -296,25 +296,25 @@ _protocolVersion.minor]; } - (OFString *)string { - return [self stringWithEncoding: OF_STRING_ENCODING_AUTODETECT]; + return [self stringWithEncoding: OFStringEncodingAutodetect]; } -- (OFString *)stringWithEncoding: (of_string_encoding_t)encoding +- (OFString *)stringWithEncoding: (OFStringEncoding)encoding { void *pool = objc_autoreleasePoolPush(); OFString *contentType, *contentLengthString, *ret; OFData *data; - if (encoding == OF_STRING_ENCODING_AUTODETECT && + if (encoding == OFStringEncodingAutodetect && (contentType = [_headers objectForKey: @"Content-Type"]) != nil) encoding = encodingForContentType(contentType); - if (encoding == OF_STRING_ENCODING_AUTODETECT) - encoding = OF_STRING_ENCODING_UTF_8; + if (encoding == OFStringEncodingAutodetect) + encoding = OFStringEncodingUTF8; data = [self readDataUntilEndOfStream]; contentLengthString = [_headers objectForKey: @"Content-Length"]; if (contentLengthString != nil) { Index: src/OFHTTPServer.m ================================================================== --- src/OFHTTPServer.m +++ src/OFHTTPServer.m @@ -24,10 +24,11 @@ #import "OFDate.h" #import "OFDictionary.h" #import "OFHTTPRequest.h" #import "OFHTTPResponse.h" #import "OFNumber.h" +#import "OFSocket+Private.h" #import "OFTCPSocket.h" #import "OFTLSSocket.h" #import "OFThread.h" #import "OFTimer.h" #import "OFURL.h" @@ -41,14 +42,10 @@ #import "OFOutOfRangeException.h" #import "OFTruncatedDataException.h" #import "OFUnsupportedProtocolException.h" #import "OFWriteFailedException.h" -#import "socket_helpers.h" - -#define BUFFER_SIZE 1024 - /* * FIXME: Key normalization replaces headers like "DNT" with "Dnt". * FIXME: Errors are not reported to the user. */ @@ -75,16 +72,16 @@ @public OFStreamSocket *_socket; OFHTTPServer *_server; OFTimer *_timer; enum { - AWAITING_PROLOG, - PARSING_HEADERS, - SEND_RESPONSE + stateAwaitingProlog, + stateParsingHeaders, + stateSendResponse } _state; uint8_t _HTTPMinorVersion; - of_http_request_method_t _method; + OFHTTPRequestMethod _method; OFString *_host, *_path; uint16_t _port; OFMutableDictionary *_headers; size_t _contentLength; OFStream *_requestBody; @@ -120,38 +117,33 @@ #endif static OF_INLINE OFString * normalizedKey(OFString *key) { - char *cString = of_strdup(key.UTF8String); + char *cString = OFStrDup(key.UTF8String); unsigned char *tmp = (unsigned char *)cString; bool firstLetter = true; - if (cString == NULL) - @throw [OFOutOfMemoryException - exceptionWithRequestedSize: strlen(key.UTF8String)]; - while (*tmp != '\0') { - if (!of_ascii_isalpha(*tmp)) { + if (!OFASCIIIsAlpha(*tmp)) { firstLetter = true; tmp++; continue; } *tmp = (firstLetter - ? of_ascii_toupper(*tmp) - : of_ascii_tolower(*tmp)); + ? OFASCIIToUpper(*tmp) : OFASCIIToLower(*tmp)); firstLetter = false; tmp++; } @try { return [OFString stringWithUTF8StringNoCopy: cString freeWhenDone: true]; } @catch (id e) { - free(cString); + OFFreeMemory(cString); @throw e; } } @implementation OFHTTPServerResponse @@ -187,11 +179,11 @@ OFEnumerator *keyEnumerator, *valueEnumerator; OFString *key, *value; [_socket writeFormat: @"HTTP/%@ %hd %@\r\n", self.protocolVersionString, _statusCode, - of_http_status_code_to_string(_statusCode)]; + OFHTTPStatusCodeString(_statusCode)]; headers = [[_headers mutableCopy] autorelease]; if ([headers objectForKey: @"Date"] == nil) { OFString *date = [[OFDate date] @@ -296,11 +288,11 @@ scheduledTimerWithTimeInterval: 10 target: _socket selector: @selector( cancelAsyncRequests) repeats: false] retain]; - _state = AWAITING_PROLOG; + _state = stateAwaitingProlog; } @catch (id e) { [self release]; @throw e; } @@ -330,22 +322,22 @@ if (line == nil || exception != nil) return false; @try { switch (_state) { - case AWAITING_PROLOG: + case stateAwaitingProlog: return [self parseProlog: line]; - case PARSING_HEADERS: + case stateParsingHeaders: return [self parseHeaders: line]; default: return false; } } @catch (OFWriteFailedException *e) { return false; } - OF_ENSURE(0); + OFEnsure(0); } - (bool)parseProlog: (OFString *)line { OFString *method; @@ -352,12 +344,12 @@ OFMutableString *path; size_t pos; @try { OFString *version = [line - substringWithRange: of_range(line.length - 9, 9)]; - of_unichar_t tmp; + substringWithRange: OFRangeMake(line.length - 9, 9)]; + OFUnichar tmp; if (![version hasPrefix: @" HTTP/1."]) return [self sendErrorAndClose: 505]; tmp = [version characterAtIndex: 8]; @@ -368,22 +360,22 @@ } @catch (OFOutOfRangeException *e) { return [self sendErrorAndClose: 400]; } pos = [line rangeOfString: @" "].location; - if (pos == OF_NOT_FOUND) + if (pos == OFNotFound) return [self sendErrorAndClose: 400]; method = [line substringToIndex: pos]; @try { - _method = of_http_request_method_from_string(method); + _method = OFHTTPRequestMethodParseName(method); } @catch (OFInvalidArgumentException *e) { return [self sendErrorAndClose: 405]; } @try { - of_range_t range = of_range(pos + 1, line.length - pos - 10); + OFRange range = OFRangeMake(pos + 1, line.length - pos - 10); path = [[[line substringWithRange: range] mutableCopy] autorelease]; } @catch (OFOutOfRangeException *e) { return [self sendErrorAndClose: 400]; @@ -395,11 +387,11 @@ if (![path hasPrefix: @"/"]) return [self sendErrorAndClose: 400]; _headers = [[OFMutableDictionary alloc] init]; _path = [path copy]; - _state = PARSING_HEADERS; + _state = stateParsingHeaders; return true; } - (bool)parseHeaders: (OFString *)line @@ -437,18 +429,18 @@ [_timer invalidate]; [_timer release]; _timer = nil; } - _state = SEND_RESPONSE; + _state = stateSendResponse; [self createResponse]; return false; } pos = [line rangeOfString: @":"].location; - if (pos == OF_NOT_FOUND) + if (pos == OFNotFound) return [self sendErrorAndClose: 400]; key = [line substringToIndex: pos]; value = [line substringFromIndex: pos + 1]; @@ -460,15 +452,14 @@ value = [old stringByAppendingFormat: @",%@", value]; [_headers setObject: value forKey: key]; if ([key isEqual: @"Host"]) { - pos = [value - rangeOfString: @":" - options: OF_STRING_SEARCH_BACKWARDS].location; + pos = [value rangeOfString: @":" + options: OFStringSearchBackwards].location; - if (pos != OF_NOT_FOUND) { + if (pos != OFNotFound) { [_host release]; _host = [[value substringToIndex: pos] retain]; @try { unsigned long long portTmp = @@ -498,12 +489,11 @@ dateStringWithFormat: @"%a, %d %b %Y %H:%M:%S GMT"]; [_socket writeFormat: @"HTTP/1.1 %hd %@\r\n" @"Date: %@\r\n" @"Server: %@\r\n" @"\r\n", - statusCode, - of_http_status_code_to_string(statusCode), + statusCode, OFHTTPStatusCodeString(statusCode), date, _server.name]; return false; } - (void)createResponse @@ -533,11 +523,11 @@ URL.scheme = @"http"; URL.host = _host; if (_port != 80) URL.port = [OFNumber numberWithUnsignedShort: _port]; - if ((pos = [_path rangeOfString: @"?"].location) != OF_NOT_FOUND) { + if ((pos = [_path rangeOfString: @"?"].location) != OFNotFound) { OFString *path, *query; path = [_path substringToIndex: pos]; query = [_path substringFromIndex: pos + 1]; @@ -549,11 +539,11 @@ [URL makeImmutable]; request = [OFHTTPRequest requestWithURL: URL]; request.method = _method; request.protocolVersion = - (of_http_request_protocol_version_t){ 1, _HTTPMinorVersion }; + (OFHTTPRequestProtocolVersion){ 1, _HTTPMinorVersion }; request.headers = _headers; request.remoteAddress = _socket.remoteAddress; response = [[[OFHTTPServerResponse alloc] initWithSocket: _socket @@ -692,19 +682,19 @@ if (line == nil) return 0; pos = [line rangeOfString: @";"].location; - if (pos != OF_NOT_FOUND) + if (pos != OFNotFound) line = [line substringToIndex: pos]; if (line.length < 1) { /* * We have read the empty string because the socket is * at end of stream. */ - if (_socket.atEndOfStream && pos == OF_NOT_FOUND) + if (_socket.atEndOfStream && pos == OFNotFound) @throw [OFTruncatedDataException exception]; else @throw [OFInvalidFormatException exception]; } @@ -907,14 +897,14 @@ @throw [OFAlreadyConnectedException exception]; if (_usesTLS) { OFTCPSocket *TLSSocket; - if (of_tls_socket_class == Nil) + if (OFTLSSocketClass == Nil) @throw [OFUnsupportedProtocolException exception]; - TLSSocket = [[of_tls_socket_class alloc] init]; + TLSSocket = [[OFTLSSocketClass alloc] init]; _listeningSocket = TLSSocket; TLSSocket.certificateFile = _certificateFile; TLSSocket.privateKeyFile = _privateKeyFile; TLSSocket.privateKeyPassphrase = _privateKeyPassphrase; Index: src/OFHostAddressResolver.h ================================================================== --- src/OFHostAddressResolver.h +++ src/OFHostAddressResolver.h @@ -14,12 +14,11 @@ */ #import "OFObject.h" #import "OFDNSResolver.h" #import "OFRunLoop.h" - -#import "socket.h" +#import "OFSocket.h" OF_ASSUME_NONNULL_BEGIN @class OFDNSResolverSettings; @class OFDNSResourceRecord; @@ -28,27 +27,27 @@ @class OFString; @interface OFHostAddressResolver: OFObject { OFString *_host; - of_socket_address_family_t _addressFamily; + OFSocketAddressFamily _addressFamily; OFDNSResolver *_resolver; OFDNSResolverSettings *_settings; - of_run_loop_mode_t _Nullable _runLoopMode; + OFRunLoopMode _Nullable _runLoopMode; id _Nullable _delegate; bool _isFQDN; size_t _searchDomainIndex; unsigned int _numExpectedResponses; OFMutableData *_addresses; } - (instancetype)initWithHost: (OFString *)host - addressFamily: (of_socket_address_family_t)addressFamily + addressFamily: (OFSocketAddressFamily)addressFamily resolver: (OFDNSResolver *)resolver settings: (OFDNSResolverSettings *)settings - runLoopMode: (nullable of_run_loop_mode_t)runLoopMode + runLoopMode: (nullable OFRunLoopMode)runLoopMode delegate: (nullable id )delegate; - (void)asyncResolve; - (OFData *)resolve; @end OF_ASSUME_NONNULL_END Index: src/OFHostAddressResolver.m ================================================================== --- src/OFHostAddressResolver.m +++ src/OFHostAddressResolver.m @@ -38,12 +38,12 @@ OFData *_addresses; id _exception; } @end -static const of_run_loop_mode_t resolveRunLoopMode = - @"of_host_address_resolver_resolve_mode"; +static const OFRunLoopMode resolveRunLoopMode = + @"OFHostAddressResolverResolveRunLoopMode"; static bool isFQDN(OFString *host, unsigned int minNumberOfDotsInAbsoluteName) { const char *UTF8String; @@ -64,24 +64,23 @@ return (dots >= minNumberOfDotsInAbsoluteName); } static bool addressForRecord(OF_KINDOF(OFDNSResourceRecord *) record, - const of_socket_address_t **address, - of_socket_address_family_t addressFamily) + const OFSocketAddress **address, OFSocketAddressFamily addressFamily) { switch ([record recordType]) { #ifdef OF_HAVE_IPV6 - case OF_DNS_RECORD_TYPE_AAAA: - if (addressFamily != OF_SOCKET_ADDRESS_FAMILY_IPV6 && - addressFamily != OF_SOCKET_ADDRESS_FAMILY_ANY) + case OFDNSRecordTypeAAAA: + if (addressFamily != OFSocketAddressFamilyIPv6 && + addressFamily != OFSocketAddressFamilyAny) return false; break; #endif - case OF_DNS_RECORD_TYPE_A: - if (addressFamily != OF_SOCKET_ADDRESS_FAMILY_IPV4 && - addressFamily != OF_SOCKET_ADDRESS_FAMILY_ANY) + case OFDNSRecordTypeA: + if (addressFamily != OFSocketAddressFamilyIPv4 && + addressFamily != OFSocketAddressFamilyAny) return false; break; default: return false; } @@ -89,11 +88,11 @@ *address = [record address]; return true; } static void -callDelegateInMode(of_run_loop_mode_t runLoopMode, +callDelegateInMode(OFRunLoopMode runLoopMode, id delegate, OFDNSResolver *resolver, OFString *host, OFData *addresses, id exception) { SEL selector = @selector(resolver:didResolveHost:addresses:exception:); @@ -112,14 +111,14 @@ } } @implementation OFHostAddressResolver: OFObject - (instancetype)initWithHost: (OFString *)host - addressFamily: (of_socket_address_family_t)addressFamily + addressFamily: (OFSocketAddressFamily)addressFamily resolver: (OFDNSResolver *)resolver settings: (OFDNSResolverSettings *)settings - runLoopMode: (of_run_loop_mode_t)runLoopMode + runLoopMode: (OFRunLoopMode)runLoopMode delegate: (id )delegate { self = [super init]; @try { @@ -161,29 +160,29 @@ _host, searchDomain]; } else domainName = _host; #ifdef OF_HAVE_IPV6 - if (_addressFamily == OF_SOCKET_ADDRESS_FAMILY_IPV6 || - _addressFamily == OF_SOCKET_ADDRESS_FAMILY_ANY) { + if (_addressFamily == OFSocketAddressFamilyIPv6 || + _addressFamily == OFSocketAddressFamilyAny) { OFDNSQuery *query = [OFDNSQuery queryWithDomainName: domainName - DNSClass: OF_DNS_CLASS_IN - recordType: OF_DNS_RECORD_TYPE_AAAA]; + DNSClass: OFDNSClassIN + recordType: OFDNSRecordTypeAAAA]; _numExpectedResponses++; [_resolver asyncPerformQuery: query runLoopMode: _runLoopMode delegate: self]; } #endif - if (_addressFamily == OF_SOCKET_ADDRESS_FAMILY_IPV4 || - _addressFamily == OF_SOCKET_ADDRESS_FAMILY_ANY) { + if (_addressFamily == OFSocketAddressFamilyIPv4 || + _addressFamily == OFSocketAddressFamilyAny) { OFDNSQuery *query = [OFDNSQuery queryWithDomainName: domainName - DNSClass: OF_DNS_CLASS_IN - recordType: OF_DNS_RECORD_TYPE_A]; + DNSClass: OFDNSClassIN + recordType: OFDNSRecordTypeA]; _numExpectedResponses++; [_resolver asyncPerformQuery: query runLoopMode: _runLoopMode delegate: self]; } @@ -195,37 +194,37 @@ exception: (id)exception { _numExpectedResponses--; if ([exception isKindOfClass: [OFDNSQueryFailedException class]] && - [exception error] == OF_DNS_RESOLVER_ERROR_SERVER_NAME_ERROR && + [exception errorCode] == OFDNSResolverErrorCodeServerNameError && !_isFQDN && _numExpectedResponses == 0 && _addresses.count == 0 && _searchDomainIndex + 1 < _settings->_searchDomains.count) { _searchDomainIndex++; [self sendQueries]; return; } for (OF_KINDOF(OFDNSResourceRecord *) record in [response.answerRecords objectForKey: query.domainName]) { - const of_socket_address_t *address = NULL; + const OFSocketAddress *address = NULL; OFDNSQuery *CNAMEQuery; - if ([record DNSClass] != OF_DNS_CLASS_IN) + if ([record DNSClass] != OFDNSClassIN) continue; if (addressForRecord(record, &address, _addressFamily)) { [_addresses addItem: address]; continue; } - if ([record recordType] != OF_DNS_RECORD_TYPE_CNAME) + if ([record recordType] != OFDNSRecordTypeCNAME) continue; /* FIXME: Check if it's already in answers */ CNAMEQuery = [OFDNSQuery queryWithDomainName: [record alias] - DNSClass: OF_DNS_CLASS_IN + DNSClass: OFDNSClassIN recordType: query.recordType]; _numExpectedResponses++; [_resolver asyncPerformQuery: CNAMEQuery runLoopMode: _runLoopMode delegate: self]; @@ -243,17 +242,17 @@ if ([exception isKindOfClass: [OFDNSQueryFailedException class]]) exception = [OFResolveHostFailedException exceptionWithHost: _host addressFamily: _addressFamily - error: [exception error]]; + errorCode: [exception errorCode]]; if (exception == nil) exception = [OFResolveHostFailedException exceptionWithHost: _host addressFamily: _addressFamily - error: OF_DNS_RESOLVER_ERROR_NO_RESULT]; + errorCode: OFDNSResolverErrorCodeNoResult]; } else exception = nil; if ([_delegate respondsToSelector: @selector(resolver:didResolveHost:addresses:exception:)]) @@ -267,17 +266,16 @@ { void *pool = objc_autoreleasePoolPush(); OFArray OF_GENERIC(OFString *) *aliases; @try { - of_socket_address_t address = - of_socket_address_parse_ip(_host, 0); + OFSocketAddress address = OFSocketAddressParseIP(_host, 0); OFData *addresses = nil; id exception = nil; if (_addressFamily == address.family || - _addressFamily == OF_SOCKET_ADDRESS_FAMILY_ANY) + _addressFamily == OFSocketAddressFamilyAny) addresses = [OFData dataWithItems: &address count: 1 itemSize: sizeof(address)]; else exception = [OFInvalidArgumentException exception]; @@ -290,24 +288,24 @@ } @catch (OFInvalidFormatException *e) { } if ((aliases = [_settings->_staticHosts objectForKey: _host]) != nil) { OFMutableData *addresses = [OFMutableData - dataWithItemSize: sizeof(of_socket_address_t)]; + dataWithItemSize: sizeof(OFSocketAddress)]; id exception = nil; for (OFString *alias in aliases) { - of_socket_address_t address; + OFSocketAddress address; @try { - address = of_socket_address_parse_ip(alias, 0); + address = OFSocketAddressParseIP(alias, 0); } @catch (OFInvalidFormatException *e) { continue; } if (_addressFamily != address.family && - _addressFamily != OF_SOCKET_ADDRESS_FAMILY_ANY) + _addressFamily != OFSocketAddressFamilyAny) continue; [addresses addItem: &address]; } @@ -316,11 +314,11 @@ if (addresses.count == 0) { addresses = nil; exception = [OFResolveHostFailedException exceptionWithHost: _host addressFamily: _addressFamily - error: OF_DNS_RESOLVER_ERROR_NO_RESULT]; + errorCode: OFDNSResolverErrorCodeNoResult]; } callDelegateInMode(_runLoopMode, _delegate, _resolver, _host, addresses, exception); @@ -328,11 +326,11 @@ return; } _isFQDN = isFQDN(_host, _settings->_minNumberOfDotsInAbsoluteName); _addresses = [[OFMutableData alloc] - initWithItemSize: sizeof(of_socket_address_t)]; + initWithItemSize: sizeof(OFSocketAddress)]; [self sendQueries]; objc_autoreleasePoolPop(pool); } ADDED src/OFHuffmanTree.h Index: src/OFHuffmanTree.h ================================================================== --- src/OFHuffmanTree.h +++ src/OFHuffmanTree.h @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include +#include + +#import "macros.h" + +#import "OFInvalidFormatException.h" + +OF_ASSUME_NONNULL_BEGIN + +typedef struct _OFHuffmanTree { + struct _OFHuffmanTree *_Nullable leaves[2]; + uint16_t value; +} *OFHuffmanTree; + +/* Inlined for performance. */ +static OF_INLINE bool +OFHuffmanTreeWalk(id _Nullable stream, + bool (*bitReader)(id _Nullable, uint16_t *_Nonnull, uint8_t), + OFHuffmanTree _Nonnull *_Nonnull tree, uint16_t *_Nonnull value) +{ + OFHuffmanTree iter = *tree; + uint16_t bits; + + while (iter->value == 0xFFFF) { + if OF_UNLIKELY (!bitReader(stream, &bits, 1)) { + *tree = iter; + return false; + } + + if OF_UNLIKELY (iter->leaves[bits] == NULL) + @throw [OFInvalidFormatException exception]; + + iter = iter->leaves[bits]; + } + + *value = iter->value; + return true; +} + +#ifdef __cplusplus +extern "C" { +#endif +extern OFHuffmanTree _Nonnull OFHuffmanTreeNew(uint8_t lengths[_Nonnull], + uint16_t count); +extern OFHuffmanTree _Nonnull OFHuffmanTreeNewSingle(uint16_t value); +extern void OFHuffmanTreeFree(OFHuffmanTree _Nonnull tree); +#ifdef __cplusplus +} +#endif + +OF_ASSUME_NONNULL_END ADDED src/OFHuffmanTree.m Index: src/OFHuffmanTree.m ================================================================== --- src/OFHuffmanTree.m +++ src/OFHuffmanTree.m @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#include +#include + +#import "OFHuffmanTree.h" + +#import "OFInvalidFormatException.h" +#import "OFOutOfMemoryException.h" + +static OFHuffmanTree +newTree(void) +{ + OFHuffmanTree tree; + + tree = OFAllocMemory(1, sizeof(*tree)); + tree->leaves[0] = tree->leaves[1] = NULL; + tree->value = 0xFFFF; + + return tree; +} + +static void +treeInsert(OFHuffmanTree tree, uint16_t code, uint8_t length, uint16_t value) +{ + while (length > 0) { + uint8_t bit; + + length--; + bit = (code & (1u << length)) >> length; + + if (tree->leaves[bit] == NULL) + tree->leaves[bit] = newTree(); + + tree = tree->leaves[bit]; + } + + tree->value = value; +} + +OFHuffmanTree +OFHuffmanTreeNew(uint8_t lengths[], uint16_t count) +{ + OFHuffmanTree tree; + uint16_t *lengthCount = NULL; + uint16_t code, maxCode = 0, *nextCode = NULL; + uint_fast8_t maxBit = 0; + + @try { + for (uint16_t i = 0; i < count; i++) { + uint_fast8_t length = lengths[i]; + + if OF_UNLIKELY (length > maxBit) { + lengthCount = OFResizeMemory(lengthCount, + length + 1, sizeof(uint16_t)); + nextCode = OFResizeMemory(nextCode, + length + 1, sizeof(uint16_t)); + + for (uint_fast8_t j = maxBit + 1; j <= length; + j++) { + lengthCount[j] = 0; + nextCode[j] = 0; + } + + maxBit = length; + } + + if (length > 0) { + lengthCount[length]++; + maxCode = i; + } + } + + code = 0; + for (size_t i = 1; i <= maxBit; i++) { + code = (code + lengthCount[i - 1]) << 1; + nextCode[i] = code; + } + + tree = newTree(); + + for (uint16_t i = 0; i <= maxCode; i++) { + uint8_t length = lengths[i]; + + if (length > 0) + treeInsert(tree, nextCode[length]++, length, i); + } + } @finally { + OFFreeMemory(lengthCount); + OFFreeMemory(nextCode); + } + + return tree; +} + +OFHuffmanTree +OFHuffmanTreeNewSingle(uint16_t value) +{ + OFHuffmanTree tree = newTree(); + + tree->value = value; + + return tree; +} + +void +OFHuffmanTreeFree(OFHuffmanTree tree) +{ + for (uint_fast8_t i = 0; i < 2; i++) + if OF_LIKELY (tree->leaves[i] != NULL) + OFHuffmanTreeFree(tree->leaves[i]); + + OFFreeMemory(tree); +} Index: src/OFINICategory+Private.h ================================================================== --- src/OFINICategory+Private.h +++ src/OFINICategory+Private.h @@ -23,10 +23,10 @@ OF_DIRECT_MEMBERS @interface OFINICategory () - (instancetype)of_initWithName: (OFString *)name OF_METHOD_FAMILY(init); - (void)of_parseLine: (OFString *)line; - (bool)of_writeToStream: (OFStream *)stream - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding first: (bool)first; @end OF_ASSUME_NONNULL_END Index: src/OFINICategory.h ================================================================== --- src/OFINICategory.h +++ src/OFINICategory.h @@ -138,22 +138,22 @@ - (OFArray OF_GENERIC(OFString *) *)stringArrayForKey: (OFString *)key; /** * @brief Sets the value of the specified key to the specified string. * - * If the specified key is a multi-key (see @ref stringValuesForKey:), the - * value of the first key/value pair found is changed. + * If the specified key is a multi-key (see @ref stringArrayForKey:), the value + * of the first key/value pair found is changed. * * @param string The string to which the key should be set * @param key The key for which the new value should be set */ - (void)setString: (OFString *)string forKey: (OFString *)key; /** * @brief Sets the value of the specified key to the specified long long. * - * If the specified key is a multi-key (see @ref stringValuesForKey:), the value + * If the specified key is a multi-key (see @ref stringArrayForKey:), the value * of the first key/value pair found is changed. * * @param longLong The long long to which the key should be set * @param key The key for which the new value should be set */ @@ -160,33 +160,33 @@ - (void)setLongLong: (long long)longLong forKey: (OFString *)key; /** * @brief Sets the value of the specified key to the specified bool. * - * If the specified key is a multi-key (see @ref stringValuesForKey:), the - * value of the first key/value pair found is changed. + * If the specified key is a multi-key (see @ref stringArrayForKey:), the value + * of the first key/value pair found is changed. * * @param bool_ The bool to which the key should be set * @param key The key for which the new value should be set */ - (void)setBool: (bool)bool_ forKey: (OFString *)key; /** * @brief Sets the value of the specified key to the specified float. * - * If the specified key is a multi-key (see @ref stringValuesForKey:), the - * value of the first key/value pair found is changed. + * If the specified key is a multi-key (see @ref stringArrayForKey:), the value + * of the first key/value pair found is changed. * * @param float_ The float to which the key should be set * @param key The key for which the new value should be set */ - (void)setFloat: (float)float_ forKey: (OFString *)key; /** * @brief Sets the value of the specified key to the specified double. * - * If the specified key is a multi-key (see @ref stringValuesForKey:), the value + * If the specified key is a multi-key (see @ref stringArrayForKey:), the value * of the first key/value pair found is changed. * * @param double_ The double to which the key should be set * @param key The key for which the new value should be set */ @@ -208,14 +208,14 @@ forKey: (OFString *)key; /** * @brief Removes the value for the specified key * - * If the specified key is a multi-key (see @ref stringValuesForKey:), all + * If the specified key is a multi-key (see @ref stringArrayForKey:), all * key/value pairs matching the specified key are removed. * * @param key The key of the value to remove */ - (void)removeValueForKey: (OFString *)key; @end OF_ASSUME_NONNULL_END Index: src/OFINICategory.m ================================================================== --- src/OFINICategory.m +++ src/OFINICategory.m @@ -72,11 +72,11 @@ OFMutableString *mutableString; if (![string hasPrefix: @"\""] || ![string hasSuffix: @"\""]) return string; - string = [string substringWithRange: of_range(1, string.length - 2)]; + string = [string substringWithRange: OFRangeMake(1, string.length - 2)]; mutableString = [[string mutableCopy] autorelease]; [mutableString replaceOccurrencesOfString: @"\\f" withString: @"\f"]; [mutableString replaceOccurrencesOfString: @"\\r" withString: @"\r"]; [mutableString replaceOccurrencesOfString: @"\\n" withString: @"\n"]; @@ -154,11 +154,11 @@ OFINICategoryPair *pair = [[[OFINICategoryPair alloc] init] autorelease]; OFString *key, *value; size_t pos; - if ((pos = [line rangeOfString: @"="].location) == OF_NOT_FOUND) + if ((pos = [line rangeOfString: @"="].location) == OFNotFound) @throw [OFInvalidFormatException exception]; key = unescapeString([line substringToIndex: pos] .stringByDeletingEnclosingWhitespaces); value = unescapeString([line substringFromIndex: pos + 1] @@ -466,11 +466,11 @@ objc_autoreleasePoolPop(pool); } - (bool)of_writeToStream: (OFStream *)stream - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding first: (bool)first { if (_lines.count == 0) return false; Index: src/OFINIFile.h ================================================================== --- src/OFINIFile.h +++ src/OFINIFile.h @@ -54,11 +54,11 @@ * @param encoding The encoding of the specified file * * @return A new, autoreleased OFINIFile with the contents of the specified file */ + (instancetype)fileWithPath: (OFString *)path - encoding: (of_string_encoding_t)encoding; + encoding: (OFStringEncoding)encoding; - (instancetype)init OF_UNAVAILABLE; /** * @brief Initializes an already allocated OFINIFile with the contents of the @@ -78,11 +78,11 @@ * @param encoding The encoding of the specified file * * @return An initialized OFINIFile with the contents of the specified file */ - (instancetype)initWithPath: (OFString *)path - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding OF_DESIGNATED_INITIALIZER; /** * @brief Returns an @ref OFINICategory for the category with the specified * name. @@ -106,9 +106,9 @@ * encoding. * * @param path The path of the file to write to * @param encoding The encoding to use */ -- (void)writeToFile: (OFString *)path encoding: (of_string_encoding_t)encoding; +- (void)writeToFile: (OFString *)path encoding: (OFStringEncoding)encoding; @end OF_ASSUME_NONNULL_END Index: src/OFINIFile.m ================================================================== --- src/OFINIFile.m +++ src/OFINIFile.m @@ -27,21 +27,21 @@ #import "OFInvalidFormatException.h" #import "OFOpenItemFailedException.h" OF_DIRECT_MEMBERS @interface OFINIFile () -- (void)of_parseFile: (OFString *)path encoding: (of_string_encoding_t)encoding; +- (void)of_parseFile: (OFString *)path encoding: (OFStringEncoding)encoding; @end static bool isWhitespaceLine(OFString *line) { const char *cString = line.UTF8String; size_t length = line.UTF8StringLength; for (size_t i = 0; i < length; i++) - if (!of_ascii_isspace(cString[i])) + if (!OFASCIIIsSpace(cString[i])) return false; return true; } @@ -52,11 +52,11 @@ { return [[[self alloc] initWithPath: path] autorelease]; } + (instancetype)fileWithPath: (OFString *)path - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { return [[[self alloc] initWithPath: path encoding: encoding] autorelease]; } @@ -65,15 +65,15 @@ OF_INVALID_INIT_METHOD } - (instancetype)initWithPath: (OFString *)path { - return [self initWithPath: path encoding: OF_STRING_ENCODING_UTF_8]; + return [self initWithPath: path encoding: OFStringEncodingUTF8]; } - (instancetype)initWithPath: (OFString *)path - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { self = [super init]; @try { _categories = [[OFMutableArray alloc] init]; @@ -109,11 +109,11 @@ objc_autoreleasePoolPop(pool); return category; } -- (void)of_parseFile: (OFString *)path encoding: (of_string_encoding_t)encoding +- (void)of_parseFile: (OFString *)path encoding: (OFStringEncoding)encoding { void *pool = objc_autoreleasePoolPush(); OFFile *file; OFINICategory *category = nil; OFString *line; @@ -137,11 +137,11 @@ if (![line hasSuffix: @"]"]) @throw [OFInvalidFormatException exception]; categoryName = [line substringWithRange: - of_range(1, line.length - 2)]; + OFRangeMake(1, line.length - 2)]; category = [[[OFINICategory alloc] of_initWithName: categoryName] autorelease]; [_categories addObject: category]; } else { if (category == nil) @@ -154,14 +154,14 @@ objc_autoreleasePoolPop(pool); } - (void)writeToFile: (OFString *)path { - [self writeToFile: path encoding: OF_STRING_ENCODING_UTF_8]; + [self writeToFile: path encoding: OFStringEncodingUTF8]; } -- (void)writeToFile: (OFString *)path encoding: (of_string_encoding_t)encoding +- (void)writeToFile: (OFString *)path encoding: (OFStringEncoding)encoding { void *pool = objc_autoreleasePoolPush(); OFFile *file = [OFFile fileWithPath: path mode: @"w"]; bool first = true; Index: src/OFINIFileSettings.m ================================================================== --- src/OFINIFileSettings.m +++ src/OFINIFileSettings.m @@ -55,13 +55,13 @@ - (void)of_getCategory: (OFString **)category andKey: (OFString **)key forPath: (OFString *)path OF_DIRECT { size_t pos = [path rangeOfString: @"." - options: OF_STRING_SEARCH_BACKWARDS].location; + options: OFStringSearchBackwards].location; - if (pos == OF_NOT_FOUND) { + if (pos == OFNotFound) { *category = @""; *key = path; return; } Index: src/OFIPSocketAsyncConnector.h ================================================================== --- src/OFIPSocketAsyncConnector.h +++ src/OFIPSocketAsyncConnector.h @@ -18,13 +18,13 @@ #import "OFRunLoop+Private.h" OF_ASSUME_NONNULL_BEGIN @protocol OFIPSocketAsyncConnecting -- (bool)of_createSocketForAddress: (const of_socket_address_t *)address +- (bool)of_createSocketForAddress: (const OFSocketAddress *)address errNo: (int *)errNo; -- (bool)of_connectSocketToAddress: (const of_socket_address_t *)address +- (bool)of_connectSocketToAddress: (const OFSocketAddress *)address errNo: (int *)errNo; - (void)of_closeSocket; @end @interface OFIPSocketAsyncConnector: OFObject = _socketAddresses.count) { _exception = [[OFConnectionFailedException alloc] initWithHost: _host @@ -222,15 +221,14 @@ [self tryNextAddressWithRunLoopMode: [OFRunLoop currentRunLoop].currentMode]; } -- (void)startWithRunLoopMode: (of_run_loop_mode_t)runLoopMode +- (void)startWithRunLoopMode: (OFRunLoopMode)runLoopMode { @try { - of_socket_address_t address = - of_socket_address_parse_ip(_host, _port); + OFSocketAddress address = OFSocketAddressParseIP(_host, _port); _socketAddresses = [[OFData alloc] initWithItems: &address count: 1 itemSize: sizeof(address)]; @@ -240,10 +238,10 @@ } @catch (OFInvalidFormatException *e) { } [[OFThread DNSResolver] asyncResolveAddressesForHost: _host - addressFamily: OF_SOCKET_ADDRESS_FAMILY_ANY + addressFamily: OFSocketAddressFamilyAny runLoopMode: runLoopMode delegate: self]; } @end Index: src/OFIPXSocket.h ================================================================== --- src/OFIPXSocket.h +++ src/OFIPXSocket.h @@ -30,15 +30,15 @@ /** * @class OFIPXSocket OFIPXSocket.h ObjFW/OFIPXSocket.h * * @brief A class which provides methods to create and use IPX sockets. * - * Addresses are of type @ref of_socket_address_t. You can use - * @ref of_socket_address_ipx to create an address or - * @ref of_socket_address_get_ipx_network to get the IPX network, - * @ref of_socket_address_get_ipx_node to get the IPX node and - * @ref of_socket_address_get_port to get the port (sometimes also called + * Addresses are of type @ref OFSocketAddress. You can use + * @ref OFSocketAddressMakeIPX to create an address or + * @ref OFSocketAddressIPXNetwork to get the IPX network, + * @ref OFSocketAddressIPXNode to get the IPX node and + * @ref OFSocketAddressPort to get the port (sometimes also called * socket number). * * @warning Even though the OFCopying protocol is implemented, it does *not* * return an independent copy of the socket, but instead retains it. * This is so that the socket can be used as a key for a dictionary, @@ -70,10 +70,9 @@ * @param port The port (sometimes called socket number) to bind to. 0 means to * pick one and return it. * @param packetType The packet type to use on the socket * @return The address on which this socket can be reached */ -- (of_socket_address_t)bindToPort: (uint16_t)port - packetType: (uint8_t)packetType; +- (OFSocketAddress)bindToPort: (uint16_t)port packetType: (uint8_t)packetType; @end OF_ASSUME_NONNULL_END Index: src/OFIPXSocket.m ================================================================== --- src/OFIPXSocket.m +++ src/OFIPXSocket.m @@ -20,88 +20,86 @@ #ifdef HAVE_FCNTL_H # include #endif #import "OFIPXSocket.h" +#import "OFSocket.h" +#import "OFSocket+Private.h" #import "OFAlreadyConnectedException.h" #import "OFBindFailedException.h" -#import "socket.h" -#import "socket_helpers.h" - @implementation OFIPXSocket @dynamic delegate; -- (of_socket_address_t)bindToPort: (uint16_t)port - packetType: (uint8_t)packetType +- (OFSocketAddress)bindToPort: (uint16_t)port packetType: (uint8_t)packetType { const unsigned char zeroNode[IPX_NODE_LEN] = { 0 }; - of_socket_address_t address; + OFSocketAddress address; int protocol = 0; #if SOCK_CLOEXEC == 0 && defined(HAVE_FCNTL_H) && defined(FD_CLOEXEC) int flags; #endif - if (_socket != INVALID_SOCKET) + if (_socket != OFInvalidSocketHandle) @throw [OFAlreadyConnectedException exceptionWithSocket: self]; - address = of_socket_address_ipx(zeroNode, 0, port); + address = OFSocketAddressMakeIPX(zeroNode, 0, port); #ifdef OF_WINDOWS protocol = NSPROTO_IPX + packetType; #else _packetType = address.sockaddr.ipx.sipx_type = packetType; #endif if ((_socket = socket(address.sockaddr.sockaddr.sa_family, - SOCK_DGRAM | SOCK_CLOEXEC, protocol)) == INVALID_SOCKET) + SOCK_DGRAM | SOCK_CLOEXEC, protocol)) == OFInvalidSocketHandle) @throw [OFBindFailedException exceptionWithPort: port packetType: packetType socket: self - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; _canBlock = true; #if SOCK_CLOEXEC == 0 && defined(HAVE_FCNTL_H) && defined(FD_CLOEXEC) if ((flags = fcntl(_socket, F_GETFD, 0)) != -1) fcntl(_socket, F_SETFD, flags | FD_CLOEXEC); #endif if (bind(_socket, &address.sockaddr.sockaddr, address.length) != 0) { - int errNo = of_socket_errno(); + int errNo = OFSocketErrNo(); closesocket(_socket); - _socket = INVALID_SOCKET; + _socket = OFInvalidSocketHandle; @throw [OFBindFailedException exceptionWithPort: port packetType: packetType socket: self errNo: errNo]; } memset(&address, 0, sizeof(address)); - address.family = OF_SOCKET_ADDRESS_FAMILY_IPX; + address.family = OFSocketAddressFamilyIPX; address.length = (socklen_t)sizeof(address.sockaddr); - if (of_getsockname(_socket, &address.sockaddr.sockaddr, + if (OFGetSockName(_socket, &address.sockaddr.sockaddr, &address.length) != 0) { - int errNo = of_socket_errno(); + int errNo = OFSocketErrNo(); closesocket(_socket); - _socket = INVALID_SOCKET; + _socket = OFInvalidSocketHandle; @throw [OFBindFailedException exceptionWithPort: port packetType: packetType socket: self errNo: errNo]; } if (address.sockaddr.sockaddr.sa_family != AF_IPX) { closesocket(_socket); - _socket = INVALID_SOCKET; + _socket = OFInvalidSocketHandle; @throw [OFBindFailedException exceptionWithPort: port packetType: packetType socket: self errNo: EAFNOSUPPORT]; @@ -111,19 +109,19 @@ } #ifndef OF_WINDOWS - (void)sendBuffer: (const void *)buffer length: (size_t)length - receiver: (const of_socket_address_t *)receiver + receiver: (const OFSocketAddress *)receiver { - of_socket_address_t fixedReceiver; + OFSocketAddress fixedReceiver; memcpy(&fixedReceiver, receiver, sizeof(fixedReceiver)); /* If it's not IPX, no fix-up needed - it will fail anyway. */ - if (fixedReceiver.family == OF_SOCKET_ADDRESS_FAMILY_IPX) + if (fixedReceiver.family == OFSocketAddressFamilyIPX) fixedReceiver.sockaddr.ipx.sipx_type = _packetType; [super sendBuffer: buffer length: length receiver: &fixedReceiver]; } #endif @end Index: src/OFInflate64Stream.h ================================================================== --- src/OFInflate64Stream.h +++ src/OFInflate64Stream.h @@ -12,15 +12,16 @@ * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #import "OFStream.h" +#import "OFHuffmanTree.h" #import "OFKernelEventObserver.h" OF_ASSUME_NONNULL_BEGIN -#define OF_INFLATE64_STREAM_BUFFER_SIZE 4096 +#define OFInflate64StreamBufferSize 4096 /** * @class OFInflate64Stream OFInflate64Stream.h ObjFW/OFInflate64Stream.h * * @note This class only conforms to OFReadyForReadingObserving if the @@ -31,11 +32,11 @@ */ OF_SUBCLASSING_RESTRICTED @interface OFInflate64Stream: OFStream { OFStream *_stream; - unsigned char _buffer[OF_INFLATE64_STREAM_BUFFER_SIZE]; + unsigned char _buffer[OFInflate64StreamBufferSize]; uint16_t _bufferIndex, _bufferLength; uint8_t _byte; uint8_t _bitIndex, _savedBitsLength; uint16_t _savedBits; unsigned char *_Nullable _slidingWindow; @@ -48,23 +49,23 @@ } uncompressedHeader; struct { uint16_t position, length; } uncompressed; struct { - struct of_huffman_tree *_Nullable litLenTree; - struct of_huffman_tree *_Nullable distTree; - struct of_huffman_tree *_Nullable codeLenTree; - struct of_huffman_tree *_Nullable treeIter; + OFHuffmanTree _Nullable litLenTree; + OFHuffmanTree _Nullable distTree; + OFHuffmanTree _Nullable codeLenTree; + OFHuffmanTree _Nullable treeIter; uint8_t *_Nullable lengths; uint16_t receivedCount; uint8_t value, litLenCodesCount, distCodesCount; uint8_t codeLenCodesCount; } huffmanTree; struct { - struct of_huffman_tree *_Nullable litLenTree; - struct of_huffman_tree *_Nullable distTree; - struct of_huffman_tree *_Nullable treeIter; + OFHuffmanTree _Nullable litLenTree; + OFHuffmanTree _Nullable distTree; + OFHuffmanTree _Nullable treeIter; int state; uint16_t value, length, distance, extraBits; } huffman; } _context; bool _inLastBlock, _atEndOfStream; Index: src/OFInflateStream.h ================================================================== --- src/OFInflateStream.h +++ src/OFInflateStream.h @@ -12,15 +12,16 @@ * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #import "OFStream.h" +#import "OFHuffmanTree.h" #import "OFKernelEventObserver.h" OF_ASSUME_NONNULL_BEGIN -#define OF_INFLATE_STREAM_BUFFER_SIZE 4096 +#define OFInflateStreamBufferSize 4096 /** * @class OFInflateStream OFInflateStream.h ObjFW/OFInflateStream.h * * @note This class only conforms to OFReadyForReadingObserving if the @@ -31,11 +32,11 @@ */ OF_SUBCLASSING_RESTRICTED @interface OFInflateStream: OFStream { OFStream *_stream; - unsigned char _buffer[OF_INFLATE_STREAM_BUFFER_SIZE]; + unsigned char _buffer[OFInflateStreamBufferSize]; uint16_t _bufferIndex, _bufferLength; uint8_t _byte; uint8_t _bitIndex, _savedBitsLength; uint16_t _savedBits; unsigned char *_Nullable _slidingWindow; @@ -48,23 +49,23 @@ } uncompressedHeader; struct { uint16_t position, length; } uncompressed; struct { - struct of_huffman_tree *_Nullable litLenTree; - struct of_huffman_tree *_Nullable distTree; - struct of_huffman_tree *_Nullable codeLenTree; - struct of_huffman_tree *_Nullable treeIter; + OFHuffmanTree _Nullable litLenTree; + OFHuffmanTree _Nullable distTree; + OFHuffmanTree _Nullable codeLenTree; + OFHuffmanTree _Nullable treeIter; uint8_t *_Nullable lengths; uint16_t receivedCount; uint8_t value, litLenCodesCount, distCodesCount; uint8_t codeLenCodesCount; } huffmanTree; struct { - struct of_huffman_tree *_Nullable litLenTree; - struct of_huffman_tree *_Nullable distTree; - struct of_huffman_tree *_Nullable treeIter; + OFHuffmanTree _Nullable litLenTree; + OFHuffmanTree _Nullable distTree; + OFHuffmanTree _Nullable treeIter; int state; uint16_t value, length, distance, extraBits; } huffman; } _context; bool _inLastBlock, _atEndOfStream; Index: src/OFInflateStream.m ================================================================== --- src/OFInflateStream.m +++ src/OFInflateStream.m @@ -24,39 +24,38 @@ # import "OFInflateStream.h" #else # import "OFInflate64Stream.h" # define OFInflateStream OFInflate64Stream #endif - -#import "huffman_tree.h" +#import "OFHuffmanTree.h" #import "OFInitializationFailedException.h" #import "OFInvalidFormatException.h" #import "OFNotOpenException.h" #import "OFOutOfMemoryException.h" #ifndef OF_INFLATE64_STREAM_M -# define BUFFER_SIZE OF_INFLATE_STREAM_BUFFER_SIZE +# define bufferSize OFInflateStreamBufferSize #else -# define BUFFER_SIZE OF_INFLATE64_STREAM_BUFFER_SIZE +# define bufferSize OFInflate64StreamBufferSize #endif -enum state { - BLOCK_HEADER, - UNCOMPRESSED_BLOCK_HEADER, - UNCOMPRESSED_BLOCK, - HUFFMAN_TREE, - HUFFMAN_BLOCK +enum State { + stateBlockHeader, + stateUncompressedBlockHeader, + stateUncompressedBlock, + stateHuffmanTree, + stateHuffmanBlock }; -enum huffman_state { - WRITE_VALUE, - AWAIT_CODE, - AWAIT_LENGTH_EXTRA_BITS, - AWAIT_DISTANCE, - AWAIT_DISTANCE_EXTRA_BITS, - PROCESS_PAIR +enum HuffmanState { + huffmanStateWriteValue, + huffmanStateAwaitCode, + huffmanStateAwaitLengthExtraBits, + huffmanStateAwaitDistance, + huffmanStateAwaitDistanceExtraBits, + huffmanStateProcessPair }; #ifndef OF_INFLATE64_STREAM_M static const uint8_t numDistanceCodes = 30; static const uint8_t lengthCodes[29] = { @@ -98,11 +97,11 @@ }; #endif static const uint8_t codeLengthsOrder[19] = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 }; -static struct of_huffman_tree *fixedLitLenTree, *fixedDistTree; +static OFHuffmanTree fixedLitLenTree, fixedDistTree; @implementation OFInflateStream static OF_INLINE bool tryReadBits(OFInflateStream *stream, uint16_t *bits, uint8_t count) { @@ -117,11 +116,11 @@ stream->_byte = stream->_buffer[stream->_bufferIndex++]; else { size_t length = [stream->_stream readIntoBuffer: stream->_buffer - length: BUFFER_SIZE]; + length: bufferSize]; if OF_UNLIKELY (length < 1) { stream->_savedBits = ret; stream->_savedBitsLength = i; return false; @@ -159,16 +158,16 @@ for (uint16_t i = 256; i <= 279; i++) lengths[i] = 7; for (uint16_t i = 280; i <= 287; i++) lengths[i] = 8; - fixedLitLenTree = of_huffman_tree_construct(lengths, 288); + fixedLitLenTree = OFHuffmanTreeNew(lengths, 288); for (uint16_t i = 0; i <= 31; i++) lengths[i] = 5; - fixedDistTree = of_huffman_tree_construct(lengths, 32); + fixedDistTree = OFHuffmanTreeNew(lengths, 32); } + (instancetype)streamWithStream: (OFStream *)stream { return [[[self alloc] initWithStream: stream] autorelease]; @@ -192,11 +191,11 @@ #ifdef OF_INFLATE64_STREAM_M _slidingWindowMask = 0xFFFF; #else _slidingWindowMask = 0x7FFF; #endif - _slidingWindow = of_alloc_zeroed(_slidingWindowMask + 1, 1); + _slidingWindow = OFAllocZeroedMemory(_slidingWindowMask + 1, 1); } @catch (id e) { [self release]; @throw e; } @@ -206,25 +205,24 @@ - (void)dealloc { if (_stream != nil) [self close]; - free(_slidingWindow); + OFFreeMemory(_slidingWindow); - if (_state == HUFFMAN_TREE) { - free(_context.huffmanTree.lengths); + if (_state == stateHuffmanTree) { + OFFreeMemory(_context.huffmanTree.lengths); if (_context.huffmanTree.codeLenTree != NULL) - of_huffman_tree_release( - _context.huffmanTree.codeLenTree); + OFHuffmanTreeFree(_context.huffmanTree.codeLenTree); } - if (_state == HUFFMAN_TREE || _state == HUFFMAN_BLOCK) { + if (_state == stateHuffmanTree || _state == stateHuffmanBlock) { if (_context.huffman.litLenTree != fixedLitLenTree) - of_huffman_tree_release(_context.huffman.litLenTree); + OFHuffmanTreeFree(_context.huffman.litLenTree); if (_context.huffman.distTree != fixedDistTree) - of_huffman_tree_release(_context.huffman.distTree); + OFHuffmanTreeFree(_context.huffman.distTree); } [super dealloc]; } @@ -242,12 +240,12 @@ if (_atEndOfStream) return 0; start: - switch ((enum state)_state) { - case BLOCK_HEADER: + switch ((enum State)_state) { + case stateBlockHeader: if OF_UNLIKELY (_inLastBlock) { [_stream unreadFromBuffer: _buffer + _bufferIndex length: _bufferLength - _bufferIndex]; _bufferIndex = _bufferLength = 0; @@ -261,24 +259,24 @@ _inLastBlock = (bits & 1); switch (bits >> 1) { case 0: /* No compression */ - _state = UNCOMPRESSED_BLOCK_HEADER; + _state = stateUncompressedBlockHeader; _bitIndex = 8; _context.uncompressedHeader.position = 0; memset(_context.uncompressedHeader.length, 0, 4); break; case 1: /* Fixed Huffman */ - _state = HUFFMAN_BLOCK; - _context.huffman.state = AWAIT_CODE; + _state = stateHuffmanBlock; + _context.huffman.state = huffmanStateAwaitCode; _context.huffman.litLenTree = fixedLitLenTree; _context.huffman.distTree = fixedDistTree; _context.huffman.treeIter = fixedLitLenTree; break; case 2: /* Dynamic Huffman */ - _state = HUFFMAN_TREE; + _state = stateHuffmanTree; _context.huffmanTree.lengths = NULL; _context.huffmanTree.receivedCount = 0; _context.huffmanTree.value = 0xFE; _context.huffmanTree.litLenCodesCount = 0xFF; _context.huffmanTree.distCodesCount = 0xFF; @@ -287,11 +285,11 @@ default: @throw [OFInvalidFormatException exception]; } goto start; - case UNCOMPRESSED_BLOCK_HEADER: + case stateUncompressedBlockHeader: #define CTX _context.uncompressedHeader /* FIXME: This can be done more efficiently than unreading */ [_stream unreadFromBuffer: _buffer + _bufferIndex length: _bufferLength - _bufferIndex]; _bufferIndex = _bufferLength = 0; @@ -305,11 +303,11 @@ if OF_UNLIKELY ((CTX.length[0] | (CTX.length[1] << 8)) != (uint16_t)~(CTX.length[2] | (CTX.length[3] << 8))) @throw [OFInvalidFormatException exception]; - _state = UNCOMPRESSED_BLOCK; + _state = stateUncompressedBlock; /* * Do not reorder! _context.uncompressed.position and * _context.uncompressedHeader.length overlap! */ @@ -317,11 +315,11 @@ CTX.length[0] | (CTX.length[1] << 8); _context.uncompressed.position = 0; goto start; #undef CTX - case UNCOMPRESSED_BLOCK: + case stateUncompressedBlock: #define CTX _context.uncompressed if OF_UNLIKELY (length == 0) return bytesWritten; tmp = (length < (size_t)CTX.length - CTX.position @@ -343,15 +341,15 @@ length -= tmp; bytesWritten += tmp; CTX.position += tmp; if OF_UNLIKELY (CTX.position == CTX.length) - _state = BLOCK_HEADER; + _state = stateBlockHeader; goto start; #undef CTX - case HUFFMAN_TREE: + case stateHuffmanTree: #define CTX _context.huffmanTree if OF_LIKELY (CTX.value == 0xFE) { if OF_LIKELY (CTX.litLenCodesCount == 0xFF) { if OF_UNLIKELY (!tryReadBits(self, &bits, 5)) return bytesWritten; @@ -376,11 +374,11 @@ CTX.codeLenCodesCount = bits; } if OF_LIKELY (CTX.lengths == NULL) - CTX.lengths = of_alloc_zeroed(19, 1); + CTX.lengths = OFAllocZeroedMemory(19, 1); for (uint16_t i = CTX.receivedCount; i < CTX.codeLenCodesCount + 4; i++) { if OF_UNLIKELY (!tryReadBits(self, &bits, 3)) { CTX.receivedCount = i; @@ -388,30 +386,29 @@ } CTX.lengths[codeLengthsOrder[i]] = bits; } - CTX.codeLenTree = of_huffman_tree_construct( - CTX.lengths, 19); + CTX.codeLenTree = OFHuffmanTreeNew(CTX.lengths, 19); CTX.treeIter = CTX.codeLenTree; - free(CTX.lengths); + OFFreeMemory(CTX.lengths); CTX.lengths = NULL; CTX.receivedCount = 0; CTX.value = 0xFF; } if OF_LIKELY (CTX.lengths == NULL) - CTX.lengths = of_alloc( + CTX.lengths = OFAllocMemory( CTX.litLenCodesCount + CTX.distCodesCount + 258, 1); for (uint16_t i = CTX.receivedCount; i < CTX.litLenCodesCount + CTX.distCodesCount + 258;) { uint8_t j, count; if OF_LIKELY (CTX.value == 0xFF) { - if OF_UNLIKELY (!of_huffman_tree_walk(self, + if OF_UNLIKELY (!OFHuffmanTreeWalk(self, tryReadBits, &CTX.treeIter, &value)) { CTX.receivedCount = i; return bytesWritten; } @@ -474,38 +471,38 @@ CTX.lengths[i++] = value; CTX.value = 0xFF; } - of_huffman_tree_release(CTX.codeLenTree); + OFHuffmanTreeFree(CTX.codeLenTree); CTX.codeLenTree = NULL; - CTX.litLenTree = of_huffman_tree_construct(CTX.lengths, + CTX.litLenTree = OFHuffmanTreeNew(CTX.lengths, CTX.litLenCodesCount + 257); - CTX.distTree = of_huffman_tree_construct( + CTX.distTree = OFHuffmanTreeNew( CTX.lengths + CTX.litLenCodesCount + 257, CTX.distCodesCount + 1); - free(CTX.lengths); + OFFreeMemory(CTX.lengths); /* * litLenTree and distTree are at the same location in * _context.huffman and _context.huffmanTree, thus no need to * set them. */ - _state = HUFFMAN_BLOCK; - _context.huffman.state = AWAIT_CODE; + _state = stateHuffmanBlock; + _context.huffman.state = huffmanStateAwaitCode; _context.huffman.treeIter = CTX.litLenTree; goto start; #undef CTX - case HUFFMAN_BLOCK: + case stateHuffmanBlock: #define CTX _context.huffman for (;;) { uint8_t extraBits, lengthCodeIndex; - if OF_UNLIKELY (CTX.state == WRITE_VALUE) { + if OF_UNLIKELY (CTX.state == huffmanStateWriteValue) { if OF_UNLIKELY (length == 0) return bytesWritten; buffer[bytesWritten++] = CTX.value; length--; @@ -513,28 +510,29 @@ _slidingWindow[_slidingWindowIndex] = CTX.value; _slidingWindowIndex = (_slidingWindowIndex + 1) & _slidingWindowMask; - CTX.state = AWAIT_CODE; + CTX.state = huffmanStateAwaitCode; CTX.treeIter = CTX.litLenTree; } - if OF_UNLIKELY (CTX.state == AWAIT_LENGTH_EXTRA_BITS) { + if OF_UNLIKELY (CTX.state == + huffmanStateAwaitLengthExtraBits) { if OF_UNLIKELY (!tryReadBits(self, &bits, CTX.extraBits)) return bytesWritten; CTX.length += bits; - CTX.state = AWAIT_DISTANCE; + CTX.state = huffmanStateAwaitDistance; CTX.treeIter = CTX.distTree; } /* Distance of length distance pair */ - if (CTX.state == AWAIT_DISTANCE) { - if OF_UNLIKELY (!of_huffman_tree_walk(self, + if (CTX.state == huffmanStateAwaitDistance) { + if OF_UNLIKELY (!OFHuffmanTreeWalk(self, tryReadBits, &CTX.treeIter, &value)) return bytesWritten; if OF_UNLIKELY (value >= numDistanceCodes) @throw [OFInvalidFormatException @@ -544,32 +542,34 @@ extraBits = distanceExtraBits[value]; if (extraBits > 0) { if OF_UNLIKELY (!tryReadBits(self, &bits, extraBits)) { - CTX.state = - AWAIT_DISTANCE_EXTRA_BITS; +#define HSADEB huffmanStateAwaitDistanceExtraBits + CTX.state = HSADEB; +#undef HSADEB CTX.extraBits = extraBits; return bytesWritten; } CTX.distance += bits; } - CTX.state = PROCESS_PAIR; - } else if (CTX.state == AWAIT_DISTANCE_EXTRA_BITS) { + CTX.state = huffmanStateProcessPair; + } else if (CTX.state == + huffmanStateAwaitDistanceExtraBits) { if OF_UNLIKELY (!tryReadBits(self, &bits, CTX.extraBits)) return bytesWritten; CTX.distance += bits; - CTX.state = PROCESS_PAIR; + CTX.state = huffmanStateProcessPair; } /* Length distance pair */ - if (CTX.state == PROCESS_PAIR) { + if (CTX.state == huffmanStateProcessPair) { for (uint_fast16_t j = 0; j < CTX.length; j++) { uint16_t idx; if OF_UNLIKELY (length == 0) { CTX.length -= j; @@ -588,33 +588,33 @@ _slidingWindowIndex = (_slidingWindowIndex + 1) & _slidingWindowMask; } - CTX.state = AWAIT_CODE; + CTX.state = huffmanStateAwaitCode; CTX.treeIter = CTX.litLenTree; } - if OF_UNLIKELY (!of_huffman_tree_walk(self, tryReadBits, + if OF_UNLIKELY (!OFHuffmanTreeWalk(self, tryReadBits, &CTX.treeIter, &value)) return bytesWritten; /* End of block */ if OF_UNLIKELY (value == 256) { if (CTX.litLenTree != fixedLitLenTree) - of_huffman_tree_release(CTX.litLenTree); + OFHuffmanTreeFree(CTX.litLenTree); if (CTX.distTree != fixedDistTree) - of_huffman_tree_release(CTX.distTree); + OFHuffmanTreeFree(CTX.distTree); - _state = BLOCK_HEADER; + _state = stateBlockHeader; goto start; } /* Literal byte */ if OF_LIKELY (value < 256) { if OF_UNLIKELY (length == 0) { - CTX.state = WRITE_VALUE; + CTX.state = huffmanStateWriteValue; CTX.value = value; return bytesWritten; } buffer[bytesWritten++] = value; @@ -639,19 +639,20 @@ if (extraBits > 0) { if OF_UNLIKELY (!tryReadBits(self, &bits, extraBits)) { CTX.extraBits = extraBits; - CTX.state = AWAIT_LENGTH_EXTRA_BITS; + CTX.state = + huffmanStateAwaitLengthExtraBits; return bytesWritten; } CTX.length += bits; } CTX.treeIter = CTX.distTree; - CTX.state = AWAIT_DISTANCE; + CTX.state = huffmanStateAwaitDistance; } break; #undef CTX } Index: src/OFInvertedCharacterSet.h ================================================================== --- src/OFInvertedCharacterSet.h +++ src/OFInvertedCharacterSet.h @@ -18,12 +18,12 @@ OF_ASSUME_NONNULL_BEGIN @interface OFInvertedCharacterSet: OFCharacterSet { OFCharacterSet *_characterSet; - bool (*_characterIsMember)(id, SEL, of_unichar_t); + bool (*_characterIsMember)(id, SEL, OFUnichar); } - (instancetype)initWithCharacterSet: (OFCharacterSet *)characterSet; @end OF_ASSUME_NONNULL_END Index: src/OFInvertedCharacterSet.m ================================================================== --- src/OFInvertedCharacterSet.m +++ src/OFInvertedCharacterSet.m @@ -30,11 +30,11 @@ { self = [super init]; @try { _characterSet = [characterSet retain]; - _characterIsMember = (bool (*)(id, SEL, of_unichar_t)) + _characterIsMember = (bool (*)(id, SEL, OFUnichar)) [_characterSet methodForSelector: @selector(characterIsMember:)]; } @catch (id e) { [self release]; @throw e; @@ -48,11 +48,11 @@ [_characterSet release]; [super dealloc]; } -- (bool)characterIsMember: (of_unichar_t)character +- (bool)characterIsMember: (OFUnichar)character { return !_characterIsMember(_characterSet, @selector(characterIsMember:), character); } Index: src/OFInvocation.m ================================================================== --- src/OFInvocation.m +++ src/OFInvocation.m @@ -21,11 +21,11 @@ #import "OFArray.h" #import "OFData.h" #import "OFMethodSignature.h" #ifdef OF_INVOCATION_CAN_INVOKE -extern void of_invocation_invoke(OFInvocation *); +extern void OFInvocationInvoke(OFInvocation *); #endif @implementation OFInvocation @synthesize methodSignature = _methodSignature; @@ -50,20 +50,20 @@ for (size_t i = 0; i < numberOfArguments; i++) { OFMutableData *data; typeEncoding = [_methodSignature argumentTypeAtIndex: i]; - typeSize = of_sizeof_type_encoding(typeEncoding); + typeSize = OFSizeOfTypeEncoding(typeEncoding); data = [OFMutableData dataWithItemSize: typeSize capacity: 1]; [data increaseCountBy: 1]; [_arguments addObject: data]; } typeEncoding = _methodSignature.methodReturnType; - typeSize = of_sizeof_type_encoding(typeEncoding); + typeSize = OFSizeOfTypeEncoding(typeEncoding); if (typeSize > 0) { _returnValue = [[OFMutableData alloc] initWithItemSize: typeSize capacity: 1]; @@ -111,9 +111,9 @@ } #ifdef OF_INVOCATION_CAN_INVOKE - (void)invoke { - of_invocation_invoke(self); + OFInvocationInvoke(self); } #endif @end Index: src/OFJSONRepresentation.h ================================================================== --- src/OFJSONRepresentation.h +++ src/OFJSONRepresentation.h @@ -17,15 +17,20 @@ @class OFString; OF_ASSUME_NONNULL_BEGIN -enum { - OF_JSON_REPRESENTATION_PRETTY = 0x01, - OF_JSON_REPRESENTATION_JSON5 = 0x02, - OF_JSON_REPRESENTATION_IDENTIFIER = 0x10 -}; +/** + * @brief Options to change the behavior when creating a JSON representation. + */ +typedef enum { + /** Optimize for readability */ + OFJSONRepresentationOptionPretty = 0x01, + /** Generate JSON5 */ + OFJSONRepresentationOptionJSON5 = 0x02, + OFJSONRepresentationOptionIsIdentifier = 0x10 +} OFJSONRepresentationOptions; /** * @protocol OFJSONRepresentation * OFJSONRepresentation.h ObjFW/OFJSONRepresentation.h * @@ -43,18 +48,13 @@ @property (readonly, nonatomic) OFString *JSONRepresentation; /** * @brief Returns the JSON representation of the object as a string. * - * @param options The options to use when creating a JSON representation.@n - * Possible values are: - * Value | Description - * --------------------------------|------------------------- - * `OF_JSON_REPRESENTATION_PRETTY` | Optimize for readability - * `OF_JSON_REPRESENTATION_JSON5` | Generate JSON5 - * + * @param options The options to use when creating a JSON representation * @return The JSON representation of the object as a string */ -- (OFString *)JSONRepresentationWithOptions: (int)options; +- (OFString *)JSONRepresentationWithOptions: + (OFJSONRepresentationOptions)options; @end OF_ASSUME_NONNULL_END Index: src/OFKernelEventObserver.h ================================================================== --- src/OFKernelEventObserver.h +++ src/OFKernelEventObserver.h @@ -12,13 +12,12 @@ * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #import "OFObject.h" - #ifdef OF_HAVE_SOCKETS -# import "socket.h" +# import "OFSocket.h" #endif #ifdef OF_AMIGAOS # include # include @@ -126,11 +125,11 @@ struct Task *_waitingTask; ULONG _cancelSignal; #elif defined(OF_HAVE_PIPE) int _cancelFD[2]; #else - of_socket_t _cancelFD[2]; + OFSocketHandle _cancelFD[2]; struct sockaddr_in _cancelAddr; #endif #ifdef OF_AMIGAOS ULONG _execSignalMask; #endif @@ -211,11 +210,11 @@ * @brief Observes all objects until an event happens on an object or the * timeout is reached. * * @param timeInterval The time to wait for an event, in seconds */ -- (void)observeForTimeInterval: (of_time_interval_t)timeInterval; +- (void)observeForTimeInterval: (OFTimeInterval)timeInterval; /** * @brief Observes all objects until an event happens on an object or the * specified date is reached. * Index: src/OFKernelEventObserver.m ================================================================== --- src/OFKernelEventObserver.m +++ src/OFKernelEventObserver.m @@ -21,48 +21,38 @@ #import "OFKernelEventObserver.h" #import "OFArray.h" #import "OFData.h" #import "OFDate.h" -#import "OFStream.h" -#import "OFStream+Private.h" -#ifndef OF_HAVE_PIPE -# import "OFStreamSocket.h" +#ifdef HAVE_EPOLL +# import "OFEpollKernelEventObserver.h" #endif - #ifdef HAVE_KQUEUE # import "OFKqueueKernelEventObserver.h" #endif -#ifdef HAVE_EPOLL -# import "OFEpollKernelEventObserver.h" -#endif #ifdef HAVE_POLL # import "OFPollKernelEventObserver.h" #endif #ifdef HAVE_SELECT # import "OFSelectKernelEventObserver.h" #endif +#import "OFSocket.h" +#import "OFSocket+Private.h" +#import "OFStream.h" +#import "OFStream+Private.h" +#ifndef OF_HAVE_PIPE +# import "OFStreamSocket.h" +#endif #import "OFInitializationFailedException.h" #import "OFInvalidArgumentException.h" #import "OFOutOfRangeException.h" -#import "socket.h" -#import "socket_helpers.h" - #ifdef OF_AMIGAOS # include #endif -enum { - QUEUE_ADD = 0, - QUEUE_REMOVE = 1, - QUEUE_READ = 0, - QUEUE_WRITE = 2 -}; -#define QUEUE_ACTION (QUEUE_ADD | QUEUE_REMOVE) - @implementation OFKernelEventObserver @synthesize delegate = _delegate; #ifdef OF_AMIGAOS @synthesize execSignalMask = _execSignalMask; #endif @@ -70,11 +60,11 @@ + (void)initialize { if (self != [OFKernelEventObserver class]) return; - if (!of_socket_init()) + if (!OFSocketInit()) @throw [OFInitializationFailedException exceptionWithClass: self]; } + (instancetype)observer @@ -118,11 +108,11 @@ @throw [OFInitializationFailedException exceptionWithClass: self.class]; #elif !defined(OF_AMIGAOS) _cancelFD[0] = _cancelFD[1] = socket(AF_INET, SOCK_DGRAM, 0); - if (_cancelFD[0] == INVALID_SOCKET) + if (_cancelFD[0] == OFInvalidSocketHandle) @throw [OFInitializationFailedException exceptionWithClass: self.class]; _cancelAddr.sin_family = AF_INET; _cancelAddr.sin_port = 0; @@ -136,11 +126,11 @@ sizeof(_cancelAddr)) != 0) @throw [OFInitializationFailedException exceptionWithClass: self.class]; cancelAddrLen = sizeof(_cancelAddr); - if (of_getsockname(_cancelFD[0], + if (OFGetSockName(_cancelFD[0], (struct sockaddr *)&_cancelAddr, &cancelAddrLen) != 0) @throw [OFInitializationFailedException exceptionWithClass: self.class]; # else for (;;) { @@ -148,19 +138,19 @@ int ret; while (rnd < 1024) rnd = (uint16_t)rand(); - _cancelAddr.sin_port = OF_BSWAP16_IF_LE(rnd); + _cancelAddr.sin_port = OFToBigEndian16(rnd); ret = bind(_cancelFD[0], (struct sockaddr *)&_cancelAddr, sizeof(_cancelAddr)); if (ret == 0) break; - if (of_socket_errno() != EADDRINUSE) + if (OFSocketErrNo() != EADDRINUSE) @throw [OFInitializationFailedException exceptionWithClass: self.class]; } # endif #endif @@ -243,11 +233,11 @@ - (void)observe { [self observeForTimeInterval: -1]; } -- (void)observeForTimeInterval: (of_time_interval_t)timeInterval +- (void)observeForTimeInterval: (OFTimeInterval)timeInterval { OF_UNRECOGNIZED_SELECTOR } - (void)observeUntilDate: (OFDate *)date @@ -265,15 +255,15 @@ _waitingTask = NULL; } Permit(); #elif defined(OF_HAVE_PIPE) - OF_ENSURE(write(_cancelFD[1], "", 1) > 0); + OFEnsure(write(_cancelFD[1], "", 1) > 0); #elif defined(OF_WII) - OF_ENSURE(sendto(_cancelFD[1], "", 1, 0, + OFEnsure(sendto(_cancelFD[1], "", 1, 0, (struct sockaddr *)&_cancelAddr, 8) > 0); #else - OF_ENSURE(sendto(_cancelFD[1], (void *)"", 1, 0, + OFEnsure(sendto(_cancelFD[1], (void *)"", 1, 0, (struct sockaddr *)&_cancelAddr, sizeof(_cancelAddr)) > 0); #endif } @end Index: src/OFKqueueKernelEventObserver.m ================================================================== --- src/OFKqueueKernelEventObserver.m +++ src/OFKqueueKernelEventObserver.m @@ -32,11 +32,11 @@ #import "OFInitializationFailedException.h" #import "OFObserveFailedException.h" #import "OFOutOfRangeException.h" -#define EVENTLIST_SIZE 64 +#define eventListSize 64 @implementation OFKqueueKernelEventObserver - (instancetype)init { self = [super init]; @@ -151,23 +151,23 @@ errNo: errno]; [super removeObjectForWriting: object]; } -- (void)observeForTimeInterval: (of_time_interval_t)timeInterval +- (void)observeForTimeInterval: (OFTimeInterval)timeInterval { struct timespec timeout; - struct kevent eventList[EVENTLIST_SIZE]; + struct kevent eventList[eventListSize]; int events; if ([self of_processReadBuffers]) return; timeout.tv_sec = (time_t)timeInterval; timeout.tv_nsec = (long)((timeInterval - timeout.tv_sec) * 1000000000); - events = kevent(_kernelQueue, NULL, 0, eventList, EVENTLIST_SIZE, + events = kevent(_kernelQueue, NULL, 0, eventList, eventListSize, (timeInterval != -1 ? &timeout : NULL)); if (events < 0) @throw [OFObserveFailedException exceptionWithObserver: self errNo: errno]; @@ -182,11 +182,11 @@ if (eventList[i].ident == (uintptr_t)_cancelFD[0]) { char buffer; assert(eventList[i].filter == EVFILT_READ); - OF_ENSURE(read(_cancelFD[0], &buffer, 1) == 1); + OFEnsure(read(_cancelFD[0], &buffer, 1) == 1); continue; } pool = objc_autoreleasePoolPush(); Index: src/OFLHAArchive.h ================================================================== --- src/OFLHAArchive.h +++ src/OFLHAArchive.h @@ -29,23 +29,19 @@ */ OF_SUBCLASSING_RESTRICTED @interface OFLHAArchive: OFObject { OFStream *_stream; - enum { - OF_LHA_ARCHIVE_MODE_READ, - OF_LHA_ARCHIVE_MODE_WRITE, - OF_LHA_ARCHIVE_MODE_APPEND - } _mode; - of_string_encoding_t _encoding; + uint_least8_t _mode; + OFStringEncoding _encoding; OFStream *_Nullable _lastReturnedStream; } /** * @brief The encoding to use for the archive. Defaults to ISO 8859-1. */ -@property (nonatomic) of_string_encoding_t encoding; +@property (nonatomic) OFStringEncoding encoding; /** * @brief A stream for reading the current entry. * * @note This is only available in read mode. Index: src/OFLHAArchive.m ================================================================== --- src/OFLHAArchive.m +++ src/OFLHAArchive.m @@ -16,27 +16,32 @@ #include "config.h" #import "OFLHAArchive.h" #import "OFLHAArchiveEntry.h" #import "OFLHAArchiveEntry+Private.h" +#import "OFCRC16.h" #ifdef OF_HAVE_FILES # import "OFFile.h" #endif #import "OFLHADecompressingStream.h" #import "OFStream.h" #import "OFSeekableStream.h" #import "OFString.h" -#import "crc16.h" - #import "OFChecksumMismatchException.h" #import "OFInvalidArgumentException.h" #import "OFNotImplementedException.h" #import "OFNotOpenException.h" #import "OFOutOfRangeException.h" #import "OFTruncatedDataException.h" #import "OFWriteFailedException.h" + +enum { + modeRead, + modeWrite, + modeAppend +}; OF_DIRECT_MEMBERS @interface OFLHAArchiveFileReadStream: OFStream { OFStream *_stream, *_decompressedStream; @@ -53,20 +58,20 @@ OF_DIRECT_MEMBERS @interface OFLHAArchiveFileWriteStream: OFStream { OFMutableLHAArchiveEntry *_entry; - of_string_encoding_t _encoding; + OFStringEncoding _encoding; OFSeekableStream *_stream; - of_offset_t _headerOffset; + OFFileOffset _headerOffset; uint32_t _bytesWritten; uint16_t _CRC16; } - (instancetype)of_initWithStream: (OFSeekableStream *)stream entry: (OFLHAArchiveEntry *)entry - encoding: (of_string_encoding_t)encoding; + encoding: (OFStringEncoding)encoding; @end @implementation OFLHAArchive @synthesize encoding = _encoding; @@ -93,28 +98,27 @@ @try { _stream = [stream retain]; if ([mode isEqual: @"r"]) - _mode = OF_LHA_ARCHIVE_MODE_READ; + _mode = modeRead; else if ([mode isEqual: @"w"]) - _mode = OF_LHA_ARCHIVE_MODE_WRITE; + _mode = modeWrite; else if ([mode isEqual: @"a"]) - _mode = OF_LHA_ARCHIVE_MODE_APPEND; + _mode = modeAppend; else @throw [OFInvalidArgumentException exception]; - if ((_mode == OF_LHA_ARCHIVE_MODE_WRITE || - _mode == OF_LHA_ARCHIVE_MODE_APPEND) && + if ((_mode == modeWrite || _mode == modeAppend) && ![_stream isKindOfClass: [OFSeekableStream class]]) @throw [OFInvalidArgumentException exception]; - if (_mode == OF_LHA_ARCHIVE_MODE_APPEND) + if (_mode == modeAppend) [(OFSeekableStream *)_stream seekToOffset: 0 whence: SEEK_END]; - _encoding = OF_STRING_ENCODING_ISO_8859_1; + _encoding = OFStringEncodingISO8859_1; } @catch (id e) { [self release]; @throw e; } @@ -153,11 +157,11 @@ { OFLHAArchiveEntry *entry; char header[21]; size_t headerLen; - if (_mode != OF_LHA_ARCHIVE_MODE_READ) + if (_mode != modeRead) @throw [OFInvalidArgumentException exception]; [(OFLHAArchiveFileReadStream *)_lastReturnedStream of_skip]; @try { [_lastReturnedStream close]; @@ -194,11 +198,11 @@ return entry; } - (OFStream *)streamForReadingCurrentEntry { - if (_mode != OF_LHA_ARCHIVE_MODE_READ) + if (_mode != modeRead) @throw [OFInvalidArgumentException exception]; if (_lastReturnedStream == nil) @throw [OFInvalidArgumentException exception]; @@ -208,12 +212,11 @@ - (OFStream *)streamForWritingEntry: (OFLHAArchiveEntry *)entry { OFString *compressionMethod; - if (_mode != OF_LHA_ARCHIVE_MODE_WRITE && - _mode != OF_LHA_ARCHIVE_MODE_APPEND) + if (_mode != modeWrite && _mode != modeAppend) @throw [OFInvalidArgumentException exception]; compressionMethod = entry.compressionMethod; if (![compressionMethod isEqual: @"-lh0-"] && @@ -333,11 +336,11 @@ length = _toRead; ret = [_decompressedStream readIntoBuffer: buffer length: length]; _toRead -= ret; - _CRC16 = of_crc16(_CRC16, buffer, ret); + _CRC16 = OFCRC16(_CRC16, buffer, ret); if (_toRead == 0) { _atEndOfStream = true; if (_CRC16 != _entry.CRC16) { @@ -393,12 +396,12 @@ stream = _stream; } if ([stream isKindOfClass: [OFSeekableStream class]] && - (sizeof(of_offset_t) > 4 || toRead < INT32_MAX)) - [(OFSeekableStream *)stream seekToOffset: (of_offset_t)toRead + (sizeof(OFFileOffset) > 4 || toRead < INT32_MAX)) + [(OFSeekableStream *)stream seekToOffset: (OFFileOffset)toRead whence: SEEK_CUR]; else { while (toRead > 0) { char buffer[512]; size_t min = toRead; @@ -432,11 +435,11 @@ @end @implementation OFLHAArchiveFileWriteStream - (instancetype)of_initWithStream: (OFSeekableStream *)stream entry: (OFLHAArchiveEntry *)entry - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { self = [super init]; @try { _entry = [entry mutableCopy]; @@ -481,17 +484,17 @@ @try { bytesWritten = (uint32_t)[_stream writeBuffer: buffer length: length]; } @catch (OFWriteFailedException *e) { _bytesWritten += e.bytesWritten; - _CRC16 = of_crc16(_CRC16, buffer, e.bytesWritten); + _CRC16 = OFCRC16(_CRC16, buffer, e.bytesWritten); @throw e; } _bytesWritten += (uint32_t)bytesWritten; - _CRC16 = of_crc16(_CRC16, buffer, bytesWritten); + _CRC16 = OFCRC16(_CRC16, buffer, bytesWritten); return bytesWritten; } - (bool)lowlevelIsAtEndOfStream @@ -508,11 +511,11 @@ .fileDescriptorForWriting; } - (void)close { - of_offset_t offset; + OFFileOffset offset; if (_stream == nil) @throw [OFNotOpenException exceptionWithObject: self]; _entry.uncompressedSize = _bytesWritten; Index: src/OFLHAArchiveEntry+Private.h ================================================================== --- src/OFLHAArchiveEntry+Private.h +++ src/OFLHAArchiveEntry+Private.h @@ -19,12 +19,12 @@ OF_DIRECT_MEMBERS @interface OFLHAArchiveEntry () - (instancetype)of_initWithHeader: (char [_Nonnull 21])header stream: (OFStream *)stream - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding OF_METHOD_FAMILY(init); - (void)of_writeToStream: (OFStream *)stream - encoding: (of_string_encoding_t)encoding; + encoding: (OFStringEncoding)encoding; @end OF_ASSUME_NONNULL_END Index: src/OFLHAArchiveEntry.m ================================================================== --- src/OFLHAArchiveEntry.m +++ src/OFLHAArchiveEntry.m @@ -18,18 +18,17 @@ #include #import "OFLHAArchiveEntry.h" #import "OFLHAArchiveEntry+Private.h" #import "OFArray.h" +#import "OFCRC16.h" #import "OFData.h" #import "OFDate.h" #import "OFNumber.h" #import "OFStream.h" #import "OFString.h" -#import "crc16.h" - #import "OFInvalidArgumentException.h" #import "OFInvalidFormatException.h" #import "OFOutOfRangeException.h" #import "OFUnsupportedVersionException.h" @@ -53,11 +52,11 @@ format: @"%Y-%m-%d %H:%M:%S"]; } static void parseFileNameExtension(OFLHAArchiveEntry *entry, OFData *extension, - of_string_encoding_t encoding) + OFStringEncoding encoding) { [entry->_fileName release]; entry->_fileName = nil; entry->_fileName = [[OFString alloc] @@ -66,11 +65,11 @@ length: [extension count] - 1]; } static void parseDirectoryNameExtension(OFLHAArchiveEntry *entry, OFData *extension, - of_string_encoding_t encoding) + OFStringEncoding encoding) { void *pool = objc_autoreleasePoolPush(); OFMutableData *data = [[extension mutableCopy] autorelease]; char *items = data.mutableItems; size_t count = data.count; @@ -97,11 +96,11 @@ objc_autoreleasePoolPop(pool); } static void parseCommentExtension(OFLHAArchiveEntry *entry, OFData *extension, - of_string_encoding_t encoding) + OFStringEncoding encoding) { [entry->_fileComment release]; entry->_fileComment = nil; entry->_fileComment = [[OFString alloc] @@ -110,40 +109,40 @@ length: extension.count - 1]; } static void parsePermissionsExtension(OFLHAArchiveEntry *entry, OFData *extension, - of_string_encoding_t encoding) + OFStringEncoding encoding) { uint16_t mode; if (extension.count != 3) @throw [OFInvalidFormatException exception]; memcpy(&mode, (char *)extension.items + 1, 2); - mode = OF_BSWAP16_IF_BE(mode); + mode = OFFromLittleEndian16(mode); [entry->_mode release]; entry->_mode = nil; entry->_mode = [[OFNumber alloc] initWithUnsignedShort: mode]; } static void parseGIDUIDExtension(OFLHAArchiveEntry *entry, OFData *extension, - of_string_encoding_t encoding) + OFStringEncoding encoding) { uint16_t UID, GID; if (extension.count != 5) @throw [OFInvalidFormatException exception]; memcpy(&GID, (char *)extension.items + 1, 2); - GID = OF_BSWAP16_IF_BE(GID); + GID = OFFromLittleEndian16(GID); memcpy(&UID, (char *)extension.items + 3, 2); - UID = OF_BSWAP16_IF_BE(UID); + UID = OFFromLittleEndian16(UID); [entry->_GID release]; entry->_GID = nil; [entry->_UID release]; @@ -153,11 +152,11 @@ entry->_UID = [[OFNumber alloc] initWithUnsignedShort: UID]; } static void parseGroupExtension(OFLHAArchiveEntry *entry, OFData *extension, - of_string_encoding_t encoding) + OFStringEncoding encoding) { [entry->_group release]; entry->_group = nil; entry->_group = [[OFString alloc] @@ -166,11 +165,11 @@ length: extension.count - 1]; } static void parseOwnerExtension(OFLHAArchiveEntry *entry, OFData *extension, - of_string_encoding_t encoding) + OFStringEncoding encoding) { [entry->_owner release]; entry->_owner = nil; entry->_owner = [[OFString alloc] @@ -179,19 +178,19 @@ length: extension.count - 1]; } static void parseModificationDateExtension(OFLHAArchiveEntry *entry, OFData *extension, - of_string_encoding_t encoding) + OFStringEncoding encoding) { uint32_t modificationDate; if (extension.count != 5) @throw [OFInvalidFormatException exception]; memcpy(&modificationDate, (char *)extension.items + 1, 4); - modificationDate = OF_BSWAP32_IF_BE(modificationDate); + modificationDate = OFFromLittleEndian32(modificationDate); [entry->_modificationDate release]; entry->_modificationDate = nil; entry->_modificationDate = [[OFDate alloc] @@ -198,13 +197,13 @@ initWithTimeIntervalSince1970: modificationDate]; } static bool parseExtension(OFLHAArchiveEntry *entry, OFData *extension, - of_string_encoding_t encoding, bool allowFileName) + OFStringEncoding encoding, bool allowFileName) { - void (*function)(OFLHAArchiveEntry *, OFData *, of_string_encoding_t) = + void (*function)(OFLHAArchiveEntry *, OFData *, OFStringEncoding) = NULL; switch (*(char *)[extension itemAtIndex: 0]) { case 0x01: if (allowFileName) @@ -240,11 +239,11 @@ return true; } static void readExtensions(OFLHAArchiveEntry *entry, OFStream *stream, - of_string_encoding_t encoding, bool allowFileName) + OFStringEncoding encoding, bool allowFileName) { uint16_t size; while ((size = [stream readLittleEndianInt16]) > 0) { OFData *extension; @@ -265,12 +264,11 @@ } } } static void -getFileNameAndDirectoryName(OFLHAArchiveEntry *entry, - of_string_encoding_t encoding, +getFileNameAndDirectoryName(OFLHAArchiveEntry *entry, OFStringEncoding encoding, const char **fileName, size_t *fileNameLength, const char **directoryName, size_t *directoryNameLength) { OFMutableData *data; char *cString; @@ -331,30 +329,30 @@ return self; } - (instancetype)of_initWithHeader: (char [21])header stream: (OFStream *)stream - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { self = [super init]; @try { uint32_t date; _compressionMethod = [[OFString alloc] initWithCString: header + 2 - encoding: OF_STRING_ENCODING_ASCII + encoding: OFStringEncodingASCII length: 5]; memcpy(&_compressedSize, header + 7, 4); - _compressedSize = OF_BSWAP32_IF_BE(_compressedSize); + _compressedSize = OFFromLittleEndian32(_compressedSize); memcpy(&_uncompressedSize, header + 11, 4); - _uncompressedSize = OF_BSWAP32_IF_BE(_uncompressedSize); + _uncompressedSize = OFFromLittleEndian32(_uncompressedSize); memcpy(&date, header + 15, 4); - date = OF_BSWAP32_IF_BE(date); + date = OFFromLittleEndian32(date); _headerLevel = header[20]; _extensions = [[OFMutableArray alloc] init]; switch (_headerLevel) { @@ -553,11 +551,11 @@ { return _extensions; } - (void)of_writeToStream: (OFStream *)stream - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { void *pool = objc_autoreleasePoolPush(); OFMutableData *data = [OFMutableData dataWithCapacity: 24]; const char *fileName, *directoryName; size_t fileNameLength, directoryNameLength; @@ -564,11 +562,11 @@ uint16_t tmp16; uint32_t tmp32; size_t headerSize; if ([_compressionMethod cStringLengthWithEncoding: - OF_STRING_ENCODING_ASCII] != 5) + OFStringEncodingASCII] != 5) @throw [OFInvalidArgumentException exception]; getFileNameAndDirectoryName(self, encoding, &fileName, &fileNameLength, &directoryName, &directoryNameLength); @@ -578,48 +576,48 @@ /* Length. Filled in after we're done. */ [data increaseCountBy: 2]; [data addItems: [_compressionMethod - cStringWithEncoding: OF_STRING_ENCODING_ASCII] + cStringWithEncoding: OFStringEncodingASCII] count: 5]; - tmp32 = OF_BSWAP32_IF_BE(_compressedSize); + tmp32 = OFToLittleEndian32(_compressedSize); [data addItems: &tmp32 count: sizeof(tmp32)]; - tmp32 = OF_BSWAP32_IF_BE(_uncompressedSize); + tmp32 = OFToLittleEndian32(_uncompressedSize); [data addItems: &tmp32 count: sizeof(tmp32)]; - tmp32 = OF_BSWAP32_IF_BE((uint32_t)_date.timeIntervalSince1970); + tmp32 = OFToLittleEndian32((uint32_t)_date.timeIntervalSince1970); [data addItems: &tmp32 count: sizeof(tmp32)]; /* Reserved */ [data increaseCountBy: 1]; /* Header level */ [data addItem: "\x02"]; /* CRC16 */ - tmp16 = OF_BSWAP16_IF_BE(_CRC16); + tmp16 = OFToLittleEndian16(_CRC16); [data addItems: &tmp16 count: sizeof(tmp16)]; /* Operating system identifier */ [data addItem: "U"]; /* Common header. Contains CRC16, which is written at the end. */ - tmp16 = OF_BSWAP16_IF_BE(5); + tmp16 = OFToLittleEndian16(5); [data addItems: &tmp16 count: sizeof(tmp16)]; [data addItem: "\x00"]; [data increaseCountBy: 2]; - tmp16 = OF_BSWAP16_IF_BE((uint16_t)fileNameLength + 3); + tmp16 = OFToLittleEndian16((uint16_t)fileNameLength + 3); [data addItems: &tmp16 count: sizeof(tmp16)]; [data addItem: "\x01"]; [data addItems: fileName count: fileNameLength]; if (directoryNameLength > 0) { - tmp16 = OF_BSWAP16_IF_BE((uint16_t)directoryNameLength + 3); + tmp16 = OFToLittleEndian16((uint16_t)directoryNameLength + 3); [data addItems: &tmp16 count: sizeof(tmp16)]; [data addItem: "\x02"]; [data addItems: directoryName count: directoryNameLength]; } @@ -628,38 +626,38 @@ [_fileComment cStringLengthWithEncoding: encoding]; if (fileCommentLength > UINT16_MAX - 3) @throw [OFOutOfRangeException exception]; - tmp16 = OF_BSWAP16_IF_BE((uint16_t)fileCommentLength + 3); + tmp16 = OFToLittleEndian16((uint16_t)fileCommentLength + 3); [data addItems: &tmp16 count: sizeof(tmp16)]; [data addItem: "\x3F"]; [data addItems: [_fileComment cStringWithEncoding: encoding] count: fileCommentLength]; } if (_mode != nil) { - tmp16 = OF_BSWAP16_IF_BE(5); + tmp16 = OFToLittleEndian16(5); [data addItems: &tmp16 count: sizeof(tmp16)]; [data addItem: "\x50"]; - tmp16 = OF_BSWAP16_IF_BE(_mode.unsignedShortValue); + tmp16 = OFToLittleEndian16(_mode.unsignedShortValue); [data addItems: &tmp16 count: sizeof(tmp16)]; } if (_UID != nil || _GID != nil) { if (_UID == nil || _GID == nil) @throw [OFInvalidArgumentException exception]; - tmp16 = OF_BSWAP16_IF_BE(7); + tmp16 = OFToLittleEndian16(7); [data addItems: &tmp16 count: sizeof(tmp16)]; [data addItem: "\x51"]; - tmp16 = OF_BSWAP16_IF_BE(_GID.unsignedShortValue); + tmp16 = OFToLittleEndian16(_GID.unsignedShortValue); [data addItems: &tmp16 count: sizeof(tmp16)]; - tmp16 = OF_BSWAP16_IF_BE(_UID.unsignedShortValue); + tmp16 = OFToLittleEndian16(_UID.unsignedShortValue); [data addItems: &tmp16 count: sizeof(tmp16)]; } if (_group != nil) { size_t groupLength = @@ -666,11 +664,11 @@ [_group cStringLengthWithEncoding: encoding]; if (groupLength > UINT16_MAX - 3) @throw [OFOutOfRangeException exception]; - tmp16 = OF_BSWAP16_IF_BE((uint16_t)groupLength + 3); + tmp16 = OFToLittleEndian16((uint16_t)groupLength + 3); [data addItems: &tmp16 count: sizeof(tmp16)]; [data addItem: "\x52"]; [data addItems: [_group cStringWithEncoding: encoding] count: groupLength]; } @@ -680,23 +678,23 @@ [_owner cStringLengthWithEncoding: encoding]; if (ownerLength > UINT16_MAX - 3) @throw [OFOutOfRangeException exception]; - tmp16 = OF_BSWAP16_IF_BE((uint16_t)ownerLength + 3); + tmp16 = OFToLittleEndian16((uint16_t)ownerLength + 3); [data addItems: &tmp16 count: sizeof(tmp16)]; [data addItem: "\x53"]; [data addItems: [_owner cStringWithEncoding: encoding] count: ownerLength]; } if (_modificationDate != nil) { - tmp16 = OF_BSWAP16_IF_BE(7); + tmp16 = OFToLittleEndian16(7); [data addItems: &tmp16 count: sizeof(tmp16)]; [data addItem: "\x54"]; - tmp32 = OF_BSWAP32_IF_BE( + tmp32 = OFToLittleEndian32( (uint32_t)_modificationDate.timeIntervalSince1970); [data addItems: &tmp32 count: sizeof(tmp32)]; } for (OFData *extension in _extensions) { @@ -706,11 +704,11 @@ @throw [OFInvalidArgumentException exception]; if (extensionLength > UINT16_MAX - 2) @throw [OFOutOfRangeException exception]; - tmp16 = OF_BSWAP16_IF_BE((uint16_t)extensionLength + 2); + tmp16 = OFToLittleEndian16((uint16_t)extensionLength + 2); [data addItems: &tmp16 count: sizeof(tmp16)]; [data addItems: extension.items count: extension.count]; } /* Zero-length extension to terminate */ @@ -720,15 +718,15 @@ if (headerSize > UINT16_MAX) @throw [OFOutOfRangeException exception]; /* Now fill in the size and CRC16 for the entire header */ - tmp16 = OF_BSWAP16_IF_BE(headerSize); + tmp16 = OFToLittleEndian16(headerSize); memcpy([data mutableItemAtIndex: 0], &tmp16, sizeof(tmp16)); - tmp16 = of_crc16(0, data.items, data.count); - tmp16 = OF_BSWAP16_IF_BE(tmp16); + tmp16 = OFCRC16(0, data.items, data.count); + tmp16 = OFToLittleEndian16(tmp16); memcpy([data mutableItemAtIndex: 27], &tmp16, sizeof(tmp16)); [stream writeData: data]; objc_autoreleasePoolPop(pool); Index: src/OFLHADecompressingStream.h ================================================================== --- src/OFLHADecompressingStream.h +++ src/OFLHADecompressingStream.h @@ -12,32 +12,35 @@ * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #import "OFStream.h" +#import "OFHuffmanTree.h" OF_ASSUME_NONNULL_BEGIN -#define OF_LHA_DECOMPRESSING_STREAM_BUFFER_SIZE 4096 +#define OFLHADecompressingStreamBufferSize 4096 OF_DIRECT_MEMBERS @interface OFLHADecompressingStream: OFStream { OFStream *_stream; uint8_t _distanceBits, _dictionaryBits; - unsigned char _buffer[OF_LHA_DECOMPRESSING_STREAM_BUFFER_SIZE]; + unsigned char _buffer[OFLHADecompressingStreamBufferSize]; uint32_t _bytesConsumed; uint16_t _bufferIndex, _bufferLength; uint8_t _byte; uint8_t _bitIndex, _savedBitsLength; uint16_t _savedBits; unsigned char *_slidingWindow; uint32_t _slidingWindowIndex, _slidingWindowMask; int _state; uint16_t _symbolsLeft; - struct of_huffman_tree *_Nullable _codeLenTree, *_Nullable _litLenTree; - struct of_huffman_tree *_Nullable _distTree, *_Nullable _treeIter; + OFHuffmanTree _Nullable _codeLenTree; + OFHuffmanTree _Nullable _litLenTree; + OFHuffmanTree _Nullable _distTree; + OFHuffmanTree _Nullable _treeIter; uint16_t _codesCount, _codesReceived; bool _currentIsExtendedLength, _skip; uint8_t *_Nullable _codesLengths; uint16_t _length; uint32_t _distance; Index: src/OFLHADecompressingStream.m ================================================================== --- src/OFLHADecompressingStream.m +++ src/OFLHADecompressingStream.m @@ -18,30 +18,30 @@ #include #import "OFLHADecompressingStream.h" #import "OFKernelEventObserver.h" -#import "huffman_tree.h" +#import "OFHuffmanTree.h" #import "OFInvalidFormatException.h" #import "OFNotOpenException.h" -enum state { - STATE_BLOCK_HEADER, - STATE_CODE_LEN_CODES_COUNT, - STATE_CODE_LEN_TREE, - STATE_CODE_LEN_TREE_SINGLE, - STATE_LITLEN_CODES_COUNT, - STATE_LITLEN_TREE, - STATE_LITLEN_TREE_SINGLE, - STATE_DIST_CODES_COUNT, - STATE_DIST_TREE, - STATE_DIST_TREE_SINGLE, - STATE_BLOCK_LITLEN, - STATE_BLOCK_DIST_LENGTH, - STATE_BLOCK_DIST_LENGTH_EXTRA, - STATE_BLOCK_LEN_DIST_PAIR +enum State { + stateBlockHeader, + stateCodeLenCodesCount, + stateCodeLenTree, + stateCodeLenTreeSingle, + stateLitLenCodesCount, + stateLitLenTree, + stateLitLenTreeSingle, + stateDistCodesCount, + stateDistTree, + stateDistTreeSingle, + stateBlockLitLen, + stateBlockDistLength, + stateBlockDistLengthExtra, + stateBlockLenDistPair }; @implementation OFLHADecompressingStream @synthesize bytesConsumed = _bytesConsumed; @@ -58,11 +58,11 @@ stream->_bufferLength) stream->_byte = stream->_buffer[stream->_bufferIndex++]; else { const size_t bufferLength = - OF_LHA_DECOMPRESSING_STREAM_BUFFER_SIZE; + OFLHADecompressingStreamBufferSize; size_t length = [stream->_stream readIntoBuffer: stream->_buffer length: bufferLength]; stream->_bytesConsumed += (uint32_t)length; @@ -106,11 +106,11 @@ _distanceBits = distanceBits; _dictionaryBits = dictionaryBits; _slidingWindowMask = (1u << dictionaryBits) - 1; - _slidingWindow = of_alloc(_slidingWindowMask + 1, 1); + _slidingWindow = OFAllocMemory(_slidingWindowMask + 1, 1); memset(_slidingWindow, ' ', _slidingWindowMask + 1); } @catch (id e) { [self release]; @throw e; } @@ -121,20 +121,20 @@ - (void)dealloc { if (_stream != nil) [self close]; - free(_slidingWindow); + OFFreeMemory(_slidingWindow); if (_codeLenTree != NULL) - of_huffman_tree_release(_codeLenTree); + OFHuffmanTreeFree(_codeLenTree); if (_litLenTree != NULL) - of_huffman_tree_release(_litLenTree); + OFHuffmanTreeFree(_litLenTree); if (_distTree != NULL) - of_huffman_tree_release(_distTree); + OFHuffmanTreeFree(_distTree); - free(_codesLengths); + OFFreeMemory(_codesLengths); [super dealloc]; } - (size_t)lowlevelReadIntoBuffer: (void *)buffer_ @@ -146,43 +146,43 @@ if (_stream == nil) @throw [OFNotOpenException exceptionWithObject: self]; if (_stream.atEndOfStream && _bufferLength - _bufferIndex == 0 && - _state == STATE_BLOCK_HEADER) + _state == stateBlockHeader) return 0; start: - switch ((enum state)_state) { - case STATE_BLOCK_HEADER: + switch ((enum State)_state) { + case stateBlockHeader: if OF_UNLIKELY (!tryReadBits(self, &bits, 16)) return bytesWritten; _symbolsLeft = bits; - _state = STATE_CODE_LEN_CODES_COUNT; + _state = stateCodeLenCodesCount; goto start; - case STATE_CODE_LEN_CODES_COUNT: + case stateCodeLenCodesCount: if OF_UNLIKELY (!tryReadBits(self, &bits, 5)) return bytesWritten; if OF_UNLIKELY (bits > 20) @throw [OFInvalidFormatException exception]; if OF_UNLIKELY (bits == 0) { - _state = STATE_CODE_LEN_TREE_SINGLE; + _state = stateCodeLenTreeSingle; goto start; } _codesCount = bits; _codesReceived = 0; - _codesLengths = of_alloc_zeroed(bits, 1); + _codesLengths = OFAllocZeroedMemory(bits, 1); _skip = true; - _state = STATE_CODE_LEN_TREE; + _state = stateCodeLenTree; goto start; - case STATE_CODE_LEN_TREE: + case stateCodeLenTree: while (_codesReceived < _codesCount) { if OF_UNLIKELY (_currentIsExtendedLength) { if OF_UNLIKELY (!tryReadBits(self, &bits, 1)) return bytesWritten; @@ -222,49 +222,48 @@ continue; } else _codesReceived++; } - _codeLenTree = of_huffman_tree_construct(_codesLengths, - _codesCount); - free(_codesLengths); + _codeLenTree = OFHuffmanTreeNew(_codesLengths, _codesCount); + OFFreeMemory(_codesLengths); _codesLengths = NULL; - _state = STATE_LITLEN_CODES_COUNT; + _state = stateLitLenCodesCount; goto start; - case STATE_CODE_LEN_TREE_SINGLE: + case stateCodeLenTreeSingle: if OF_UNLIKELY (!tryReadBits(self, &bits, 5)) return bytesWritten; - _codeLenTree = of_huffman_tree_construct_single(bits); + _codeLenTree = OFHuffmanTreeNewSingle(bits); - _state = STATE_LITLEN_CODES_COUNT; + _state = stateLitLenCodesCount; goto start; - case STATE_LITLEN_CODES_COUNT: + case stateLitLenCodesCount: if OF_UNLIKELY (!tryReadBits(self, &bits, 9)) return bytesWritten; if OF_UNLIKELY (bits > 510) @throw [OFInvalidFormatException exception]; if OF_UNLIKELY (bits == 0) { - of_huffman_tree_release(_codeLenTree); + OFHuffmanTreeFree(_codeLenTree); _codeLenTree = NULL; - _state = STATE_LITLEN_TREE_SINGLE; + _state = stateLitLenTreeSingle; goto start; } _codesCount = bits; _codesReceived = 0; - _codesLengths = of_alloc_zeroed(bits, 1); + _codesLengths = OFAllocZeroedMemory(bits, 1); _skip = false; _treeIter = _codeLenTree; - _state = STATE_LITLEN_TREE; + _state = stateLitLenTree; goto start; - case STATE_LITLEN_TREE: + case stateLitLenTree: while (_codesReceived < _codesCount) { if OF_UNLIKELY (_skip) { uint16_t skipCount; switch (_codesLengths[_codesReceived]) { @@ -284,11 +283,11 @@ return bytesWritten; skipCount = bits + 20; break; default: - OF_ENSURE(0); + OFEnsure(0); } if OF_UNLIKELY (_codesReceived + skipCount > _codesCount) @throw [OFInvalidFormatException @@ -299,12 +298,12 @@ _skip = false; continue; } - if (!of_huffman_tree_walk(self, tryReadBits, - &_treeIter, &value)) + if (!OFHuffmanTreeWalk(self, tryReadBits, &_treeIter, + &value)) return bytesWritten; _treeIter = _codeLenTree; if (value < 3) { @@ -312,48 +311,47 @@ _skip = true; } else _codesLengths[_codesReceived++] = value - 2; } - _litLenTree = of_huffman_tree_construct(_codesLengths, - _codesCount); - free(_codesLengths); + _litLenTree = OFHuffmanTreeNew(_codesLengths, _codesCount); + OFFreeMemory(_codesLengths); _codesLengths = NULL; - of_huffman_tree_release(_codeLenTree); + OFHuffmanTreeFree(_codeLenTree); _codeLenTree = NULL; - _state = STATE_DIST_CODES_COUNT; + _state = stateDistCodesCount; goto start; - case STATE_LITLEN_TREE_SINGLE: + case stateLitLenTreeSingle: if OF_UNLIKELY (!tryReadBits(self, &bits, 9)) return bytesWritten; - _litLenTree = of_huffman_tree_construct_single(bits); + _litLenTree = OFHuffmanTreeNewSingle(bits); - _state = STATE_DIST_CODES_COUNT; + _state = stateDistCodesCount; goto start; - case STATE_DIST_CODES_COUNT: + case stateDistCodesCount: if OF_UNLIKELY (!tryReadBits(self, &bits, _distanceBits)) return bytesWritten; if OF_UNLIKELY (bits > _dictionaryBits) @throw [OFInvalidFormatException exception]; if OF_UNLIKELY (bits == 0) { - _state = STATE_DIST_TREE_SINGLE; + _state = stateDistTreeSingle; goto start; } _codesCount = bits; _codesReceived = 0; - _codesLengths = of_alloc_zeroed(bits, 1); + _codesLengths = OFAllocZeroedMemory(bits, 1); _treeIter = _codeLenTree; - _state = STATE_DIST_TREE; + _state = stateDistTree; goto start; - case STATE_DIST_TREE: + case stateDistTree: while (_codesReceived < _codesCount) { if OF_UNLIKELY (_currentIsExtendedLength) { if OF_UNLIKELY (!tryReadBits(self, &bits, 1)) return bytesWritten; @@ -377,34 +375,33 @@ continue; } else _codesReceived++; } - _distTree = of_huffman_tree_construct(_codesLengths, - _codesCount); - free(_codesLengths); + _distTree = OFHuffmanTreeNew(_codesLengths, _codesCount); + OFFreeMemory(_codesLengths); _codesLengths = NULL; _treeIter = _litLenTree; - _state = STATE_BLOCK_LITLEN; + _state = stateBlockLitLen; goto start; - case STATE_DIST_TREE_SINGLE: + case stateDistTreeSingle: if OF_UNLIKELY (!tryReadBits(self, &bits, _distanceBits)) return bytesWritten; - _distTree = of_huffman_tree_construct_single(bits); + _distTree = OFHuffmanTreeNewSingle(bits); _treeIter = _litLenTree; - _state = STATE_BLOCK_LITLEN; + _state = stateBlockLitLen; goto start; - case STATE_BLOCK_LITLEN: + case stateBlockLitLen: if OF_UNLIKELY (_symbolsLeft == 0) { - of_huffman_tree_release(_litLenTree); - of_huffman_tree_release(_distTree); + OFHuffmanTreeFree(_litLenTree); + OFHuffmanTreeFree(_distTree); _litLenTree = _distTree = NULL; - _state = STATE_BLOCK_HEADER; + _state = stateBlockHeader; /* * We must return here, as there is no indication * whether this was the last block. Whoever called this * method needs to check if everything has been read @@ -425,11 +422,11 @@ } if OF_UNLIKELY (length == 0) return bytesWritten; - if OF_UNLIKELY (!of_huffman_tree_walk(self, tryReadBits, + if OF_UNLIKELY (!OFHuffmanTreeWalk(self, tryReadBits, &_treeIter, &value)) return bytesWritten; if OF_LIKELY (value < 256) { buffer[bytesWritten++] = value; @@ -442,34 +439,33 @@ _symbolsLeft--; _treeIter = _litLenTree; } else { _length = value - 253; _treeIter = _distTree; - _state = STATE_BLOCK_DIST_LENGTH; + _state = stateBlockDistLength; } goto start; - case STATE_BLOCK_DIST_LENGTH: - if OF_UNLIKELY (!of_huffman_tree_walk(self, tryReadBits, + case stateBlockDistLength: + if OF_UNLIKELY (!OFHuffmanTreeWalk(self, tryReadBits, &_treeIter, &value)) return bytesWritten; _distance = value; _state = (value < 2 - ? STATE_BLOCK_LEN_DIST_PAIR - : STATE_BLOCK_DIST_LENGTH_EXTRA); + ? stateBlockLenDistPair : stateBlockDistLengthExtra); goto start; - case STATE_BLOCK_DIST_LENGTH_EXTRA: + case stateBlockDistLengthExtra: if OF_UNLIKELY (!tryReadBits(self, &bits, _distance - 1)) return bytesWritten; _distance = bits + (1u << (_distance - 1)); - _state = STATE_BLOCK_LEN_DIST_PAIR; + _state = stateBlockLenDistPair; goto start; - case STATE_BLOCK_LEN_DIST_PAIR: + case stateBlockLenDistPair: for (uint_fast16_t i = 0; i < _length; i++) { uint32_t idx; if OF_UNLIKELY (length == 0) { _length -= i; @@ -489,11 +485,11 @@ } _symbolsLeft--; _treeIter = _litLenTree; - _state = STATE_BLOCK_LITLEN; + _state = stateBlockLitLen; goto start; } OF_UNREACHABLE } @@ -502,11 +498,11 @@ { if (_stream == nil) @throw [OFNotOpenException exceptionWithObject: self]; return (_stream.atEndOfStream && - _bufferLength - _bufferIndex == 0 && _state == STATE_BLOCK_HEADER); + _bufferLength - _bufferIndex == 0 && _state == stateBlockHeader); } - (int)fileDescriptorForReading { return ((id )_stream) Index: src/OFList.h ================================================================== --- src/OFList.h +++ src/OFList.h @@ -18,27 +18,65 @@ #import "OFEnumerator.h" #import "OFSerialization.h" OF_ASSUME_NONNULL_BEGIN -typedef struct of_list_object_t of_list_object_t; +/** @file */ + +/* + * Make clang's -Wdocumentation shut about about using @struct on someting it + * thinks is not a struct. Doxygen requires it this way. + */ +#ifdef __clang__ +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wdocumentation" +#endif /** - * @struct of_list_object_t OFList.h ObjFW/OFList.h + * @struct OFListItem OFList.h ObjFW/OFList.h + * + * @brief A list item. + * + * See @ref OFListItemNext, @ref OFListItemPrevious and @ref OFListItemObject. + */ +typedef struct _OFListItem *OFListItem; +#ifdef __clang__ +# pragma clang diagnostic pop +#endif + +#ifdef __cplusplus +extern "C" { +#endif +/*! + * @brief Returns the next list item of the list item. + * + * @param listItem The list item for which the next list item should be returned + * @return The next list item of the list item + */ +OFListItem OFListItemNext(OFListItem _Nonnull listItem); + +/*! + * @brief Returns the previous list item of the list item. + * + * @param listItem The list item for which the previous list item should be + * returned + * @return The previous list item of the list item + */ +OFListItem OFListItemPrevious(OFListItem _Nonnull listItem); + +/*! + * @brief Returns the object of the list item. * - * @brief A list object. + * @warning The returned object is not retained and autoreleased - this is the + * caller's responsibility! * - * A struct that contains a pointer to the next list object, the previous list - * object and the object. + * @param listItem The list item for which the object should be returned + * @return The object of the list item */ -struct of_list_object_t { - /** A pointer to the next list object in the list */ - of_list_object_t *_Nullable next; - /** A pointer to the previous list object in the list */ - of_list_object_t *_Nullable previous; - /** The object for the list object */ - id __unsafe_unretained object; -}; +id OFListItemObject(OFListItem _Nonnull listItem); +#ifdef __cplusplus +} +#endif /** * @class OFList OFList.h ObjFW/OFList.h * * @brief A class which provides easy to use double-linked lists. @@ -47,22 +85,21 @@ OFSerialization> #if !defined(OF_HAVE_GENERICS) && !defined(DOXYGEN) # define ObjectType id #endif { - of_list_object_t *_Nullable _firstListObject; - of_list_object_t *_Nullable _lastListObject; + OFListItem _Nullable _firstListItem; + OFListItem _Nullable _lastListItem; size_t _count; - unsigned long _mutations; + unsigned long _mutations; OF_RESERVE_IVARS(OFList, 4) } /** * @brief The first list object of the list. */ -@property OF_NULLABLE_PROPERTY (readonly, nonatomic) - of_list_object_t *firstListObject; +@property OF_NULLABLE_PROPERTY (readonly, nonatomic) OFListItem firstListItem; /** * @brief The first object of the list or `nil`. * * @warning The returned object is *not* retained and autoreleased for @@ -71,12 +108,11 @@ @property OF_NULLABLE_PROPERTY (readonly, nonatomic) ObjectType firstObject; /** * @brief The last list object of the list. */ -@property OF_NULLABLE_PROPERTY (readonly, nonatomic) - of_list_object_t *lastListObject; +@property OF_NULLABLE_PROPERTY (readonly, nonatomic) OFListItem lastListItem; /** * @brief The last object of the list or `nil`. * * @warning The returned object is *not* retained and autoreleased for @@ -93,58 +129,58 @@ /** * @brief Appends an object to the list. * * @param object The object to append - * @return An of_list_object_t, needed to identify the object inside the list. + * @return An OFListItem, needed to identify the object inside the list. * For example, if you want to remove an object from the list, you need - * its of_list_object_t. + * its OFListItem. */ -- (of_list_object_t *)appendObject: (ObjectType)object; +- (OFListItem)appendObject: (ObjectType)object; /** * @brief Prepends an object to the list. * * @param object The object to prepend - * @return An of_list_object_t, needed to identify the object inside the list. + * @return An OFListItem, needed to identify the object inside the list. * For example, if you want to remove an object from the list, you need - * its of_list_object_t. + * its OFListItem. */ -- (of_list_object_t *)prependObject: (ObjectType)object; +- (OFListItem)prependObject: (ObjectType)object; /** * @brief Inserts an object before another list object. * * @param object The object to insert - * @param listObject The of_list_object_t of the object before which it should - * be inserted - * @return An of_list_object_t, needed to identify the object inside the list. + * @param listItem The OFListItem of the object before which it should be + * inserted + * @return An OFListItem, needed to identify the object inside the list. * For example, if you want to remove an object from the list, you need - * its of_list_object_t. + * its OFListItem. */ -- (of_list_object_t *)insertObject: (ObjectType)object - beforeListObject: (of_list_object_t *)listObject; +- (OFListItem)insertObject: (ObjectType)object + beforeListItem: (OFListItem)listItem; /** * @brief Inserts an object after another list object. * * @param object The object to insert - * @param listObject The of_list_object_t of the object after which it should be + * @param listItem The OFListItem of the object after which it should be * inserted - * @return An of_list_object_t, needed to identify the object inside the list. + * @return An OFListItem, needed to identify the object inside the list. * For example, if you want to remove an object from the list, you need - * its of_list_object_t. + * its OFListItem. */ -- (of_list_object_t *)insertObject: (ObjectType)object - afterListObject: (of_list_object_t *)listObject; +- (OFListItem)insertObject: (ObjectType)object + afterListItem: (OFListItem)listItem; /** * @brief Removes the object with the specified list object from the list. * - * @param listObject The list object returned by append / prepend + * @param listItem The list object returned by append / prepend */ -- (void)removeListObject: (of_list_object_t *)listObject; +- (void)removeListItem: (OFListItem)listItem; /** * @brief Checks whether the list contains an object equal to the specified * object. * Index: src/OFList.m ================================================================== --- src/OFList.m +++ src/OFList.m @@ -23,27 +23,49 @@ #import "OFXMLElement.h" #import "OFArray.h" #import "OFEnumerationMutationException.h" #import "OFInvalidArgumentException.h" + +struct _OFListItem { + struct _OFListItem *previous, *next; + id object; +}; OF_DIRECT_MEMBERS @interface OFListEnumerator: OFEnumerator { OFList *_list; - of_list_object_t *_Nullable _current; + OFListItem _Nullable _current; unsigned long _mutations; unsigned long *_Nullable _mutationsPtr; } - (instancetype)initWithList: (OFList *)list mutationsPointer: (unsigned long *)mutationsPtr; @end + +OFListItem +OFListItemNext(OFListItem listItem) +{ + return listItem->next; +} + +OFListItem +OFListItemPrevious(OFListItem listItem) +{ + return listItem->previous; +} + +id +OFListItemObject(OFListItem listItem) +{ + return listItem->object; +} @implementation OFList -@synthesize firstListObject = _firstListObject; -@synthesize lastListObject = _lastListObject; +@synthesize firstListItem = _firstListItem, lastListItem = _lastListItem; + (instancetype)list { return [[[self alloc] init] autorelease]; } @@ -54,15 +76,15 @@ @try { void *pool = objc_autoreleasePoolPush(); if (![element.name isEqual: self.className] || - ![element.namespace isEqual: OF_SERIALIZATION_NS]) + ![element.namespace isEqual: OFSerializationNS]) @throw [OFInvalidArgumentException exception]; for (OFXMLElement *child in - [element elementsForNamespace: OF_SERIALIZATION_NS]) { + [element elementsForNamespace: OFSerializationNS]) { void *pool2 = objc_autoreleasePoolPush(); [self appendObject: child.objectByDeserializing]; objc_autoreleasePoolPop(pool2); @@ -77,142 +99,135 @@ return self; } - (void)dealloc { - of_list_object_t *next; + OFListItem next; - for (of_list_object_t *iter = _firstListObject; - iter != NULL; iter = next) { + for (OFListItem iter = _firstListItem; iter != NULL; iter = next) { [iter->object release]; next = iter->next; - free(iter); + OFFreeMemory(iter); } [super dealloc]; } -- (of_list_object_t *)appendObject: (id)object -{ - of_list_object_t *listObject; - - listObject = of_alloc(1, sizeof(of_list_object_t)); - listObject->object = [object retain]; - listObject->next = NULL; - listObject->previous = _lastListObject; - - if (_lastListObject != NULL) - _lastListObject->next = listObject; - - _lastListObject = listObject; - - if (_firstListObject == NULL) - _firstListObject = listObject; - - _count++; - _mutations++; - - return listObject; -} - -- (of_list_object_t *)prependObject: (id)object -{ - of_list_object_t *listObject; - - listObject = of_alloc(1, sizeof(of_list_object_t)); - listObject->object = [object retain]; - listObject->next = _firstListObject; - listObject->previous = NULL; - - if (_firstListObject != NULL) - _firstListObject->previous = listObject; - - _firstListObject = listObject; - if (_lastListObject == NULL) - _lastListObject = listObject; - - _count++; - _mutations++; - - return listObject; -} - -- (of_list_object_t *)insertObject: (id)object - beforeListObject: (of_list_object_t *)listObject -{ - of_list_object_t *newListObject; - - newListObject = of_alloc(1, sizeof(of_list_object_t)); - newListObject->object = [object retain]; - newListObject->next = listObject; - newListObject->previous = listObject->previous; - - if (listObject->previous != NULL) - listObject->previous->next = newListObject; - - listObject->previous = newListObject; - - if (listObject == _firstListObject) - _firstListObject = newListObject; - - _count++; - _mutations++; - - return newListObject; -} - -- (of_list_object_t *)insertObject: (id)object - afterListObject: (of_list_object_t *)listObject -{ - of_list_object_t *newListObject; - - newListObject = of_alloc(1, sizeof(of_list_object_t)); - newListObject->object = [object retain]; - newListObject->next = listObject->next; - newListObject->previous = listObject; - - if (listObject->next != NULL) - listObject->next->previous = newListObject; - - listObject->next = newListObject; - - if (listObject == _lastListObject) - _lastListObject = newListObject; - - _count++; - _mutations++; - - return newListObject; -} - -- (void)removeListObject: (of_list_object_t *)listObject -{ - if (listObject->previous != NULL) - listObject->previous->next = listObject->next; - if (listObject->next != NULL) - listObject->next->previous = listObject->previous; - - if (_firstListObject == listObject) - _firstListObject = listObject->next; - if (_lastListObject == listObject) - _lastListObject = listObject->previous; - - _count--; - _mutations++; - - [listObject->object release]; - free(listObject); -} - -- (id)firstObject -{ - return (_firstListObject != NULL ? _firstListObject->object : nil); -} - -- (id)lastObject -{ - return (_lastListObject != NULL ? _lastListObject->object : nil); +- (OFListItem)appendObject: (id)object +{ + OFListItem listItem = OFAllocMemory(1, sizeof(*listItem)); + + listItem->object = [object retain]; + listItem->next = NULL; + listItem->previous = _lastListItem; + + if (_lastListItem != NULL) + _lastListItem->next = listItem; + + _lastListItem = listItem; + + if (_firstListItem == NULL) + _firstListItem = listItem; + + _count++; + _mutations++; + + return listItem; +} + +- (OFListItem)prependObject: (id)object +{ + OFListItem listItem = OFAllocMemory(1, sizeof(*listItem)); + + listItem->object = [object retain]; + listItem->next = _firstListItem; + listItem->previous = NULL; + + if (_firstListItem != NULL) + _firstListItem->previous = listItem; + + _firstListItem = listItem; + if (_lastListItem == NULL) + _lastListItem = listItem; + + _count++; + _mutations++; + + return listItem; +} + +- (OFListItem)insertObject: (id)object beforeListItem: (OFListItem)listItem +{ + OFListItem newListItem = OFAllocMemory(1, sizeof(*newListItem)); + + newListItem->object = [object retain]; + newListItem->next = listItem; + newListItem->previous = listItem->previous; + + if (listItem->previous != NULL) + listItem->previous->next = newListItem; + + listItem->previous = newListItem; + + if (listItem == _firstListItem) + _firstListItem = newListItem; + + _count++; + _mutations++; + + return newListItem; +} + +- (OFListItem)insertObject: (id)object afterListItem: (OFListItem)listItem +{ + OFListItem newListItem = OFAllocMemory(1, sizeof(*newListItem)); + + newListItem->object = [object retain]; + newListItem->next = listItem->next; + newListItem->previous = listItem; + + if (listItem->next != NULL) + listItem->next->previous = newListItem; + + listItem->next = newListItem; + + if (listItem == _lastListItem) + _lastListItem = newListItem; + + _count++; + _mutations++; + + return newListItem; +} + +- (void)removeListItem: (OFListItem)listItem +{ + if (listItem->previous != NULL) + listItem->previous->next = listItem->next; + if (listItem->next != NULL) + listItem->next->previous = listItem->previous; + + if (_firstListItem == listItem) + _firstListItem = listItem->next; + if (_lastListItem == listItem) + _lastListItem = listItem->previous; + + _count--; + _mutations++; + + [listItem->object release]; + OFFreeMemory(listItem); +} + +- (id)firstObject +{ + return (_firstListItem != NULL ? _firstListItem->object : nil); +} + +- (id)lastObject +{ + return (_lastListItem != NULL ? _lastListItem->object : nil); } - (size_t)count { return _count; @@ -219,11 +234,11 @@ } - (bool)isEqual: (id)object { OFList *list; - of_list_object_t *iter, *iter2; + OFListItem iter, iter2; if (object == self) return true; if (![object isKindOfClass: [OFList class]]) @@ -232,11 +247,11 @@ list = object; if (list.count != _count) return false; - for (iter = _firstListObject, iter2 = list.firstListObject; + for (iter = _firstListItem, iter2 = list.firstListItem; iter != NULL && iter2 != NULL; iter = iter->next, iter2 = iter2->next) if (![iter->object isEqual: iter2->object]) return false; @@ -249,12 +264,11 @@ - (bool)containsObject: (id)object { if (_count == 0) return false; - for (of_list_object_t *iter = _firstListObject; - iter != NULL; iter = iter->next) + for (OFListItem iter = _firstListItem; iter != NULL; iter = iter->next) if ([iter->object isEqual: object]) return true; return false; } @@ -262,80 +276,74 @@ - (bool)containsObjectIdenticalTo: (id)object { if (_count == 0) return false; - for (of_list_object_t *iter = _firstListObject; - iter != NULL; iter = iter->next) + for (OFListItem iter = _firstListItem; iter != NULL; iter = iter->next) if (iter->object == object) return true; return false; } - (void)removeAllObjects { - of_list_object_t *next; + OFListItem next; _mutations++; - for (of_list_object_t *iter = _firstListObject; - iter != NULL; iter = next) { + for (OFListItem iter = _firstListItem; iter != NULL; iter = next) { [iter->object release]; next = iter->next; - free(iter); + OFFreeMemory(iter); } - _firstListObject = _lastListObject = NULL; + _firstListItem = _lastListItem = NULL; } - (id)copy { OFList *copy = [[[self class] alloc] init]; - of_list_object_t *listObject, *previous; - - listObject = NULL; - previous = NULL; + OFListItem listItem = NULL, previous = NULL; @try { - for (of_list_object_t *iter = _firstListObject; + for (OFListItem iter = _firstListItem; iter != NULL; iter = iter->next) { - listObject = of_alloc(1, sizeof(of_list_object_t)); - listObject->object = [iter->object retain]; - listObject->next = NULL; - listObject->previous = previous; + listItem = OFAllocMemory(1, sizeof(*listItem)); + listItem->object = [iter->object retain]; + listItem->next = NULL; + listItem->previous = previous; - if (copy->_firstListObject == NULL) - copy->_firstListObject = listObject; + if (copy->_firstListItem == NULL) + copy->_firstListItem = listItem; if (previous != NULL) - previous->next = listObject; + previous->next = listItem; copy->_count++; - previous = listObject; + previous = listItem; } } @catch (id e) { [copy release]; @throw e; } - copy->_lastListObject = listObject; + copy->_lastListItem = listItem; return copy; } - (unsigned long)hash { - uint32_t hash; - - OF_HASH_INIT(hash); - - for (of_list_object_t *iter = _firstListObject; - iter != NULL; iter = iter->next) - OF_HASH_ADD_HASH(hash, [iter->object hash]); - - OF_HASH_FINALIZE(hash); + unsigned long hash; + + OFHashInit(&hash); + + for (OFListItem iter = _firstListItem; iter != NULL; iter = iter->next) + OFHashAddHash(&hash, [iter->object hash]); + + OFHashFinalize(&hash); return hash; } - (OFString *)description @@ -345,11 +353,11 @@ if (_count == 0) return @"[]"; ret = [OFMutableString stringWithString: @"[\n"]; - for (of_list_object_t *iter = _firstListObject; + for (OFListItem iter = _firstListItem; iter != NULL; iter = iter->next) { void *pool = objc_autoreleasePoolPush(); [ret appendString: [iter->object description]]; @@ -368,13 +376,13 @@ - (OFXMLElement *)XMLElementBySerializing { OFXMLElement *element = [OFXMLElement elementWithName: self.className - namespace: OF_SERIALIZATION_NS]; + namespace: OFSerializationNS]; - for (of_list_object_t *iter = _firstListObject; + for (OFListItem iter = _firstListItem; iter != NULL; iter = iter->next) { void *pool = objc_autoreleasePoolPush(); [element addChild: [iter->object XMLElementBySerializing]]; @@ -382,35 +390,35 @@ } return element; } -- (int)countByEnumeratingWithState: (of_fast_enumeration_state_t *)state +- (int)countByEnumeratingWithState: (OFFastEnumerationState *)state objects: (id *)objects count: (int)count { - of_list_object_t *listObject; + OFListItem listItem; - memcpy(&listObject, state->extra, sizeof(listObject)); + memcpy(&listItem, state->extra, sizeof(listItem)); state->itemsPtr = objects; state->mutationsPtr = &_mutations; if (state->state == 0) { - listObject = _firstListObject; + listItem = _firstListItem; state->state = 1; } for (int i = 0; i < count; i++) { - if (listObject == NULL) + if (listItem == NULL) return i; - objects[i] = listObject->object; - listObject = listObject->next; + objects[i] = listItem->object; + listItem = listItem->next; } - memcpy(state->extra, &listObject, sizeof(listObject)); + memcpy(state->extra, &listItem, sizeof(listItem)); return count; } - (OFEnumerator *)objectEnumerator @@ -426,11 +434,11 @@ mutationsPointer: (unsigned long *)mutationsPtr { self = [super init]; _list = [list retain]; - _current = _list.firstListObject; + _current = _list.firstListItem; _mutations = *mutationsPtr; _mutationsPtr = mutationsPtr; return self; } Index: src/OFLocale.h ================================================================== --- src/OFLocale.h +++ src/OFLocale.h @@ -43,21 +43,21 @@ */ OF_SUBCLASSING_RESTRICTED @interface OFLocale: OFObject { OFString *_Nullable _language, *_Nullable _territory; - of_string_encoding_t _encoding; + OFStringEncoding _encoding; OFString *_decimalPoint; OFMutableArray OF_GENERIC(OFDictionary OF_GENERIC(OFString *, id) *) *_localizedStrings; } #ifdef OF_HAVE_CLASS_PROPERTIES @property (class, readonly, nullable, nonatomic) OFLocale *currentLocale; @property (class, readonly, nullable, nonatomic) OFString *language; @property (class, readonly, nullable, nonatomic) OFString *territory; -@property (class, readonly, nonatomic) of_string_encoding_t encoding; +@property (class, readonly, nonatomic) OFStringEncoding encoding; @property (class, readonly, nullable, nonatomic) OFString *decimalPoint; #endif /** * @brief The language of the locale for messages. @@ -79,11 +79,11 @@ * This is useful to encode strings correctly for passing them to operating * system calls. * * If the native 8-bit encoding is unknown, UTF-8 is assumed. */ -@property (readonly, nonatomic) of_string_encoding_t encoding; +@property (readonly, nonatomic) OFStringEncoding encoding; /** * @brief The decimal point of the system's locale. */ @property (readonly, nonatomic) OFString *decimalPoint; @@ -125,11 +125,11 @@ * * If the native 8-bit encoding is unknown, UTF-8 is assumed. * * @return The native 8-bit string encoding for the locale */ -+ (of_string_encoding_t)encoding; ++ (OFStringEncoding)encoding; /** * @brief Returns the decimal point of the system's locale. * * @return The decimal point of the system's locale Index: src/OFLocale.m ================================================================== --- src/OFLocale.m +++ src/OFLocale.m @@ -37,18 +37,17 @@ static OFLocale *currentLocale = nil; static OFDictionary *operatorPrecedences = nil; #ifndef OF_AMIGAOS static void -parseLocale(char *locale, of_string_encoding_t *encoding, +parseLocale(char *locale, OFStringEncoding *encoding, OFString **language, OFString **territory) { - if ((locale = of_strdup(locale)) == NULL) - return; + locale = OFStrDup(locale); @try { - const of_string_encoding_t enc = OF_STRING_ENCODING_ASCII; + OFStringEncoding enc = OFStringEncodingASCII; char *tmp; /* We don't care for extras behind the @ */ if ((tmp = strrchr(locale, '@')) != NULL) *tmp = '\0'; @@ -57,11 +56,11 @@ if ((tmp = strrchr(locale, '.')) != NULL) { *tmp++ = '\0'; @try { if (encoding != NULL) - *encoding = of_string_parse_encoding( + *encoding = OFStringEncodingParseName( [OFString stringWithCString: tmp encoding: enc]); } @catch (OFInvalidArgumentException *e) { } } @@ -77,11 +76,11 @@ if (language != NULL) *language = [OFString stringWithCString: locale encoding: enc]; } @finally { - free(locale); + OFFreeMemory(locale); } } #endif static bool @@ -106,13 +105,13 @@ /* Substitute variables and convert to RPN first */ tokens = [OFMutableArray array]; operators = [OFMutableArray array]; for (OFString *token in [condition componentsSeparatedByString: @" " - options: OF_STRING_SKIP_EMPTY]) { + options: OFStringSkipEmptyComponents]) { unsigned precedence; - of_unichar_t c; + OFUnichar c; if ([token isEqual: @"("]) { [operators addObject: @"("]; continue; } @@ -195,20 +194,20 @@ else if ([token isEqual: @"!="]) var = [OFNumber numberWithBool: ![first isEqual: second]]; else if ([token isEqual: @"<"]) var = [OFNumber numberWithBool: [first - compare: second] == OF_ORDERED_ASCENDING]; + compare: second] == OFOrderedAscending]; else if ([token isEqual: @"<="]) var = [OFNumber numberWithBool: [first - compare: second] != OF_ORDERED_DESCENDING]; + compare: second] != OFOrderedDescending]; else if ([token isEqual: @">"]) var = [OFNumber numberWithBool: [first - compare: second] == OF_ORDERED_DESCENDING]; + compare: second] == OFOrderedDescending]; else if ([token isEqual: @">="]) var = [OFNumber numberWithBool: [first - compare: second] != OF_ORDERED_ASCENDING]; + compare: second] != OFOrderedAscending]; else if ([token isEqual: @"+"]) var = [OFNumber numberWithDouble: [first doubleValue] + [second doubleValue]]; else if ([token isEqual: @"%"]) var = [OFNumber numberWithLongLong: @@ -219,11 +218,11 @@ [first boolValue] && [second boolValue]]; else if ([token isEqual: @"||"]) var = [OFNumber numberWithBool: [first boolValue] || [second boolValue]]; else - OF_ENSURE(0); + OFEnsure(0); [stack replaceObjectAtIndex: stackSize - 2 withObject: var]; [stack removeLastObject]; } else if (precedence == 1) { @@ -236,11 +235,11 @@ else if ([token isEqual: @"is_real"]) var = [OFNumber numberWithBool: ([first doubleValue] != [first longLongValue])]; else - OF_ENSURE(0); + OFEnsure(0); [stack replaceObjectAtIndex: stackSize - 1 withObject: var]; } else [stack addObject: token]; @@ -349,11 +348,11 @@ + (OFString *)territory { return currentLocale.territory; } -+ (of_string_encoding_t)encoding ++ (OFStringEncoding)encoding { return currentLocale.encoding; } + (OFString *)decimalPoint @@ -378,11 +377,11 @@ if (currentLocale != nil) @throw [OFInitializationFailedException exceptionWithClass: self.class]; - _encoding = OF_STRING_ENCODING_UTF_8; + _encoding = OFStringEncodingUTF8; _decimalPoint = @"."; _localizedStrings = [[OFMutableArray alloc] init]; if ((locale = setlocale(LC_ALL, "")) != NULL) _decimalPoint = [[OFString alloc] @@ -422,21 +421,21 @@ # elif defined(OF_AMIGAOS4) if (GetVar("Charset", buffer, sizeof(buffer), 0) > 0) { # else if (0) { # endif - of_string_encoding_t ASCII = OF_STRING_ENCODING_ASCII; + OFStringEncoding ASCII = OFStringEncodingASCII; @try { - _encoding = of_string_parse_encoding( + _encoding = OFStringEncodingForName( [OFString stringWithCString: buffer encoding: ASCII]); } @catch (OFInvalidArgumentException *e) { - _encoding = OF_STRING_ENCODING_ISO_8859_1; + _encoding = OFStringEncodingISO8859_1; } } else - _encoding = OF_STRING_ENCODING_ISO_8859_1; + _encoding = OFStringEncodingISO8859_1; /* * Get it via localeconv() instead of from the Locale struct, * to make sure we and printf etc. have the same expectations. */ @@ -455,11 +454,11 @@ @try { uint32_t territory; size_t length; territory = - OF_BSWAP32_IF_LE(locale->loc_CountryCode); + OFToBigEndian32(locale->loc_CountryCode); for (length = 0; length < 4; length++) if (((char *)&territory)[length] == 0) break; Index: src/OFMD5Hash.h ================================================================== --- src/OFMD5Hash.h +++ src/OFMD5Hash.h @@ -26,14 +26,14 @@ */ OF_SUBCLASSING_RESTRICTED @interface OFMD5Hash: OFObject { OFSecureData *_iVarsData; - struct of_md5_hash_ivars { + struct { uint32_t state[4]; uint64_t bits; - union of_md5_hash_buffer { + union { unsigned char bytes[64]; uint32_t words[16]; } buffer; size_t bufferLength; } *_iVars; Index: src/OFMD5Hash.m ================================================================== --- src/OFMD5Hash.m +++ src/OFMD5Hash.m @@ -21,12 +21,12 @@ #import "OFSecureData.h" #import "OFHashAlreadyCalculatedException.h" #import "OFOutOfRangeException.h" -#define DIGEST_SIZE 16 -#define BLOCK_SIZE 64 +static const size_t digestSize = 16; +static const size_t blockSize = 64; OF_DIRECT_MEMBERS @interface OFMD5Hash () - (void)of_resetState; @end @@ -73,11 +73,11 @@ static OF_INLINE void byteSwapVectorIfBE(uint32_t *vector, uint_fast8_t length) { #ifdef OF_BIG_ENDIAN for (uint_fast8_t i = 0; i < length; i++) - vector[i] = OF_BSWAP32(vector[i]); + vector[i] = OFByteSwap32(vector[i]); #endif } static void processBlock(uint32_t *state, uint32_t *buffer) @@ -90,20 +90,21 @@ new[2] = state[2]; new[3] = state[3]; byteSwapVectorIfBE(buffer, 16); -#define LOOP_BODY(f) \ - { \ - uint32_t tmp = new[3]; \ - tmp = new[3]; \ - new[0] += f(new[1], new[2], new[3]) + \ - buffer[wordOrder[i]] + table[i]; \ - new[3] = new[2]; \ - new[2] = new[1]; \ - new[1] += OF_ROL(new[0], rotateBits[(i % 4) + (i / 16) * 4]); \ - new[0] = tmp;\ +#define LOOP_BODY(f) \ + { \ + uint32_t tmp = new[3]; \ + tmp = new[3]; \ + new[0] += f(new[1], new[2], new[3]) + \ + buffer[wordOrder[i]] + table[i]; \ + new[3] = new[2]; \ + new[2] = new[1]; \ + new[1] += OFRotateLeft(new[0], \ + rotateBits[(i % 4) + (i / 16) * 4]); \ + new[0] = tmp; \ } for (; i < 16; i++) LOOP_BODY(F) for (; i < 32; i++) @@ -125,16 +126,16 @@ @synthesize calculated = _calculated; @synthesize allowsSwappableMemory = _allowsSwappableMemory; + (size_t)digestSize { - return DIGEST_SIZE; + return digestSize; } + (size_t)blockSize { - return BLOCK_SIZE; + return blockSize; } + (instancetype)hashWithAllowsSwappableMemory: (bool)allowsSwappableMemory { return [[[self alloc] initWithAllowsSwappableMemory: @@ -178,16 +179,16 @@ [super dealloc]; } - (size_t)digestSize { - return DIGEST_SIZE; + return digestSize; } - (size_t)blockSize { - return BLOCK_SIZE; + return blockSize; } - (id)copy { OFMD5Hash *copy = [[OFMD5Hash alloc] of_init]; @@ -245,25 +246,25 @@ { if (_calculated) return (const unsigned char *)_iVars->state; _iVars->buffer.bytes[_iVars->bufferLength] = 0x80; - of_explicit_memset(_iVars->buffer.bytes + _iVars->bufferLength + 1, 0, + OFZeroMemory(_iVars->buffer.bytes + _iVars->bufferLength + 1, 64 - _iVars->bufferLength - 1); if (_iVars->bufferLength >= 56) { processBlock(_iVars->state, _iVars->buffer.words); - of_explicit_memset(_iVars->buffer.bytes, 0, 64); + OFZeroMemory(_iVars->buffer.bytes, 64); } _iVars->buffer.words[14] = - OF_BSWAP32_IF_BE((uint32_t)(_iVars->bits & 0xFFFFFFFF)); + OFToLittleEndian32((uint32_t)(_iVars->bits & 0xFFFFFFFF)); _iVars->buffer.words[15] = - OF_BSWAP32_IF_BE((uint32_t)(_iVars->bits >> 32)); + OFToLittleEndian32((uint32_t)(_iVars->bits >> 32)); processBlock(_iVars->state, _iVars->buffer.words); - of_explicit_memset(&_iVars->buffer, 0, sizeof(_iVars->buffer)); + OFZeroMemory(&_iVars->buffer, sizeof(_iVars->buffer)); byteSwapVectorIfBE(_iVars->state, 4); _calculated = true; return (const unsigned char *)_iVars->state; } @@ -270,10 +271,10 @@ - (void)reset { [self of_resetState]; _iVars->bits = 0; - of_explicit_memset(&_iVars->buffer, 0, sizeof(_iVars->buffer)); + OFZeroMemory(&_iVars->buffer, sizeof(_iVars->buffer)); _iVars->bufferLength = 0; _calculated = false; } @end Index: src/OFMapTable.h ================================================================== --- src/OFMapTable.h +++ src/OFMapTable.h @@ -19,26 +19,25 @@ OF_ASSUME_NONNULL_BEGIN /** @file */ /** - * @struct of_map_table_functions_t OFMapTable.h ObjFW/OFMapTable.h + * @struct OFMapTableFunctions OFMapTable.h ObjFW/OFMapTable.h * * @brief A struct describing the functions to be used by the map table. */ -struct of_map_table_functions_t { +typedef struct { /** The function to retain keys / objects */ void *_Nullable (*_Nullable retain)(void *_Nullable object); /** The function to release keys / objects */ void (*_Nullable release)(void *_Nullable object); /** The function to hash keys */ unsigned long (*_Nullable hash)(void *_Nullable object); /** The function to compare keys / objects */ bool (*_Nullable equal)(void *_Nullable object1, void *_Nullable object2); -}; -typedef struct of_map_table_functions_t of_map_table_functions_t; +} OFMapTableFunctions; #ifdef OF_HAVE_BLOCKS /** * @brief A block for enumerating an OFMapTable. * @@ -45,21 +44,21 @@ * @param key The current key * @param object The current object * @param stop A pointer to a variable that can be set to true to stop the * enumeration */ -typedef void (^of_map_table_enumeration_block_t)(void *_Nullable key, +typedef void (^OFMapTableEnumerationBlock)(void *_Nullable key, void *_Nullable object, bool *stop); /** * @brief A block for replacing objects in an OFMapTable. * * @param key The key of the object to replace * @param object The object to replace * @return The object to replace the object with */ -typedef void *_Nullable (^of_map_table_replace_block_t)(void *_Nullable key, +typedef void *_Nullable (^OFMapTableReplaceBlock)(void *_Nullable key, void *_Nullable object); #endif @class OFMapTableEnumerator; @@ -70,26 +69,26 @@ * and objects should be retained, released, compared and hashed. */ OF_SUBCLASSING_RESTRICTED @interface OFMapTable: OFObject { - of_map_table_functions_t _keyFunctions, _objectFunctions; - struct of_map_table_bucket *_Nonnull *_Nullable _buckets; + OFMapTableFunctions _keyFunctions, _objectFunctions; + struct OFMapTableBucket *_Nonnull *_Nullable _buckets; unsigned long _count, _capacity; unsigned char _rotate; unsigned long _mutations; } /** * @brief The key functions used by the map table. */ -@property (readonly, nonatomic) of_map_table_functions_t keyFunctions; +@property (readonly, nonatomic) OFMapTableFunctions keyFunctions; /** * @brief The object functions used by the map table. */ -@property (readonly, nonatomic) of_map_table_functions_t objectFunctions; +@property (readonly, nonatomic) OFMapTableFunctions objectFunctions; /** * @brief The number of objects in the map table. */ @property (readonly, nonatomic) size_t count; @@ -99,13 +98,12 @@ * * @param keyFunctions A structure of functions for handling keys * @param objectFunctions A structure of functions for handling objects * @return A new autoreleased OFMapTable */ -+ (instancetype)mapTableWithKeyFunctions: (of_map_table_functions_t)keyFunctions - objectFunctions: (of_map_table_functions_t) - objectFunctions; ++ (instancetype)mapTableWithKeyFunctions: (OFMapTableFunctions)keyFunctions + objectFunctions: (OFMapTableFunctions)objectFunctions; /** * @brief Creates a new OFMapTable with the specified key functions, object * functions and capacity. * @@ -113,13 +111,12 @@ * @param objectFunctions A structure of functions for handling objects * @param capacity A hint about the count of elements expected to be in the map * table * @return A new autoreleased OFMapTable */ -+ (instancetype)mapTableWithKeyFunctions: (of_map_table_functions_t)keyFunctions - objectFunctions: (of_map_table_functions_t) - objectFunctions ++ (instancetype)mapTableWithKeyFunctions: (OFMapTableFunctions)keyFunctions + objectFunctions: (OFMapTableFunctions)objectFunctions capacity: (size_t)capacity; - (instancetype)init OF_UNAVAILABLE; /** @@ -128,12 +125,12 @@ * * @param keyFunctions A structure of functions for handling keys * @param objectFunctions A structure of functions for handling objects * @return An initialized OFMapTable */ -- (instancetype)initWithKeyFunctions: (of_map_table_functions_t)keyFunctions - objectFunctions: (of_map_table_functions_t)objectFunctions; +- (instancetype)initWithKeyFunctions: (OFMapTableFunctions)keyFunctions + objectFunctions: (OFMapTableFunctions)objectFunctions; /** * @brief Initializes an already allocated OFMapTable with the specified key * functions, object functions and capacity. * @@ -141,12 +138,12 @@ * @param objectFunctions A structure of functions for handling objects * @param capacity A hint about the count of elements expected to be in the map * table * @return An initialized OFMapTable */ -- (instancetype)initWithKeyFunctions: (of_map_table_functions_t)keyFunctions - objectFunctions: (of_map_table_functions_t)objectFunctions +- (instancetype)initWithKeyFunctions: (OFMapTableFunctions)keyFunctions + objectFunctions: (OFMapTableFunctions)objectFunctions capacity: (size_t)capacity OF_DESIGNATED_INITIALIZER; /** * @brief Returns the object for the given key or NULL if the key was not found. @@ -215,19 +212,18 @@ /** * @brief Executes a block for each key / object pair. * * @param block The block to execute for each key / object pair. */ -- (void)enumerateKeysAndObjectsUsingBlock: - (of_map_table_enumeration_block_t)block; +- (void)enumerateKeysAndObjectsUsingBlock: (OFMapTableEnumerationBlock)block; /** * @brief Replaces each object with the object returned by the block. * * @param block The block which returns a new object for each object */ -- (void)replaceObjectsUsingBlock: (of_map_table_replace_block_t)block; +- (void)replaceObjectsUsingBlock: (OFMapTableReplaceBlock)block; #endif @end /** * @class OFMapTableEnumerator OFMapTable.h ObjFW/OFMapTable.h @@ -236,11 +232,11 @@ * keys or objects. */ @interface OFMapTableEnumerator: OFObject { OFMapTable *_mapTable; - struct of_map_table_bucket *_Nonnull *_Nullable _buckets; + struct OFMapTableBucket *_Nonnull *_Nullable _buckets; unsigned long _capacity, _mutations, *_Nullable _mutationsPtr; unsigned long _position; } - (instancetype)init OF_UNAVAILABLE; Index: src/OFMapTable.m ================================================================== --- src/OFMapTable.m +++ src/OFMapTable.m @@ -26,17 +26,19 @@ #import "OFEnumerationMutationException.h" #import "OFInvalidArgumentException.h" #import "OFOutOfRangeException.h" -#define MIN_CAPACITY 16 +extern unsigned long OFHashSeed; -struct of_map_table_bucket { +static const unsigned long minCapacity = 16; + +struct OFMapTableBucket { void *key, *object; unsigned long hash; }; -static struct of_map_table_bucket deleted = { 0 }; +static struct OFMapTableBucket deletedBucket = { 0 }; static void * defaultRetain(void *object) { return object; @@ -60,11 +62,11 @@ } OF_DIRECT_MEMBERS @interface OFMapTableEnumerator () - (instancetype)of_initWithMapTable: (OFMapTable *)mapTable - buckets: (struct of_map_table_bucket **)buckets + buckets: (struct OFMapTableBucket **)buckets capacity: (unsigned long)capacity mutationsPointer: (unsigned long *)mutationsPtr OF_METHOD_FAMILY(init); @end @@ -75,22 +77,20 @@ @end @implementation OFMapTable @synthesize keyFunctions = _keyFunctions, objectFunctions = _objectFunctions; -+ (instancetype)mapTableWithKeyFunctions: (of_map_table_functions_t)keyFunctions - objectFunctions: (of_map_table_functions_t) - objectFunctions ++ (instancetype)mapTableWithKeyFunctions: (OFMapTableFunctions)keyFunctions + objectFunctions: (OFMapTableFunctions)objectFunctions { return [[[self alloc] initWithKeyFunctions: keyFunctions objectFunctions: objectFunctions] autorelease]; } -+ (instancetype)mapTableWithKeyFunctions: (of_map_table_functions_t)keyFunctions - objectFunctions: (of_map_table_functions_t) - objectFunctions ++ (instancetype)mapTableWithKeyFunctions: (OFMapTableFunctions)keyFunctions + objectFunctions: (OFMapTableFunctions)objectFunctions capacity: (size_t)capacity { return [[[self alloc] initWithKeyFunctions: keyFunctions objectFunctions: objectFunctions @@ -100,20 +100,20 @@ - (instancetype)init { OF_INVALID_INIT_METHOD } -- (instancetype)initWithKeyFunctions: (of_map_table_functions_t)keyFunctions - objectFunctions: (of_map_table_functions_t)objectFunctions +- (instancetype)initWithKeyFunctions: (OFMapTableFunctions)keyFunctions + objectFunctions: (OFMapTableFunctions)objectFunctions { return [self initWithKeyFunctions: keyFunctions objectFunctions: objectFunctions capacity: 0]; } -- (instancetype)initWithKeyFunctions: (of_map_table_functions_t)keyFunctions - objectFunctions: (of_map_table_functions_t)objectFunctions +- (instancetype)initWithKeyFunctions: (OFMapTableFunctions)keyFunctions + objectFunctions: (OFMapTableFunctions)objectFunctions capacity: (size_t)capacity { self = [super init]; @try { @@ -149,17 +149,17 @@ if (capacity * 8 / _capacity >= 6) if (_capacity <= ULONG_MAX / 2) _capacity *= 2; - if (_capacity < MIN_CAPACITY) - _capacity = MIN_CAPACITY; + if (_capacity < minCapacity) + _capacity = minCapacity; - _buckets = of_alloc_zeroed(_capacity, sizeof(*_buckets)); + _buckets = OFAllocZeroedMemory(_capacity, sizeof(*_buckets)); - if (of_hash_seed != 0) - _rotate = of_random16() & 31; + if (OFHashSeed != 0) + _rotate = OFRandom16() & 31; } @catch (id e) { [self release]; @throw e; } @@ -167,28 +167,28 @@ } - (void)dealloc { for (unsigned long i = 0; i < _capacity; i++) { - if (_buckets[i] != NULL && _buckets[i] != &deleted) { + if (_buckets[i] != NULL && _buckets[i] != &deletedBucket) { _keyFunctions.release(_buckets[i]->key); _objectFunctions.release(_buckets[i]->object); - free(_buckets[i]); + OFFreeMemory(_buckets[i]); } } - free(_buckets); + OFFreeMemory(_buckets); [super dealloc]; } static void resizeForCount(OFMapTable *self, unsigned long count) { unsigned long fullness, capacity; - struct of_map_table_bucket **buckets; + struct OFMapTableBucket **buckets; if (count > ULONG_MAX / sizeof(*self->_buckets) || count > ULONG_MAX / 8) @throw [OFOutOfRangeException exception]; @@ -207,18 +207,18 @@ /* * Don't downsize if we have an initial capacity or if we would fall * below the minimum capacity. */ if ((capacity < self->_capacity && count > self->_count) || - capacity < MIN_CAPACITY) + capacity < minCapacity) return; - buckets = of_alloc_zeroed(capacity, sizeof(*buckets)); + buckets = OFAllocZeroedMemory(capacity, sizeof(*buckets)); for (unsigned long i = 0; i < self->_capacity; i++) { if (self->_buckets[i] != NULL && - self->_buckets[i] != &deleted) { + self->_buckets[i] != &deletedBucket) { unsigned long j, last; last = capacity; for (j = self->_buckets[i]->hash & (capacity - 1); @@ -237,11 +237,11 @@ buckets[j] = self->_buckets[i]; } } - free(self->_buckets); + OFFreeMemory(self->_buckets); self->_buckets = buckets; self->_capacity = capacity; } static void @@ -252,16 +252,16 @@ void *old; if (key == NULL || object == NULL) @throw [OFInvalidArgumentException exception]; - hash = OF_ROL(hash, self->_rotate); + hash = OFRotateLeft(hash, self->_rotate); last = self->_capacity; for (i = hash & (self->_capacity - 1); i < last && self->_buckets[i] != NULL; i++) { - if (self->_buckets[i] == &deleted) + if (self->_buckets[i] == &deletedBucket) continue; if (self->_keyFunctions.equal(self->_buckets[i]->key, key)) break; } @@ -269,11 +269,11 @@ /* In case the last bucket is already used */ if (i >= last) { last = hash & (self->_capacity - 1); for (i = 0; i < last && self->_buckets[i] != NULL; i++) { - if (self->_buckets[i] == &deleted) + if (self->_buckets[i] == &deletedBucket) continue; if (self->_keyFunctions.equal( self->_buckets[i]->key, key)) break; @@ -280,48 +280,48 @@ } } /* Key not in map table */ if (i >= last || self->_buckets[i] == NULL || - self->_buckets[i] == &deleted || + self->_buckets[i] == &deletedBucket || !self->_keyFunctions.equal(self->_buckets[i]->key, key)) { - struct of_map_table_bucket *bucket; + struct OFMapTableBucket *bucket; resizeForCount(self, self->_count + 1); self->_mutations++; last = self->_capacity; for (i = hash & (self->_capacity - 1); i < last && - self->_buckets[i] != NULL && self->_buckets[i] != &deleted; - i++); + self->_buckets[i] != NULL && + self->_buckets[i] != &deletedBucket; i++); /* In case the last bucket is already used */ if (i >= last) { last = hash & (self->_capacity - 1); for (i = 0; i < last && self->_buckets[i] != NULL && - self->_buckets[i] != &deleted; i++); + self->_buckets[i] != &deletedBucket; i++); } if (i >= last) @throw [OFOutOfRangeException exception]; - bucket = of_alloc(1, sizeof(*bucket)); + bucket = OFAllocMemory(1, sizeof(*bucket)); @try { bucket->key = self->_keyFunctions.retain(key); } @catch (id e) { - free(bucket); + OFFreeMemory(bucket); @throw e; } @try { bucket->object = self->_objectFunctions.retain(object); } @catch (id e) { self->_keyFunctions.release(bucket->key); - free(bucket); + OFFreeMemory(bucket); @throw e; } bucket->hash = hash; @@ -352,11 +352,11 @@ mapTable->_keyFunctions.equal != _keyFunctions.equal || mapTable->_objectFunctions.equal != _objectFunctions.equal) return false; for (unsigned long i = 0; i < _capacity; i++) { - if (_buckets[i] != NULL && _buckets[i] != &deleted) { + if (_buckets[i] != NULL && _buckets[i] != &deletedBucket) { void *objectIter = [mapTable objectForKey: _buckets[i]->key]; if (!_objectFunctions.equal(objectIter, _buckets[i]->object)) @@ -370,12 +370,12 @@ - (unsigned long)hash { unsigned long hash = 0; for (unsigned long i = 0; i < _capacity; i++) { - if (_buckets[i] != NULL && _buckets[i] != &deleted) { - hash ^= OF_ROR(_buckets[i]->hash, _rotate); + if (_buckets[i] != NULL && _buckets[i] != &deletedBucket) { + hash ^= OFRotateRight(_buckets[i]->hash, _rotate); hash ^= _objectFunctions.hash(_buckets[i]->object); } } return hash; @@ -388,14 +388,15 @@ objectFunctions: _objectFunctions capacity: _capacity]; @try { for (unsigned long i = 0; i < _capacity; i++) - if (_buckets[i] != NULL && _buckets[i] != &deleted) + if (_buckets[i] != NULL && + _buckets[i] != &deletedBucket) setObject(copy, _buckets[i]->key, _buckets[i]->object, - OF_ROR(_buckets[i]->hash, _rotate)); + OFRotateRight(_buckets[i]->hash, _rotate)); } @catch (id e) { [copy release]; @throw e; } @@ -412,15 +413,15 @@ unsigned long i, hash, last; if (key == NULL) @throw [OFInvalidArgumentException exception]; - hash = OF_ROL(_keyFunctions.hash(key), _rotate); + hash = OFRotateLeft(_keyFunctions.hash(key), _rotate); last = _capacity; for (i = hash & (_capacity - 1); i < last && _buckets[i] != NULL; i++) { - if (_buckets[i] == &deleted) + if (_buckets[i] == &deletedBucket) continue; if (_keyFunctions.equal(_buckets[i]->key, key)) return _buckets[i]->object; } @@ -430,11 +431,11 @@ /* In case the last bucket is already used */ last = hash & (_capacity - 1); for (i = 0; i < last && _buckets[i] != NULL; i++) { - if (_buckets[i] == &deleted) + if (_buckets[i] == &deletedBucket) continue; if (_keyFunctions.equal(_buckets[i]->key, key)) return _buckets[i]->object; } @@ -452,25 +453,25 @@ unsigned long i, hash, last; if (key == NULL) @throw [OFInvalidArgumentException exception]; - hash = OF_ROL(_keyFunctions.hash(key), _rotate); + hash = OFRotateLeft(_keyFunctions.hash(key), _rotate); last = _capacity; for (i = hash & (_capacity - 1); i < last && _buckets[i] != NULL; i++) { - if (_buckets[i] == &deleted) + if (_buckets[i] == &deletedBucket) continue; if (_keyFunctions.equal(_buckets[i]->key, key)) { _mutations++; _keyFunctions.release(_buckets[i]->key); _objectFunctions.release(_buckets[i]->object); - free(_buckets[i]); - _buckets[i] = &deleted; + OFFreeMemory(_buckets[i]); + _buckets[i] = &deletedBucket; _count--; resizeForCount(self, _count); return; @@ -482,19 +483,19 @@ /* In case the last bucket is already used */ last = hash & (_capacity - 1); for (i = 0; i < last && _buckets[i] != NULL; i++) { - if (_buckets[i] == &deleted) + if (_buckets[i] == &deletedBucket) continue; if (_keyFunctions.equal(_buckets[i]->key, key)) { _keyFunctions.release(_buckets[i]->key); _objectFunctions.release(_buckets[i]->object); - free(_buckets[i]); - _buckets[i] = &deleted; + OFFreeMemory(_buckets[i]); + _buckets[i] = &deletedBucket; _count--; _mutations++; resizeForCount(self, _count); @@ -505,42 +506,42 @@ - (void)removeAllObjects { for (unsigned long i = 0; i < _capacity; i++) { if (_buckets[i] != NULL) { - if (_buckets[i] == &deleted) { + if (_buckets[i] == &deletedBucket) { _buckets[i] = NULL; continue; } _keyFunctions.release(_buckets[i]->key); _objectFunctions.release(_buckets[i]->object); - free(_buckets[i]); + OFFreeMemory(_buckets[i]); _buckets[i] = NULL; } } _count = 0; - _capacity = MIN_CAPACITY; - _buckets = of_realloc(_buckets, _capacity, sizeof(*_buckets)); + _capacity = minCapacity; + _buckets = OFResizeMemory(_buckets, _capacity, sizeof(*_buckets)); /* * Get a new random value for _rotate, so that it is not less secure * than creating a new hash map. */ - if (of_hash_seed != 0) - _rotate = of_random16() & 31; + if (OFHashSeed != 0) + _rotate = OFRandom16() & 31; } - (bool)containsObject: (void *)object { if (object == NULL || _count == 0) return false; for (unsigned long i = 0; i < _capacity; i++) - if (_buckets[i] != NULL && _buckets[i] != &deleted) + if (_buckets[i] != NULL && _buckets[i] != &deletedBucket) if (_objectFunctions.equal(_buckets[i]->object, object)) return true; return false; } @@ -549,11 +550,11 @@ { if (object == NULL || _count == 0) return false; for (unsigned long i = 0; i < _capacity; i++) - if (_buckets[i] != NULL && _buckets[i] != &deleted) + if (_buckets[i] != NULL && _buckets[i] != &deletedBucket) if (_buckets[i]->object == object) return true; return false; } @@ -574,20 +575,20 @@ buckets: _buckets capacity: _capacity mutationsPointer: &_mutations] autorelease]; } -- (int)countByEnumeratingWithState: (of_fast_enumeration_state_t *)state +- (int)countByEnumeratingWithState: (OFFastEnumerationState *)state objects: (id *)objects count: (int)count { unsigned long j = state->state; int i; for (i = 0; i < count; i++) { for (; j < _capacity && (_buckets[j] == NULL || - _buckets[j] == &deleted); j++); + _buckets[j] == &deletedBucket); j++); if (j < _capacity) { objects[i] = _buckets[j]->key; j++; } else @@ -600,36 +601,35 @@ return i; } #ifdef OF_HAVE_BLOCKS -- (void)enumerateKeysAndObjectsUsingBlock: - (of_map_table_enumeration_block_t)block +- (void)enumerateKeysAndObjectsUsingBlock: (OFMapTableEnumerationBlock)block { bool stop = false; unsigned long mutations = _mutations; for (size_t i = 0; i < _capacity && !stop; i++) { if (_mutations != mutations) @throw [OFEnumerationMutationException exceptionWithObject: self]; - if (_buckets[i] != NULL && _buckets[i] != &deleted) + if (_buckets[i] != NULL && _buckets[i] != &deletedBucket) block(_buckets[i]->key, _buckets[i]->object, &stop); } } -- (void)replaceObjectsUsingBlock: (of_map_table_replace_block_t)block +- (void)replaceObjectsUsingBlock: (OFMapTableReplaceBlock)block { unsigned long mutations = _mutations; for (size_t i = 0; i < _capacity; i++) { if (_mutations != mutations) @throw [OFEnumerationMutationException exceptionWithObject: self]; - if (_buckets[i] != NULL && _buckets[i] != &deleted) { + if (_buckets[i] != NULL && _buckets[i] != &deletedBucket) { void *new; new = block(_buckets[i]->key, _buckets[i]->object); if (new == NULL) @throw [OFInvalidArgumentException exception]; @@ -650,11 +650,11 @@ { OF_INVALID_INIT_METHOD } - (instancetype)of_initWithMapTable: (OFMapTable *)mapTable - buckets: (struct of_map_table_bucket **)buckets + buckets: (struct OFMapTableBucket **)buckets capacity: (unsigned long)capacity mutationsPointer: (unsigned long *)mutationsPtr { self = [super init]; @@ -686,11 +686,11 @@ if (*_mutationsPtr != _mutations) @throw [OFEnumerationMutationException exceptionWithObject: _mapTable]; for (; _position < _capacity && (_buckets[_position] == NULL || - _buckets[_position] == &deleted); _position++); + _buckets[_position] == &deletedBucket); _position++); if (_position < _capacity) return &_buckets[_position++]->key; else return NULL; @@ -703,11 +703,11 @@ if (*_mutationsPtr != _mutations) @throw [OFEnumerationMutationException exceptionWithObject: _mapTable]; for (; _position < _capacity && (_buckets[_position] == NULL || - _buckets[_position] == &deleted); _position++); + _buckets[_position] == &deletedBucket); _position++); if (_position < _capacity) return &_buckets[_position++]->object; else return NULL; Index: src/OFMapTableDictionary.m ================================================================== --- src/OFMapTableDictionary.m +++ src/OFMapTableDictionary.m @@ -57,17 +57,17 @@ equal(void *object1, void *object2) { return [(id)object1 isEqual: (id)object2]; } -static const of_map_table_functions_t keyFunctions = { +static const OFMapTableFunctions keyFunctions = { .retain = copy, .release = release, .hash = hash, .equal = equal }; -static const of_map_table_functions_t objectFunctions = { +static const OFMapTableFunctions objectFunctions = { .retain = retain, .release = release, .hash = hash, .equal = equal }; @@ -241,13 +241,13 @@ OFArray *keys, *objects; OFEnumerator *keyEnumerator, *objectEnumerator; OFXMLElement *keyElement, *objectElement; keys = [element elementsForName: @"key" - namespace: OF_SERIALIZATION_NS]; + namespace: OFSerializationNS]; objects = [element elementsForName: @"object" - namespace: OF_SERIALIZATION_NS]; + namespace: OFSerializationNS]; if (keys.count != objects.count) @throw [OFInvalidFormatException exception]; _mapTable = [[OFMapTable alloc] @@ -261,13 +261,13 @@ (objectElement = [objectEnumerator nextObject]) != nil) { void *pool2 = objc_autoreleasePoolPush(); OFXMLElement *key, *object; key = [keyElement elementsForNamespace: - OF_SERIALIZATION_NS].firstObject; + OFSerializationNS].firstObject; object = [objectElement elementsForNamespace: - OF_SERIALIZATION_NS].firstObject; + OFSerializationNS].firstObject; if (key == nil || object == nil) @throw [OFInvalidFormatException exception]; [_mapTable setObject: object.objectByDeserializing @@ -333,11 +333,11 @@ OFArray *ret; id *keys; size_t count; count = _mapTable.count; - keys = of_alloc(count, sizeof(*keys)); + keys = OFAllocMemory(count, sizeof(*keys)); @try { void *pool = objc_autoreleasePoolPush(); OFMapTableEnumerator *enumerator; void **keyPtr; @@ -353,11 +353,11 @@ objc_autoreleasePoolPop(pool); ret = [OFArray arrayWithObjects: keys count: count]; } @finally { - free(keys); + OFFreeMemory(keys); } return ret; } @@ -366,11 +366,11 @@ OFArray *ret; id *objects; size_t count; count = _mapTable.count; - objects = of_alloc(count, sizeof(*objects)); + objects = OFAllocMemory(count, sizeof(*objects)); @try { void *pool = objc_autoreleasePoolPush(); OFMapTableEnumerator *enumerator; void **objectPtr; @@ -386,11 +386,11 @@ objc_autoreleasePoolPop(pool); ret = [OFArray arrayWithObjects: objects count: count]; } @finally { - free(objects); + OFFreeMemory(objects); } return ret; } @@ -406,22 +406,21 @@ return [[[OFMapTableEnumeratorWrapper alloc] initWithEnumerator: [_mapTable objectEnumerator] object: self] autorelease]; } -- (int)countByEnumeratingWithState: (of_fast_enumeration_state_t *)state +- (int)countByEnumeratingWithState: (OFFastEnumerationState *)state objects: (id *)objects count: (int)count { return [_mapTable countByEnumeratingWithState: state objects: objects count: count]; } #ifdef OF_HAVE_BLOCKS -- (void)enumerateKeysAndObjectsUsingBlock: - (of_dictionary_enumeration_block_t)block +- (void)enumerateKeysAndObjectsUsingBlock: (OFDictionaryEnumerationBlock)block { @try { [_mapTable enumerateKeysAndObjectsUsingBlock: ^ (void *key, void *object, bool *stop) { block(key, object, stop); Index: src/OFMapTableSet.m ================================================================== --- src/OFMapTableSet.m +++ src/OFMapTableSet.m @@ -49,17 +49,17 @@ equal(void *object1, void *object2) { return [(id)object1 isEqual: (id)object2]; } -static const of_map_table_functions_t keyFunctions = { +static const OFMapTableFunctions keyFunctions = { .retain = retain, .release = release, .hash = hash, .equal = equal }; -static const of_map_table_functions_t objectFunctions = { NULL }; +static const OFMapTableFunctions objectFunctions = { NULL }; @implementation OFMapTableSet - (instancetype)init { return [self initWithCapacity: 0]; @@ -188,15 +188,15 @@ @try { void *pool = objc_autoreleasePoolPush(); if ((![element.name isEqual: @"OFSet"] && ![element.name isEqual: @"OFMutableSet"]) || - ![element.namespace isEqual: OF_SERIALIZATION_NS]) + ![element.namespace isEqual: OFSerializationNS]) @throw [OFInvalidArgumentException exception]; for (OFXMLElement *child in - [element elementsForNamespace: OF_SERIALIZATION_NS]) { + [element elementsForNamespace: OFSerializationNS]) { void *pool2 = objc_autoreleasePoolPush(); [_mapTable setObject: (void *)1 forKey: [child objectByDeserializing]]; @@ -274,21 +274,21 @@ return [[[OFMapTableEnumeratorWrapper alloc] initWithEnumerator: [_mapTable keyEnumerator] object: self] autorelease]; } -- (int)countByEnumeratingWithState: (of_fast_enumeration_state_t *)state +- (int)countByEnumeratingWithState: (OFFastEnumerationState *)state objects: (id *)objects count: (int)count { return [_mapTable countByEnumeratingWithState: state objects: objects count: count]; } #ifdef OF_HAVE_BLOCKS -- (void)enumerateObjectsUsingBlock: (of_set_enumeration_block_t)block +- (void)enumerateObjectsUsingBlock: (OFSetEnumerationBlock)block { @try { [_mapTable enumerateKeysAndObjectsUsingBlock: ^ (void *key, void *object, bool *stop) { block(key, stop); Index: src/OFMessagePackExtension.m ================================================================== --- src/OFMessagePackExtension.m +++ src/OFMessagePackExtension.m @@ -118,11 +118,11 @@ ret = [OFMutableData dataWithCapacity: count + 4]; prefix = 0xC8; [ret addItem: &prefix]; - length = OF_BSWAP16_IF_LE((uint16_t)count); + length = OFToBigEndian16((uint16_t)count); [ret addItems: &length count: 2]; [ret addItem: &_type]; } else { uint32_t length; @@ -130,11 +130,11 @@ ret = [OFMutableData dataWithCapacity: count + 6]; prefix = 0xC9; [ret addItem: &prefix]; - length = OF_BSWAP32_IF_LE((uint32_t)count); + length = OFToBigEndian32((uint32_t)count); [ret addItems: &length count: 4]; [ret addItem: &_type]; } @@ -168,22 +168,22 @@ return true; } - (unsigned long)hash { - uint32_t hash; - - OF_HASH_INIT(hash); - - OF_HASH_ADD(hash, (uint8_t)_type); - OF_HASH_ADD_HASH(hash, _data.hash); - - OF_HASH_FINALIZE(hash); + unsigned long hash; + + OFHashInit(&hash); + + OFHashAdd(&hash, (uint8_t)_type); + OFHashAddHash(&hash, _data.hash); + + OFHashFinalize(&hash); return hash; } - (id)copy { return [self retain]; } @end Index: src/OFMethodSignature.h ================================================================== --- src/OFMethodSignature.h +++ src/OFMethodSignature.h @@ -92,19 +92,19 @@ * @brief Returns the size for the specified type encoding. * * @param type The type encoding to return the size for * @return The size for the specified type encoding */ -extern size_t of_sizeof_type_encoding(const char *type); +extern size_t OFSizeOfTypeEncoding(const char *type); /** * @brief Returns the alignment for the specified type encoding. * * @param type The type encoding to return the alignment for * @return The alignment for the specified type encoding */ -extern size_t of_alignof_type_encoding(const char *type); +extern size_t OFAlignmentOfTypeEncoding(const char *type); #ifdef __cplusplus } #endif OF_ASSUME_NONNULL_END Index: src/OFMethodSignature.m ================================================================== --- src/OFMethodSignature.m +++ src/OFMethodSignature.m @@ -25,43 +25,44 @@ #import "OFInvalidFormatException.h" #import "OFOutOfRangeException.h" #import "macros.h" -static size_t alignofEncoding(const char **type, size_t *length, bool inStruct); -static size_t sizeofEncoding(const char **type, size_t *length); +static size_t alignmentOfEncoding(const char **type, size_t *length, + bool inStruct); +static size_t sizeOfEncoding(const char **type, size_t *length); static size_t -alignofArray(const char **type, size_t *length) +alignmentOfArray(const char **type, size_t *length) { - size_t align; + size_t alignment; assert(*length > 0); (*type)++; (*length)--; - while (*length > 0 && of_ascii_isdigit(**type)) { + while (*length > 0 && OFASCIIIsDigit(**type)) { (*type)++; (*length)--; } - align = alignofEncoding(type, length, true); + alignment = alignmentOfEncoding(type, length, true); if (*length == 0 || **type != ']') @throw [OFInvalidFormatException exception]; (*type)++; (*length)--; - return align; + return alignment; } static size_t -alignofStruct(const char **type, size_t *length) +alignmentOfStruct(const char **type, size_t *length) { - size_t align = 0; + size_t alignment = 0; #if defined(OF_POWERPC) && defined(OF_MACOS) bool first = true; #endif assert(*length > 0); @@ -81,36 +82,36 @@ /* Skip '=' */ (*type)++; (*length)--; while (*length > 0 && **type != '}') { - size_t fieldAlign = alignofEncoding(type, length, true); + size_t fieldAlignment = alignmentOfEncoding(type, length, true); #if defined(OF_POWERPC) && defined(OF_MACOS) - if (!first && fieldAlign > 4) - fieldAlign = 4; + if (!first && fieldAlignment > 4) + fieldAlignment = 4; first = false; #endif - if (fieldAlign > align) - align = fieldAlign; + if (fieldAlignment > alignment) + alignment = fieldAlignment; } if (*length == 0 || **type != '}') @throw [OFInvalidFormatException exception]; (*type)++; (*length)--; - return align; + return alignment; } static size_t -alignofUnion(const char **type, size_t *length) +alignmentOfUnion(const char **type, size_t *length) { - size_t align = 0; + size_t alignment = 0; assert(*length > 0); (*type)++; (*length)--; @@ -127,29 +128,29 @@ /* Skip '=' */ (*type)++; (*length)--; while (*length > 0 && **type != ')') { - size_t fieldAlign = alignofEncoding(type, length, true); + size_t fieldAlignment = alignmentOfEncoding(type, length, true); - if (fieldAlign > align) - align = fieldAlign; + if (fieldAlignment > alignment) + alignment = fieldAlignment; } if (*length == 0 || **type != ')') @throw [OFInvalidFormatException exception]; (*type)++; (*length)--; - return align; + return alignment; } static size_t -alignofEncoding(const char **type, size_t *length, bool inStruct) +alignmentOfEncoding(const char **type, size_t *length, bool inStruct) { - size_t align; + size_t alignment; if (*length == 0) @throw [OFInvalidFormatException exception]; if (**type == 'r') { @@ -161,87 +162,87 @@ } switch (**type) { case 'c': case 'C': - align = OF_ALIGNOF(char); + alignment = OF_ALIGNOF(char); break; case 'i': case 'I': - align = OF_ALIGNOF(int); + alignment = OF_ALIGNOF(int); break; case 's': case 'S': - align = OF_ALIGNOF(short); + alignment = OF_ALIGNOF(short); break; case 'l': case 'L': - align = OF_ALIGNOF(long); + alignment = OF_ALIGNOF(long); break; case 'q': case 'Q': #if defined(OF_X86) && !defined(OF_WINDOWS) if (inStruct) - align = 4; + alignment = 4; else #endif - align = OF_ALIGNOF(long long); + alignment = OF_ALIGNOF(long long); break; #ifdef __SIZEOF_INT128__ case 't': case 'T': - align = __extension__ OF_ALIGNOF(__int128); + alignment = __extension__ OF_ALIGNOF(__int128); break; #endif case 'f': - align = OF_ALIGNOF(float); + alignment = OF_ALIGNOF(float); break; case 'd': #if defined(OF_X86) && !defined(OF_WINDOWS) if (inStruct) - align = 4; + alignment = 4; else #endif - align = OF_ALIGNOF(double); + alignment = OF_ALIGNOF(double); break; case 'D': #if defined(OF_X86) && !defined(OF_WINDOWS) if (inStruct) - align = 4; + alignment = 4; else #endif - align = OF_ALIGNOF(long double); + alignment = OF_ALIGNOF(long double); break; case 'B': - align = OF_ALIGNOF(_Bool); + alignment = OF_ALIGNOF(_Bool); break; case 'v': - align = 0; + alignment = 0; break; case '*': - align = OF_ALIGNOF(char *); + alignment = OF_ALIGNOF(char *); break; case '@': - align = OF_ALIGNOF(id); + alignment = OF_ALIGNOF(id); break; case '#': - align = OF_ALIGNOF(Class); + alignment = OF_ALIGNOF(Class); break; case ':': - align = OF_ALIGNOF(SEL); + alignment = OF_ALIGNOF(SEL); break; case '[': - return alignofArray(type, length); + return alignmentOfArray(type, length); case '{': - return alignofStruct(type, length); + return alignmentOfStruct(type, length); case '(': - return alignofUnion(type, length); + return alignmentOfUnion(type, length); case '^': /* Just to skip over the rest */ (*type)++; (*length)--; - alignofEncoding(type, length, false); + alignmentOfEncoding(type, length, false); return OF_ALIGNOF(void *); #ifndef __STDC_NO_COMPLEX__ case 'j': (*type)++; @@ -250,22 +251,22 @@ if (*length == 0) @throw [OFInvalidFormatException exception]; switch (**type) { case 'f': - align = OF_ALIGNOF(float _Complex); + alignment = OF_ALIGNOF(float _Complex); break; case 'd': # if defined(OF_X86) && !defined(OF_WINDOWS) if (inStruct) - align = 4; + alignment = 4; else # endif - align = OF_ALIGNOF(double _Complex); + alignment = OF_ALIGNOF(double _Complex); break; case 'D': - align = OF_ALIGNOF(long double _Complex); + alignment = OF_ALIGNOF(long double _Complex); break; default: @throw [OFInvalidFormatException exception]; } @@ -276,35 +277,35 @@ } (*type)++; (*length)--; - return align; + return alignment; } static size_t -sizeofArray(const char **type, size_t *length) +sizeOfArray(const char **type, size_t *length) { size_t count = 0; size_t size; assert(*length > 0); (*type)++; (*length)--; - while (*length > 0 && of_ascii_isdigit(**type)) { + while (*length > 0 && OFASCIIIsDigit(**type)) { count = count * 10 + **type - '0'; (*type)++; (*length)--; } if (count == 0) @throw [OFInvalidFormatException exception]; - size = sizeofEncoding(type, length); + size = sizeOfEncoding(type, length); if (*length == 0 || **type != ']') @throw [OFInvalidFormatException exception]; (*type)++; @@ -315,16 +316,16 @@ return count * size; } static size_t -sizeofStruct(const char **type, size_t *length) +sizeOfStruct(const char **type, size_t *length) { size_t size = 0; const char *typeCopy = *type; size_t lengthCopy = *length; - size_t alignment = alignofStruct(&typeCopy, &lengthCopy); + size_t alignment = alignmentOfStruct(&typeCopy, &lengthCopy); #if defined(OF_POWERPC) && defined(OF_MACOS) bool first = true; #endif assert(*length > 0); @@ -344,26 +345,28 @@ /* Skip '=' */ (*type)++; (*length)--; while (*length > 0 && **type != '}') { - size_t fieldSize, fieldAlign; + size_t fieldSize, fieldAlignment; typeCopy = *type; lengthCopy = *length; - fieldSize = sizeofEncoding(type, length); - fieldAlign = alignofEncoding(&typeCopy, &lengthCopy, true); + fieldSize = sizeOfEncoding(type, length); + fieldAlignment = alignmentOfEncoding(&typeCopy, &lengthCopy, + true); #if defined(OF_POWERPC) && defined(OF_MACOS) - if (!first && fieldAlign > 4) - fieldAlign = 4; + if (!first && fieldAlignment > 4) + fieldAlignment = 4; first = false; #endif - if (size % fieldAlign != 0) { - size_t padding = fieldAlign - (size % fieldAlign); + if (size % fieldAlignment != 0) { + size_t padding = + fieldAlignment - (size % fieldAlignment); if (SIZE_MAX - size < padding) @throw [OFOutOfRangeException exception]; size += padding; @@ -392,11 +395,11 @@ return size; } static size_t -sizeofUnion(const char **type, size_t *length) +sizeOfUnion(const char **type, size_t *length) { size_t size = 0; assert(*length > 0); @@ -415,11 +418,11 @@ /* Skip '=' */ (*type)++; (*length)--; while (*length > 0 && **type != ')') { - size_t fieldSize = sizeofEncoding(type, length); + size_t fieldSize = sizeOfEncoding(type, length); if (fieldSize > size) size = fieldSize; } @@ -431,11 +434,11 @@ return size; } static size_t -sizeofEncoding(const char **type, size_t *length) +sizeOfEncoding(const char **type, size_t *length) { size_t size; if (*length == 0) @throw [OFInvalidFormatException exception]; @@ -501,20 +504,20 @@ break; case ':': size = sizeof(SEL); break; case '[': - return sizeofArray(type, length); + return sizeOfArray(type, length); case '{': - return sizeofStruct(type, length); + return sizeOfStruct(type, length); case '(': - return sizeofUnion(type, length); + return sizeOfUnion(type, length); case '^': /* Just to skip over the rest */ (*type)++; (*length)--; - sizeofEncoding(type, length); + sizeOfEncoding(type, length); return sizeof(void *); #ifndef __STDC_NO_COMPLEX__ case 'j': (*type)++; @@ -548,26 +551,26 @@ return size; } size_t -of_sizeof_type_encoding(const char *type) +OFSizeOfTypeEncoding(const char *type) { size_t length = strlen(type); - size_t ret = sizeofEncoding(&type, &length); + size_t ret = sizeOfEncoding(&type, &length); if (length > 0) @throw [OFInvalidFormatException exception]; return ret; } size_t -of_alignof_type_encoding(const char *type) +OFAlignmentOfTypeEncoding(const char *type) { size_t length = strlen(type); - size_t ret = alignofEncoding(&type, &length, false); + size_t ret = alignmentOfEncoding(&type, &length, false); if (length > 0) @throw [OFInvalidFormatException exception]; return ret; @@ -593,21 +596,21 @@ length = strlen(types); if (length == 0) @throw [OFInvalidFormatException exception]; - _types = of_alloc(length + 1, 1); + _types = OFAllocMemory(length + 1, 1); memcpy(_types, types, length); _typesPointers = [[OFMutableData alloc] initWithItemSize: sizeof(char *)]; _offsets = [[OFMutableData alloc] initWithItemSize: sizeof(size_t)]; last = _types; for (size_t i = 0; i < length; i++) { - if (of_ascii_isdigit(_types[i])) { + if (OFASCIIIsDigit(_types[i])) { size_t offset = _types[i] - '0'; if (last == _types + i) @throw [OFInvalidFormatException exception]; @@ -615,11 +618,11 @@ _types[i] = '\0'; [_typesPointers addItem: &last]; i++; for (; i < length && - of_ascii_isdigit(_types[i]); i++) + OFASCIIIsDigit(_types[i]); i++) offset = offset * 10 + _types[i] - '0'; [_offsets addItem: &offset]; last = _types + i; @@ -667,11 +670,11 @@ return self; } - (void)dealloc { - free(_types); + OFFreeMemory(_types); [_typesPointers release]; [_offsets release]; [super dealloc]; } Index: src/OFMutableAdjacentArray.m ================================================================== --- src/OFMutableAdjacentArray.m +++ src/OFMutableAdjacentArray.m @@ -221,31 +221,31 @@ [objects[i] release]; [_array removeAllItems]; } -- (void)removeObjectsInRange: (of_range_t)range +- (void)removeObjectsInRange: (OFRange)range { id const *objects = _array.items; size_t count = _array.count; id *copy; if (range.length > SIZE_MAX - range.location || range.location >= count || range.length > count - range.location) @throw [OFOutOfRangeException exception]; - copy = of_alloc(range.length, sizeof(*copy)); + copy = OFAllocMemory(range.length, sizeof(*copy)); memcpy(copy, objects + range.location, range.length * sizeof(id)); @try { [_array removeItemsInRange: range]; _mutations++; for (size_t i = 0; i < range.length; i++) [copy[i] release]; } @finally { - free(copy); + OFFreeMemory(copy); } } - (void)removeLastObject { @@ -291,11 +291,11 @@ objects[i] = objects[j]; objects[j] = tmp; } } -- (int)countByEnumeratingWithState: (of_fast_enumeration_state_t *)state +- (int)countByEnumeratingWithState: (OFFastEnumerationState *)state objects: (id *)objects count: (int)count_ { size_t count = _array.count; @@ -328,11 +328,11 @@ initWithArray: self mutationsPtr: &_mutations] autorelease]; } #ifdef OF_HAVE_BLOCKS -- (void)enumerateObjectsUsingBlock: (of_array_enumeration_block_t)block +- (void)enumerateObjectsUsingBlock: (OFArrayEnumerationBlock)block { id const *objects = _array.items; size_t count = _array.count; bool stop = false; unsigned long mutations = _mutations; @@ -344,11 +344,11 @@ block(objects[i], i, &stop); } } -- (void)replaceObjectsUsingBlock: (of_array_replace_block_t)block +- (void)replaceObjectsUsingBlock: (OFArrayReplaceBlock)block { id *objects = _array.mutableItems; size_t count = _array.count; unsigned long mutations = _mutations; Index: src/OFMutableArray.h ================================================================== --- src/OFMutableArray.h +++ src/OFMutableArray.h @@ -25,11 +25,11 @@ * * @param object The object to replace * @param index The index of the object to replace * @return The object to replace the object with */ -typedef id _Nonnull (^of_array_replace_block_t)(id object, size_t index); +typedef id _Nonnull (^OFArrayReplaceBlock)(id object, size_t index); #endif /** * @class OFMutableArray OFArray.h ObjFW/OFArray.h * @@ -157,11 +157,11 @@ /** * @brief Removes the object in the specified range. * * @param range The range of the objects to remove */ -- (void)removeObjectsInRange: (of_range_t)range; +- (void)removeObjectsInRange: (OFRange)range; /** * @brief Removes the last object. */ - (void)removeLastObject; @@ -175,11 +175,11 @@ /** * @brief Replaces each object with the object returned by the block. * * @param block The block which returns a new object for each object */ -- (void)replaceObjectsUsingBlock: (of_array_replace_block_t)block; +- (void)replaceObjectsUsingBlock: (OFArrayReplaceBlock)block; #endif /** * @brief Exchange the objects at the specified indices. * @@ -196,30 +196,23 @@ /** * @brief Sorts the array using the specified selector and options. * * @param selector The selector to use to sort the array. It's signature * should be the same as that of -[compare:]. - * @param options The options to use when sorting the array.@n - * Possible values are: - * Value | Description - * ---------------------------|------------------------- - * `OF_ARRAY_SORT_DESCENDING` | Sort in descending order + * @param options The options to use when sorting the array */ -- (void)sortUsingSelector: (SEL)selector options: (int)options; +- (void)sortUsingSelector: (SEL)selector options: (OFArraySortOptions)options; #ifdef OF_HAVE_BLOCKS /** * @brief Sorts the array using the specified comparator and options. * * @param comparator The comparator to use to sort the array - * @param options The options to use when sorting the array.@n - * Possible values are: - * Value | Description - * ---------------------------|------------------------- - * `OF_ARRAY_SORT_DESCENDING` | Sort in descending order + * @param options The options to use when sorting the array */ -- (void)sortUsingComparator: (of_comparator_t)comparator options: (int)options; +- (void)sortUsingComparator: (OFComparator)comparator + options: (OFArraySortOptions)options; #endif /** * @brief Reverts the order of the objects in the array. */ Index: src/OFMutableArray.m ================================================================== --- src/OFMutableArray.m +++ src/OFMutableArray.m @@ -32,32 +32,32 @@ } placeholder; @interface OFMutableArrayPlaceholder: OFMutableArray @end -static of_comparison_result_t +static OFComparisonResult compare(id left, id right, SEL selector) { - of_comparison_result_t (*comparator)(id, SEL, id) = - (of_comparison_result_t (*)(id, SEL, id)) + OFComparisonResult (*comparator)(id, SEL, id) = + (OFComparisonResult (*)(id, SEL, id)) [left methodForSelector: selector]; return comparator(left, selector, right); } static void quicksort(OFMutableArray *array, size_t left, size_t right, SEL selector, - int options) + OFArraySortOptions options) { - of_comparison_result_t ascending, descending; + OFComparisonResult ascending, descending; - if (options & OF_ARRAY_SORT_DESCENDING) { - ascending = OF_ORDERED_DESCENDING; - descending = OF_ORDERED_ASCENDING; + if (options & OFArraySortDescending) { + ascending = OFOrderedDescending; + descending = OFOrderedAscending; } else { - ascending = OF_ORDERED_ASCENDING; - descending = OF_ORDERED_DESCENDING; + ascending = OFOrderedAscending; + descending = OFOrderedDescending; } while (left < right) { size_t i = left; size_t j = right - 1; @@ -90,20 +90,20 @@ } #ifdef OF_HAVE_BLOCKS static void quicksortWithBlock(OFMutableArray *array, size_t left, size_t right, - of_comparator_t comparator, int options) + OFComparator comparator, OFArraySortOptions options) { - of_comparison_result_t ascending, descending; + OFComparisonResult ascending, descending; - if (options & OF_ARRAY_SORT_DESCENDING) { - ascending = OF_ORDERED_DESCENDING; - descending = OF_ORDERED_ASCENDING; + if (options & OFArraySortDescending) { + ascending = OFOrderedDescending; + descending = OFOrderedAscending; } else { - ascending = OF_ORDERED_ASCENDING; - descending = OF_ORDERED_DESCENDING; + ascending = OFOrderedAscending; + descending = OFOrderedDescending; } while (left < right) { size_t i = left; size_t j = right - 1; @@ -360,11 +360,11 @@ return; } } } -- (void)removeObjectsInRange: (of_range_t)range +- (void)removeObjectsInRange: (OFRange)range { for (size_t i = 0; i < range.length; i++) [self removeObjectAtIndex: range.location]; } @@ -378,15 +378,15 @@ [self removeObjectAtIndex: count - 1]; } - (void)removeAllObjects { - [self removeObjectsInRange: of_range(0, self.count)]; + [self removeObjectsInRange: OFRangeMake(0, self.count)]; } #ifdef OF_HAVE_BLOCKS -- (void)replaceObjectsUsingBlock: (of_array_replace_block_t)block +- (void)replaceObjectsUsingBlock: (OFArrayReplaceBlock)block { [self enumerateObjectsUsingBlock: ^ (id object, size_t idx, bool *stop) { id new = block(object, idx); @@ -414,11 +414,11 @@ { [self sortUsingSelector: @selector(compare:) options: 0]; } - (void)sortUsingSelector: (SEL)selector - options: (int)options + options: (OFArraySortOptions)options { size_t count = self.count; if (count == 0 || count == 1) return; @@ -425,11 +425,12 @@ quicksort(self, 0, count - 1, selector, options); } #ifdef OF_HAVE_BLOCKS -- (void)sortUsingComparator: (of_comparator_t)comparator options: (int)options +- (void)sortUsingComparator: (OFComparator)comparator + options: (OFArraySortOptions)options { size_t count = self.count; if (count == 0 || count == 1) return; Index: src/OFMutableData.h ================================================================== --- src/OFMutableData.h +++ src/OFMutableData.h @@ -188,11 +188,11 @@ /** * @brief Removes the specified amount of items at the specified index. * * @param range The range of items to remove */ -- (void)removeItemsInRange: (of_range_t)range; +- (void)removeItemsInRange: (OFRange)range; /** * @brief Removes the last item. */ - (void)removeLastItem; Index: src/OFMutableData.m ================================================================== --- src/OFMutableData.m +++ src/OFMutableData.m @@ -88,11 +88,11 @@ @try { if (itemSize == 0) @throw [OFInvalidArgumentException exception]; - _items = of_alloc(capacity, itemSize); + _items = OFAllocMemory(capacity, itemSize); _itemSize = itemSize; _capacity = capacity; _freeWhenDone = true; } @catch (id e) { [self release]; @@ -119,11 +119,11 @@ freeWhenDone: (bool)freeWhenDone { self = [self initWithItems: items count: count itemSize: itemSize]; if (freeWhenDone) - free(items); + OFFreeMemory(items); return self; } - (instancetype)initWithStringRepresentation: (OFString *)string @@ -162,11 +162,11 @@ return NULL; return _items + (_count - 1) * _itemSize; } -- (OFData *)subdataWithRange: (of_range_t)range +- (OFData *)subdataWithRange: (OFRange)range { if (range.length > SIZE_MAX - range.location || range.location + range.length > _count) @throw [OFOutOfRangeException exception]; @@ -179,11 +179,11 @@ { if (SIZE_MAX - _count < 1) @throw [OFOutOfRangeException exception]; if (_count + 1 > _capacity) { - _items = of_realloc(_items, _count + 1, _itemSize); + _items = OFResizeMemory(_items, _count + 1, _itemSize); _capacity = _count + 1; } memcpy(_items + _count * _itemSize, item, _itemSize); @@ -199,11 +199,11 @@ { if (count > SIZE_MAX - _count) @throw [OFOutOfRangeException exception]; if (_count + count > _capacity) { - _items = of_realloc(_items, _count + count, _itemSize); + _items = OFResizeMemory(_items, _count + count, _itemSize); _capacity = _count + count; } memcpy(_items + _count * _itemSize, items, count * _itemSize); _count += count; @@ -215,11 +215,11 @@ { if (count > SIZE_MAX - _count || idx > _count) @throw [OFOutOfRangeException exception]; if (_count + count > _capacity) { - _items = of_realloc(_items, _count + count, _itemSize); + _items = OFResizeMemory(_items, _count + count, _itemSize); _capacity = _count + count; } memmove(_items + (idx + count) * _itemSize, _items + idx * _itemSize, (_count - idx) * _itemSize); @@ -232,24 +232,24 @@ { if (count > SIZE_MAX - _count) @throw [OFOutOfRangeException exception]; if (_count + count > _capacity) { - _items = of_realloc(_items, _count + count, _itemSize); + _items = OFResizeMemory(_items, _count + count, _itemSize); _capacity = _count + count; } memset(_items + _count * _itemSize, '\0', count * _itemSize); _count += count; } - (void)removeItemAtIndex: (size_t)idx { - [self removeItemsInRange: of_range(idx, 1)]; + [self removeItemsInRange: OFRangeMake(idx, 1)]; } -- (void)removeItemsInRange: (of_range_t)range +- (void)removeItemsInRange: (OFRange)range { if (range.length > SIZE_MAX - range.location || range.location + range.length > _count) @throw [OFOutOfRangeException exception]; @@ -257,11 +257,11 @@ _items + (range.location + range.length) * _itemSize, (_count - range.location - range.length) * _itemSize); _count -= range.length; @try { - _items = of_realloc(_items, _count, _itemSize); + _items = OFResizeMemory(_items, _count, _itemSize); _capacity = _count; } @catch (OFOutOfMemoryException *e) { /* We don't really care, as we only made it smaller */ } } @@ -271,20 +271,20 @@ if (_count == 0) return; _count--; @try { - _items = of_realloc(_items, _count, _itemSize); + _items = OFResizeMemory(_items, _count, _itemSize); _capacity = _count; } @catch (OFOutOfMemoryException *e) { /* We don't care, as we only made it smaller */ } } - (void)removeAllItems { - free(_items); + OFFreeMemory(_items); _items = NULL; _count = 0; _capacity = 0; } @@ -297,15 +297,15 @@ - (void)makeImmutable { if (_capacity != _count) { @try { - _items = of_realloc(_items, _count, _itemSize); + _items = OFResizeMemory(_items, _count, _itemSize); _capacity = _count; } @catch (OFOutOfMemoryException *e) { /* We don't care, as we only made it smaller */ } } object_setClass(self, [OFData class]); } @end Index: src/OFMutableDictionary.h ================================================================== --- src/OFMutableDictionary.h +++ src/OFMutableDictionary.h @@ -25,11 +25,11 @@ * * @param key The key of the object to replace * @param object The object to replace * @return The object to replace the object with */ -typedef id _Nonnull (^of_dictionary_replace_block_t)(id key, id object); +typedef id _Nonnull (^OFDictionaryReplaceBlock)(id key, id object); #endif /** * @class OFMutableDictionary OFDictionary.h ObjFW/OFDictionary.h * @@ -110,11 +110,11 @@ /** * @brief Replaces each object with the object returned by the block. * * @param block The block which returns a new object for each object */ -- (void)replaceObjectsUsingBlock: (of_dictionary_replace_block_t)block; +- (void)replaceObjectsUsingBlock: (OFDictionaryReplaceBlock)block; #endif /** * @brief Converts the mutable dictionary to an immutable dictionary. */ Index: src/OFMutableDictionary.m ================================================================== --- src/OFMutableDictionary.m +++ src/OFMutableDictionary.m @@ -199,11 +199,11 @@ objc_autoreleasePoolPop(pool); } #ifdef OF_HAVE_BLOCKS -- (void)replaceObjectsUsingBlock: (of_dictionary_replace_block_t)block +- (void)replaceObjectsUsingBlock: (OFDictionaryReplaceBlock)block { [self enumerateKeysAndObjectsUsingBlock: ^ (id key, id object, bool *stop) { id new = block(key, object); Index: src/OFMutableMapTableDictionary.m ================================================================== --- src/OFMutableMapTableDictionary.m +++ src/OFMutableMapTableDictionary.m @@ -45,11 +45,11 @@ { [_mapTable removeAllObjects]; } #ifdef OF_HAVE_BLOCKS -- (void)replaceObjectsUsingBlock: (of_dictionary_replace_block_t)block +- (void)replaceObjectsUsingBlock: (OFDictionaryReplaceBlock)block { @try { [_mapTable replaceObjectsUsingBlock: ^ void *(void *key, void *object) { return block(key, object); Index: src/OFMutableSet.m ================================================================== --- src/OFMutableSet.m +++ src/OFMutableSet.m @@ -166,11 +166,11 @@ { void *pool = objc_autoreleasePoolPush(); size_t count = self.count; id *cArray; - cArray = of_alloc(count, sizeof(id)); + cArray = OFAllocMemory(count, sizeof(id)); @try { size_t i; i = 0; for (id object in self) { @@ -180,11 +180,11 @@ for (i = 0; i < count; i++) if (![set containsObject: cArray[i]]) [self removeObject: cArray[i]]; } @finally { - free(cArray); + OFFreeMemory(cArray); } objc_autoreleasePoolPop(pool); } Index: src/OFMutableString.h ================================================================== --- src/OFMutableString.h +++ src/OFMutableString.h @@ -31,11 +31,11 @@ * @brief Sets the character at the specified index. * * @param character The character to set * @param index The index where to set the character */ -- (void)setCharacter: (of_unichar_t)character atIndex: (size_t)index; +- (void)setCharacter: (OFUnichar)character atIndex: (size_t)index; /** * @brief Appends another OFString to the OFMutableString. * * @param string An OFString to append @@ -46,12 +46,11 @@ * @brief Appends the specified characters to the OFMutableString. * * @param characters An array of characters to append * @param length The length of the array of characters */ -- (void)appendCharacters: (const of_unichar_t *)characters - length: (size_t)length; +- (void)appendCharacters: (const OFUnichar *)characters length: (size_t)length; /** * @brief Appends a UTF-8 encoded C string to the OFMutableString. * * @param UTF8String A UTF-8 encoded C string to append @@ -73,11 +72,11 @@ * * @param cString A C string to append * @param encoding The encoding of the C string */ - (void)appendCString: (const char *)cString - encoding: (of_string_encoding_t)encoding; + encoding: (OFStringEncoding)encoding; /** * @brief Appends a C string with the specified encoding and length to the * OFMutableString. * @@ -84,30 +83,30 @@ * @param cString A C string to append * @param encoding The encoding of the C string * @param cStringLength The length of the UTF-8 encoded C string */ - (void)appendCString: (const char *)cString - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding length: (size_t)cStringLength; /** * @brief Appends a formatted string to the OFMutableString. * * See `printf` for the format syntax. As an addition, `%@` is available as - * format specifier for objects, `%C` for `of_unichar_t` and `%S` for - * `const of_unichar_t *`. + * format specifier for objects, `%C` for `OFUnichar` and `%S` for + * `const OFUnichar *`. * * @param format A format string which generates the string to append */ - (void)appendFormat: (OFConstantString *)format, ...; /** * @brief Appends a formatted string to the OFMutableString. * * See printf for the format syntax. As an addition, `%@` is available as - * format specifier for objects, `%C` for `of_unichar_t` and `%S` for - * `const of_unichar_t *`. + * format specifier for objects, `%C` for `OFUnichar` and `%S` for + * `const OFUnichar *`. * * @param format A format string which generates the string to append * @param arguments The arguments used in the format string */ - (void)appendFormat: (OFConstantString *)format arguments: (va_list)arguments; @@ -154,19 +153,19 @@ /** * @brief Deletes the characters at the specified range. * * @param range The range of the characters which should be removed */ -- (void)deleteCharactersInRange: (of_range_t)range; +- (void)deleteCharactersInRange: (OFRange)range; /** * @brief Replaces the characters at the specified range. * * @param range The range of the characters which should be replaced * @param replacement The string to the replace the characters with */ -- (void)replaceCharactersInRange: (of_range_t)range +- (void)replaceCharactersInRange: (OFRange)range withString: (OFString *)replacement; /** * @brief Replaces all occurrences of a string with another string. * @@ -187,11 +186,11 @@ * @param range The range in which the string should be replaced */ - (void)replaceOccurrencesOfString: (OFString *)string withString: (OFString *)replacement options: (int)options - range: (of_range_t)range; + range: (OFRange)range; /** * @brief Deletes all whitespaces at the beginning of the string. */ - (void)deleteLeadingWhitespaces; Index: src/OFMutableString.m ================================================================== --- src/OFMutableString.m +++ src/OFMutableString.m @@ -18,17 +18,17 @@ #include #include #include #import "OFString.h" +#import "OFASPrintF.h" #import "OFMutableUTF8String.h" #import "OFInvalidArgumentException.h" #import "OFInvalidFormatException.h" #import "OFOutOfRangeException.h" -#import "of_asprintf.h" #import "unicode.h" static struct { Class isa; } placeholder; @@ -54,18 +54,18 @@ initWithUTF8String: UTF8String length: UTF8StringLength]; } - (instancetype)initWithCString: (const char *)cString - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { return (id)[[OFMutableUTF8String alloc] initWithCString: cString encoding: encoding]; } - (instancetype)initWithCString: (const char *)cString - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding length: (size_t)cStringLength { return (id)[[OFMutableUTF8String alloc] initWithCString: cString encoding: encoding length: cStringLength]; @@ -74,67 +74,67 @@ - (instancetype)initWithString: (OFString *)string { return (id)[[OFMutableUTF8String alloc] initWithString: string]; } -- (instancetype)initWithCharacters: (const of_unichar_t *)characters +- (instancetype)initWithCharacters: (const OFUnichar *)characters length: (size_t)length { return (id)[[OFMutableUTF8String alloc] initWithCharacters: characters length: length]; } -- (instancetype)initWithUTF16String: (const of_char16_t *)string +- (instancetype)initWithUTF16String: (const OFChar16 *)string { return (id)[[OFMutableUTF8String alloc] initWithUTF16String: string]; } -- (instancetype)initWithUTF16String: (const of_char16_t *)string +- (instancetype)initWithUTF16String: (const OFChar16 *)string length: (size_t)length { return (id)[[OFMutableUTF8String alloc] initWithUTF16String: string length: length]; } -- (instancetype)initWithUTF16String: (const of_char16_t *)string - byteOrder: (of_byte_order_t)byteOrder +- (instancetype)initWithUTF16String: (const OFChar16 *)string + byteOrder: (OFByteOrder)byteOrder { return (id)[[OFMutableUTF8String alloc] initWithUTF16String: string byteOrder: byteOrder]; } -- (instancetype)initWithUTF16String: (const of_char16_t *)string +- (instancetype)initWithUTF16String: (const OFChar16 *)string length: (size_t)length - byteOrder: (of_byte_order_t)byteOrder + byteOrder: (OFByteOrder)byteOrder { return (id)[[OFMutableUTF8String alloc] initWithUTF16String: string length: length byteOrder: byteOrder]; } -- (instancetype)initWithUTF32String: (const of_char32_t *)string +- (instancetype)initWithUTF32String: (const OFChar32 *)string { return (id)[[OFMutableUTF8String alloc] initWithUTF32String: string]; } -- (instancetype)initWithUTF32String: (const of_char32_t *)string +- (instancetype)initWithUTF32String: (const OFChar32 *)string length: (size_t)length { return (id)[[OFMutableUTF8String alloc] initWithUTF32String: string length: length]; } -- (instancetype)initWithUTF32String: (const of_char32_t *)string - byteOrder: (of_byte_order_t)byteOrder +- (instancetype)initWithUTF32String: (const OFChar32 *)string + byteOrder: (OFByteOrder)byteOrder { return (id)[[OFMutableUTF8String alloc] initWithUTF32String: string byteOrder: byteOrder]; } -- (instancetype)initWithUTF32String: (const of_char32_t *)string +- (instancetype)initWithUTF32String: (const OFChar32 *)string length: (size_t)length - byteOrder: (of_byte_order_t)byteOrder + byteOrder: (OFByteOrder)byteOrder { return (id)[[OFMutableUTF8String alloc] initWithUTF32String: string length: length byteOrder: byteOrder]; } @@ -164,11 +164,11 @@ { return (id)[[OFMutableUTF8String alloc] initWithContentsOfFile: path]; } - (instancetype)initWithContentsOfFile: (OFString *)path - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { return (id)[[OFMutableUTF8String alloc] initWithContentsOfFile: path encoding: encoding]; } @@ -178,11 +178,11 @@ { return (id)[[OFMutableUTF8String alloc] initWithContentsOfURL: URL]; } - (instancetype)initWithContentsOfURL: (OFURL *)URL - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { return (id)[[OFMutableUTF8String alloc] initWithContentsOfURL: URL encoding: encoding]; } @@ -226,24 +226,24 @@ return [super alloc]; } #ifdef OF_HAVE_UNICODE_TABLES -- (void)of_convertWithWordStartTable: (const of_unichar_t *const [])startTable - wordMiddleTable: (const of_unichar_t *const [])middleTable +- (void)of_convertWithWordStartTable: (const OFUnichar *const [])startTable + wordMiddleTable: (const OFUnichar *const [])middleTable wordStartTableSize: (size_t)startTableSize wordMiddleTableSize: (size_t)middleTableSize { void *pool = objc_autoreleasePoolPush(); - const of_unichar_t *characters = self.characters; + const OFUnichar *characters = self.characters; size_t length = self.length; bool isStart = true; for (size_t i = 0; i < length; i++) { - const of_unichar_t *const *table; + const OFUnichar *const *table; size_t tableSize; - of_unichar_t c = characters[i]; + OFUnichar c = characters[i]; if (isStart) { table = startTable; tableSize = middleTableSize; } else { @@ -252,11 +252,11 @@ } if (c >> 8 < tableSize && table[c >> 8][c & 0xFF]) [self setCharacter: table[c >> 8][c & 0xFF] atIndex: i]; - isStart = of_ascii_isspace(c); + isStart = OFASCIIIsSpace(c); } objc_autoreleasePoolPop(pool); } #else @@ -263,44 +263,44 @@ static void convert(OFMutableString *self, char (*startFunction)(char), char (*middleFunction)(char)) { void *pool = objc_autoreleasePoolPush(); - const of_unichar_t *characters = self.characters; + const OFUnichar *characters = self.characters; size_t length = self.length; bool isStart = true; for (size_t i = 0; i < length; i++) { char (*function)(char) = (isStart ? startFunction : middleFunction); - of_unichar_t c = characters[i]; + OFUnichar c = characters[i]; if (c <= 0x7F) [self setCharacter: (int)function(c) atIndex: i]; - isStart = of_ascii_isspace(c); + isStart = OFASCIIIsSpace(c); } objc_autoreleasePoolPop(pool); } #endif -- (void)setCharacter: (of_unichar_t)character atIndex: (size_t)idx +- (void)setCharacter: (OFUnichar)character atIndex: (size_t)idx { void *pool = objc_autoreleasePoolPush(); OFString *string = [OFString stringWithCharacters: &character length: 1]; - [self replaceCharactersInRange: of_range(idx, 1) withString: string]; + [self replaceCharactersInRange: OFRangeMake(idx, 1) withString: string]; objc_autoreleasePoolPop(pool); } - (void)appendString: (OFString *)string { [self insertString: string atIndex: self.length]; } -- (void)appendCharacters: (const of_unichar_t *)characters +- (void)appendCharacters: (const OFUnichar *)characters length: (size_t)length { void *pool = objc_autoreleasePoolPush(); [self appendString: [OFString stringWithCharacters: characters length: length]]; @@ -322,20 +322,20 @@ length: UTF8StringLength]]; objc_autoreleasePoolPop(pool); } - (void)appendCString: (const char *)cString - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { void *pool = objc_autoreleasePoolPush(); [self appendString: [OFString stringWithCString: cString encoding: encoding]]; objc_autoreleasePoolPop(pool); } - (void)appendCString: (const char *)cString - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding length: (size_t)cStringLength { void *pool = objc_autoreleasePoolPush(); [self appendString: [OFString stringWithCString: cString encoding: encoding @@ -359,11 +359,11 @@ int UTF8StringLength; if (format == nil) @throw [OFInvalidArgumentException exception]; - if ((UTF8StringLength = of_vasprintf(&UTF8String, format.UTF8String, + if ((UTF8StringLength = OFVASPrintF(&UTF8String, format.UTF8String, arguments)) == -1) @throw [OFInvalidFormatException exception]; @try { [self appendUTF8String: UTF8String length: UTF8StringLength]; @@ -380,68 +380,68 @@ - (void)reverse { size_t i, j, length = self.length; for (i = 0, j = length - 1; i < length / 2; i++, j--) { - of_unichar_t tmp = [self characterAtIndex: j]; + OFUnichar tmp = [self characterAtIndex: j]; [self setCharacter: [self characterAtIndex: i] atIndex: j]; [self setCharacter: tmp atIndex: i]; } } #ifdef OF_HAVE_UNICODE_TABLES - (void)uppercase { - [self of_convertWithWordStartTable: of_unicode_uppercase_table - wordMiddleTable: of_unicode_uppercase_table - wordStartTableSize: OF_UNICODE_UPPERCASE_TABLE_SIZE - wordMiddleTableSize: OF_UNICODE_UPPERCASE_TABLE_SIZE]; + [self of_convertWithWordStartTable: OFUnicodeUppercaseTable + wordMiddleTable: OFUnicodeUppercaseTable + wordStartTableSize: OFUnicodeUppercaseTableSize + wordMiddleTableSize: OFUnicodeUppercaseTableSize]; } - (void)lowercase { - [self of_convertWithWordStartTable: of_unicode_lowercase_table - wordMiddleTable: of_unicode_lowercase_table - wordStartTableSize: OF_UNICODE_LOWERCASE_TABLE_SIZE - wordMiddleTableSize: OF_UNICODE_LOWERCASE_TABLE_SIZE]; + [self of_convertWithWordStartTable: OFUnicodeLowercaseTable + wordMiddleTable: OFUnicodeLowercaseTable + wordStartTableSize: OFUnicodeLowercaseTableSize + wordMiddleTableSize: OFUnicodeLowercaseTableSize]; } - (void)capitalize { - [self of_convertWithWordStartTable: of_unicode_titlecase_table - wordMiddleTable: of_unicode_lowercase_table - wordStartTableSize: OF_UNICODE_TITLECASE_TABLE_SIZE - wordMiddleTableSize: OF_UNICODE_LOWERCASE_TABLE_SIZE]; + [self of_convertWithWordStartTable: OFUnicodeTitlecaseTable + wordMiddleTable: OFUnicodeLowercaseTable + wordStartTableSize: OFUnicodeTitlecaseTableSize + wordMiddleTableSize: OFUnicodeLowercaseTableSize]; } #else - (void)uppercase { - convert(self, of_ascii_toupper, of_ascii_toupper); + convert(self, OFASCIIToUpper, OFASCIIToUpper); } - (void)lowercase { - convert(self, of_ascii_tolower, of_ascii_tolower); + convert(self, OFASCIIToLower, OFASCIIToLower); } - (void)capitalize { - convert(self, of_ascii_toupper, of_ascii_tolower); + convert(self, OFASCIIToUpper, OFASCIIToLower); } #endif - (void)insertString: (OFString *)string atIndex: (size_t)idx { - [self replaceCharactersInRange: of_range(idx, 0) withString: string]; + [self replaceCharactersInRange: OFRangeMake(idx, 0) withString: string]; } -- (void)deleteCharactersInRange: (of_range_t)range +- (void)deleteCharactersInRange: (OFRange)range { [self replaceCharactersInRange: range withString: @""]; } -- (void)replaceCharactersInRange: (of_range_t)range +- (void)replaceCharactersInRange: (OFRange)range withString: (OFString *)replacement { OF_UNRECOGNIZED_SELECTOR } @@ -449,21 +449,21 @@ withString: (OFString *)replacement { [self replaceOccurrencesOfString: string withString: replacement options: 0 - range: of_range(0, self.length)]; + range: OFRangeMake(0, self.length)]; } - (void)replaceOccurrencesOfString: (OFString *)string withString: (OFString *)replacement options: (int)options - range: (of_range_t)range + range: (OFRange)range { void *pool = objc_autoreleasePoolPush(), *pool2; - const of_unichar_t *characters; - const of_unichar_t *searchCharacters = string.characters; + const OFUnichar *characters; + const OFUnichar *searchCharacters = string.characters; size_t searchLength = string.length; size_t replacementLength = replacement.length; if (string == nil || replacement == nil) @throw [OFInvalidArgumentException exception]; @@ -480,14 +480,14 @@ pool2 = objc_autoreleasePoolPush(); characters = self.characters; for (size_t i = range.location; i <= range.length - searchLength; i++) { if (memcmp(characters + i, searchCharacters, - searchLength * sizeof(of_unichar_t)) != 0) + searchLength * sizeof(OFUnichar)) != 0) continue; - [self replaceCharactersInRange: of_range(i, searchLength) + [self replaceCharactersInRange: OFRangeMake(i, searchLength) withString: replacement]; range.length -= searchLength; range.length += replacementLength; @@ -503,29 +503,29 @@ } - (void)deleteLeadingWhitespaces { void *pool = objc_autoreleasePoolPush(); - const of_unichar_t *characters = self.characters; + const OFUnichar *characters = self.characters; size_t i, length = self.length; for (i = 0; i < length; i++) { - of_unichar_t c = characters[i]; + OFUnichar c = characters[i]; - if (!of_ascii_isspace(c)) + if (!OFASCIIIsSpace(c)) break; } objc_autoreleasePoolPop(pool); - [self deleteCharactersInRange: of_range(0, i)]; + [self deleteCharactersInRange: OFRangeMake(0, i)]; } - (void)deleteTrailingWhitespaces { void *pool; - const of_unichar_t *characters, *p; + const OFUnichar *characters, *p; size_t length, d; length = self.length; if (length == 0) @@ -534,19 +534,19 @@ pool = objc_autoreleasePoolPush(); characters = self.characters; d = 0; for (p = characters + length - 1; p >= characters; p--) { - if (!of_ascii_isspace(*p)) + if (!OFASCIIIsSpace(*p)) break; d++; } objc_autoreleasePoolPop(pool); - [self deleteCharactersInRange: of_range(length - d, d)]; + [self deleteCharactersInRange: OFRangeMake(length - d, d)]; } - (void)deleteEnclosingWhitespaces { [self deleteLeadingWhitespaces]; Index: src/OFMutableTarArchiveEntry.h ================================================================== --- src/OFMutableTarArchiveEntry.h +++ src/OFMutableTarArchiveEntry.h @@ -59,13 +59,13 @@ @property (readwrite, retain, nonatomic) OFDate *modificationDate; /** * @brief The type of the archive entry. * - * See @ref of_tar_archive_entry_type_t. + * See @ref OFTarArchiveEntryType. */ -@property (readwrite, nonatomic) of_tar_archive_entry_type_t type; +@property (readwrite, nonatomic) OFTarArchiveEntryType type; /** * @brief The file name of the target (for a hard link or symbolic link). */ @property OF_NULLABLE_PROPERTY (readwrite, copy, nonatomic) Index: src/OFMutableTarArchiveEntry.m ================================================================== --- src/OFMutableTarArchiveEntry.m +++ src/OFMutableTarArchiveEntry.m @@ -64,11 +64,11 @@ OFDate *old = _modificationDate; _modificationDate = [modificationDate retain]; [old release]; } -- (void)setType: (of_tar_archive_entry_type_t)type +- (void)setType: (OFTarArchiveEntryType)type { _type = type; } - (void)setTargetFileName: (OFString *)targetFileName Index: src/OFMutableURL.m ================================================================== --- src/OFMutableURL.m +++ src/OFMutableURL.m @@ -24,12 +24,10 @@ #import "OFNumber.h" #import "OFString.h" #import "OFInvalidFormatException.h" -extern void of_url_verify_escaped(OFString *, OFCharacterSet *); - @implementation OFMutableURL @dynamic scheme, URLEncodedScheme, host, URLEncodedHost, port, user; @dynamic URLEncodedUser, password, URLEncodedPassword, path, URLEncodedPath; @dynamic pathComponents, query, URLEncodedQuery, queryDictionary, fragment; @dynamic URLEncodedFragment; @@ -55,11 +53,11 @@ - (void)setURLEncodedScheme: (OFString *)URLEncodedScheme { OFString *old; if (URLEncodedScheme != nil) - of_url_verify_escaped(URLEncodedScheme, + OFURLVerifyIsEscaped(URLEncodedScheme, [OFCharacterSet URLSchemeAllowedCharacterSet]); old = _URLEncodedScheme; _URLEncodedScheme = [URLEncodedScheme copy]; [old release]; @@ -68,11 +66,11 @@ - (void)setHost: (OFString *)host { void *pool = objc_autoreleasePoolPush(); OFString *old = _URLEncodedHost; - if (of_url_is_ipv6_host(host)) + if (OFURLIsIPv6Host(host)) _URLEncodedHost = [[OFString alloc] initWithFormat: @"[%@]", host]; else _URLEncodedHost = [[host stringByURLEncodingWithAllowedCharacters: @@ -87,15 +85,15 @@ { OFString *old; if ([URLEncodedHost hasPrefix: @"["] && [URLEncodedHost hasSuffix: @"]"]) { - if (!of_url_is_ipv6_host([URLEncodedHost substringWithRange: - of_range(1, URLEncodedHost.length - 2)])) + if (!OFURLIsIPv6Host([URLEncodedHost substringWithRange: + OFRangeMake(1, URLEncodedHost.length - 2)])) @throw [OFInvalidFormatException exception]; } else if (URLEncodedHost != nil) - of_url_verify_escaped(URLEncodedHost, + OFURLVerifyIsEscaped(URLEncodedHost, [OFCharacterSet URLHostAllowedCharacterSet]); old = _URLEncodedHost; _URLEncodedHost = [URLEncodedHost copy]; [old release]; @@ -124,11 +122,11 @@ - (void)setURLEncodedUser: (OFString *)URLEncodedUser { OFString *old; if (URLEncodedUser != nil) - of_url_verify_escaped(URLEncodedUser, + OFURLVerifyIsEscaped(URLEncodedUser, [OFCharacterSet URLUserAllowedCharacterSet]); old = _URLEncodedUser; _URLEncodedUser = [URLEncodedUser copy]; [old release]; @@ -151,11 +149,11 @@ - (void)setURLEncodedPassword: (OFString *)URLEncodedPassword { OFString *old; if (URLEncodedPassword != nil) - of_url_verify_escaped(URLEncodedPassword, + OFURLVerifyIsEscaped(URLEncodedPassword, [OFCharacterSet URLPasswordAllowedCharacterSet]); old = _URLEncodedPassword; _URLEncodedPassword = [URLEncodedPassword copy]; [old release]; @@ -177,11 +175,11 @@ - (void)setURLEncodedPath: (OFString *)URLEncodedPath { OFString *old; if (URLEncodedPath != nil) - of_url_verify_escaped(URLEncodedPath, + OFURLVerifyIsEscaped(URLEncodedPath, [OFCharacterSet URLPathAllowedCharacterSet]); old = _URLEncodedPath; _URLEncodedPath = [URLEncodedPath copy]; [old release]; @@ -223,11 +221,11 @@ - (void)setURLEncodedQuery: (OFString *)URLEncodedQuery { OFString *old; if (URLEncodedQuery != nil) - of_url_verify_escaped(URLEncodedQuery, + OFURLVerifyIsEscaped(URLEncodedQuery, [OFCharacterSet URLQueryAllowedCharacterSet]); old = _URLEncodedQuery; _URLEncodedQuery = [URLEncodedQuery copy]; [old release]; @@ -291,11 +289,11 @@ - (void)setURLEncodedFragment: (OFString *)URLEncodedFragment { OFString *old; if (URLEncodedFragment != nil) - of_url_verify_escaped(URLEncodedFragment, + OFURLVerifyIsEscaped(URLEncodedFragment, [OFCharacterSet URLFragmentAllowedCharacterSet]); old = _URLEncodedFragment; _URLEncodedFragment = [URLEncodedFragment copy]; [old release]; @@ -402,11 +400,11 @@ } if ([current isEqual: @".."] && parent != nil && ![parent isEqual: @".."]) { [array removeObjectsInRange: - of_range(i - 1, 2)]; + OFRangeMake(i - 1, 2)]; done = false; break; } } Index: src/OFMutableUTF8String.h ================================================================== --- src/OFMutableUTF8String.h +++ src/OFMutableUTF8String.h @@ -18,11 +18,11 @@ OF_ASSUME_NONNULL_BEGIN @interface OFMutableUTF8String: OFMutableString { - struct of_string_utf8_ivars *restrict _s; - struct of_string_utf8_ivars _storage; + struct OFUTF8StringIvars *restrict _s; + struct OFUTF8StringIvars _storage; } @end OF_ASSUME_NONNULL_END Index: src/OFMutableUTF8String.m ================================================================== --- src/OFMutableUTF8String.m +++ src/OFMutableUTF8String.m @@ -19,20 +19,20 @@ #include #include #include #import "OFMutableUTF8String.h" +#import "OFASPrintF.h" #import "OFString.h" #import "OFUTF8String.h" #import "OFInvalidArgumentException.h" #import "OFInvalidEncodingException.h" #import "OFInvalidFormatException.h" #import "OFOutOfMemoryException.h" #import "OFOutOfRangeException.h" -#import "of_asprintf.h" #import "unicode.h" @implementation OFMutableUTF8String + (void)initialize { @@ -44,11 +44,11 @@ freeWhenDone: (bool)freeWhenDone { self = [self initWithUTF8String: UTF8String]; if (freeWhenDone) - free(UTF8String); + OFFreeMemory(UTF8String); return self; } - (instancetype)initWithUTF8StringNoCopy: (char *)UTF8String @@ -56,60 +56,60 @@ freeWhenDone: (bool)freeWhenDone { self = [self initWithUTF8String: UTF8String length: UTF8StringLength]; if (freeWhenDone) - free(UTF8String); + OFFreeMemory(UTF8String); return self; } #ifdef OF_HAVE_UNICODE_TABLES -- (void)of_convertWithWordStartTable: (const of_unichar_t *const [])startTable - wordMiddleTable: (const of_unichar_t *const [])middleTable +- (void)of_convertWithWordStartTable: (const OFUnichar *const [])startTable + wordMiddleTable: (const OFUnichar *const [])middleTable wordStartTableSize: (size_t)startTableSize wordMiddleTableSize: (size_t)middleTableSize { - of_unichar_t *unicodeString; + OFUnichar *unicodeString; size_t unicodeLen, newCStringLength; size_t i, j; char *newCString; bool isStart = true; if (!_s->isUTF8) { uint8_t t; - const of_unichar_t *const *table; + const OFUnichar *const *table; assert(startTableSize >= 1 && middleTableSize >= 1); - _s->hashed = false; + _s->hasHash = false; for (i = 0; i < _s->cStringLength; i++) { if (isStart) table = startTable; else table = middleTable; - isStart = of_ascii_isspace(_s->cString[i]); + isStart = OFASCIIIsSpace(_s->cString[i]); if ((t = table[0][(uint8_t)_s->cString[i]]) != 0) _s->cString[i] = t; } return; } unicodeLen = self.length; - unicodeString = of_alloc(unicodeLen, sizeof(of_unichar_t)); + unicodeString = OFAllocMemory(unicodeLen, sizeof(OFUnichar)); i = j = 0; newCStringLength = 0; while (i < _s->cStringLength) { - const of_unichar_t *const *table; + const OFUnichar *const *table; size_t tableSize; - of_unichar_t c; + OFUnichar c; ssize_t cLen; if (isStart) { table = startTable; tableSize = middleTableSize; @@ -116,22 +116,22 @@ } else { table = middleTable; tableSize = middleTableSize; } - cLen = of_string_utf8_decode(_s->cString + i, + cLen = OFUTF8StringDecode(_s->cString + i, _s->cStringLength - i, &c); if (cLen <= 0 || c > 0x10FFFF) { - free(unicodeString); + OFFreeMemory(unicodeString); @throw [OFInvalidEncodingException exception]; } - isStart = of_ascii_isspace(c); + isStart = OFASCIIIsSpace(c); if (c >> 8 < tableSize) { - of_unichar_t tc = table[c >> 8][c & 0xFF]; + OFUnichar tc = table[c >> 8][c & 0xFF]; if (tc) c = tc; } unicodeString[j++] = c; @@ -143,44 +143,44 @@ else if (c < 0x10000) newCStringLength += 3; else if (c < 0x110000) newCStringLength += 4; else { - free(unicodeString); + OFFreeMemory(unicodeString); @throw [OFInvalidEncodingException exception]; } i += cLen; } @try { - newCString = of_alloc(newCStringLength + 1, 1); + newCString = OFAllocMemory(newCStringLength + 1, 1); } @catch (id e) { - free(unicodeString); + OFFreeMemory(unicodeString); @throw e; } j = 0; for (i = 0; i < unicodeLen; i++) { size_t d; - if ((d = of_string_utf8_encode(unicodeString[i], + if ((d = OFUTF8StringEncode(unicodeString[i], newCString + j)) == 0) { - free(unicodeString); - free(newCString); + OFFreeMemory(unicodeString); + OFFreeMemory(newCString); @throw [OFInvalidEncodingException exception]; } j += d; } assert(j == newCStringLength); newCString[j] = 0; - free(unicodeString); + OFFreeMemory(unicodeString); - free(_s->cString); - _s->hashed = false; + OFFreeMemory(_s->cString); + _s->hasHash = false; _s->cString = newCString; _s->cStringLength = newCStringLength; /* * Even though cStringLength can change, length cannot, therefore no @@ -187,44 +187,44 @@ * need to change it. */ } #endif -- (void)setCharacter: (of_unichar_t)character atIndex: (size_t)idx +- (void)setCharacter: (OFUnichar)character atIndex: (size_t)idx { char buffer[4]; - of_unichar_t c; + OFUnichar c; size_t lenNew; ssize_t lenOld; if (_s->isUTF8) - idx = of_string_utf8_get_position(_s->cString, idx, + idx = OFUTF8StringIndexToPosition(_s->cString, idx, _s->cStringLength); if (idx >= _s->cStringLength) @throw [OFOutOfRangeException exception]; /* Shortcut if old and new character both are ASCII */ if (character < 0x80 && !(_s->cString[idx] & 0x80)) { - _s->hashed = false; + _s->hasHash = false; _s->cString[idx] = character; return; } - if ((lenNew = of_string_utf8_encode(character, buffer)) == 0) + if ((lenNew = OFUTF8StringEncode(character, buffer)) == 0) @throw [OFInvalidEncodingException exception]; - if ((lenOld = of_string_utf8_decode(_s->cString + idx, + if ((lenOld = OFUTF8StringDecode(_s->cString + idx, _s->cStringLength - idx, &c)) <= 0) @throw [OFInvalidEncodingException exception]; - _s->hashed = false; + _s->hasHash = false; if (lenNew == (size_t)lenOld) memcpy(_s->cString + idx, buffer, lenNew); else if (lenNew > (size_t)lenOld) { - _s->cString = of_realloc(_s->cString, + _s->cString = OFResizeMemory(_s->cString, _s->cStringLength - lenOld + lenNew + 1, 1); memmove(_s->cString + idx + lenNew, _s->cString + idx + lenOld, _s->cStringLength - idx - lenOld); memcpy(_s->cString + idx, buffer, lenNew); @@ -246,11 +246,11 @@ if (character >= 0x80) _s->isUTF8 = true; @try { - _s->cString = of_realloc(_s->cString, + _s->cString = OFResizeMemory(_s->cString, _s->cStringLength + 1, 1); } @catch (OFOutOfMemoryException *e) { /* We don't really care, as we only made it smaller */ } } @@ -265,20 +265,20 @@ memcmp(UTF8String, "\xEF\xBB\xBF", 3) == 0) { UTF8String += 3; UTF8StringLength -= 3; } - switch (of_string_utf8_check(UTF8String, UTF8StringLength, &length)) { + switch (OFUTF8StringCheck(UTF8String, UTF8StringLength, &length)) { case 1: _s->isUTF8 = true; break; case -1: @throw [OFInvalidEncodingException exception]; } - _s->hashed = false; - _s->cString = of_realloc(_s->cString, + _s->hasHash = false; + _s->cString = OFResizeMemory(_s->cString, _s->cStringLength + UTF8StringLength + 1, 1); memcpy(_s->cString + _s->cStringLength, UTF8String, UTF8StringLength + 1); _s->cStringLength += UTF8StringLength; @@ -294,20 +294,20 @@ memcmp(UTF8String, "\xEF\xBB\xBF", 3) == 0) { UTF8String += 3; UTF8StringLength -= 3; } - switch (of_string_utf8_check(UTF8String, UTF8StringLength, &length)) { + switch (OFUTF8StringCheck(UTF8String, UTF8StringLength, &length)) { case 1: _s->isUTF8 = true; break; case -1: @throw [OFInvalidEncodingException exception]; } - _s->hashed = false; - _s->cString = of_realloc(_s->cString, + _s->hasHash = false; + _s->cString = OFResizeMemory(_s->cString, _s->cStringLength + UTF8StringLength + 1, 1); memcpy(_s->cString + _s->cStringLength, UTF8String, UTF8StringLength); _s->cStringLength += UTF8StringLength; _s->length += length; @@ -314,22 +314,22 @@ _s->cString[_s->cStringLength] = 0; } - (void)appendCString: (const char *)cString - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { [self appendCString: cString encoding: encoding length: strlen(cString)]; } - (void)appendCString: (const char *)cString - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding length: (size_t)cStringLength { - if (encoding == OF_STRING_ENCODING_UTF_8) + if (encoding == OFStringEncodingUTF8) [self appendUTF8String: cString length: cStringLength]; else { void *pool = objc_autoreleasePoolPush(); [self appendString: @@ -348,12 +348,12 @@ if (string == nil) @throw [OFInvalidArgumentException exception]; UTF8StringLength = string.UTF8StringLength; - _s->hashed = false; - _s->cString = of_realloc(_s->cString, + _s->hasHash = false; + _s->cString = OFResizeMemory(_s->cString, _s->cStringLength + UTF8StringLength + 1, 1); memcpy(_s->cString + _s->cStringLength, string.UTF8String, UTF8StringLength); _s->cStringLength += UTF8StringLength; @@ -367,22 +367,20 @@ _s->isUTF8 = true; } else _s->isUTF8 = true; } -- (void)appendCharacters: (const of_unichar_t *)characters - length: (size_t)length +- (void)appendCharacters: (const OFUnichar *)characters length: (size_t)length { - char *tmp = of_alloc((length * 4) + 1, 1); + char *tmp = OFAllocMemory((length * 4) + 1, 1); @try { size_t j = 0; bool isUTF8 = false; for (size_t i = 0; i < length; i++) { - size_t len = of_string_utf8_encode(characters[i], - tmp + j); + size_t len = OFUTF8StringEncode(characters[i], tmp + j); if (len == 0) @throw [OFInvalidEncodingException exception]; if (len > 1) @@ -391,22 +389,22 @@ j += len; } tmp[j] = '\0'; - _s->hashed = false; - _s->cString = of_realloc(_s->cString, + _s->hasHash = false; + _s->cString = OFResizeMemory(_s->cString, _s->cStringLength + j + 1, 1); memcpy(_s->cString + _s->cStringLength, tmp, j + 1); _s->cStringLength += j; _s->length += length; if (isUTF8) _s->isUTF8 = true; } @finally { - free(tmp); + OFFreeMemory(tmp); } } - (void)appendFormat: (OFConstantString *)format arguments: (va_list)arguments { @@ -414,11 +412,11 @@ int UTF8StringLength; if (format == nil) @throw [OFInvalidArgumentException exception]; - if ((UTF8StringLength = of_vasprintf(&UTF8String, format.UTF8String, + if ((UTF8StringLength = OFVASPrintF(&UTF8String, format.UTF8String, arguments)) == -1) @throw [OFInvalidFormatException exception]; @try { [self appendUTF8String: UTF8String length: UTF8StringLength]; @@ -429,11 +427,11 @@ - (void)reverse { size_t i, j; - _s->hashed = false; + _s->hasHash = false; /* We reverse all bytes and restore UTF-8 later, if necessary */ for (i = 0, j = _s->cStringLength - 1; i < _s->cStringLength / 2; i++, j--) { _s->cString[i] ^= _s->cString[j]; @@ -513,16 +511,16 @@ if (idx > _s->length) @throw [OFOutOfRangeException exception]; if (_s->isUTF8) - idx = of_string_utf8_get_position(_s->cString, idx, + idx = OFUTF8StringIndexToPosition(_s->cString, idx, _s->cStringLength); newCStringLength = _s->cStringLength + string.UTF8StringLength; - _s->hashed = false; - _s->cString = of_realloc(_s->cString, newCStringLength + 1, 1); + _s->hasHash = false; + _s->cString = OFResizeMemory(_s->cString, newCStringLength + 1, 1); memmove(_s->cString + idx + string.UTF8StringLength, _s->cString + idx, _s->cStringLength - idx); memcpy(_s->cString + idx, string.UTF8String, string.UTF8StringLength); @@ -537,40 +535,41 @@ _s->isUTF8 = true; } else _s->isUTF8 = true; } -- (void)deleteCharactersInRange: (of_range_t)range +- (void)deleteCharactersInRange: (OFRange)range { size_t start = range.location; size_t end = range.location + range.length; if (range.length > SIZE_MAX - range.location || end > _s->length) @throw [OFOutOfRangeException exception]; if (_s->isUTF8) { - start = of_string_utf8_get_position(_s->cString, start, + start = OFUTF8StringIndexToPosition(_s->cString, start, _s->cStringLength); - end = of_string_utf8_get_position(_s->cString, end, + end = OFUTF8StringIndexToPosition(_s->cString, end, _s->cStringLength); } memmove(_s->cString + start, _s->cString + end, _s->cStringLength - end); - _s->hashed = false; + _s->hasHash = false; _s->length -= range.length; _s->cStringLength -= end - start; _s->cString[_s->cStringLength] = 0; @try { - _s->cString = of_realloc(_s->cString, _s->cStringLength + 1, 1); + _s->cString = OFResizeMemory(_s->cString, _s->cStringLength + 1, + 1); } @catch (OFOutOfMemoryException *e) { /* We don't really care, as we only made it smaller */ } } -- (void)replaceCharactersInRange: (of_range_t)range +- (void)replaceCharactersInRange: (OFRange)range withString: (OFString *)replacement { size_t start = range.location; size_t end = range.location + range.length; size_t newCStringLength, newLength; @@ -582,19 +581,19 @@ @throw [OFOutOfRangeException exception]; newLength = _s->length - range.length + replacement.length; if (_s->isUTF8) { - start = of_string_utf8_get_position(_s->cString, start, + start = OFUTF8StringIndexToPosition(_s->cString, start, _s->cStringLength); - end = of_string_utf8_get_position(_s->cString, end, + end = OFUTF8StringIndexToPosition(_s->cString, end, _s->cStringLength); } newCStringLength = _s->cStringLength - (end - start) + replacement.UTF8StringLength; - _s->hashed = false; + _s->hasHash = false; /* * If the new string is bigger, we need to resize it first so we can * memmove() the rest of the string to the end. * @@ -601,11 +600,12 @@ * We must not resize the string if the new string is smaller, because * then we can't memmove() the rest of the string forward as the rest is * lost due to the resize! */ if (newCStringLength > _s->cStringLength) - _s->cString = of_realloc(_s->cString, newCStringLength + 1, 1); + _s->cString = OFResizeMemory(_s->cString, newCStringLength + 1, + 1); memmove(_s->cString + start + replacement.UTF8StringLength, _s->cString + end, _s->cStringLength - end); memcpy(_s->cString + start, replacement.UTF8String, replacement.UTF8StringLength); @@ -614,11 +614,12 @@ /* * If the new string is smaller, we can safely resize it now as we're * done with memmove(). */ if (newCStringLength < _s->cStringLength) - _s->cString = of_realloc(_s->cString, newCStringLength + 1, 1); + _s->cString = OFResizeMemory(_s->cString, newCStringLength + 1, + 1); _s->cStringLength = newCStringLength; _s->length = newLength; if ([replacement isKindOfClass: [OFUTF8String class]] || @@ -630,11 +631,11 @@ } - (void)replaceOccurrencesOfString: (OFString *)string withString: (OFString *)replacement options: (int)options - range: (of_range_t)range + range: (OFRange)range { const char *searchString = string.UTF8String; const char *replacementString = replacement.UTF8String; size_t searchLength = string.UTF8StringLength; size_t replacementLength = replacement.UTF8StringLength; @@ -647,13 +648,13 @@ if (range.length > SIZE_MAX - range.location || range.location + range.length > self.length) @throw [OFOutOfRangeException exception]; if (_s->isUTF8) { - range.location = of_string_utf8_get_position(_s->cString, + range.location = OFUTF8StringIndexToPosition(_s->cString, range.location, _s->cStringLength); - range.length = of_string_utf8_get_position( + range.length = OFUTF8StringIndexToPosition( _s->cString + range.location, range.length, _s->cStringLength - range.location); } if (string.UTF8StringLength > range.length) @@ -667,15 +668,15 @@ for (size_t i = range.location; i <= range.length - searchLength; i++) { if (memcmp(_s->cString + i, searchString, searchLength) != 0) continue; @try { - newCString = of_realloc(newCString, + newCString = OFResizeMemory(newCString, newCStringLength + i - last + replacementLength + 1, 1); } @catch (id e) { - free(newCString); + OFFreeMemory(newCString); @throw e; } memcpy(newCString + newCStringLength, _s->cString + last, i - last); memcpy(newCString + newCStringLength + i - last, @@ -687,23 +688,23 @@ i += searchLength - 1; last = i + 1; } @try { - newCString = of_realloc(newCString, + newCString = OFResizeMemory(newCString, newCStringLength + _s->cStringLength - last + 1, 1); } @catch (id e) { - free(newCString); + OFFreeMemory(newCString); @throw e; } memcpy(newCString + newCStringLength, _s->cString + last, _s->cStringLength - last); newCStringLength += _s->cStringLength - last; newCString[newCStringLength] = 0; - free(_s->cString); - _s->hashed = false; + OFFreeMemory(_s->cString); + _s->hasHash = false; _s->cString = newCString; _s->cStringLength = newCStringLength; _s->length = newLength; if ([replacement isKindOfClass: [OFUTF8String class]] || @@ -717,22 +718,23 @@ - (void)deleteLeadingWhitespaces { size_t i; for (i = 0; i < _s->cStringLength; i++) - if (!of_ascii_isspace(_s->cString[i])) + if (!OFASCIIIsSpace(_s->cString[i])) break; - _s->hashed = false; + _s->hasHash = false; _s->cStringLength -= i; _s->length -= i; memmove(_s->cString, _s->cString + i, _s->cStringLength); _s->cString[_s->cStringLength] = '\0'; @try { - _s->cString = of_realloc(_s->cString, _s->cStringLength + 1, 1); + _s->cString = OFResizeMemory(_s->cString, _s->cStringLength + 1, + 1); } @catch (OFOutOfMemoryException *e) { /* We don't really care, as we only made it smaller */ } } @@ -739,15 +741,15 @@ - (void)deleteTrailingWhitespaces { size_t d; char *p; - _s->hashed = false; + _s->hasHash = false; d = 0; for (p = _s->cString + _s->cStringLength - 1; p >= _s->cString; p--) { - if (!of_ascii_isspace(*p)) + if (!OFASCIIIsSpace(*p)) break; *p = '\0'; d++; } @@ -754,11 +756,12 @@ _s->cStringLength -= d; _s->length -= d; @try { - _s->cString = of_realloc(_s->cString, _s->cStringLength + 1, 1); + _s->cString = OFResizeMemory(_s->cString, _s->cStringLength + 1, + 1); } @catch (OFOutOfMemoryException *e) { /* We don't really care, as we only made it smaller */ } } @@ -765,15 +768,15 @@ - (void)deleteEnclosingWhitespaces { size_t d, i; char *p; - _s->hashed = false; + _s->hasHash = false; d = 0; for (p = _s->cString + _s->cStringLength - 1; p >= _s->cString; p--) { - if (!of_ascii_isspace(*p)) + if (!OFASCIIIsSpace(*p)) break; *p = '\0'; d++; } @@ -780,21 +783,22 @@ _s->cStringLength -= d; _s->length -= d; for (i = 0; i < _s->cStringLength; i++) - if (!of_ascii_isspace(_s->cString[i])) + if (!OFASCIIIsSpace(_s->cString[i])) break; _s->cStringLength -= i; _s->length -= i; memmove(_s->cString, _s->cString + i, _s->cStringLength); _s->cString[_s->cStringLength] = '\0'; @try { - _s->cString = of_realloc(_s->cString, _s->cStringLength + 1, 1); + _s->cString = OFResizeMemory(_s->cString, _s->cStringLength + 1, + 1); } @catch (OFOutOfMemoryException *e) { /* We don't really care, as we only made it smaller */ } } Index: src/OFMutableZIPArchiveEntry.h ================================================================== --- src/OFMutableZIPArchiveEntry.h +++ src/OFMutableZIPArchiveEntry.h @@ -50,22 +50,24 @@ /** * @brief The version which made the entry. * * The lower 8 bits are the ZIP specification version.@n * The upper 8 bits are the attribute compatibility. - * See @ref of_zip_archive_entry_attribute_compatibility. + * See @ref OFZIPArchiveEntryAttributeCompatibility. */ -@property (readwrite, nonatomic) uint16_t versionMadeBy; +@property (readwrite, nonatomic) + OFZIPArchiveEntryAttributeCompatibility versionMadeBy; /** * @brief The minimum version required to extract the file. * * The lower 8 bits are the ZIP specification version.@n * The upper 8 bits are the attribute compatibility. - * See @ref of_zip_archive_entry_attribute_compatibility. + * See @ref OFZIPArchiveEntryAttributeCompatibility. */ -@property (readwrite, nonatomic) uint16_t minVersionNeeded; +@property (readwrite, nonatomic) + OFZIPArchiveEntryAttributeCompatibility minVersionNeeded; /** * @brief The last modification date of the entry's file. * * @note Due to limitations of the ZIP format, this has only 2 second precision. @@ -74,19 +76,20 @@ /** * @brief The compression method of the entry. * * Supported values are: - * Value | Description - * --------------------------------------------------|--------------- - * OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_NONE | No compression - * OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_DEFLATE | Deflate - * OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_DEFLATE64 | Deflate64 + * Value | Description + * --------------------------------------------|--------------- + * OFZIPArchiveEntryCompressionMethodNone | No compression + * OFZIPArchiveEntryCompressionMethodDeflate | Deflate + * OFZIPArchiveEntryCompressionMethodDeflate64 | Deflate64 * * Other values may be returned, but the file cannot be extracted then. */ -@property (readwrite, nonatomic) uint16_t compressionMethod; +@property (readwrite, nonatomic) + OFZIPArchiveEntryCompressionMethod compressionMethod; /** * @brief The compressed size of the entry's file. */ @property (readwrite, nonatomic) uint64_t compressedSize; Index: src/OFMutableZIPArchiveEntry.m ================================================================== --- src/OFMutableZIPArchiveEntry.m +++ src/OFMutableZIPArchiveEntry.m @@ -83,16 +83,18 @@ [old release]; objc_autoreleasePoolPop(pool); } -- (void)setVersionMadeBy: (uint16_t)versionMadeBy +- (void)setVersionMadeBy: + (OFZIPArchiveEntryAttributeCompatibility)versionMadeBy { _versionMadeBy = versionMadeBy; } -- (void)setMinVersionNeeded: (uint16_t)minVersionNeeded +- (void)setMinVersionNeeded: + (OFZIPArchiveEntryAttributeCompatibility)minVersionNeeded { _minVersionNeeded = minVersionNeeded; } - (void)setModificationDate: (OFDate *)date @@ -106,11 +108,12 @@ ((date.localMinute & 0x3F) << 5) | ((date.second >> 1) & 0x0F); objc_autoreleasePoolPop(pool); } -- (void)setCompressionMethod: (uint16_t)compressionMethod +- (void)setCompressionMethod: + (OFZIPArchiveEntryCompressionMethod)compressionMethod { _compressionMethod = compressionMethod; } - (void)setCompressedSize: (uint64_t)compressedSize Index: src/OFMutex.h ================================================================== --- src/OFMutex.h +++ src/OFMutex.h @@ -13,12 +13,11 @@ * file. */ #import "OFObject.h" #import "OFLocking.h" - -#import "mutex.h" +#import "OFPlainMutex.h" OF_ASSUME_NONNULL_BEGIN /** * @class OFMutex OFMutex.h ObjFW/OFMutex.h @@ -25,11 +24,11 @@ * * @brief A class for creating mutual exclusions. */ @interface OFMutex: OFObject { - of_mutex_t _mutex; + OFPlainMutex _mutex; bool _initialized; OFString *_Nullable _name; OF_RESERVE_IVARS(OFMutex, 4) } Index: src/OFMutex.m ================================================================== --- src/OFMutex.m +++ src/OFMutex.m @@ -35,11 +35,11 @@ - (instancetype)init { self = [super init]; - if (of_mutex_new(&_mutex) != 0) { + if (OFPlainMutexNew(&_mutex) != 0) { Class c = self.class; [self release]; @throw [OFInitializationFailedException exceptionWithClass: c]; } @@ -49,14 +49,14 @@ } - (void)dealloc { if (_initialized) { - int error = of_mutex_free(&_mutex); + int error = OFPlainMutexFree(&_mutex); if (error != 0) { - OF_ENSURE(error == EBUSY); + OFEnsure(error == EBUSY); @throw [OFStillLockedException exceptionWithLock: self]; } } @@ -65,20 +65,20 @@ [super dealloc]; } - (void)lock { - int error = of_mutex_lock(&_mutex); + int error = OFPlainMutexLock(&_mutex); if (error != 0) @throw [OFLockFailedException exceptionWithLock: self errNo: error]; } - (bool)tryLock { - int error = of_mutex_trylock(&_mutex); + int error = OFPlainMutexTryLock(&_mutex); if (error != 0) { if (error == EBUSY) return false; else @@ -89,11 +89,11 @@ return true; } - (void)unlock { - int error = of_mutex_unlock(&_mutex); + int error = OFPlainMutexUnlock(&_mutex); if (error != 0) @throw [OFUnlockFailedException exceptionWithLock: self errNo: error]; } Index: src/OFNonretainedObjectValue.h ================================================================== --- src/OFNonretainedObjectValue.h +++ src/OFNonretainedObjectValue.h @@ -19,8 +19,10 @@ @interface OFNonretainedObjectValue: OFValue { id _object; } + +- (instancetype)initWithNonretainedObject: (id)object; @end OF_ASSUME_NONNULL_END Index: src/OFNull.m ================================================================== --- src/OFNull.m +++ src/OFNull.m @@ -21,12 +21,13 @@ #import "OFData.h" #import "OFInvalidArgumentException.h" @interface OFNull () -- (OFString *)of_JSONRepresentationWithOptions: (int)options - depth: (size_t)depth; +- (OFString *) + of_JSONRepresentationWithOptions: (OFJSONRepresentationOptions)options + depth: (size_t)depth; @end static OFNull *null = nil; @implementation OFNull @@ -47,11 +48,11 @@ [self release]; pool = objc_autoreleasePoolPush(); if (![element.name isEqual: self.className] || - ![element.namespace isEqual: OF_SERIALIZATION_NS]) + ![element.namespace isEqual: OFSerializationNS]) @throw [OFInvalidArgumentException exception]; objc_autoreleasePoolPop(pool); return [OFNull null]; @@ -71,11 +72,11 @@ { void *pool = objc_autoreleasePoolPush(); OFXMLElement *element; element = [OFXMLElement elementWithName: self.className - namespace: OF_SERIALIZATION_NS]; + namespace: OFSerializationNS]; [element retain]; objc_autoreleasePoolPop(pool); @@ -85,16 +86,18 @@ - (OFString *)JSONRepresentation { return [self of_JSONRepresentationWithOptions: 0 depth: 0]; } -- (OFString *)JSONRepresentationWithOptions: (int)options +- (OFString *)JSONRepresentationWithOptions: + (OFJSONRepresentationOptions)options { return [self of_JSONRepresentationWithOptions: options depth: 0]; } -- (OFString *)of_JSONRepresentationWithOptions: (int)options +- (OFString *) + of_JSONRepresentationWithOptions: (OFJSONRepresentationOptions)options depth: (size_t)depth { return @"null"; } @@ -118,13 +121,13 @@ { } - (unsigned int)retainCount { - return OF_RETAIN_COUNT_MAX; + return OFMaxRetainCount; } - (void)dealloc { OF_DEALLOC_UNSUPPORTED } @end Index: src/OFNumber.h ================================================================== --- src/OFNumber.h +++ src/OFNumber.h @@ -44,11 +44,11 @@ OF_SUBCLASSING_RESTRICTED #endif @interface OFNumber: OFValue { - union of_number_value { + union { double float_; long long signed_; unsigned long long unsigned_; } _value; const char *_typeEncoding; @@ -127,14 +127,14 @@ #ifdef OF_HAVE_UNAVAILABLE + (instancetype)valueWithBytes: (const void *)bytes objCType: (const char *)objCType OF_UNAVAILABLE; + (instancetype)valueWithPointer: (const void *)pointer OF_UNAVAILABLE; + (instancetype)valueWithNonretainedObject: (id)object OF_UNAVAILABLE; -+ (instancetype)valueWithRange: (of_range_t)range OF_UNAVAILABLE; -+ (instancetype)valueWithPoint: (of_point_t)point OF_UNAVAILABLE; -+ (instancetype)valueWithDimension: (of_dimension_t)dimension OF_UNAVAILABLE; -+ (instancetype)valueWithRectangle: (of_rectangle_t)rectangle OF_UNAVAILABLE; ++ (instancetype)valueWithRange: (OFRange)range OF_UNAVAILABLE; ++ (instancetype)valueWithPoint: (OFPoint)point OF_UNAVAILABLE; ++ (instancetype)valueWithSize: (OFSize)size OF_UNAVAILABLE; ++ (instancetype)valueWithRect: (OFRect)rect OF_UNAVAILABLE; #endif /** * @brief Creates a new OFNumber with the specified `bool`. * @@ -241,16 +241,10 @@ - (instancetype)init OF_UNAVAILABLE; #ifdef OF_HAVE_UNAVAILABLE - (instancetype)initWithBytes: (const void *)bytes objCType: (const char *)objCType OF_UNAVAILABLE; -- (instancetype)initWithPointer: (const void *)pointer OF_UNAVAILABLE; -- (instancetype)initWithNonretainedObject: (id)object OF_UNAVAILABLE; -- (instancetype)initWithRange: (of_range_t)range OF_UNAVAILABLE; -- (instancetype)initWithPoint: (of_point_t)point OF_UNAVAILABLE; -- (instancetype)initWithDimension: (of_dimension_t)dimension OF_UNAVAILABLE; -- (instancetype)initWithRectangle: (of_rectangle_t)rectangle OF_UNAVAILABLE; #endif /** * @brief Initializes an already allocated OFNumber with the specified `bool`. * @@ -366,14 +360,14 @@ * @brief Compares the number to another number. * * @param number The number to compare the number to * @return The result of the comparison */ -- (of_comparison_result_t)compare: (OFNumber *)number; +- (OFComparisonResult)compare: (OFNumber *)number; @end OF_ASSUME_NONNULL_END #if !defined(NSINTEGER_DEFINED) && !__has_feature(modules) /* Required for number literals to work */ @compatibility_alias NSNumber OFNumber; #endif Index: src/OFNumber.m ================================================================== --- src/OFNumber.m +++ src/OFNumber.m @@ -29,35 +29,36 @@ #import "OFInvalidFormatException.h" #import "OFOutOfRangeException.h" @interface OFNumber () + (instancetype)of_alloc; -- (OFString *)of_JSONRepresentationWithOptions: (int)options - depth: (size_t)depth; +- (OFString *) + of_JSONRepresentationWithOptions: (OFJSONRepresentationOptions)options + depth: (size_t)depth; @end @interface OFNumberPlaceholder: OFNumber @end @interface OFNumberSingleton: OFNumber @end #ifdef OF_OBJFW_RUNTIME -enum { - TAG_CHAR, - TAG_SHORT, - TAG_INT, - TAG_LONG, - TAG_LONG_LONG, - TAG_UNSIGNED_CHAR, - TAG_UNSIGNED_SHORT, - TAG_UNSIGNED_INT, - TAG_UNSIGNED_LONG, - TAG_UNSIGNED_LONG_LONG, +enum Tag { + tagChar, + tagShort, + tagInt, + tagLong, + tagLongLong, + tagUnsignedChar, + tagUnsignedShort, + tagUnsignedInt, + tagUnsignedLong, + tagUnsignedLongLong, }; -# define TAG_BITS 4 -# define TAG_MASK 0xF +static const uint_fast8_t tagBits = 4; +static const uintptr_t tagMask = 0xF; @interface OFTaggedPointerNumber: OFNumberSingleton @end #endif @@ -148,16 +149,16 @@ @implementation OFNumberPlaceholder - (instancetype)initWithBool: (bool)value { if (value) { - static of_once_t once = OF_ONCE_INIT; - of_once(&once, trueNumberInit); + static OFOnceControl onceControl = OFOnceControlInitValue; + OFOnce(&onceControl, trueNumberInit); return (id)trueNumber; } else { - static of_once_t once = OF_ONCE_INIT; - of_once(&once, falseNumberInit); + static OFOnceControl onceControl = OFOnceControlInitValue; + OFOnce(&onceControl, falseNumberInit); return (id)falseNumber; } } #ifdef __clang__ @@ -165,17 +166,17 @@ # pragma clang diagnostic ignored "-Wtautological-constant-out-of-range-compare" #endif - (instancetype)initWithChar: (signed char)value { if (value == 0) { - static of_once_t once = OF_ONCE_INIT; - of_once(&once, charZeroNumberInit); + static OFOnceControl onceControl = OFOnceControlInitValue; + OFOnce(&onceControl, charZeroNumberInit); return (id)charZeroNumber; #ifdef OF_OBJFW_RUNTIME - } else if ((unsigned char)value <= (UINTPTR_MAX >> TAG_BITS)) { + } else if ((unsigned char)value <= (UINTPTR_MAX >> tagBits)) { id ret = objc_createTaggedPointer(numberTag, - ((uintptr_t)(unsigned char)value << TAG_BITS) | TAG_CHAR); + ((uintptr_t)(unsigned char)value << tagBits) | tagChar); if (ret != nil) return ret; #endif } @@ -184,17 +185,17 @@ } - (instancetype)initWithShort: (short)value { if (value == 0) { - static of_once_t once = OF_ONCE_INIT; - of_once(&once, shortZeroNumberInit); + static OFOnceControl onceControl = OFOnceControlInitValue; + OFOnce(&onceControl, shortZeroNumberInit); return (id)shortZeroNumber; #ifdef OF_OBJFW_RUNTIME - } else if ((unsigned short)value <= (UINTPTR_MAX >> TAG_BITS)) { + } else if ((unsigned short)value <= (UINTPTR_MAX >> tagBits)) { id ret = objc_createTaggedPointer(numberTag, - ((uintptr_t)(unsigned short)value << TAG_BITS) | TAG_SHORT); + ((uintptr_t)(unsigned short)value << tagBits) | tagShort); if (ret != nil) return ret; #endif } @@ -203,17 +204,17 @@ } - (instancetype)initWithInt: (int)value { if (value == 0) { - static of_once_t once = OF_ONCE_INIT; - of_once(&once, intZeroNumberInit); + static OFOnceControl onceControl = OFOnceControlInitValue; + OFOnce(&onceControl, intZeroNumberInit); return (id)intZeroNumber; #ifdef OF_OBJFW_RUNTIME - } else if ((unsigned int)value <= (UINTPTR_MAX >> TAG_BITS)) { + } else if ((unsigned int)value <= (UINTPTR_MAX >> tagBits)) { id ret = objc_createTaggedPointer(numberTag, - ((uintptr_t)(unsigned int)value << TAG_BITS) | TAG_INT); + ((uintptr_t)(unsigned int)value << tagBits) | tagInt); if (ret != nil) return ret; #endif } @@ -222,17 +223,17 @@ } - (instancetype)initWithLong: (long)value { if (value == 0) { - static of_once_t once = OF_ONCE_INIT; - of_once(&once, longZeroNumberInit); + static OFOnceControl onceControl = OFOnceControlInitValue; + OFOnce(&onceControl, longZeroNumberInit); return (id)longZeroNumber; #ifdef OF_OBJFW_RUNTIME - } else if ((unsigned long)value <= (UINTPTR_MAX >> TAG_BITS)) { + } else if ((unsigned long)value <= (UINTPTR_MAX >> tagBits)) { id ret = objc_createTaggedPointer(numberTag, - ((uintptr_t)(unsigned long)value << TAG_BITS) | TAG_LONG); + ((uintptr_t)(unsigned long)value << tagBits) | tagLong); if (ret != nil) return ret; #endif } @@ -241,18 +242,18 @@ } - (instancetype)initWithLongLong: (long long)value { if (value == 0) { - static of_once_t once = OF_ONCE_INIT; - of_once(&once, longLongZeroNumberInit); + static OFOnceControl onceControl = OFOnceControlInitValue; + OFOnce(&onceControl, longLongZeroNumberInit); return (id)longLongZeroNumber; #ifdef OF_OBJFW_RUNTIME - } else if ((unsigned long long)value <= (UINTPTR_MAX >> TAG_BITS)) { + } else if ((unsigned long long)value <= (UINTPTR_MAX >> tagBits)) { id ret = objc_createTaggedPointer(numberTag, - ((uintptr_t)(unsigned long long)value << TAG_BITS) | - TAG_LONG_LONG); + ((uintptr_t)(unsigned long long)value << tagBits) | + tagLongLong); if (ret != nil) return ret; #endif } @@ -261,17 +262,17 @@ } - (instancetype)initWithUnsignedChar: (unsigned char)value { if (value == 0) { - static of_once_t once = OF_ONCE_INIT; - of_once(&once, unsignedCharZeroNumberInit); + static OFOnceControl onceControl = OFOnceControlInitValue; + OFOnce(&onceControl, unsignedCharZeroNumberInit); return (id)unsignedCharZeroNumber; #ifdef OF_OBJFW_RUNTIME - } else if (value <= (UINTPTR_MAX >> TAG_BITS)) { + } else if (value <= (UINTPTR_MAX >> tagBits)) { id ret = objc_createTaggedPointer(numberTag, - ((uintptr_t)value << TAG_BITS) | TAG_UNSIGNED_CHAR); + ((uintptr_t)value << tagBits) | tagUnsignedChar); if (ret != nil) return ret; #endif } @@ -280,17 +281,17 @@ } - (instancetype)initWithUnsignedShort: (unsigned short)value { if (value == 0) { - static of_once_t once = OF_ONCE_INIT; - of_once(&once, unsignedShortZeroNumberInit); + static OFOnceControl onceControl = OFOnceControlInitValue; + OFOnce(&onceControl, unsignedShortZeroNumberInit); return (id)unsignedShortZeroNumber; #ifdef OF_OBJFW_RUNTIME - } else if (value <= (UINTPTR_MAX >> TAG_BITS)) { + } else if (value <= (UINTPTR_MAX >> tagBits)) { id ret = objc_createTaggedPointer(numberTag, - ((uintptr_t)value << TAG_BITS) | TAG_UNSIGNED_SHORT); + ((uintptr_t)value << tagBits) | tagUnsignedShort); if (ret != nil) return ret; #endif } @@ -299,17 +300,17 @@ } - (instancetype)initWithUnsignedInt: (unsigned int)value { if (value == 0) { - static of_once_t once = OF_ONCE_INIT; - of_once(&once, unsignedIntZeroNumberInit); + static OFOnceControl onceControl = OFOnceControlInitValue; + OFOnce(&onceControl, unsignedIntZeroNumberInit); return (id)unsignedIntZeroNumber; #ifdef OF_OBJFW_RUNTIME - } else if (value <= (UINTPTR_MAX >> TAG_BITS)) { + } else if (value <= (UINTPTR_MAX >> tagBits)) { id ret = objc_createTaggedPointer(numberTag, - ((uintptr_t)value << TAG_BITS) | TAG_UNSIGNED_INT); + ((uintptr_t)value << tagBits) | tagUnsignedInt); if (ret != nil) return ret; #endif } @@ -318,17 +319,17 @@ } - (instancetype)initWithUnsignedLong: (unsigned long)value { if (value == 0) { - static of_once_t once = OF_ONCE_INIT; - of_once(&once, unsignedLongZeroNumberInit); + static OFOnceControl onceControl = OFOnceControlInitValue; + OFOnce(&onceControl, unsignedLongZeroNumberInit); return (id)unsignedLongZeroNumber; #ifdef OF_OBJFW_RUNTIME - } else if (value <= (UINTPTR_MAX >> TAG_BITS)) { + } else if (value <= (UINTPTR_MAX >> tagBits)) { id ret = objc_createTaggedPointer(numberTag, - ((uintptr_t)value << TAG_BITS) | TAG_UNSIGNED_LONG); + ((uintptr_t)value << tagBits) | tagUnsignedLong); if (ret != nil) return ret; #endif } @@ -337,17 +338,17 @@ } - (instancetype)initWithUnsignedLongLong: (unsigned long long)value { if (value == 0) { - static of_once_t once = OF_ONCE_INIT; - of_once(&once, unsignedLongLongZeroNumberInit); + static OFOnceControl onceControl = OFOnceControlInitValue; + OFOnce(&onceControl, unsignedLongLongZeroNumberInit); return (id)unsignedLongLongZeroNumber; #ifdef OF_OBJFW_RUNTIME - } else if (value <= (UINTPTR_MAX >> TAG_BITS)) { + } else if (value <= (UINTPTR_MAX >> tagBits)) { id ret = objc_createTaggedPointer(numberTag, - ((uintptr_t)value << TAG_BITS) | TAG_UNSIGNED_LONG_LONG); + ((uintptr_t)value << tagBits) | tagUnsignedLongLong); if (ret != nil) return ret; #endif } @@ -356,23 +357,23 @@ } - (instancetype)initWithFloat: (float)value { if (value == 0) { - static of_once_t once = OF_ONCE_INIT; - of_once(&once, floatZeroNumberInit); + static OFOnceControl onceControl = OFOnceControlInitValue; + OFOnce(&onceControl, floatZeroNumberInit); return (id)floatZeroNumber; } return (id)[[OFNumber of_alloc] initWithFloat: value]; } - (instancetype)initWithDouble: (double)value { if (value == 0) { - static of_once_t once = OF_ONCE_INIT; - of_once(&once, doubleZeroNumberInit); + static OFOnceControl onceControl = OFOnceControlInitValue; + OFOnce(&onceControl, doubleZeroNumberInit); return (id)doubleZeroNumber; } return (id)[[OFNumber of_alloc] initWithDouble: value]; } @@ -401,72 +402,72 @@ { } - (unsigned int)retainCount { - return OF_RETAIN_COUNT_MAX; + return OFMaxRetainCount; } @end #ifdef OF_OBJFW_RUNTIME @implementation OFTaggedPointerNumber - (const char *)objCType { uintptr_t value = object_getTaggedPointerValue(self); - switch (value & TAG_MASK) { - case TAG_CHAR: + switch (value & tagMask) { + case tagChar: return @encode(signed char); - case TAG_SHORT: + case tagShort: return @encode(short); - case TAG_INT: + case tagInt: return @encode(int); - case TAG_LONG: + case tagLong: return @encode(long); - case TAG_LONG_LONG: + case tagLongLong: return @encode(long long); - case TAG_UNSIGNED_CHAR: + case tagUnsignedChar: return @encode(unsigned char); - case TAG_UNSIGNED_SHORT: + case tagUnsignedShort: return @encode(unsigned short); - case TAG_UNSIGNED_INT: + case tagUnsignedInt: return @encode(unsigned int); - case TAG_UNSIGNED_LONG: + case tagUnsignedLong: return @encode(unsigned long); - case TAG_UNSIGNED_LONG_LONG: + case tagUnsignedLongLong: return @encode(unsigned long long); default: @throw [OFInvalidArgumentException exception]; } } -# define RETURN_VALUE \ - uintptr_t value = object_getTaggedPointerValue(self); \ - \ - switch (value & TAG_MASK) { \ - case TAG_CHAR: \ - return (signed char)(unsigned char)(value >> TAG_BITS); \ - case TAG_SHORT: \ - return (short)(unsigned short)(value >> TAG_BITS); \ - case TAG_INT: \ - return (int)(unsigned int)(value >> TAG_BITS); \ - case TAG_LONG: \ - return (long)(unsigned long)(value >> TAG_BITS); \ - case TAG_LONG_LONG: \ - return (long long)(unsigned long long)(value >> TAG_BITS); \ - case TAG_UNSIGNED_CHAR: \ - return (unsigned char)(value >> TAG_BITS); \ - case TAG_UNSIGNED_SHORT: \ - return (unsigned short)(value >> TAG_BITS); \ - case TAG_UNSIGNED_INT: \ - return (unsigned int)(value >> TAG_BITS); \ - case TAG_UNSIGNED_LONG: \ - return (unsigned long)(value >> TAG_BITS); \ - case TAG_UNSIGNED_LONG_LONG: \ - return (unsigned long long)(value >> TAG_BITS); \ - default: \ - @throw [OFInvalidArgumentException exception]; \ +# define RETURN_VALUE \ + uintptr_t value = object_getTaggedPointerValue(self); \ + \ + switch (value & tagMask) { \ + case tagChar: \ + return (signed char)(unsigned char)(value >> tagBits); \ + case tagShort: \ + return (short)(unsigned short)(value >> tagBits); \ + case tagInt: \ + return (int)(unsigned int)(value >> tagBits); \ + case tagLong: \ + return (long)(unsigned long)(value >> tagBits); \ + case tagLongLong: \ + return (long long)(unsigned long long)(value >> tagBits); \ + case tagUnsignedChar: \ + return (unsigned char)(value >> tagBits); \ + case tagUnsignedShort: \ + return (unsigned short)(value >> tagBits); \ + case tagUnsignedInt: \ + return (unsigned int)(value >> tagBits); \ + case tagUnsignedLong: \ + return (unsigned long)(value >> tagBits); \ + case tagUnsignedLongLong: \ + return (unsigned long long)(value >> tagBits); \ + default: \ + @throw [OFInvalidArgumentException exception]; \ } - (long long)longLongValue { RETURN_VALUE } @@ -748,11 +749,11 @@ @try { void *pool = objc_autoreleasePoolPush(); OFString *typeString; if (![element.name isEqual: @"OFNumber"] || - ![element.namespace isEqual: OF_SERIALIZATION_NS]) + ![element.namespace isEqual: OFSerializationNS]) @throw [OFInvalidArgumentException exception]; typeString = [element attributeForName: @"type"].stringValue; if ([typeString isEqual: @"bool"]) { @@ -768,12 +769,12 @@ [element unsignedLongLongValueWithBase: 16]; if (value > UINT64_MAX) @throw [OFOutOfRangeException exception]; - self = [self initWithDouble: OF_BSWAP_DOUBLE_IF_LE( - OF_INT_TO_DOUBLE_RAW(OF_BSWAP64_IF_LE(value)))]; + self = [self initWithDouble: OFFromBigEndianDouble( + OFRawUInt64ToDouble(OFToBigEndian64(value)))]; } else if ([typeString isEqual: @"signed"]) self = [self initWithLongLong: element.longLongValue]; else if ([typeString isEqual: @"unsigned"]) self = [self initWithUnsignedLongLong: element.unsignedLongLongValue]; @@ -940,75 +941,75 @@ return (number.longLongValue == self.longLongValue); return (number.unsignedLongLongValue == self.unsignedLongLongValue); } -- (of_comparison_result_t)compare: (OFNumber *)number +- (OFComparisonResult)compare: (OFNumber *)number { if (![number isKindOfClass: [OFNumber class]]) @throw [OFInvalidArgumentException exception]; if (isFloat(self) || isFloat(number)) { double double1 = self.doubleValue; double double2 = number.doubleValue; if (double1 > double2) - return OF_ORDERED_DESCENDING; + return OFOrderedDescending; if (double1 < double2) - return OF_ORDERED_ASCENDING; + return OFOrderedAscending; - return OF_ORDERED_SAME; + return OFOrderedSame; } else if (isSigned(self) || isSigned(number)) { long long int1 = self.longLongValue; long long int2 = number.longLongValue; if (int1 > int2) - return OF_ORDERED_DESCENDING; + return OFOrderedDescending; if (int1 < int2) - return OF_ORDERED_ASCENDING; + return OFOrderedAscending; - return OF_ORDERED_SAME; + return OFOrderedSame; } else { unsigned long long uint1 = self.unsignedLongLongValue; unsigned long long uint2 = number.unsignedLongLongValue; if (uint1 > uint2) - return OF_ORDERED_DESCENDING; + return OFOrderedDescending; if (uint1 < uint2) - return OF_ORDERED_ASCENDING; + return OFOrderedAscending; - return OF_ORDERED_SAME; + return OFOrderedSame; } } - (unsigned long)hash { - uint32_t hash; + unsigned long hash; - OF_HASH_INIT(hash); + OFHashInit(&hash); if (isFloat(self)) { double d; if (isnan(self.doubleValue)) return 0; - d = OF_BSWAP_DOUBLE_IF_BE(self.doubleValue); + d = OFToLittleEndianDouble(self.doubleValue); for (uint_fast8_t i = 0; i < sizeof(double); i++) - OF_HASH_ADD(hash, ((char *)&d)[i]); + OFHashAdd(&hash, ((char *)&d)[i]); } else if (isSigned(self) || isUnsigned(self)) { unsigned long long value = self.unsignedLongLongValue; while (value != 0) { - OF_HASH_ADD(hash, value & 0xFF); + OFHashAdd(&hash, value & 0xFF); value >>= 8; } } else @throw [OFInvalidFormatException exception]; - OF_HASH_FINALIZE(hash); + OFHashFinalize(&hash); return hash; } - (id)copy @@ -1040,20 +1041,20 @@ { void *pool = objc_autoreleasePoolPush(); OFXMLElement *element; element = [OFXMLElement elementWithName: @"OFNumber" - namespace: OF_SERIALIZATION_NS + namespace: OFSerializationNS stringValue: self.description]; if (*self.objCType == 'B') [element addAttributeWithName: @"type" stringValue: @"bool"]; else if (isFloat(self)) { [element addAttributeWithName: @"type" stringValue: @"float"]; element.stringValue = [OFString stringWithFormat: @"%016" PRIx64, - OF_BSWAP64_IF_LE(OF_DOUBLE_TO_INT_RAW(OF_BSWAP_DOUBLE_IF_LE( + OFFromBigEndian64(OFDoubleToRawUInt64(OFToBigEndianDouble( self.doubleValue)))]; } else if (isSigned(self)) [element addAttributeWithName: @"type" stringValue: @"signed"]; else if (isUnsigned(self)) [element addAttributeWithName: @"type" @@ -1071,26 +1072,28 @@ - (OFString *)JSONRepresentation { return [self of_JSONRepresentationWithOptions: 0 depth: 0]; } -- (OFString *)JSONRepresentationWithOptions: (int)options +- (OFString *)JSONRepresentationWithOptions: + (OFJSONRepresentationOptions)options { return [self of_JSONRepresentationWithOptions: options depth: 0]; } -- (OFString *)of_JSONRepresentationWithOptions: (int)options - depth: (size_t)depth +- (OFString *) + of_JSONRepresentationWithOptions: (OFJSONRepresentationOptions)options + depth: (size_t)depth { double doubleValue; if (*self.objCType == 'B') return (self.boolValue ? @"true" : @"false"); doubleValue = self.doubleValue; if (isinf(doubleValue)) { - if (options & OF_JSON_REPRESENTATION_JSON5) { + if (options & OFJSONRepresentationOptionJSON5) { if (doubleValue > 0) return @"Infinity"; else return @"-Infinity"; } else @@ -1108,18 +1111,18 @@ if (*typeEncoding == 'B') { uint8_t type = (self.boolValue ? 0xC3 : 0xC2); data = [OFMutableData dataWithItems: &type count: 1]; } else if (*typeEncoding == 'f') { uint8_t type = 0xCA; - float tmp = OF_BSWAP_FLOAT_IF_LE(self.floatValue); + float tmp = OFToBigEndianFloat(self.floatValue); data = [OFMutableData dataWithCapacity: 5]; [data addItem: &type]; [data addItems: &tmp count: sizeof(tmp)]; } else if (*typeEncoding == 'd') { uint8_t type = 0xCB; - double tmp = OF_BSWAP_DOUBLE_IF_LE(self.doubleValue); + double tmp = OFToBigEndianDouble(self.doubleValue); data = [OFMutableData dataWithCapacity: 9]; [data addItem: &type]; [data addItems: &tmp count: sizeof(tmp)]; } else if (isSigned(self)) { @@ -1136,25 +1139,25 @@ data = [OFMutableData dataWithCapacity: 2]; [data addItem: &type]; [data addItem: &tmp]; } else if (value >= INT16_MIN && value <= INT16_MAX) { uint8_t type = 0xD1; - int16_t tmp = OF_BSWAP16_IF_LE((int16_t)value); + int16_t tmp = OFToBigEndian16((int16_t)value); data = [OFMutableData dataWithCapacity: 3]; [data addItem: &type]; [data addItems: &tmp count: sizeof(tmp)]; } else if (value >= INT32_MIN && value <= INT32_MAX) { uint8_t type = 0xD2; - int32_t tmp = OF_BSWAP32_IF_LE((int32_t)value); + int32_t tmp = OFToBigEndian32((int32_t)value); data = [OFMutableData dataWithCapacity: 5]; [data addItem: &type]; [data addItems: &tmp count: sizeof(tmp)]; } else if (value >= INT64_MIN && value <= INT64_MAX) { uint8_t type = 0xD3; - int64_t tmp = OF_BSWAP64_IF_LE((int64_t)value); + int64_t tmp = OFToBigEndian64((int64_t)value); data = [OFMutableData dataWithCapacity: 9]; [data addItem: &type]; [data addItems: &tmp count: sizeof(tmp)]; } else @@ -1172,25 +1175,25 @@ data = [OFMutableData dataWithCapacity: 2]; [data addItem: &type]; [data addItem: &tmp]; } else if (value <= UINT16_MAX) { uint8_t type = 0xCD; - uint16_t tmp = OF_BSWAP16_IF_LE((uint16_t)value); + uint16_t tmp = OFToBigEndian16((uint16_t)value); data = [OFMutableData dataWithCapacity: 3]; [data addItem: &type]; [data addItems: &tmp count: sizeof(tmp)]; } else if (value <= UINT32_MAX) { uint8_t type = 0xCE; - uint32_t tmp = OF_BSWAP32_IF_LE((uint32_t)value); + uint32_t tmp = OFToBigEndian32((uint32_t)value); data = [OFMutableData dataWithCapacity: 5]; [data addItem: &type]; [data addItems: &tmp count: sizeof(tmp)]; } else if (value <= UINT64_MAX) { uint8_t type = 0xCF; - uint64_t tmp = OF_BSWAP64_IF_LE((uint64_t)value); + uint64_t tmp = OFToBigEndian64((uint64_t)value); data = [OFMutableData dataWithCapacity: 9]; [data addItem: &type]; [data addItems: &tmp count: sizeof(tmp)]; } else Index: src/OFObject+KeyValueCoding.m ================================================================== --- src/OFObject+KeyValueCoding.m +++ src/OFObject+KeyValueCoding.m @@ -46,21 +46,21 @@ if ((keyLength = key.UTF8StringLength) < 1) { objc_autoreleasePoolPop(pool); return [self valueForUndefinedKey: key]; } - name = of_alloc(keyLength + 3, 1); + name = OFAllocMemory(keyLength + 3, 1); @try { memcpy(name, "is", 2); memcpy(name + 2, key.UTF8String, keyLength); name[keyLength + 2] = '\0'; - name[2] = of_ascii_toupper(name[2]); + name[2] = OFASCIIToUpper(name[2]); selector = sel_registerName(name); } @finally { - free(name); + OFFreeMemory(name); } methodSignature = [self methodSignatureForSelector: selector]; if (methodSignature == NULL) { @@ -155,21 +155,21 @@ objc_autoreleasePoolPop(pool); [self setValue: value forUndefinedKey: key]; return; } - name = of_alloc(keyLength + 5, 1); + name = OFAllocMemory(keyLength + 5, 1); @try { memcpy(name, "set", 3); memcpy(name + 3, key.UTF8String, keyLength); memcpy(name + keyLength + 3, ":", 2); - name[3] = of_ascii_toupper(name[3]); + name[3] = OFASCIIToUpper(name[3]); selector = sel_registerName(name); } @finally { - free(name); + OFFreeMemory(name); } methodSignature = [self methodSignatureForSelector: selector]; if (methodSignature == nil || Index: src/OFObject+Serialization.m ================================================================== --- src/OFObject+Serialization.m +++ src/OFObject+Serialization.m @@ -40,11 +40,11 @@ pool = objc_autoreleasePoolPush(); element = ((id )self).XMLElementBySerializing; root = [OFXMLElement elementWithName: @"serialization" - namespace: OF_SERIALIZATION_NS]; + namespace: OFSerializationNS]; [root addAttributeWithName: @"version" stringValue: @"1"]; [root addChild: element]; ret = [@"\n" stringByAppendingString: [root XMLStringWithIndentation: 2]]; Index: src/OFObject.h ================================================================== --- src/OFObject.h +++ src/OFObject.h @@ -28,13 +28,13 @@ #include #include #include #include -#include "block.h" #include "macros.h" -#include "once.h" + +#include "OFOnce.h" /* * Some versions of MinGW require to be included before * . Do this here to make sure this is always done in the correct * order, even if another header includes just . @@ -54,63 +54,67 @@ /** * @brief A result of a comparison. */ typedef enum { /** The left object is smaller than the right */ - OF_ORDERED_ASCENDING = -1, + OFOrderedAscending = -1, /** Both objects are equal */ - OF_ORDERED_SAME = 0, + OFOrderedSame = 0, /** The left object is bigger than the right */ - OF_ORDERED_DESCENDING = 1 -} of_comparison_result_t; + OFOrderedDescending = 1 +} OFComparisonResult; #ifdef OF_HAVE_BLOCKS /** * @brief A comparator to compare two objects. * * @param left The left object * @param right The right object * @return The order of the objects */ -typedef of_comparison_result_t (^of_comparator_t)(id _Nonnull left, - id _Nonnull right); +typedef OFComparisonResult (^OFComparator)(id _Nonnull left, id _Nonnull right); #endif /** - * @brief An enum for storing endianess. + * @brief An enum for representing endianess. */ typedef enum { /** Most significant byte first (big endian) */ - OF_BYTE_ORDER_BIG_ENDIAN, + OFByteOrderBigEndian, /** Least significant byte first (little endian) */ - OF_BYTE_ORDER_LITTLE_ENDIAN -} of_byte_order_t; + OFByteOrderLittleEndian, + /** Native byte order of the system */ +#ifdef OF_BIG_ENDIAN + OFByteOrderNative = OFByteOrderBigEndian +#else + OFByteOrderNative = OFByteOrderLittleEndian +#endif +} OFByteOrder; /** - * @struct of_range_t OFObject.h ObjFW/OFObject.h + * @struct OFRange OFObject.h ObjFW/OFObject.h * * @brief A range. */ -struct OF_BOXABLE of_range_t { +typedef struct OF_BOXABLE { /** The start of the range */ size_t location; /** The length of the range */ size_t length; -}; -typedef struct of_range_t of_range_t; +} OFRange; /** - * @brief Creates a new of_range_t. + * @brief Creates a new OFRange. * * @param start The starting index of the range * @param length The length of the range - * @return An of_range with the specified start and length + * @return An OFRangeith the specified start and length */ -static OF_INLINE of_range_t OF_CONST_FUNC -of_range(size_t start, size_t length) +static OF_INLINE OFRange OF_CONST_FUNC +OFRangeMake(size_t start, size_t length) { - of_range_t range = { start, length }; + OFRange range = { start, length }; return range; } /** @@ -119,11 +123,11 @@ * @param range1 The first range for the comparison * @param range2 The second range for the comparison * @return Whether the two ranges are equal */ static OF_INLINE bool -of_range_equal(of_range_t range1, of_range_t range2) +OFRangeEqual(OFRange range1, OFRange range2) { if (range1.location != range2.location) return false; if (range1.length != range2.length) @@ -133,36 +137,35 @@ } /** * @brief A time interval in seconds. */ -typedef double of_time_interval_t; +typedef double OFTimeInterval; /** - * @struct of_point_t OFObject.h ObjFW/OFObject.h + * @struct OFPoint OFObject.h ObjFW/OFObject.h * * @brief A point. */ -struct OF_BOXABLE of_point_t { +typedef struct OF_BOXABLE { /** The x coordinate of the point */ float x; /** The y coordinate of the point */ float y; -}; -typedef struct of_point_t of_point_t; +} OFPoint; /** - * @brief Creates a new of_point_t. + * @brief Creates a new OFPoint. * * @param x The x coordinate of the point * @param y The x coordinate of the point - * @return An of_point_t with the specified coordinates + * @return An OFPoint with the specified coordinates */ -static OF_INLINE of_point_t OF_CONST_FUNC -of_point(float x, float y) +static OF_INLINE OFPoint OF_CONST_FUNC +OFPointMake(float x, float y) { - of_point_t point = { x, y }; + OFPoint point = { x, y }; return point; } /** @@ -171,11 +174,11 @@ * @param point1 The first point for the comparison * @param point2 The second point for the comparison * @return Whether the two points are equal */ static OF_INLINE bool -of_point_equal(of_point_t point1, of_point_t point2) +OFPointEqual(OFPoint point1, OFPoint point2) { if (point1.x != point2.x) return false; if (point1.y != point2.y) @@ -183,107 +186,157 @@ return true; } /** - * @struct of_dimension_t OFObject.h ObjFW/OFObject.h + * @struct OFSize OFObject.h ObjFW/OFObject.h * - * @brief A dimension. + * @brief A size. */ -struct OF_BOXABLE of_dimension_t { - /** The width of the dimension */ +typedef struct OF_BOXABLE { + /** The width of the size */ float width; - /** The height of the dimension */ + /** The height of the size */ float height; -}; -typedef struct of_dimension_t of_dimension_t; - -/** - * @brief Creates a new of_dimension_t. - * - * @param width The width of the dimension - * @param height The height of the dimension - * @return An of_dimension_t with the specified width and height - */ -static OF_INLINE of_dimension_t OF_CONST_FUNC -of_dimension(float width, float height) -{ - of_dimension_t dimension = { width, height }; - - return dimension; -} - -/** - * @brief Returns whether the two dimensions are equal. - * - * @param dimension1 The first dimension for the comparison - * @param dimension2 The second dimension for the comparison - * @return Whether the two dimensions are equal +} OFSize; + +/** + * @brief Creates a new OFSize. + * + * @param width The width of the size + * @param height The height of the size + * @return An OFSize with the specified width and height + */ +static OF_INLINE OFSize OF_CONST_FUNC +OFSizeMake(float width, float height) +{ + OFSize size = { width, height }; + + return size; +} + +/** + * @brief Returns whether the two sizes are equal. + * + * @param size1 The first size for the comparison + * @param size2 The second size for the comparison + * @return Whether the two sizes are equal + */ +static OF_INLINE bool +OFSizeEqual(OFSize size1, OFSize size2) +{ + if (size1.width != size2.width) + return false; + + if (size1.height != size2.height) + return false; + + return true; +} + +/** + * @struct OFRect OFObject.h ObjFW/OFObject.h + * + * @brief A rectangle. + */ +typedef struct OF_BOXABLE { + /** The point from where the rectangle originates */ + OFPoint origin; + /** The size of the rectangle */ + OFSize size; +} OFRect; + +/** + * @brief Creates a new OFRect. + * + * @param x The x coordinate of the top left corner of the rectangle + * @param y The y coordinate of the top left corner of the rectangle + * @param width The width of the rectangle + * @param height The height of the rectangle + * @return An OFRect with the specified origin and size + */ +static OF_INLINE OFRect OF_CONST_FUNC +OFRectMake(float x, float y, float width, float height) +{ + OFRect rect = { + OFPointMake(x, y), + OFSizeMake(width, height) + }; + + return rect; +} + +/** + * @brief Returns whether the two rectangles are equal. + * + * @param rect1 The first rectangle for the comparison + * @param rect2 The second rectangle for the comparison + * @return Whether the two rectangles are equal */ static OF_INLINE bool -of_dimension_equal(of_dimension_t dimension1, of_dimension_t dimension2) +OFRectEqual(OFRect rect1, OFRect rect2) { - if (dimension1.width != dimension2.width) + if (!OFPointEqual(rect1.origin, rect2.origin)) return false; - if (dimension1.height != dimension2.height) + if (!OFSizeEqual(rect1.size, rect2.size)) return false; return true; } /** - * @struct of_rectangle_t OFObject.h ObjFW/OFObject.h - * - * @brief A rectangle. - */ -struct OF_BOXABLE of_rectangle_t { - /** The point from where the rectangle originates */ - of_point_t origin; - /** The size of the rectangle */ - of_dimension_t size; -}; -typedef struct of_rectangle_t of_rectangle_t; - -/** - * @brief Creates a new of_rectangle_t. - * - * @param x The x coordinate of the top left corner of the rectangle - * @param y The y coordinate of the top left corner of the rectangle - * @param width The width of the rectangle - * @param height The height of the rectangle - * @return An of_rectangle_t with the specified origin and size - */ -static OF_INLINE of_rectangle_t OF_CONST_FUNC -of_rectangle(float x, float y, float width, float height) -{ - of_rectangle_t rectangle = { - of_point(x, y), - of_dimension(width, height) - }; - - return rectangle; -} - -/** - * @brief Returns whether the two rectangles are equal. - * - * @param rectangle1 The first rectangle for the comparison - * @param rectangle2 The second rectangle for the comparison - * @return Whether the two rectangles are equal - */ -static OF_INLINE bool -of_rectangle_equal(of_rectangle_t rectangle1, of_rectangle_t rectangle2) -{ - if (!of_point_equal(rectangle1.origin, rectangle2.origin)) - return false; - - if (!of_dimension_equal(rectangle1.size, rectangle2.size)) - return false; - - return true; -} + * @brief Adds the specified byte to the hash. + * + * @param hash A pointer to a hash to add the byte to + * @param byte The byte to add to the hash + */ +static OF_INLINE void +OFHashAdd(unsigned long *_Nonnull hash, unsigned char byte) +{ + uint32_t tmp = (uint32_t)*hash; + + tmp += byte; + tmp += tmp << 10; + tmp ^= tmp >> 6; + + *hash = tmp; +} + +/** + * @brief Adds the specified hash to the hash. + * + * @param hash A pointer to a hash to add the hash to + * @param otherHash The hash to add to the hash + */ +static OF_INLINE void +OFHashAddHash(unsigned long *_Nonnull hash, unsigned long otherHash) +{ + OFHashAdd(hash, (otherHash >> 24) & 0xFF); + OFHashAdd(hash, (otherHash >> 16) & 0xFF); + OFHashAdd(hash, (otherHash >> 8) & 0xFF); + OFHashAdd(hash, otherHash & 0xFF); +} + +/** + * @brief Finalizes the specified hash. + * + * @param hash A pointer to the hash to finalize + */ +static OF_INLINE void +OFHashFinalize(unsigned long *_Nonnull hash) +{ + uint32_t tmp = (uint32_t)*hash; + + tmp += tmp << 3; + tmp ^= tmp >> 11; + tmp += tmp << 15; + + *hash = tmp; +} + +static const size_t OFNotFound = SIZE_MAX; #ifdef __OBJC__ @class OFMethodSignature; @class OFString; @class OFThread; @@ -816,11 +869,11 @@ * @brief Performs the specified selector after the specified delay. * * @param selector The selector to perform * @param delay The delay after which the selector will be performed */ -- (void)performSelector: (SEL)selector afterDelay: (of_time_interval_t)delay; +- (void)performSelector: (SEL)selector afterDelay: (OFTimeInterval)delay; /** * @brief Performs the specified selector with the specified object after the * specified delay. * @@ -829,11 +882,11 @@ * selector * @param delay The delay after which the selector will be performed */ - (void)performSelector: (SEL)selector withObject: (nullable id)object - afterDelay: (of_time_interval_t)delay; + afterDelay: (OFTimeInterval)delay; /** * @brief Performs the specified selector with the specified objects after the * specified delay. * @@ -845,11 +898,11 @@ * @param delay The delay after which the selector will be performed */ - (void)performSelector: (SEL)selector withObject: (nullable id)object1 withObject: (nullable id)object2 - afterDelay: (of_time_interval_t)delay; + afterDelay: (OFTimeInterval)delay; /** * @brief Performs the specified selector with the specified objects after the * specified delay. * @@ -864,11 +917,11 @@ */ - (void)performSelector: (SEL)selector withObject: (nullable id)object1 withObject: (nullable id)object2 withObject: (nullable id)object3 - afterDelay: (of_time_interval_t)delay; + afterDelay: (OFTimeInterval)delay; /** * @brief Performs the specified selector with the specified objects after the * specified delay. * @@ -886,11 +939,11 @@ - (void)performSelector: (SEL)selector withObject: (nullable id)object1 withObject: (nullable id)object2 withObject: (nullable id)object3 withObject: (nullable id)object4 - afterDelay: (of_time_interval_t)delay; + afterDelay: (OFTimeInterval)delay; # ifdef OF_HAVE_THREADS /** * @brief Performs the specified selector on the specified thread. * @@ -1067,11 +1120,11 @@ * @param thread The thread on which to perform the selector * @param delay The delay after which the selector will be performed */ - (void)performSelector: (SEL)selector onThread: (OFThread *)thread - afterDelay: (of_time_interval_t)delay; + afterDelay: (OFTimeInterval)delay; /** * @brief Performs the specified selector on the specified thread with the * specified object after the specified delay. * @@ -1082,11 +1135,11 @@ * @param delay The delay after which the selector will be performed */ - (void)performSelector: (SEL)selector onThread: (OFThread *)thread withObject: (nullable id)object - afterDelay: (of_time_interval_t)delay; + afterDelay: (OFTimeInterval)delay; /** * @brief Performs the specified selector on the specified thread with the * specified objects after the specified delay. * @@ -1100,11 +1153,11 @@ */ - (void)performSelector: (SEL)selector onThread: (OFThread *)thread withObject: (nullable id)object1 withObject: (nullable id)object2 - afterDelay: (of_time_interval_t)delay; + afterDelay: (OFTimeInterval)delay; /** * @brief Performs the specified selector on the specified thread with the * specified objects after the specified delay. * @@ -1121,11 +1174,11 @@ - (void)performSelector: (SEL)selector onThread: (OFThread *)thread withObject: (nullable id)object1 withObject: (nullable id)object2 withObject: (nullable id)object3 - afterDelay: (of_time_interval_t)delay; + afterDelay: (OFTimeInterval)delay; /** * @brief Performs the specified selector on the specified thread with the * specified objects after the specified delay. * @@ -1145,11 +1198,11 @@ onThread: (OFThread *)thread withObject: (nullable id)object1 withObject: (nullable id)object2 withObject: (nullable id)object3 withObject: (nullable id)object4 - afterDelay: (of_time_interval_t)delay; + afterDelay: (OFTimeInterval)delay; # endif /** * @brief This method is called when @ref resolveClassMethod: or * @ref resolveInstanceMethod: returned false. It should return a target @@ -1225,11 +1278,11 @@ * @brief Compares the object to another object. * * @param object An object to compare the object to * @return The result of the comparison */ -- (of_comparison_result_t)compare: (id )object; +- (OFComparisonResult)compare: (id )object; @end #endif #ifdef __cplusplus extern "C" { @@ -1236,44 +1289,44 @@ #endif /** * @brief Allocates memory for the specified number of items of the specified * size. * - * To free the allocated memory, use `free()`. + * To free the allocated memory, use @ref OFFreeMemory. * * Throws @ref OFOutOfMemoryException if allocating failed and * @ref OFOutOfRangeException if the requested size exceeds the address space. * * @param count The number of items to allocate * @param size The size of each item to allocate * @return A pointer to the allocated memory. May return NULL if the specified * size or count is 0. */ -extern void *_Nullable of_alloc(size_t count, size_t size) +extern void *_Nullable OFAllocMemory(size_t count, size_t size) OF_WARN_UNUSED_RESULT; /** * @brief Allocates memory for the specified number of items of the specified * size and initializes it with zeros. * - * To free the allocated memory, use `free()`. + * To free the allocated memory, use @ref OFFreeMemory. * * Throws @ref OFOutOfMemoryException if allocating failed and * @ref OFOutOfRangeException if the requested size exceeds the address space. * * @param size The size of each item to allocate * @param count The number of items to allocate * @return A pointer to the allocated memory. May return NULL if the specified * size or count is 0. */ -extern void *_Nullable of_alloc_zeroed(size_t count, size_t size) +extern void *_Nullable OFAllocZeroedMemory(size_t count, size_t size) OF_WARN_UNUSED_RESULT; /** * @brief Resizes memory to the specified number of items of the specified size. * - * To free the allocated memory, use `free()`. + * To free the allocated memory, use @ref OFFreeMemory. * * If the pointer is NULL, this is equivalent to allocating memory. * If the size or number of items is 0, this is equivalent to freeing memory. * * Throws @ref OFOutOfMemoryException if allocating failed and @@ -1282,37 +1335,71 @@ * @param pointer A pointer to the already allocated memory * @param size The size of each item to resize to * @param count The number of items to resize to * @return A pointer to the resized memory chunk */ -extern void *_Nullable of_realloc(void *_Nullable pointer, size_t count, +extern void *_Nullable OFResizeMemory(void *_Nullable pointer, size_t count, size_t size) OF_WARN_UNUSED_RESULT; +/** + * @brief Frees memory allocated by @ref OFAllocMemory, @ref OFAllocZeroedMemory + * or @ref OFResizeMemory. + * + * @param pointer A pointer to the memory to free or nil (passing nil ooes + * nothing) + */ +extern void OFFreeMemory(void *_Nullable pointer); + #ifdef OF_APPLE_RUNTIME extern void *_Null_unspecified objc_autoreleasePoolPush(void); extern void objc_autoreleasePoolPop(void *_Null_unspecified pool); # ifndef __OBJC2__ extern id _Nullable objc_constructInstance(Class _Nullable class_, void *_Nullable bytes); extern void *_Nullable objc_destructInstance(id _Nullable object); # endif #endif -extern id of_alloc_object(Class class_, size_t extraSize, - size_t extraAlignment, void *_Nullable *_Nullable extra); -extern void OF_NO_RETURN_FUNC of_method_not_found(id self, SEL _cmd); -extern uint32_t of_hash_seed; -/* These do *NOT* provide cryptographically secure randomness! */ -extern uint16_t of_random16(void); -extern uint32_t of_random32(void); -extern uint64_t of_random64(void); +extern id OFAllocObject(Class class_, size_t extraSize, size_t extraAlignment, + void *_Nullable *_Nullable extra); +extern void OF_NO_RETURN_FUNC OFMethodNotFound(id self, SEL _cmd); + +/** + * @brief Returns 16 bit or non-cryptographical randomness. + * + * @return 16 bit or non-cryptographical randomness + */ +extern uint16_t OFRandom16(void); + +/** + * @brief Returns 32 bit or non-cryptographical randomness. + * + * @return 32 bit or non-cryptographical randomness + */ +extern uint32_t OFRandom32(void); + +/** + * @brief Returns 64 bit or non-cryptographical randomness. + * + * @return 64 bit or non-cryptographical randomness + */ +extern uint64_t OFRandom64(void); + +/** + * @brief Initializes the specified hash. + * + * @param hash A pointer to the hash to initialize + */ +extern void OFHashInit(unsigned long *_Nonnull hash); #ifdef __cplusplus } #endif OF_ASSUME_NONNULL_END + +#include "OFBlock.h" #ifdef __OBJC__ # import "OFObject+KeyValueCoding.h" # import "OFObject+Serialization.h" #endif #endif Index: src/OFObject.m ================================================================== --- src/OFObject.m +++ src/OFObject.m @@ -29,13 +29,20 @@ # include #endif #import "OFObject.h" #import "OFArray.h" +#ifdef OF_HAVE_ATOMIC_OPS +# import "OFAtomic.h" +#endif #import "OFLocale.h" #import "OFMethodSignature.h" #import "OFRunLoop.h" +#if !defined(OF_HAVE_ATOMIC_OPS) && defined(OF_HAVE_THREADS) +# import "OFPlainMutex.h" /* For OFSpinlock */ +#endif +#import "OFString.h" #import "OFThread.h" #import "OFTimer.h" #import "OFAllocFailedException.h" #import "OFEnumerationMutationException.h" @@ -58,48 +65,40 @@ #ifdef OF_AMIGAOS # include #endif -#import "OFString.h" - -#if defined(OF_HAVE_ATOMIC_OPS) -# import "atomic.h" -#elif defined(OF_HAVE_THREADS) -# import "mutex.h" -#endif - #ifdef OF_APPLE_RUNTIME extern id _Nullable _objc_rootAutorelease(id _Nullable object); #endif #if defined(OF_HAVE_FORWARDING_TARGET_FOR_SELECTOR) -extern id of_forward(id, SEL, ...); -extern struct stret of_forward_stret(id, SEL, ...); +extern id OFForward(id, SEL, ...); +extern struct stret OFForward_stret(id, SEL, ...); #else -# define of_forward of_method_not_found -# define of_forward_stret of_method_not_found_stret +# define OFForward OFMethodNotFound +# define OFForward_stret OFMethodNotFound_stret #endif -struct pre_ivar { +struct PreIvars { int retainCount; #if !defined(OF_HAVE_ATOMIC_OPS) && !defined(OF_AMIGAOS) - of_spinlock_t retainCountSpinlock; + OFSpinlock retainCountSpinlock; #endif }; -#define PRE_IVARS_ALIGN ((sizeof(struct pre_ivar) + \ +#define PRE_IVARS_ALIGN ((sizeof(struct PreIvars) + \ (OF_BIGGEST_ALIGNMENT - 1)) & ~(OF_BIGGEST_ALIGNMENT - 1)) -#define PRE_IVARS ((struct pre_ivar *)(void *)((char *)self - PRE_IVARS_ALIGN)) +#define PRE_IVARS ((struct PreIvars *)(void *)((char *)self - PRE_IVARS_ALIGN)) static struct { Class isa; } allocFailedException; -uint32_t of_hash_seed; +unsigned long OFHashSeed; void * -of_alloc(size_t count, size_t size) +OFAllocMemory(size_t count, size_t size) { void *pointer; if OF_UNLIKELY (count == 0 || size == 0) return NULL; @@ -113,11 +112,11 @@ return pointer; } void * -of_alloc_zeroed(size_t count, size_t size) +OFAllocZeroedMemory(size_t count, size_t size) { void *pointer; if OF_UNLIKELY (count == 0 || size == 0) return NULL; @@ -132,11 +131,11 @@ return pointer; } void * -of_realloc(void *pointer, size_t count, size_t size) +OFResizeMemory(void *pointer, size_t count, size_t size) { if OF_UNLIKELY (count == 0 || size == 0) return NULL; if OF_UNLIKELY (count > SIZE_MAX / size) @@ -146,10 +145,16 @@ @throw [OFOutOfMemoryException exceptionWithRequestedSize: size]; return pointer; } + +void +OFFreeMemory(void *pointer) +{ + free(pointer); +} #if !defined(HAVE_ARC4RANDOM) && !defined(HAVE_GETRANDOM) static void initRandom(void) { @@ -164,50 +169,49 @@ # endif } #endif uint16_t -of_random16(void) +OFRandom16(void) { #if defined(HAVE_ARC4RANDOM) return arc4random(); #elif defined(HAVE_GETRANDOM) uint16_t buffer; - OF_ENSURE(getrandom(&buffer, sizeof(buffer), 0) == sizeof(buffer)); + OFEnsure(getrandom(&buffer, sizeof(buffer), 0) == sizeof(buffer)); return buffer; #else - static of_once_t onceControl = OF_ONCE_INIT; - - of_once(&onceControl, initRandom); + static OFOnceControl onceControl = OFOnceControlInitValue; + OFOnce(&onceControl, initRandom); # ifdef HAVE_RANDOM return random() & 0xFFFF; # else return rand() & 0xFFFF; # endif #endif } uint32_t -of_random32(void) +OFRandom32(void) { #if defined(HAVE_ARC4RANDOM) return arc4random(); #elif defined(HAVE_GETRANDOM) uint32_t buffer; - OF_ENSURE(getrandom(&buffer, sizeof(buffer), 0) == sizeof(buffer)); + OFEnsure(getrandom(&buffer, sizeof(buffer), 0) == sizeof(buffer)); return buffer; #else - return ((uint32_t)of_random16() << 16) | of_random16(); + return ((uint32_t)OFRandom16() << 16) | OFRandom16(); #endif } uint64_t -of_random64(void) +OFRandom64(void) { #if defined(HAVE_ARC4RANDOM_BUF) uint64_t buffer; arc4random_buf(&buffer, sizeof(buffer)); @@ -214,17 +218,23 @@ return buffer; #elif defined(HAVE_GETRANDOM) uint64_t buffer; - OF_ENSURE(getrandom(&buffer, sizeof(buffer), 0) == sizeof(buffer)); + OFEnsure(getrandom(&buffer, sizeof(buffer), 0) == sizeof(buffer)); return buffer; #else - return ((uint64_t)of_random32() << 32) | of_random32(); + return ((uint64_t)OFRandom32() << 32) | OFRandom32(); #endif } + +void +OFHashInit(unsigned long *hash) +{ + *hash = OFHashSeed; +} static const char * typeEncodingForSelector(Class class, SEL selector) { Method method; @@ -239,11 +249,11 @@ static void uncaughtExceptionHandler(id exception) { OFString *description = [exception description]; OFArray *backtrace = nil; - of_string_encoding_t encoding = [OFLocale encoding]; + OFStringEncoding encoding = [OFLocale encoding]; fprintf(stderr, "\nRuntime error: Unhandled exception:\n%s\n", [description cStringWithEncoding: encoding]); if ([exception respondsToSelector: @selector(backtrace)]) @@ -264,11 +274,11 @@ { @throw [OFEnumerationMutationException exceptionWithObject: object]; } void OF_NO_RETURN_FUNC -of_method_not_found(id object, SEL selector) +OFMethodNotFound(id object, SEL selector) { [object doesNotRecognizeSelector: selector]; /* * Just in case doesNotRecognizeSelector: returned, even though it must @@ -278,17 +288,17 @@ OF_UNREACHABLE } void OF_NO_RETURN_FUNC -of_method_not_found_stret(void *stret, id object, SEL selector) +OFMethodNotFound_stret(void *stret, id object, SEL selector) { - of_method_not_found(object, selector); + OFMethodNotFound(object, selector); } id -of_alloc_object(Class class, size_t extraSize, size_t extraAlignment, +OFAllocObject(Class class, size_t extraSize, size_t extraAlignment, void **extra) { OFObject *instance; size_t instanceSize; @@ -304,15 +314,15 @@ if OF_UNLIKELY (instance == nil) { allocFailedException.isa = [OFAllocFailedException class]; @throw (id)&allocFailedException; } - ((struct pre_ivar *)instance)->retainCount = 1; + ((struct PreIvars *)instance)->retainCount = 1; #if !defined(OF_HAVE_ATOMIC_OPS) && !defined(OF_AMIGAOS) - if OF_UNLIKELY (of_spinlock_new( - &((struct pre_ivar *)instance)->retainCountSpinlock) != 0) { + if OF_UNLIKELY (OFSpinlockNew( + &((struct PreIvars *)instance)->retainCountSpinlock) != 0) { free(instance); @throw [OFInitializationFailedException exceptionWithClass: class]; } #endif @@ -361,25 +371,25 @@ * * Unfortunately, there is no way to check if a forward handler has * already been set, so this is the best we can do. */ if (dlsym(RTLD_DEFAULT, "NSFoundationVersionNumber") == NULL) - objc_setForwardHandler((void *)&of_forward, - (void *)&of_forward_stret); + objc_setForwardHandler((void *)&OFForward, + (void *)&OFForward_stret); #else - objc_setForwardHandler((IMP)&of_forward, (IMP)&of_forward_stret); + objc_setForwardHandler((IMP)&OFForward, (IMP)&OFForward_stret); #endif objc_setEnumerationMutationHandler(enumerationMutationHandler); do { - of_hash_seed = of_random32(); - } while (of_hash_seed == 0); + OFHashSeed = OFRandom32(); + } while (OFHashSeed == 0); #ifdef OF_OBJFW_RUNTIME objc_setTaggedPointerSecret(sizeof(uintptr_t) == 4 - ? (uintptr_t)of_random32() : (uintptr_t)of_random64()); + ? (uintptr_t)OFRandom32() : (uintptr_t)OFRandom64()); #endif } + (void)unload { @@ -389,11 +399,11 @@ { } + (instancetype)alloc { - return of_alloc_object(self, 0, 0, NULL); + return OFAllocObject(self, 0, 0, NULL); } + (instancetype)new { return [[self alloc] init]; @@ -405,11 +415,11 @@ } + (OFString *)className { return [OFString stringWithCString: class_getName(self) - encoding: OF_STRING_ENCODING_ASCII]; + encoding: OFStringEncodingASCII]; } + (bool)isSubclassOfClass: (Class)class { for (Class iter = self; iter != Nil; iter = class_getSuperclass(iter)) @@ -560,11 +570,11 @@ } - (OFString *)className { return [OFString stringWithCString: object_getClassName(self) - encoding: OF_STRING_ENCODING_ASCII]; + encoding: OFStringEncodingASCII]; } - (bool)isKindOfClass: (Class)class { for (Class iter = object_getClass(self); iter != Nil; @@ -663,11 +673,11 @@ #endif return imp(self, selector, object1, object2, object3, object4); } -- (void)performSelector: (SEL)selector afterDelay: (of_time_interval_t)delay +- (void)performSelector: (SEL)selector afterDelay: (OFTimeInterval)delay { void *pool = objc_autoreleasePoolPush(); [OFTimer scheduledTimerWithTimeInterval: delay target: self @@ -677,11 +687,11 @@ objc_autoreleasePoolPop(pool); } - (void)performSelector: (SEL)selector withObject: (id)object - afterDelay: (of_time_interval_t)delay + afterDelay: (OFTimeInterval)delay { void *pool = objc_autoreleasePoolPush(); [OFTimer scheduledTimerWithTimeInterval: delay target: self @@ -693,11 +703,11 @@ } - (void)performSelector: (SEL)selector withObject: (id)object1 withObject: (id)object2 - afterDelay: (of_time_interval_t)delay + afterDelay: (OFTimeInterval)delay { void *pool = objc_autoreleasePoolPush(); [OFTimer scheduledTimerWithTimeInterval: delay target: self @@ -711,11 +721,11 @@ - (void)performSelector: (SEL)selector withObject: (id)object1 withObject: (id)object2 withObject: (id)object3 - afterDelay: (of_time_interval_t)delay + afterDelay: (OFTimeInterval)delay { void *pool = objc_autoreleasePoolPush(); [OFTimer scheduledTimerWithTimeInterval: delay target: self @@ -731,11 +741,11 @@ - (void)performSelector: (SEL)selector withObject: (id)object1 withObject: (id)object2 withObject: (id)object3 withObject: (id)object4 - afterDelay: (of_time_interval_t)delay + afterDelay: (OFTimeInterval)delay { void *pool = objc_autoreleasePoolPush(); [OFTimer scheduledTimerWithTimeInterval: delay target: self @@ -955,11 +965,11 @@ objc_autoreleasePoolPop(pool); } - (void)performSelector: (SEL)selector onThread: (OFThread *)thread - afterDelay: (of_time_interval_t)delay + afterDelay: (OFTimeInterval)delay { void *pool = objc_autoreleasePoolPush(); [thread.runLoop addTimer: [OFTimer timerWithTimeInterval: delay target: self @@ -970,11 +980,11 @@ } - (void)performSelector: (SEL)selector onThread: (OFThread *)thread withObject: (id)object - afterDelay: (of_time_interval_t)delay + afterDelay: (OFTimeInterval)delay { void *pool = objc_autoreleasePoolPush(); [thread.runLoop addTimer: [OFTimer timerWithTimeInterval: delay target: self @@ -987,11 +997,11 @@ - (void)performSelector: (SEL)selector onThread: (OFThread *)thread withObject: (id)object1 withObject: (id)object2 - afterDelay: (of_time_interval_t)delay + afterDelay: (OFTimeInterval)delay { void *pool = objc_autoreleasePoolPush(); [thread.runLoop addTimer: [OFTimer timerWithTimeInterval: delay target: self @@ -1006,11 +1016,11 @@ - (void)performSelector: (SEL)selector onThread: (OFThread *)thread withObject: (id)object1 withObject: (id)object2 withObject: (id)object3 - afterDelay: (of_time_interval_t)delay + afterDelay: (OFTimeInterval)delay { void *pool = objc_autoreleasePoolPush(); [thread.runLoop addTimer: [OFTimer timerWithTimeInterval: delay target: self @@ -1027,11 +1037,11 @@ onThread: (OFThread *)thread withObject: (id)object1 withObject: (id)object2 withObject: (id)object3 withObject: (id)object4 - afterDelay: (of_time_interval_t)delay + afterDelay: (OFTimeInterval)delay { void *pool = objc_autoreleasePoolPush(); [thread.runLoop addTimer: [OFTimer timerWithTimeInterval: delay target: self @@ -1063,20 +1073,20 @@ } - (unsigned long)hash { uintptr_t ptr = (uintptr_t)self; - uint32_t hash; + unsigned long hash; - OF_HASH_INIT(hash); + OFHashInit(&hash); for (size_t i = 0; i < sizeof(ptr); i++) { - OF_HASH_ADD(hash, ptr & 0xFF); + OFHashAdd(&hash, ptr & 0xFF); ptr >>= 8; } - OF_HASH_FINALIZE(hash); + OFHashFinalize(&hash); return hash; } - (OFString *)description @@ -1098,11 +1108,11 @@ } - (instancetype)retain { #if defined(OF_HAVE_ATOMIC_OPS) - of_atomic_int_inc(&PRE_IVARS->retainCount); + OFAtomicIntIncrease(&PRE_IVARS->retainCount); #elif defined(OF_AMIGAOS) /* * On AmigaOS, we can only have one CPU. As increasing a variable is a * single instruction on M68K, we don't need Forbid() / Permit() on * M68K. @@ -1113,13 +1123,13 @@ PRE_IVARS->retainCount++; # ifndef OF_AMIGAOS_M68K Permit(); # endif #else - OF_ENSURE(of_spinlock_lock(&PRE_IVARS->retainCountSpinlock) == 0); + OFEnsure(OFSpinlockLock(&PRE_IVARS->retainCountSpinlock) == 0); PRE_IVARS->retainCount++; - OF_ENSURE(of_spinlock_unlock(&PRE_IVARS->retainCountSpinlock) == 0); + OFEnsure(OFSpinlockUnlock(&PRE_IVARS->retainCountSpinlock) == 0); #endif return self; } @@ -1130,14 +1140,14 @@ } - (void)release { #if defined(OF_HAVE_ATOMIC_OPS) - of_memory_barrier_release(); + OFReleaseMemoryBarrier(); - if (of_atomic_int_dec(&PRE_IVARS->retainCount) <= 0) { - of_memory_barrier_acquire(); + if (OFAtomicIntDecrease(&PRE_IVARS->retainCount) <= 0) { + OFAcquireMemoryBarrier(); [self dealloc]; } #elif defined(OF_AMIGAOS) int retainCount; @@ -1149,13 +1159,13 @@ if (retainCount == 0) [self dealloc]; #else int retainCount; - OF_ENSURE(of_spinlock_lock(&PRE_IVARS->retainCountSpinlock) == 0); + OFEnsure(OFSpinlockLock(&PRE_IVARS->retainCountSpinlock) == 0); retainCount = --PRE_IVARS->retainCount; - OF_ENSURE(of_spinlock_unlock(&PRE_IVARS->retainCountSpinlock) == 0); + OFEnsure(OFSpinlockUnlock(&PRE_IVARS->retainCountSpinlock) == 0); if (retainCount == 0) [self dealloc]; #endif } @@ -1231,11 +1241,11 @@ return self; } + (unsigned int)retainCount { - return OF_RETAIN_COUNT_MAX; + return OFMaxRetainCount; } + (void)release { } ADDED src/OFOnce.h Index: src/OFOnce.h ================================================================== --- src/OFOnce.h +++ src/OFOnce.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "objfw-defs.h" + +#include "platform.h" + +#if defined(OF_HAVE_PTHREADS) +# include +typedef pthread_once_t OFOnceControl; +# define OFOnceControlInitValue PTHREAD_ONCE_INIT +#elif defined(OF_HAVE_ATOMIC_OPS) +typedef volatile int OFOnceControl; +# define OFOnceControlInitValue 0 +#elif defined(OF_AMIGAOS) || !defined(OF_HAVE_THREADS) +typedef int OFOnceControl; +# define OFOnceControlInitValue 0 +#endif + +#ifdef __cplusplus +extern "C" { +#endif +extern void OFOnce(OFOnceControl *control, void (*func)(void)); +#ifdef __cplusplus +} +#endif ADDED src/OFOnce.m Index: src/OFOnce.m ================================================================== --- src/OFOnce.m +++ src/OFOnce.m @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#include + +#import "OFOnce.h" +#if defined(OF_HAVE_THREADS) && defined(OF_HAVE_ATOMIC_OPS) +# import "OFAtomic.h" +# import "OFPlainMutex.h" +#endif + +#ifdef OF_AMIGAOS +# include +#endif + +void +OFOnce(OFOnceControl *control, void (*func)(void)) +{ +#if !defined(OF_HAVE_THREADS) + if (*control == 0) { + func(); + *control = 1; + } +#elif defined(OF_HAVE_PTHREADS) + pthread_once(control, func); +#elif defined(OF_HAVE_ATOMIC_OPS) + /* Avoid atomic operations in case it's already done. */ + if (*control == 2) + return; + + if (OFAtomicIntCompareAndSwap(control, 0, 1)) { + func(); + + OFMemoryBarrier(); + + OFAtomicIntIncrease(control); + } else + while (*control == 1) + OFYieldThread(); +#elif defined(OF_AMIGAOS) + bool run = false; + + /* Avoid Forbid() in case it's already done. */ + if (*control == 2) + return; + + Forbid(); + + switch (*control) { + case 0: + *control = 1; + run = true; + break; + case 1: + while (*control == 1) { + Permit(); + Forbid(); + } + } + + Permit(); + + if (run) { + func(); + *control = 2; + } +#else +# error No OFOnce available +#endif +} Index: src/OFOptionsParser.h ================================================================== --- src/OFOptionsParser.h +++ src/OFOptionsParser.h @@ -19,17 +19,17 @@ @class OFMapTable; OF_ASSUME_NONNULL_BEGIN /** - * @struct of_options_parser_option_t OFOptionsParser.h ObjFW/OFOptionsParser.h + * @struct OFOptionsParserOption OFOptionsParser.h ObjFW/OFOptionsParser.h * * @brief An option which can be parsed by an @ref OFOptionsParser. */ -struct of_options_parser_option_t { +typedef struct { /** The short version (e.g. `-v`) of the option or `\0` for none. */ - of_unichar_t shortOption; + OFUnichar shortOption; /** * The long version (e.g. `--verbose`) of the option or `nil` for none. */ OFString *__unsafe_unretained _Nullable longOption; @@ -55,26 +55,25 @@ /** * An optional pointer to an `OFString *` that is set to the * argument specified for the option or `nil` for no argument. */ OFString *__autoreleasing _Nullable *_Nullable argumentPtr; -}; -typedef struct of_options_parser_option_t of_options_parser_option_t; +} OFOptionsParserOption; /** * @class OFOptionsParser OFOptionsParser.h ObjFW/OFOptionsParser.h * * @brief A class for parsing the program options specified on the command line. */ OF_SUBCLASSING_RESTRICTED @interface OFOptionsParser: OFObject { - of_options_parser_option_t *_options; + OFOptionsParserOption *_options; OFMapTable *_longOptions; OFArray OF_GENERIC(OFString *) *_arguments; size_t _index, _subIndex; - of_unichar_t _lastOption; + OFUnichar _lastOption; OFString *_Nullable _lastLongOption, *_Nullable _argument; bool _done; } /** @@ -83,11 +82,11 @@ * If @ref nextOption returned `?` or `:`, this returns the option which was * unknown or for which the argument was missing.@n * If this returns `-`, the last option is only available as a long option (see * lastLongOption). */ -@property (readonly, nonatomic) of_unichar_t lastOption; +@property (readonly, nonatomic) OFUnichar lastOption; /** * @brief The long option for the last parsed option, or `nil` if the last * parsed option was not passed as a long option by the user. * @@ -117,31 +116,31 @@ OFArray OF_GENERIC(OFString *) *remainingArguments; /** * @brief Creates a new OFOptionsParser which accepts the specified options. * - * @param options An array of @ref of_options_parser_option_t specifying all + * @param options An array of @ref OFOptionsParserOption specifying all * accepted options, terminated with an option whose short * option is `\0` and long option is `nil`. * * @return A new, autoreleased OFOptionsParser */ -+ (instancetype)parserWithOptions: (const of_options_parser_option_t *)options; ++ (instancetype)parserWithOptions: (const OFOptionsParserOption *)options; - (instancetype)init OF_UNAVAILABLE; /** * @brief Initializes an already allocated OFOptionsParser so that it accepts * the specified options. * - * @param options An array of @ref of_options_parser_option_t specifying all + * @param options An array of @ref OFOptionsParserOption specifying all * accepted options, terminated with an option whose short * option is `\0` and long option is `nil`. * * @return An initialized OFOptionsParser */ -- (instancetype)initWithOptions: (const of_options_parser_option_t *)options +- (instancetype)initWithOptions: (const OFOptionsParserOption *)options OF_DESIGNATED_INITIALIZER; /** * @brief Returns the next option. * @@ -158,9 +157,9 @@ * make sure all options have been parsed, even if you only rely on the * optional pointers specified and don't do any parsing yourself. * * @return The next option */ -- (of_unichar_t)nextOption; +- (OFUnichar)nextOption; @end OF_ASSUME_NONNULL_END Index: src/OFOptionsParser.m ================================================================== --- src/OFOptionsParser.m +++ src/OFOptionsParser.m @@ -36,33 +36,33 @@ @implementation OFOptionsParser @synthesize lastOption = _lastOption, lastLongOption = _lastLongOption; @synthesize argument = _argument; -+ (instancetype)parserWithOptions: (const of_options_parser_option_t *)options ++ (instancetype)parserWithOptions: (const OFOptionsParserOption *)options { return [[[self alloc] initWithOptions: options] autorelease]; } - (instancetype)init { OF_INVALID_INIT_METHOD } -- (instancetype)initWithOptions: (const of_options_parser_option_t *)options +- (instancetype)initWithOptions: (const OFOptionsParserOption *)options { self = [super init]; @try { size_t count = 0; - const of_options_parser_option_t *iter; - of_options_parser_option_t *iter2; - const of_map_table_functions_t keyFunctions = { + const OFOptionsParserOption *iter; + OFOptionsParserOption *iter2; + const OFMapTableFunctions keyFunctions = { .hash = stringHash, .equal = stringEqual }; - const of_map_table_functions_t objectFunctions = { NULL }; + const OFMapTableFunctions objectFunctions = { NULL }; /* Count, sanity check, initialize pointers */ for (iter = options; iter->shortOption != '\0' || iter->longOption != nil; iter++) { @@ -82,11 +82,11 @@ *iter->argumentPtr = nil; count++; } - _options = of_alloc(count + 1, sizeof(*_options)); + _options = OFAllocMemory(count + 1, sizeof(*_options)); _longOptions = [[OFMapTable alloc] initWithKeyFunctions: keyFunctions objectFunctions: objectFunctions]; for (iter = options, iter2 = _options; @@ -139,27 +139,27 @@ } - (void)dealloc { if (_options != NULL) - for (of_options_parser_option_t *iter = _options; + for (OFOptionsParserOption *iter = _options; iter->shortOption != '\0' || iter->longOption != nil; iter++) [iter->longOption release]; - free(_options); + OFFreeMemory(_options); [_longOptions release]; [_arguments release]; [_argument release]; [super dealloc]; } -- (of_unichar_t)nextOption +- (OFUnichar)nextOption { - of_options_parser_option_t *iter; + OFOptionsParserOption *iter; OFString *argument; if (_done || _index >= _arguments.count) return '\0'; @@ -184,24 +184,24 @@ } if ([argument hasPrefix: @"--"]) { void *pool = objc_autoreleasePoolPush(); size_t pos; - of_options_parser_option_t *option; + OFOptionsParserOption *option; _lastOption = '-'; _index++; if ((pos = [argument rangeOfString: @"="].location) != - OF_NOT_FOUND) + OFNotFound) _argument = [[argument substringFromIndex: pos + 1] copy]; else pos = argument.length; _lastLongOption = [[argument substringWithRange: - of_range(2, pos - 2)] copy]; + OFRangeMake(2, pos - 2)] copy]; objc_autoreleasePoolPop(pool); option = [_longOptions objectForKey: _lastLongOption]; if (option == NULL) @@ -269,8 +269,8 @@ } - (OFArray *)remainingArguments { return [_arguments objectsInRange: - of_range(_index, _arguments.count - _index)]; + OFRangeMake(_index, _arguments.count - _index)]; } @end ADDED src/OFPBKDF2.h Index: src/OFPBKDF2.h ================================================================== --- src/OFPBKDF2.h +++ src/OFPBKDF2.h @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#ifndef __STDC_LIMIT_MACROS +# define __STDC_LIMIT_MACROS +#endif +#ifndef __STDC_CONSTANT_MACROS +# define __STDC_CONSTANT_MACROS +#endif + +#import "macros.h" + +OF_ASSUME_NONNULL_BEGIN + +/** @file */ + +@class OFHMAC; + +/** + * @brief The parameters for @ref OFPBKDF2. + */ +typedef struct { + /** @brief The HMAC to use to derive a key. */ + __unsafe_unretained OFHMAC *HMAC; + /** @brief The number of iterations to perform. */ + size_t iterations; + /** @brief The salt to derive a key with. */ + const unsigned char *salt; + /** @brief The length of the salt. */ + size_t saltLength; + /** @brief The password to derive a key from. */ + const char *password; + /** @brief The length of the password. */ + size_t passwordLength; + /** @brief The buffer to write the key to. */ + unsigned char *key; + /** + * @brief The desired length for the derived key. + * + * @ref key needs to have enough storage. + */ + size_t keyLength; + /** @brief Whether data may be stored in swappable memory. */ + bool allowsSwappableMemory; +} OFPBKDF2Parameters; + +#ifdef __cplusplus +extern "C" { +#endif +/** + * @brief Derives a key from a password and a salt using PBKDF2. + * + * @note This will call @ref OFHMAC::reset on the `HMAC` first, making it + * possible to reuse the `HMAC`, but also meaning all previous results + * from the `HMAC` get invalidated if they have not been copied. + * + * @param param The parameters to use + */ +extern void OFPBKDF2(OFPBKDF2Parameters param); +#ifdef __cplusplus +} +#endif + +OF_ASSUME_NONNULL_END ADDED src/OFPBKDF2.m Index: src/OFPBKDF2.m ================================================================== --- src/OFPBKDF2.m +++ src/OFPBKDF2.m @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#include + +#import "OFPBKDF2.h" +#import "OFHMAC.h" +#import "OFSecureData.h" + +#import "OFInvalidArgumentException.h" +#import "OFOutOfMemoryException.h" +#import "OFOutOfRangeException.h" + +void +OFPBKDF2(OFPBKDF2Parameters param) +{ + void *pool = objc_autoreleasePoolPush(); + size_t blocks, digestSize = param.HMAC.digestSize; + OFSecureData *buffer = [OFSecureData + dataWithCount: digestSize + allowsSwappableMemory: param.allowsSwappableMemory]; + OFSecureData *digest = [OFSecureData + dataWithCount: digestSize + allowsSwappableMemory: param.allowsSwappableMemory]; + unsigned char *bufferItems = buffer.mutableItems; + unsigned char *digestItems = digest.mutableItems; + OFSecureData *extendedSalt; + unsigned char *extendedSaltItems; + + if (param.HMAC == nil || param.iterations == 0 || param.salt == NULL || + param.password == NULL || param.key == NULL || param.keyLength == 0) + @throw [OFInvalidArgumentException exception]; + + blocks = param.keyLength / digestSize; + if (param.keyLength % digestSize != 0) + blocks++; + + if (param.saltLength > SIZE_MAX - 4 || blocks > UINT32_MAX) + @throw [OFOutOfRangeException exception]; + + extendedSalt = [OFSecureData + dataWithCount: param.saltLength + 4 + allowsSwappableMemory: param.allowsSwappableMemory]; + extendedSaltItems = extendedSalt.mutableItems; + + @try { + uint32_t i = OFToBigEndian32(1); + + [param.HMAC setKey: param.password + length: param.passwordLength]; + + memcpy(extendedSaltItems, param.salt, param.saltLength); + + while (param.keyLength > 0) { + size_t length; + + memcpy(extendedSaltItems + param.saltLength, &i, 4); + + [param.HMAC reset]; + [param.HMAC updateWithBuffer: extendedSaltItems + length: param.saltLength + 4]; + memcpy(bufferItems, param.HMAC.digest, digestSize); + memcpy(digestItems, param.HMAC.digest, digestSize); + + for (size_t j = 1; j < param.iterations; j++) { + [param.HMAC reset]; + [param.HMAC updateWithBuffer: digestItems + length: digestSize]; + memcpy(digestItems, param.HMAC.digest, + digestSize); + + for (size_t k = 0; k < digestSize; k++) + bufferItems[k] ^= digestItems[k]; + } + + length = digestSize; + if (length > param.keyLength) + length = param.keyLength; + + memcpy(param.key, bufferItems, length); + param.key += length; + param.keyLength -= length; + + i = OFToBigEndian32(OFFromBigEndian32(i) + 1); + } + } @catch (id e) { + [extendedSalt zero]; + [buffer zero]; + [digest zero]; + + @throw e; + } @finally { + [param.HMAC zero]; + } + + objc_autoreleasePoolPop(pool); +} Index: src/OFPair.m ================================================================== --- src/OFPair.m +++ src/OFPair.m @@ -83,18 +83,18 @@ return true; } - (unsigned long)hash { - uint32_t hash; - - OF_HASH_INIT(hash); - - OF_HASH_ADD_HASH(hash, [_firstObject hash]); - OF_HASH_ADD_HASH(hash, [_secondObject hash]); - - OF_HASH_FINALIZE(hash); + unsigned long hash; + + OFHashInit(&hash); + + OFHashAddHash(&hash, [_firstObject hash]); + OFHashAddHash(&hash, [_secondObject hash]); + + OFHashFinalize(&hash); return hash; } - (id)copy ADDED src/OFPlainCondition.h Index: src/OFPlainCondition.h ================================================================== --- src/OFPlainCondition.h +++ src/OFPlainCondition.h @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "objfw-defs.h" + +#include "platform.h" + +#if !defined(OF_HAVE_THREADS) || \ + (!defined(OF_HAVE_PTHREADS) && !defined(OF_WINDOWS) && !defined(OF_AMIGAOS)) +# error No conditions available! +#endif + +/* For OFTimeInterval */ +#import "OFObject.h" +#import "OFPlainMutex.h" + +#if defined(OF_HAVE_PTHREADS) +# include +typedef pthread_cond_t OFPlainCondition; +#elif defined(OF_WINDOWS) +# include +typedef struct { + HANDLE event; + volatile int count; +} OFPlainCondition; +#elif defined(OF_AMIGAOS) +# include +typedef struct { + struct OFPlainConditionWaitingTask { + struct Task *task; + unsigned char sigBit; + struct OFPlainConditionWaitingTask *next; + } *waitingTasks; +} OFPlainCondition; +#endif + +#ifdef __cplusplus +extern "C" { +#endif +extern int OFPlainConditionNew(OFPlainCondition *condition); +extern int OFPlainConditionSignal(OFPlainCondition *condition); +extern int OFPlainConditionBroadcast(OFPlainCondition *condition); +extern int OFPlainConditionWait(OFPlainCondition *condition, + OFPlainMutex *mutex); +extern int OFPlainConditionTimedWait(OFPlainCondition *condition, + OFPlainMutex *mutex, OFTimeInterval timeout); +#ifdef OF_AMIGAOS +extern int OFPlainConditionWaitOrExecSignal(OFPlainCondition *condition, + OFPlainMutex *mutex, ULONG *signalMask); +extern int OFPlainConditionTimedWaitOrExecSignal(OFPlainCondition *condition, + OFPlainMutex *mutex, OFTimeInterval timeout, ULONG *signalMask); +#endif +extern int OFPlainConditionFree(OFPlainCondition *condition); +#ifdef __cplusplus +} +#endif ADDED src/OFPlainCondition.m Index: src/OFPlainCondition.m ================================================================== --- src/OFPlainCondition.m +++ src/OFPlainCondition.m @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#include "platform.h" + +#if defined(OF_HAVE_PTHREADS) +# include "platform/posix/OFPlainCondition.m" +#elif defined(OF_WINDOWS) +# include "platform/windows/OFPlainCondition.m" +#elif defined(OF_AMIGAOS) +# include "platform/amiga/OFPlainCondition.m" +#endif ADDED src/OFPlainMutex.h Index: src/OFPlainMutex.h ================================================================== --- src/OFPlainMutex.h +++ src/OFPlainMutex.h @@ -0,0 +1,170 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "objfw-defs.h" + +#include + +#include "platform.h" + +#if !defined(OF_HAVE_THREADS) || \ + (!defined(OF_HAVE_PTHREADS) && !defined(OF_WINDOWS) && !defined(OF_AMIGAOS)) +# error No mutexes available! +#endif + +#import "macros.h" + +#if defined(OF_HAVE_PTHREADS) +# include +typedef pthread_mutex_t OFPlainMutex; +#elif defined(OF_WINDOWS) +# include +typedef CRITICAL_SECTION OFPlainMutex; +#elif defined(OF_AMIGAOS) +# include +typedef struct SignalSemaphore OFPlainMutex; +#endif + +#if defined(OF_HAVE_ATOMIC_OPS) +# import "OFAtomic.h" +typedef volatile int OFSpinlock; +#elif defined(OF_HAVE_PTHREAD_SPINLOCKS) +typedef pthread_spinlock_t OFSpinlock; +#else +typedef OFPlainMutex OFSpinlock; +#endif + +#ifdef OF_HAVE_SCHED_YIELD +# include +#endif + +#if defined(OF_HAVE_RECURSIVE_PTHREAD_MUTEXES) || defined(OF_WINDOWS) || \ + defined(OF_AMIGAOS) +# define OFPlainRecursiveMutex OFPlainMutex +#else +# import "OFTLSKey.h" +typedef struct { + OFPlainMutex mutex; + OFTLSKey count; +} OFPlainRecursiveMutex; +#endif + +#ifdef __cplusplus +extern "C" { +#endif +extern int OFPlainMutexNew(OFPlainMutex *mutex); +extern int OFPlainMutexLock(OFPlainMutex *mutex); +extern int OFPlainMutexTryLock(OFPlainMutex *mutex); +extern int OFPlainMutexUnlock(OFPlainMutex *mutex); +extern int OFPlainMutexFree(OFPlainMutex *mutex); +extern int OFPlainRecursiveMutexNew(OFPlainRecursiveMutex *rmutex); +extern int OFPlainRecursiveMutexLock(OFPlainRecursiveMutex *rmutex); +extern int OFPlainRecursiveMutexTryLock(OFPlainRecursiveMutex *rmutex); +extern int OFPlainRecursiveMutexUnlock(OFPlainRecursiveMutex *rmutex); +extern int OFPlainRecursiveMutexFree(OFPlainRecursiveMutex *rmutex); +#ifdef __cplusplus +} +#endif + +/* Spinlocks are inlined for performance. */ + +static OF_INLINE void +OFYieldThread(void) +{ +#if defined(OF_HAVE_SCHED_YIELD) + sched_yield(); +#elif defined(OF_WINDOWS) + Sleep(0); +#endif +} + +static OF_INLINE int +OFSpinlockNew(OFSpinlock *spinlock) +{ +#if defined(OF_HAVE_ATOMIC_OPS) + *spinlock = 0; + return 0; +#elif defined(OF_HAVE_PTHREAD_SPINLOCKS) + return pthread_spin_init(spinlock, 0); +#else + return OFPlainMutexNew(spinlock); +#endif +} + +static OF_INLINE int +OFSpinlockTryLock(OFSpinlock *spinlock) +{ +#if defined(OF_HAVE_ATOMIC_OPS) + if (OFAtomicIntCompareAndSwap(spinlock, 0, 1)) { + OFAcquireMemoryBarrier(); + return 0; + } + + return EBUSY; +#elif defined(OF_HAVE_PTHREAD_SPINLOCKS) + return pthread_spin_trylock(spinlock); +#else + return OFPlainMutexTryLock(spinlock); +#endif +} + +static OF_INLINE int +OFSpinlockLock(OFSpinlock *spinlock) +{ +#if defined(OF_HAVE_ATOMIC_OPS) + size_t i; + + for (i = 0; i < 10; i++) + if (OFSpinlockTryLock(spinlock) == 0) + return 0; + + while (OFSpinlockTryLock(spinlock) == EBUSY) + OFYieldThread(); + + return 0; +#elif defined(OF_HAVE_PTHREAD_SPINLOCKS) + return pthread_spin_lock(spinlock); +#else + return OFPlainMutexLock(spinlock); +#endif +} + +static OF_INLINE int +OFSpinlockUnlock(OFSpinlock *spinlock) +{ +#if defined(OF_HAVE_ATOMIC_OPS) + bool ret = OFAtomicIntCompareAndSwap(spinlock, 1, 0); + + OFReleaseMemoryBarrier(); + + return (ret ? 0 : EINVAL); +#elif defined(OF_HAVE_PTHREAD_SPINLOCKS) + return pthread_spin_unlock(spinlock); +#else + return OFPlainMutexUnlock(spinlock); +#endif +} + +static OF_INLINE int +OFSpinlockFree(OFSpinlock *spinlock) +{ +#if defined(OF_HAVE_ATOMIC_OPS) + return 0; +#elif defined(OF_HAVE_PTHREAD_SPINLOCKS) + return pthread_spin_destroy(spinlock); +#else + return OFPlainMutexFree(spinlock); +#endif +} ADDED src/OFPlainMutex.m Index: src/OFPlainMutex.m ================================================================== --- src/OFPlainMutex.m +++ src/OFPlainMutex.m @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#include "platform.h" + +#if defined(OF_HAVE_PTHREADS) +# include "platform/posix/OFPlainMutex.m" +#elif defined(OF_WINDOWS) +# include "platform/windows/OFPlainMutex.m" +#elif defined(OF_AMIGAOS) +# include "platform/amiga/OFPlainMutex.m" +#endif ADDED src/OFPlainThread.h Index: src/OFPlainThread.h ================================================================== --- src/OFPlainThread.h +++ src/OFPlainThread.h @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "objfw-defs.h" + +#include "platform.h" + +#if !defined(OF_HAVE_THREADS) || \ + (!defined(OF_HAVE_PTHREADS) && !defined(OF_WINDOWS) && !defined(OF_AMIGAOS)) +# error No threads available! +#endif + +#import "macros.h" + +#if defined(OF_HAVE_PTHREADS) +# include +typedef pthread_t OFPlainThread; +#elif defined(OF_WINDOWS) +# include +typedef HANDLE OFPlainThread; +#elif defined(OF_AMIGAOS) +# include +# include +typedef struct { + struct Task *task; + void (*function)(id); + id object; + struct SignalSemaphore semaphore; + struct Task *joinTask; + unsigned char joinSigBit; + bool detached, done; +} *OFPlainThread; +#endif + +typedef struct { + float priority; + size_t stackSize; +} OFPlainThreadAttributes; + +#if defined(OF_HAVE_PTHREADS) +static OF_INLINE OFPlainThread +OFCurrentPlainThread(void) +{ + return pthread_self(); +} + +static OF_INLINE bool +OFPlainThreadIsCurrent(OFPlainThread thread) +{ + return pthread_equal(thread, pthread_self()); +} +#elif defined(OF_WINDOWS) +static OF_INLINE OFPlainThread +OFCurrentPlainThread(void) +{ + return GetCurrentThread(); +} + +static OF_INLINE bool +OFPlainThreadIsCurrent(OFPlainThread thread) +{ + return (thread == GetCurrentThread()); +} +#elif defined(OF_AMIGAOS) +extern OFPlainThread OFCurrentPlainThread(void); + +static OF_INLINE bool +OFPlainThreadIsCurrent(OFPlainThread thread) +{ + return (thread->thread == FindTask(NULL)); +} +#endif + +#ifdef __cplusplus +extern "C" { +#endif +extern int OFPlainThreadAttributesInit(OFPlainThreadAttributes *attr); +extern int OFPlainThreadNew(OFPlainThread *thread, const char *name, + void (*function)(id), id object, const OFPlainThreadAttributes *attr); +extern void OFSetThreadName(const char *name); +extern int OFPlainThreadJoin(OFPlainThread thread); +extern int OFPlainThreadDetach(OFPlainThread thread); +#ifdef __cplusplus +} +#endif ADDED src/OFPlainThread.m Index: src/OFPlainThread.m ================================================================== --- src/OFPlainThread.m +++ src/OFPlainThread.m @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#include "platform.h" + +#if defined(OF_HAVE_PTHREADS) +# include "platform/posix/OFPlainThread.m" +#elif defined(OF_WINDOWS) +# include "platform/windows/OFPlainThread.m" +#elif defined(OF_AMIGAOS) +# include "platform/amiga/OFPlainThread.m" +#endif Index: src/OFPlugin.h ================================================================== --- src/OFPlugin.h +++ src/OFPlugin.h @@ -17,30 +17,40 @@ @class OFString; #ifndef OF_WINDOWS # include -# define OF_RTLD_LAZY RTLD_LAZY -# define OF_RTLD_NOW RTLD_NOW -typedef void *of_plugin_handle_t; +typedef void *OFPluginHandle; + +typedef enum { + OFDLOpenFlagLazy = RTLD_LAZY, + OFDLOpenFlagNow = RTLD_NOW +} OFDLOpenFlags; #else # include -# define OF_RTLD_LAZY 0 -# define OF_RTLD_NOW 0 -typedef HMODULE of_plugin_handle_t; +typedef HMODULE OFPluginHandle; + +typedef enum { + OFDLOpenFlagLazy = 0, + OFDLOpenFlagNow = 0 +} OFDLOpenFlags; #endif OF_ASSUME_NONNULL_BEGIN /** * @class OFPlugin OFPlugin.h ObjFW/OFPlugin.h * * @brief Provides a system for loading plugins at runtime. + * + * A plugin must subclass @ref OFPlugin and have a global function called + * `OFPluginInit`, which returns an instance of the @ref OFPlugin subclass and + * takes no parameters. */ @interface OFPlugin: OFObject { - of_plugin_handle_t _pluginHandle; + OFPluginHandle _pluginHandle; OF_RESERVE_IVARS(OFPlugin, 4) } /** * @brief Loads a plugin from a file. @@ -52,14 +62,14 @@ @end #ifdef __cplusplus extern "C" { #endif -extern of_plugin_handle_t of_dlopen(OFString *path, int flags); -extern void *of_dlsym(of_plugin_handle_t handle, const char *symbol); -extern OFString *_Nullable of_dlerror(void); -extern void of_dlclose(of_plugin_handle_t handle); +extern OFPluginHandle OFDLOpen(OFString *path, OFDLOpenFlags flags); +extern void *OFDLSym(OFPluginHandle handle, const char *symbol); +extern OFString *_Nullable OFDLError(void); +extern void OFDLClose(OFPluginHandle handle); #ifdef __cplusplus } #endif OF_ASSUME_NONNULL_END Index: src/OFPlugin.m ================================================================== --- src/OFPlugin.m +++ src/OFPlugin.m @@ -28,14 +28,14 @@ #import "OFSystemInfo.h" #import "OFInitializationFailedException.h" #import "OFLoadPluginFailedException.h" -typedef OFPlugin *(*init_plugin_t)(void); +typedef OFPlugin *(*PluginInit)(void); -of_plugin_handle_t -of_dlopen(OFString *path, int flags) +OFPluginHandle +OFDLOpen(OFString *path, OFDLOpenFlags flags) { #ifndef OF_WINDOWS return dlopen([path cStringWithEncoding: [OFLocale encoding]], flags); #else if (path == nil) @@ -48,31 +48,31 @@ [path cStringWithEncoding: [OFLocale encoding]]); #endif } void * -of_dlsym(of_plugin_handle_t handle, const char *symbol) +OFDLSym(OFPluginHandle handle, const char *symbol) { #ifndef OF_WINDOWS return dlsym(handle, symbol); #else return (void *)(uintptr_t)GetProcAddress(handle, symbol); #endif } void -of_dlclose(of_plugin_handle_t handle) +OFDLClose(OFPluginHandle handle) { #ifndef OF_WINDOWS dlclose(handle); #else FreeLibrary(handle); #endif } OFString * -of_dlerror(void) +OFDLError(void) { #ifndef OF_WINDOWS return [OFString stringWithCString: dlerror() encoding: [OFLocale encoding]]; #else @@ -82,12 +82,12 @@ @implementation OFPlugin + (id)pluginWithPath: (OFString *)path { void *pool = objc_autoreleasePoolPush(); - of_plugin_handle_t handle; - init_plugin_t initPlugin; + OFPluginHandle handle; + PluginInit initPlugin; OFPlugin *plugin; #if defined(OF_MACOS) path = [path stringByAppendingFormat: @".bundle/Contents/MacOS/%@", path.lastPathComponent]; @@ -96,20 +96,20 @@ path.lastPathComponent]; #else path = [path stringByAppendingString: @PLUGIN_SUFFIX]; #endif - if ((handle = of_dlopen(path, OF_RTLD_LAZY)) == NULL) + if ((handle = OFDLOpen(path, OFDLOpenFlagLazy)) == NULL) @throw [OFLoadPluginFailedException exceptionWithPath: path - error: of_dlerror()]; + error: OFDLError()]; objc_autoreleasePoolPop(pool); - initPlugin = (init_plugin_t)(uintptr_t)of_dlsym(handle, "init_plugin"); - if (initPlugin == (init_plugin_t)0 || (plugin = initPlugin()) == nil) { - of_dlclose(handle); + initPlugin = (PluginInit)(uintptr_t)OFDLSym(handle, "OFPluginInit"); + if (initPlugin == (PluginInit)0 || (plugin = initPlugin()) == nil) { + OFDLClose(handle); @throw [OFInitializationFailedException exceptionWithClass: self]; } plugin->_pluginHandle = handle; @@ -132,12 +132,12 @@ return [super init]; } - (void)dealloc { - of_plugin_handle_t h = _pluginHandle; + OFPluginHandle h = _pluginHandle; [super dealloc]; - of_dlclose(h); + OFDLClose(h); } @end Index: src/OFPointValue.h ================================================================== --- src/OFPointValue.h +++ src/OFPointValue.h @@ -17,10 +17,12 @@ OF_ASSUME_NONNULL_BEGIN @interface OFPointValue: OFValue { - of_point_t _point; + OFPoint _point; } + +- (instancetype)initWithPoint: (OFPoint)point; @end OF_ASSUME_NONNULL_END Index: src/OFPointValue.m ================================================================== --- src/OFPointValue.m +++ src/OFPointValue.m @@ -20,11 +20,11 @@ #import "OFOutOfRangeException.h" @implementation OFPointValue @synthesize pointValue = _point; -- (instancetype)initWithPoint: (of_point_t)point +- (instancetype)initWithPoint: (OFPoint)point { self = [super init]; _point = point; @@ -31,11 +31,11 @@ return self; } - (const char *)objCType { - return @encode(of_point_t); + return @encode(OFPoint); } - (void)getValue: (void *)value size: (size_t)size { if (size != sizeof(_point)) @@ -45,8 +45,8 @@ } - (OFString *)description { return [OFString stringWithFormat: - @"", _point.x, _point.y]; + @"", _point.x, _point.y]; } @end Index: src/OFPointerValue.h ================================================================== --- src/OFPointerValue.h +++ src/OFPointerValue.h @@ -19,8 +19,10 @@ @interface OFPointerValue: OFValue { void *_pointer; } + +- (instancetype)initWithPointer: (const void *)pointer; @end OF_ASSUME_NONNULL_END Index: src/OFPollKernelEventObserver.m ================================================================== --- src/OFPollKernelEventObserver.m +++ src/OFPollKernelEventObserver.m @@ -24,16 +24,15 @@ # include #endif #import "OFPollKernelEventObserver.h" #import "OFData.h" +#import "OFSocket+Private.h" #import "OFObserveFailedException.h" #import "OFOutOfRangeException.h" -#import "socket_helpers.h" - #ifdef OF_WII # define pollfd pollsd # define fd socket #endif @@ -48,11 +47,11 @@ _FDs = [[OFMutableData alloc] initWithItemSize: sizeof(struct pollfd)]; [_FDs addItem: &p]; _maxFD = _cancelFD[0]; - _FDToObject = of_alloc((size_t)_maxFD + 1, sizeof(id)); + _FDToObject = OFAllocMemory((size_t)_maxFD + 1, sizeof(id)); } @catch (id e) { [self release]; @throw e; } @@ -60,11 +59,11 @@ } - (void)dealloc { [_FDs release]; - free(_FDToObject); + OFFreeMemory(_FDToObject); [super dealloc]; } static void @@ -93,11 +92,11 @@ if (!found) { struct pollfd p = { fd, events, 0 }; if (fd > self->_maxFD) { self->_maxFD = fd; - self->_FDToObject = of_realloc(self->_FDToObject, + self->_FDToObject = OFResizeMemory(self->_FDToObject, (size_t)self->_maxFD + 1, sizeof(id)); } self->_FDToObject[fd] = object; [self->_FDs addItem: &p]; @@ -160,11 +159,11 @@ removeObject(self, object, object.fileDescriptorForWriting, POLLOUT); [super removeObjectForWriting: object]; } -- (void)observeForTimeInterval: (of_time_interval_t)timeInterval +- (void)observeForTimeInterval: (OFTimeInterval)timeInterval { void *pool; struct pollfd *FDs; int events; size_t nFDs; @@ -197,14 +196,14 @@ if (FDs[i].fd == _cancelFD[0]) { char buffer; #ifdef OF_HAVE_PIPE - OF_ENSURE(read(_cancelFD[0], &buffer, 1) == 1); + OFEnsure(read(_cancelFD[0], &buffer, 1) == 1); #else - OF_ENSURE(recvfrom(_cancelFD[0], &buffer, 1, - 0, NULL, NULL) == 1); + OFEnsure(recvfrom(_cancelFD[0], &buffer, 1, 0, + NULL, NULL) == 1); #endif FDs[i].revents = 0; continue; } Index: src/OFRIPEMD160Hash.h ================================================================== --- src/OFRIPEMD160Hash.h +++ src/OFRIPEMD160Hash.h @@ -26,14 +26,14 @@ */ OF_SUBCLASSING_RESTRICTED @interface OFRIPEMD160Hash: OFObject { OFSecureData *_iVarsData; - struct of_ripemd160_hash_ivars { + struct { uint32_t state[5]; uint64_t bits; - union of_ripemd160_hash_buffer { + union { unsigned char bytes[64]; uint32_t words[16]; } buffer; size_t bufferLength; } *_iVars; Index: src/OFRIPEMD160Hash.m ================================================================== --- src/OFRIPEMD160Hash.m +++ src/OFRIPEMD160Hash.m @@ -21,12 +21,12 @@ #import "OFSecureData.h" #import "OFHashAlreadyCalculatedException.h" #import "OFOutOfRangeException.h" -#define DIGEST_SIZE 20 -#define BLOCK_SIZE 64 +static const size_t digestSize = 20; +static const size_t blockSize = 64; OF_DIRECT_MEMBERS @interface OFRIPEMD160Hash () - (void)of_resetState; @end @@ -69,11 +69,11 @@ static OF_INLINE void byteSwapVectorIfBE(uint32_t *vector, uint_fast8_t length) { #ifdef OF_BIG_ENDIAN for (uint_fast8_t i = 0; i < length; i++) - vector[i] = OF_BSWAP32(vector[i]); + vector[i] = OFByteSwap32(vector[i]); #endif } static void processBlock(uint32_t *state, uint32_t *buffer) @@ -87,33 +87,33 @@ new[3] = new2[3] = state[3]; new[4] = new2[4] = state[4]; byteSwapVectorIfBE(buffer, 16); -#define LOOP_BODY(f, g, k, k2) \ - { \ - uint32_t tmp; \ - \ - tmp = new[0] + f(new[1], new[2], new[3]) + \ - buffer[wordOrder[i]] + k; \ - tmp = OF_ROL(tmp, rotateBits[i]) + new[4]; \ - \ - new[0] = new[4]; \ - new[4] = new[3]; \ - new[3] = OF_ROL(new[2], 10); \ - new[2] = new[1]; \ - new[1] = tmp; \ - \ - tmp = new2[0] + g(new2[1], new2[2], new2[3]) + \ - buffer[wordOrder2[i]] + k2; \ - tmp = OF_ROL(tmp, rotateBits2[i]) + new2[4]; \ - \ - new2[0] = new2[4]; \ - new2[4] = new2[3]; \ - new2[3] = OF_ROL(new2[2], 10); \ - new2[2] = new2[1]; \ - new2[1] = tmp; \ +#define LOOP_BODY(f, g, k, k2) \ + { \ + uint32_t tmp; \ + \ + tmp = new[0] + f(new[1], new[2], new[3]) + \ + buffer[wordOrder[i]] + k; \ + tmp = OFRotateLeft(tmp, rotateBits[i]) + new[4]; \ + \ + new[0] = new[4]; \ + new[4] = new[3]; \ + new[3] = OFRotateLeft(new[2], 10); \ + new[2] = new[1]; \ + new[1] = tmp; \ + \ + tmp = new2[0] + g(new2[1], new2[2], new2[3]) + \ + buffer[wordOrder2[i]] + k2; \ + tmp = OFRotateLeft(tmp, rotateBits2[i]) + new2[4]; \ + \ + new2[0] = new2[4]; \ + new2[4] = new2[3]; \ + new2[3] = OFRotateLeft(new2[2], 10); \ + new2[2] = new2[1]; \ + new2[1] = tmp; \ } for (; i < 16; i++) LOOP_BODY(F, J, 0x00000000, 0x50A28BE6) for (; i < 32; i++) @@ -139,16 +139,16 @@ @synthesize calculated = _calculated; @synthesize allowsSwappableMemory = _allowsSwappableMemory; + (size_t)digestSize { - return DIGEST_SIZE; + return digestSize; } + (size_t)blockSize { - return BLOCK_SIZE; + return blockSize; } + (instancetype)hashWithAllowsSwappableMemory: (bool)allowsSwappableMemory { return [[[self alloc] initWithAllowsSwappableMemory: @@ -192,16 +192,16 @@ [super dealloc]; } - (size_t)digestSize { - return DIGEST_SIZE; + return digestSize; } - (size_t)blockSize { - return BLOCK_SIZE; + return blockSize; } - (id)copy { OFRIPEMD160Hash *copy = [[OFRIPEMD160Hash alloc] of_init]; @@ -260,25 +260,25 @@ { if (_calculated) return (const unsigned char *)_iVars->state; _iVars->buffer.bytes[_iVars->bufferLength] = 0x80; - of_explicit_memset(_iVars->buffer.bytes + _iVars->bufferLength + 1, 0, + OFZeroMemory(_iVars->buffer.bytes + _iVars->bufferLength + 1, 64 - _iVars->bufferLength - 1); if (_iVars->bufferLength >= 56) { processBlock(_iVars->state, _iVars->buffer.words); - of_explicit_memset(_iVars->buffer.bytes, 0, 64); + OFZeroMemory(_iVars->buffer.bytes, 64); } _iVars->buffer.words[14] = - OF_BSWAP32_IF_BE((uint32_t)(_iVars->bits & 0xFFFFFFFF)); + OFToLittleEndian32((uint32_t)(_iVars->bits & 0xFFFFFFFF)); _iVars->buffer.words[15] = - OF_BSWAP32_IF_BE((uint32_t)(_iVars->bits >> 32)); + OFToLittleEndian32((uint32_t)(_iVars->bits >> 32)); processBlock(_iVars->state, _iVars->buffer.words); - of_explicit_memset(&_iVars->buffer, 0, sizeof(_iVars->buffer)); + OFZeroMemory(&_iVars->buffer, sizeof(_iVars->buffer)); byteSwapVectorIfBE(_iVars->state, 5); _calculated = true; return (const unsigned char *)_iVars->state; } @@ -285,10 +285,10 @@ - (void)reset { [self of_resetState]; _iVars->bits = 0; - of_explicit_memset(&_iVars->buffer, 0, sizeof(_iVars->buffer)); + OFZeroMemory(&_iVars->buffer, sizeof(_iVars->buffer)); _iVars->bufferLength = 0; _calculated = false; } @end Index: src/OFRangeCharacterSet.h ================================================================== --- src/OFRangeCharacterSet.h +++ src/OFRangeCharacterSet.h @@ -17,10 +17,10 @@ OF_ASSUME_NONNULL_BEGIN @interface OFRangeCharacterSet: OFCharacterSet { - of_range_t _range; + OFRange _range; } @end OF_ASSUME_NONNULL_END Index: src/OFRangeCharacterSet.m ================================================================== --- src/OFRangeCharacterSet.m +++ src/OFRangeCharacterSet.m @@ -24,11 +24,11 @@ - (instancetype)init { OF_INVALID_INIT_METHOD } -- (instancetype)initWithRange: (of_range_t)range +- (instancetype)initWithRange: (OFRange)range { self = [super init]; @try { if (SIZE_MAX - range.location < range.length) @@ -41,11 +41,11 @@ } return self; } -- (bool)characterIsMember: (of_unichar_t)character +- (bool)characterIsMember: (OFUnichar)character { return (character >= _range.location && character < _range.location + _range.length); } @end Index: src/OFRangeValue.h ================================================================== --- src/OFRangeValue.h +++ src/OFRangeValue.h @@ -17,10 +17,12 @@ OF_ASSUME_NONNULL_BEGIN @interface OFRangeValue: OFValue { - of_range_t _range; + OFRange _range; } + +- (instancetype)initWithRange: (OFRange)range; @end OF_ASSUME_NONNULL_END Index: src/OFRangeValue.m ================================================================== --- src/OFRangeValue.m +++ src/OFRangeValue.m @@ -20,11 +20,11 @@ #import "OFOutOfRangeException.h" @implementation OFRangeValue @synthesize rangeValue = _range; -- (instancetype)initWithRange: (of_range_t)range +- (instancetype)initWithRange: (OFRange)range { self = [super init]; _range = range; @@ -31,11 +31,11 @@ return self; } - (const char *)objCType { - return @encode(of_range_t); + return @encode(OFRange); } - (void)getValue: (void *)value size: (size_t)size { if (size != sizeof(_range)) @@ -45,9 +45,9 @@ } - (OFString *)description { return [OFString stringWithFormat: - @"", + @"", _range.location, _range.length]; } @end ADDED src/OFRectValue.h Index: src/OFRectValue.h ================================================================== --- src/OFRectValue.h +++ src/OFRectValue.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#import "OFValue.h" + +OF_ASSUME_NONNULL_BEGIN + +@interface OFRectValue: OFValue +{ + OFRect _rect; +} + +- (instancetype)initWithRect: (OFRect)rect; +@end + +OF_ASSUME_NONNULL_END ADDED src/OFRectValue.m Index: src/OFRectValue.m ================================================================== --- src/OFRectValue.m +++ src/OFRectValue.m @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#import "OFRectValue.h" +#import "OFMethodSignature.h" +#import "OFString.h" + +#import "OFOutOfRangeException.h" + +@implementation OFRectValue +@synthesize rectValue = _rect; + +- (instancetype)initWithRect: (OFRect)rect +{ + self = [super init]; + + _rect = rect; + + return self; +} + +- (const char *)objCType +{ + return @encode(OFRect); +} + +- (void)getValue: (void *)value size: (size_t)size +{ + if (size != sizeof(_rect)) + @throw [OFOutOfRangeException exception]; + + memcpy(value, &_rect, sizeof(_rect)); +} + +- (OFString *)description +{ + return [OFString stringWithFormat: + @"", + _rect.origin.x, _rect.origin.y, + _rect.size.width, _rect.size.height]; +} +@end DELETED src/OFRectangleValue.h Index: src/OFRectangleValue.h ================================================================== --- src/OFRectangleValue.h +++ src/OFRectangleValue.h @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#import "OFValue.h" - -OF_ASSUME_NONNULL_BEGIN - -@interface OFRectangleValue: OFValue -{ - of_rectangle_t _rectangle; -} -@end - -OF_ASSUME_NONNULL_END DELETED src/OFRectangleValue.m Index: src/OFRectangleValue.m ================================================================== --- src/OFRectangleValue.m +++ src/OFRectangleValue.m @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#import "OFRectangleValue.h" -#import "OFMethodSignature.h" -#import "OFString.h" - -#import "OFOutOfRangeException.h" - -@implementation OFRectangleValue -@synthesize rectangleValue = _rectangle; - -- (instancetype)initWithRectangle: (of_rectangle_t)rectangle -{ - self = [super init]; - - _rectangle = rectangle; - - return self; -} - -- (const char *)objCType -{ - return @encode(of_rectangle_t); -} - -- (void)getValue: (void *)value size: (size_t)size -{ - if (size != sizeof(_rectangle)) - @throw [OFOutOfRangeException exception]; - - memcpy(value, &_rectangle, sizeof(_rectangle)); -} - -- (OFString *)description -{ - return [OFString stringWithFormat: - @"", - _rectangle.origin.x, _rectangle.origin.y, - _rectangle.size.width, _rectangle.size.height]; -} -@end Index: src/OFRecursiveMutex.h ================================================================== --- src/OFRecursiveMutex.h +++ src/OFRecursiveMutex.h @@ -13,12 +13,11 @@ * file. */ #import "OFObject.h" #import "OFLocking.h" - -#import "mutex.h" +#import "OFPlainMutex.h" OF_ASSUME_NONNULL_BEGIN /** * @class OFRecursiveMutex OFRecursiveMutex.h ObjFW/OFRecursiveMutex.h @@ -27,11 +26,11 @@ * recursively. */ OF_SUBCLASSING_RESTRICTED @interface OFRecursiveMutex: OFObject { - of_rmutex_t _rmutex; + OFPlainRecursiveMutex _rmutex; bool _initialized; OFString *_Nullable _name; } /** Index: src/OFRecursiveMutex.m ================================================================== --- src/OFRecursiveMutex.m +++ src/OFRecursiveMutex.m @@ -35,11 +35,11 @@ - (instancetype)init { self = [super init]; - if (of_rmutex_new(&_rmutex) != 0) { + if (OFPlainRecursiveMutexNew(&_rmutex) != 0) { Class c = self.class; [self release]; @throw [OFInitializationFailedException exceptionWithClass: c]; } @@ -49,14 +49,14 @@ } - (void)dealloc { if (_initialized) { - int error = of_rmutex_free(&_rmutex); + int error = OFPlainRecursiveMutexFree(&_rmutex); if (error != 0) { - OF_ENSURE(error == EBUSY); + OFEnsure(error == EBUSY); @throw [OFStillLockedException exceptionWithLock: self]; } } @@ -65,20 +65,20 @@ [super dealloc]; } - (void)lock { - int error = of_rmutex_lock(&_rmutex); + int error = OFPlainRecursiveMutexLock(&_rmutex); if (error != 0) @throw [OFLockFailedException exceptionWithLock: self errNo: error]; } - (bool)tryLock { - int error = of_rmutex_trylock(&_rmutex); + int error = OFPlainRecursiveMutexTryLock(&_rmutex); if (error != 0) { if (error == EBUSY) return false; else @@ -89,11 +89,11 @@ return true; } - (void)unlock { - int error = of_rmutex_unlock(&_rmutex); + int error = OFPlainRecursiveMutexUnlock(&_rmutex); if (error != 0) @throw [OFUnlockFailedException exceptionWithLock: self errNo: error]; } Index: src/OFRunLoop+Private.h ================================================================== --- src/OFRunLoop+Private.h +++ src/OFRunLoop+Private.h @@ -37,98 +37,92 @@ #ifdef OF_HAVE_SOCKETS + (void)of_addAsyncReadForStream: (OFStream *) stream buffer: (void *)buffer length: (size_t)length - mode: (of_run_loop_mode_t)mode + mode: (OFRunLoopMode)mode # ifdef OF_HAVE_BLOCKS - block: (nullable of_stream_async_read_block_t)block + block: (nullable OFStreamAsyncReadBlock)block # endif delegate: (nullable id )delegate; + (void)of_addAsyncReadForStream: (OFStream *) stream buffer: (void *)buffer exactLength: (size_t)length - mode: (of_run_loop_mode_t)mode + mode: (OFRunLoopMode)mode # ifdef OF_HAVE_BLOCKS - block: (nullable of_stream_async_read_block_t)block + block: (nullable OFStreamAsyncReadBlock)block # endif delegate: (nullable id )delegate; + (void)of_addAsyncReadLineForStream: (OFStream *) stream - encoding: (of_string_encoding_t)encoding - mode: (of_run_loop_mode_t)mode + encoding: (OFStringEncoding)encoding + mode: (OFRunLoopMode)mode # ifdef OF_HAVE_BLOCKS - block: (nullable - of_stream_async_read_line_block_t) - block + block: (nullable OFStreamAsyncReadLineBlock)block # endif delegate: (nullable id )delegate; + (void)of_addAsyncWriteForStream: (OFStream *) stream data: (OFData *)data - mode: (of_run_loop_mode_t)mode + mode: (OFRunLoopMode)mode # ifdef OF_HAVE_BLOCKS - block: (nullable of_stream_async_write_data_block_t) - block + block: (nullable OFStreamAsyncWriteDataBlock)block # endif delegate: (nullable id )delegate; + (void)of_addAsyncWriteForStream: (OFStream *) stream string: (OFString *)string - encoding: (of_string_encoding_t)encoding - mode: (of_run_loop_mode_t)mode + encoding: (OFStringEncoding)encoding + mode: (OFRunLoopMode)mode # ifdef OF_HAVE_BLOCKS - block: (nullable - of_stream_async_write_string_block_t) - block + block: (nullable OFStreamAsyncWriteStringBlock)block # endif delegate: (nullable id )delegate; # if !defined(OF_WII) && !defined(OF_NINTENDO_3DS) + (void)of_addAsyncConnectForSocket: (id)socket - mode: (of_run_loop_mode_t)mode + mode: (OFRunLoopMode)mode delegate: (id )delegate; # endif + (void)of_addAsyncAcceptForSocket: (id)socket - mode: (of_run_loop_mode_t)mode + mode: (OFRunLoopMode)mode block: (nullable id)block delegate: (nullable id)delegate; + (void)of_addAsyncReceiveForDatagramSocket: (OFDatagramSocket *)socket buffer: (void *)buffer length: (size_t)length - mode: (of_run_loop_mode_t)mode + mode: (OFRunLoopMode)mode # ifdef OF_HAVE_BLOCKS - block: (nullable of_datagram_socket_async_receive_block_t)block + block: (nullable OFDatagramSocketAsyncReceiveBlock)block # endif delegate: (nullable id ) delegate; + (void)of_addAsyncSendForDatagramSocket: (OFDatagramSocket *)socket data: (OFData *)data - receiver: (const of_socket_address_t *)receiver - mode: (of_run_loop_mode_t)mode + receiver: (const OFSocketAddress *)receiver + mode: (OFRunLoopMode)mode # ifdef OF_HAVE_BLOCKS - block: (nullable of_datagram_socket_async_send_data_block_t)block + block: (nullable OFDatagramSocketAsyncSendDataBlock)block # endif delegate: (nullable id )delegate; + (void)of_addAsyncReceiveForSequencedPacketSocket: (OFSequencedPacketSocket *)socket buffer: (void *)buffer length: (size_t)length - mode: (of_run_loop_mode_t)mode + mode: (OFRunLoopMode)mode # ifdef OF_HAVE_BLOCKS - block: (nullable of_sequenced_packet_socket_async_receive_block_t)block + block: (nullable OFSequencedPacketSocketAsyncReceiveBlock)block # endif delegate: (nullable id ) delegate; + (void)of_addAsyncSendForSequencedPacketSocket: (OFSequencedPacketSocket *)socket data: (OFData *)data - mode: (of_run_loop_mode_t)mode + mode: (OFRunLoopMode)mode # ifdef OF_HAVE_BLOCKS - block: (nullable of_sequenced_packet_socket_async_send_data_block_t)block + block: (nullable OFSequencedPacketSocketAsyncSendDataBlock)block # endif delegate: (nullable id )delegate; -+ (void)of_cancelAsyncRequestsForObject: (id)object - mode: (of_run_loop_mode_t)mode; ++ (void)of_cancelAsyncRequestsForObject: (id)object mode: (OFRunLoopMode)mode; #endif -- (void)of_removeTimer: (OFTimer *)timer forMode: (of_run_loop_mode_t)mode; +- (void)of_removeTimer: (OFTimer *)timer forMode: (OFRunLoopMode)mode; @end OF_ASSUME_NONNULL_END Index: src/OFRunLoop.h ================================================================== --- src/OFRunLoop.h +++ src/OFRunLoop.h @@ -37,19 +37,19 @@ @class OFDate; /** * @brief A mode for an OFRunLoop. */ -typedef OFConstantString *of_run_loop_mode_t; +typedef OFConstantString *OFRunLoopMode; #ifdef __cplusplus extern "C" { #endif /** * @brief The default mode for an OFRunLoop. */ -extern const of_run_loop_mode_t of_run_loop_mode_default; +extern const OFRunLoopMode OFDefaultRunLoopMode; #ifdef __cplusplus } #endif /** @@ -62,20 +62,19 @@ { OFMutableDictionary *_states; #ifdef OF_HAVE_THREADS OFMutex *_statesMutex; #endif - of_run_loop_mode_t _Nullable _currentMode; + OFRunLoopMode _Nullable _currentMode; volatile bool _stop; } #ifdef OF_HAVE_CLASS_PROPERTIES @property (class, readonly, nullable, nonatomic) OFRunLoop *mainRunLoop; @property (class, readonly, nullable, nonatomic) OFRunLoop *currentRunLoop; #endif -@property OF_NULLABLE_PROPERTY (readonly, nonatomic) - of_run_loop_mode_t currentMode; +@property OF_NULLABLE_PROPERTY (readonly, nonatomic) OFRunLoopMode currentMode; /** * @brief Returns the run loop for the main thread. * * @return The run loop for the main thread @@ -100,11 +99,11 @@ * @brief Adds an OFTimer to the run loop for the specified mode. * * @param timer The timer to add * @param mode The run loop mode in which to run the timer */ -- (void)addTimer: (OFTimer *)timer forMode: (of_run_loop_mode_t)mode; +- (void)addTimer: (OFTimer *)timer forMode: (OFRunLoopMode)mode; #ifdef OF_AMIGAOS /** * @brief Adds an Exec Signal to the run loop. * @@ -135,11 +134,11 @@ * @param selector The selector to call on the target when the signal was * received. The selector must have one parameter for the ULONG * of the signal that was received. */ - (void)addExecSignal: (ULONG)signal - forMode: (of_run_loop_mode_t)mode + forMode: (OFRunLoopMode)mode target: (id)target selector: (SEL)selector; /** * @brief Removes the specified Exec Signal with the specified target and @@ -161,11 +160,11 @@ * @param mode The run loop mode to which the signal was added * @param target The target which was specified when adding the signal * @param selector The selector which was specified when adding the signal */ - (void)removeExecSignal: (ULONG)signal - forMode: (of_run_loop_mode_t)mode + forMode: (OFRunLoopMode)mode target: (id)target selector: (SEL)selector; #endif /** @@ -185,16 +184,15 @@ * deadline is reached. * * @param mode The mode in which to run the run loop * @param deadline The date until which the run loop should run at the longest */ -- (void)runMode: (of_run_loop_mode_t)mode - beforeDate: (nullable OFDate *)deadline; +- (void)runMode: (OFRunLoopMode)mode beforeDate: (nullable OFDate *)deadline; /** * @brief Stops the run loop. If there is still an operation being executed, it * is finished before the run loop stops. */ - (void)stop; @end OF_ASSUME_NONNULL_END Index: src/OFRunLoop.m ================================================================== --- src/OFRunLoop.m +++ src/OFRunLoop.m @@ -41,11 +41,11 @@ #import "OFTimer+Private.h" #import "OFDate.h" #import "OFObserveFailedException.h" -const of_run_loop_mode_t of_run_loop_mode_default = @"of_run_loop_mode_default"; +const OFRunLoopMode OFDefaultRunLoopMode = @"OFDefaultRunLoopMode"; static OFRunLoop *mainRunLoop = nil; @interface OFRunLoopState: OFObject #ifdef OF_HAVE_SOCKETS @@ -88,11 +88,11 @@ @interface OFRunLoopReadQueueItem: OFRunLoopQueueItem { @public # ifdef OF_HAVE_BLOCKS - of_stream_async_read_block_t _block; + OFStreamAsyncReadBlock _block; # endif void *_buffer; size_t _length; } @end @@ -99,11 +99,11 @@ @interface OFRunLoopExactReadQueueItem: OFRunLoopQueueItem { @public # ifdef OF_HAVE_BLOCKS - of_stream_async_read_block_t _block; + OFStreamAsyncReadBlock _block; # endif void *_buffer; size_t _exactLength, _readLength; } @end @@ -110,21 +110,21 @@ @interface OFRunLoopReadLineQueueItem: OFRunLoopQueueItem { @public # ifdef OF_HAVE_BLOCKS - of_stream_async_read_line_block_t _block; + OFStreamAsyncReadLineBlock _block; # endif - of_string_encoding_t _encoding; + OFStringEncoding _encoding; } @end @interface OFRunLoopWriteDataQueueItem: OFRunLoopQueueItem { @public # ifdef OF_HAVE_BLOCKS - of_stream_async_write_data_block_t _block; + OFStreamAsyncWriteDataBlock _block; # endif OFData *_data; size_t _writtenLength; } @end @@ -131,14 +131,14 @@ @interface OFRunLoopWriteStringQueueItem: OFRunLoopQueueItem { @public # ifdef OF_HAVE_BLOCKS - of_stream_async_write_string_block_t _block; + OFStreamAsyncWriteStringBlock _block; # endif OFString *_string; - of_string_encoding_t _encoding; + OFStringEncoding _encoding; size_t _writtenLength; } @end # if !defined(OF_WII) && !defined(OF_NINTENDO_3DS) @@ -157,11 +157,11 @@ @interface OFRunLoopDatagramReceiveQueueItem: OFRunLoopQueueItem { @public # ifdef OF_HAVE_BLOCKS - of_datagram_socket_async_receive_block_t _block; + OFDatagramSocketAsyncReceiveBlock _block; # endif void *_buffer; size_t _length; } @end @@ -168,22 +168,22 @@ @interface OFRunLoopDatagramSendQueueItem: OFRunLoopQueueItem { @public # ifdef OF_HAVE_BLOCKS - of_datagram_socket_async_send_data_block_t _block; + OFDatagramSocketAsyncSendDataBlock _block; # endif OFData *_data; - of_socket_address_t _receiver; + OFSocketAddress _receiver; } @end @interface OFRunLoopPacketReceiveQueueItem: OFRunLoopQueueItem { @public # ifdef OF_HAVE_BLOCKS - of_sequenced_packet_socket_async_receive_block_t _block; + OFSequencedPacketSocketAsyncReceiveBlock _block; # endif void *_buffer; size_t _length; } @end @@ -190,11 +190,11 @@ @interface OFRunLoopPacketSendQueueItem: OFRunLoopQueueItem { @public # ifdef OF_HAVE_BLOCKS - of_sequenced_packet_socket_async_send_data_block_t _block; + OFSequencedPacketSocketAsyncSendDataBlock _block; # endif OFData *_data; } @end #endif @@ -274,27 +274,28 @@ assert(queue != nil); @try { if (![queue.firstObject handleObject: object]) { - of_list_object_t *listObject = queue.firstListObject; + OFListItem listItem = queue.firstListItem; /* * The handler might have called -[cancelAsyncRequests] * so that our queue is now empty, in which case we * should do nothing. */ - if (listObject != NULL) { + if (listItem != NULL) { /* * Make sure we keep the target until after we * are done removing the object. The reason for * this is that the target might call * -[cancelAsyncRequests] in its dealloc. */ - [[listObject->object retain] autorelease]; + [[OFListItemObject(listItem) retain] + autorelease]; - [queue removeListObject: listObject]; + [queue removeListItem: listItem]; if (queue.count == 0) { [_kernelEventObserver removeObjectForReading: object]; [_readQueues @@ -317,27 +318,28 @@ assert(queue != nil); @try { if (![queue.firstObject handleObject: object]) { - of_list_object_t *listObject = queue.firstListObject; + OFListItem listItem = queue.firstListItem; /* * The handler might have called -[cancelAsyncRequests] * so that our queue is now empty, in which case we * should do nothing. */ - if (listObject != NULL) { + if (listItem != NULL) { /* * Make sure we keep the target until after we * are done removing the object. The reason for * this is that the target might call * -[cancelAsyncRequests] in its dealloc. */ - [[listObject->object retain] autorelease]; + [[OFListItemObject(listItem) retain] + autorelease]; - [queue removeListObject: listObject]; + [queue removeListItem: listItem]; if (queue.count == 0) { [_kernelEventObserver removeObjectForWriting: object]; [_writeQueues @@ -752,19 +754,18 @@ } # ifdef OF_HAVE_BLOCKS if (_block != NULL) { if ([object isKindOfClass: [OFStreamSocket class]]) - return ((of_stream_socket_async_accept_block_t) - _block)(acceptedSocket, exception); + return ((OFStreamSocketAsyncAcceptBlock)_block)( + acceptedSocket, exception); else if ([object isKindOfClass: [OFSequencedPacketSocket class]]) - return - ((of_sequenced_packet_socket_async_accept_block_t) + return ((OFSequencedPacketSocketAsyncAcceptBlock) _block)(acceptedSocket, exception); else - OF_ENSURE(0); + OFEnsure(0); } else { # endif if (![_delegate respondsToSelector: @selector(socket:didAcceptSocket:exception:)]) return false; @@ -789,11 +790,11 @@ @implementation OFRunLoopDatagramReceiveQueueItem - (bool)handleObject: (id)object { size_t length; - of_socket_address_t address; + OFSocketAddress address; id exception = nil; @try { length = [object receiveIntoBuffer: _buffer length: _length @@ -1015,11 +1016,11 @@ { mainRunLoop = [runLoop retain]; } static OFRunLoopState * -stateForMode(OFRunLoop *self, of_run_loop_mode_t mode, bool create) +stateForMode(OFRunLoop *self, OFRunLoopMode mode, bool create) { OFRunLoopState *state; #ifdef OF_HAVE_THREADS [self->_statesMutex lock]; @@ -1086,13 +1087,13 @@ + (void)of_addAsyncReadForStream: (OFStream *) stream buffer: (void *)buffer length: (size_t)length - mode: (of_run_loop_mode_t)mode + mode: (OFRunLoopMode)mode # ifdef OF_HAVE_BLOCKS - block: (of_stream_async_read_block_t)block + block: (OFStreamAsyncReadBlock)block # endif delegate: (id )delegate { NEW_READ(OFRunLoopReadQueueItem, stream, mode) @@ -1108,13 +1109,13 @@ + (void)of_addAsyncReadForStream: (OFStream *) stream buffer: (void *)buffer exactLength: (size_t)exactLength - mode: (of_run_loop_mode_t)mode + mode: (OFRunLoopMode)mode # ifdef OF_HAVE_BLOCKS - block: (of_stream_async_read_block_t)block + block: (OFStreamAsyncReadBlock)block # endif delegate: (id )delegate { NEW_READ(OFRunLoopExactReadQueueItem, stream, mode) @@ -1128,14 +1129,14 @@ QUEUE_ITEM } + (void)of_addAsyncReadLineForStream: (OFStream *) stream - encoding: (of_string_encoding_t)encoding - mode: (of_run_loop_mode_t)mode + encoding: (OFStringEncoding)encoding + mode: (OFRunLoopMode)mode # ifdef OF_HAVE_BLOCKS - block: (of_stream_async_read_line_block_t)block + block: (OFStreamAsyncReadLineBlock)block # endif delegate: (id )delegate { NEW_READ(OFRunLoopReadLineQueueItem, stream, mode) @@ -1149,13 +1150,13 @@ } + (void)of_addAsyncWriteForStream: (OFStream *) stream data: (OFData *)data - mode: (of_run_loop_mode_t)mode + mode: (OFRunLoopMode)mode # ifdef OF_HAVE_BLOCKS - block: (of_stream_async_write_data_block_t)block + block: (OFStreamAsyncWriteDataBlock)block # endif delegate: (id )delegate { NEW_WRITE(OFRunLoopWriteDataQueueItem, stream, mode) @@ -1169,14 +1170,14 @@ } + (void)of_addAsyncWriteForStream: (OFStream *) stream string: (OFString *)string - encoding: (of_string_encoding_t)encoding - mode: (of_run_loop_mode_t)mode + encoding: (OFStringEncoding)encoding + mode: (OFRunLoopMode)mode # ifdef OF_HAVE_BLOCKS - block: (of_stream_async_write_string_block_t)block + block: (OFStreamAsyncWriteStringBlock)block # endif delegate: (id )delegate { NEW_WRITE(OFRunLoopWriteStringQueueItem, stream, mode) @@ -1190,11 +1191,11 @@ QUEUE_ITEM } # if !defined(OF_WII) && !defined(OF_NINTENDO_3DS) + (void)of_addAsyncConnectForSocket: (id)sock - mode: (of_run_loop_mode_t)mode + mode: (OFRunLoopMode)mode delegate: (id )delegate { NEW_WRITE(OFRunLoopConnectQueueItem, sock, mode) queueItem->_delegate = [delegate retain]; @@ -1202,11 +1203,11 @@ QUEUE_ITEM } # endif + (void)of_addAsyncAcceptForSocket: (id)sock - mode: (of_run_loop_mode_t)mode + mode: (OFRunLoopMode)mode block: (id)block delegate: (id)delegate { NEW_READ(OFRunLoopAcceptQueueItem, sock, mode) @@ -1219,13 +1220,13 @@ } + (void)of_addAsyncReceiveForDatagramSocket: (OFDatagramSocket *)sock buffer: (void *)buffer length: (size_t)length - mode: (of_run_loop_mode_t)mode + mode: (OFRunLoopMode)mode # ifdef OF_HAVE_BLOCKS - block: (of_datagram_socket_async_receive_block_t)block + block: (OFDatagramSocketAsyncReceiveBlock)block # endif delegate: (id )delegate { NEW_READ(OFRunLoopDatagramReceiveQueueItem, sock, mode) @@ -1239,14 +1240,14 @@ QUEUE_ITEM } + (void)of_addAsyncSendForDatagramSocket: (OFDatagramSocket *)sock data: (OFData *)data - receiver: (const of_socket_address_t *)receiver - mode: (of_run_loop_mode_t)mode + receiver: (const OFSocketAddress *)receiver + mode: (OFRunLoopMode)mode # ifdef OF_HAVE_BLOCKS - block: (of_datagram_socket_async_send_data_block_t)block + block: (OFDatagramSocketAsyncSendDataBlock)block # endif delegate: (id )delegate { NEW_WRITE(OFRunLoopDatagramSendQueueItem, sock, mode) @@ -1262,13 +1263,13 @@ + (void)of_addAsyncReceiveForSequencedPacketSocket: (OFSequencedPacketSocket *) sock buffer: (void *)buffer length: (size_t)length - mode: (of_run_loop_mode_t)mode + mode: (OFRunLoopMode)mode # ifdef OF_HAVE_BLOCKS - block: (of_sequenced_packet_socket_async_receive_block_t)block + block: (OFSequencedPacketSocketAsyncReceiveBlock)block # endif delegate: (id )delegate { NEW_READ(OFRunLoopPacketReceiveQueueItem, sock, mode) @@ -1282,13 +1283,13 @@ QUEUE_ITEM } + (void)of_addAsyncSendForSequencedPacketSocket: (OFSequencedPacketSocket *)sock data: (OFData *)data - mode: (of_run_loop_mode_t)mode + mode: (OFRunLoopMode)mode # ifdef OF_HAVE_BLOCKS - block: (of_sequenced_packet_socket_async_send_data_block_t)block + block: (OFSequencedPacketSocketAsyncSendDataBlock)block # endif delegate: (id )delegate { NEW_WRITE(OFRunLoopPacketSendQueueItem, sock, mode) @@ -1302,12 +1303,11 @@ } # undef NEW_READ # undef NEW_WRITE # undef QUEUE_ITEM -+ (void)of_cancelAsyncRequestsForObject: (id)object - mode: (of_run_loop_mode_t)mode ++ (void)of_cancelAsyncRequestsForObject: (id)object mode: (OFRunLoopMode)mode { void *pool = objc_autoreleasePoolPush(); OFRunLoop *runLoop = [self currentRunLoop]; OFRunLoopState *state = stateForMode(runLoop, mode, false); OFList *queue; @@ -1354,12 +1354,11 @@ _states = [[OFMutableDictionary alloc] init]; state = [[OFRunLoopState alloc] init]; @try { - [_states setObject: state - forKey: of_run_loop_mode_default]; + [_states setObject: state forKey: OFDefaultRunLoopMode]; } @finally { [state release]; } #ifdef OF_HAVE_THREADS @@ -1383,14 +1382,14 @@ [super dealloc]; } - (void)addTimer: (OFTimer *)timer { - [self addTimer: timer forMode: of_run_loop_mode_default]; + [self addTimer: timer forMode: OFDefaultRunLoopMode]; } -- (void)addTimer: (OFTimer *)timer forMode: (of_run_loop_mode_t)mode +- (void)addTimer: (OFTimer *)timer forMode: (OFRunLoopMode)mode { OFRunLoopState *state = stateForMode(self, mode, true); #ifdef OF_HAVE_THREADS [state->_timersQueueMutex lock]; @@ -1410,11 +1409,11 @@ #elif defined(OF_HAVE_THREADS) [state->_condition signal]; #endif } -- (void)of_removeTimer: (OFTimer *)timer forMode: (of_run_loop_mode_t)mode +- (void)of_removeTimer: (OFTimer *)timer forMode: (OFRunLoopMode)mode { OFRunLoopState *state = stateForMode(self, mode, false); if (state == nil) return; @@ -1421,16 +1420,14 @@ #ifdef OF_HAVE_THREADS [state->_timersQueueMutex lock]; @try { #endif - of_list_object_t *iter; - - for (iter = state->_timersQueue.firstListObject; iter != NULL; - iter = iter->next) { - if ([iter->object isEqual: timer]) { - [state->_timersQueue removeListObject: iter]; + for (OFListItem iter = state->_timersQueue.firstListItem; + iter != NULL; iter = OFListItemNext(iter)) { + if ([OFListItemObject(iter) isEqual: timer]) { + [state->_timersQueue removeListItem: iter]; break; } } #ifdef OF_HAVE_THREADS } @finally { @@ -1441,17 +1438,17 @@ #ifdef OF_AMIGAOS - (void)addExecSignal: (ULONG)signal target: (id)target selector: (SEL)selector { [self addExecSignal: signal - forMode: of_run_loop_mode_default + forMode: OFDefaultRunLoopMode target: target selector: selector]; } - (void)addExecSignal: (ULONG)signal - forMode: (of_run_loop_mode_t)mode + forMode: (OFRunLoopMode)mode target: (id)target selector: (SEL)selector { OFRunLoopState *state = stateForMode(self, mode, true); @@ -1484,17 +1481,17 @@ - (void)removeExecSignal: (ULONG)signal target: (id)target selector: (SEL)selector { [self removeExecSignal: signal - forMode: of_run_loop_mode_default + forMode: OFDefaultRunLoopMode target: target selector: selector]; } - (void)removeExecSignal: (ULONG)signal - forMode: (of_run_loop_mode_t)mode + forMode: (OFRunLoopMode)mode target: (id)target selector: (SEL)selector { OFRunLoopState *state = stateForMode(self, mode, false); @@ -1554,17 +1551,17 @@ { _stop = false; while (!_stop && (deadline == nil || deadline.timeIntervalSinceNow >= 0)) - [self runMode: of_run_loop_mode_default beforeDate: deadline]; + [self runMode: OFDefaultRunLoopMode beforeDate: deadline]; } -- (void)runMode: (of_run_loop_mode_t)mode beforeDate: (OFDate *)deadline +- (void)runMode: (OFRunLoopMode)mode beforeDate: (OFDate *)deadline { void *pool = objc_autoreleasePoolPush(); - of_run_loop_mode_t previousMode = _currentMode; + OFRunLoopMode previousMode = _currentMode; OFRunLoopState *state = stateForMode(self, mode, false); if (state == nil) return; @@ -1580,20 +1577,21 @@ #ifdef OF_HAVE_THREADS [state->_timersQueueMutex lock]; @try { #endif - of_list_object_t *listObject = - state->_timersQueue.firstListObject; + OFListItem listItem = + state->_timersQueue.firstListItem; - if (listObject != NULL && [listObject->object - fireDate].timeIntervalSinceNow <= 0) { - timer = [[listObject->object + if (listItem != NULL && + [OFListItemObject(listItem) fireDate] + .timeIntervalSinceNow <= 0) { + timer = [[OFListItemObject(listItem) retain] autorelease]; [state->_timersQueue - removeListObject: listObject]; + removeListItem: listItem]; [timer of_setInRunLoop: nil mode: nil]; } else break; #ifdef OF_HAVE_THREADS @@ -1620,11 +1618,11 @@ } #endif /* Watch for I/O events until the next timer is due */ if (nextTimer != nil || deadline != nil) { - of_time_interval_t timeout; + OFTimeInterval timeout; if (nextTimer != nil && deadline == nil) timeout = nextTimer.timeIntervalSinceNow; else if (nextTimer == nil && deadline != nil) timeout = deadline.timeIntervalSinceNow; @@ -1694,12 +1692,11 @@ } } - (void)stop { - OFRunLoopState *state = - stateForMode(self, of_run_loop_mode_default, false); + OFRunLoopState *state = stateForMode(self, OFDefaultRunLoopMode, false); _stop = true; if (state == nil) return; Index: src/OFSHA1Hash.h ================================================================== --- src/OFSHA1Hash.h +++ src/OFSHA1Hash.h @@ -26,14 +26,14 @@ */ OF_SUBCLASSING_RESTRICTED @interface OFSHA1Hash: OFObject { OFSecureData *_iVarsData; - struct of_sha1_hash_ivars { + struct { uint32_t state[5]; uint64_t bits; - union of_sha1_hash_buffer { + union { unsigned char bytes[64]; uint32_t words[80]; } buffer; size_t bufferLength; } *_iVars; Index: src/OFSHA1Hash.m ================================================================== --- src/OFSHA1Hash.m +++ src/OFSHA1Hash.m @@ -21,12 +21,12 @@ #import "OFSecureData.h" #import "OFHashAlreadyCalculatedException.h" #import "OFOutOfRangeException.h" -#define DIGEST_SIZE 20 -#define BLOCK_SIZE 64 +static const size_t digestSize = 20; +static const size_t blockSize = 64; OF_DIRECT_MEMBERS @interface OFSHA1Hash () - (void)of_resetState; @end @@ -39,11 +39,11 @@ static OF_INLINE void byteSwapVectorIfLE(uint32_t *vector, uint_fast8_t length) { #ifndef OF_BIG_ENDIAN for (uint_fast8_t i = 0; i < length; i++) - vector[i] = OF_BSWAP32(vector[i]); + vector[i] = OFByteSwap32(vector[i]); #endif } static void processBlock(uint32_t *state, uint32_t *buffer) @@ -60,21 +60,21 @@ byteSwapVectorIfLE(buffer, 16); for (i = 16; i < 80; i++) { uint32_t tmp = buffer[i - 3] ^ buffer[i - 8] ^ buffer[i - 14] ^ buffer[i - 16]; - buffer[i] = OF_ROL(tmp, 1); + buffer[i] = OFRotateLeft(tmp, 1); } #define LOOP_BODY(f, k) \ { \ - uint32_t tmp = OF_ROL(new[0], 5) + \ + uint32_t tmp = OFRotateLeft(new[0], 5) + \ f(new[0], new[1], new[2], new[3]) + \ new[4] + k + buffer[i]; \ new[4] = new[3]; \ new[3] = new[2]; \ - new[2] = OF_ROL(new[1], 30); \ + new[2] = OFRotateLeft(new[1], 30); \ new[1] = new[0]; \ new[0] = tmp; \ } for (i = 0; i < 20; i++) @@ -99,16 +99,16 @@ @synthesize calculated = _calculated; @synthesize allowsSwappableMemory = _allowsSwappableMemory; + (size_t)digestSize { - return DIGEST_SIZE; + return digestSize; } + (size_t)blockSize { - return BLOCK_SIZE; + return blockSize; } + (instancetype)hashWithAllowsSwappableMemory: (bool)allowsSwappableMemory { return [[[self alloc] initWithAllowsSwappableMemory: @@ -152,16 +152,16 @@ [super dealloc]; } - (size_t)digestSize { - return DIGEST_SIZE; + return digestSize; } - (size_t)blockSize { - return BLOCK_SIZE; + return blockSize; } - (id)copy { OFSHA1Hash *copy = [[OFSHA1Hash alloc] of_init]; @@ -220,25 +220,25 @@ { if (_calculated) return (const unsigned char *)_iVars->state; _iVars->buffer.bytes[_iVars->bufferLength] = 0x80; - of_explicit_memset(_iVars->buffer.bytes + _iVars->bufferLength + 1, 0, + OFZeroMemory(_iVars->buffer.bytes + _iVars->bufferLength + 1, 64 - _iVars->bufferLength - 1); if (_iVars->bufferLength >= 56) { processBlock(_iVars->state, _iVars->buffer.words); - of_explicit_memset(_iVars->buffer.bytes, 0, 64); + OFZeroMemory(_iVars->buffer.bytes, 64); } _iVars->buffer.words[14] = - OF_BSWAP32_IF_LE((uint32_t)(_iVars->bits >> 32)); + OFToBigEndian32((uint32_t)(_iVars->bits >> 32)); _iVars->buffer.words[15] = - OF_BSWAP32_IF_LE((uint32_t)(_iVars->bits & 0xFFFFFFFF)); + OFToBigEndian32((uint32_t)(_iVars->bits & 0xFFFFFFFF)); processBlock(_iVars->state, _iVars->buffer.words); - of_explicit_memset(&_iVars->buffer, 0, sizeof(_iVars->buffer)); + OFZeroMemory(&_iVars->buffer, sizeof(_iVars->buffer)); byteSwapVectorIfLE(_iVars->state, 5); _calculated = true; return (const unsigned char *)_iVars->state; } @@ -245,10 +245,10 @@ - (void)reset { [self of_resetState]; _iVars->bits = 0; - of_explicit_memset(&_iVars->buffer, 0, sizeof(_iVars->buffer)); + OFZeroMemory(&_iVars->buffer, sizeof(_iVars->buffer)); _iVars->bufferLength = 0; _calculated = false; } @end Index: src/OFSHA224Hash.m ================================================================== --- src/OFSHA224Hash.m +++ src/OFSHA224Hash.m @@ -15,21 +15,21 @@ #include "config.h" #import "OFSHA224Hash.h" -#define DIGEST_SIZE 28 +static const size_t digestSize = 28; @implementation OFSHA224Hash + (size_t)digestSize { - return DIGEST_SIZE; + return digestSize; } - (size_t)digestSize { - return DIGEST_SIZE; + return digestSize; } - (void)of_resetState { _iVars->state[0] = 0xC1059ED8; Index: src/OFSHA224Or256Hash.h ================================================================== --- src/OFSHA224Or256Hash.h +++ src/OFSHA224Or256Hash.h @@ -27,14 +27,14 @@ @interface OFSHA224Or256Hash: OFObject { @private OFSecureData *_iVarsData; @protected - struct of_sha224_or_256_hash_ivars { + struct { uint32_t state[8]; uint64_t bits; - union of_sha224_or_256_hash_buffer { + union { unsigned char bytes[64]; uint32_t words[64]; } buffer; size_t bufferLength; } *_iVars; Index: src/OFSHA224Or256Hash.m ================================================================== --- src/OFSHA224Or256Hash.m +++ src/OFSHA224Or256Hash.m @@ -22,11 +22,11 @@ #import "OFSecureData.h" #import "OFHashAlreadyCalculatedException.h" #import "OFOutOfRangeException.h" -#define BLOCK_SIZE 64 +static const size_t blockSize = 64; @interface OFSHA224Or256Hash () - (void)of_resetState; @end @@ -52,11 +52,11 @@ static OF_INLINE void byteSwapVectorIfLE(uint32_t *vector, uint_fast8_t length) { #ifndef OF_BIG_ENDIAN for (uint_fast8_t i = 0; i < length; i++) - vector[i] = OF_BSWAP32(vector[i]); + vector[i] = OFByteSwap32(vector[i]); #endif } static void processBlock(uint32_t *state, uint32_t *buffer) @@ -77,24 +77,24 @@ for (i = 16; i < 64; i++) { uint32_t tmp; tmp = buffer[i - 2]; - buffer[i] = (OF_ROR(tmp, 17) ^ OF_ROR(tmp, 19) ^ (tmp >> 10)) + - buffer[i - 7]; + buffer[i] = (OFRotateRight(tmp, 17) ^ OFRotateRight(tmp, 19) ^ + (tmp >> 10)) + buffer[i - 7]; tmp = buffer[i - 15]; - buffer[i] += (OF_ROR(tmp, 7) ^ OF_ROR(tmp, 18) ^ (tmp >> 3)) + - buffer[i - 16]; + buffer[i] += (OFRotateRight(tmp, 7) ^ OFRotateRight(tmp, 18) ^ + (tmp >> 3)) + buffer[i - 16]; } for (i = 0; i < 64; i++) { - uint32_t tmp1 = new[7] + (OF_ROR(new[4], 6) ^ - OF_ROR(new[4], 11) ^ OF_ROR(new[4], 25)) + + uint32_t tmp1 = new[7] + (OFRotateRight(new[4], 6) ^ + OFRotateRight(new[4], 11) ^ OFRotateRight(new[4], 25)) + ((new[4] & (new[5] ^ new[6])) ^ new[6]) + table[i] + buffer[i]; - uint32_t tmp2 = (OF_ROR(new[0], 2) ^ OF_ROR(new[0], 13) ^ - OF_ROR(new[0], 22)) + + uint32_t tmp2 = (OFRotateRight(new[0], 2) ^ + OFRotateRight(new[0], 13) ^ OFRotateRight(new[0], 22)) + ((new[0] & (new[1] | new[2])) | (new[1] & new[2])); new[7] = new[6]; new[6] = new[5]; new[5] = new[4]; @@ -124,11 +124,11 @@ OF_UNRECOGNIZED_SELECTOR } + (size_t)blockSize { - return BLOCK_SIZE; + return blockSize; } + (instancetype)hashWithAllowsSwappableMemory: (bool)allowsSwappableMemory { return [[[self alloc] initWithAllowsSwappableMemory: @@ -182,11 +182,11 @@ OF_UNRECOGNIZED_SELECTOR } - (size_t)blockSize { - return BLOCK_SIZE; + return blockSize; } - (id)copy { OFSHA224Or256Hash *copy = [[[self class] alloc] of_init]; @@ -236,25 +236,25 @@ { if (_calculated) return (const unsigned char *)_iVars->state; _iVars->buffer.bytes[_iVars->bufferLength] = 0x80; - of_explicit_memset(_iVars->buffer.bytes + _iVars->bufferLength + 1, 0, + OFZeroMemory(_iVars->buffer.bytes + _iVars->bufferLength + 1, 64 - _iVars->bufferLength - 1); if (_iVars->bufferLength >= 56) { processBlock(_iVars->state, _iVars->buffer.words); - of_explicit_memset(_iVars->buffer.bytes, 0, 64); + OFZeroMemory(_iVars->buffer.bytes, 64); } _iVars->buffer.words[14] = - OF_BSWAP32_IF_LE((uint32_t)(_iVars->bits >> 32)); + OFToBigEndian32((uint32_t)(_iVars->bits >> 32)); _iVars->buffer.words[15] = - OF_BSWAP32_IF_LE((uint32_t)(_iVars->bits & 0xFFFFFFFF)); + OFToBigEndian32((uint32_t)(_iVars->bits & 0xFFFFFFFF)); processBlock(_iVars->state, _iVars->buffer.words); - of_explicit_memset(&_iVars->buffer, 0, sizeof(_iVars->buffer)); + OFZeroMemory(&_iVars->buffer, sizeof(_iVars->buffer)); byteSwapVectorIfLE(_iVars->state, 8); _calculated = true; return (const unsigned char *)_iVars->state; } @@ -261,15 +261,15 @@ - (void)reset { [self of_resetState]; _iVars->bits = 0; - of_explicit_memset(&_iVars->buffer, 0, sizeof(_iVars->buffer)); + OFZeroMemory(&_iVars->buffer, sizeof(_iVars->buffer)); _iVars->bufferLength = 0; _calculated = false; } - (void)of_resetState { OF_UNRECOGNIZED_SELECTOR } @end Index: src/OFSHA256Hash.m ================================================================== --- src/OFSHA256Hash.m +++ src/OFSHA256Hash.m @@ -15,21 +15,21 @@ #include "config.h" #import "OFSHA256Hash.h" -#define DIGEST_SIZE 32 +static const size_t digestSize = 32; @implementation OFSHA256Hash + (size_t)digestSize { - return DIGEST_SIZE; + return digestSize; } - (size_t)digestSize { - return DIGEST_SIZE; + return digestSize; } - (void)of_resetState { _iVars->state[0] = 0x6A09E667; Index: src/OFSHA384Hash.m ================================================================== --- src/OFSHA384Hash.m +++ src/OFSHA384Hash.m @@ -15,21 +15,21 @@ #include "config.h" #import "OFSHA384Hash.h" -#define DIGEST_SIZE 48 +static const size_t digestSize = 48; @implementation OFSHA384Hash + (size_t)digestSize { - return DIGEST_SIZE; + return digestSize; } - (size_t)digestSize { - return DIGEST_SIZE; + return digestSize; } - (void)of_resetState { _iVars->state[0] = 0xCBBB9D5DC1059ED8; Index: src/OFSHA384Or512Hash.h ================================================================== --- src/OFSHA384Or512Hash.h +++ src/OFSHA384Or512Hash.h @@ -27,14 +27,14 @@ @interface OFSHA384Or512Hash: OFObject { @private OFSecureData *_iVarsData; @protected - struct of_sha384_or_512_hash_ivars { + struct { uint64_t state[8]; uint64_t bits[2]; - union of_sha384_or_512_hash_buffer { + union { unsigned char bytes[128]; uint64_t words[80]; } buffer; size_t bufferLength; } *_iVars; Index: src/OFSHA384Or512Hash.m ================================================================== --- src/OFSHA384Or512Hash.m +++ src/OFSHA384Or512Hash.m @@ -22,11 +22,11 @@ #import "OFSecureData.h" #import "OFHashAlreadyCalculatedException.h" #import "OFOutOfRangeException.h" -#define BLOCK_SIZE 128 +static const size_t blockSize = 128; @interface OFSHA384Or512Hash () - (void)of_resetState; @end @@ -63,11 +63,11 @@ static OF_INLINE void byteSwapVectorIfLE(uint64_t *vector, uint_fast8_t length) { #ifndef OF_BIG_ENDIAN for (uint_fast8_t i = 0; i < length; i++) - vector[i] = OF_BSWAP64(vector[i]); + vector[i] = OFByteSwap64(vector[i]); #endif } static void processBlock(uint64_t *state, uint64_t *buffer) @@ -88,24 +88,24 @@ for (i = 16; i < 80; i++) { uint64_t tmp; tmp = buffer[i - 2]; - buffer[i] = (OF_ROR(tmp, 19) ^ OF_ROR(tmp, 61) ^ (tmp >> 6)) + - buffer[i - 7]; + buffer[i] = (OFRotateRight(tmp, 19) ^ OFRotateRight(tmp, 61) ^ + (tmp >> 6)) + buffer[i - 7]; tmp = buffer[i - 15]; - buffer[i] += (OF_ROR(tmp, 1) ^ OF_ROR(tmp, 8) ^ (tmp >> 7)) + - buffer[i - 16]; + buffer[i] += (OFRotateRight(tmp, 1) ^ OFRotateRight(tmp, 8) ^ + (tmp >> 7)) + buffer[i - 16]; } for (i = 0; i < 80; i++) { - uint64_t tmp1 = new[7] + (OF_ROR(new[4], 14) ^ - OF_ROR(new[4], 18) ^ OF_ROR(new[4], 41)) + + uint64_t tmp1 = new[7] + (OFRotateRight(new[4], 14) ^ + OFRotateRight(new[4], 18) ^ OFRotateRight(new[4], 41)) + ((new[4] & (new[5] ^ new[6])) ^ new[6]) + table[i] + buffer[i]; - uint64_t tmp2 = (OF_ROR(new[0], 28) ^ OF_ROR(new[0], 34) ^ - OF_ROR(new[0], 39)) + + uint64_t tmp2 = (OFRotateRight(new[0], 28) ^ + OFRotateRight(new[0], 34) ^ OFRotateRight(new[0], 39)) + ((new[0] & (new[1] | new[2])) | (new[1] & new[2])); new[7] = new[6]; new[6] = new[5]; new[5] = new[4]; @@ -135,11 +135,11 @@ OF_UNRECOGNIZED_SELECTOR } + (size_t)blockSize { - return BLOCK_SIZE; + return blockSize; } + (instancetype)hashWithAllowsSwappableMemory: (bool)allowsSwappableMemory { return [[[self alloc] initWithAllowsSwappableMemory: @@ -193,11 +193,11 @@ OF_UNRECOGNIZED_SELECTOR } - (size_t)blockSize { - return BLOCK_SIZE; + return blockSize; } - (id)copy { OFSHA384Or512Hash *copy = [[[self class] alloc] of_init]; @@ -249,38 +249,38 @@ { if (_calculated) return (const unsigned char *)_iVars->state; _iVars->buffer.bytes[_iVars->bufferLength] = 0x80; - of_explicit_memset(_iVars->buffer.bytes + _iVars->bufferLength + 1, 0, + OFZeroMemory(_iVars->buffer.bytes + _iVars->bufferLength + 1, 128 - _iVars->bufferLength - 1); if (_iVars->bufferLength >= 112) { processBlock(_iVars->state, _iVars->buffer.words); - of_explicit_memset(_iVars->buffer.bytes, 0, 128); + OFZeroMemory(_iVars->buffer.bytes, 128); } - _iVars->buffer.words[14] = OF_BSWAP64_IF_LE(_iVars->bits[1]); - _iVars->buffer.words[15] = OF_BSWAP64_IF_LE(_iVars->bits[0]); + _iVars->buffer.words[14] = OFToBigEndian64(_iVars->bits[1]); + _iVars->buffer.words[15] = OFToBigEndian64(_iVars->bits[0]); processBlock(_iVars->state, _iVars->buffer.words); - of_explicit_memset(&_iVars->buffer, 0, sizeof(_iVars->buffer)); + OFZeroMemory(&_iVars->buffer, sizeof(_iVars->buffer)); byteSwapVectorIfLE(_iVars->state, 8); _calculated = true; return (const unsigned char *)_iVars->state; } - (void)reset { [self of_resetState]; - of_explicit_memset(_iVars->bits, 0, sizeof(_iVars->bits)); - of_explicit_memset(&_iVars->buffer, 0, sizeof(_iVars->buffer)); + OFZeroMemory(_iVars->bits, sizeof(_iVars->bits)); + OFZeroMemory(&_iVars->buffer, sizeof(_iVars->buffer)); _iVars->bufferLength = 0; _calculated = false; } - (void)of_resetState { OF_UNRECOGNIZED_SELECTOR } @end Index: src/OFSHA512Hash.m ================================================================== --- src/OFSHA512Hash.m +++ src/OFSHA512Hash.m @@ -15,21 +15,21 @@ #include "config.h" #import "OFSHA512Hash.h" -#define DIGEST_SIZE 64 +static const size_t digestSize = 64; @implementation OFSHA512Hash + (size_t)digestSize { - return DIGEST_SIZE; + return digestSize; } - (size_t)digestSize { - return DIGEST_SIZE; + return digestSize; } - (void)of_resetState { _iVars->state[0] = 0x6A09E667F3BCC908; Index: src/OFSPXSocket.h ================================================================== --- src/OFSPXSocket.h +++ src/OFSPXSocket.h @@ -28,11 +28,11 @@ * @brief A block which is called when the socket connected. * * @param exception An exception which occurred while connecting the socket or * `nil` on success */ -typedef void (^of_spx_socket_async_connect_block_t)(id _Nullable exception); +typedef void (^OFSPXSocketAsyncConnectBlock)(id _Nullable exception); #endif /** * @protocol OFSPXSocketDelegate OFSPXSocket.h ObjFW/OFSPXSocket.h * @@ -116,11 +116,11 @@ * @param runLoopMode The run loop mode in which to perform the async connect */ - (void)asyncConnectToNode: (unsigned char [_Nonnull IPX_NODE_LEN])node network: (uint32_t)network port: (uint16_t)port - runLoopMode: (of_run_loop_mode_t)runLoopMode; + runLoopMode: (OFRunLoopMode)runLoopMode; #ifdef OF_HAVE_BLOCKS /** * @brief Asynchronously connect the OFSPXSocket to the specified destination. * @@ -131,11 +131,11 @@ * @param block The block to execute once the connection has been established */ - (void)asyncConnectToNode: (unsigned char [_Nonnull IPX_NODE_LEN])node network: (uint32_t)network port: (uint16_t)port - block: (of_spx_socket_async_connect_block_t)block; + block: (OFSPXSocketAsyncConnectBlock)block; /** * @brief Asynchronously connect the OFSPXSocket to the specified destination. * * @param node The node to connect to @@ -146,20 +146,20 @@ * @param block The block to execute once the connection has been established */ - (void)asyncConnectToNode: (unsigned char [_Nonnull IPX_NODE_LEN])node network: (uint32_t)network port: (uint16_t)port - runLoopMode: (of_run_loop_mode_t)runLoopMode - block: (of_spx_socket_async_connect_block_t)block; + runLoopMode: (OFRunLoopMode)runLoopMode + block: (OFSPXSocketAsyncConnectBlock)block; #endif /** * @brief Bind the socket to the specified network, node and port. * * @param port The port (sometimes called socket number) to bind to. 0 means to * pick one and return it. * @return The address on which this socket can be reached */ -- (of_socket_address_t)bindToPort: (uint16_t)port; +- (OFSocketAddress)bindToPort: (uint16_t)port; @end OF_ASSUME_NONNULL_END Index: src/OFSPXSocket.m ================================================================== --- src/OFSPXSocket.m +++ src/OFSPXSocket.m @@ -18,29 +18,28 @@ #include #import "OFSPXSocket.h" #import "OFRunLoop.h" #import "OFRunLoop+Private.h" +#import "OFSocket.h" +#import "OFSocket+Private.h" #import "OFAlreadyConnectedException.h" #import "OFBindFailedException.h" #import "OFConnectionFailedException.h" #import "OFNotOpenException.h" -#import "socket.h" -#import "socket_helpers.h" - #ifndef NSPROTO_SPX # define NSPROTO_SPX 0 #endif -#define SPX_PACKET_TYPE 5 +static const uint8_t SPXPacketType = 5; @interface OFSPXSocket () -- (int)of_createSocketForAddress: (const of_socket_address_t *)address +- (int)of_createSocketForAddress: (const OFSocketAddress *)address errNo: (int *)errNo; -- (bool)of_connectSocketToAddress: (const of_socket_address_t *)address +- (bool)of_connectSocketToAddress: (const OFSocketAddress *)address errNo: (int *)errNo; - (void)of_closeSocket; @end OF_DIRECT_MEMBERS @@ -49,32 +48,32 @@ OFSPXSocket *_socket; unsigned char _node[IPX_NODE_LEN]; uint32_t _network; uint16_t _port; #ifdef OF_HAVE_BLOCKS - of_spx_socket_async_connect_block_t _block; + OFSPXSocketAsyncConnectBlock _block; #endif } - (instancetype)initWithSocket: (OFSPXSocket *)socket node: (unsigned char [IPX_NODE_LEN])node network: (uint32_t)network port: (uint16_t)port #ifdef OF_HAVE_BLOCKS - block: (of_spx_socket_async_connect_block_t)block + block: (OFSPXSocketAsyncConnectBlock)block #endif ; -- (void)startWithRunLoopMode: (of_run_loop_mode_t)runLoopMode; +- (void)startWithRunLoopMode: (OFRunLoopMode)runLoopMode; @end @implementation OFSPXSocketAsyncConnectDelegate - (instancetype)initWithSocket: (OFSPXSocket *)sock node: (unsigned char [IPX_NODE_LEN])node network: (uint32_t)network port: (uint16_t)port #ifdef OF_HAVE_BLOCKS - block: (of_spx_socket_async_connect_block_t)block + block: (OFSPXSocketAsyncConnectBlock)block #endif { self = [super init]; @try { @@ -101,14 +100,14 @@ #endif [super dealloc]; } -- (void)startWithRunLoopMode: (of_run_loop_mode_t)runLoopMode +- (void)startWithRunLoopMode: (OFRunLoopMode)runLoopMode { - of_socket_address_t address = - of_socket_address_ipx(_node, _network, _port); + OFSocketAddress address = + OFSocketAddressMakeIPX(_node, _network, _port); id exception = nil; int errNo; if (![_socket of_createSocketForAddress: &address errNo: &errNo]) { exception = [self of_connectionFailedExceptionForErrNo: errNo]; @@ -172,23 +171,24 @@ @end @implementation OFSPXSocket @dynamic delegate; -- (int)of_createSocketForAddress: (const of_socket_address_t *)address +- (int)of_createSocketForAddress: (const OFSocketAddress *)address errNo: (int *)errNo { #if SOCK_CLOEXEC == 0 && defined(HAVE_FCNTL) && defined(FD_CLOEXEC) int flags; #endif - if (_socket != INVALID_SOCKET) + if (_socket != OFInvalidSocketHandle) @throw [OFAlreadyConnectedException exceptionWithSocket: self]; if ((_socket = socket(address->sockaddr.ipx.sipx_family, - SOCK_SEQPACKET | SOCK_CLOEXEC, NSPROTO_SPX)) == INVALID_SOCKET) { - *errNo = of_socket_errno(); + SOCK_SEQPACKET | SOCK_CLOEXEC, NSPROTO_SPX)) == + OFInvalidSocketHandle) { + *errNo = OFSocketErrNo(); return false; } #if SOCK_CLOEXEC == 0 && defined(HAVE_FCNTL) && defined(FD_CLOEXEC) if ((flags = fcntl(_socket, F_GETFD, 0)) != -1) @@ -196,37 +196,36 @@ #endif return true; } -- (bool)of_connectSocketToAddress: (const of_socket_address_t *)address +- (bool)of_connectSocketToAddress: (const OFSocketAddress *)address errNo: (int *)errNo { - if (_socket == INVALID_SOCKET) + if (_socket == OFInvalidSocketHandle) @throw [OFNotOpenException exceptionWithObject: self]; if (connect(_socket, &address->sockaddr.sockaddr, address->length) != 0) { - *errNo = of_socket_errno(); + *errNo = OFSocketErrNo(); return false; } return true; } - (void)of_closeSocket { closesocket(_socket); - _socket = INVALID_SOCKET; + _socket = OFInvalidSocketHandle; } - (void)connectToNode: (unsigned char [_Nonnull IPX_NODE_LEN])node network: (uint32_t)network port: (uint16_t)port { - of_socket_address_t address = - of_socket_address_ipx(node, network, port); + OFSocketAddress address = OFSocketAddressMakeIPX(node, network, port); int errNo; if (![self of_createSocketForAddress: &address errNo: &errNo]) @throw [OFConnectionFailedException exceptionWithNode: node @@ -252,17 +251,17 @@ port: (uint16_t)port { [self asyncConnectToNode: node network: network port: port - runLoopMode: of_run_loop_mode_default]; + runLoopMode: OFDefaultRunLoopMode]; } - (void)asyncConnectToNode: (unsigned char [_Nonnull IPX_NODE_LEN])node network: (uint32_t)network port: (uint16_t)port - runLoopMode: (of_run_loop_mode_t)runLoopMode + runLoopMode: (OFRunLoopMode)runLoopMode { void *pool = objc_autoreleasePoolPush(); [[[[OFSPXSocketAsyncConnectDelegate alloc] initWithSocket: self @@ -279,24 +278,24 @@ #ifdef OF_HAVE_BLOCKS - (void)asyncConnectToNode: (unsigned char [_Nonnull IPX_NODE_LEN])node network: (uint32_t)network port: (uint16_t)port - block: (of_spx_socket_async_connect_block_t)block + block: (OFSPXSocketAsyncConnectBlock)block { [self asyncConnectToNode: node network: network port: port - runLoopMode: of_run_loop_mode_default + runLoopMode: OFDefaultRunLoopMode block: block]; } - (void)asyncConnectToNode: (unsigned char [_Nonnull IPX_NODE_LEN])node network: (uint32_t)network port: (uint16_t)port - runLoopMode: (of_run_loop_mode_t)runLoopMode - block: (of_spx_socket_async_connect_block_t)block + runLoopMode: (OFRunLoopMode)runLoopMode + block: (OFSPXSocketAsyncConnectBlock)block { void *pool = objc_autoreleasePoolPush(); [[[[OFSPXSocketAsyncConnectDelegate alloc] initWithSocket: self @@ -308,75 +307,76 @@ objc_autoreleasePoolPop(pool); } #endif -- (of_socket_address_t)bindToPort: (uint16_t)port +- (OFSocketAddress)bindToPort: (uint16_t)port { const unsigned char zeroNode[IPX_NODE_LEN] = { 0 }; - of_socket_address_t address; + OFSocketAddress address; #if SOCK_CLOEXEC == 0 && defined(HAVE_FCNTL_H) && defined(FD_CLOEXEC) int flags; #endif - if (_socket != INVALID_SOCKET) + if (_socket != OFInvalidSocketHandle) @throw [OFAlreadyConnectedException exceptionWithSocket: self]; - address = of_socket_address_ipx(zeroNode, 0, port); + address = OFSocketAddressMakeIPX(zeroNode, 0, port); if ((_socket = socket(address.sockaddr.sockaddr.sa_family, - SOCK_SEQPACKET | SOCK_CLOEXEC, NSPROTO_SPX)) == INVALID_SOCKET) + SOCK_SEQPACKET | SOCK_CLOEXEC, NSPROTO_SPX)) == + OFInvalidSocketHandle) @throw [OFBindFailedException exceptionWithPort: port - packetType: SPX_PACKET_TYPE + packetType: SPXPacketType socket: self - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; _canBlock = true; #if SOCK_CLOEXEC == 0 && defined(HAVE_FCNTL_H) && defined(FD_CLOEXEC) if ((flags = fcntl(_socket, F_GETFD, 0)) != -1) fcntl(_socket, F_SETFD, flags | FD_CLOEXEC); #endif if (bind(_socket, &address.sockaddr.sockaddr, address.length) != 0) { - int errNo = of_socket_errno(); + int errNo = OFSocketErrNo(); closesocket(_socket); - _socket = INVALID_SOCKET; + _socket = OFInvalidSocketHandle; @throw [OFBindFailedException exceptionWithPort: port - packetType: SPX_PACKET_TYPE + packetType: SPXPacketType socket: self errNo: errNo]; } memset(&address, 0, sizeof(address)); - address.family = OF_SOCKET_ADDRESS_FAMILY_IPX; + address.family = OFSocketAddressFamilyIPX; address.length = (socklen_t)sizeof(address.sockaddr); - if (of_getsockname(_socket, &address.sockaddr.sockaddr, + if (OFGetSockName(_socket, &address.sockaddr.sockaddr, &address.length) != 0) { - int errNo = of_socket_errno(); + int errNo = OFSocketErrNo(); closesocket(_socket); - _socket = INVALID_SOCKET; + _socket = OFInvalidSocketHandle; @throw [OFBindFailedException exceptionWithPort: port - packetType: SPX_PACKET_TYPE + packetType: SPXPacketType socket: self errNo: errNo]; } if (address.sockaddr.sockaddr.sa_family != AF_IPX) { closesocket(_socket); - _socket = INVALID_SOCKET; + _socket = OFInvalidSocketHandle; @throw [OFBindFailedException exceptionWithPort: port - packetType: SPX_PACKET_TYPE + packetType: SPXPacketType socket: self errNo: EAFNOSUPPORT]; } return address; } @end Index: src/OFSPXStreamSocket.h ================================================================== --- src/OFSPXStreamSocket.h +++ src/OFSPXStreamSocket.h @@ -28,12 +28,11 @@ * @brief A block which is called when the socket connected. * * @param exception An exception which occurred while connecting the socket or * `nil` on success */ -typedef void (^of_spx_stream_socket_async_connect_block_t)( - id _Nullable exception); +typedef void (^OFSPXStreamSocketAsyncConnectBlock)(id _Nullable exception); #endif /** * @protocol OFSPXStreamSocketDelegate OFSPXStreamSocket.h \ * ObjFW/OFSPXStreamSocket.h @@ -120,11 +119,11 @@ * @param runLoopMode The run loop mode in which to perform the async connect */ - (void)asyncConnectToNode: (unsigned char [_Nonnull IPX_NODE_LEN])node network: (uint32_t)network port: (uint16_t)port - runLoopMode: (of_run_loop_mode_t)runLoopMode; + runLoopMode: (OFRunLoopMode)runLoopMode; #ifdef OF_HAVE_BLOCKS /** * @brief Asynchronously connect the OFSPXStreamSocket to the specified * destination. @@ -136,11 +135,11 @@ * @param block The block to execute once the connection has been established */ - (void)asyncConnectToNode: (unsigned char [_Nonnull IPX_NODE_LEN])node network: (uint32_t)network port: (uint16_t)port - block: (of_spx_stream_socket_async_connect_block_t)block; + block: (OFSPXStreamSocketAsyncConnectBlock)block; /** * @brief Asynchronously connect the OFSPXStreamSocket to the specified * destination. * @@ -152,20 +151,20 @@ * @param block The block to execute once the connection has been established */ - (void)asyncConnectToNode: (unsigned char [_Nonnull IPX_NODE_LEN])node network: (uint32_t)network port: (uint16_t)port - runLoopMode: (of_run_loop_mode_t)runLoopMode - block: (of_spx_stream_socket_async_connect_block_t)block; + runLoopMode: (OFRunLoopMode)runLoopMode + block: (OFSPXStreamSocketAsyncConnectBlock)block; #endif /** * @brief Bind the socket to the specified network, node and port. * * @param port The port (sometimes called socket number) to bind to. 0 means to * pick one and return it. * @return The address on which this socket can be reached */ -- (of_socket_address_t)bindToPort: (uint16_t)port; +- (OFSocketAddress)bindToPort: (uint16_t)port; @end OF_ASSUME_NONNULL_END Index: src/OFSPXStreamSocket.m ================================================================== --- src/OFSPXStreamSocket.m +++ src/OFSPXStreamSocket.m @@ -18,29 +18,28 @@ #include #import "OFSPXStreamSocket.h" #import "OFRunLoop.h" #import "OFRunLoop+Private.h" +#import "OFSocket.h" +#import "OFSocket+Private.h" #import "OFAlreadyConnectedException.h" #import "OFBindFailedException.h" #import "OFConnectionFailedException.h" #import "OFNotOpenException.h" -#import "socket.h" -#import "socket_helpers.h" - #ifndef NSPROTO_SPX # define NSPROTO_SPX 0 #endif -#define SPX_PACKET_TYPE 5 +static const uint8_t SPXPacketType = 5; @interface OFSPXStreamSocket () -- (int)of_createSocketForAddress: (const of_socket_address_t *)address +- (int)of_createSocketForAddress: (const OFSocketAddress *)address errNo: (int *)errNo; -- (bool)of_connectSocketToAddress: (const of_socket_address_t *)address +- (bool)of_connectSocketToAddress: (const OFSocketAddress *)address errNo: (int *)errNo; - (void)of_closeSocket; @end OF_DIRECT_MEMBERS @@ -50,34 +49,32 @@ OFSPXStreamSocket *_socket; unsigned char _node[IPX_NODE_LEN]; uint32_t _network; uint16_t _port; #ifdef OF_HAVE_BLOCKS - of_spx_stream_socket_async_connect_block_t _block; + OFSPXStreamSocketAsyncConnectBlock _block; #endif } - (instancetype)initWithSocket: (OFSPXStreamSocket *)socket node: (unsigned char [IPX_NODE_LEN])node network: (uint32_t)network port: (uint16_t)port #ifdef OF_HAVE_BLOCKS - block: (of_spx_stream_socket_async_connect_block_t) - block + block: (OFSPXStreamSocketAsyncConnectBlock)block #endif ; -- (void)startWithRunLoopMode: (of_run_loop_mode_t)runLoopMode; +- (void)startWithRunLoopMode: (OFRunLoopMode)runLoopMode; @end @implementation OFSPXStreamSocketAsyncConnectDelegate - (instancetype)initWithSocket: (OFSPXStreamSocket *)sock node: (unsigned char [IPX_NODE_LEN])node network: (uint32_t)network port: (uint16_t)port #ifdef OF_HAVE_BLOCKS - block: (of_spx_stream_socket_async_connect_block_t) - block + block: (OFSPXStreamSocketAsyncConnectBlock)block #endif { self = [super init]; @try { @@ -104,14 +101,14 @@ #endif [super dealloc]; } -- (void)startWithRunLoopMode: (of_run_loop_mode_t)runLoopMode +- (void)startWithRunLoopMode: (OFRunLoopMode)runLoopMode { - of_socket_address_t address = - of_socket_address_ipx(_node, _network, _port); + OFSocketAddress address = + OFSocketAddressMakeIPX(_node, _network, _port); id exception = nil; int errNo; if (![_socket of_createSocketForAddress: &address errNo: &errNo]) { exception = [self of_connectionFailedExceptionForErrNo: errNo]; @@ -176,23 +173,24 @@ @end @implementation OFSPXStreamSocket @dynamic delegate; -- (int)of_createSocketForAddress: (const of_socket_address_t *)address +- (int)of_createSocketForAddress: (const OFSocketAddress *)address errNo: (int *)errNo { #if SOCK_CLOEXEC == 0 && defined(HAVE_FCNTL) && defined(FD_CLOEXEC) int flags; #endif - if (_socket != INVALID_SOCKET) + if (_socket != OFInvalidSocketHandle) @throw [OFAlreadyConnectedException exceptionWithSocket: self]; if ((_socket = socket(address->sockaddr.ipx.sipx_family, - SOCK_SEQPACKET | SOCK_CLOEXEC, NSPROTO_SPX)) == INVALID_SOCKET) { - *errNo = of_socket_errno(); + SOCK_SEQPACKET | SOCK_CLOEXEC, NSPROTO_SPX)) == + OFInvalidSocketHandle) { + *errNo = OFSocketErrNo(); return false; } #if SOCK_CLOEXEC == 0 && defined(HAVE_FCNTL) && defined(FD_CLOEXEC) if ((flags = fcntl(_socket, F_GETFD, 0)) != -1) @@ -200,37 +198,36 @@ #endif return true; } -- (bool)of_connectSocketToAddress: (const of_socket_address_t *)address +- (bool)of_connectSocketToAddress: (const OFSocketAddress *)address errNo: (int *)errNo { - if (_socket == INVALID_SOCKET) + if (_socket == OFInvalidSocketHandle) @throw [OFNotOpenException exceptionWithObject: self]; if (connect(_socket, &address->sockaddr.sockaddr, address->length) != 0) { - *errNo = of_socket_errno(); + *errNo = OFSocketErrNo(); return false; } return true; } - (void)of_closeSocket { closesocket(_socket); - _socket = INVALID_SOCKET; + _socket = OFInvalidSocketHandle; } - (void)connectToNode: (unsigned char [_Nonnull IPX_NODE_LEN])node network: (uint32_t)network port: (uint16_t)port { - of_socket_address_t address = - of_socket_address_ipx(node, network, port); + OFSocketAddress address = OFSocketAddressMakeIPX(node, network, port); int errNo; if (![self of_createSocketForAddress: &address errNo: &errNo]) @throw [OFConnectionFailedException exceptionWithNode: node @@ -256,17 +253,17 @@ port: (uint16_t)port { [self asyncConnectToNode: node network: network port: port - runLoopMode: of_run_loop_mode_default]; + runLoopMode: OFDefaultRunLoopMode]; } - (void)asyncConnectToNode: (unsigned char [_Nonnull IPX_NODE_LEN])node network: (uint32_t)network port: (uint16_t)port - runLoopMode: (of_run_loop_mode_t)runLoopMode + runLoopMode: (OFRunLoopMode)runLoopMode { void *pool = objc_autoreleasePoolPush(); [[[[OFSPXStreamSocketAsyncConnectDelegate alloc] initWithSocket: self @@ -283,24 +280,24 @@ #ifdef OF_HAVE_BLOCKS - (void)asyncConnectToNode: (unsigned char [_Nonnull IPX_NODE_LEN])node network: (uint32_t)network port: (uint16_t)port - block: (of_spx_stream_socket_async_connect_block_t)block + block: (OFSPXStreamSocketAsyncConnectBlock)block { [self asyncConnectToNode: node network: network port: port - runLoopMode: of_run_loop_mode_default + runLoopMode: OFDefaultRunLoopMode block: block]; } - (void)asyncConnectToNode: (unsigned char [_Nonnull IPX_NODE_LEN])node network: (uint32_t)network port: (uint16_t)port - runLoopMode: (of_run_loop_mode_t)runLoopMode - block: (of_spx_stream_socket_async_connect_block_t)block + runLoopMode: (OFRunLoopMode)runLoopMode + block: (OFSPXStreamSocketAsyncConnectBlock)block { void *pool = objc_autoreleasePoolPush(); [[[[OFSPXStreamSocketAsyncConnectDelegate alloc] initWithSocket: self @@ -312,75 +309,75 @@ objc_autoreleasePoolPop(pool); } #endif -- (of_socket_address_t)bindToPort: (uint16_t)port +- (OFSocketAddress)bindToPort: (uint16_t)port { const unsigned char zeroNode[IPX_NODE_LEN] = { 0 }; - of_socket_address_t address; + OFSocketAddress address; #if SOCK_CLOEXEC == 0 && defined(HAVE_FCNTL_H) && defined(FD_CLOEXEC) int flags; #endif - if (_socket != INVALID_SOCKET) + if (_socket != OFInvalidSocketHandle) @throw [OFAlreadyConnectedException exceptionWithSocket: self]; - address = of_socket_address_ipx(zeroNode, 0, port); + address = OFSocketAddressMakeIPX(zeroNode, 0, port); if ((_socket = socket(address.sockaddr.sockaddr.sa_family, - SOCK_STREAM | SOCK_CLOEXEC, NSPROTO_SPX)) == INVALID_SOCKET) + SOCK_STREAM | SOCK_CLOEXEC, NSPROTO_SPX)) == OFInvalidSocketHandle) @throw [OFBindFailedException exceptionWithPort: port - packetType: SPX_PACKET_TYPE + packetType: SPXPacketType socket: self - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; _canBlock = true; #if SOCK_CLOEXEC == 0 && defined(HAVE_FCNTL_H) && defined(FD_CLOEXEC) if ((flags = fcntl(_socket, F_GETFD, 0)) != -1) fcntl(_socket, F_SETFD, flags | FD_CLOEXEC); #endif if (bind(_socket, &address.sockaddr.sockaddr, address.length) != 0) { - int errNo = of_socket_errno(); + int errNo = OFSocketErrNo(); closesocket(_socket); - _socket = INVALID_SOCKET; + _socket = OFInvalidSocketHandle; @throw [OFBindFailedException exceptionWithPort: port - packetType: SPX_PACKET_TYPE + packetType: SPXPacketType socket: self errNo: errNo]; } memset(&address, 0, sizeof(address)); - address.family = OF_SOCKET_ADDRESS_FAMILY_IPX; + address.family = OFSocketAddressFamilyIPX; address.length = (socklen_t)sizeof(address.sockaddr); - if (of_getsockname(_socket, &address.sockaddr.sockaddr, + if (OFGetSockName(_socket, &address.sockaddr.sockaddr, &address.length) != 0) { - int errNo = of_socket_errno(); + int errNo = OFSocketErrNo(); closesocket(_socket); - _socket = INVALID_SOCKET; + _socket = OFInvalidSocketHandle; @throw [OFBindFailedException exceptionWithPort: port - packetType: SPX_PACKET_TYPE + packetType: SPXPacketType socket: self errNo: errNo]; } if (address.sockaddr.sockaddr.sa_family != AF_IPX) { closesocket(_socket); - _socket = INVALID_SOCKET; + _socket = OFInvalidSocketHandle; @throw [OFBindFailedException exceptionWithPort: port - packetType: SPX_PACKET_TYPE + packetType: SPXPacketType socket: self errNo: EAFNOSUPPORT]; } return address; } @end Index: src/OFSandbox.h ================================================================== --- src/OFSandbox.h +++ src/OFSandbox.h @@ -15,27 +15,16 @@ #import "OFObject.h" OF_ASSUME_NONNULL_BEGIN -/** @file */ - @class OFArray OF_GENERIC(ObjectType); @class OFMutableArray OF_GENERIC(ObjectType); @class OFPair OF_GENERIC(FirstType, SecondType); -/** - * @brief An @ref OFPair for a path to unveil, with the first string being the - * path and the second the permissions. - */ -typedef OFPair OF_GENERIC(OFString *, OFString *) *of_sandbox_unveil_path_t; - -/** - * @class OFSandbox OFSandbox.h ObjFW/OFSandbox.h - * - * @brief A class which describes a sandbox for the application. - */ +typedef OFPair OF_GENERIC(OFString *, OFString *) *OFSandboxUnveilPath; + @interface OFSandbox: OFObject { unsigned int _allowsStdIO: 1; unsigned int _allowsReadingFiles: 1; unsigned int _allowsWritingFiles: 1; @@ -64,203 +53,52 @@ unsigned int _allowsPF: 1; unsigned int _allowsAudio: 1; unsigned int _allowsBPF: 1; unsigned int _allowsUnveil: 1; unsigned int _returnsErrors: 1; - OFMutableArray OF_GENERIC(of_sandbox_unveil_path_t) *_unveiledPaths; + OFMutableArray OF_GENERIC(OFSandboxUnveilPath) *_unveiledPaths; @public size_t _unveiledPathsIndex; OF_RESERVE_IVARS(OFSandbox, 4) } -/** - * @brief Allows IO operations on previously allocated file descriptors. - */ @property (nonatomic) bool allowsStdIO; - -/** - * @brief Allows read access to the file system. - */ @property (nonatomic) bool allowsReadingFiles; - -/** - * @brief Allows write access to the file system. - */ @property (nonatomic) bool allowsWritingFiles; - -/** - * @brief Allows creating files in the file system. - */ @property (nonatomic) bool allowsCreatingFiles; - -/** - * @brief Allows creating special files in the file system. - */ @property (nonatomic) bool allowsCreatingSpecialFiles; - -/** - * @brief Allows creating, reading and writing temporary files in `/tmp`. - */ @property (nonatomic) bool allowsTemporaryFiles; - -/** - * @brief Allows using IP sockets. - */ @property (nonatomic) bool allowsIPSockets; - -/** - * @brief Allows multicast sockets. - */ @property (nonatomic) bool allowsMulticastSockets; - -/** - * @brief Allows explicit changes to file attributes. - */ @property (nonatomic) bool allowsChangingFileAttributes; - -/** - * @brief Allows changing ownership of files. - */ @property (nonatomic) bool allowsFileOwnerChanges; - -/** - * @brief Allows file locks. - */ @property (nonatomic) bool allowsFileLocks; - -/** - * @brief Allows UNIX sockets. - */ @property (nonatomic) bool allowsUNIXSockets; - -/** - * @brief Allows syscalls necessary for DNS lookups. - */ @property (nonatomic) bool allowsDNS; - -/** - * @brief Allows to look up users and groups. - */ @property (nonatomic) bool allowsUserDatabaseReading; - -/** - * @brief Allows sending file descriptors via sendmsg(). - */ @property (nonatomic) bool allowsFileDescriptorSending; - -/** - * @brief Allows receiving file descriptors via recvmsg(). - */ @property (nonatomic) bool allowsFileDescriptorReceiving; - -/** - * @brief Allows MTIOCGET and MTIOCTOP operations on tape devices. - */ @property (nonatomic) bool allowsTape; - -/** - * @brief Allows read-write operations and ioctls on the TTY. - */ @property (nonatomic) bool allowsTTY; - -/** - * @brief Allows various process relationshop operations. - */ @property (nonatomic) bool allowsProcessOperations; - -/** - * @brief Allows execve(). - */ @property (nonatomic) bool allowsExec; - -/** - * @brief Allows PROT_EXEC for `mmap()` and `mprotect()`. - */ @property (nonatomic) bool allowsProtExec; - -/** - * @brief Allows `settime()`. - */ @property (nonatomic) bool allowsSetTime; - -/** - * @brief Allows introspection of processes on the system. - */ @property (nonatomic) bool allowsPS; - -/** - * @brief Allows introspection of the system's virtual memory. - */ @property (nonatomic) bool allowsVMInfo; - -/** - * @brief Allows changing the rights of process, for example the UID. - */ @property (nonatomic) bool allowsChangingProcessRights; - -/** - * @brief Allows certain ioctls on the PF device. - */ @property (nonatomic) bool allowsPF; - -/** - * @brief Allows certain ioctls on audio devices. - */ @property (nonatomic) bool allowsAudio; - -/** - * @brief Allows BIOCGSTATS to collect statistics from a BPF device. - */ @property (nonatomic) bool allowsBPF; - -/** - * @brief Allows unveiling more paths. - */ @property (nonatomic) bool allowsUnveil; - -/** - * @brief Returns errors instead of killing the process. - */ @property (nonatomic) bool returnsErrors; - #ifdef OF_HAVE_PLEDGE -/** - * The string for OpenBSD's pledge() call. - * - * @warning Only available on systems with the pledge() call! - */ @property (readonly, nonatomic) OFString *pledgeString; #endif - -/** - * @brief A list of unveiled paths. - */ -@property (readonly, nonatomic) - OFArray OF_GENERIC(of_sandbox_unveil_path_t) *unveiledPaths; - -/** - * @brief Create a new, autorelease OFSandbox. - */ -+ (instancetype)sandbox; - -/** - * @brief "Unveils" the specified path, meaning that it becomes visible from - * the sandbox with the specified permissions. - * - * @param path The path to unveil - * @param permissions The permissions for the path. The following permissions - * can be combined: - * Permission | Description - * -----------|-------------------- - * r | Make the path available for reading, like - * | @ref allowsReadingFiles - * w | Make the path available for writing, like - * | @ref allowsWritingFiles - * x | Make the path available for executing, like - * | @ref allowsExec - * c | Make the path available for creation and - * | deletion, like @ref allowsCreatingFiles - */ +@property (readonly, nonatomic) + OFArray OF_GENERIC(OFSandboxUnveilPath) *unveiledPaths; + ++ (instancetype)sandbox; - (void)unveilPath: (OFString *)path permissions: (OFString *)permissions; @end OF_ASSUME_NONNULL_END Index: src/OFSandbox.m ================================================================== --- src/OFSandbox.m +++ src/OFSandbox.m @@ -467,46 +467,46 @@ return true; } - (unsigned long)hash { - uint32_t hash; - - OF_HASH_INIT(hash); - - OF_HASH_ADD(hash, _allowsStdIO); - OF_HASH_ADD(hash, _allowsReadingFiles); - OF_HASH_ADD(hash, _allowsWritingFiles); - OF_HASH_ADD(hash, _allowsCreatingFiles); - OF_HASH_ADD(hash, _allowsCreatingSpecialFiles); - OF_HASH_ADD(hash, _allowsTemporaryFiles); - OF_HASH_ADD(hash, _allowsIPSockets); - OF_HASH_ADD(hash, _allowsMulticastSockets); - OF_HASH_ADD(hash, _allowsChangingFileAttributes); - OF_HASH_ADD(hash, _allowsFileOwnerChanges); - OF_HASH_ADD(hash, _allowsFileLocks); - OF_HASH_ADD(hash, _allowsUNIXSockets); - OF_HASH_ADD(hash, _allowsDNS); - OF_HASH_ADD(hash, _allowsUserDatabaseReading); - OF_HASH_ADD(hash, _allowsFileDescriptorSending); - OF_HASH_ADD(hash, _allowsFileDescriptorReceiving); - OF_HASH_ADD(hash, _allowsTape); - OF_HASH_ADD(hash, _allowsTTY); - OF_HASH_ADD(hash, _allowsProcessOperations); - OF_HASH_ADD(hash, _allowsExec); - OF_HASH_ADD(hash, _allowsProtExec); - OF_HASH_ADD(hash, _allowsSetTime); - OF_HASH_ADD(hash, _allowsPS); - OF_HASH_ADD(hash, _allowsVMInfo); - OF_HASH_ADD(hash, _allowsChangingProcessRights); - OF_HASH_ADD(hash, _allowsPF); - OF_HASH_ADD(hash, _allowsAudio); - OF_HASH_ADD(hash, _allowsBPF); - OF_HASH_ADD(hash, _allowsUnveil); - OF_HASH_ADD(hash, _returnsErrors); - - OF_HASH_FINALIZE(hash); + unsigned long hash; + + OFHashInit(&hash); + + OFHashAdd(&hash, _allowsStdIO); + OFHashAdd(&hash, _allowsReadingFiles); + OFHashAdd(&hash, _allowsWritingFiles); + OFHashAdd(&hash, _allowsCreatingFiles); + OFHashAdd(&hash, _allowsCreatingSpecialFiles); + OFHashAdd(&hash, _allowsTemporaryFiles); + OFHashAdd(&hash, _allowsIPSockets); + OFHashAdd(&hash, _allowsMulticastSockets); + OFHashAdd(&hash, _allowsChangingFileAttributes); + OFHashAdd(&hash, _allowsFileOwnerChanges); + OFHashAdd(&hash, _allowsFileLocks); + OFHashAdd(&hash, _allowsUNIXSockets); + OFHashAdd(&hash, _allowsDNS); + OFHashAdd(&hash, _allowsUserDatabaseReading); + OFHashAdd(&hash, _allowsFileDescriptorSending); + OFHashAdd(&hash, _allowsFileDescriptorReceiving); + OFHashAdd(&hash, _allowsTape); + OFHashAdd(&hash, _allowsTTY); + OFHashAdd(&hash, _allowsProcessOperations); + OFHashAdd(&hash, _allowsExec); + OFHashAdd(&hash, _allowsProtExec); + OFHashAdd(&hash, _allowsSetTime); + OFHashAdd(&hash, _allowsPS); + OFHashAdd(&hash, _allowsVMInfo); + OFHashAdd(&hash, _allowsChangingProcessRights); + OFHashAdd(&hash, _allowsPF); + OFHashAdd(&hash, _allowsAudio); + OFHashAdd(&hash, _allowsBPF); + OFHashAdd(&hash, _allowsUnveil); + OFHashAdd(&hash, _returnsErrors); + + OFHashFinalize(&hash); return hash; } #ifdef OF_HAVE_PLEDGE @@ -595,10 +595,10 @@ secondObject: permissions]]; objc_autoreleasePoolPop(pool); } -- (OFArray OF_GENERIC(of_sandbox_unveil_path_t) *)unveiledPaths +- (OFArray OF_GENERIC(OFSandboxUnveilPath) *)unveiledPaths { return [[_unveiledPaths copy] autorelease]; } @end ADDED src/OFScrypt.h Index: src/OFScrypt.h ================================================================== --- src/OFScrypt.h +++ src/OFScrypt.h @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#ifndef __STDC_LIMIT_MACROS +# define __STDC_LIMIT_MACROS +#endif +#ifndef __STDC_CONSTANT_MACROS +# define __STDC_CONSTANT_MACROS +#endif + +#import "macros.h" + +OF_ASSUME_NONNULL_BEGIN + +/** @file */ + +@class OFHMAC; + +/** + * @brief The parameters for @ref OFScrypt. + */ +typedef struct { + /** @brief The block size to use. */ + size_t blockSize; + /** @brief The CPU/memory cost factor to use. */ + size_t costFactor; + /** @brief The parallelization to use. */ + size_t parallelization; + /** @brief The salt to derive a key with. */ + const unsigned char *salt; + /** @brief The length of the salt. */ + size_t saltLength; + /** @brief The password to derive a key from. */ + const char *password; + /** @brief The length of the password. */ + size_t passwordLength; + /** @brief The buffer to write the key to. */ + unsigned char *key; + /** + * @brief The desired length for the derived key. + * + * @ref key needs to have enough storage. + */ + size_t keyLength; + /** @brief Whether data may be stored in swappable memory. */ + bool allowsSwappableMemory; +} OFScryptParameters; + +#ifdef __cplusplus +extern "C" { +#endif +extern void OFSalsa20_8Core(uint32_t buffer[_Nonnull 16]); +extern void OFScryptBlockMix(uint32_t *output, const uint32_t *input, + size_t blockSize); +extern void OFScryptROMix(uint32_t *buffer, size_t blockSize, + size_t costFactor, uint32_t *tmp); + +/** + * @brief Derives a key from a password and a salt using scrypt. + * + * @param param The parameters to use + */ +extern void OFScrypt(OFScryptParameters param); +#ifdef __cplusplus +} +#endif + +OF_ASSUME_NONNULL_END ADDED src/OFScrypt.m Index: src/OFScrypt.m ================================================================== --- src/OFScrypt.m +++ src/OFScrypt.m @@ -0,0 +1,219 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#import "OFHMAC.h" +#import "OFSHA256Hash.h" +#import "OFSecureData.h" + +#import "OFInvalidArgumentException.h" +#import "OFOutOfMemoryException.h" +#import "OFOutOfRangeException.h" + +#import "OFScrypt.h" +#import "OFPBKDF2.h" + +void +OFSalsa20_8Core(uint32_t buffer[16]) +{ + uint32_t tmp[16]; + + for (uint_fast8_t i = 0; i < 16; i++) + tmp[i] = OFToLittleEndian32(buffer[i]); + + for (uint_fast8_t i = 0; i < 8; i += 2) { + tmp[ 4] ^= OFRotateLeft(tmp[ 0] + tmp[12], 7); + tmp[ 8] ^= OFRotateLeft(tmp[ 4] + tmp[ 0], 9); + tmp[12] ^= OFRotateLeft(tmp[ 8] + tmp[ 4], 13); + tmp[ 0] ^= OFRotateLeft(tmp[12] + tmp[ 8], 18); + tmp[ 9] ^= OFRotateLeft(tmp[ 5] + tmp[ 1], 7); + tmp[13] ^= OFRotateLeft(tmp[ 9] + tmp[ 5], 9); + tmp[ 1] ^= OFRotateLeft(tmp[13] + tmp[ 9], 13); + tmp[ 5] ^= OFRotateLeft(tmp[ 1] + tmp[13], 18); + tmp[14] ^= OFRotateLeft(tmp[10] + tmp[ 6], 7); + tmp[ 2] ^= OFRotateLeft(tmp[14] + tmp[10], 9); + tmp[ 6] ^= OFRotateLeft(tmp[ 2] + tmp[14], 13); + tmp[10] ^= OFRotateLeft(tmp[ 6] + tmp[ 2], 18); + tmp[ 3] ^= OFRotateLeft(tmp[15] + tmp[11], 7); + tmp[ 7] ^= OFRotateLeft(tmp[ 3] + tmp[15], 9); + tmp[11] ^= OFRotateLeft(tmp[ 7] + tmp[ 3], 13); + tmp[15] ^= OFRotateLeft(tmp[11] + tmp[ 7], 18); + tmp[ 1] ^= OFRotateLeft(tmp[ 0] + tmp[ 3], 7); + tmp[ 2] ^= OFRotateLeft(tmp[ 1] + tmp[ 0], 9); + tmp[ 3] ^= OFRotateLeft(tmp[ 2] + tmp[ 1], 13); + tmp[ 0] ^= OFRotateLeft(tmp[ 3] + tmp[ 2], 18); + tmp[ 6] ^= OFRotateLeft(tmp[ 5] + tmp[ 4], 7); + tmp[ 7] ^= OFRotateLeft(tmp[ 6] + tmp[ 5], 9); + tmp[ 4] ^= OFRotateLeft(tmp[ 7] + tmp[ 6], 13); + tmp[ 5] ^= OFRotateLeft(tmp[ 4] + tmp[ 7], 18); + tmp[11] ^= OFRotateLeft(tmp[10] + tmp[ 9], 7); + tmp[ 8] ^= OFRotateLeft(tmp[11] + tmp[10], 9); + tmp[ 9] ^= OFRotateLeft(tmp[ 8] + tmp[11], 13); + tmp[10] ^= OFRotateLeft(tmp[ 9] + tmp[ 8], 18); + tmp[12] ^= OFRotateLeft(tmp[15] + tmp[14], 7); + tmp[13] ^= OFRotateLeft(tmp[12] + tmp[15], 9); + tmp[14] ^= OFRotateLeft(tmp[13] + tmp[12], 13); + tmp[15] ^= OFRotateLeft(tmp[14] + tmp[13], 18); + } + + for (uint_fast8_t i = 0; i < 16; i++) + buffer[i] = OFToLittleEndian32(OFFromLittleEndian32(buffer[i]) + + tmp[i]); + + OFZeroMemory(tmp, sizeof(tmp)); +} + +void +OFScryptBlockMix(uint32_t *output, const uint32_t *input, size_t blockSize) +{ + uint32_t tmp[16]; + + /* Check defined here and executed in OFScrypt() */ +#define OVERFLOW_CHECK_1 \ + if (param.blockSize > SIZE_MAX / 2 || \ + 2 * param.blockSize - 1 > SIZE_MAX / 16) \ + @throw [OFOutOfRangeException exception]; + + memcpy(tmp, input + (2 * blockSize - 1) * 16, 64); + + for (size_t i = 0; i < 2 * blockSize; i++) { + for (size_t j = 0; j < 16; j++) + tmp[j] ^= input[i * 16 + j]; + + OFSalsa20_8Core(tmp); + + /* + * Even indices are stored in the first half and odd ones in + * the second. + */ + memcpy(output + ((i / 2) + (i & 1) * blockSize) * 16, tmp, 64); + } + + OFZeroMemory(tmp, sizeof(tmp)); +} + +void +OFScryptROMix(uint32_t *buffer, size_t blockSize, size_t costFactor, + uint32_t *tmp) +{ + /* Check defined here and executed in OFScrypt() */ +#define OVERFLOW_CHECK_2 \ + if (param.blockSize > SIZE_MAX / 128 / param.costFactor) \ + @throw [OFOutOfRangeException exception]; + + uint32_t *tmp2 = tmp + 32 * blockSize; + + memcpy(tmp, buffer, 128 * blockSize); + + for (size_t i = 0; i < costFactor; i++) { + memcpy(tmp2 + i * 32 * blockSize, tmp, 128 * blockSize); + OFScryptBlockMix(tmp, tmp2 + i * 32 * blockSize, blockSize); + } + + for (size_t i = 0; i < costFactor; i++) { + uint32_t j = OFFromLittleEndian32( + tmp[(2 * blockSize - 1) * 16]) & (costFactor - 1); + + for (size_t k = 0; k < 32 * blockSize; k++) + tmp[k] ^= tmp2[j * 32 * blockSize + k]; + + OFScryptBlockMix(buffer, tmp, blockSize); + + if (i < costFactor - 1) + memcpy(tmp, buffer, 128 * blockSize); + } +} + +void +OFScrypt(OFScryptParameters param) +{ + OFSecureData *tmp = nil, *buffer = nil; + OFHMAC *HMAC = nil; + + if (param.blockSize == 0 || param.costFactor <= 1 || + (param.costFactor & (param.costFactor - 1)) != 0 || + param.parallelization == 0) + @throw [OFInvalidArgumentException exception]; + + /* + * These are defined by the functions above. They are defined there so + * that the check is next to the code and easy to verify, but actually + * checked here for performance. + */ + OVERFLOW_CHECK_1 + OVERFLOW_CHECK_2 + + @try { + uint32_t *tmpItems, *bufferItems; + + if (param.costFactor > SIZE_MAX - 1 || + (param.costFactor + 1) > SIZE_MAX / 128) + @throw [OFOutOfRangeException exception]; + + tmp = [[OFSecureData alloc] + initWithCount: (param.costFactor + 1) * 128 + itemSize: param.blockSize + allowsSwappableMemory: param.allowsSwappableMemory]; + tmpItems = tmp.mutableItems; + + if (param.parallelization > SIZE_MAX / 128) + @throw [OFOutOfRangeException exception]; + + buffer = [[OFSecureData alloc] + initWithCount: param.parallelization * 128 + itemSize: param.blockSize + allowsSwappableMemory: param.allowsSwappableMemory]; + bufferItems = buffer.mutableItems; + + HMAC = [[OFHMAC alloc] + initWithHashClass: [OFSHA256Hash class] + allowsSwappableMemory: param.allowsSwappableMemory]; + + OFPBKDF2((OFPBKDF2Parameters){ + .HMAC = HMAC, + .iterations = 1, + .salt = param.salt, + .saltLength = param.saltLength, + .password = param.password, + .passwordLength = param.passwordLength, + .key = (unsigned char *)bufferItems, + .keyLength = param.parallelization * 128 * + param.blockSize, + .allowsSwappableMemory = param.allowsSwappableMemory + }); + + for (size_t i = 0; i < param.parallelization; i++) + OFScryptROMix(bufferItems + i * 32 * param.blockSize, + param.blockSize, param.costFactor, tmpItems); + + OFPBKDF2((OFPBKDF2Parameters){ + .HMAC = HMAC, + .iterations = 1, + .salt = (unsigned char *)bufferItems, + .saltLength = param.parallelization * 128 * + param.blockSize, + .password = param.password, + .passwordLength = param.passwordLength, + .key = param.key, + .keyLength = param.keyLength, + .allowsSwappableMemory = param.allowsSwappableMemory + }); + } @finally { + [tmp release]; + [buffer release]; + [HMAC release]; + } +} Index: src/OFSecureData.m ================================================================== --- src/OFSecureData.m +++ src/OFSecureData.m @@ -23,24 +23,23 @@ #endif #import "OFSecureData.h" #import "OFString.h" #import "OFSystemInfo.h" +#ifdef OF_HAVE_THREADS +# import "OFTLSKey.h" +#endif #import "OFInitializationFailedException.h" #import "OFInvalidArgumentException.h" #import "OFNotImplementedException.h" #import "OFOutOfMemoryException.h" #import "OFOutOfRangeException.h" -#ifdef OF_HAVE_THREADS -# import "tlskey.h" -#endif - -#define CHUNK_SIZE 16 - #if defined(HAVE_MMAP) && defined(HAVE_MLOCK) && defined(MAP_ANON) +static const size_t chunkSize = 16; + struct page { struct page *next, *previous; void *map; unsigned char *page; }; @@ -49,12 +48,12 @@ static thread_local struct page *firstPage = NULL; static thread_local struct page *lastPage = NULL; static thread_local struct page **preallocatedPages = NULL; static thread_local size_t numPreallocatedPages = 0; # elif defined(OF_HAVE_THREADS) -static of_tlskey_t firstPageKey, lastPageKey; -static of_tlskey_t preallocatedPagesKey, numPreallocatedPagesKey; +static OFTLSKey firstPageKey, lastPageKey; +static OFTLSKey preallocatedPagesKey, numPreallocatedPagesKey; # else static struct page *firstPage = NULL; static struct page *lastPage = NULL; static struct page **preallocatedPages = NULL; static size_t numPreallocatedPages = 0; @@ -97,68 +96,68 @@ static struct page * addPage(bool allowPreallocated) { size_t pageSize = [OFSystemInfo pageSize]; - size_t mapSize = OF_ROUND_UP_POW2(CHAR_BIT, pageSize / CHUNK_SIZE) / + size_t mapSize = OFRoundUpToPowerOf2(CHAR_BIT, pageSize / chunkSize) / CHAR_BIT; struct page *page; # if !defined(OF_HAVE_COMPILER_TLS) && defined(OF_HAVE_THREADS) struct page *lastPage; # endif if (allowPreallocated) { # if !defined(OF_HAVE_COMPILER_TLS) && defined(OF_HAVE_THREADS) uintptr_t numPreallocatedPages = - (uintptr_t)of_tlskey_get(numPreallocatedPagesKey); + (uintptr_t)OFTLSKeyGet(numPreallocatedPagesKey); # endif if (numPreallocatedPages > 0) { # if !defined(OF_HAVE_COMPILER_TLS) && defined(OF_HAVE_THREADS) struct page **preallocatedPages = - of_tlskey_get(preallocatedPagesKey); + OFTLSKeyGet(preallocatedPagesKey); # endif numPreallocatedPages--; # if !defined(OF_HAVE_COMPILER_TLS) && defined(OF_HAVE_THREADS) - OF_ENSURE(of_tlskey_set(numPreallocatedPagesKey, + OFEnsure(OFTLSKeySet(numPreallocatedPagesKey, (void *)numPreallocatedPages) == 0); # endif page = preallocatedPages[numPreallocatedPages]; if (numPreallocatedPages == 0) { - free(preallocatedPages); + OFFreeMemory(preallocatedPages); preallocatedPages = NULL; # if !defined(OF_HAVE_COMPILER_TLS) && defined(OF_HAVE_THREADS) - OF_ENSURE(of_tlskey_set(preallocatedPagesKey, + OFEnsure(OFTLSKeySet(preallocatedPagesKey, preallocatedPages) == 0); # endif } return page; } } - page = of_alloc(1, sizeof(*page)); + page = OFAllocMemory(1, sizeof(*page)); @try { - page->map = of_alloc_zeroed(1, mapSize); + page->map = OFAllocZeroedMemory(1, mapSize); } @catch (id e) { - free(page); + OFFreeMemory(page); @throw e; } @try { page->page = mapPages(1); } @catch (id e) { - free(page->map); - free(page); + OFFreeMemory(page->map); + OFFreeMemory(page); @throw e; } - of_explicit_memset(page->page, 0, pageSize); + OFZeroMemory(page->page, pageSize); # if !defined(OF_HAVE_COMPILER_TLS) && defined(OF_HAVE_THREADS) - lastPage = of_tlskey_get(lastPageKey); + lastPage = OFTLSKeyGet(lastPageKey); # endif page->previous = lastPage; page->next = NULL; @@ -169,14 +168,14 @@ lastPage = page; if (firstPage == NULL) firstPage = page; # else - OF_ENSURE(of_tlskey_set(lastPageKey, page) == 0); + OFEnsure(OFTLSKeySet(lastPageKey, page) == 0); - if (of_tlskey_get(firstPageKey) == NULL) - OF_ENSURE(of_tlskey_set(firstPageKey, page) == 0); + if (OFTLSKeyGet(firstPageKey) == NULL) + OFEnsure(OFTLSKeySet(firstPageKey, page) == 0); # endif return page; } @@ -183,19 +182,19 @@ static void removePageIfEmpty(struct page *page) { unsigned char *map = page->map; size_t pageSize = [OFSystemInfo pageSize]; - size_t mapSize = OF_ROUND_UP_POW2(CHAR_BIT, pageSize / CHUNK_SIZE) / + size_t mapSize = OFRoundUpToPowerOf2(CHAR_BIT, pageSize / chunkSize) / CHAR_BIT; for (size_t i = 0; i < mapSize; i++) if (map[i] != 0) return; unmapPages(page->page, 1); - free(page->map); + OFFreeMemory(page->map); if (page->previous != NULL) page->previous->next = page->next; if (page->next != NULL) page->next->previous = page->previous; @@ -204,31 +203,31 @@ if (firstPage == page) firstPage = page->next; if (lastPage == page) lastPage = page->previous; # else - if (of_tlskey_get(firstPageKey) == page) - OF_ENSURE(of_tlskey_set(firstPageKey, page->next) == 0); - if (of_tlskey_get(lastPageKey) == page) - OF_ENSURE(of_tlskey_set(lastPageKey, page->previous) == 0); + if (OFTLSKeyGet(firstPageKey) == page) + OFEnsure(OFTLSKeySet(firstPageKey, page->next) == 0); + if (OFTLSKeyGet(lastPageKey) == page) + OFEnsure(OFTLSKeySet(lastPageKey, page->previous) == 0); # endif - free(page); + OFFreeMemory(page); } static void * allocateMemory(struct page *page, size_t bytes) { size_t chunks, chunksLeft, pageSize, i, firstChunk; - bytes = OF_ROUND_UP_POW2(CHUNK_SIZE, bytes); - chunks = chunksLeft = bytes / CHUNK_SIZE; + bytes = OFRoundUpToPowerOf2(chunkSize, bytes); + chunks = chunksLeft = bytes / chunkSize; firstChunk = 0; pageSize = [OFSystemInfo pageSize]; - for (i = 0; i < pageSize / CHUNK_SIZE; i++) { - if (of_bitset_isset(page->map, i)) { + for (i = 0; i < pageSize / chunkSize; i++) { + if (OFBitsetIsSet(page->map, i)) { chunksLeft = chunks; firstChunk = i + 1; continue; } @@ -236,13 +235,13 @@ break; } if (chunksLeft == 0) { for (size_t j = firstChunk; j < firstChunk + chunks; j++) - of_bitset_set(page->map, j); + OFBitsetSet(page->map, j); - return page->page + (CHUNK_SIZE * firstChunk); + return page->page + (chunkSize * firstChunk); } return NULL; } @@ -249,18 +248,18 @@ static void freeMemory(struct page *page, void *pointer, size_t bytes) { size_t chunks, chunkIndex; - bytes = OF_ROUND_UP_POW2(CHUNK_SIZE, bytes); - chunks = bytes / CHUNK_SIZE; - chunkIndex = ((uintptr_t)pointer - (uintptr_t)page->page) / CHUNK_SIZE; + bytes = OFRoundUpToPowerOf2(chunkSize, bytes); + chunks = bytes / chunkSize; + chunkIndex = ((uintptr_t)pointer - (uintptr_t)page->page) / chunkSize; - of_explicit_memset(pointer, 0, bytes); + OFZeroMemory(pointer, bytes); for (size_t i = 0; i < chunks; i++) - of_bitset_clear(page->map, chunkIndex + i); + OFBitsetClear(page->map, chunkIndex + i); } #endif @implementation OFSecureData @synthesize allowsSwappableMemory = _allowsSwappableMemory; @@ -270,54 +269,53 @@ + (void)initialize { if (self != [OFSecureData class]) return; - if (of_tlskey_new(&firstPageKey) != 0 || - of_tlskey_new(&lastPageKey) != 0 || - of_tlskey_new(&preallocatedPagesKey) != 0 || - of_tlskey_new(&numPreallocatedPagesKey) != 0) + if (OFTLSKeyNew(&firstPageKey) != 0 || OFTLSKeyNew(&lastPageKey) != 0 || + OFTLSKeyNew(&preallocatedPagesKey) != 0 || + OFTLSKeyNew(&numPreallocatedPagesKey) != 0) @throw [OFInitializationFailedException exceptionWithClass: self]; } #endif + (void)preallocateUnswappableMemoryWithSize: (size_t)size { #if defined(HAVE_MMAP) && defined(HAVE_MLOCK) && defined(MAP_ANON) size_t pageSize = [OFSystemInfo pageSize]; - size_t numPages = OF_ROUND_UP_POW2(pageSize, size) / pageSize; + size_t numPages = OFRoundUpToPowerOf2(pageSize, size) / pageSize; # if !defined(OF_HAVE_COMPILER_TLS) && defined(OF_HAVE_THREADS) - struct page **preallocatedPages = of_tlskey_get(preallocatedPagesKey); + struct page **preallocatedPages = OFTLSKeyGet(preallocatedPagesKey); size_t numPreallocatedPages; # endif size_t i; if (preallocatedPages != NULL) @throw [OFInvalidArgumentException exception]; - preallocatedPages = of_alloc_zeroed(numPages, sizeof(struct page)); + preallocatedPages = OFAllocZeroedMemory(numPages, sizeof(struct page)); # if !defined(OF_HAVE_COMPILER_TLS) && defined(OF_HAVE_THREADS) - OF_ENSURE(of_tlskey_set(preallocatedPagesKey, preallocatedPages) == 0); + OFEnsure(OFTLSKeySet(preallocatedPagesKey, preallocatedPages) == 0); # endif @try { for (i = 0; i < numPages; i++) preallocatedPages[i] = addPage(false); } @catch (id e) { for (size_t j = 0; j < i; j++) removePageIfEmpty(preallocatedPages[j]); - free(preallocatedPages); + OFFreeMemory(preallocatedPages); preallocatedPages = NULL; @throw e; } numPreallocatedPages = numPages; # if !defined(OF_HAVE_COMPILER_TLS) && defined(OF_HAVE_THREADS) - OF_ENSURE(of_tlskey_set(numPreallocatedPagesKey, + OFEnsure(OFTLSKeySet(numPreallocatedPagesKey, (void *)(uintptr_t)numPreallocatedPages) == 0); # endif #else @throw [OFNotImplementedException exceptionWithSelector: _cmd object: self]; @@ -414,20 +412,20 @@ if (count > SIZE_MAX / itemSize) @throw [OFOutOfRangeException exception]; if (allowsSwappableMemory) { - _items = of_alloc(count, itemSize); + _items = OFAllocMemory(count, itemSize); _freeWhenDone = true; memset(_items, 0, count * itemSize); #if defined(HAVE_MMAP) && defined(HAVE_MLOCK) && defined(MAP_ANON) } else if (count * itemSize >= pageSize) - _items = mapPages(OF_ROUND_UP_POW2(pageSize, + _items = mapPages(OFRoundUpToPowerOf2(pageSize, count * itemSize) / pageSize); else { # if !defined(OF_HAVE_COMPILER_TLS) && defined(OF_HAVE_THREADS) - struct page *lastPage = of_tlskey_get(lastPageKey); + struct page *lastPage = OFTLSKeyGet(lastPageKey); # endif for (struct page *page = lastPage; page != NULL; page = page->previous) { _items = allocateMemory(page, count * itemSize); @@ -529,11 +527,11 @@ if (!_allowsSwappableMemory) { size_t pageSize = [OFSystemInfo pageSize]; if (_count * _itemSize > pageSize) unmapPages(_items, - OF_ROUND_UP_POW2(pageSize, _count * _itemSize) / + OFRoundUpToPowerOf2(pageSize, _count * _itemSize) / pageSize); else if (_page != NULL) { if (_items != NULL) freeMemory(_page, _items, _count * _itemSize); @@ -558,11 +556,11 @@ return _items + idx * _itemSize; } - (void)zero { - of_explicit_memset(_items, 0, _count * _itemSize); + OFZeroMemory(_items, _count * _itemSize); } - (id)copy { OFSecureData *copy = [[OFSecureData alloc] Index: src/OFSeekableStream.h ================================================================== --- src/OFSeekableStream.h +++ src/OFSeekableStream.h @@ -29,19 +29,19 @@ #import "OFStream.h" OF_ASSUME_NONNULL_BEGIN #if defined(OF_WINDOWS) -typedef __int64 of_offset_t; +typedef __int64 OFFileOffset; #elif defined(OF_ANDROID) -typedef long long of_offset_t; +typedef long long OFFileOffset; #elif defined(OF_MORPHOS) -typedef signed long long of_offset_t; +typedef signed long long OFFileOffset; #elif defined(OF_HAVE_OFF64_T) -typedef off64_t of_offset_t; +typedef off64_t OFFileOffset; #else -typedef off_t of_offset_t; +typedef off_t OFFileOffset; #endif /** * @class OFSeekableStream OFSeekableStream.h ObjFW/OFSeekableStream.h * @@ -69,11 +69,11 @@ * `SEEK_SET` | Seek to the specified byte * `SEEK_CUR` | Seek to the current location + offset * `SEEK_END` | Seek to the end of the stream + offset * @return The new offset form the start of the file */ -- (of_offset_t)seekToOffset: (of_offset_t)offset whence: (int)whence; +- (OFFileOffset)seekToOffset: (OFFileOffset)offset whence: (int)whence; /** * @brief Seek the stream on the lowlevel. * * @warning Do not call this directly! @@ -89,9 +89,9 @@ * `SEEK_SET` | Seek to the specified byte * `SEEK_CUR` | Seek to the current location + offset * `SEEK_END` | Seek to the end of the stream + offset * @return The new offset from the start of the file */ -- (of_offset_t)lowlevelSeekToOffset: (of_offset_t)offset whence: (int)whence; +- (OFFileOffset)lowlevelSeekToOffset: (OFFileOffset)offset whence: (int)whence; @end OF_ASSUME_NONNULL_END Index: src/OFSeekableStream.m ================================================================== --- src/OFSeekableStream.m +++ src/OFSeekableStream.m @@ -36,24 +36,24 @@ } return [super init]; } -- (of_offset_t)lowlevelSeekToOffset: (of_offset_t)offset whence: (int)whence +- (OFFileOffset)lowlevelSeekToOffset: (OFFileOffset)offset whence: (int)whence { OF_UNRECOGNIZED_SELECTOR } -- (of_offset_t)seekToOffset: (of_offset_t)offset whence: (int)whence +- (OFFileOffset)seekToOffset: (OFFileOffset)offset whence: (int)whence { if (whence == SEEK_CUR) offset -= _readBufferLength; offset = [self lowlevelSeekToOffset: offset whence: whence]; - free(_readBufferMemory); + OFFreeMemory(_readBufferMemory); _readBuffer = _readBufferMemory = NULL; _readBufferLength = 0; return offset; } @end Index: src/OFSelectKernelEventObserver.m ================================================================== --- src/OFSelectKernelEventObserver.m +++ src/OFSelectKernelEventObserver.m @@ -29,17 +29,16 @@ #include #import "OFSelectKernelEventObserver.h" #import "OFArray.h" +#import "OFSocket+Private.h" #import "OFInitializationFailedException.h" #import "OFObserveFailedException.h" #import "OFOutOfRangeException.h" -#import "socket_helpers.h" - #ifdef OF_AMIGAOS # include #endif #ifdef OF_HPUX @@ -97,11 +96,11 @@ #endif if (fd > _maxFD) _maxFD = fd; - FD_SET((of_socket_t)fd, &_readFDs); + FD_SET((OFSocketHandle)fd, &_readFDs); [super addObjectForReading: object]; } - (void)addObjectForWriting: (id )object @@ -121,11 +120,11 @@ #endif if (fd > _maxFD) _maxFD = fd; - FD_SET((of_socket_t)fd, &_writeFDs); + FD_SET((OFSocketHandle)fd, &_writeFDs); [super addObjectForWriting: object]; } - (void)removeObjectForReading: (id )object @@ -141,11 +140,11 @@ #ifndef OF_WINDOWS if (fd >= (int)FD_SETSIZE) @throw [OFOutOfRangeException exception]; #endif - FD_CLR((of_socket_t)fd, &_readFDs); + FD_CLR((OFSocketHandle)fd, &_readFDs); [super removeObjectForReading: object]; } - (void)removeObjectForWriting: (id )object @@ -162,16 +161,16 @@ #ifndef OF_WINDOWS if (fd >= (int)FD_SETSIZE) @throw [OFOutOfRangeException exception]; #endif - FD_CLR((of_socket_t)fd, &_writeFDs); + FD_CLR((OFSocketHandle)fd, &_writeFDs); [super removeObjectForWriting: object]; } -- (void)observeForTimeInterval: (of_time_interval_t)timeInterval +- (void)observeForTimeInterval: (OFTimeInterval)timeInterval { fd_set readFDs; fd_set writeFDs; struct timeval timeout; int events; @@ -232,11 +231,11 @@ #endif if (events < 0) @throw [OFObserveFailedException exceptionWithObserver: self - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; #ifdef OF_AMIGAOS if (execSignalMask != 0 && [_delegate respondsToSelector: @selector(execSignalWasReceived:)]) [_delegate execSignalWasReceived: execSignalMask]; @@ -243,13 +242,13 @@ #else if (FD_ISSET(_cancelFD[0], &readFDs)) { char buffer; # ifdef OF_HAVE_PIPE - OF_ENSURE(read(_cancelFD[0], &buffer, 1) == 1); + OFEnsure(read(_cancelFD[0], &buffer, 1) == 1); # else - OF_ENSURE(recvfrom(_cancelFD[0], (void *)&buffer, 1, 0, NULL, + OFEnsure(recvfrom(_cancelFD[0], (void *)&buffer, 1, 0, NULL, NULL) == 1); # endif } #endif @@ -258,11 +257,11 @@ for (id object in [[_readObjects copy] autorelease]) { void *pool2 = objc_autoreleasePoolPush(); int fd = object.fileDescriptorForReading; - if (FD_ISSET((of_socket_t)fd, &readFDs) && + if (FD_ISSET((OFSocketHandle)fd, &readFDs) && [_delegate respondsToSelector: @selector(objectIsReadyForReading:)]) [_delegate objectIsReadyForReading: object]; objc_autoreleasePoolPop(pool2); @@ -271,11 +270,11 @@ for (id object in [[_writeObjects copy] autorelease]) { void *pool2 = objc_autoreleasePoolPush(); int fd = object.fileDescriptorForWriting; - if (FD_ISSET((of_socket_t)fd, &writeFDs) && + if (FD_ISSET((OFSocketHandle)fd, &writeFDs) && [_delegate respondsToSelector: @selector(objectIsReadyForWriting:)]) [_delegate objectIsReadyForWriting: object]; objc_autoreleasePoolPop(pool2); Index: src/OFSequencedPacketSocket.h ================================================================== --- src/OFSequencedPacketSocket.h +++ src/OFSequencedPacketSocket.h @@ -14,12 +14,11 @@ */ #import "OFObject.h" #import "OFKernelEventObserver.h" #import "OFRunLoop.h" - -#import "socket.h" +#import "OFSocket.h" OF_ASSUME_NONNULL_BEGIN /** @file */ @@ -33,11 +32,11 @@ * @param length The length of the packet * @param exception An exception which occurred while receiving or `nil` on * success * @return A bool whether the same block should be used for the next receive */ -typedef bool (^of_sequenced_packet_socket_async_receive_block_t)(size_t length, +typedef bool (^OFSequencedPacketSocketAsyncReceiveBlock)(size_t length, id _Nullable exception); /** * @brief A block which is called when a packet has been sent. * @@ -44,11 +43,11 @@ * @param data The data which was sent * @param exception An exception which occurred while reading or `nil` on * success * @return The data to repeat the send with or nil if it should not repeat */ -typedef OFData *_Nullable (^of_sequenced_packet_socket_async_send_data_block_t)( +typedef OFData *_Nullable (^OFSequencedPacketSocketAsyncSendDataBlock)( OFData *_Nonnull data, id _Nullable exception); /** * @brief A block which is called when the socket accepted a connection. * @@ -56,11 +55,11 @@ * @param exception An exception which occurred while accepting the socket or * `nil` on success * @return A bool whether the same block should be used for the next incoming * connection */ -typedef bool (^of_sequenced_packet_socket_async_accept_block_t)( +typedef bool (^OFSequencedPacketSocketAsyncAcceptBlock)( OFSequencedPacketSocket *acceptedSocket, id _Nullable exception); #endif /** * @protocol OFSequencedPacketSocketDelegate OFSequencedPacketSocket.h \ @@ -125,13 +124,13 @@ * was called to create one "instance" for every thread! */ @interface OFSequencedPacketSocket: OFObject { - of_socket_t _socket; + OFSocketHandle _socket; bool _canBlock, _listening; - of_socket_address_t _remoteAddress; + OFSocketAddress _remoteAddress; id _Nullable _delegate; OF_RESERVE_IVARS(OFSequencedPacketSocket, 4) } /** @@ -149,11 +148,11 @@ /** * @brief The remote address. * * @note This only works for accepted sockets! */ -@property (readonly, nonatomic) const of_socket_address_t *remoteAddress; +@property (readonly, nonatomic) const OFSocketAddress *remoteAddress; /** * @brief The delegate for asynchronous operations on the socket. * * @note The delegate is retained for as long as asynchronous operations are @@ -201,11 +200,11 @@ * @param length The length of the buffer * @param runLoopMode The run loop mode in which to perform the async receive */ - (void)asyncReceiveIntoBuffer: (void *)buffer length: (size_t)length - runLoopMode: (of_run_loop_mode_t)runLoopMode; + runLoopMode: (OFRunLoopMode)runLoopMode; #ifdef OF_HAVE_BLOCKS /** * @brief Asynchronously receives a packet and stores it into the specified * buffer. @@ -218,15 +217,13 @@ * block returns true, it will be called again with the same * buffer and maximum length when more packets have been received. * If you want the next method in the queue to handle the packet * received next, you need to return false from the method. */ -- (void) - asyncReceiveIntoBuffer: (void *)buffer - length: (size_t)length - block: (of_sequenced_packet_socket_async_receive_block_t) - block; +- (void)asyncReceiveIntoBuffer: (void *)buffer + length: (size_t)length + block: (OFSequencedPacketSocketAsyncReceiveBlock)block; /** * @brief Asynchronously receives a packet and stores it into the specified * buffer. * @@ -239,16 +236,14 @@ * block returns true, it will be called again with the same * buffer and maximum length when more packets have been received. * If you want the next method in the queue to handle the packet * received next, you need to return false from the method. */ -- (void) - asyncReceiveIntoBuffer: (void *)buffer - length: (size_t)length - runLoopMode: (of_run_loop_mode_t)runLoopMode - block: (of_sequenced_packet_socket_async_receive_block_t) - block; +- (void)asyncReceiveIntoBuffer: (void *)buffer + length: (size_t)length + runLoopMode: (OFRunLoopMode)runLoopMode + block: (OFSequencedPacketSocketAsyncReceiveBlock)block; #endif /** * @brief Sends the specified packet. * @@ -268,12 +263,11 @@ * @brief Asynchronously sends the specified packet. * * @param data The data to send as a packet * @param runLoopMode The run loop mode in which to perform the async send */ -- (void)asyncSendData: (OFData *)data - runLoopMode: (of_run_loop_mode_t)runLoopMode; +- (void)asyncSendData: (OFData *)data runLoopMode: (OFRunLoopMode)runLoopMode; #ifdef OF_HAVE_BLOCKS /** * @brief Asynchronously sends the specified packet. * @@ -281,12 +275,11 @@ * @param block The block to call when the packet has been sent. It should * return the data for the next send with the same callback or nil * if it should not repeat. */ - (void)asyncSendData: (OFData *)data - block: (of_sequenced_packet_socket_async_send_data_block_t) - block; + block: (OFSequencedPacketSocketAsyncSendDataBlock)block; /** * @brief Asynchronously sends the specified packet. * * @param data The data to send as a packet @@ -294,13 +287,12 @@ * @param block The block to call when the packet has been sent. It should * return the data for the next send with the same callback or nil * if it should not repeat. */ - (void)asyncSendData: (OFData *)data - runLoopMode: (of_run_loop_mode_t)runLoopMode - block: (of_sequenced_packet_socket_async_send_data_block_t) - block; + runLoopMode: (OFRunLoopMode)runLoopMode + block: (OFSequencedPacketSocketAsyncSendDataBlock)block; #endif /** * @brief Listen on the socket. * @@ -328,33 +320,33 @@ /** * @brief Asynchronously accept an incoming connection. * * @param runLoopMode The run loop mode in which to perform the async accept */ -- (void)asyncAcceptWithRunLoopMode: (of_run_loop_mode_t)runLoopMode; +- (void)asyncAcceptWithRunLoopMode: (OFRunLoopMode)runLoopMode; #ifdef OF_HAVE_BLOCKS /** * @brief Asynchronously accept an incoming connection. * * @param block The block to execute when a new connection has been accepted. * Returns whether the next incoming connection should be accepted * by the specified block as well. */ -- (void)asyncAcceptWithBlock: - (of_sequenced_packet_socket_async_accept_block_t)block; +- (void)asyncAcceptWithBlock: (OFSequencedPacketSocketAsyncAcceptBlock)block; /** * @brief Asynchronously accept an incoming connection. * * @param runLoopMode The run loop mode in which to perform the async accept * @param block The block to execute when a new connection has been accepted. * Returns whether the next incoming connection should be accepted * by the specified block as well. */ -- (void)asyncAcceptWithRunLoopMode: (of_run_loop_mode_t)runLoopMode - block: (of_sequenced_packet_socket_async_accept_block_t)block; +- (void) + asyncAcceptWithRunLoopMode: (OFRunLoopMode)runLoopMode + block: (OFSequencedPacketSocketAsyncAcceptBlock)block; #endif /** * @brief Cancels all pending asynchronous requests on the socket. */ Index: src/OFSequencedPacketSocket.m ================================================================== --- src/OFSequencedPacketSocket.m +++ src/OFSequencedPacketSocket.m @@ -30,10 +30,12 @@ #import "OFSequencedPacketSocket.h" #import "OFSequencedPacketSocket+Private.h" #import "OFData.h" #import "OFRunLoop+Private.h" #import "OFRunLoop.h" +#import "OFSocket.h" +#import "OFSocket+Private.h" #import "OFAcceptFailedException.h" #import "OFInitializationFailedException.h" #import "OFInvalidArgumentException.h" #import "OFListenFailedException.h" @@ -41,22 +43,19 @@ #import "OFOutOfRangeException.h" #import "OFReadFailedException.h" #import "OFSetOptionFailedException.h" #import "OFWriteFailedException.h" -#import "socket.h" -#import "socket_helpers.h" - @implementation OFSequencedPacketSocket @synthesize listening = _listening, delegate = _delegate; + (void)initialize { if (self != [OFSequencedPacketSocket class]) return; - if (!of_socket_init()) + if (!OFSocketInit()) @throw [OFInitializationFailedException exceptionWithClass: self]; } + (instancetype)socket @@ -72,11 +71,11 @@ if (self.class == [OFSequencedPacketSocket class]) { [self doesNotRecognizeSelector: _cmd]; abort(); } - _socket = INVALID_SOCKET; + _socket = OFInvalidSocketHandle; _canBlock = true; } @catch (id e) { [self release]; @throw e; } @@ -84,11 +83,11 @@ return self; } - (void)dealloc { - if (_socket != INVALID_SOCKET) + if (_socket != OFInvalidSocketHandle) [self close]; [super dealloc]; } @@ -98,11 +97,11 @@ int errNo; socklen_t len = sizeof(errNo); if (getsockopt(_socket, SOL_SOCKET, SO_ERROR, (char *)&errNo, &len) != 0) - return of_socket_errno(); + return OFSocketErrNo(); return errNo; } #endif @@ -139,11 +138,11 @@ u_long v = canBlock; if (ioctlsocket(_socket, FIONBIO, &v) == SOCKET_ERROR) @throw [OFSetOptionFailedException exceptionWithObject: self - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; _canBlock = canBlock; #else OF_UNRECOGNIZED_SELECTOR #endif @@ -151,43 +150,43 @@ - (size_t)receiveIntoBuffer: (void *)buffer length: (size_t)length { ssize_t ret; - if (_socket == INVALID_SOCKET) + if (_socket == OFInvalidSocketHandle) @throw [OFNotOpenException exceptionWithObject: self]; #ifndef OF_WINDOWS if ((ret = recv(_socket, buffer, length, 0)) < 0) @throw [OFReadFailedException exceptionWithObject: self requestedLength: length - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; #else if (length > INT_MAX) @throw [OFOutOfRangeException exception]; if ((ret = recv(_socket, buffer, (int)length, 0)) < 0) @throw [OFReadFailedException exceptionWithObject: self requestedLength: length - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; #endif return ret; } - (void)asyncReceiveIntoBuffer: (void *)buffer length: (size_t)length { [self asyncReceiveIntoBuffer: buffer length: length - runLoopMode: of_run_loop_mode_default]; + runLoopMode: OFDefaultRunLoopMode]; } - (void)asyncReceiveIntoBuffer: (void *)buffer length: (size_t)length - runLoopMode: (of_run_loop_mode_t)runLoopMode + runLoopMode: (OFRunLoopMode)runLoopMode { [OFRunLoop of_addAsyncReceiveForSequencedPacketSocket: self buffer: buffer length: length mode: runLoopMode @@ -196,28 +195,25 @@ # endif delegate: _delegate]; } #ifdef OF_HAVE_BLOCKS -- (void) - asyncReceiveIntoBuffer: (void *)buffer - length: (size_t)length - block: (of_sequenced_packet_socket_async_receive_block_t) - block +- (void)asyncReceiveIntoBuffer: (void *)buffer + length: (size_t)length + block: (OFSequencedPacketSocketAsyncReceiveBlock)block { [self asyncReceiveIntoBuffer: buffer length: length - runLoopMode: of_run_loop_mode_default + runLoopMode: OFDefaultRunLoopMode block: block]; } - (void) asyncReceiveIntoBuffer: (void *)buffer length: (size_t)length - runLoopMode: (of_run_loop_mode_t)runLoopMode - block: (of_sequenced_packet_socket_async_receive_block_t) - block + runLoopMode: (OFRunLoopMode)runLoopMode + block: (OFSequencedPacketSocketAsyncReceiveBlock)block { [OFRunLoop of_addAsyncReceiveForSequencedPacketSocket: self buffer: buffer length: length mode: runLoopMode @@ -226,11 +222,11 @@ } #endif - (void)sendBuffer: (const void *)buffer length: (size_t)length { - if (_socket == INVALID_SOCKET) + if (_socket == OFInvalidSocketHandle) @throw [OFNotOpenException exceptionWithObject: self]; #ifndef OF_WINDOWS ssize_t bytesWritten; @@ -240,11 +236,11 @@ if ((bytesWritten = send(_socket, (void *)buffer, length, 0)) < 0) @throw [OFWriteFailedException exceptionWithObject: self requestedLength: length bytesWritten: 0 - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; #else int bytesWritten; if (length > INT_MAX) @throw [OFOutOfRangeException exception]; @@ -252,11 +248,11 @@ if ((bytesWritten = send(_socket, buffer, (int)length, 0)) < 0) @throw [OFWriteFailedException exceptionWithObject: self requestedLength: length bytesWritten: 0 - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; #endif if ((size_t)bytesWritten != length) @throw [OFWriteFailedException exceptionWithObject: self requestedLength: length @@ -264,15 +260,14 @@ errNo: 0]; } - (void)asyncSendData: (OFData *)data { - [self asyncSendData: data runLoopMode: of_run_loop_mode_default]; + [self asyncSendData: data runLoopMode: OFDefaultRunLoopMode]; } -- (void)asyncSendData: (OFData *)data - runLoopMode: (of_run_loop_mode_t)runLoopMode +- (void)asyncSendData: (OFData *)data runLoopMode: (OFRunLoopMode)runLoopMode { [OFRunLoop of_addAsyncSendForSequencedPacketSocket: self data: data mode: runLoopMode # ifdef OF_HAVE_BLOCKS @@ -281,20 +276,20 @@ delegate: _delegate]; } #ifdef OF_HAVE_BLOCKS - (void)asyncSendData: (OFData *)data - block: (of_sequenced_packet_socket_async_send_data_block_t)block + block: (OFSequencedPacketSocketAsyncSendDataBlock)block { [self asyncSendData: data - runLoopMode: of_run_loop_mode_default + runLoopMode: OFDefaultRunLoopMode block: block]; } - (void)asyncSendData: (OFData *)data - runLoopMode: (of_run_loop_mode_t)runLoopMode - block: (of_sequenced_packet_socket_async_send_data_block_t)block + runLoopMode: (OFRunLoopMode)runLoopMode + block: (OFSequencedPacketSocketAsyncSendDataBlock)block { [OFRunLoop of_addAsyncSendForSequencedPacketSocket: self data: data mode: runLoopMode block: block @@ -307,18 +302,18 @@ [self listenWithBacklog: SOMAXCONN]; } - (void)listenWithBacklog: (int)backlog { - if (_socket == INVALID_SOCKET) + if (_socket == OFInvalidSocketHandle) @throw [OFNotOpenException exceptionWithObject: self]; if (listen(_socket, backlog) == -1) @throw [OFListenFailedException exceptionWithSocket: self backlog: backlog - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; _listening = true; } - (instancetype)accept @@ -336,28 +331,29 @@ #if defined(HAVE_PACCEPT) && defined(SOCK_CLOEXEC) if ((client->_socket = paccept(_socket, &client->_remoteAddress.sockaddr.sockaddr, &client->_remoteAddress.length, NULL, SOCK_CLOEXEC)) == - INVALID_SOCKET) + OFInvalidSocketHandle) @throw [OFAcceptFailedException exceptionWithSocket: self - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; #elif defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC) if ((client->_socket = accept4(_socket, &client->_remoteAddress.sockaddr.sockaddr, - &client->_remoteAddress.length, SOCK_CLOEXEC)) == INVALID_SOCKET) + &client->_remoteAddress.length, SOCK_CLOEXEC)) == + OFInvalidSocketHandle) @throw [OFAcceptFailedException exceptionWithSocket: self - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; #else if ((client->_socket = accept(_socket, &client->_remoteAddress.sockaddr.sockaddr, - &client->_remoteAddress.length)) == INVALID_SOCKET) + &client->_remoteAddress.length)) == OFInvalidSocketHandle) @throw [OFAcceptFailedException exceptionWithSocket: self - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; # if defined(HAVE_FCNTL) && defined(FD_CLOEXEC) if ((flags = fcntl(client->_socket, F_GETFD, 0)) != -1) fcntl(client->_socket, F_SETFD, flags | FD_CLOEXEC); # endif @@ -366,65 +362,63 @@ assert(client->_remoteAddress.length <= (socklen_t)sizeof(client->_remoteAddress.sockaddr)); switch (client->_remoteAddress.sockaddr.sockaddr.sa_family) { case AF_INET: - client->_remoteAddress.family = OF_SOCKET_ADDRESS_FAMILY_IPV4; + client->_remoteAddress.family = OFSocketAddressFamilyIPv4; break; #ifdef OF_HAVE_IPV6 case AF_INET6: - client->_remoteAddress.family = OF_SOCKET_ADDRESS_FAMILY_IPV6; + client->_remoteAddress.family = OFSocketAddressFamilyIPv6; break; #endif #ifdef OF_HAVE_IPX case AF_IPX: - client->_remoteAddress.family = OF_SOCKET_ADDRESS_FAMILY_IPX; + client->_remoteAddress.family = OFSocketAddressFamilyIPX; break; #endif default: - client->_remoteAddress.family = - OF_SOCKET_ADDRESS_FAMILY_UNKNOWN; + client->_remoteAddress.family = OFSocketAddressFamilyUnknown; break; } return client; } - (void)asyncAccept { - [self asyncAcceptWithRunLoopMode: of_run_loop_mode_default]; + [self asyncAcceptWithRunLoopMode: OFDefaultRunLoopMode]; } -- (void)asyncAcceptWithRunLoopMode: (of_run_loop_mode_t)runLoopMode +- (void)asyncAcceptWithRunLoopMode: (OFRunLoopMode)runLoopMode { [OFRunLoop of_addAsyncAcceptForSocket: self mode: runLoopMode block: NULL delegate: _delegate]; } #ifdef OF_HAVE_BLOCKS -- (void)asyncAcceptWithBlock: (of_sequenced_packet_socket_async_accept_block_t) - block +- (void)asyncAcceptWithBlock: (OFSequencedPacketSocketAsyncAcceptBlock)block { - [self asyncAcceptWithRunLoopMode: of_run_loop_mode_default - block: block]; + [self asyncAcceptWithRunLoopMode: OFDefaultRunLoopMode block: block]; } -- (void)asyncAcceptWithRunLoopMode: (of_run_loop_mode_t)runLoopMode - block: (of_sequenced_packet_socket_async_accept_block_t)block +- (void) + asyncAcceptWithRunLoopMode: (OFRunLoopMode)runLoopMode + block: (OFSequencedPacketSocketAsyncAcceptBlock)block { [OFRunLoop of_addAsyncAcceptForSocket: self mode: runLoopMode block: block delegate: nil]; } #endif -- (const of_socket_address_t *)remoteAddress +- (const OFSocketAddress *)remoteAddress { - if (_socket == INVALID_SOCKET) + if (_socket == OFInvalidSocketHandle) @throw [OFNotOpenException exceptionWithObject: self]; if (_remoteAddress.length == 0) @throw [OFInvalidArgumentException exception]; @@ -435,19 +429,19 @@ } - (void)cancelAsyncRequests { [OFRunLoop of_cancelAsyncRequestsForObject: self - mode: of_run_loop_mode_default]; + mode: OFDefaultRunLoopMode]; } - (int)fileDescriptorForReading { #ifndef OF_WINDOWS return _socket; #else - if (_socket == INVALID_SOCKET) + if (_socket == OFInvalidSocketHandle) return -1; if (_socket > INT_MAX) @throw [OFOutOfRangeException exception]; @@ -458,11 +452,11 @@ - (int)fileDescriptorForWriting { #ifndef OF_WINDOWS return _socket; #else - if (_socket == INVALID_SOCKET) + if (_socket == OFInvalidSocketHandle) return -1; if (_socket > INT_MAX) @throw [OFOutOfRangeException exception]; @@ -470,15 +464,15 @@ #endif } - (void)close { - if (_socket == INVALID_SOCKET) + if (_socket == OFInvalidSocketHandle) @throw [OFNotOpenException exceptionWithObject: self]; _listening = false; memset(&_remoteAddress, 0, sizeof(_remoteAddress)); closesocket(_socket); - _socket = INVALID_SOCKET; + _socket = OFInvalidSocketHandle; } @end Index: src/OFSerialization.h ================================================================== --- src/OFSerialization.h +++ src/OFSerialization.h @@ -15,12 +15,10 @@ #import "OFObject.h" OF_ASSUME_NONNULL_BEGIN -#define OF_SERIALIZATION_NS @"https://objfw.nil.im/serialization" - @class OFXMLElement; /** * @protocol OFSerialization OFSerialization.h ObjFW/OFSerialization.h * @@ -38,7 +36,15 @@ * @param element An OFXMLElement with the serialized object * @return An initialized object */ - (instancetype)initWithSerialization: (OFXMLElement *)element; @end + +#ifdef __cplusplus +extern "C" { +#endif +extern OFString *const OFSerializationNS; +#ifdef __cplusplus +} +#endif OF_ASSUME_NONNULL_END ADDED src/OFSerialization.m Index: src/OFSerialization.m ================================================================== --- src/OFSerialization.m +++ src/OFSerialization.m @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#import "OFSerialization.h" +#import "OFString.h" + +OFString *const OFSerializationNS = @"https://objfw.nil.im/serialization"; Index: src/OFSet.h ================================================================== --- src/OFSet.h +++ src/OFSet.h @@ -38,19 +38,19 @@ * * @param object The current object * @param stop A pointer to a variable that can be set to true to stop the * enumeration */ -typedef void (^of_set_enumeration_block_t)(id object, bool *stop); +typedef void (^OFSetEnumerationBlock)(id object, bool *stop); /** * @brief A block for filtering an OFSet. * * @param object The object to inspect * @return Whether the object should be in the filtered set */ -typedef bool (^of_set_filter_block_t)(id object); +typedef bool (^OFSetFilterBlock)(id object); #endif /** * @class OFSet OFSet.h ObjFW/OFSet.h * @@ -252,25 +252,25 @@ /** * @brief Executes a block for each object in the set. * * @param block The block to execute for each object in the set */ -- (void)enumerateObjectsUsingBlock: (of_set_enumeration_block_t)block; +- (void)enumerateObjectsUsingBlock: (OFSetEnumerationBlock)block; /** * @brief Creates a new set, only containing the objects for which the block * returns true. * * @param block A block which determines if the object should be in the new set * @return A new, autoreleased OFSet */ -- (OFSet OF_GENERIC(ObjectType) *)filteredSetUsingBlock: - (of_set_filter_block_t)block; +- (OFSet OF_GENERIC(ObjectType) *) + filteredSetUsingBlock: (OFSetFilterBlock)block; #endif #if !defined(OF_HAVE_GENERICS) && !defined(DOXYGEN) # undef ObjectType #endif @end OF_ASSUME_NONNULL_END #import "OFMutableSet.h" Index: src/OFSet.m ================================================================== --- src/OFSet.m +++ src/OFSet.m @@ -239,11 +239,11 @@ - (OFEnumerator *)objectEnumerator { OF_UNRECOGNIZED_SELECTOR } -- (int)countByEnumeratingWithState: (of_fast_enumeration_state_t *)state +- (int)countByEnumeratingWithState: (OFFastEnumerationState *)state objects: (id *)objects count: (int)count { OFEnumerator *enumerator; int i; @@ -367,14 +367,14 @@ void *pool = objc_autoreleasePoolPush(); OFXMLElement *element; if ([self isKindOfClass: [OFMutableSet class]]) element = [OFXMLElement elementWithName: @"OFMutableSet" - namespace: OF_SERIALIZATION_NS]; + namespace: OFSerializationNS]; else element = [OFXMLElement elementWithName: @"OFSet" - namespace: OF_SERIALIZATION_NS]; + namespace: OFSerializationNS]; for (id object in self) { void *pool2 = objc_autoreleasePoolPush(); [element addChild: object.XMLElementBySerializing]; objc_autoreleasePoolPop(pool2); @@ -426,11 +426,11 @@ objc_autoreleasePoolPop(pool); return [ret autorelease]; } #ifdef OF_HAVE_BLOCKS -- (void)enumerateObjectsUsingBlock: (of_set_enumeration_block_t)block +- (void)enumerateObjectsUsingBlock: (OFSetEnumerationBlock)block { bool stop = false; for (id object in self) { block(object, &stop); @@ -438,11 +438,11 @@ if (stop) break; } } -- (OFSet *)filteredSetUsingBlock: (of_set_filter_block_t)block +- (OFSet *)filteredSetUsingBlock: (OFSetFilterBlock)block { OFMutableSet *ret = [OFMutableSet set]; [self enumerateObjectsUsingBlock: ^ (id object, bool *stop) { if (block(object)) ADDED src/OFSizeValue.h Index: src/OFSizeValue.h ================================================================== --- src/OFSizeValue.h +++ src/OFSizeValue.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#import "OFValue.h" + +OF_ASSUME_NONNULL_BEGIN + +@interface OFSizeValue: OFValue +{ + OFSize _size; +} + +- (instancetype)initWithSize: (OFSize)size; +@end + +OF_ASSUME_NONNULL_END ADDED src/OFSizeValue.m Index: src/OFSizeValue.m ================================================================== --- src/OFSizeValue.m +++ src/OFSizeValue.m @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#import "OFSizeValue.h" +#import "OFMethodSignature.h" +#import "OFString.h" + +#import "OFOutOfRangeException.h" + +@implementation OFSizeValue +@synthesize sizeValue = _size; + +- (instancetype)initWithSize: (OFSize)size +{ + self = [super init]; + + _size = size; + + return self; +} + +- (const char *)objCType +{ + return @encode(OFSize); +} + +- (void)getValue: (void *)value size: (size_t)size +{ + if (size != sizeof(_size)) + @throw [OFOutOfRangeException exception]; + + memcpy(value, &_size, sizeof(_size)); +} + +- (OFString *)description +{ + return [OFString stringWithFormat: + @"", _size.width, _size.height]; +} +@end ADDED src/OFSocket+Private.h Index: src/OFSocket+Private.h ================================================================== --- src/OFSocket+Private.h +++ src/OFSocket+Private.h @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#include "unistd_wrapper.h" + +#ifdef HAVE_ARPA_INET_H +# include +#endif +#ifdef HAVE_NETDB_H +# include +#endif + +#include "OFSocket.h" + +#ifndef INADDR_NONE +# define INADDR_NONE ((in_addr_t)-1) +#endif + +#ifndef SOMAXCONN +/* + * Use 16 as everything > 17 fails on Nintendo 3DS and 16 is a less arbitrary + * number than 17. + */ +# define SOMAXCONN 16 +#endif + +#ifndef SOCK_CLOEXEC +# define SOCK_CLOEXEC 0 +#endif + +#if defined(OF_AMIGAOS) +# ifdef OF_MORPHOS +# include +# else +# include +# endif +# include +# define closesocket(sock) CloseSocket(sock) +# define ioctlsocket(fd, req, arg) IoctlSocket(fd, req, arg) +# define hstrerror(err) "unknown (no hstrerror)" +# define SOCKET_ERROR -1 +# if defined(OF_HAVE_THREADS) && !defined(OF_MORPHOS) +# define SocketBase ((struct Library *)OFTLSKeyGet(OFSocketBaseKey)) +# ifdef OF_AMIGAOS4 +# define ISocket ((struct SocketIFace *)OFTLSKeyGet(OFSocketInterfaceKey)) +# endif +# endif +# ifdef OF_MORPHOS +typedef uint32_t in_addr_t; +# endif +#elif !defined(OF_WINDOWS) && !defined(OF_WII) +# define closesocket(sock) close(sock) +#endif + +#ifdef OF_WII +# define accept(sock, addr, addrlen) net_accept(sock, addr, addrlen) +# define bind(sock, addr, addrlen) net_bind(sock, addr, addrlen) +# define closesocket(sock) net_close(sock) +# define connect(sock, addr, addrlen) \ + net_connect(sock, (struct sockaddr *)addr, addrlen) +# define fcntl(fd, cmd, flags) net_fcntl(fd, cmd, flags) +# define h_errno 0 +# define hstrerror(err) "unknown (no hstrerror)" +# define listen(sock, backlog) net_listen(sock, backlog) +# define poll(fds, nfds, timeout) net_poll(fds, nfds, timeout) +# define recv(sock, buf, len, flags) net_recv(sock, buf, len, flags) +# define recvfrom(sock, buf, len, flags, addr, addrlen) \ + net_recvfrom(sock, buf, len, flags, addr, addrlen) +# define select(nfds, readfds, writefds, errorfds, timeout) \ + net_select(nfds, readfds, writefds, errorfds, timeout) +# define send(sock, buf, len, flags) net_send(sock, buf, len, flags) +# define sendto(sock, buf, len, flags, addr, addrlen) \ + net_sendto(sock, buf, len, flags, (struct sockaddr *)(addr), addrlen) +# define setsockopt(sock, level, name, value, len) \ + net_setsockopt(sock, level, name, value, len) +# define socket(domain, type, proto) net_socket(domain, type, proto) +typedef u32 in_addr_t; +typedef u32 nfds_t; +#endif ADDED src/OFSocket.h Index: src/OFSocket.h ================================================================== --- src/OFSocket.h +++ src/OFSocket.h @@ -0,0 +1,296 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "objfw-defs.h" + +#ifndef OF_HAVE_SOCKETS +# error No sockets available! +#endif + +#include + +#import "OFString.h" +#if defined(OF_HAVE_THREADS) && defined(OF_AMIGAOS) +# import "OFTLSKey.h" +#endif + +#ifdef OF_HAVE_SYS_SOCKET_H +# include +#endif +#ifdef OF_HAVE_NETINET_IN_H +# include +#endif +#ifdef OF_HAVE_NETINET_TCP_H +# include +#endif +#ifdef OF_HAVE_NETIPX_IPX_H +# include +#endif + +#ifdef OF_WINDOWS +# include +# include +# ifdef OF_HAVE_IPX +# include +# endif +#endif + +/** @file */ + +#ifdef OF_WII +# include +#endif + +#ifdef OF_PSP +# include +#endif + +#import "macros.h" + +OF_ASSUME_NONNULL_BEGIN + +#ifndef OF_WINDOWS +typedef int OFSocketHandle; +static const OFSocketHandle OFInvalidSocketHandle = -1; +#else +typedef SOCKET OFSocketHandle; +static const OFSocketHandle OFInvalidSocketHandle = INVALID_SOCKET; +#endif + +#ifdef OF_WII +typedef u8 sa_family_t; +#endif + +#ifdef OF_MORPHOS +typedef long socklen_t; +typedef u_char sa_family_t; +typedef u_short in_port_t; +#endif + +/** + * @brief A socket address family. + */ +typedef enum { + /** An unknown address family. */ + OFSocketAddressFamilyUnknown, + /** IPv4 */ + OFSocketAddressFamilyIPv4, + /** IPv6 */ + OFSocketAddressFamilyIPv6, + /** IPX */ + OFSocketAddressFamilyIPX, + /** Any address family */ + OFSocketAddressFamilyAny = 255 +} OFSocketAddressFamily; + +#ifndef OF_HAVE_IPV6 +struct sockaddr_in6 { + sa_family_t sin6_family; + in_port_t sin6_port; + uint32_t sin6_flowinfo; + struct in6_addr { + uint8_t s6_addr[16]; + } sin6_addr; + uint32_t sin6_scope_id; +}; +#endif + +#ifndef OF_HAVE_IPX +# define IPX_NODE_LEN 6 +struct sockaddr_ipx { + sa_family_t sipx_family; + uint32_t sipx_network; + unsigned char sipx_node[IPX_NODE_LEN]; + uint16_t sipx_port; + uint8_t sipx_type; +}; +#endif +#ifdef OF_WINDOWS +# define IPX_NODE_LEN 6 +# define sipx_family sa_family +# define sipx_network sa_netnum +# define sipx_node sa_nodenum +# define sipx_port sa_socket +#endif + +/** + * @struct OFSocketAddress OFSocket.h ObjFW/OFSocket.h + * + * @brief A struct which represents a host / port pair for a socket. + */ +typedef struct OF_BOXABLE { + /* + * Even though struct sockaddr contains the family, we need to use our + * own family, as we need to support storing an IPv6 address on systems + * that don't support IPv6. These may not have AF_INET6 defined and we + * can't just define it, as the value is system-dependent and might + * clash with an existing value. + */ + OFSocketAddressFamily family; + union { + struct sockaddr sockaddr; + struct sockaddr_in in; + struct sockaddr_in6 in6; + struct sockaddr_ipx ipx; + } sockaddr; + socklen_t length; +} OFSocketAddress; + +#ifdef __cplusplus +extern "C" { +#endif +/** + * @brief Parses the specified IP (either v4 or v6) and port into an + * @ref OFSocketAddress. + * + * @param IP The IP to parse + * @param port The port to use + * @return The parsed IP and port as an OFSocketAddress + */ +extern OFSocketAddress OFSocketAddressParseIP(OFString *IP, uint16_t port); + +/** + * @brief Parses the specified IPv4 and port into an @ref OFSocketAddress. + * + * @param IP The IPv4 to parse + * @param port The port to use + * @return The parsed IPv4 and port as an OFSocketAddress + */ +extern OFSocketAddress OFSocketAddressParseIPv4(OFString *IP, uint16_t port); + +/** + * @brief Parses the specified IPv6 and port into an @ref OFSocketAddress. + * + * @param IP The IPv6 to parse + * @param port The port to use + * @return The parsed IPv6 and port as an OFSocketAddress + */ +extern OFSocketAddress OFSocketAddressParseIPv6(OFString *IP, uint16_t port); + +/** + * @brief Creates an IPX address for the specified network, node and port. + * + * @param node The node in the IPX network + * @param network The IPX network + * @param port The IPX port (sometimes called socket number) on the node + */ +extern OFSocketAddress OFSocketAddressMakeIPX( + const unsigned char node[_Nonnull IPX_NODE_LEN], uint32_t network, + uint16_t port); + +/** + * @brief Compares two OFSocketAddress for equality. + * + * @param address1 The address to compare with the second address + * @param address2 The second address + * @return Whether the two addresses are equal + */ +extern bool OFSocketAddressEqual(const OFSocketAddress *_Nonnull address1, + const OFSocketAddress *_Nonnull address2); + +/** + * @brief Returns the hash for the specified @ref OFSocketAddress. + * + * @param address The address to hash + * @return The hash for the specified OFSocketAddress + */ +extern unsigned long OFSocketAddressHash( + const OFSocketAddress *_Nonnull address); + +/** + * @brief Converts the specified @ref OFSocketAddress to a string. + * + * @param address The address to convert to a string + * @return The address as an IP string + */ +extern OFString *_Nonnull OFSocketAddressString( + const OFSocketAddress *_Nonnull address); + +/** + * @brief Sets the port of the specified @ref OFSocketAddress, independent of + * the address family used. + * + * @param address The address on which to set the port + * @param port The port to set on the address + */ +extern void OFSocketAddressSetPort(OFSocketAddress *_Nonnull address, + uint16_t port); + +/** + * @brief Returns the port of the specified @ref OFSocketAddress, independent of + * the address family used. + * + * @param address The address on which to get the port + * @return The port of the address + */ +extern uint16_t OFSocketAddressPort(const OFSocketAddress *_Nonnull address); + +/** + * @brief Sets the IPX network of the specified @ref OFSocketAddress. + * + * @param address The address on which to set the IPX network + * @param network The IPX network to set on the address + */ +extern void OFSocketAddressSetIPXNetwork(OFSocketAddress *_Nonnull address, + uint32_t network); + +/** + * @brief Returns the IPX network of the specified @ref OFSocketAddress. + * + * @param address The address on which to get the IPX network + * @return The IPX network of the address + */ +extern uint32_t OFSocketAddressIPXNetwork( + const OFSocketAddress *_Nonnull address); + +/** + * @brief Sets the IPX node of the specified @ref OFSocketAddress. + * + * @param address The address on which to set the IPX node + * @param node The IPX node to set on the address + */ +extern void OFSocketAddressSetIPXNode(OFSocketAddress *_Nonnull address, + const unsigned char node[_Nonnull IPX_NODE_LEN]); + +/** + * @brief Gets the IPX node of the specified @ref OFSocketAddress. + * + * @param address The address on which to get the IPX node + * @param node A byte array to store the IPX node of the address + */ +extern void OFSocketAddressIPXNode(const OFSocketAddress *_Nonnull address, + unsigned char node[_Nonnull IPX_NODE_LEN]); + +extern bool OFSocketInit(void); +#if defined(OF_HAVE_THREADS) && defined(OF_AMIGAOS) && !defined(OF_MORPHOS) +extern void OFSocketDeinit(void); +#endif +extern int OFSocketErrNo(void); +#if !defined(OF_WII) && !defined(OF_NINTENDO_3DS) +extern int OFGetSockName(OFSocketHandle sock, struct sockaddr *restrict addr, + socklen_t *restrict addrLen); +#endif + +#if defined(OF_HAVE_THREADS) && defined(OF_AMIGAOS) && !defined(OF_MORPHOS) +extern OFTLSKey OFSocketBaseKey; +# ifdef OF_AMIGAOS4 +extern OFTLSKey OFSocketInterfaceKey; +# endif +#endif +#ifdef __cplusplus +} +#endif + +OF_ASSUME_NONNULL_END ADDED src/OFSocket.m Index: src/OFSocket.m ================================================================== --- src/OFSocket.m +++ src/OFSocket.m @@ -0,0 +1,849 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#ifndef _XOPEN_SOURCE_EXTENDED +# define _XOPEN_SOURCE_EXTENDED +#endif +#define _HPUX_ALT_XOPEN_SOCKET_API + +#ifdef OF_NINTENDO_3DS +# include /* For memalign() */ +#endif + +#include + +#import "OFArray.h" +#import "OFCharacterSet.h" +#import "OFLocale.h" +#ifdef OF_HAVE_THREADS +# import "OFMutex.h" +#endif +#import "OFOnce.h" +#import "OFSocket.h" +#import "OFSocket+Private.h" +#import "OFString.h" +#ifdef OF_HAVE_THREADS +# import "OFTLSKey.h" +#endif + +#import "OFException.h" /* For some E* -> WSAE* defines */ +#import "OFInitializationFailedException.h" +#import "OFInvalidArgumentException.h" +#import "OFInvalidFormatException.h" +#import "OFLockFailedException.h" +#import "OFUnlockFailedException.h" + +#ifdef OF_AMIGAOS +# include +#endif + +#ifdef OF_NINTENDO_3DS +# include <3ds/types.h> +# include <3ds/services/soc.h> +#endif + +#if defined(OF_HAVE_THREADS) && (!defined(OF_AMIGAOS) || defined(OF_MORPHOS)) +static OFMutex *mutex; + +static void +releaseMutex(void) +{ + [mutex release]; +} +#endif +#if !defined(OF_AMIGAOS) || defined(OF_MORPHOS) || !defined(OF_HAVE_THREADS) +static bool initSuccessful = false; +#endif + +#ifdef OF_AMIGAOS +# if defined(OF_HAVE_THREADS) && !defined(OF_MORPHOS) +OFTLSKey OFSocketBaseKey; +# ifdef OF_AMIGAOS4 +OFTLSKey OFSocketInterfaceKey; +# endif +# else +struct Library *SocketBase; +# ifdef OF_AMIGAOS4 +struct SocketIFace *ISocket = NULL; +# endif +# endif +#endif + +#if defined(OF_HAVE_THREADS) && defined(OF_AMIGAOS) && !defined(OF_MORPHOS) +OF_CONSTRUCTOR() +{ + if (OFTLSKeyNew(&OFSocketBaseKey) != 0) + @throw [OFInitializationFailedException exception]; + +# ifdef OF_AMIGAOS4 + if (OFTLSKeyNew(&OFSocketInterfaceKey) != 0) + @throw [OFInitializationFailedException exception]; +# endif +} +#endif + +#if !defined(OF_AMIGAOS) || defined(OF_MORPHOS) || !defined(OF_HAVE_THREADS) +static void +init(void) +{ +# if defined(OF_WINDOWS) + WSADATA wsa; + + if (WSAStartup(MAKEWORD(2, 0), &wsa)) + return; +# elif defined(OF_AMIGAOS) + if ((SocketBase = OpenLibrary("bsdsocket.library", 4)) == NULL) + return; + +# ifdef OF_AMIGAOS4 + if ((ISocket = (struct SocketIFace *) + GetInterface(SocketBase, "main", 1, NULL)) == NULL) { + CloseLibrary(SocketBase); + return; + } +# endif +# elif defined(OF_WII) + if (net_init() < 0) + return; +# elif defined(OF_NINTENDO_3DS) + void *ctx; + + if ((ctx = memalign(0x1000, 0x100000)) == NULL) + return; + + if (socInit(ctx, 0x100000) != 0) + return; + + atexit((void (*)(void))socExit); +# endif + +# if defined(OF_HAVE_THREADS) && (!defined(OF_AMIGAOS) || defined(OF_MORPHOS)) + mutex = [[OFMutex alloc] init]; + atexit(releaseMutex); + +# ifdef OF_WII + if (OFSpinlockNew(&spinlock) != 0) + return; +# endif +# endif + + initSuccessful = true; +} + +OF_DESTRUCTOR() +{ +# ifdef OF_AMIGAOS +# ifdef OF_AMIGAOS4 + if (ISocket != NULL) + DropInterface((struct Interface *)ISocket); +# endif + + if (SocketBase != NULL) + CloseLibrary(SocketBase); +# endif +} +#endif + +bool +OFSocketInit(void) +{ +#if !defined(OF_AMIGAOS) || defined(OF_MORPHOS) || !defined(OF_HAVE_THREADS) + static OFOnceControl onceControl = OFOnceControlInitValue; + OFOnce(&onceControl, init); + + return initSuccessful; +#else + struct Library *socketBase; +# ifdef OF_AMIGAOS4 + struct SocketIFace *socketInterface; +# endif + +# ifdef OF_AMIGAOS4 + if ((socketInterface = OFTLSKeyGet(OFSocketInterfaceKey)) != NULL) +# else + if ((socketBase = OFTLSKeyGet(OFSocketBaseKey)) != NULL) +# endif + return true; + + if ((socketBase = OpenLibrary("bsdsocket.library", 4)) == NULL) + return false; + +# ifdef OF_AMIGAOS4 + if ((socketInterface = (struct SocketIFace *) + GetInterface(socketBase, "main", 1, NULL)) == NULL) { + CloseLibrary(socketBase); + return false; + } +# endif + + if (OFTLSKeySet(OFSocketBaseKey, socketBase) != 0) { + CloseLibrary(socketBase); +# ifdef OF_AMIGAOS4 + DropInterface((struct Interface *)socketInterface); +# endif + return false; + } + +# ifdef OF_AMIGAOS4 + if (OFTLSKeySet(OFSocketInterfaceKey, socketInterface) != 0) { + CloseLibrary(socketBase); + DropInterface((struct Interface *)socketInterface); + return false; + } +# endif + + return true; +#endif +} + +#if defined(OF_HAVE_THREADS) && defined(OF_AMIGAOS) && !defined(OF_MORPHOS) +void +OFSocketDeinit(void) +{ + struct Library *socketBase = OFTLSKeyGet(OFSocketBaseKey); +# ifdef OF_AMIGAOS4 + struct SocketIFace *socketInterface = OFTLSKeyGet(OFSocketInterfaceKey); + + if (socketInterface != NULL) + DropInterface((struct Interface *)socketInterface); +# endif + if (socketBase != NULL) + CloseLibrary(socketBase); +} +#endif + +int +OFSocketErrNo() +{ +#if defined(OF_WINDOWS) + switch (WSAGetLastError()) { + case WSAEACCES: + return EACCES; + case WSAEADDRINUSE: + return EADDRINUSE; + case WSAEADDRNOTAVAIL: + return EADDRNOTAVAIL; + case WSAEAFNOSUPPORT: + return EAFNOSUPPORT; + case WSAEALREADY: + return EALREADY; + case WSAEBADF: + return EBADF; + case WSAECONNABORTED: + return ECONNABORTED; + case WSAECONNREFUSED: + return ECONNREFUSED; + case WSAECONNRESET: + return ECONNRESET; + case WSAEDESTADDRREQ: + return EDESTADDRREQ; + case WSAEDISCON: + return EPIPE; + case WSAEDQUOT: + return EDQUOT; + case WSAEFAULT: + return EFAULT; + case WSAEHOSTDOWN: + return EHOSTDOWN; + case WSAEHOSTUNREACH: + return EHOSTUNREACH; + case WSAEINPROGRESS: + return EINPROGRESS; + case WSAEINTR: + return EINTR; + case WSAEINVAL: + return EINVAL; + case WSAEISCONN: + return EISCONN; + case WSAELOOP: + return ELOOP; + case WSAEMSGSIZE: + return EMSGSIZE; + case WSAENAMETOOLONG: + return ENAMETOOLONG; + case WSAENETDOWN: + return ENETDOWN; + case WSAENETRESET: + return ENETRESET; + case WSAENETUNREACH: + return ENETUNREACH; + case WSAENOBUFS: + return ENOBUFS; + case WSAENOPROTOOPT: + return ENOPROTOOPT; + case WSAENOTCONN: + return ENOTCONN; + case WSAENOTEMPTY: + return ENOTEMPTY; + case WSAENOTSOCK: + return ENOTSOCK; + case WSAEOPNOTSUPP: + return EOPNOTSUPP; + case WSAEPFNOSUPPORT: + return EPFNOSUPPORT; + case WSAEPROCLIM: + return EPROCLIM; + case WSAEPROTONOSUPPORT: + return EPROTONOSUPPORT; + case WSAEPROTOTYPE: + return EPROTOTYPE; + case WSAEREMOTE: + return EREMOTE; + case WSAESHUTDOWN: + return ESHUTDOWN; + case WSAESOCKTNOSUPPORT: + return ESOCKTNOSUPPORT; + case WSAESTALE: + return ESTALE; + case WSAETIMEDOUT: + return ETIMEDOUT; + case WSAETOOMANYREFS: + return ETOOMANYREFS; + case WSAEUSERS: + return EUSERS; + case WSAEWOULDBLOCK: + return EWOULDBLOCK; + } + + return 0; +#elif defined(OF_AMIGAOS) + return Errno(); +#else + return errno; +#endif +} + +#ifndef OF_WII +int +OFGetSockName(OFSocketHandle sock, struct sockaddr *restrict addr, + socklen_t *restrict addrLen) +{ + int ret; + +# if defined(OF_HAVE_THREADS) && (!defined(OF_AMIGAOS) || defined(OF_MORPHOS)) + [mutex lock]; +# endif + ret = getsockname(sock, addr, addrLen); +# if defined(OF_HAVE_THREADS) && (!defined(OF_AMIGAOS) || defined(OF_MORPHOS)) + [mutex unlock]; +# endif + + return ret; +} +#endif + +OFSocketAddress +OFSocketAddressParseIPv4(OFString *IPv4, uint16_t port) +{ + void *pool = objc_autoreleasePoolPush(); + OFCharacterSet *whitespaceCharacterSet = + [OFCharacterSet whitespaceCharacterSet]; + OFSocketAddress ret; + struct sockaddr_in *addrIn = &ret.sockaddr.in; + OFArray OF_GENERIC(OFString *) *components; + uint32_t addr; + + memset(&ret, '\0', sizeof(ret)); + ret.family = OFSocketAddressFamilyIPv4; +#if defined(OF_WII) || defined(OF_NINTENDO_3DS) + ret.length = 8; +#else + ret.length = sizeof(ret.sockaddr.in); +#endif + + addrIn->sin_family = AF_INET; + addrIn->sin_port = OFToBigEndian16(port); +#ifdef OF_WII + addrIn->sin_len = ret.length; +#endif + + components = [IPv4 componentsSeparatedByString: @"."]; + + if (components.count != 4) + @throw [OFInvalidFormatException exception]; + + addr = 0; + + for (OFString *component in components) { + unsigned long long number; + + if (component.length == 0) + @throw [OFInvalidFormatException exception]; + + if ([component indexOfCharacterFromSet: + whitespaceCharacterSet] != OFNotFound) + @throw [OFInvalidFormatException exception]; + + number = component.unsignedLongLongValue; + + if (number > UINT8_MAX) + @throw [OFInvalidFormatException exception]; + + addr = (addr << 8) | ((uint32_t)number & 0xFF); + } + + addrIn->sin_addr.s_addr = OFToBigEndian32(addr); + + objc_autoreleasePoolPop(pool); + + return ret; +} + +static uint16_t +parseIPv6Component(OFString *component) +{ + unsigned long long number; + + if ([component indexOfCharacterFromSet: + [OFCharacterSet whitespaceCharacterSet]] != OFNotFound) + @throw [OFInvalidFormatException exception]; + + number = [component unsignedLongLongValueWithBase: 16]; + + if (number > UINT16_MAX) + @throw [OFInvalidFormatException exception]; + + return (uint16_t)number; +} + +OFSocketAddress +OFSocketAddressParseIPv6(OFString *IPv6, uint16_t port) +{ + void *pool = objc_autoreleasePoolPush(); + OFSocketAddress ret; + struct sockaddr_in6 *addrIn6 = &ret.sockaddr.in6; + size_t doubleColon; + + memset(&ret, '\0', sizeof(ret)); + ret.family = OFSocketAddressFamilyIPv6; + ret.length = sizeof(ret.sockaddr.in6); + +#ifdef AF_INET6 + addrIn6->sin6_family = AF_INET6; +#else + addrIn6->sin6_family = AF_UNSPEC; +#endif + addrIn6->sin6_port = OFToBigEndian16(port); + + doubleColon = [IPv6 rangeOfString: @"::"].location; + + if (doubleColon != OFNotFound) { + OFString *left = [IPv6 substringToIndex: doubleColon]; + OFString *right = [IPv6 substringFromIndex: doubleColon + 2]; + OFArray OF_GENERIC(OFString *) *leftComponents; + OFArray OF_GENERIC(OFString *) *rightComponents; + size_t i; + + if ([right hasPrefix: @":"] || [right containsString: @"::"]) + @throw [OFInvalidFormatException exception]; + + leftComponents = [left componentsSeparatedByString: @":"]; + rightComponents = [right componentsSeparatedByString: @":"]; + + if (leftComponents.count + rightComponents.count > 7) + @throw [OFInvalidFormatException exception]; + + i = 0; + for (OFString *component in leftComponents) { + uint16_t number = parseIPv6Component(component); + + addrIn6->sin6_addr.s6_addr[i++] = number >> 8; + addrIn6->sin6_addr.s6_addr[i++] = number; + } + + i = 16; + for (OFString *component in rightComponents.reversedArray) { + uint16_t number = parseIPv6Component(component); + + addrIn6->sin6_addr.s6_addr[--i] = number; + addrIn6->sin6_addr.s6_addr[--i] = number >> 8; + } + } else { + OFArray OF_GENERIC(OFString *) *components = + [IPv6 componentsSeparatedByString: @":"]; + size_t i; + + if (components.count != 8) + @throw [OFInvalidFormatException exception]; + + i = 0; + for (OFString *component in components) { + uint16_t number; + + if (component.length == 0) + @throw [OFInvalidFormatException exception]; + + number = parseIPv6Component(component); + + addrIn6->sin6_addr.s6_addr[i++] = number >> 8; + addrIn6->sin6_addr.s6_addr[i++] = number; + } + } + + objc_autoreleasePoolPop(pool); + + return ret; +} + +OFSocketAddress +OFSocketAddressParseIP(OFString *IP, uint16_t port) +{ + OFSocketAddress ret; + + @try { + ret = OFSocketAddressParseIPv6(IP, port); + } @catch (OFInvalidFormatException *e) { + ret = OFSocketAddressParseIPv4(IP, port); + } + + return ret; +} + +OFSocketAddress +OFSocketAddressMakeIPX(const unsigned char node[IPX_NODE_LEN], uint32_t network, + uint16_t port) +{ + OFSocketAddress ret; + + memset(&ret, '\0', sizeof(ret)); + ret.family = OFSocketAddressFamilyIPX; + ret.length = sizeof(ret.sockaddr.ipx); + +#ifdef AF_IPX + ret.sockaddr.ipx.sipx_family = AF_IPX; +#else + ret.sockaddr.ipx.sipx_family = AF_UNSPEC; +#endif + memcpy(ret.sockaddr.ipx.sipx_node, node, IPX_NODE_LEN); + network = OFToBigEndian32(network); + memcpy(&ret.sockaddr.ipx.sipx_network, &network, + sizeof(ret.sockaddr.ipx.sipx_network)); + ret.sockaddr.ipx.sipx_port = OFToBigEndian16(port); + + return ret; +} + +bool +OFSocketAddressEqual(const OFSocketAddress *address1, + const OFSocketAddress *address2) +{ + const struct sockaddr_in *addrIn1, *addrIn2; + const struct sockaddr_in6 *addrIn6_1, *addrIn6_2; + const struct sockaddr_ipx *addrIPX1, *addrIPX2; + + if (address1->family != address2->family) + return false; + + switch (address1->family) { + case OFSocketAddressFamilyIPv4: +#if defined(OF_WII) || defined(OF_NINTENDO_3DS) + if (address1->length < 8 || address2->length < 8) + @throw [OFInvalidArgumentException exception]; +#else + if (address1->length < (socklen_t)sizeof(struct sockaddr_in) || + address2->length < (socklen_t)sizeof(struct sockaddr_in)) + @throw [OFInvalidArgumentException exception]; +#endif + + addrIn1 = &address1->sockaddr.in; + addrIn2 = &address2->sockaddr.in; + + if (addrIn1->sin_port != addrIn2->sin_port) + return false; + if (addrIn1->sin_addr.s_addr != addrIn2->sin_addr.s_addr) + return false; + + break; + case OFSocketAddressFamilyIPv6: + if (address1->length < (socklen_t)sizeof(struct sockaddr_in6) || + address2->length < (socklen_t)sizeof(struct sockaddr_in6)) + @throw [OFInvalidArgumentException exception]; + + addrIn6_1 = &address1->sockaddr.in6; + addrIn6_2 = &address2->sockaddr.in6; + + if (addrIn6_1->sin6_port != addrIn6_2->sin6_port) + return false; + if (memcmp(addrIn6_1->sin6_addr.s6_addr, + addrIn6_2->sin6_addr.s6_addr, + sizeof(addrIn6_1->sin6_addr.s6_addr)) != 0) + return false; + + break; + case OFSocketAddressFamilyIPX: + if (address1->length < (socklen_t)sizeof(struct sockaddr_ipx) || + address2->length < (socklen_t)sizeof(struct sockaddr_ipx)) + @throw [OFInvalidArgumentException exception]; + + addrIPX1 = &address1->sockaddr.ipx; + addrIPX2 = &address2->sockaddr.ipx; + + if (addrIPX1->sipx_port != addrIPX2->sipx_port) + return false; + if (memcmp(&addrIPX1->sipx_network, &addrIPX2->sipx_network, + 4) != 0) + return false; + if (memcmp(addrIPX1->sipx_node, addrIPX2->sipx_node, + IPX_NODE_LEN) != 0) + return false; + + break; + default: + @throw [OFInvalidArgumentException exception]; + } + + return true; +} + +unsigned long +OFSocketAddressHash(const OFSocketAddress *address) +{ + unsigned long hash; + + OFHashInit(&hash); + OFHashAdd(&hash, address->family); + + switch (address->family) { + case OFSocketAddressFamilyIPv4: +#if defined(OF_WII) || defined(OF_NINTENDO_3DS) + if (address->length < 8) + @throw [OFInvalidArgumentException exception]; +#else + if (address->length < (socklen_t)sizeof(struct sockaddr_in)) + @throw [OFInvalidArgumentException exception]; +#endif + + OFHashAdd(&hash, address->sockaddr.in.sin_port >> 8); + OFHashAdd(&hash, address->sockaddr.in.sin_port); + OFHashAdd(&hash, address->sockaddr.in.sin_addr.s_addr >> 24); + OFHashAdd(&hash, address->sockaddr.in.sin_addr.s_addr >> 16); + OFHashAdd(&hash, address->sockaddr.in.sin_addr.s_addr >> 8); + OFHashAdd(&hash, address->sockaddr.in.sin_addr.s_addr); + + break; + case OFSocketAddressFamilyIPv6: + if (address->length < (socklen_t)sizeof(struct sockaddr_in6)) + @throw [OFInvalidArgumentException exception]; + + OFHashAdd(&hash, address->sockaddr.in6.sin6_port >> 8); + OFHashAdd(&hash, address->sockaddr.in6.sin6_port); + + for (size_t i = 0; + i < sizeof(address->sockaddr.in6.sin6_addr.s6_addr); i++) + OFHashAdd(&hash, + address->sockaddr.in6.sin6_addr.s6_addr[i]); + + break; + case OFSocketAddressFamilyIPX:; + unsigned char network[ + sizeof(address->sockaddr.ipx.sipx_network)]; + + if (address->length < (socklen_t)sizeof(struct sockaddr_ipx)) + @throw [OFInvalidArgumentException exception]; + + OFHashAdd(&hash, address->sockaddr.ipx.sipx_port >> 8); + OFHashAdd(&hash, address->sockaddr.ipx.sipx_port); + + memcpy(network, &address->sockaddr.ipx.sipx_network, + sizeof(network)); + + for (size_t i = 0; i < sizeof(network); i++) + OFHashAdd(&hash, network[i]); + + for (size_t i = 0; i < IPX_NODE_LEN; i++) + OFHashAdd(&hash, address->sockaddr.ipx.sipx_node[i]); + + break; + default: + @throw [OFInvalidArgumentException exception]; + } + + OFHashFinalize(&hash); + + return hash; +} + +static OFString * +IPv4String(const OFSocketAddress *address) +{ + const struct sockaddr_in *addrIn = &address->sockaddr.in; + uint32_t addr = OFFromBigEndian32(addrIn->sin_addr.s_addr); + OFString *string; + + string = [OFString stringWithFormat: @"%u.%u.%u.%u", + (addr & 0xFF000000) >> 24, (addr & 0x00FF0000) >> 16, + (addr & 0x0000FF00) >> 8, addr & 0x000000FF]; + + return string; +} + +static OFString * +IPv6String(const OFSocketAddress *address) +{ + OFMutableString *string = [OFMutableString string]; + const struct sockaddr_in6 *addrIn6 = &address->sockaddr.in6; + int_fast8_t zerosStart = -1, maxZerosStart = -1; + uint_fast8_t zerosCount = 0, maxZerosCount = 0; + bool first = true; + + for (uint_fast8_t i = 0; i < 16; i += 2) { + if (addrIn6->sin6_addr.s6_addr[i] == 0 && + addrIn6->sin6_addr.s6_addr[i + 1] == 0) { + if (zerosStart >= 0) + zerosCount++; + else { + zerosStart = i; + zerosCount = 1; + } + } else { + if (zerosCount > maxZerosCount) { + maxZerosStart = zerosStart; + maxZerosCount = zerosCount; + } + + zerosStart = -1; + } + } + if (zerosCount > maxZerosCount) { + maxZerosStart = zerosStart; + maxZerosCount = zerosCount; + } + + if (maxZerosCount >= 2) { + for (int_fast8_t i = 0; i < maxZerosStart; i += 2) { + [string appendFormat: + (first ? @"%x" : @":%x"), + (addrIn6->sin6_addr.s6_addr[(uint_fast8_t)i] << 8) | + addrIn6->sin6_addr.s6_addr[(uint_fast8_t)i + 1]]; + first = false; + } + + [string appendString: @"::"]; + first = true; + + for (int_fast8_t i = maxZerosStart + (maxZerosCount * 2); + i < 16; i += 2) { + [string appendFormat: + (first ? @"%x" : @":%x"), + (addrIn6->sin6_addr.s6_addr[(uint_fast8_t)i] << 8) | + addrIn6->sin6_addr.s6_addr[(uint_fast8_t)i + 1]]; + first = false; + } + } else { + for (uint_fast8_t i = 0; i < 16; i += 2) { + [string appendFormat: + (first ? @"%x" : @":%x"), + (addrIn6->sin6_addr.s6_addr[i] << 8) | + addrIn6->sin6_addr.s6_addr[i + 1]]; + first = false; + } + } + + [string makeImmutable]; + + return string; +} + +OFString * +OFSocketAddressString(const OFSocketAddress *address) +{ + switch (address->family) { + case OFSocketAddressFamilyIPv4: + return IPv4String(address); + case OFSocketAddressFamilyIPv6: + return IPv6String(address); + default: + @throw [OFInvalidArgumentException exception]; + } +} + +void +OFSocketAddressSetPort(OFSocketAddress *address, uint16_t port) +{ + switch (address->family) { + case OFSocketAddressFamilyIPv4: + address->sockaddr.in.sin_port = OFToBigEndian16(port); + break; + case OFSocketAddressFamilyIPv6: + address->sockaddr.in6.sin6_port = OFToBigEndian16(port); + break; + case OFSocketAddressFamilyIPX: + address->sockaddr.ipx.sipx_port = OFToBigEndian16(port); + break; + default: + @throw [OFInvalidArgumentException exception]; + } +} + +uint16_t +OFSocketAddressPort(const OFSocketAddress *address) +{ + switch (address->family) { + case OFSocketAddressFamilyIPv4: + return OFFromBigEndian16(address->sockaddr.in.sin_port); + case OFSocketAddressFamilyIPv6: + return OFFromBigEndian16(address->sockaddr.in6.sin6_port); + case OFSocketAddressFamilyIPX: + return OFFromBigEndian16(address->sockaddr.ipx.sipx_port); + default: + @throw [OFInvalidArgumentException exception]; + } +} + +void +OFSocketAddressSetIPXNetwork(OFSocketAddress *address, uint32_t network) +{ + if (address->family != OFSocketAddressFamilyIPX) + @throw [OFInvalidArgumentException exception]; + + network = OFToBigEndian32(network); + memcpy(&address->sockaddr.ipx.sipx_network, &network, + sizeof(address->sockaddr.ipx.sipx_network)); +} + +uint32_t +OFSocketAddressIPXNetwork(const OFSocketAddress *address) +{ + uint32_t network; + + if (address->family != OFSocketAddressFamilyIPX) + @throw [OFInvalidArgumentException exception]; + + memcpy(&network, &address->sockaddr.ipx.sipx_network, sizeof(network)); + + return OFFromBigEndian32(network); +} + +void +OFSocketAddressSetIPXNode(OFSocketAddress *address, + const unsigned char node[IPX_NODE_LEN]) +{ + if (address->family != OFSocketAddressFamilyIPX) + @throw [OFInvalidArgumentException exception]; + + memcpy(address->sockaddr.ipx.sipx_node, node, IPX_NODE_LEN); +} + +void +OFSocketAddressIPXNode(const OFSocketAddress *address, + unsigned char node[IPX_NODE_LEN]) +{ + if (address->family != OFSocketAddressFamilyIPX) + @throw [OFInvalidArgumentException exception]; + + memcpy(node, address->sockaddr.ipx.sipx_node, IPX_NODE_LEN); +} Index: src/OFSortedList.h ================================================================== --- src/OFSortedList.h +++ src/OFSortedList.h @@ -31,27 +31,25 @@ #endif { OF_RESERVE_IVARS(OFSortedList, 4) } -- (of_list_object_t *)appendObject: (ObjectType)object OF_UNAVAILABLE; -- (of_list_object_t *)prependObject: (ObjectType)object OF_UNAVAILABLE; -- (of_list_object_t *)insertObject: (ObjectType)object - beforeListObject: (of_list_object_t *)listObject - OF_UNAVAILABLE; -- (of_list_object_t *)insertObject: (ObjectType)object - afterListObject: (of_list_object_t *)listObject - OF_UNAVAILABLE; +- (OFListItem)appendObject: (ObjectType)object OF_UNAVAILABLE; +- (OFListItem)prependObject: (ObjectType)object OF_UNAVAILABLE; +- (OFListItem)insertObject: (ObjectType)object + beforeListItem: (OFListItem)listItem OF_UNAVAILABLE; +- (OFListItem)insertObject: (ObjectType)object + afterListItem: (OFListItem)listItem OF_UNAVAILABLE; /** * @brief Inserts the object to the list while keeping the list sorted. * * @param object The object to insert * @return The list object for the object just added */ -- (of_list_object_t *)insertObject: (ObjectType )object; +- (OFListItem)insertObject: (ObjectType )object; #if !defined(OF_HAVE_GENERICS) && !defined(DOXYGEN) # undef ObjectType #endif @end OF_ASSUME_NONNULL_END Index: src/OFSortedList.m ================================================================== --- src/OFSortedList.m +++ src/OFSortedList.m @@ -16,40 +16,39 @@ #include "config.h" #import "OFSortedList.h" @implementation OFSortedList -- (of_list_object_t *)appendObject: (id)object -{ - OF_UNRECOGNIZED_SELECTOR -} - -- (of_list_object_t *)prependObject: (id)object -{ - OF_UNRECOGNIZED_SELECTOR -} - -- (of_list_object_t *)insertObject: (id)object - beforeListObject: (of_list_object_t *)listObject -{ - OF_UNRECOGNIZED_SELECTOR -} - -- (of_list_object_t *)insertObject: (id)object - afterListObject: (of_list_object_t *)listObject -{ - OF_UNRECOGNIZED_SELECTOR -} - -- (of_list_object_t *)insertObject: (id )object -{ - of_list_object_t *iter; - - for (iter = _lastListObject; iter != NULL; iter = iter->previous) { - if ([object compare: iter->object] != OF_ORDERED_ASCENDING) - return [super insertObject: object - afterListObject: iter]; +- (OFListItem)appendObject: (id)object +{ + OF_UNRECOGNIZED_SELECTOR +} + +- (OFListItem)prependObject: (id)object +{ + OF_UNRECOGNIZED_SELECTOR +} + +- (OFListItem)insertObject: (id)object beforeListItem: (OFListItem)listItem +{ + OF_UNRECOGNIZED_SELECTOR +} + +- (OFListItem)insertObject: (id)object afterListItem: (OFListItem)listItem +{ + OF_UNRECOGNIZED_SELECTOR +} + +- (OFListItem)insertObject: (id )object +{ + OFListItem iter; + + for (iter = _lastListItem; iter != NULL; + iter = OFListItemPrevious(iter)) { + if ([object compare: OFListItemObject(iter)] != + OFOrderedAscending) + return [super insertObject: object afterListItem: iter]; } return [super prependObject: object]; } @end Index: src/OFStdIOStream.h ================================================================== --- src/OFStdIOStream.h +++ src/OFStdIOStream.h @@ -29,11 +29,11 @@ /** * @class OFStdIOStream OFStdIOStream.h ObjFW/OFStdIOStream.h * * @brief A class for providing standard input, output and error as OFStream. * - * The global variables @ref of_stdin, @ref of_stdout and @ref of_stderr are + * The global variables @ref OFStdIn, @ref OFStdOut and @ref OFStdErr are * instances of this class and need no initialization. */ #ifdef OF_STDIO_STREAM_WIN32_CONSOLE_H OF_SUBCLASSING_RESTRICTED #endif @@ -116,19 +116,19 @@ * @brief Moves the cursor to the specified absolute position. Does nothing if * there is no underlying terminal. * * @param position The position to move the cursor to */ -- (void)setCursorPosition: (of_point_t)position; +- (void)setCursorPosition: (OFPoint)position; /** * @brief Moves the cursor to the specified relative position. Does nothing if * there is no underlying terminal. * * @param position The position to move the cursor to */ -- (void)setRelativeCursorPosition: (of_point_t)position; +- (void)setRelativeCursorPosition: (OFPoint)position; @end #ifdef __cplusplus extern "C" { #endif @@ -135,29 +135,29 @@ /** @file */ /** * @brief The standard input as an OFStream. */ -extern OFStdIOStream *_Nullable of_stdin; +extern OFStdIOStream *_Nullable OFStdIn; /** * @brief The standard output as an OFStream. */ -extern OFStdIOStream *_Nullable of_stdout; +extern OFStdIOStream *_Nullable OFStdOut; /** * @brief The standard error as an OFStream. */ -extern OFStdIOStream *_Nullable of_stderr; +extern OFStdIOStream *_Nullable OFStdErr; /** - * @brief Log the specified printf-style format to @ref of_stderr. + * @brief Log the specified printf-style format to @ref OFStdErr. * * This prefixes the output with the date, timestamp, process name and PID and * allows `%@` as a printf-style formatted to print objects. */ -extern void of_log(OFConstantString *format, ...); +extern void OFLog(OFConstantString *format, ...); #ifdef __cplusplus } #endif OF_ASSUME_NONNULL_END Index: src/OFStdIOStream.m ================================================================== --- src/OFStdIOStream.m +++ src/OFStdIOStream.m @@ -59,25 +59,25 @@ { [OFWin32ConsoleStdIOStream class]; } #endif -OFStdIOStream *of_stdin = nil; -OFStdIOStream *of_stdout = nil; -OFStdIOStream *of_stderr = nil; +OFStdIOStream *OFStdIn = nil; +OFStdIOStream *OFStdOut = nil; +OFStdIOStream *OFStdErr = nil; #ifdef OF_AMIGAOS OF_DESTRUCTOR() { - [of_stdin dealloc]; - [of_stdout dealloc]; - [of_stderr dealloc]; + [OFStdIn dealloc]; + [OFStdOut dealloc]; + [OFStdErr dealloc]; } #endif void -of_log(OFConstantString *format, ...) +OFLog(OFConstantString *format, ...) { void *pool = objc_autoreleasePoolPush(); OFDate *date; OFString *dateString, *me, *msg; va_list arguments; @@ -93,12 +93,12 @@ va_start(arguments, format); msg = [[[OFString alloc] initWithFormat: format arguments: arguments] autorelease]; va_end(arguments); - [of_stderr writeFormat: @"[%@.%03d %@(%d)] %@\n", dateString, - date.microsecond / 1000, me, getpid(), msg]; + [OFStdErr writeFormat: @"[%@.%03d %@(%d)] %@\n", dateString, + date.microsecond / 1000, me, getpid(), msg]; objc_autoreleasePoolPop(pool); } #ifdef HAVE_ISATTY @@ -151,17 +151,16 @@ # ifndef OF_AMIGAOS int fd; if ((fd = fileno(stdin)) >= 0) - of_stdin = [[OFStdIOStream alloc] - of_initWithFileDescriptor: fd]; + OFStdIn = [[OFStdIOStream alloc] of_initWithFileDescriptor: fd]; if ((fd = fileno(stdout)) >= 0) - of_stdout = [[OFStdIOStream alloc] + OFStdOut = [[OFStdIOStream alloc] of_initWithFileDescriptor: fd]; if ((fd = fileno(stderr)) >= 0) - of_stderr = [[OFStdIOStream alloc] + OFStdErr = [[OFStdIOStream alloc] of_initWithFileDescriptor: fd]; # else BPTR input, output, error; bool inputClosable = false, outputClosable = false, errorClosable = false; @@ -183,16 +182,16 @@ if (error == 0) { error = Open("*", MODE_OLDFILE); errorClosable = true; } - of_stdin = [[OFStdIOStream alloc] of_initWithHandle: input - closable: inputClosable]; - of_stdout = [[OFStdIOStream alloc] of_initWithHandle: output - closable: outputClosable]; - of_stderr = [[OFStdIOStream alloc] of_initWithHandle: error - closable: errorClosable]; + OFStdIn = [[OFStdIOStream alloc] of_initWithHandle: input + closable: inputClosable]; + OFStdOut = [[OFStdIOStream alloc] of_initWithHandle: output + closable: outputClosable]; + OFStdErr = [[OFStdIOStream alloc] of_initWithHandle: error + closable: errorClosable]; # endif } #endif - (instancetype)init @@ -381,11 +380,11 @@ { } - (unsigned int)retainCount { - return OF_RETAIN_COUNT_MAX; + return OFMaxRetainCount; } - (bool)hasTerminal { #ifdef HAVE_ISATTY @@ -491,11 +490,11 @@ [self writeFormat: @"\033[%uG", column + 1]; #endif } -- (void)setCursorPosition: (of_point_t)position +- (void)setCursorPosition: (OFPoint)position { if (position.x < 0 || position.y < 0) @throw [OFInvalidArgumentException exception]; #ifdef HAVE_ISATTY @@ -505,11 +504,11 @@ [self writeFormat: @"\033[%u;%uH", (unsigned)position.y + 1, (unsigned)position.x + 1]; #endif } -- (void)setRelativeCursorPosition: (of_point_t)position +- (void)setRelativeCursorPosition: (OFPoint)position { #ifdef HAVE_ISATTY if (!isatty(_fd)) return; ADDED src/OFStrPTime.h Index: src/OFStrPTime.h ================================================================== --- src/OFStrPTime.h +++ src/OFStrPTime.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#ifndef __STDC_LIMIT_MACROS +# define __STDC_LIMIT_MACROS +#endif +#ifndef __STDC_CONSTANT_MACROS +# define __STDC_CONSTANT_MACROS +#endif + +#include + +#import "macros.h" + +OF_ASSUME_NONNULL_BEGIN + +#ifdef __cplusplus +extern "C" { +#endif +extern const char *OFStrPTime(const char *buf, const char *fmt, struct tm *tm, + short *tz); +#ifdef __cplusplus +} +#endif + +OF_ASSUME_NONNULL_END ADDED src/OFStrPTime.m Index: src/OFStrPTime.m ================================================================== --- src/OFStrPTime.m +++ src/OFStrPTime.m @@ -0,0 +1,230 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#include + +#include + +#import "macros.h" + +const char * +OFStrPTime(const char *buffer, const char *format, struct tm *tm, short *tz) +{ + enum { + stateSearchConversionSpecifier, + stateInConversionSpecifier + } state = stateSearchConversionSpecifier; + size_t j, bufferLen, formatLen; + + bufferLen = strlen(buffer); + formatLen = strlen(format); + + j = 0; + for (size_t i = 0; i < formatLen; i++) { + if (j >= bufferLen) + return NULL; + + switch (state) { + case stateSearchConversionSpecifier: + if (format[i] == '%') + state = stateInConversionSpecifier; + else if (format[i] != buffer[j++]) + return NULL; + + break; + case stateInConversionSpecifier:; + int k, maxLen, number = 0; + + switch (format[i]) { + case 'd': + case 'e': + case 'H': + case 'm': + case 'M': + case 'S': + case 'y': + maxLen = 2; + break; + case 'Y': + maxLen = 4; + break; + case '%': + case 'a': + case 'b': + case 'n': + case 't': + case 'z': + maxLen = 0; + break; + default: + return NULL; + } + + if (maxLen > 0 && (buffer[j] < '0' || buffer[j] > '9')) + return NULL; + + for (k = 0; k < maxLen && j < bufferLen && + buffer[j] >= '0' && buffer[j] <= '9'; k++, j++) { + number *= 10; + number += buffer[j] - '0'; + } + + switch (format[i]) { + case 'a': + if (bufferLen < j + 3) + return NULL; + + if (memcmp(buffer + j, "Sun", 3) == 0) + tm->tm_wday = 0; + else if (memcmp(buffer + j, "Mon", 3) == 0) + tm->tm_wday = 1; + else if (memcmp(buffer + j, "Tue", 3) == 0) + tm->tm_wday = 2; + else if (memcmp(buffer + j, "Wed", 3) == 0) + tm->tm_wday = 3; + else if (memcmp(buffer + j, "Thu", 3) == 0) + tm->tm_wday = 4; + else if (memcmp(buffer + j, "Fri", 3) == 0) + tm->tm_wday = 5; + else if (memcmp(buffer + j, "Sat", 3) == 0) + tm->tm_wday = 6; + else + return NULL; + + j += 3; + break; + case 'b': + if (bufferLen < j + 3) + return NULL; + + if (memcmp(buffer + j, "Jan", 3) == 0) + tm->tm_mon = 0; + else if (memcmp(buffer + j, "Feb", 3) == 0) + tm->tm_mon = 1; + else if (memcmp(buffer + j, "Mar", 3) == 0) + tm->tm_mon = 2; + else if (memcmp(buffer + j, "Apr", 3) == 0) + tm->tm_mon = 3; + else if (memcmp(buffer + j, "May", 3) == 0) + tm->tm_mon = 4; + else if (memcmp(buffer + j, "Jun", 3) == 0) + tm->tm_mon = 5; + else if (memcmp(buffer + j, "Jul", 3) == 0) + tm->tm_mon = 6; + else if (memcmp(buffer + j, "Aug", 3) == 0) + tm->tm_mon = 7; + else if (memcmp(buffer + j, "Sep", 3) == 0) + tm->tm_mon = 8; + else if (memcmp(buffer + j, "Oct", 3) == 0) + tm->tm_mon = 9; + else if (memcmp(buffer + j, "Nov", 3) == 0) + tm->tm_mon = 10; + else if (memcmp(buffer + j, "Dec", 3) == 0) + tm->tm_mon = 11; + else + return NULL; + + j += 3; + break; + case 'd': + case 'e': + tm->tm_mday = number; + break; + case 'H': + tm->tm_hour = number; + break; + case 'm': + tm->tm_mon = number - 1; + break; + case 'M': + tm->tm_min = number; + break; + case 'S': + tm->tm_sec = number; + break; + case 'y': + if (number <= 68) + number += 100; + + tm->tm_year = number; + break; + case 'Y': + if (number < 1900) + return NULL; + + tm->tm_year = number - 1900; + break; + case 'z': + if (buffer[j] == '-' || buffer[j] == '+') { + const char *b = buffer + j; + + if (bufferLen < j + 5) + return NULL; + + if (tz == NULL) + break; + + *tz = (((short)b[1] - '0') * 600 + + ((short)b[2] - '0') * 60 + + ((short)b[3] - '0') * 10 + + ((short)b[4] - '0')) * + (b[0] == '-' ? -1 : 1); + + j += 5; + } else if (buffer[j] == 'Z') { + if (tz != NULL) + *tz = 0; + + j++; + } else if (buffer[j] == 'G') { + if (bufferLen < j + 3) + return NULL; + + if (buffer[j + 1] != 'M' || + buffer[j + 2] != 'T') + return NULL; + + if (tz != NULL) + *tz = 0; + + j += 3; + } else + return NULL; + + break; + case '%': + if (buffer[j++] != '%') + return NULL; + break; + case 'n': + if (buffer[j++] != '\n') + return NULL; + break; + case 't': + if (buffer[j++] != '\t') + return NULL; + break; + } + + state = stateSearchConversionSpecifier; + + break; + } + } + + return buffer + j; +} Index: src/OFStream.h ================================================================== --- src/OFStream.h +++ src/OFStream.h @@ -44,12 +44,11 @@ * @param length The length of the data that has been read * @param exception An exception which occurred while reading or `nil` on * success * @return A bool whether the same block should be used for the next read */ -typedef bool (^of_stream_async_read_block_t)(size_t length, - id _Nullable exception); +typedef bool (^OFStreamAsyncReadBlock)(size_t length, id _Nullable exception); /** * @brief A block which is called when a line was read asynchronously from a * stream. * @@ -57,11 +56,11 @@ * occurred * @param exception An exception which occurred while reading or `nil` on * success * @return A bool whether the same block should be used for the next read */ -typedef bool (^of_stream_async_read_line_block_t)(OFString *_Nullable line, +typedef bool (^OFStreamAsyncReadLineBlock)(OFString *_Nullable line, id _Nullable exception); /** * @brief A block which is called when data was written asynchronously to a * stream. @@ -72,12 +71,12 @@ * asynchronous write if no exception was encountered. * @param exception An exception which occurred while writing or `nil` on * success * @return The data to repeat the write with or nil if it should not repeat */ -typedef OFData *_Nullable (^of_stream_async_write_data_block_t)( - OFData *_Nonnull data, size_t bytesWritten, id _Nullable exception); +typedef OFData *_Nullable (^OFStreamAsyncWriteDataBlock)(OFData *_Nonnull data, + size_t bytesWritten, id _Nullable exception); /** * @brief A block which is called when a string was written asynchronously to a * stream. * @@ -87,11 +86,11 @@ * asynchronous write if no exception was encountered. * @param exception An exception which occurred while writing or `nil` on * success * @return The string to repeat the write with or nil if it should not repeat */ -typedef OFString *_Nullable (^of_stream_async_write_string_block_t)( +typedef OFString *_Nullable (^OFStreamAsyncWriteStringBlock)( OFString *_Nonnull string, size_t bytesWritten, id _Nullable exception); #endif /** * @protocol OFStreamDelegate OFStream.h ObjFW/OFStream.h @@ -159,11 +158,11 @@ * @param exception An exception that occurred while writing, or nil on success * @return The string to repeat the write with or nil if it should not repeat */ - (nullable OFString *)stream: (OFStream *)stream didWriteString: (OFString *)string - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding bytesWritten: (size_t)bytesWritten exception: (nullable id)exception; @end /** @@ -311,11 +310,11 @@ * The buffer *must* be *at least* this big! * @param runLoopMode The run loop mode in which to perform the async read */ - (void)asyncReadIntoBuffer: (void *)buffer length: (size_t)length - runLoopMode: (of_run_loop_mode_t)runLoopMode; + runLoopMode: (OFRunLoopMode)runLoopMode; /** * @brief Asynchronously reads exactly the specified length bytes from the * stream into a buffer. * @@ -350,11 +349,11 @@ * The buffer *must* be *at least* this big! * @param runLoopMode The run loop mode in which to perform the async read */ - (void)asyncReadIntoBuffer: (void *)buffer exactLength: (size_t)length - runLoopMode: (of_run_loop_mode_t)runLoopMode; + runLoopMode: (OFRunLoopMode)runLoopMode; # ifdef OF_HAVE_BLOCKS /** * @brief Asynchronously reads *at most* ref size bytes from the stream into a * buffer. @@ -380,11 +379,11 @@ * you want the next block in the queue to handle the data * received next, you need to return false from the block. */ - (void)asyncReadIntoBuffer: (void *)buffer length: (size_t)length - block: (of_stream_async_read_block_t)block; + block: (OFStreamAsyncReadBlock)block; /** * @brief Asynchronously reads *at most* ref size bytes from the stream into a * buffer. * @@ -410,12 +409,12 @@ * you want the next block in the queue to handle the data * received next, you need to return false from the block. */ - (void)asyncReadIntoBuffer: (void *)buffer length: (size_t)length - runLoopMode: (of_run_loop_mode_t)runLoopMode - block: (of_stream_async_read_block_t)block; + runLoopMode: (OFRunLoopMode)runLoopMode + block: (OFStreamAsyncReadBlock)block; /** * @brief Asynchronously reads exactly the specified length bytes from the * stream into a buffer. * @@ -436,11 +435,11 @@ * you want the next block in the queue to handle the data * received next, you need to return false from the block. */ - (void)asyncReadIntoBuffer: (void *)buffer exactLength: (size_t)length - block: (of_stream_async_read_block_t)block; + block: (OFStreamAsyncReadBlock)block; /** * @brief Asynchronously reads exactly the specified length bytes from the * stream into a buffer. * @@ -462,12 +461,12 @@ * you want the next block in the queue to handle the data * received next, you need to return false from the block. */ - (void)asyncReadIntoBuffer: (void *)buffer exactLength: (size_t)length - runLoopMode: (of_run_loop_mode_t)runLoopMode - block: (of_stream_async_read_block_t)block; + runLoopMode: (OFRunLoopMode)runLoopMode + block: (OFStreamAsyncReadBlock)block; # endif #endif /** * @brief Reads a uint8_t from the stream. @@ -790,11 +789,11 @@ * @param encoding The encoding of the string to read from the stream * @param length The length (in bytes) of the string to read from the stream * @return A string with the specified length */ - (OFString *)readStringWithLength: (size_t)length - encoding: (of_string_encoding_t)encoding; + encoding: (OFStringEncoding)encoding; /** * @brief Reads until a newline, `\0` or end of stream occurs. * * @return The line that was read, autoreleased, or `nil` if the end of the @@ -808,11 +807,11 @@ * * @param encoding The encoding used by the stream * @return The line that was read, autoreleased, or `nil` if the end of the * stream has been reached. */ -- (nullable OFString *)readLineWithEncoding: (of_string_encoding_t)encoding; +- (nullable OFString *)readLineWithEncoding: (OFStringEncoding)encoding; #ifdef OF_HAVE_SOCKETS /** * @brief Asynchronously reads until a newline, `\0`, end of stream or an * exception occurs. @@ -829,11 +828,11 @@ * @note The stream must conform to @ref OFReadyForReadingObserving in order * for this to work! * * @param encoding The encoding used by the stream */ -- (void)asyncReadLineWithEncoding: (of_string_encoding_t)encoding; +- (void)asyncReadLineWithEncoding: (OFStringEncoding)encoding; /** * @brief Asynchronously reads with the specified encoding until a newline, * `\0`, end of stream or an exception occurs. * @@ -841,12 +840,12 @@ * for this to work! * * @param encoding The encoding used by the stream * @param runLoopMode The run loop mode in which to perform the async read */ -- (void)asyncReadLineWithEncoding: (of_string_encoding_t)encoding - runLoopMode: (of_run_loop_mode_t)runLoopMode; +- (void)asyncReadLineWithEncoding: (OFStringEncoding)encoding + runLoopMode: (OFRunLoopMode)runLoopMode; # ifdef OF_HAVE_BLOCKS /** * @brief Asynchronously reads until a newline, `\0`, end of stream or an * exception occurs. @@ -858,11 +857,11 @@ * If the block returns true, it will be called again when the next * line has been received. If you want the next block in the queue * to handle the next line, you need to return false from the * block. */ -- (void)asyncReadLineWithBlock: (of_stream_async_read_line_block_t)block; +- (void)asyncReadLineWithBlock: (OFStreamAsyncReadLineBlock)block; /** * @brief Asynchronously reads with the specified encoding until a newline, * `\0`, end of stream or an exception occurs. * @@ -874,12 +873,12 @@ * If the block returns true, it will be called again when the next * line has been received. If you want the next block in the queue * to handle the next line, you need to return false from the * block. */ -- (void)asyncReadLineWithEncoding: (of_string_encoding_t)encoding - block: (of_stream_async_read_line_block_t)block; +- (void)asyncReadLineWithEncoding: (OFStringEncoding)encoding + block: (OFStreamAsyncReadLineBlock)block; /** * @brief Asynchronously reads with the specified encoding until a newline, * `\0`, end of stream or an exception occurs. * @@ -892,13 +891,13 @@ * If the block returns true, it will be called again when the next * line has been received. If you want the next block in the queue * to handle the next line, you need to return false from the * block. */ -- (void)asyncReadLineWithEncoding: (of_string_encoding_t)encoding - runLoopMode: (of_run_loop_mode_t)runLoopMode - block: (of_stream_async_read_line_block_t)block; +- (void)asyncReadLineWithEncoding: (OFStringEncoding)encoding + runLoopMode: (OFRunLoopMode)runLoopMode + block: (OFStreamAsyncReadLineBlock)block; # endif #endif /** * @brief Tries to read a line from the stream (see @ref readLine) and returns @@ -916,11 +915,11 @@ * * @param encoding The encoding used by the stream * @return The line that was read, autoreleased, or `nil` if the line is not * complete yet */ -- (nullable OFString *)tryReadLineWithEncoding: (of_string_encoding_t)encoding; +- (nullable OFString *)tryReadLineWithEncoding: (OFStringEncoding)encoding; /** * @brief Reads until the specified string or `\0` is found or the end of * stream occurs. * @@ -938,11 +937,11 @@ * @param encoding The encoding used by the stream * @return The line that was read, autoreleased, or `nil` if the end of the * stream has been reached. */ - (nullable OFString *)readTillDelimiter: (OFString *)delimiter - encoding: (of_string_encoding_t)encoding; + encoding: (OFStringEncoding)encoding; /** * @brief Tries to reads until the specified string or `\0` is found or the end * of stream (see @ref readTillDelimiter:) and returns `nil` if not * enough data has been received yet. @@ -962,11 +961,11 @@ * @param encoding The encoding used by the stream * @return The line that was read, autoreleased, or `nil` if the end of the * stream has been reached. */ - (nullable OFString *)tryReadTillDelimiter: (OFString *)delimiter - encoding: (of_string_encoding_t)encoding; + encoding: (OFStringEncoding)encoding; /** * @brief Writes everything in the write buffer to the stream. */ - (void)flushWriteBuffer; @@ -1000,11 +999,11 @@ * * @param data The data which is written into the stream * @param runLoopMode The run loop mode in which to perform the async write */ - (void)asyncWriteData: (OFData *)data - runLoopMode: (of_run_loop_mode_t)runLoopMode; + runLoopMode: (OFRunLoopMode)runLoopMode; /** * @brief Asynchronously writes a string in UTF-8 encoding into the stream. * * @note The stream must conform to @ref OFReadyForWritingObserving in order @@ -1024,11 +1023,11 @@ * @param string The string which is written into the stream * @param encoding The encoding in which the string should be written to the * stream */ - (void)asyncWriteString: (OFString *)string - encoding: (of_string_encoding_t)encoding; + encoding: (OFStringEncoding)encoding; /** * @brief Asynchronously writes a string in the specified encoding into the * stream. * @@ -1039,12 +1038,12 @@ * @param encoding The encoding in which the string should be written to the * stream * @param runLoopMode The run loop mode in which to perform the async write */ - (void)asyncWriteString: (OFString *)string - encoding: (of_string_encoding_t)encoding - runLoopMode: (of_run_loop_mode_t)runLoopMode; + encoding: (OFStringEncoding)encoding + runLoopMode: (OFRunLoopMode)runLoopMode; # ifdef OF_HAVE_BLOCKS /** * @brief Asynchronously writes data into the stream. * @@ -1055,11 +1054,11 @@ * @param block The block to call when the data has been written. It should * return the data for the next write with the same callback or * nil if it should not repeat. */ - (void)asyncWriteData: (OFData *)data - block: (of_stream_async_write_data_block_t)block; + block: (OFStreamAsyncWriteDataBlock)block; /** * @brief Asynchronously writes data into the stream. * * @note The stream must conform to @ref OFReadyForWritingObserving in order @@ -1070,12 +1069,12 @@ * @param block The block to call when the data has been written. It should * return the data for the next write with the same callback or * nil if it should not repeat. */ - (void)asyncWriteData: (OFData *)data - runLoopMode: (of_run_loop_mode_t)runLoopMode - block: (of_stream_async_write_data_block_t)block; + runLoopMode: (OFRunLoopMode)runLoopMode + block: (OFStreamAsyncWriteDataBlock)block; /** * @brief Asynchronously writes a string into the stream. * * @note The stream must conform to @ref OFReadyForWritingObserving in order @@ -1085,11 +1084,11 @@ * @param block The block to call when the string has been written. It should * return the string for the next write with the same callback or * nil if it should not repeat. */ - (void)asyncWriteString: (OFString *)string - block: (of_stream_async_write_string_block_t)block; + block: (OFStreamAsyncWriteStringBlock)block; /** * @brief Asynchronously writes a string in the specified encoding into the * stream. * @@ -1102,12 +1101,12 @@ * @param block The block to call when the string has been written. It should * return the string for the next write with the same callback or * nil if it should not repeat. */ - (void)asyncWriteString: (OFString *)string - encoding: (of_string_encoding_t)encoding - block: (of_stream_async_write_string_block_t)block; + encoding: (OFStringEncoding)encoding + block: (OFStreamAsyncWriteStringBlock)block; /** * @brief Asynchronously writes a string in the specified encoding into the * stream. * @@ -1121,13 +1120,13 @@ * @param block The block to call when the string has been written. It should * return the string for the next write with the same callback or * nil if it should not repeat. */ - (void)asyncWriteString: (OFString *)string - encoding: (of_string_encoding_t)encoding - runLoopMode: (of_run_loop_mode_t)runLoopMode - block: (of_stream_async_write_string_block_t)block; + encoding: (OFStringEncoding)encoding + runLoopMode: (OFRunLoopMode)runLoopMode + block: (OFStreamAsyncWriteStringBlock)block; # endif #endif /** * @brief Writes a uint8_t into the stream. @@ -1341,12 +1340,11 @@ * * @param string The string from which the data is written to the stream * @param encoding The encoding in which to write the string to the stream * @return The number of bytes written */ -- (size_t)writeString: (OFString *)string - encoding: (of_string_encoding_t)encoding; +- (size_t)writeString: (OFString *)string encoding: (OFStringEncoding)encoding; /** * @brief Writes a string into the stream with a trailing newline. * * @param string The string from which the data is written to the stream @@ -1360,19 +1358,18 @@ * * @param string The string from which the data is written to the stream * @param encoding The encoding in which to write the string to the stream * @return The number of bytes written */ -- (size_t)writeLine: (OFString *)string - encoding: (of_string_encoding_t)encoding; +- (size_t)writeLine: (OFString *)string encoding: (OFStringEncoding)encoding; /** * @brief Writes a formatted string into the stream. * * See printf for the format syntax. As an addition, `%@` is available as - * format specifier for objects, `%C` for `of_unichar_t` and `%S` for - * `const of_unichar_t *`. + * format specifier for objects, `%C` for `OFUnichar` and `%S` for + * `const OFUnichar *`. * * @param format A string used as format * @return The number of bytes written */ - (size_t)writeFormat: (OFConstantString *)format, ...; @@ -1379,12 +1376,12 @@ /** * @brief Writes a formatted string into the stream. * * See printf for the format syntax. As an addition, `%@` is available as - * format specifier for objects, `%C` for `of_unichar_t` and `%S` for - * `const of_unichar_t *`. + * format specifier for objects, `%C` for `OFUnichar` and `%S` for + * `const OFUnichar *`. * * @param format A string used as format * @param arguments The arguments used in the format string * @return The number of bytes written */ Index: src/OFStream.m ================================================================== --- src/OFStream.m +++ src/OFStream.m @@ -26,26 +26,26 @@ #ifdef HAVE_FCNTL_H # include #endif -#ifdef OF_HAVE_SOCKETS -# import "socket_helpers.h" -#endif - #include "platform.h" #if !defined(OF_WINDOWS) && !defined(OF_MORPHOS) # include #endif #import "OFStream.h" #import "OFStream+Private.h" +#import "OFASPrintF.h" #import "OFData.h" #import "OFKernelEventObserver.h" #import "OFRunLoop+Private.h" #import "OFRunLoop.h" +#ifdef OF_HAVE_SOCKETS +# import "OFSocket+Private.h" +#endif #import "OFString.h" #import "OFSystemInfo.h" #import "OFInvalidArgumentException.h" #import "OFInvalidFormatException.h" @@ -54,13 +54,11 @@ #import "OFOutOfRangeException.h" #import "OFSetOptionFailedException.h" #import "OFTruncatedDataException.h" #import "OFWriteFailedException.h" -#import "of_asprintf.h" - -#define MIN_READ_SIZE 512 +#define minReadSize 512 @implementation OFStream @synthesize buffersWrites = _buffersWrites; @synthesize of_waitingForDelimiter = _waitingForDelimiter, delegate = _delegate; @@ -91,12 +89,12 @@ return self; } - (void)dealloc { - free(_readBufferMemory); - free(_writeBuffer); + OFFreeMemory(_readBufferMemory); + OFFreeMemory(_writeBuffer); [super dealloc]; } - (bool)lowlevelIsAtEndOfStream @@ -133,22 +131,22 @@ /* * For small sizes, it is cheaper to read more and cache the * remainder - even if that means more copying of data - than * to do a syscall for every read. */ - if (length < MIN_READ_SIZE) { - char tmp[MIN_READ_SIZE], *readBuffer; + if (length < minReadSize) { + char tmp[minReadSize], *readBuffer; size_t bytesRead; - bytesRead = [self - lowlevelReadIntoBuffer: tmp - length: MIN_READ_SIZE]; + bytesRead = [self lowlevelReadIntoBuffer: tmp + length: minReadSize]; if (bytesRead > length) { memcpy(buffer, tmp, length); - readBuffer = of_alloc(bytesRead - length, 1); + readBuffer = OFAllocMemory(bytesRead - length, + 1); memcpy(readBuffer, tmp + length, bytesRead - length); _readBuffer = _readBufferMemory = readBuffer; _readBufferLength = bytesRead - length; @@ -165,11 +163,11 @@ if (length >= _readBufferLength) { size_t ret = _readBufferLength; memcpy(buffer, _readBuffer, _readBufferLength); - free(_readBufferMemory); + OFFreeMemory(_readBufferMemory); _readBuffer = _readBufferMemory = NULL; _readBufferLength = 0; return ret; } else { @@ -198,16 +196,16 @@ #ifdef OF_HAVE_SOCKETS - (void)asyncReadIntoBuffer: (void *)buffer length: (size_t)length { [self asyncReadIntoBuffer: buffer length: length - runLoopMode: of_run_loop_mode_default]; + runLoopMode: OFDefaultRunLoopMode]; } - (void)asyncReadIntoBuffer: (void *)buffer length: (size_t)length - runLoopMode: (of_run_loop_mode_t)runLoopMode + runLoopMode: (OFRunLoopMode)runLoopMode { OFStream *stream = (OFStream *)self; [OFRunLoop of_addAsyncReadForStream: stream @@ -222,16 +220,16 @@ - (void)asyncReadIntoBuffer: (void *)buffer exactLength: (size_t)length { [self asyncReadIntoBuffer: buffer exactLength: length - runLoopMode: of_run_loop_mode_default]; + runLoopMode: OFDefaultRunLoopMode]; } - (void)asyncReadIntoBuffer: (void *)buffer exactLength: (size_t)length - runLoopMode: (of_run_loop_mode_t)runLoopMode + runLoopMode: (OFRunLoopMode)runLoopMode { OFStream *stream = (OFStream *)self; [OFRunLoop of_addAsyncReadForStream: stream @@ -245,22 +243,22 @@ } # ifdef OF_HAVE_BLOCKS - (void)asyncReadIntoBuffer: (void *)buffer length: (size_t)length - block: (of_stream_async_read_block_t)block + block: (OFStreamAsyncReadBlock)block { [self asyncReadIntoBuffer: buffer length: length - runLoopMode: of_run_loop_mode_default + runLoopMode: OFDefaultRunLoopMode block: block]; } - (void)asyncReadIntoBuffer: (void *)buffer length: (size_t)length - runLoopMode: (of_run_loop_mode_t)runLoopMode - block: (of_stream_async_read_block_t)block + runLoopMode: (OFRunLoopMode)runLoopMode + block: (OFStreamAsyncReadBlock)block { OFStream *stream = (OFStream *)self; [OFRunLoop of_addAsyncReadForStream: stream @@ -271,22 +269,22 @@ delegate: nil]; } - (void)asyncReadIntoBuffer: (void *)buffer exactLength: (size_t)length - block: (of_stream_async_read_block_t)block + block: (OFStreamAsyncReadBlock)block { [self asyncReadIntoBuffer: buffer exactLength: length - runLoopMode: of_run_loop_mode_default + runLoopMode: OFDefaultRunLoopMode block: block]; } - (void)asyncReadIntoBuffer: (void *)buffer exactLength: (size_t)length - runLoopMode: (of_run_loop_mode_t)runLoopMode - block: (of_stream_async_read_block_t)block + runLoopMode: (OFRunLoopMode)runLoopMode + block: (OFStreamAsyncReadBlock)block { OFStream *stream = (OFStream *)self; [OFRunLoop of_addAsyncReadForStream: stream @@ -308,39 +306,39 @@ - (uint16_t)readBigEndianInt16 { uint16_t ret; [self readIntoBuffer: (char *)&ret exactLength: 2]; - return OF_BSWAP16_IF_LE(ret); + return OFFromBigEndian16(ret); } - (uint32_t)readBigEndianInt32 { uint32_t ret; [self readIntoBuffer: (char *)&ret exactLength: 4]; - return OF_BSWAP32_IF_LE(ret); + return OFFromBigEndian32(ret); } - (uint64_t)readBigEndianInt64 { uint64_t ret; [self readIntoBuffer: (char *)&ret exactLength: 8]; - return OF_BSWAP64_IF_LE(ret); + return OFFromBigEndian64(ret); } - (float)readBigEndianFloat { float ret; [self readIntoBuffer: (char *)&ret exactLength: 4]; - return OF_BSWAP_FLOAT_IF_LE(ret); + return OFFromBigEndianFloat(ret); } - (double)readBigEndianDouble { double ret; [self readIntoBuffer: (char *)&ret exactLength: 8]; - return OF_BSWAP_DOUBLE_IF_LE(ret); + return OFFromBigEndianDouble(ret); } - (size_t)readBigEndianInt16sIntoBuffer: (uint16_t *)buffer count: (size_t)count { size_t size; @@ -352,11 +350,11 @@ [self readIntoBuffer: buffer exactLength: size]; #ifndef OF_BIG_ENDIAN for (size_t i = 0; i < count; i++) - buffer[i] = OF_BSWAP16(buffer[i]); + buffer[i] = OFByteSwap16(buffer[i]); #endif return size; } @@ -371,11 +369,11 @@ [self readIntoBuffer: buffer exactLength: size]; #ifndef OF_BIG_ENDIAN for (size_t i = 0; i < count; i++) - buffer[i] = OF_BSWAP32(buffer[i]); + buffer[i] = OFByteSwap32(buffer[i]); #endif return size; } @@ -390,11 +388,11 @@ [self readIntoBuffer: buffer exactLength: size]; #ifndef OF_BIG_ENDIAN for (size_t i = 0; i < count; i++) - buffer[i] = OF_BSWAP64(buffer[i]); + buffer[i] = OFByteSwap64(buffer[i]); #endif return size; } @@ -409,11 +407,11 @@ [self readIntoBuffer: buffer exactLength: size]; #ifndef OF_FLOAT_BIG_ENDIAN for (size_t i = 0; i < count; i++) - buffer[i] = OF_BSWAP_FLOAT(buffer[i]); + buffer[i] = OFByteSwapFloat(buffer[i]); #endif return size; } @@ -428,49 +426,49 @@ [self readIntoBuffer: buffer exactLength: size]; #ifndef OF_FLOAT_BIG_ENDIAN for (size_t i = 0; i < count; i++) - buffer[i] = OF_BSWAP_DOUBLE(buffer[i]); + buffer[i] = OFByteSwapDouble(buffer[i]); #endif return size; } - (uint16_t)readLittleEndianInt16 { uint16_t ret; [self readIntoBuffer: (char *)&ret exactLength: 2]; - return OF_BSWAP16_IF_BE(ret); + return OFFromLittleEndian16(ret); } - (uint32_t)readLittleEndianInt32 { uint32_t ret; [self readIntoBuffer: (char *)&ret exactLength: 4]; - return OF_BSWAP32_IF_BE(ret); + return OFFromLittleEndian32(ret); } - (uint64_t)readLittleEndianInt64 { uint64_t ret; [self readIntoBuffer: (char *)&ret exactLength: 8]; - return OF_BSWAP64_IF_BE(ret); + return OFFromLittleEndian64(ret); } - (float)readLittleEndianFloat { float ret; [self readIntoBuffer: (char *)&ret exactLength: 4]; - return OF_BSWAP_FLOAT_IF_BE(ret); + return OFFromLittleEndianFloat(ret); } - (double)readLittleEndianDouble { double ret; [self readIntoBuffer: (char *)&ret exactLength: 8]; - return OF_BSWAP_DOUBLE_IF_BE(ret); + return OFFromLittleEndianDouble(ret); } - (size_t)readLittleEndianInt16sIntoBuffer: (uint16_t *)buffer count: (size_t)count { @@ -483,11 +481,11 @@ [self readIntoBuffer: buffer exactLength: size]; #ifdef OF_BIG_ENDIAN for (size_t i = 0; i < count; i++) - buffer[i] = OF_BSWAP16(buffer[i]); + buffer[i] = OFByteSwap16(buffer[i]); #endif return size; } @@ -503,11 +501,11 @@ [self readIntoBuffer: buffer exactLength: size]; #ifdef OF_BIG_ENDIAN for (size_t i = 0; i < count; i++) - buffer[i] = OF_BSWAP32(buffer[i]); + buffer[i] = OFByteSwap32(buffer[i]); #endif return size; } @@ -523,11 +521,11 @@ [self readIntoBuffer: buffer exactLength: size]; #ifdef OF_BIG_ENDIAN for (size_t i = 0; i < count; i++) - buffer[i] = OF_BSWAP64(buffer[i]); + buffer[i] = OFByteSwap64(buffer[i]); #endif return size; } @@ -543,11 +541,11 @@ [self readIntoBuffer: buffer exactLength: size]; #ifdef OF_FLOAT_BIG_ENDIAN for (size_t i = 0; i < count; i++) - buffer[i] = OF_BSWAP_FLOAT(buffer[i]); + buffer[i] = OFByteSwapFloat(buffer[i]); #endif return size; } @@ -563,11 +561,11 @@ [self readIntoBuffer: buffer exactLength: size]; #ifdef OF_FLOAT_BIG_ENDIAN for (size_t i = 0; i < count; i++) - buffer[i] = OF_BSWAP_DOUBLE(buffer[i]); + buffer[i] = OFByteSwapDouble(buffer[i]); #endif return size; } @@ -582,19 +580,19 @@ char *buffer; if OF_UNLIKELY (count > SIZE_MAX / itemSize) @throw [OFOutOfRangeException exception]; - buffer = of_alloc(count, itemSize); + buffer = OFAllocMemory(count, itemSize); @try { [self readIntoBuffer: buffer exactLength: count * itemSize]; ret = [OFData dataWithItemsNoCopy: buffer count: count itemSize: itemSize freeWhenDone: true]; } @catch (id e) { - free(buffer); + OFFreeMemory(buffer); @throw e; } return ret; } @@ -601,50 +599,50 @@ - (OFData *)readDataUntilEndOfStream { OFMutableData *data = [OFMutableData data]; size_t pageSize = [OFSystemInfo pageSize]; - char *buffer = of_alloc(1, pageSize); + char *buffer = OFAllocMemory(1, pageSize); @try { while (!self.atEndOfStream) { size_t length = [self readIntoBuffer: buffer length: pageSize]; [data addItems: buffer count: length]; } } @finally { - free(buffer); + OFFreeMemory(buffer); } [data makeImmutable]; return data; } - (OFString *)readStringWithLength: (size_t)length { return [self readStringWithLength: length - encoding: OF_STRING_ENCODING_UTF_8]; + encoding: OFStringEncodingUTF8]; } - (OFString *)readStringWithLength: (size_t)length - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { OFString *ret; - char *buffer = of_alloc(length + 1, 1); + char *buffer = OFAllocMemory(length + 1, 1); buffer[length] = 0; @try { [self readIntoBuffer: buffer exactLength: length]; ret = [OFString stringWithCString: buffer encoding: encoding]; } @finally { - free(buffer); + OFFreeMemory(buffer); } return ret; } -- (OFString *)tryReadLineWithEncoding: (of_string_encoding_t)encoding +- (OFString *)tryReadLineWithEncoding: (OFStringEncoding)encoding { size_t pageSize, bufferLength; char *buffer, *readBuffer; OFString *ret; @@ -671,11 +669,11 @@ } } /* Read and see if we got a newline or \0 */ pageSize = [OFSystemInfo pageSize]; - buffer = of_alloc(1, pageSize); + buffer = OFAllocMemory(1, pageSize); @try { if ([self lowlevelIsAtEndOfStream]) { size_t retLength; @@ -691,11 +689,11 @@ ret = [OFString stringWithCString: _readBuffer encoding: encoding length: retLength]; - free(_readBufferMemory); + OFFreeMemory(_readBufferMemory); _readBuffer = _readBufferMemory = NULL; _readBufferLength = 0; _waitingForDelimiter = false; return ret; @@ -707,11 +705,11 @@ /* Look if there's a newline or \0 */ for (size_t i = 0; i < bufferLength; i++) { if OF_UNLIKELY (buffer[i] == '\n' || buffer[i] == '\0') { size_t retLength = _readBufferLength + i; - char *retCString = of_alloc(retLength, 1); + char *retCString = OFAllocMemory(retLength, 1); if (_readBuffer != NULL) memcpy(retCString, _readBuffer, _readBufferLength); memcpy(retCString + _readBufferLength, @@ -730,38 +728,39 @@ if (bufferLength > 0) { /* * Append data to _readBuffer * to prevent loss of data. */ - readBuffer = of_alloc( + readBuffer = OFAllocMemory( _readBufferLength + bufferLength, 1); memcpy(readBuffer, _readBuffer, _readBufferLength); memcpy(readBuffer + _readBufferLength, buffer, bufferLength); - free(_readBufferMemory); + OFFreeMemory(_readBufferMemory); _readBuffer = readBuffer; _readBufferMemory = readBuffer; _readBufferLength += bufferLength; } @throw e; } @finally { - free(retCString); + OFFreeMemory(retCString); } - readBuffer = of_alloc(bufferLength - i - 1, 1); + readBuffer = OFAllocMemory(bufferLength - i - 1, + 1); if (readBuffer != NULL) memcpy(readBuffer, buffer + i + 1, bufferLength - i - 1); - free(_readBufferMemory); + OFFreeMemory(_readBufferMemory); _readBuffer = _readBufferMemory = readBuffer; _readBufferLength = bufferLength - i - 1; _waitingForDelimiter = false; return ret; @@ -768,35 +767,35 @@ } } /* There was no newline or \0 */ if (bufferLength > 0) { - readBuffer = of_alloc(_readBufferLength + bufferLength, - 1); + readBuffer = OFAllocMemory( + _readBufferLength + bufferLength, 1); memcpy(readBuffer, _readBuffer, _readBufferLength); memcpy(readBuffer + _readBufferLength, buffer, bufferLength); - free(_readBufferMemory); + OFFreeMemory(_readBufferMemory); _readBuffer = _readBufferMemory = readBuffer; _readBufferLength += bufferLength; } } @finally { - free(buffer); + OFFreeMemory(buffer); } _waitingForDelimiter = true; return nil; } - (OFString *)readLine { - return [self readLineWithEncoding: OF_STRING_ENCODING_UTF_8]; + return [self readLineWithEncoding: OFStringEncodingUTF8]; } -- (OFString *)readLineWithEncoding: (of_string_encoding_t)encoding +- (OFString *)readLineWithEncoding: (OFStringEncoding)encoding { OFString *line = nil; while ((line = [self tryReadLineWithEncoding: encoding]) == nil) if (self.atEndOfStream) @@ -806,22 +805,22 @@ } #ifdef OF_HAVE_SOCKETS - (void)asyncReadLine { - [self asyncReadLineWithEncoding: OF_STRING_ENCODING_UTF_8 - runLoopMode: of_run_loop_mode_default]; + [self asyncReadLineWithEncoding: OFStringEncodingUTF8 + runLoopMode: OFDefaultRunLoopMode]; } -- (void)asyncReadLineWithEncoding: (of_string_encoding_t)encoding +- (void)asyncReadLineWithEncoding: (OFStringEncoding)encoding { [self asyncReadLineWithEncoding: encoding - runLoopMode: of_run_loop_mode_default]; + runLoopMode: OFDefaultRunLoopMode]; } -- (void)asyncReadLineWithEncoding: (of_string_encoding_t)encoding - runLoopMode: (of_run_loop_mode_t)runLoopMode +- (void)asyncReadLineWithEncoding: (OFStringEncoding)encoding + runLoopMode: (OFRunLoopMode)runLoopMode { OFStream *stream = (OFStream *)self; [OFRunLoop of_addAsyncReadLineForStream: stream @@ -832,28 +831,28 @@ # endif delegate: _delegate]; } # ifdef OF_HAVE_BLOCKS -- (void)asyncReadLineWithBlock: (of_stream_async_read_line_block_t)block +- (void)asyncReadLineWithBlock: (OFStreamAsyncReadLineBlock)block { - [self asyncReadLineWithEncoding: OF_STRING_ENCODING_UTF_8 - runLoopMode: of_run_loop_mode_default + [self asyncReadLineWithEncoding: OFStringEncodingUTF8 + runLoopMode: OFDefaultRunLoopMode block: block]; } -- (void)asyncReadLineWithEncoding: (of_string_encoding_t)encoding - block: (of_stream_async_read_line_block_t)block +- (void)asyncReadLineWithEncoding: (OFStringEncoding)encoding + block: (OFStreamAsyncReadLineBlock)block { [self asyncReadLineWithEncoding: encoding - runLoopMode: of_run_loop_mode_default + runLoopMode: OFDefaultRunLoopMode block: block]; } -- (void)asyncReadLineWithEncoding: (of_string_encoding_t)encoding - runLoopMode: (of_run_loop_mode_t)runLoopMode - block: (of_stream_async_read_line_block_t)block +- (void)asyncReadLineWithEncoding: (OFStringEncoding)encoding + runLoopMode: (OFRunLoopMode)runLoopMode + block: (OFStreamAsyncReadLineBlock)block { OFStream *stream = (OFStream *)self; [OFRunLoop of_addAsyncReadLineForStream: stream @@ -865,15 +864,15 @@ # endif #endif - (OFString *)tryReadLine { - return [self tryReadLineWithEncoding: OF_STRING_ENCODING_UTF_8]; + return [self tryReadLineWithEncoding: OFStringEncodingUTF8]; } - (OFString *)tryReadTillDelimiter: (OFString *)delimiter - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { const char *delimiterCString; size_t j, delimiterLength, pageSize, bufferLength; char *buffer, *readBuffer; OFString *ret; @@ -909,11 +908,11 @@ } } /* Read and see if we got a delimiter or \0 */ pageSize = [OFSystemInfo pageSize]; - buffer = of_alloc(1, pageSize); + buffer = OFAllocMemory(1, pageSize); @try { if ([self lowlevelIsAtEndOfStream]) { if (_readBuffer == NULL) { _waitingForDelimiter = false; @@ -922,11 +921,11 @@ ret = [OFString stringWithCString: _readBuffer encoding: encoding length: _readBufferLength]; - free(_readBufferMemory); + OFFreeMemory(_readBufferMemory); _readBuffer = _readBufferMemory = NULL; _readBufferLength = 0; _waitingForDelimiter = false; return ret; @@ -947,11 +946,11 @@ if (buffer[i] == '\0') delimiterLength = 1; retLength = _readBufferLength + i + 1 - delimiterLength; - retCString = of_alloc(retLength, 1); + retCString = OFAllocMemory(retLength, 1); if (_readBuffer != NULL && _readBufferLength <= retLength) memcpy(retCString, _readBuffer, _readBufferLength); @@ -971,38 +970,39 @@ if (bufferLength > 0) { /* * Append data to _readBuffer * to prevent loss of data. */ - readBuffer = of_alloc( + readBuffer = OFAllocMemory( _readBufferLength + bufferLength, 1); memcpy(readBuffer, _readBuffer, _readBufferLength); memcpy(readBuffer + _readBufferLength, buffer, bufferLength); - free(_readBufferMemory); + OFFreeMemory(_readBufferMemory); _readBuffer = readBuffer; _readBufferMemory = readBuffer; _readBufferLength += bufferLength; } @throw e; } @finally { - free(retCString); + OFFreeMemory(retCString); } - readBuffer = of_alloc(bufferLength - i - 1, 1); + readBuffer = OFAllocMemory(bufferLength - i - 1, + 1); if (readBuffer != NULL) memcpy(readBuffer, buffer + i + 1, bufferLength - i - 1); - free(_readBufferMemory); + OFFreeMemory(_readBufferMemory); _readBuffer = _readBufferMemory = readBuffer; _readBufferLength = bufferLength - i - 1; _waitingForDelimiter = false; return ret; @@ -1009,23 +1009,23 @@ } } /* Neither the delimiter nor \0 was found */ if (bufferLength > 0) { - readBuffer = of_alloc(_readBufferLength + bufferLength, - 1); + readBuffer = OFAllocMemory( + _readBufferLength + bufferLength, 1); memcpy(readBuffer, _readBuffer, _readBufferLength); memcpy(readBuffer + _readBufferLength, buffer, bufferLength); - free(_readBufferMemory); + OFFreeMemory(_readBufferMemory); _readBuffer = _readBufferMemory = readBuffer; _readBufferLength += bufferLength; } } @finally { - free(buffer); + OFFreeMemory(buffer); } _waitingForDelimiter = true; return nil; } @@ -1032,15 +1032,15 @@ - (OFString *)readTillDelimiter: (OFString *)delimiter { return [self readTillDelimiter: delimiter - encoding: OF_STRING_ENCODING_UTF_8]; + encoding: OFStringEncodingUTF8]; } - (OFString *)readTillDelimiter: (OFString *)delimiter - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { OFString *ret = nil; while ((ret = [self tryReadTillDelimiter: delimiter encoding: encoding]) == nil) @@ -1051,21 +1051,21 @@ } - (OFString *)tryReadTillDelimiter: (OFString *)delimiter { return [self tryReadTillDelimiter: delimiter - encoding: OF_STRING_ENCODING_UTF_8]; + encoding: OFStringEncodingUTF8]; } - (void)flushWriteBuffer { if (_writeBuffer == NULL) return; [self lowlevelWriteBuffer: _writeBuffer length: _writeBufferLength]; - free(_writeBuffer); + OFFreeMemory(_writeBuffer); _writeBuffer = NULL; _writeBufferLength = 0; } - (size_t)writeBuffer: (const void *)buffer @@ -1082,11 +1082,11 @@ bytesWritten: bytesWritten errNo: 0]; return bytesWritten; } else { - _writeBuffer = of_realloc(_writeBuffer, + _writeBuffer = OFResizeMemory(_writeBuffer, _writeBufferLength + length, 1); memcpy(_writeBuffer + _writeBufferLength, buffer, length); _writeBufferLength += length; return length; @@ -1094,15 +1094,14 @@ } #ifdef OF_HAVE_SOCKETS - (void)asyncWriteData: (OFData *)data { - [self asyncWriteData: data runLoopMode: of_run_loop_mode_default]; + [self asyncWriteData: data runLoopMode: OFDefaultRunLoopMode]; } -- (void)asyncWriteData: (OFData *)data - runLoopMode: (of_run_loop_mode_t)runLoopMode +- (void)asyncWriteData: (OFData *)data runLoopMode: (OFRunLoopMode)runLoopMode { OFStream *stream = (OFStream *)self; [OFRunLoop of_addAsyncWriteForStream: stream @@ -1115,25 +1114,25 @@ } - (void)asyncWriteString: (OFString *)string { [self asyncWriteString: string - encoding: OF_STRING_ENCODING_UTF_8 - runLoopMode: of_run_loop_mode_default]; + encoding: OFStringEncodingUTF8 + runLoopMode: OFDefaultRunLoopMode]; } - (void)asyncWriteString: (OFString *)string - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { [self asyncWriteString: string encoding: encoding - runLoopMode: of_run_loop_mode_default]; + runLoopMode: OFDefaultRunLoopMode]; } - (void)asyncWriteString: (OFString *)string - encoding: (of_string_encoding_t)encoding - runLoopMode: (of_run_loop_mode_t)runLoopMode + encoding: (OFStringEncoding)encoding + runLoopMode: (OFRunLoopMode)runLoopMode { OFStream *stream = (OFStream *)self; [OFRunLoop of_addAsyncWriteForStream: stream @@ -1145,21 +1144,20 @@ # endif delegate: _delegate]; } # ifdef OF_HAVE_BLOCKS -- (void)asyncWriteData: (OFData *)data - block: (of_stream_async_write_data_block_t)block +- (void)asyncWriteData: (OFData *)data block: (OFStreamAsyncWriteDataBlock)block { [self asyncWriteData: data - runLoopMode: of_run_loop_mode_default + runLoopMode: OFDefaultRunLoopMode block: block]; } - (void)asyncWriteData: (OFData *)data - runLoopMode: (of_run_loop_mode_t)runLoopMode - block: (of_stream_async_write_data_block_t)block + runLoopMode: (OFRunLoopMode)runLoopMode + block: (OFStreamAsyncWriteDataBlock)block { OFStream *stream = (OFStream *)self; [OFRunLoop of_addAsyncWriteForStream: stream @@ -1168,32 +1166,32 @@ block: block delegate: nil]; } - (void)asyncWriteString: (OFString *)string - block: (of_stream_async_write_string_block_t)block + block: (OFStreamAsyncWriteStringBlock)block { [self asyncWriteString: string - encoding: OF_STRING_ENCODING_UTF_8 - runLoopMode: of_run_loop_mode_default + encoding: OFStringEncodingUTF8 + runLoopMode: OFDefaultRunLoopMode block: block]; } - (void)asyncWriteString: (OFString *)string - encoding: (of_string_encoding_t)encoding - block: (of_stream_async_write_string_block_t)block + encoding: (OFStringEncoding)encoding + block: (OFStreamAsyncWriteStringBlock)block { [self asyncWriteString: string encoding: encoding - runLoopMode: of_run_loop_mode_default + runLoopMode: OFDefaultRunLoopMode block: block]; } - (void)asyncWriteString: (OFString *)string - encoding: (of_string_encoding_t)encoding - runLoopMode: (of_run_loop_mode_t)runLoopMode - block: (of_stream_async_write_string_block_t)block + encoding: (OFStringEncoding)encoding + runLoopMode: (OFRunLoopMode)runLoopMode + block: (OFStreamAsyncWriteStringBlock)block { OFStream *stream = (OFStream *)self; [OFRunLoop of_addAsyncWriteForStream: stream @@ -1211,35 +1209,35 @@ [self writeBuffer: (char *)&int8 length: 1]; } - (void)writeBigEndianInt16: (uint16_t)int16 { - int16 = OF_BSWAP16_IF_LE(int16); + int16 = OFToBigEndian16(int16); [self writeBuffer: (char *)&int16 length: 2]; } - (void)writeBigEndianInt32: (uint32_t)int32 { - int32 = OF_BSWAP32_IF_LE(int32); + int32 = OFToBigEndian32(int32); [self writeBuffer: (char *)&int32 length: 4]; } - (void)writeBigEndianInt64: (uint64_t)int64 { - int64 = OF_BSWAP64_IF_LE(int64); + int64 = OFToBigEndian64(int64); [self writeBuffer: (char *)&int64 length: 8]; } - (void)writeBigEndianFloat: (float)float_ { - float_ = OF_BSWAP_FLOAT_IF_LE(float_); + float_ = OFToBigEndianFloat(float_); [self writeBuffer: (char *)&float_ length: 4]; } - (void)writeBigEndianDouble: (double)double_ { - double_ = OF_BSWAP_DOUBLE_IF_LE(double_); + double_ = OFToBigEndianDouble(double_); [self writeBuffer: (char *)&double_ length: 8]; } - (size_t)writeBigEndianInt16s: (const uint16_t *)buffer count: (size_t)count { @@ -1251,19 +1249,19 @@ size = count * sizeof(uint16_t); #ifdef OF_BIG_ENDIAN [self writeBuffer: buffer length: size]; #else - uint16_t *tmp = of_alloc(count, sizeof(uint16_t)); + uint16_t *tmp = OFAllocMemory(count, sizeof(uint16_t)); @try { for (size_t i = 0; i < count; i++) - tmp[i] = OF_BSWAP16(buffer[i]); + tmp[i] = OFByteSwap16(buffer[i]); [self writeBuffer: tmp length: size]; } @finally { - free(tmp); + OFFreeMemory(tmp); } #endif return size; } @@ -1278,19 +1276,19 @@ size = count * sizeof(uint32_t); #ifdef OF_BIG_ENDIAN [self writeBuffer: buffer length: size]; #else - uint32_t *tmp = of_alloc(count, sizeof(uint32_t)); + uint32_t *tmp = OFAllocMemory(count, sizeof(uint32_t)); @try { for (size_t i = 0; i < count; i++) - tmp[i] = OF_BSWAP32(buffer[i]); + tmp[i] = OFByteSwap32(buffer[i]); [self writeBuffer: tmp length: size]; } @finally { - free(tmp); + OFFreeMemory(tmp); } #endif return size; } @@ -1305,19 +1303,19 @@ size = count * sizeof(uint64_t); #ifdef OF_BIG_ENDIAN [self writeBuffer: buffer length: size]; #else - uint64_t *tmp = of_alloc(count, sizeof(uint64_t)); + uint64_t *tmp = OFAllocMemory(count, sizeof(uint64_t)); @try { for (size_t i = 0; i < count; i++) - tmp[i] = OF_BSWAP64(buffer[i]); + tmp[i] = OFByteSwap64(buffer[i]); [self writeBuffer: tmp length: size]; } @finally { - free(tmp); + OFFreeMemory(tmp); } #endif return size; } @@ -1332,19 +1330,19 @@ size = count * sizeof(float); #ifdef OF_FLOAT_BIG_ENDIAN [self writeBuffer: buffer length: size]; #else - float *tmp = of_alloc(count, sizeof(float)); + float *tmp = OFAllocMemory(count, sizeof(float)); @try { for (size_t i = 0; i < count; i++) - tmp[i] = OF_BSWAP_FLOAT(buffer[i]); + tmp[i] = OFByteSwapFloat(buffer[i]); [self writeBuffer: tmp length: size]; } @finally { - free(tmp); + OFFreeMemory(tmp); } #endif return size; } @@ -1359,52 +1357,52 @@ size = count * sizeof(double); #ifdef OF_FLOAT_BIG_ENDIAN [self writeBuffer: buffer length: size]; #else - double *tmp = of_alloc(count, sizeof(double)); + double *tmp = OFAllocMemory(count, sizeof(double)); @try { for (size_t i = 0; i < count; i++) - tmp[i] = OF_BSWAP_DOUBLE(buffer[i]); + tmp[i] = OFByteSwapDouble(buffer[i]); [self writeBuffer: tmp length: size]; } @finally { - free(tmp); + OFFreeMemory(tmp); } #endif return size; } - (void)writeLittleEndianInt16: (uint16_t)int16 { - int16 = OF_BSWAP16_IF_BE(int16); + int16 = OFToLittleEndian16(int16); [self writeBuffer: (char *)&int16 length: 2]; } - (void)writeLittleEndianInt32: (uint32_t)int32 { - int32 = OF_BSWAP32_IF_BE(int32); + int32 = OFToLittleEndian32(int32); [self writeBuffer: (char *)&int32 length: 4]; } - (void)writeLittleEndianInt64: (uint64_t)int64 { - int64 = OF_BSWAP64_IF_BE(int64); + int64 = OFToLittleEndian64(int64); [self writeBuffer: (char *)&int64 length: 8]; } - (void)writeLittleEndianFloat: (float)float_ { - float_ = OF_BSWAP_FLOAT_IF_BE(float_); + float_ = OFToLittleEndianFloat(float_); [self writeBuffer: (char *)&float_ length: 4]; } - (void)writeLittleEndianDouble: (double)double_ { - double_ = OF_BSWAP_DOUBLE_IF_BE(double_); + double_ = OFToLittleEndianDouble(double_); [self writeBuffer: (char *)&double_ length: 8]; } - (size_t)writeLittleEndianInt16s: (const uint16_t *)buffer count: (size_t)count { @@ -1416,19 +1414,19 @@ size = count * sizeof(uint16_t); #ifndef OF_BIG_ENDIAN [self writeBuffer: buffer length: size]; #else - uint16_t *tmp = of_alloc(count, sizeof(uint16_t)); + uint16_t *tmp = OFAllocMemory(count, sizeof(uint16_t)); @try { for (size_t i = 0; i < count; i++) - tmp[i] = OF_BSWAP16(buffer[i]); + tmp[i] = OFByteSwap16(buffer[i]); [self writeBuffer: tmp length: size]; } @finally { - free(tmp); + OFFreeMemory(tmp); } #endif return size; } @@ -1443,19 +1441,19 @@ size = count * sizeof(uint32_t); #ifndef OF_BIG_ENDIAN [self writeBuffer: buffer length: size]; #else - uint32_t *tmp = of_alloc(count, sizeof(uint32_t)); + uint32_t *tmp = OFAllocMemory(count, sizeof(uint32_t)); @try { for (size_t i = 0; i < count; i++) - tmp[i] = OF_BSWAP32(buffer[i]); + tmp[i] = OFByteSwap32(buffer[i]); [self writeBuffer: tmp length: size]; } @finally { - free(tmp); + OFFreeMemory(tmp); } #endif return size; } @@ -1470,19 +1468,19 @@ size = count * sizeof(uint64_t); #ifndef OF_BIG_ENDIAN [self writeBuffer: buffer length: size]; #else - uint64_t *tmp = of_alloc(count, sizeof(uint64_t)); + uint64_t *tmp = OFAllocMemory(count, sizeof(uint64_t)); @try { for (size_t i = 0; i < count; i++) - tmp[i] = OF_BSWAP64(buffer[i]); + tmp[i] = OFByteSwap64(buffer[i]); [self writeBuffer: tmp length: size]; } @finally { - free(tmp); + OFFreeMemory(tmp); } #endif return size; } @@ -1497,19 +1495,19 @@ size = count * sizeof(float); #ifndef OF_FLOAT_BIG_ENDIAN [self writeBuffer: buffer length: size]; #else - float *tmp = of_alloc(count, sizeof(float)); + float *tmp = OFAllocMemory(count, sizeof(float)); @try { for (size_t i = 0; i < count; i++) - tmp[i] = OF_BSWAP_FLOAT(buffer[i]); + tmp[i] = OFByteSwapFloat(buffer[i]); [self writeBuffer: tmp length: size]; } @finally { - free(tmp); + OFFreeMemory(tmp); } #endif return size; } @@ -1524,19 +1522,19 @@ size = count * sizeof(double); #ifndef OF_FLOAT_BIG_ENDIAN [self writeBuffer: buffer length: size]; #else - double *tmp = of_alloc(count, sizeof(double)); + double *tmp = OFAllocMemory(count, sizeof(double)); @try { for (size_t i = 0; i < count; i++) - tmp[i] = OF_BSWAP_DOUBLE(buffer[i]); + tmp[i] = OFByteSwapDouble(buffer[i]); [self writeBuffer: tmp length: size]; } @finally { - free(tmp); + OFFreeMemory(tmp); } #endif return size; } @@ -1559,15 +1557,14 @@ return length; } - (size_t)writeString: (OFString *)string { - return [self writeString: string encoding: OF_STRING_ENCODING_UTF_8]; + return [self writeString: string encoding: OFStringEncodingUTF8]; } -- (size_t)writeString: (OFString *)string - encoding: (of_string_encoding_t)encoding +- (size_t)writeString: (OFString *)string encoding: (OFStringEncoding)encoding { void *pool; size_t length; if (string == nil) @@ -1584,28 +1581,28 @@ return length; } - (size_t)writeLine: (OFString *)string { - return [self writeLine: string encoding: OF_STRING_ENCODING_UTF_8]; + return [self writeLine: string encoding: OFStringEncodingUTF8]; } -- (size_t)writeLine: (OFString *)string encoding: (of_string_encoding_t)encoding +- (size_t)writeLine: (OFString *)string encoding: (OFStringEncoding)encoding { size_t stringLength = [string cStringLengthWithEncoding: encoding]; char *buffer; - buffer = of_alloc(stringLength + 1, 1); + buffer = OFAllocMemory(stringLength + 1, 1); @try { memcpy(buffer, [string cStringWithEncoding: encoding], stringLength); buffer[stringLength] = '\n'; [self writeBuffer: buffer length: stringLength + 1]; } @finally { - free(buffer); + OFFreeMemory(buffer); } return stringLength + 1; } @@ -1627,11 +1624,11 @@ int length; if (format == nil) @throw [OFInvalidArgumentException exception]; - if ((length = of_vasprintf(&UTF8String, format.UTF8String, + if ((length = OFVASPrintF(&UTF8String, format.UTF8String, arguments)) == -1) @throw [OFInvalidFormatException exception]; @try { [self writeBuffer: UTF8String length: length]; @@ -1731,11 +1728,11 @@ #ifdef OF_HAVE_SOCKETS - (void)cancelAsyncRequests { [OFRunLoop of_cancelAsyncRequestsForObject: self - mode: of_run_loop_mode_default]; + mode: OFDefaultRunLoopMode]; } #endif - (void)unreadFromBuffer: (const void *)buffer length: (size_t)length { @@ -1742,28 +1739,28 @@ char *readBuffer; if (length > SIZE_MAX - _readBufferLength) @throw [OFOutOfRangeException exception]; - readBuffer = of_alloc(_readBufferLength + length, 1); + readBuffer = OFAllocMemory(_readBufferLength + length, 1); memcpy(readBuffer, buffer, length); memcpy(readBuffer + length, _readBuffer, _readBufferLength); - free(_readBufferMemory); + OFFreeMemory(_readBufferMemory); _readBuffer = _readBufferMemory = readBuffer; _readBufferLength += length; } - (void)close { - free(_readBufferMemory); + OFFreeMemory(_readBufferMemory); _readBuffer = _readBufferMemory = NULL; _readBufferLength = 0; - free(_writeBuffer); + OFFreeMemory(_writeBuffer); _writeBuffer = NULL; _writeBufferLength = 0; _buffersWrites = false; _waitingForDelimiter = false; } @end Index: src/OFStreamSocket.h ================================================================== --- src/OFStreamSocket.h +++ src/OFStreamSocket.h @@ -12,12 +12,11 @@ * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #import "OFStream.h" - -#import "socket.h" +#import "OFSocket.h" OF_ASSUME_NONNULL_BEGIN /** @file */ @@ -31,12 +30,12 @@ * @param exception An exception which occurred while accepting the socket or * `nil` on success * @return A bool whether the same block should be used for the next incoming * connection */ -typedef bool (^of_stream_socket_async_accept_block_t)( - OFStreamSocket *acceptedSocket, id _Nullable exception); +typedef bool (^OFStreamSocketAsyncAcceptBlock)(OFStreamSocket *acceptedSocket, + id _Nullable exception); #endif /** * @protocol OFStreamSocketDelegate OFStreamSocket.h ObjFW/OFStreamSocket.h * @@ -64,13 +63,13 @@ * @brief A class which provides methods to create and use stream sockets. */ @interface OFStreamSocket: OFStream { - of_socket_t _socket; + OFSocketHandle _socket; bool _atEndOfStream, _listening; - of_socket_address_t _remoteAddress; + OFSocketAddress _remoteAddress; OF_RESERVE_IVARS(OFStreamSocket, 4) } /** * @brief Whether the socket is a listening socket. @@ -80,11 +79,11 @@ /** * @brief The remote address. * * @note This only works for accepted sockets! */ -@property (readonly, nonatomic) const of_socket_address_t *remoteAddress; +@property (readonly, nonatomic) const OFSocketAddress *remoteAddress; /** * @brief The delegate for asynchronous operations on the socket. * * @note The delegate is retained for as long as asynchronous operations are @@ -127,32 +126,31 @@ /** * @brief Asynchronously accept an incoming connection. * * @param runLoopMode The run loop mode in which to perform the async accept */ -- (void)asyncAcceptWithRunLoopMode: (of_run_loop_mode_t)runLoopMode; +- (void)asyncAcceptWithRunLoopMode: (OFRunLoopMode)runLoopMode; #ifdef OF_HAVE_BLOCKS /** * @brief Asynchronously accept an incoming connection. * * @param block The block to execute when a new connection has been accepted. * Returns whether the next incoming connection should be accepted * by the specified block as well. */ -- (void)asyncAcceptWithBlock: (of_stream_socket_async_accept_block_t)block; +- (void)asyncAcceptWithBlock: (OFStreamSocketAsyncAcceptBlock)block; /** * @brief Asynchronously accept an incoming connection. * * @param runLoopMode The run loop mode in which to perform the async accept * @param block The block to execute when a new connection has been accepted. * Returns whether the next incoming connection should be accepted * by the specified block as well. */ -- (void)asyncAcceptWithRunLoopMode: (of_run_loop_mode_t)runLoopMode - block: (of_stream_socket_async_accept_block_t) - block; +- (void)asyncAcceptWithRunLoopMode: (OFRunLoopMode)runLoopMode + block: (OFStreamSocketAsyncAcceptBlock)block; #endif @end OF_ASSUME_NONNULL_END Index: src/OFStreamSocket.m ================================================================== --- src/OFStreamSocket.m +++ src/OFStreamSocket.m @@ -27,10 +27,11 @@ #import "OFStreamSocket.h" #import "OFStreamSocket+Private.h" #import "OFRunLoop.h" #import "OFRunLoop+Private.h" +#import "OFSocket+Private.h" #import "OFAcceptFailedException.h" #import "OFInitializationFailedException.h" #import "OFInvalidArgumentException.h" #import "OFListenFailedException.h" @@ -39,22 +40,20 @@ #import "OFOutOfRangeException.h" #import "OFReadFailedException.h" #import "OFSetOptionFailedException.h" #import "OFWriteFailedException.h" -#import "socket_helpers.h" - @implementation OFStreamSocket @dynamic delegate; @synthesize listening = _listening; + (void)initialize { if (self != [OFStreamSocket class]) return; - if (!of_socket_init()) + if (!OFSocketInit()) @throw [OFInitializationFailedException exceptionWithClass: self]; } + (instancetype)socket @@ -70,11 +69,11 @@ if (self.class == [OFStreamSocket class]) { [self doesNotRecognizeSelector: _cmd]; abort(); } - _socket = INVALID_SOCKET; + _socket = OFInvalidSocketHandle; } @catch (id e) { [self release]; @throw e; } @@ -81,46 +80,46 @@ return self; } - (void)dealloc { - if (_socket != INVALID_SOCKET) + if (_socket != OFInvalidSocketHandle) [self close]; [super dealloc]; } - (bool)lowlevelIsAtEndOfStream { - if (_socket == INVALID_SOCKET) + if (_socket == OFInvalidSocketHandle) @throw [OFNotOpenException exceptionWithObject: self]; return _atEndOfStream; } - (size_t)lowlevelReadIntoBuffer: (void *)buffer length: (size_t)length { ssize_t ret; - if (_socket == INVALID_SOCKET) + if (_socket == OFInvalidSocketHandle) @throw [OFNotOpenException exceptionWithObject: self]; #ifndef OF_WINDOWS if ((ret = recv(_socket, buffer, length, 0)) < 0) @throw [OFReadFailedException exceptionWithObject: self requestedLength: length - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; #else if (length > INT_MAX) @throw [OFOutOfRangeException exception]; if ((ret = recv(_socket, buffer, (int)length, 0)) < 0) @throw [OFReadFailedException exceptionWithObject: self requestedLength: length - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; #endif if (ret == 0) _atEndOfStream = true; @@ -127,11 +126,11 @@ return ret; } - (size_t)lowlevelWriteBuffer: (const void *)buffer length: (size_t)length { - if (_socket == INVALID_SOCKET) + if (_socket == OFInvalidSocketHandle) @throw [OFNotOpenException exceptionWithObject: self]; #ifndef OF_WINDOWS ssize_t bytesWritten; @@ -141,11 +140,11 @@ if ((bytesWritten = send(_socket, (void *)buffer, length, 0)) < 0) @throw [OFWriteFailedException exceptionWithObject: self requestedLength: length bytesWritten: 0 - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; #else int bytesWritten; if (length > INT_MAX) @throw [OFOutOfRangeException exception]; @@ -153,11 +152,11 @@ if ((bytesWritten = send(_socket, buffer, (int)length, 0)) < 0) @throw [OFWriteFailedException exceptionWithObject: self requestedLength: length bytesWritten: 0 - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; #endif return (size_t)bytesWritten; } @@ -171,11 +170,11 @@ # endif if (ioctlsocket(_socket, FIONBIO, &v) == SOCKET_ERROR) @throw [OFSetOptionFailedException exceptionWithObject: self - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; _canBlock = canBlock; } #endif @@ -182,11 +181,11 @@ - (int)fileDescriptorForReading { #ifndef OF_WINDOWS return _socket; #else - if (_socket == INVALID_SOCKET) + if (_socket == OFInvalidSocketHandle) return -1; if (_socket > INT_MAX) @throw [OFOutOfRangeException exception]; @@ -197,11 +196,11 @@ - (int)fileDescriptorForWriting { #ifndef OF_WINDOWS return _socket; #else - if (_socket == INVALID_SOCKET) + if (_socket == OFInvalidSocketHandle) return -1; if (_socket > INT_MAX) @throw [OFOutOfRangeException exception]; @@ -215,11 +214,11 @@ int errNo; socklen_t len = sizeof(errNo); if (getsockopt(_socket, SOL_SOCKET, SO_ERROR, (char *)&errNo, &len) != 0) - return of_socket_errno(); + return OFSocketErrNo(); return errNo; } #endif @@ -228,18 +227,18 @@ [self listenWithBacklog: SOMAXCONN]; } - (void)listenWithBacklog: (int)backlog { - if (_socket == INVALID_SOCKET) + if (_socket == OFInvalidSocketHandle) @throw [OFNotOpenException exceptionWithObject: self]; if (listen(_socket, backlog) == -1) @throw [OFListenFailedException exceptionWithSocket: self backlog: backlog - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; _listening = true; } - (instancetype)accept @@ -256,28 +255,29 @@ #if defined(HAVE_PACCEPT) && defined(SOCK_CLOEXEC) if ((client->_socket = paccept(_socket, &client->_remoteAddress.sockaddr.sockaddr, &client->_remoteAddress.length, NULL, SOCK_CLOEXEC)) == - INVALID_SOCKET) + OFInvalidSocketHandle) @throw [OFAcceptFailedException exceptionWithSocket: self - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; #elif defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC) if ((client->_socket = accept4(_socket, &client->_remoteAddress.sockaddr.sockaddr, - &client->_remoteAddress.length, SOCK_CLOEXEC)) == INVALID_SOCKET) + &client->_remoteAddress.length, SOCK_CLOEXEC)) == + OFInvalidSocketHandle) @throw [OFAcceptFailedException exceptionWithSocket: self - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; #else if ((client->_socket = accept(_socket, &client->_remoteAddress.sockaddr.sockaddr, - &client->_remoteAddress.length)) == INVALID_SOCKET) + &client->_remoteAddress.length)) == OFInvalidSocketHandle) @throw [OFAcceptFailedException exceptionWithSocket: self - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; # if defined(HAVE_FCNTL) && defined(FD_CLOEXEC) if ((flags = fcntl(client->_socket, F_GETFD, 0)) != -1) fcntl(client->_socket, F_SETFD, flags | FD_CLOEXEC); # endif @@ -286,64 +286,62 @@ assert(client->_remoteAddress.length <= (socklen_t)sizeof(client->_remoteAddress.sockaddr)); switch (client->_remoteAddress.sockaddr.sockaddr.sa_family) { case AF_INET: - client->_remoteAddress.family = OF_SOCKET_ADDRESS_FAMILY_IPV4; + client->_remoteAddress.family = OFSocketAddressFamilyIPv4; break; #ifdef OF_HAVE_IPV6 case AF_INET6: - client->_remoteAddress.family = OF_SOCKET_ADDRESS_FAMILY_IPV6; + client->_remoteAddress.family = OFSocketAddressFamilyIPv6; break; #endif #ifdef OF_HAVE_IPX case AF_IPX: - client->_remoteAddress.family = OF_SOCKET_ADDRESS_FAMILY_IPX; + client->_remoteAddress.family = OFSocketAddressFamilyIPX; break; #endif default: - client->_remoteAddress.family = - OF_SOCKET_ADDRESS_FAMILY_UNKNOWN; + client->_remoteAddress.family = OFSocketAddressFamilyUnknown; break; } return client; } - (void)asyncAccept { - [self asyncAcceptWithRunLoopMode: of_run_loop_mode_default]; + [self asyncAcceptWithRunLoopMode: OFDefaultRunLoopMode]; } -- (void)asyncAcceptWithRunLoopMode: (of_run_loop_mode_t)runLoopMode +- (void)asyncAcceptWithRunLoopMode: (OFRunLoopMode)runLoopMode { [OFRunLoop of_addAsyncAcceptForSocket: self mode: runLoopMode block: NULL delegate: _delegate]; } #ifdef OF_HAVE_BLOCKS -- (void)asyncAcceptWithBlock: (of_stream_socket_async_accept_block_t)block +- (void)asyncAcceptWithBlock: (OFStreamSocketAsyncAcceptBlock)block { - [self asyncAcceptWithRunLoopMode: of_run_loop_mode_default - block: block]; + [self asyncAcceptWithRunLoopMode: OFDefaultRunLoopMode block: block]; } -- (void)asyncAcceptWithRunLoopMode: (of_run_loop_mode_t)runLoopMode - block: (of_stream_socket_async_accept_block_t)block +- (void)asyncAcceptWithRunLoopMode: (OFRunLoopMode)runLoopMode + block: (OFStreamSocketAsyncAcceptBlock)block { [OFRunLoop of_addAsyncAcceptForSocket: self mode: runLoopMode block: block delegate: nil]; } #endif -- (const of_socket_address_t *)remoteAddress +- (const OFSocketAddress *)remoteAddress { - if (_socket == INVALID_SOCKET) + if (_socket == OFInvalidSocketHandle) @throw [OFNotOpenException exceptionWithObject: self]; if (_remoteAddress.length == 0) @throw [OFInvalidArgumentException exception]; @@ -353,19 +351,19 @@ return &_remoteAddress; } - (void)close { - if (_socket == INVALID_SOCKET) + if (_socket == OFInvalidSocketHandle) @throw [OFNotOpenException exceptionWithObject: self]; _listening = false; memset(&_remoteAddress, 0, sizeof(_remoteAddress)); closesocket(_socket); - _socket = INVALID_SOCKET; + _socket = OFInvalidSocketHandle; _atEndOfStream = false; [super close]; } @end Index: src/OFString+CryptographicHashing.m ================================================================== --- src/OFString+CryptographicHashing.m +++ src/OFString+CryptographicHashing.m @@ -52,11 +52,11 @@ } objc_autoreleasePoolPop(pool); return [OFString stringWithCString: cString - encoding: OF_STRING_ENCODING_ASCII + encoding: OFStringEncodingASCII length: digestSize * 2]; } - (OFString *)stringByMD5Hashing { Index: src/OFString+JSONParsing.m ================================================================== --- src/OFString+JSONParsing.m +++ src/OFString+JSONParsing.m @@ -107,14 +107,14 @@ skipWhitespaces(pointer, stop, line); skipComment(pointer, stop, line); } } -static inline of_char16_t +static inline OFChar16 parseUnicodeEscape(const char *pointer, const char *stop) { - of_char16_t ret = 0; + OFChar16 ret = 0; if (pointer + 5 >= stop) return 0xFFFF; if (pointer[0] != '\\' || pointer[1] != 'u') @@ -148,17 +148,17 @@ char delimiter = **pointer; if (++(*pointer) + 1 >= stop) return nil; - buffer = of_alloc(stop - *pointer, 1); + buffer = OFAllocMemory(stop - *pointer, 1); while (*pointer < stop) { /* Parse escape codes */ if (**pointer == '\\') { if (++(*pointer) >= stop) { - free(buffer); + OFFreeMemory(buffer); return nil; } switch (**pointer) { case '"': @@ -187,32 +187,31 @@ buffer[i++] = '\t'; (*pointer)++; break; /* Parse Unicode escape sequence */ case 'u':; - of_char16_t c1, c2; - of_unichar_t c; + OFChar16 c1, c2; + OFUnichar c; size_t l; c1 = parseUnicodeEscape(*pointer - 1, stop); if (c1 == 0xFFFF) { - free(buffer); + OFFreeMemory(buffer); return nil; } /* Low surrogate */ if ((c1 & 0xFC00) == 0xDC00) { - free(buffer); + OFFreeMemory(buffer); return nil; } /* Normal character */ if ((c1 & 0xFC00) != 0xD800) { - l = of_string_utf8_encode(c1, - buffer + i); + l = OFUTF8StringEncode(c1, buffer + i); if (l == 0) { - free(buffer); + OFFreeMemory(buffer); return nil; } i += l; *pointer += 5; @@ -225,20 +224,20 @@ * surrogate and now need to get the other one * in order to produce UTF-8 and not CESU-8. */ c2 = parseUnicodeEscape(*pointer + 5, stop); if (c2 == 0xFFFF) { - free(buffer); + OFFreeMemory(buffer); return nil; } c = (((c1 & 0x3FF) << 10) | (c2 & 0x3FF)) + 0x10000; - l = of_string_utf8_encode(c, buffer + i); + l = OFUTF8StringEncode(c, buffer + i); if (l == 0) { - free(buffer); + OFFreeMemory(buffer); return nil; } i += l; *pointer += 11; @@ -256,11 +255,11 @@ case '\n': (*pointer)++; (*line)++; break; default: - free(buffer); + OFFreeMemory(buffer); return nil; } /* End of string found */ } else if (**pointer == delimiter) { OFString *ret; @@ -267,38 +266,38 @@ @try { ret = [OFString stringWithUTF8String: buffer length: i]; } @finally { - free(buffer); + OFFreeMemory(buffer); } (*pointer)++; return ret; /* Newlines in strings are disallowed */ } else if (**pointer == '\n' || **pointer == '\r') { (*line)++; - free(buffer); + OFFreeMemory(buffer); return nil; } else { buffer[i++] = **pointer; (*pointer)++; } } - free(buffer); + OFFreeMemory(buffer); return nil; } static inline OFString * parseIdentifier(const char **pointer, const char *stop) { char *buffer; size_t i = 0; - buffer = of_alloc(stop - *pointer, 1); + buffer = OFAllocMemory(stop - *pointer, 1); while (*pointer < stop) { if ((**pointer >= 'a' && **pointer <= 'z') || (**pointer >= 'A' && **pointer <= 'Z') || (**pointer >= '0' && **pointer <= '9') || @@ -305,36 +304,36 @@ **pointer == '_' || **pointer == '$' || (**pointer & 0x80)) { buffer[i++] = **pointer; (*pointer)++; } else if (**pointer == '\\') { - of_char16_t c1, c2; - of_unichar_t c; + OFChar16 c1, c2; + OFUnichar c; size_t l; if (++(*pointer) >= stop || **pointer != 'u') { - free(buffer); + OFFreeMemory(buffer); return nil; } c1 = parseUnicodeEscape(*pointer - 1, stop); if (c1 == 0xFFFF) { - free(buffer); + OFFreeMemory(buffer); return nil; } /* Low surrogate */ if ((c1 & 0xFC00) == 0xDC00) { - free(buffer); + OFFreeMemory(buffer); return nil; } /* Normal character */ if ((c1 & 0xFC00) != 0xD800) { - l = of_string_utf8_encode(c1, buffer + i); + l = OFUTF8StringEncode(c1, buffer + i); if (l == 0) { - free(buffer); + OFFreeMemory(buffer); return nil; } i += l; *pointer += 5; @@ -347,37 +346,37 @@ * surrogate and now need to get the other one in order * to produce UTF-8 and not CESU-8. */ c2 = parseUnicodeEscape(*pointer + 5, stop); if (c2 == 0xFFFF) { - free(buffer); + OFFreeMemory(buffer); return nil; } c = (((c1 & 0x3FF) << 10) | (c2 & 0x3FF)) + 0x10000; - l = of_string_utf8_encode(c, buffer + i); + l = OFUTF8StringEncode(c, buffer + i); if (l == 0) { - free(buffer); + OFFreeMemory(buffer); return nil; } i += l; *pointer += 11; } else { OFString *ret; if (i == 0 || (buffer[0] >= '0' && buffer[0] <= '9')) { - free(buffer); + OFFreeMemory(buffer); return nil; } @try { ret = [OFString stringWithUTF8String: buffer length: i]; } @finally { - free(buffer); + OFFreeMemory(buffer); } return ret; } } @@ -384,11 +383,11 @@ /* * It is never possible to end with an identifier, thus we should never * reach stop. */ - free(buffer); + OFFreeMemory(buffer); return nil; } static inline OFMutableArray * parseArray(const char **pointer, const char *stop, size_t *line, Index: src/OFString+PathAdditions.h ================================================================== --- src/OFString+PathAdditions.h +++ src/OFString+PathAdditions.h @@ -15,16 +15,10 @@ #import "OFString.h" OF_ASSUME_NONNULL_BEGIN -#ifdef OF_AMIGAOS -# define OF_PATH_CURRENT_DIRECTORY @"" -#else -# define OF_PATH_CURRENT_DIRECTORY @"." -#endif - #ifdef __cplusplus extern "C" { #endif extern int _OFString_PathAdditions_reference; #ifdef __cplusplus Index: src/OFString+Serialization.m ================================================================== --- src/OFString+Serialization.m +++ src/OFString+Serialization.m @@ -52,11 +52,11 @@ if (version.unsignedLongLongValue != 1) @throw [OFUnsupportedVersionException exceptionWithVersion: version]; - elements = [root elementsForNamespace: OF_SERIALIZATION_NS]; + elements = [root elementsForNamespace: OFSerializationNS]; if (elements.count != 1) @throw [OFInvalidArgumentException exception]; object = [[elements.firstObject objectByDeserializing] retain]; Index: src/OFString+URLEncoding.m ================================================================== --- src/OFString+URLEncoding.m +++ src/OFString+URLEncoding.m @@ -32,27 +32,27 @@ - (OFString *)stringByURLEncodingWithAllowedCharacters: (OFCharacterSet *)allowedCharacters { OFMutableString *ret = [OFMutableString string]; void *pool = objc_autoreleasePoolPush(); - const of_unichar_t *characters = self.characters; + const OFUnichar *characters = self.characters; size_t length = self.length; - bool (*characterIsMember)(id, SEL, of_unichar_t) = - (bool (*)(id, SEL, of_unichar_t))[allowedCharacters + bool (*characterIsMember)(id, SEL, OFUnichar) = + (bool (*)(id, SEL, OFUnichar))[allowedCharacters methodForSelector: @selector(characterIsMember:)]; for (size_t i = 0; i < length; i++) { - of_unichar_t c = characters[i]; + OFUnichar c = characters[i]; if (characterIsMember(allowedCharacters, @selector(characterIsMember:), c)) [ret appendCharacters: &c length: 1]; else { char buffer[4]; size_t bufferLen; - if ((bufferLen = of_string_utf8_encode(c, buffer)) == 0) + if ((bufferLen = OFUTF8StringEncode(c, buffer)) == 0) @throw [OFInvalidEncodingException exception]; for (size_t j = 0; j < bufferLen; j++) { unsigned char byte = buffer[j]; unsigned char high = byte >> 4; @@ -83,11 +83,11 @@ char *retCString; char byte = 0; int state = 0; size_t i = 0; - retCString = of_alloc(length + 1, 1); + retCString = OFAllocMemory(length + 1, 1); while (length--) { char c = *string++; switch (state) { @@ -106,11 +106,11 @@ else if (c >= 'A' && c <= 'F') byte += (c - 'A' + 10) << shift; else if (c >= 'a' && c <= 'f') byte += (c - 'a' + 10) << shift; else { - free(retCString); + OFFreeMemory(retCString); @throw [OFInvalidFormatException exception]; } if (++state == 3) { retCString[i++] = byte; @@ -124,25 +124,25 @@ retCString[i] = '\0'; objc_autoreleasePoolPop(pool); if (state != 0) { - free(retCString); + OFFreeMemory(retCString); @throw [OFInvalidFormatException exception]; } @try { - retCString = of_realloc(retCString, 1, i + 1); + retCString = OFResizeMemory(retCString, 1, i + 1); } @catch (OFOutOfMemoryException *e) { /* We don't care if it fails, as we only made it smaller. */ } @try { return [OFString stringWithUTF8StringNoCopy: retCString length: i freeWhenDone: true]; } @catch (id e) { - free(retCString); + OFFreeMemory(retCString); @throw e; } } @end Index: src/OFString+XMLEscaping.m ================================================================== --- src/OFString+XMLEscaping.m +++ src/OFString+XMLEscaping.m @@ -38,11 +38,11 @@ string = self.UTF8String; length = self.UTF8StringLength; j = 0; retLength = length; - retCString = of_alloc(retLength, 1); + retCString = OFAllocMemory(retLength, 1); for (size_t i = 0; i < length; i++) { switch (string[i]) { case '<': append = "<"; @@ -73,14 +73,14 @@ appendLen = 0; } if (append != NULL) { @try { - retCString = of_realloc(retCString, 1, + retCString = OFResizeMemory(retCString, 1, retLength + appendLen); } @catch (id e) { - free(retCString); + OFFreeMemory(retCString); @throw e; } retLength += appendLen - 1; memcpy(retCString + j, append, appendLen); @@ -94,10 +94,10 @@ @try { ret = [OFString stringWithUTF8String: retCString length: retLength]; } @finally { - free(retCString); + OFFreeMemory(retCString); } return ret; } @end Index: src/OFString+XMLUnescaping.h ================================================================== --- src/OFString+XMLUnescaping.h +++ src/OFString+XMLUnescaping.h @@ -34,12 +34,12 @@ * * @param string The XML string which contains an unknown entity * @param entity The XML entity which is unknown * @return A replacement string for the unknown entity */ -typedef OFString *_Nullable (^of_string_xml_unescaping_block_t)( - OFString *string, OFString *entity); +typedef OFString *_Nullable (^OFStringXMLUnescapingBlock)(OFString *string, + OFString *entity); #endif /** * @protocol OFStringXMLUnescapingDelegate OFString.h ObjFW/OFString.h * @@ -83,11 +83,10 @@ * @brief Unescapes XML in the string and uses the specified block for unknown * entities. * * @param block A block which handles unknown entities */ -- (OFString *)stringByXMLUnescapingWithBlock: - (of_string_xml_unescaping_block_t)block; +- (OFString *)stringByXMLUnescapingWithBlock: (OFStringXMLUnescapingBlock)block; #endif @end OF_ASSUME_NONNULL_END Index: src/OFString+XMLUnescaping.m ================================================================== --- src/OFString+XMLUnescaping.m +++ src/OFString+XMLUnescaping.m @@ -25,11 +25,11 @@ int _OFString_XMLUnescaping_reference; static OF_INLINE OFString * parseNumericEntity(const char *entity, size_t length) { - of_unichar_t c; + OFUnichar c; size_t i; char buffer[5]; if (length == 1 || *entity != '#') return nil; @@ -62,11 +62,11 @@ else return nil; } } - if ((i = of_string_utf8_encode(c, buffer)) == 0) + if ((i = OFUTF8StringEncode(c, buffer)) == 0) return nil; buffer[i] = 0; return [OFString stringWithUTF8String: buffer length: i]; } @@ -100,31 +100,31 @@ const char *entity = string + last; size_t entityLength = i - last; if (entityLength == 2 && memcmp(entity, "lt", 2) == 0) [ret appendCString: "<" - encoding: OF_STRING_ENCODING_ASCII + encoding: OFStringEncodingASCII length: 1]; else if (entityLength == 2 && memcmp(entity, "gt", 2) == 0) [ret appendCString: ">" - encoding: OF_STRING_ENCODING_ASCII + encoding: OFStringEncodingASCII length: 1]; else if (entityLength == 4 && memcmp(entity, "quot", 4) == 0) [ret appendCString: "\"" - encoding: OF_STRING_ENCODING_ASCII + encoding: OFStringEncodingASCII length: 1]; else if (entityLength == 4 && memcmp(entity, "apos", 4) == 0) [ret appendCString: "'" - encoding: OF_STRING_ENCODING_ASCII + encoding: OFStringEncodingASCII length: 1]; else if (entityLength == 3 && memcmp(entity, "amp", 3) == 0) [ret appendCString: "&" - encoding: OF_STRING_ENCODING_ASCII + encoding: OFStringEncodingASCII length: 1]; else if (entity[0] == '#') { void *pool2; OFString *tmp; @@ -188,11 +188,11 @@ #ifdef OF_HAVE_BLOCKS static id lookupUsingBlock(void *context, OFString *self, OFString *entity) { - of_string_xml_unescaping_block_t block = context; + OFStringXMLUnescapingBlock block = context; if (block == NULL) return nil; return block(self, entity); @@ -210,12 +210,11 @@ { return parseEntities(self, lookupUsingDelegate, delegate); } #ifdef OF_HAVE_BLOCKS -- (OFString *)stringByXMLUnescapingWithBlock: - (of_string_xml_unescaping_block_t)block +- (OFString *)stringByXMLUnescapingWithBlock: (OFStringXMLUnescapingBlock)block { return parseEntities(self, lookupUsingBlock, block); } #endif @end Index: src/OFString.h ================================================================== --- src/OFString.h +++ src/OFString.h @@ -52,72 +52,87 @@ #else typedef void OFString; #endif #if defined(__cplusplus) && __cplusplus >= 201103L -typedef char16_t of_char16_t; -typedef char32_t of_char32_t; +typedef char16_t OFChar16; +typedef char32_t OFChar32; #else -typedef uint_least16_t of_char16_t; -typedef uint_least32_t of_char32_t; +typedef uint_least16_t OFChar16; +typedef uint_least32_t OFChar32; #endif -typedef of_char32_t of_unichar_t; +typedef OFChar32 OFUnichar; /** * @brief The encoding of a string. */ -typedef enum of_string_encoding_t { +typedef enum { /* * UTF-8 *has* to be 0, so that if the current @ref OFLocale is * `nil`, `[OFLocale encoding]` returns UTF-8. */ /** UTF-8 */ - OF_STRING_ENCODING_UTF_8, + OFStringEncodingUTF8, /** ASCII */ - OF_STRING_ENCODING_ASCII, + OFStringEncodingASCII, /** ISO 8859-1 */ - OF_STRING_ENCODING_ISO_8859_1, + OFStringEncodingISO8859_1, /** ISO 8859-2 */ - OF_STRING_ENCODING_ISO_8859_2, + OFStringEncodingISO8859_2, /** ISO 8859-3 */ - OF_STRING_ENCODING_ISO_8859_3, + OFStringEncodingISO8859_3, /** ISO 8859-15 */ - OF_STRING_ENCODING_ISO_8859_15, + OFStringEncodingISO8859_15, /** Windows-1251 */ - OF_STRING_ENCODING_WINDOWS_1251, + OFStringEncodingWindows1251, /** Windows-1252 */ - OF_STRING_ENCODING_WINDOWS_1252, + OFStringEncodingWindows1252, /** Codepage 437 */ - OF_STRING_ENCODING_CODEPAGE_437, + OFStringEncodingCodepage437, /** Codepage 850 */ - OF_STRING_ENCODING_CODEPAGE_850, + OFStringEncodingCodepage850, /** Codepage 858 */ - OF_STRING_ENCODING_CODEPAGE_858, + OFStringEncodingCodepage858, /** Mac OS Roman */ - OF_STRING_ENCODING_MAC_ROMAN, + OFStringEncodingMacRoman, /** KOI8-R */ - OF_STRING_ENCODING_KOI8_R, + OFStringEncodingKOI8R, /** KOI8-U */ - OF_STRING_ENCODING_KOI8_U, + OFStringEncodingKOI8U, /** Try to automatically detect the encoding */ - OF_STRING_ENCODING_AUTODETECT = 0xFF -} of_string_encoding_t; + OFStringEncodingAutodetect = 0xFF +} OFStringEncoding; -enum { - OF_STRING_SEARCH_BACKWARDS = 1, - OF_STRING_SKIP_EMPTY = 2 -}; +/** + * @brief Options for searching in strings. + * + * This is a bit mask. + */ +typedef enum { + /** Search backwards in the string */ + OFStringSearchBackwards = 1 +} OFStringSearchOptions; + +/** + * @brief Options for separating strings. + * + * This is a bit mask. + */ +typedef enum { + /** Skip empty components */ + OFStringSkipEmptyComponents = 1 +} OFStringSeparationOptions; #ifdef OF_HAVE_BLOCKS /** * @brief A block for enumerating the lines of a string. * * @param line The current line * @param stop A pointer to a variable that can be set to true to stop the * enumeration */ -typedef void (^of_string_line_enumeration_block_t)(OFString *line, bool *stop); +typedef void (^OFStringLineEnumerationBlock)(OFString *line, bool *stop); #endif #ifdef __OBJC__ @class OFArray OF_GENERIC(ObjectType); @class OFCharacterSet; @@ -215,21 +230,21 @@ * * The result is valid until the autorelease pool is released. If you want to * use the result outside the scope of the current autorelease pool, you have to * copy it. */ -@property (readonly, nonatomic) const of_unichar_t *characters +@property (readonly, nonatomic) const OFUnichar *characters OF_RETURNS_INNER_POINTER; /** * @brief The string in UTF-16 encoding with native byte order. * * The result is valid until the autorelease pool is released. If you want to * use the result outside the scope of the current autorelease pool, you have to * copy it. */ -@property (readonly, nonatomic) const of_char16_t *UTF16String +@property (readonly, nonatomic) const OFChar16 *UTF16String OF_RETURNS_INNER_POINTER; /** * @brief The length of the string in UTF-16 characters. */ @@ -240,11 +255,11 @@ * * The result is valid until the autorelease pool is released. If you want to * use the result outside the scope of the current autorelease pool, you have to * copy it. */ -@property (readonly, nonatomic) const of_char32_t *UTF32String +@property (readonly, nonatomic) const OFChar32 *UTF32String OF_RETURNS_INNER_POINTER; /** * @brief The string with leading whitespaces deleted. */ @@ -349,11 +364,11 @@ * @param cString A C string to initialize the OFString with * @param encoding The encoding of the C string * @return A new autoreleased OFString */ + (instancetype)stringWithCString: (const char *)cString - encoding: (of_string_encoding_t)encoding; + encoding: (OFStringEncoding)encoding; /** * @brief Creates a new OFString from a C string with the specified encoding * and length. * @@ -361,11 +376,11 @@ * @param encoding The encoding of the C string * @param cStringLength The length of the C string * @return A new autoreleased OFString */ + (instancetype)stringWithCString: (const char *)cString - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding length: (size_t)cStringLength; /** * @brief Creates a new OFString from OFData with the specified encoding. * @@ -372,11 +387,11 @@ * @param data OFData with the contents of the string * @param encoding The encoding in which the string is stored in the OFData * @return An new autoreleased OFString */ + (instancetype)stringWithData: (OFData *)data - encoding: (of_string_encoding_t)encoding; + encoding: (OFStringEncoding)encoding; /** * @brief Creates a new OFString from another string. * * @param string A string to initialize the OFString with @@ -390,30 +405,30 @@ * * @param characters An array of Unicode characters * @param length The length of the Unicode character array * @return A new autoreleased OFString */ -+ (instancetype)stringWithCharacters: (const of_unichar_t *)characters ++ (instancetype)stringWithCharacters: (const OFUnichar *)characters length: (size_t)length; /** * @brief Creates a new OFString from a UTF-16 encoded string. * * @param string The UTF-16 string * @return A new autoreleased OFString */ -+ (instancetype)stringWithUTF16String: (const of_char16_t *)string; ++ (instancetype)stringWithUTF16String: (const OFChar16 *)string; /** * @brief Creates a new OFString from a UTF-16 encoded string with the * specified length. * * @param string The UTF-16 string * @param length The length of the UTF-16 string * @return A new autoreleased OFString */ -+ (instancetype)stringWithUTF16String: (const of_char16_t *)string ++ (instancetype)stringWithUTF16String: (const OFChar16 *)string length: (size_t)length; /** * @brief Creates a new OFString from a UTF-16 encoded string, assuming the * specified byte order if no byte order mark is found. @@ -420,12 +435,12 @@ * * @param string The UTF-16 string * @param byteOrder The byte order to assume if there is no byte order mark * @return A new autoreleased OFString */ -+ (instancetype)stringWithUTF16String: (const of_char16_t *)string - byteOrder: (of_byte_order_t)byteOrder; ++ (instancetype)stringWithUTF16String: (const OFChar16 *)string + byteOrder: (OFByteOrder)byteOrder; /** * @brief Creates a new OFString from a UTF-16 encoded string with the * specified length, assuming the specified byte order if no byte order * mark is found. @@ -433,31 +448,31 @@ * @param string The UTF-16 string * @param length The length of the UTF-16 string * @param byteOrder The byte order to assume if there is no byte order mark * @return A new autoreleased OFString */ -+ (instancetype)stringWithUTF16String: (const of_char16_t *)string ++ (instancetype)stringWithUTF16String: (const OFChar16 *)string length: (size_t)length - byteOrder: (of_byte_order_t)byteOrder; + byteOrder: (OFByteOrder)byteOrder; /** * @brief Creates a new OFString from a UTF-32 encoded string. * * @param string The UTF-32 string * @return A new autoreleased OFString */ -+ (instancetype)stringWithUTF32String: (const of_char32_t *)string; ++ (instancetype)stringWithUTF32String: (const OFChar32 *)string; /** * @brief Creates a new OFString from a UTF-32 encoded string with the * specified length. * * @param string The UTF-32 string * @param length The length of the UTF-32 string * @return A new autoreleased OFString */ -+ (instancetype)stringWithUTF32String: (const of_char32_t *)string ++ (instancetype)stringWithUTF32String: (const OFChar32 *)string length: (size_t)length; /** * @brief Creates a new OFString from a UTF-32 encoded string, assuming the * specified byte order if no byte order mark is found. @@ -464,12 +479,12 @@ * * @param string The UTF-32 string * @param byteOrder The byte order to assume if there is no byte order mark * @return A new autoreleased OFString */ -+ (instancetype)stringWithUTF32String: (const of_char32_t *)string - byteOrder: (of_byte_order_t)byteOrder; ++ (instancetype)stringWithUTF32String: (const OFChar32 *)string + byteOrder: (OFByteOrder)byteOrder; /** * @brief Creates a new OFString from a UTF-32 encoded string with the * specified length, assuming the specified byte order if no byte order * mark is found. @@ -477,20 +492,20 @@ * @param string The UTF-32 string * @param length The length of the UTF-32 string * @param byteOrder The byte order to assume if there is no byte order mark * @return A new autoreleased OFString */ -+ (instancetype)stringWithUTF32String: (const of_char32_t *)string ++ (instancetype)stringWithUTF32String: (const OFChar32 *)string length: (size_t)length - byteOrder: (of_byte_order_t)byteOrder; + byteOrder: (OFByteOrder)byteOrder; /** * @brief Creates a new OFString from a format string. * * See printf for the format syntax. As an addition, `%@` is available as - * format specifier for objects, `%C` for `of_unichar_t` and `%S` for - * `const of_unichar_t *`. + * format specifier for objects, `%C` for `OFUnichar` and `%S` for + * `const OFUnichar *`. * * @param format A string used as format to initialize the OFString * @return A new autoreleased OFString */ + (instancetype)stringWithFormat: (OFConstantString *)format, ...; @@ -512,11 +527,11 @@ * @param path The path to the file * @param encoding The encoding of the file * @return A new autoreleased OFString */ + (instancetype)stringWithContentsOfFile: (OFString *)path - encoding: (of_string_encoding_t)encoding; + encoding: (OFStringEncoding)encoding; # endif /** * @brief Creates a new OFString with the contents of the specified URL. * @@ -538,11 +553,11 @@ * @param URL The URL to the contents for the string * @param encoding The encoding to assume * @return A new autoreleased OFString */ + (instancetype)stringWithContentsOfURL: (OFURL *)URL - encoding: (of_string_encoding_t)encoding; + encoding: (OFStringEncoding)encoding; /** * @brief Initializes an already allocated OFString from a UTF-8 encoded C * string. * @@ -606,11 +621,11 @@ * @param cString A C string to initialize the OFString with * @param encoding The encoding of the C string * @return An initialized OFString */ - (instancetype)initWithCString: (const char *)cString - encoding: (of_string_encoding_t)encoding; + encoding: (OFStringEncoding)encoding; /** * @brief Initializes an already allocated OFString from a C string with the * specified encoding and length. * @@ -618,11 +633,11 @@ * @param encoding The encoding of the C string * @param cStringLength The length of the C string * @return An initialized OFString */ - (instancetype)initWithCString: (const char *)cString - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding length: (size_t)cStringLength; /** * @brief Initializes an already allocated OFString from OFData with the * specified encoding. @@ -630,11 +645,11 @@ * @param data OFData with the contents of the string * @param encoding The encoding in which the string is stored in the OFData * @return An initialized OFString */ - (instancetype)initWithData: (OFData *)data - encoding: (of_string_encoding_t)encoding; + encoding: (OFStringEncoding)encoding; /** * @brief Initializes an already allocated OFString with another string. * * @param string A string to initialize the OFString with @@ -648,30 +663,30 @@ * * @param characters An array of Unicode characters * @param length The length of the Unicode character array * @return An initialized OFString */ -- (instancetype)initWithCharacters: (const of_unichar_t *)characters +- (instancetype)initWithCharacters: (const OFUnichar *)characters length: (size_t)length; /** * @brief Initializes an already allocated OFString with a UTF-16 string. * * @param string The UTF-16 string * @return An initialized OFString */ -- (instancetype)initWithUTF16String: (const of_char16_t *)string; +- (instancetype)initWithUTF16String: (const OFChar16 *)string; /** * @brief Initializes an already allocated OFString with a UTF-16 string with * the specified length. * * @param string The UTF-16 string * @param length The length of the UTF-16 string * @return An initialized OFString */ -- (instancetype)initWithUTF16String: (const of_char16_t *)string +- (instancetype)initWithUTF16String: (const OFChar16 *)string length: (size_t)length; /** * @brief Initializes an already allocated OFString with a UTF-16 string, * assuming the specified byte order if no byte order mark is found. @@ -678,12 +693,12 @@ * * @param string The UTF-16 string * @param byteOrder The byte order to assume if there is no byte order mark * @return An initialized OFString */ -- (instancetype)initWithUTF16String: (const of_char16_t *)string - byteOrder: (of_byte_order_t)byteOrder; +- (instancetype)initWithUTF16String: (const OFChar16 *)string + byteOrder: (OFByteOrder)byteOrder; /** * @brief Initializes an already allocated OFString with a UTF-16 string with * the specified length, assuming the specified byte order if no byte * order mark is found. @@ -691,31 +706,31 @@ * @param string The UTF-16 string * @param length The length of the UTF-16 string * @param byteOrder The byte order to assume if there is no byte order mark * @return An initialized OFString */ -- (instancetype)initWithUTF16String: (const of_char16_t *)string +- (instancetype)initWithUTF16String: (const OFChar16 *)string length: (size_t)length - byteOrder: (of_byte_order_t)byteOrder; + byteOrder: (OFByteOrder)byteOrder; /** * @brief Initializes an already allocated OFString with a UTF-32 string. * * @param string The UTF-32 string * @return An initialized OFString */ -- (instancetype)initWithUTF32String: (const of_char32_t *)string; +- (instancetype)initWithUTF32String: (const OFChar32 *)string; /** * @brief Initializes an already allocated OFString with a UTF-32 string with * the specified length * * @param string The UTF-32 string * @param length The length of the UTF-32 string * @return An initialized OFString */ -- (instancetype)initWithUTF32String: (const of_char32_t *)string +- (instancetype)initWithUTF32String: (const OFChar32 *)string length: (size_t)length; /** * @brief Initializes an already allocated OFString with a UTF-32 string, * assuming the specified byte order if no byte order mark is found. @@ -722,12 +737,12 @@ * * @param string The UTF-32 string * @param byteOrder The byte order to assume if there is no byte order mark * @return An initialized OFString */ -- (instancetype)initWithUTF32String: (const of_char32_t *)string - byteOrder: (of_byte_order_t)byteOrder; +- (instancetype)initWithUTF32String: (const OFChar32 *)string + byteOrder: (OFByteOrder)byteOrder; /** * @brief Initializes an already allocated OFString with a UTF-32 string with * the specified length, assuming the specified byte order if no byte * order mark is found. @@ -735,20 +750,20 @@ * @param string The UTF-32 string * @param length The length of the UTF-32 string * @param byteOrder The byte order to assume if there is no byte order mark * @return An initialized OFString */ -- (instancetype)initWithUTF32String: (const of_char32_t *)string +- (instancetype)initWithUTF32String: (const OFChar32 *)string length: (size_t)length - byteOrder: (of_byte_order_t)byteOrder; + byteOrder: (OFByteOrder)byteOrder; /** * @brief Initializes an already allocated OFString with a format string. * * See printf for the format syntax. As an addition, `%@` is available as - * format specifier for objects, `%C` for `of_unichar_t` and `%S` for - * `const of_unichar_t *`. + * format specifier for objects, `%C` for `OFUnichar` and `%S` for + * `const OFUnichar *`. * * @param format A string used as format to initialize the OFString * @return An initialized OFString */ - (instancetype)initWithFormat: (OFConstantString *)format, ...; @@ -755,12 +770,12 @@ /** * @brief Initializes an already allocated OFString with a format string. * * See printf for the format syntax. As an addition, `%@` is available as - * format specifier for objects, `%C` for `of_unichar_t` and `%S` for - * `const of_unichar_t *`. + * format specifier for objects, `%C` for `OFUnichar` and `%S` for + * `const OFUnichar *`. * * @param format A string used as format to initialize the OFString * @param arguments The arguments used in the format string * @return An initialized OFString */ @@ -784,11 +799,11 @@ * @param path The path to the file * @param encoding The encoding of the file * @return An initialized OFString */ - (instancetype)initWithContentsOfFile: (OFString *)path - encoding: (of_string_encoding_t)encoding; + encoding: (OFStringEncoding)encoding; # endif /** * @brief Initializes an already allocated OFString with the contents of the * specified URL. @@ -811,11 +826,11 @@ * @param URL The URL to the contents for the string * @param encoding The encoding to assume * @return An initialized OFString */ - (instancetype)initWithContentsOfURL: (OFURL *)URL - encoding: (of_string_encoding_t)encoding; + encoding: (OFStringEncoding)encoding; /** * @brief Writes the OFString into the specified C string with the specified * encoding. * @@ -826,11 +841,11 @@ * @return The number of bytes written into the C string, without the * terminating zero */ - (size_t)getCString: (char *)cString maxLength: (size_t)maxLength - encoding: (of_string_encoding_t)encoding; + encoding: (OFStringEncoding)encoding; /** * @brief Writes the OFString into the specified C string with the specified * encoding, replacing characters that cannot be represented in the * specified encoding with a question mark. @@ -842,11 +857,11 @@ * @return The number of bytes written into the C string, without the * terminating zero */ - (size_t)getLossyCString: (char *)cString maxLength: (size_t)maxLength - encoding: (of_string_encoding_t)encoding; + encoding: (OFStringEncoding)encoding; /** * @brief Returns the OFString as a C string in the specified encoding. * * The result is valid until the autorelease pool is released. If you want to @@ -854,11 +869,11 @@ * copy it. * * @param encoding The encoding for the C string * @return The OFString as a C string in the specified encoding */ -- (const char *)cStringWithEncoding: (of_string_encoding_t)encoding +- (const char *)cStringWithEncoding: (OFStringEncoding)encoding OF_RETURNS_INNER_POINTER; /** * @brief Returns the OFString as a C string in the specified encoding, * replacing characters that cannot be represented in the specified @@ -869,135 +884,120 @@ * copy it. * * @param encoding The encoding for the C string * @return The OFString as a C string in the specified encoding */ -- (const char *)lossyCStringWithEncoding: (of_string_encoding_t)encoding +- (const char *)lossyCStringWithEncoding: (OFStringEncoding)encoding OF_RETURNS_INNER_POINTER; /** * @brief Returns the number of bytes the string needs in the specified * encoding. * * @param encoding The encoding for the string * @return The number of bytes the string needs in the specified encoding. */ -- (size_t)cStringLengthWithEncoding: (of_string_encoding_t)encoding; +- (size_t)cStringLengthWithEncoding: (OFStringEncoding)encoding; /** * @brief Compares the string to another string. * * @param string The string to compare the string to * @return The result of the comparison */ -- (of_comparison_result_t)compare: (OFString *)string; +- (OFComparisonResult)compare: (OFString *)string; /** * @brief Compares the string to another string without caring about the case. * * @param string The string to compare the string to * @return The result of the comparison */ -- (of_comparison_result_t)caseInsensitiveCompare: (OFString *)string; +- (OFComparisonResult)caseInsensitiveCompare: (OFString *)string; /** * @brief Returns the Unicode character at the specified index. * * @param index The index of the Unicode character to return * @return The Unicode character at the specified index */ -- (of_unichar_t)characterAtIndex: (size_t)index; +- (OFUnichar)characterAtIndex: (size_t)index; /** * @brief Copies the Unicode characters in the specified range to the specified * buffer. * * @param buffer The buffer to store the Unicode characters * @param range The range of the Unicode characters to copy */ -- (void)getCharacters: (of_unichar_t *)buffer inRange: (of_range_t)range; +- (void)getCharacters: (OFUnichar *)buffer inRange: (OFRange)range; /** * @brief Returns the range of the first occurrence of the string. * * @param string The string to search * @return The range of the first occurrence of the string or a range with - * `OF_NOT_FOUND` as start position if it was not found + * `OFNotFound` as start position if it was not found */ -- (of_range_t)rangeOfString: (OFString *)string; +- (OFRange)rangeOfString: (OFString *)string; /** * @brief Returns the range of the string. * * @param string The string to search - * @param options Options modifying search behavior.@n - * Possible values are: - * Value | Description - * -----------------------------|------------------------------- - * `OF_STRING_SEARCH_BACKWARDS` | Search backwards in the string + * @param options Options modifying search behavior * @return The range of the first occurrence of the string or a range with - * `OF_NOT_FOUND` as start position if it was not found + * `OFNotFound` as start position if it was not found */ -- (of_range_t)rangeOfString: (OFString *)string options: (int)options; +- (OFRange)rangeOfString: (OFString *)string + options: (OFStringSearchOptions)options; /** * @brief Returns the range of the string in the specified range. * * @param string The string to search - * @param options Options modifying search behaviour.@n - * Possible values are: - * Value | Description - * -----------------------------|------------------------------- - * `OF_STRING_SEARCH_BACKWARDS` | Search backwards in the string + * @param options Options modifying search behaviour * @param range The range in which to search * @return The range of the first occurrence of the string or a range with - * `OF_NOT_FOUND` as start position if it was not found + * `OFNotFound` as start position if it was not found */ -- (of_range_t)rangeOfString: (OFString *)string - options: (int)options - range: (of_range_t)range; +- (OFRange)rangeOfString: (OFString *)string + options: (OFStringSearchOptions)options + range: (OFRange)range; /** * @brief Returns the index of the first character from the set. * * @param characterSet The set of characters to search for * @return The index of the first occurrence of a character from the set or - * `OF_NOT_FOUND` if it was not found + * `OFNotFound` if it was not found */ - (size_t)indexOfCharacterFromSet: (OFCharacterSet *)characterSet; /** * @brief Returns the index of the first character from the set. * * @param characterSet The set of characters to search for - * @param options Options modifying search behaviour.@n - * Possible values are: - * Value | Description - * -----------------------------|------------------------------- - * `OF_STRING_SEARCH_BACKWARDS` | Search backwards in the string + * @param options Options modifying search behaviour * @return The index of the first occurrence of a character from the set or - * `OF_NOT_FOUND` if it was not found + * `OFNotFound` if it was not found */ - (size_t)indexOfCharacterFromSet: (OFCharacterSet *)characterSet - options: (int)options; + options: (OFStringSearchOptions)options; /** * @brief Returns the index of the first character from the set. * * @param characterSet The set of characters to search for - * @param options Options modifying search behaviour.@n - * Possible values are: - * Value | Description - * -----------------------------|------------------------------- - * `OF_STRING_SEARCH_BACKWARDS` | Search backwards in the string + * @param options Options modifying search behaviour * @param range The range in which to search * @return The index of the first occurrence of a character from the set or - * `OF_NOT_FOUND` if it was not found + * `OFNotFound` if it was not found */ - (size_t)indexOfCharacterFromSet: (OFCharacterSet *)characterSet - options: (int)options - range: (of_range_t)range; + options: (OFStringSearchOptions)options + range: (OFRange)range; /** * @brief Returns whether the string contains the specified string. * * @param string The string to search @@ -1025,11 +1025,11 @@ * @brief Creates a substring with the specified range. * * @param range The range of the substring * @return The substring as a new autoreleased OFString */ -- (OFString *)substringWithRange: (of_range_t)range; +- (OFString *)substringWithRange: (OFRange)range; /** * @brief The value of the string in the specified base as a `long long`. * * Leading and trailing whitespaces are ignored. @@ -1126,11 +1126,11 @@ * @return A new string with the occurrences of the specified string replaced */ - (OFString *)stringByReplacingOccurrencesOfString: (OFString *)string withString: (OFString *)replacement options: (int)options - range: (of_range_t)range; + range: (OFRange)range; /** * @brief Checks whether the string has the specified prefix. * * @param prefix The prefix to check for @@ -1159,20 +1159,16 @@ /** * @brief Separates the string into an array of strings, split by the specified * delimiter. * * @param delimiter The delimiter for separating - * @param options Options according to which the string should be separated.@n - * Possible values are: - * Value | Description - * -----------------------|---------------------- - * `OF_STRING_SKIP_EMPTY` | Skip empty components + * @param options Options according to which the string should be separated * @return An autoreleased OFArray with the separated string */ - (OFArray OF_GENERIC(OFString *) *) componentsSeparatedByString: (OFString *)delimiter - options: (int)options; + options: (OFStringSeparationOptions)options; /** * @brief Separates the string into an array of strings, split by characters in * the specified set. * @@ -1185,20 +1181,16 @@ /** * @brief Separates the string into an array of strings, split by characters in * the specified set. * * @param characterSet The character set for separating - * @param options Options according to which the string should be separated.@n - * Possible values are: - * Value | Description - * -----------------------|---------------------- - * `OF_STRING_SKIP_EMPTY` | Skip empty components + * @param options Options according to which the string should be separated * @return An autoreleased OFArray with the separated string */ - (OFArray OF_GENERIC(OFString *) *) componentsSeparatedByCharactersInSet: (OFCharacterSet *)characterSet - options: (int)options; + options: (OFStringSeparationOptions)options; /** * @brief Returns the string in UTF-16 encoding with the specified byte order. * * The result is valid until the autorelease pool is released. If you want to @@ -1206,11 +1198,11 @@ * copy it. * * @param byteOrder The byte order for the UTF-16 encoding * @return The string in UTF-16 encoding with the specified byte order */ -- (const of_char16_t *)UTF16StringWithByteOrder: (of_byte_order_t)byteOrder +- (const OFChar16 *)UTF16StringWithByteOrder: (OFByteOrder)byteOrder OF_RETURNS_INNER_POINTER; /** * @brief Returns the string in UTF-32 encoding with the specified byte order. * @@ -1219,20 +1211,20 @@ * copy it. * * @param byteOrder The byte order for the UTF-32 encoding * @return The string in UTF-32 encoding with the specified byte order */ -- (const of_char32_t *)UTF32StringWithByteOrder: (of_byte_order_t)byteOrder +- (const OFChar32 *)UTF32StringWithByteOrder: (OFByteOrder)byteOrder OF_RETURNS_INNER_POINTER; /** * @brief Returns the string as OFData with the specified encoding. * * @param encoding The encoding to use for the returned OFData * @return The string as OFData with the specified encoding */ -- (OFData *)dataWithEncoding: (of_string_encoding_t)encoding; +- (OFData *)dataWithEncoding: (OFStringEncoding)encoding; # ifdef OF_HAVE_FILES /** * @brief Writes the string into the specified file using UTF-8 encoding. * @@ -1245,11 +1237,11 @@ * encoding. * * @param path The path of the file to write to * @param encoding The encoding to use to write the string into the file */ -- (void)writeToFile: (OFString *)path encoding: (of_string_encoding_t)encoding; +- (void)writeToFile: (OFString *)path encoding: (OFStringEncoding)encoding; # endif /** * @brief Writes the string to the specified URL using UTF-8 encoding. * @@ -1261,32 +1253,51 @@ * @brief Writes the string to the specified URL using the specified encoding. * * @param URL The URL to write to * @param encoding The encoding to use to write the string to the URL */ -- (void)writeToURL: (OFURL *)URL encoding: (of_string_encoding_t)encoding; +- (void)writeToURL: (OFURL *)URL encoding: (OFStringEncoding)encoding; # ifdef OF_HAVE_BLOCKS /** * Enumerates all lines in the receiver using the specified block. * * @brief block The block to call for each line */ -- (void)enumerateLinesUsingBlock: (of_string_line_enumeration_block_t)block; +- (void)enumerateLinesUsingBlock: (OFStringLineEnumerationBlock)block; # endif @end #endif #ifdef __cplusplus extern "C" { #endif -extern of_string_encoding_t of_string_parse_encoding(OFString *); -extern OFString *_Nullable of_string_name_of_encoding(of_string_encoding_t); -extern size_t of_string_utf8_encode(of_unichar_t, char *); -extern ssize_t of_string_utf8_decode(const char *, size_t, of_unichar_t *); -extern size_t of_string_utf16_length(const of_char16_t *); -extern size_t of_string_utf32_length(const of_char32_t *); +/** + * @brief Parses the specified string encoding name and returns the + * OFStringEncoding for it. + * + * Throws @ref OFInvalidArgumentException if the specified name is not a valid + * encoding name. + * + * @param name The name to parse as a string encoding + * @return The OFStringEncoding for the specified name + */ +extern OFStringEncoding OFStringEncodingParseName(OFString *name); + +/** + * @brief Returns the name of the specified OFStringEncoding. + * + * @param encoding The encoding for which to return the name + * @return The name of the specified OFStringEncoding + */ +extern OFString *_Nullable OFStringEncodingName(OFStringEncoding encoding); + +extern char *_Nullable OFStrDup(const char *_Nonnull); +extern size_t OFUTF8StringEncode(OFUnichar, char *); +extern ssize_t OFUTF8StringDecode(const char *, size_t, OFUnichar *); +extern size_t OFUTF16StringLength(const OFChar16 *); +extern size_t OFUTF32StringLength(const OFChar32 *); #ifdef __cplusplus } #endif OF_ASSUME_NONNULL_END Index: src/OFString.m ================================================================== --- src/OFString.m +++ src/OFString.m @@ -28,10 +28,11 @@ #ifdef HAVE_XLOCALE_H # include #endif #import "OFString.h" +#import "OFASPrintF.h" #import "OFArray.h" #import "OFCharacterSet.h" #import "OFData.h" #import "OFDictionary.h" #ifdef OF_HAVE_FILES @@ -57,11 +58,10 @@ #import "OFOutOfRangeException.h" #import "OFRetrieveItemAttributesFailedException.h" #import "OFTruncatedDataException.h" #import "OFUnsupportedProtocolException.h" -#import "of_asprintf.h" #import "unicode.h" /* * It seems strtod is buggy on Win32. * However, the MinGW version __strtod seems to be ok. @@ -87,42 +87,43 @@ #endif @interface OFString () - (size_t)of_getCString: (char *)cString maxLength: (size_t)maxLength - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding lossy: (bool)lossy OF_DIRECT; -- (const char *)of_cStringWithEncoding: (of_string_encoding_t)encoding +- (const char *)of_cStringWithEncoding: (OFStringEncoding)encoding lossy: (bool)lossy OF_DIRECT; -- (OFString *)of_JSONRepresentationWithOptions: (int)options - depth: (size_t)depth; +- (OFString *) + of_JSONRepresentationWithOptions: (OFJSONRepresentationOptions)options + depth: (size_t)depth; @end @interface OFStringPlaceholder: OFString @end -extern bool of_unicode_to_iso_8859_2(const of_unichar_t *, unsigned char *, - size_t, bool); -extern bool of_unicode_to_iso_8859_3(const of_unichar_t *, unsigned char *, - size_t, bool); -extern bool of_unicode_to_iso_8859_15(const of_unichar_t *, unsigned char *, - size_t, bool); -extern bool of_unicode_to_windows_1251(const of_unichar_t *, unsigned char *, - size_t, bool); -extern bool of_unicode_to_windows_1252(const of_unichar_t *, unsigned char *, - size_t, bool); -extern bool of_unicode_to_codepage_437(const of_unichar_t *, unsigned char *, - size_t, bool); -extern bool of_unicode_to_codepage_850(const of_unichar_t *, unsigned char *, - size_t, bool); -extern bool of_unicode_to_codepage_858(const of_unichar_t *, unsigned char *, - size_t, bool); -extern bool of_unicode_to_mac_roman(const of_unichar_t *, unsigned char *, - size_t, bool); -extern bool of_unicode_to_koi8_r(const of_unichar_t *, unsigned char *, - size_t, bool); -extern bool of_unicode_to_koi8_u(const of_unichar_t *, unsigned char *, +extern bool OFUnicodeToISO8859_2(const OFUnichar *, unsigned char *, + size_t, bool); +extern bool OFUnicodeToISO8859_3(const OFUnichar *, unsigned char *, + size_t, bool); +extern bool OFUnicodeToISO8859_15(const OFUnichar *, unsigned char *, + size_t, bool); +extern bool OFUnicodeToWindows1251(const OFUnichar *, unsigned char *, + size_t, bool); +extern bool OFUnicodeToWindows1252(const OFUnichar *, unsigned char *, + size_t, bool); +extern bool OFUnicodeToCodepage437(const OFUnichar *, unsigned char *, + size_t, bool); +extern bool OFUnicodeToCodepage850(const OFUnichar *, unsigned char *, + size_t, bool); +extern bool OFUnicodeToCodepage858(const OFUnichar *, unsigned char *, + size_t, bool); +extern bool OFUnicodeToMacRoman(const OFUnichar *, unsigned char *, + size_t, bool); +extern bool OFUnicodeToKOI8R(const OFUnichar *, unsigned char *, + size_t, bool); +extern bool OFUnicodeToKOI8U(const OFUnichar *, unsigned char *, size_t, bool); /* References for static linking */ void _references_to_categories_of_OFString(void) @@ -143,106 +144,106 @@ _reference_to_OFConstantString(void) { [OFConstantString class]; } -of_string_encoding_t -of_string_parse_encoding(OFString *string) +OFStringEncoding +OFStringEncodingParseName(OFString *string) { void *pool = objc_autoreleasePoolPush(); - of_string_encoding_t encoding; + OFStringEncoding encoding; string = string.lowercaseString; if ([string isEqual: @"utf8"] || [string isEqual: @"utf-8"]) - encoding = OF_STRING_ENCODING_UTF_8; + encoding = OFStringEncodingUTF8; else if ([string isEqual: @"ascii"] || [string isEqual: @"us-ascii"]) - encoding = OF_STRING_ENCODING_ASCII; + encoding = OFStringEncodingASCII; else if ([string isEqual: @"iso-8859-1"] || [string isEqual: @"iso_8859-1"]) - encoding = OF_STRING_ENCODING_ISO_8859_1; + encoding = OFStringEncodingISO8859_1; else if ([string isEqual: @"iso-8859-2"] || [string isEqual: @"iso_8859-2"]) - encoding = OF_STRING_ENCODING_ISO_8859_2; + encoding = OFStringEncodingISO8859_2; else if ([string isEqual: @"iso-8859-3"] || [string isEqual: @"iso_8859-3"]) - encoding = OF_STRING_ENCODING_ISO_8859_3; + encoding = OFStringEncodingISO8859_3; else if ([string isEqual: @"iso-8859-15"] || [string isEqual: @"iso_8859-15"]) - encoding = OF_STRING_ENCODING_ISO_8859_15; + encoding = OFStringEncodingISO8859_15; else if ([string isEqual: @"windows-1251"] || [string isEqual: @"cp1251"] || [string isEqual: @"cp-1251"] || [string isEqual: @"1251"]) - encoding = OF_STRING_ENCODING_WINDOWS_1251; + encoding = OFStringEncodingWindows1251; else if ([string isEqual: @"windows-1252"] || [string isEqual: @"cp1252"] || [string isEqual: @"cp-1252"] || [string isEqual: @"1252"]) - encoding = OF_STRING_ENCODING_WINDOWS_1252; + encoding = OFStringEncodingWindows1252; else if ([string isEqual: @"cp437"] || [string isEqual: @"cp-437"] || [string isEqual: @"ibm437"] || [string isEqual: @"437"]) - encoding = OF_STRING_ENCODING_CODEPAGE_437; + encoding = OFStringEncodingCodepage437; else if ([string isEqual: @"cp850"] || [string isEqual: @"cp-850"] || [string isEqual: @"ibm850"] || [string isEqual: @"850"]) - encoding = OF_STRING_ENCODING_CODEPAGE_850; + encoding = OFStringEncodingCodepage850; else if ([string isEqual: @"cp858"] || [string isEqual: @"cp-858"] || [string isEqual: @"ibm858"] || [string isEqual: @"858"]) - encoding = OF_STRING_ENCODING_CODEPAGE_858; + encoding = OFStringEncodingCodepage858; else if ([string isEqual: @"macintosh"] || [string isEqual: @"mac"]) - encoding = OF_STRING_ENCODING_MAC_ROMAN; + encoding = OFStringEncodingMacRoman; else if ([string isEqual: @"koi8-r"]) - encoding = OF_STRING_ENCODING_KOI8_R; + encoding = OFStringEncodingKOI8R; else if ([string isEqual: @"koi8-u"]) - encoding = OF_STRING_ENCODING_KOI8_U; + encoding = OFStringEncodingKOI8U; else @throw [OFInvalidArgumentException exception]; objc_autoreleasePoolPop(pool); return encoding; } OFString * -of_string_name_of_encoding(of_string_encoding_t encoding) +OFStringEncodingName(OFStringEncoding encoding) { switch (encoding) { - case OF_STRING_ENCODING_UTF_8: + case OFStringEncodingUTF8: return @"UTF-8"; - case OF_STRING_ENCODING_ASCII: + case OFStringEncodingASCII: return @"ASCII"; - case OF_STRING_ENCODING_ISO_8859_1: + case OFStringEncodingISO8859_1: return @"ISO 8859-1"; - case OF_STRING_ENCODING_ISO_8859_2: + case OFStringEncodingISO8859_2: return @"ISO 8859-2"; - case OF_STRING_ENCODING_ISO_8859_3: + case OFStringEncodingISO8859_3: return @"ISO 8859-3"; - case OF_STRING_ENCODING_ISO_8859_15: + case OFStringEncodingISO8859_15: return @"ISO 8859-15"; - case OF_STRING_ENCODING_WINDOWS_1251: + case OFStringEncodingWindows1251: return @"Windows-1251"; - case OF_STRING_ENCODING_WINDOWS_1252: + case OFStringEncodingWindows1252: return @"Windows-1252"; - case OF_STRING_ENCODING_CODEPAGE_437: + case OFStringEncodingCodepage437: return @"Codepage 437"; - case OF_STRING_ENCODING_CODEPAGE_850: + case OFStringEncodingCodepage850: return @"Codepage 850"; - case OF_STRING_ENCODING_CODEPAGE_858: + case OFStringEncodingCodepage858: return @"Codepage 858"; - case OF_STRING_ENCODING_MAC_ROMAN: + case OFStringEncodingMacRoman: return @"Mac Roman"; - case OF_STRING_ENCODING_KOI8_R: + case OFStringEncodingKOI8R: return @"KOI8-R"; - case OF_STRING_ENCODING_KOI8_U: + case OFStringEncodingKOI8U: return @"KOI8-U"; - case OF_STRING_ENCODING_AUTODETECT: + case OFStringEncodingAutodetect: return @"autodetect"; } return nil; } size_t -of_string_utf8_encode(of_unichar_t character, char *buffer) +OFUTF8StringEncode(OFUnichar character, char *buffer) { if (character < 0x80) { buffer[0] = character; return 1; } else if (character < 0x800) { @@ -264,11 +265,11 @@ return 0; } ssize_t -of_string_utf8_decode(const char *buffer_, size_t length, of_unichar_t *ret) +OFUTF8StringDecode(const char *buffer_, size_t length, OFUnichar *ret) { const unsigned char *buffer = (const unsigned char *)buffer_; if (!(*buffer & 0x80)) { *ret = buffer[0]; @@ -314,11 +315,11 @@ return 0; } size_t -of_string_utf16_length(const of_char16_t *string) +OFUTF16StringLength(const OFChar16 *string) { size_t length = 0; while (*string++ != 0) length++; @@ -325,31 +326,41 @@ return length; } size_t -of_string_utf32_length(const of_char32_t *string) +OFUTF32StringLength(const OFChar32 *string) { size_t length = 0; while (*string++ != 0) length++; return length; } + +char * +OFStrDup(const char *string) +{ + size_t length = strlen(string); + char *copy = (char *)OFAllocMemory(1, length + 1); + memcpy(copy, string, length + 1); + + return copy; +} #ifdef OF_HAVE_UNICODE_TABLES static OFString * decomposedString(OFString *self, const char *const *const *table, size_t size) { OFMutableString *ret = [OFMutableString string]; void *pool = objc_autoreleasePoolPush(); - const of_unichar_t *characters = self.characters; + const OFUnichar *characters = self.characters; size_t length = self.length; for (size_t i = 0; i < length; i++) { - of_unichar_t c = characters[i]; + OFUnichar c = characters[i]; const char *const *page; if (c >= size) { [ret appendCharacters: &c length: 1]; continue; @@ -379,11 +390,11 @@ OFUTF8String *string; size_t length; void *storage; length = strlen(UTF8String); - string = of_alloc_object([OFUTF8String class], length + 1, 1, &storage); + string = OFAllocObject([OFUTF8String class], length + 1, 1, &storage); return (id)[string of_initWithUTF8String: UTF8String length: length storage: storage]; } @@ -392,11 +403,11 @@ length: (size_t)UTF8StringLength { OFUTF8String *string; void *storage; - string = of_alloc_object([OFUTF8String class], UTF8StringLength + 1, 1, + string = OFAllocObject([OFUTF8String class], UTF8StringLength + 1, 1, &storage); return (id)[string of_initWithUTF8String: UTF8String length: UTF8StringLength storage: storage]; @@ -419,19 +430,19 @@ length: UTF8StringLength freeWhenDone: freeWhenDone]; } - (instancetype)initWithCString: (const char *)cString - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { - if (encoding == OF_STRING_ENCODING_UTF_8) { + if (encoding == OFStringEncodingUTF8) { OFUTF8String *string; size_t length; void *storage; length = strlen(cString); - string = of_alloc_object([OFUTF8String class], length + 1, 1, + string = OFAllocObject([OFUTF8String class], length + 1, 1, &storage); return (id)[string of_initWithUTF8String: cString length: length storage: storage]; @@ -440,19 +451,19 @@ return (id)[[OFUTF8String alloc] initWithCString: cString encoding: encoding]; } - (instancetype)initWithCString: (const char *)cString - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding length: (size_t)cStringLength { - if (encoding == OF_STRING_ENCODING_UTF_8) { + if (encoding == OFStringEncodingUTF8) { OFUTF8String *string; void *storage; - string = of_alloc_object([OFUTF8String class], - cStringLength + 1, 1, &storage); + string = OFAllocObject([OFUTF8String class], cStringLength + 1, + 1, &storage); return (id)[string of_initWithUTF8String: cString length: cStringLength storage: storage]; } @@ -461,11 +472,11 @@ encoding: encoding length: cStringLength]; } - (instancetype)initWithData: (OFData *)data - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { return (id)[[OFUTF8String alloc] initWithData: data encoding: encoding]; } @@ -472,67 +483,67 @@ - (instancetype)initWithString: (OFString *)string { return (id)[[OFUTF8String alloc] initWithString: string]; } -- (instancetype)initWithCharacters: (const of_unichar_t *)string +- (instancetype)initWithCharacters: (const OFUnichar *)string length: (size_t)length { return (id)[[OFUTF8String alloc] initWithCharacters: string length: length]; } -- (instancetype)initWithUTF16String: (const of_char16_t *)string +- (instancetype)initWithUTF16String: (const OFChar16 *)string { return (id)[[OFUTF8String alloc] initWithUTF16String: string]; } -- (instancetype)initWithUTF16String: (const of_char16_t *)string +- (instancetype)initWithUTF16String: (const OFChar16 *)string length: (size_t)length { return (id)[[OFUTF8String alloc] initWithUTF16String: string length: length]; } -- (instancetype)initWithUTF16String: (const of_char16_t *)string - byteOrder: (of_byte_order_t)byteOrder +- (instancetype)initWithUTF16String: (const OFChar16 *)string + byteOrder: (OFByteOrder)byteOrder { return (id)[[OFUTF8String alloc] initWithUTF16String: string byteOrder: byteOrder]; } -- (instancetype)initWithUTF16String: (const of_char16_t *)string +- (instancetype)initWithUTF16String: (const OFChar16 *)string length: (size_t)length - byteOrder: (of_byte_order_t)byteOrder + byteOrder: (OFByteOrder)byteOrder { return (id)[[OFUTF8String alloc] initWithUTF16String: string length: length byteOrder: byteOrder]; } -- (instancetype)initWithUTF32String: (const of_char32_t *)string +- (instancetype)initWithUTF32String: (const OFChar32 *)string { return (id)[[OFUTF8String alloc] initWithUTF32String: string]; } -- (instancetype)initWithUTF32String: (const of_char32_t *)string +- (instancetype)initWithUTF32String: (const OFChar32 *)string length: (size_t)length { return (id)[[OFUTF8String alloc] initWithUTF32String: string length: length]; } -- (instancetype)initWithUTF32String: (const of_char32_t *)string - byteOrder: (of_byte_order_t)byteOrder +- (instancetype)initWithUTF32String: (const OFChar32 *)string + byteOrder: (OFByteOrder)byteOrder { return (id)[[OFUTF8String alloc] initWithUTF32String: string byteOrder: byteOrder]; } -- (instancetype)initWithUTF32String: (const of_char32_t *)string +- (instancetype)initWithUTF32String: (const OFChar32 *)string length: (size_t)length - byteOrder: (of_byte_order_t)byteOrder + byteOrder: (OFByteOrder)byteOrder { return (id)[[OFUTF8String alloc] initWithUTF32String: string length: length byteOrder: byteOrder]; } @@ -562,11 +573,11 @@ { return (id)[[OFUTF8String alloc] initWithContentsOfFile: path]; } - (instancetype)initWithContentsOfFile: (OFString *)path - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { return (id)[[OFUTF8String alloc] initWithContentsOfFile: path encoding: encoding]; } #endif @@ -575,11 +586,11 @@ { return (id)[[OFUTF8String alloc] initWithContentsOfURL: URL]; } - (instancetype)initWithContentsOfURL: (OFURL *)URL - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { return (id)[[OFUTF8String alloc] initWithContentsOfURL: URL encoding: encoding]; } @@ -666,27 +677,27 @@ length: UTF8StringLength freeWhenDone: freeWhenDone] autorelease]; } + (instancetype)stringWithCString: (const char *)cString - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { return [[[self alloc] initWithCString: cString encoding: encoding] autorelease]; } + (instancetype)stringWithCString: (const char *)cString - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding length: (size_t)cStringLength { return [[[self alloc] initWithCString: cString encoding: encoding length: cStringLength] autorelease]; } + (instancetype)stringWithData: (OFData *)data - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { return [[[self alloc] initWithData: data encoding: encoding] autorelease]; } @@ -693,67 +704,67 @@ + (instancetype)stringWithString: (OFString *)string { return [[[self alloc] initWithString: string] autorelease]; } -+ (instancetype)stringWithCharacters: (const of_unichar_t *)string ++ (instancetype)stringWithCharacters: (const OFUnichar *)string length: (size_t)length { return [[[self alloc] initWithCharacters: string length: length] autorelease]; } -+ (instancetype)stringWithUTF16String: (const of_char16_t *)string ++ (instancetype)stringWithUTF16String: (const OFChar16 *)string { return [[[self alloc] initWithUTF16String: string] autorelease]; } -+ (instancetype)stringWithUTF16String: (const of_char16_t *)string ++ (instancetype)stringWithUTF16String: (const OFChar16 *)string length: (size_t)length { return [[[self alloc] initWithUTF16String: string length: length] autorelease]; } -+ (instancetype)stringWithUTF16String: (const of_char16_t *)string - byteOrder: (of_byte_order_t)byteOrder ++ (instancetype)stringWithUTF16String: (const OFChar16 *)string + byteOrder: (OFByteOrder)byteOrder { return [[[self alloc] initWithUTF16String: string byteOrder: byteOrder] autorelease]; } -+ (instancetype)stringWithUTF16String: (const of_char16_t *)string ++ (instancetype)stringWithUTF16String: (const OFChar16 *)string length: (size_t)length - byteOrder: (of_byte_order_t)byteOrder + byteOrder: (OFByteOrder)byteOrder { return [[[self alloc] initWithUTF16String: string length: length byteOrder: byteOrder] autorelease]; } -+ (instancetype)stringWithUTF32String: (const of_char32_t *)string ++ (instancetype)stringWithUTF32String: (const OFChar32 *)string { return [[[self alloc] initWithUTF32String: string] autorelease]; } -+ (instancetype)stringWithUTF32String: (const of_char32_t *)string ++ (instancetype)stringWithUTF32String: (const OFChar32 *)string length: (size_t)length { return [[[self alloc] initWithUTF32String: string length: length] autorelease]; } -+ (instancetype)stringWithUTF32String: (const of_char32_t *)string - byteOrder: (of_byte_order_t)byteOrder ++ (instancetype)stringWithUTF32String: (const OFChar32 *)string + byteOrder: (OFByteOrder)byteOrder { return [[[self alloc] initWithUTF32String: string byteOrder: byteOrder] autorelease]; } -+ (instancetype)stringWithUTF32String: (const of_char32_t *)string ++ (instancetype)stringWithUTF32String: (const OFChar32 *)string length: (size_t)length - byteOrder: (of_byte_order_t)byteOrder + byteOrder: (OFByteOrder)byteOrder { return [[[self alloc] initWithUTF32String: string length: length byteOrder: byteOrder] autorelease]; } @@ -776,11 +787,11 @@ { return [[[self alloc] initWithContentsOfFile: path] autorelease]; } + (instancetype)stringWithContentsOfFile: (OFString *)path - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { return [[[self alloc] initWithContentsOfFile: path encoding: encoding] autorelease]; } #endif @@ -789,11 +800,11 @@ { return [[[self alloc] initWithContentsOfURL: URL] autorelease]; } + (instancetype)stringWithContentsOfURL: (OFURL *)URL - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { return [[[self alloc] initWithContentsOfURL: URL encoding: encoding] autorelease]; } @@ -814,29 +825,29 @@ } - (instancetype)initWithUTF8String: (const char *)UTF8String { return [self initWithCString: UTF8String - encoding: OF_STRING_ENCODING_UTF_8 + encoding: OFStringEncodingUTF8 length: strlen(UTF8String)]; } - (instancetype)initWithUTF8String: (const char *)UTF8String length: (size_t)UTF8StringLength { return [self initWithCString: UTF8String - encoding: OF_STRING_ENCODING_UTF_8 + encoding: OFStringEncodingUTF8 length: UTF8StringLength]; } - (instancetype)initWithUTF8StringNoCopy: (char *)UTF8String freeWhenDone: (bool)freeWhenDone { id ret = [self initWithUTF8String: UTF8String]; if (freeWhenDone) - free(UTF8String); + OFFreeMemory(UTF8String); return ret; } - (instancetype)initWithUTF8StringNoCopy: (char *)UTF8String @@ -844,32 +855,32 @@ freeWhenDone: (bool)freeWhenDone { id ret = [self initWithUTF8String: UTF8String length: UTF8StringLength]; if (freeWhenDone) - free(UTF8String); + OFFreeMemory(UTF8String); return ret; } - (instancetype)initWithCString: (const char *)cString - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { return [self initWithCString: cString encoding: encoding length: strlen(cString)]; } - (instancetype)initWithCString: (const char *)cString - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding length: (size_t)cStringLength { OF_INVALID_INIT_METHOD } - (instancetype)initWithData: (OFData *)data - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { @try { if (data.itemSize != 1) @throw [OFInvalidArgumentException exception]; } @catch (id e) { @@ -887,72 +898,72 @@ - (instancetype)initWithString: (OFString *)string { OF_INVALID_INIT_METHOD } -- (instancetype)initWithCharacters: (const of_unichar_t *)string - length: (size_t)length -{ - OF_INVALID_INIT_METHOD -} - -- (instancetype)initWithUTF16String: (const of_char16_t *)string -{ - return [self initWithUTF16String: string - length: of_string_utf16_length(string) - byteOrder: OF_BYTE_ORDER_NATIVE]; -} - -- (instancetype)initWithUTF16String: (const of_char16_t *)string - length: (size_t)length -{ - return [self initWithUTF16String: string - length: length - byteOrder: OF_BYTE_ORDER_NATIVE]; -} - -- (instancetype)initWithUTF16String: (const of_char16_t *)string - byteOrder: (of_byte_order_t)byteOrder -{ - return [self initWithUTF16String: string - length: of_string_utf16_length(string) - byteOrder: byteOrder]; -} - -- (instancetype)initWithUTF16String: (const of_char16_t *)string - length: (size_t)length - byteOrder: (of_byte_order_t)byteOrder -{ - OF_INVALID_INIT_METHOD -} - -- (instancetype)initWithUTF32String: (const of_char32_t *)string -{ - return [self initWithUTF32String: string - length: of_string_utf32_length(string) - byteOrder: OF_BYTE_ORDER_NATIVE]; -} - -- (instancetype)initWithUTF32String: (const of_char32_t *)string - length: (size_t)length -{ - return [self initWithUTF32String: string - length: length - byteOrder: OF_BYTE_ORDER_NATIVE]; -} - -- (instancetype)initWithUTF32String: (const of_char32_t *)string - byteOrder: (of_byte_order_t)byteOrder -{ - return [self initWithUTF32String: string - length: of_string_utf32_length(string) - byteOrder: byteOrder]; -} - -- (instancetype)initWithUTF32String: (const of_char32_t *)string - length: (size_t)length - byteOrder: (of_byte_order_t)byteOrder +- (instancetype)initWithCharacters: (const OFUnichar *)string + length: (size_t)length +{ + OF_INVALID_INIT_METHOD +} + +- (instancetype)initWithUTF16String: (const OFChar16 *)string +{ + return [self initWithUTF16String: string + length: OFUTF16StringLength(string) + byteOrder: OFByteOrderNative]; +} + +- (instancetype)initWithUTF16String: (const OFChar16 *)string + length: (size_t)length +{ + return [self initWithUTF16String: string + length: length + byteOrder: OFByteOrderNative]; +} + +- (instancetype)initWithUTF16String: (const OFChar16 *)string + byteOrder: (OFByteOrder)byteOrder +{ + return [self initWithUTF16String: string + length: OFUTF16StringLength(string) + byteOrder: byteOrder]; +} + +- (instancetype)initWithUTF16String: (const OFChar16 *)string + length: (size_t)length + byteOrder: (OFByteOrder)byteOrder +{ + OF_INVALID_INIT_METHOD +} + +- (instancetype)initWithUTF32String: (const OFChar32 *)string +{ + return [self initWithUTF32String: string + length: OFUTF32StringLength(string) + byteOrder: OFByteOrderNative]; +} + +- (instancetype)initWithUTF32String: (const OFChar32 *)string + length: (size_t)length +{ + return [self initWithUTF32String: string + length: length + byteOrder: OFByteOrderNative]; +} + +- (instancetype)initWithUTF32String: (const OFChar32 *)string + byteOrder: (OFByteOrder)byteOrder +{ + return [self initWithUTF32String: string + length: OFUTF32StringLength(string) + byteOrder: byteOrder]; +} + +- (instancetype)initWithUTF32String: (const OFChar32 *)string + length: (size_t)length + byteOrder: (OFByteOrder)byteOrder { OF_INVALID_INIT_METHOD } - (instancetype)initWithFormat: (OFConstantString *)format, ... @@ -975,15 +986,15 @@ #ifdef OF_HAVE_FILES - (instancetype)initWithContentsOfFile: (OFString *)path { return [self initWithContentsOfFile: path - encoding: OF_STRING_ENCODING_UTF_8]; + encoding: OFStringEncodingUTF8]; } - (instancetype)initWithContentsOfFile: (OFString *)path - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { char *tmp; unsigned long long fileSize; @try { @@ -1012,17 +1023,17 @@ * to use -[initWithUTF8StringNoCopy:length:freeWhenDone:]. */ if (SIZE_MAX - (size_t)fileSize < 1) @throw [OFOutOfRangeException exception]; - tmp = of_alloc((size_t)fileSize + 1, 1); + tmp = OFAllocMemory((size_t)fileSize + 1, 1); @try { file = [[OFFile alloc] initWithPath: path mode: @"r"]; [file readIntoBuffer: tmp exactLength: (size_t)fileSize]; } @catch (id e) { - free(tmp); + OFFreeMemory(tmp); @throw e; } @finally { [file release]; } @@ -1030,26 +1041,26 @@ } @catch (id e) { [self release]; @throw e; } - if (encoding == OF_STRING_ENCODING_UTF_8) { + if (encoding == OFStringEncodingUTF8) { @try { self = [self initWithUTF8StringNoCopy: tmp length: (size_t)fileSize freeWhenDone: true]; } @catch (id e) { - free(tmp); + OFFreeMemory(tmp); @throw e; } } else { @try { self = [self initWithCString: tmp encoding: encoding length: (size_t)fileSize]; } @finally { - free(tmp); + OFFreeMemory(tmp); } } return self; } @@ -1056,15 +1067,15 @@ #endif - (instancetype)initWithContentsOfURL: (OFURL *)URL { return [self initWithContentsOfURL: URL - encoding: OF_STRING_ENCODING_AUTODETECT]; + encoding: OFStringEncodingAutodetect]; } - (instancetype)initWithContentsOfURL: (OFURL *)URL - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { void *pool = objc_autoreleasePoolPush(); OFData *data; @try { @@ -1087,11 +1098,11 @@ { void *pool = objc_autoreleasePoolPush(); OFString *stringValue; @try { - if (![element.namespace isEqual: OF_SERIALIZATION_NS]) + if (![element.namespace isEqual: OFSerializationNS]) @throw [OFInvalidArgumentException exception]; if ([self isKindOfClass: [OFMutableString class]]) { if (![element.name isEqual: @"OFMutableString"]) @throw [OFInvalidArgumentException exception]; @@ -1113,24 +1124,23 @@ return self; } - (size_t)of_getCString: (char *)cString maxLength: (size_t)maxLength - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding lossy: (bool)lossy { - const of_unichar_t *characters = self.characters; + const OFUnichar *characters = self.characters; size_t i, length = self.length; switch (encoding) { - case OF_STRING_ENCODING_UTF_8:; + case OFStringEncodingUTF8:; size_t j = 0; for (i = 0; i < length; i++) { char buffer[4]; - size_t len = of_string_utf8_encode(characters[i], - buffer); + size_t len = OFUTF8StringEncode(characters[i], buffer); /* * Check for one more than the current index, as we * need one for the terminating zero. */ @@ -1157,11 +1167,11 @@ } cString[j] = '\0'; return j; - case OF_STRING_ENCODING_ASCII: + case OFStringEncodingASCII: if (length + 1 > maxLength) @throw [OFOutOfRangeException exception]; for (i = 0; i < length; i++) { if OF_UNLIKELY (characters[i] > 0x80) { @@ -1175,11 +1185,11 @@ } cString[i] = '\0'; return length; - case OF_STRING_ENCODING_ISO_8859_1: + case OFStringEncodingISO8859_1: if (length + 1 > maxLength) @throw [OFOutOfRangeException exception]; for (i = 0; i < length; i++) { if OF_UNLIKELY (characters[i] > 0xFF) { @@ -1194,146 +1204,146 @@ cString[i] = '\0'; return length; #ifdef HAVE_ISO_8859_2 - case OF_STRING_ENCODING_ISO_8859_2: + case OFStringEncodingISO8859_2: if (length + 1 > maxLength) @throw [OFOutOfRangeException exception]; - if (!of_unicode_to_iso_8859_2(characters, - (unsigned char *)cString, length, lossy)) + if (!OFUnicodeToISO8859_2(characters, (unsigned char *)cString, + length, lossy)) @throw [OFInvalidEncodingException exception]; cString[length] = '\0'; return length; #endif #ifdef HAVE_ISO_8859_3 - case OF_STRING_ENCODING_ISO_8859_3: + case OFStringEncodingISO8859_3: if (length + 1 > maxLength) @throw [OFOutOfRangeException exception]; - if (!of_unicode_to_iso_8859_3(characters, - (unsigned char *)cString, length, lossy)) + if (!OFUnicodeToISO8859_3(characters, (unsigned char *)cString, + length, lossy)) @throw [OFInvalidEncodingException exception]; cString[length] = '\0'; return length; #endif #ifdef HAVE_ISO_8859_15 - case OF_STRING_ENCODING_ISO_8859_15: + case OFStringEncodingISO8859_15: if (length + 1 > maxLength) @throw [OFOutOfRangeException exception]; - if (!of_unicode_to_iso_8859_15(characters, - (unsigned char *)cString, length, lossy)) + if (!OFUnicodeToISO8859_15(characters, (unsigned char *)cString, + length, lossy)) @throw [OFInvalidEncodingException exception]; cString[length] = '\0'; return length; #endif #ifdef HAVE_WINDOWS_1251 - case OF_STRING_ENCODING_WINDOWS_1251: + case OFStringEncodingWindows1251: if (length + 1 > maxLength) @throw [OFOutOfRangeException exception]; - if (!of_unicode_to_windows_1251(characters, + if (!OFUnicodeToWindows1251(characters, (unsigned char *)cString, length, lossy)) @throw [OFInvalidEncodingException exception]; cString[length] = '\0'; return length; #endif #ifdef HAVE_WINDOWS_1252 - case OF_STRING_ENCODING_WINDOWS_1252: + case OFStringEncodingWindows1252: if (length + 1 > maxLength) @throw [OFOutOfRangeException exception]; - if (!of_unicode_to_windows_1252(characters, + if (!OFUnicodeToWindows1252(characters, (unsigned char *)cString, length, lossy)) @throw [OFInvalidEncodingException exception]; cString[length] = '\0'; return length; #endif #ifdef HAVE_CODEPAGE_437 - case OF_STRING_ENCODING_CODEPAGE_437: + case OFStringEncodingCodepage437: if (length + 1 > maxLength) @throw [OFOutOfRangeException exception]; - if (!of_unicode_to_codepage_437(characters, + if (!OFUnicodeToCodepage437(characters, (unsigned char *)cString, length, lossy)) @throw [OFInvalidEncodingException exception]; cString[length] = '\0'; return length; #endif #ifdef HAVE_CODEPAGE_850 - case OF_STRING_ENCODING_CODEPAGE_850: + case OFStringEncodingCodepage850: if (length + 1 > maxLength) @throw [OFOutOfRangeException exception]; - if (!of_unicode_to_codepage_850(characters, + if (!OFUnicodeToCodepage850(characters, (unsigned char *)cString, length, lossy)) @throw [OFInvalidEncodingException exception]; cString[length] = '\0'; return length; #endif #ifdef HAVE_CODEPAGE_858 - case OF_STRING_ENCODING_CODEPAGE_858: + case OFStringEncodingCodepage858: if (length + 1 > maxLength) @throw [OFOutOfRangeException exception]; - if (!of_unicode_to_codepage_858(characters, + if (!OFUnicodeToCodepage858(characters, (unsigned char *)cString, length, lossy)) @throw [OFInvalidEncodingException exception]; cString[length] = '\0'; return length; #endif #ifdef HAVE_MAC_ROMAN - case OF_STRING_ENCODING_MAC_ROMAN: + case OFStringEncodingMacRoman: if (length + 1 > maxLength) @throw [OFOutOfRangeException exception]; - if (!of_unicode_to_mac_roman(characters, - (unsigned char *)cString, length, lossy)) + if (!OFUnicodeToMacRoman(characters, (unsigned char *)cString, + length, lossy)) @throw [OFInvalidEncodingException exception]; cString[length] = '\0'; return length; #endif #ifdef HAVE_KOI8_R - case OF_STRING_ENCODING_KOI8_R: + case OFStringEncodingKOI8R: if (length + 1 > maxLength) @throw [OFOutOfRangeException exception]; - if (!of_unicode_to_koi8_r(characters, - (unsigned char *)cString, length, lossy)) + if (!OFUnicodeToKOI8R(characters, (unsigned char *)cString, + length, lossy)) @throw [OFInvalidEncodingException exception]; cString[length] = '\0'; return length; #endif #ifdef HAVE_KOI8_U - case OF_STRING_ENCODING_KOI8_U: + case OFStringEncodingKOI8U: if (length + 1 > maxLength) @throw [OFOutOfRangeException exception]; - if (!of_unicode_to_koi8_u(characters, - (unsigned char *)cString, length, lossy)) + if (!OFUnicodeToKOI8U(characters, (unsigned char *)cString, + length, lossy)) @throw [OFInvalidEncodingException exception]; cString[length] = '\0'; return length; @@ -1344,79 +1354,79 @@ } } - (size_t)getCString: (char *)cString maxLength: (size_t)maxLength - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { return [self of_getCString: cString maxLength: maxLength encoding: encoding lossy: false]; } - (size_t)getLossyCString: (char *)cString maxLength: (size_t)maxLength - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { return [self of_getCString: cString maxLength: maxLength encoding: encoding lossy: true]; } -- (const char *)of_cStringWithEncoding: (of_string_encoding_t)encoding +- (const char *)of_cStringWithEncoding: (OFStringEncoding)encoding lossy: (bool)lossy { size_t length = self.length; char *cString; size_t cStringLength; switch (encoding) { - case OF_STRING_ENCODING_UTF_8: - cString = of_alloc((length * 4) + 1, 1); + case OFStringEncodingUTF8: + cString = OFAllocMemory((length * 4) + 1, 1); @try { cStringLength = [self of_getCString: cString maxLength: (length * 4) + 1 - encoding: OF_STRING_ENCODING_UTF_8 + encoding: OFStringEncodingUTF8 lossy: lossy]; } @catch (id e) { - free(cString); + OFFreeMemory(cString); @throw e; } @try { - cString = of_realloc(cString, cStringLength + 1, 1); + cString = OFResizeMemory(cString, cStringLength + 1, 1); } @catch (OFOutOfMemoryException *e) { /* We don't care, as we only tried to make it smaller */ } break; - case OF_STRING_ENCODING_ASCII: - case OF_STRING_ENCODING_ISO_8859_1: - case OF_STRING_ENCODING_ISO_8859_2: - case OF_STRING_ENCODING_ISO_8859_3: - case OF_STRING_ENCODING_ISO_8859_15: - case OF_STRING_ENCODING_WINDOWS_1251: - case OF_STRING_ENCODING_WINDOWS_1252: - case OF_STRING_ENCODING_CODEPAGE_437: - case OF_STRING_ENCODING_CODEPAGE_850: - case OF_STRING_ENCODING_CODEPAGE_858: - case OF_STRING_ENCODING_MAC_ROMAN: - case OF_STRING_ENCODING_KOI8_R: - case OF_STRING_ENCODING_KOI8_U: - cString = of_alloc(length + 1, 1); + case OFStringEncodingASCII: + case OFStringEncodingISO8859_1: + case OFStringEncodingISO8859_2: + case OFStringEncodingISO8859_3: + case OFStringEncodingISO8859_15: + case OFStringEncodingWindows1251: + case OFStringEncodingWindows1252: + case OFStringEncodingCodepage437: + case OFStringEncodingCodepage850: + case OFStringEncodingCodepage858: + case OFStringEncodingMacRoman: + case OFStringEncodingKOI8R: + case OFStringEncodingKOI8U: + cString = OFAllocMemory(length + 1, 1); @try { cStringLength = [self of_getCString: cString maxLength: length + 1 encoding: encoding lossy: lossy]; } @catch (id e) { - free(cString); + OFFreeMemory(cString); @throw e; } break; default: @@ -1426,98 +1436,97 @@ @try { return [[OFData dataWithItemsNoCopy: cString count: cStringLength + 1 freeWhenDone: true] items]; } @catch (id e) { - free(cString); + OFFreeMemory(cString); @throw e; } } -- (const char *)cStringWithEncoding: (of_string_encoding_t)encoding +- (const char *)cStringWithEncoding: (OFStringEncoding)encoding { return [self of_cStringWithEncoding: encoding lossy: false]; } -- (const char *)lossyCStringWithEncoding: (of_string_encoding_t)encoding +- (const char *)lossyCStringWithEncoding: (OFStringEncoding)encoding { return [self of_cStringWithEncoding: encoding lossy: true]; } - (const char *)UTF8String { - return [self cStringWithEncoding: OF_STRING_ENCODING_UTF_8]; + return [self cStringWithEncoding: OFStringEncodingUTF8]; } - (size_t)length { OF_UNRECOGNIZED_SELECTOR } -- (size_t)cStringLengthWithEncoding: (of_string_encoding_t)encoding +- (size_t)cStringLengthWithEncoding: (OFStringEncoding)encoding { switch (encoding) { - case OF_STRING_ENCODING_UTF_8:; - const of_unichar_t *characters; + case OFStringEncodingUTF8:; + const OFUnichar *characters; size_t length, UTF8StringLength = 0; characters = self.characters; length = self.length; for (size_t i = 0; i < length; i++) { char buffer[4]; - size_t len = of_string_utf8_encode(characters[i], - buffer); + size_t len = OFUTF8StringEncode(characters[i], buffer); if (len == 0) @throw [OFInvalidEncodingException exception]; UTF8StringLength += len; } return UTF8StringLength; - case OF_STRING_ENCODING_ASCII: - case OF_STRING_ENCODING_ISO_8859_1: - case OF_STRING_ENCODING_ISO_8859_2: - case OF_STRING_ENCODING_ISO_8859_3: - case OF_STRING_ENCODING_ISO_8859_15: - case OF_STRING_ENCODING_WINDOWS_1251: - case OF_STRING_ENCODING_WINDOWS_1252: - case OF_STRING_ENCODING_CODEPAGE_437: - case OF_STRING_ENCODING_CODEPAGE_850: - case OF_STRING_ENCODING_CODEPAGE_858: - case OF_STRING_ENCODING_MAC_ROMAN: - case OF_STRING_ENCODING_KOI8_R: - case OF_STRING_ENCODING_KOI8_U: + case OFStringEncodingASCII: + case OFStringEncodingISO8859_1: + case OFStringEncodingISO8859_2: + case OFStringEncodingISO8859_3: + case OFStringEncodingISO8859_15: + case OFStringEncodingWindows1251: + case OFStringEncodingWindows1252: + case OFStringEncodingCodepage437: + case OFStringEncodingCodepage850: + case OFStringEncodingCodepage858: + case OFStringEncodingMacRoman: + case OFStringEncodingKOI8R: + case OFStringEncodingKOI8U: return self.length; default: @throw [OFInvalidEncodingException exception]; } } - (size_t)UTF8StringLength { - return [self cStringLengthWithEncoding: OF_STRING_ENCODING_UTF_8]; + return [self cStringLengthWithEncoding: OFStringEncodingUTF8]; } -- (of_unichar_t)characterAtIndex: (size_t)idx +- (OFUnichar)characterAtIndex: (size_t)idx { OF_UNRECOGNIZED_SELECTOR } -- (void)getCharacters: (of_unichar_t *)buffer - inRange: (of_range_t)range +- (void)getCharacters: (OFUnichar *)buffer + inRange: (OFRange)range { for (size_t i = 0; i < range.length; i++) buffer[i] = [self characterAtIndex: range.location + i]; } - (bool)isEqual: (id)object { void *pool; OFString *string; - const of_unichar_t *characters, *otherCharacters; + const OFUnichar *characters, *otherCharacters; size_t length; if (object == self) return true; @@ -1534,11 +1543,11 @@ characters = self.characters; otherCharacters = string.characters; if (memcmp(characters, otherCharacters, - length * sizeof(of_unichar_t)) != 0) { + length * sizeof(OFUnichar)) != 0) { objc_autoreleasePoolPop(pool); return false; } objc_autoreleasePoolPop(pool); @@ -1554,18 +1563,18 @@ - (id)mutableCopy { return [[OFMutableString alloc] initWithString: self]; } -- (of_comparison_result_t)compare: (OFString *)string +- (OFComparisonResult)compare: (OFString *)string { void *pool; - const of_unichar_t *characters, *otherCharacters; + const OFUnichar *characters, *otherCharacters; size_t minimumLength; if (string == self) - return OF_ORDERED_SAME; + return OFOrderedSame; if (![string isKindOfClass: [OFString class]]) @throw [OFInvalidArgumentException exception]; minimumLength = (self.length > string.length @@ -1577,106 +1586,106 @@ otherCharacters = string.characters; for (size_t i = 0; i < minimumLength; i++) { if (characters[i] > otherCharacters[i]) { objc_autoreleasePoolPop(pool); - return OF_ORDERED_DESCENDING; + return OFOrderedDescending; } if (characters[i] < otherCharacters[i]) { objc_autoreleasePoolPop(pool); - return OF_ORDERED_ASCENDING; + return OFOrderedAscending; } } objc_autoreleasePoolPop(pool); if (self.length > string.length) - return OF_ORDERED_DESCENDING; + return OFOrderedDescending; if (self.length < string.length) - return OF_ORDERED_ASCENDING; + return OFOrderedAscending; - return OF_ORDERED_SAME; + return OFOrderedSame; } -- (of_comparison_result_t)caseInsensitiveCompare: (OFString *)string +- (OFComparisonResult)caseInsensitiveCompare: (OFString *)string { void *pool = objc_autoreleasePoolPush(); - const of_unichar_t *characters, *otherCharacters; + const OFUnichar *characters, *otherCharacters; size_t length, otherLength, minimumLength; if (string == self) - return OF_ORDERED_SAME; + return OFOrderedSame; characters = self.characters; otherCharacters = string.characters; length = self.length; otherLength = string.length; minimumLength = (length > otherLength ? otherLength : length); for (size_t i = 0; i < minimumLength; i++) { - of_unichar_t c = characters[i]; - of_unichar_t oc = otherCharacters[i]; + OFUnichar c = characters[i]; + OFUnichar oc = otherCharacters[i]; #ifdef OF_HAVE_UNICODE_TABLES - if (c >> 8 < OF_UNICODE_CASEFOLDING_TABLE_SIZE) { - of_unichar_t tc = - of_unicode_casefolding_table[c >> 8][c & 0xFF]; + if (c >> 8 < OFUnicodeCaseFoldingTableSize) { + OFUnichar tc = + OFUnicodeCaseFoldingTable[c >> 8][c & 0xFF]; if (tc) c = tc; } - if (oc >> 8 < OF_UNICODE_CASEFOLDING_TABLE_SIZE) { - of_unichar_t tc = - of_unicode_casefolding_table[oc >> 8][oc & 0xFF]; + if (oc >> 8 < OFUnicodeCaseFoldingTableSize) { + OFUnichar tc = + OFUnicodeCaseFoldingTable[oc >> 8][oc & 0xFF]; if (tc) oc = tc; } #else - c = of_ascii_toupper(c); - oc = of_ascii_toupper(oc); + c = OFASCIIToUpper(c); + oc = OFASCIIToUpper(oc); #endif if (c > oc) { objc_autoreleasePoolPop(pool); - return OF_ORDERED_DESCENDING; + return OFOrderedDescending; } if (c < oc) { objc_autoreleasePoolPop(pool); - return OF_ORDERED_ASCENDING; + return OFOrderedAscending; } } objc_autoreleasePoolPop(pool); if (length > otherLength) - return OF_ORDERED_DESCENDING; + return OFOrderedDescending; if (length < otherLength) - return OF_ORDERED_ASCENDING; + return OFOrderedAscending; - return OF_ORDERED_SAME; + return OFOrderedSame; } - (unsigned long)hash { - const of_unichar_t *characters = self.characters; + const OFUnichar *characters = self.characters; size_t length = self.length; - uint32_t hash; + unsigned long hash; - OF_HASH_INIT(hash); + OFHashInit(&hash); for (size_t i = 0; i < length; i++) { - const of_unichar_t c = characters[i]; + const OFUnichar c = characters[i]; - OF_HASH_ADD(hash, (c & 0xFF0000) >> 16); - OF_HASH_ADD(hash, (c & 0x00FF00) >> 8); - OF_HASH_ADD(hash, c & 0x0000FF); + OFHashAdd(&hash, (c & 0xFF0000) >> 16); + OFHashAdd(&hash, (c & 0x00FF00) >> 8); + OFHashAdd(&hash, c & 0x0000FF); } - OF_HASH_FINALIZE(hash); + OFHashFinalize(&hash); return hash; } - (OFString *)description @@ -1694,11 +1703,11 @@ className = @"OFMutableString"; else className = @"OFString"; element = [OFXMLElement elementWithName: className - namespace: OF_SERIALIZATION_NS + namespace: OFSerializationNS stringValue: self]; [element retain]; objc_autoreleasePoolPop(pool); @@ -1709,17 +1718,19 @@ - (OFString *)JSONRepresentation { return [self of_JSONRepresentationWithOptions: 0 depth: 0]; } -- (OFString *)JSONRepresentationWithOptions: (int)options +- (OFString *)JSONRepresentationWithOptions: + (OFJSONRepresentationOptions)options { return [self of_JSONRepresentationWithOptions: options depth: 0]; } -- (OFString *)of_JSONRepresentationWithOptions: (int)options - depth: (size_t)depth +- (OFString *) + of_JSONRepresentationWithOptions: (OFJSONRepresentationOptions)options + depth: (size_t)depth { OFMutableString *JSON = [[self mutableCopy] autorelease]; /* FIXME: This is slow! Write it in pure C! */ [JSON replaceOccurrencesOfString: @"\\" withString: @"\\\\"]; @@ -1727,17 +1738,17 @@ [JSON replaceOccurrencesOfString: @"\b" withString: @"\\b"]; [JSON replaceOccurrencesOfString: @"\f" withString: @"\\f"]; [JSON replaceOccurrencesOfString: @"\r" withString: @"\\r"]; [JSON replaceOccurrencesOfString: @"\t" withString: @"\\t"]; - if (options & OF_JSON_REPRESENTATION_JSON5) { + if (options & OFJSONRepresentationOptionJSON5) { [JSON replaceOccurrencesOfString: @"\n" withString: @"\\\n"]; - if (options & OF_JSON_REPRESENTATION_IDENTIFIER) { + if (options & OFJSONRepresentationOptionIsIdentifier) { const char *cString = self.UTF8String; - if ((!of_ascii_isalpha(cString[0]) && + if ((!OFASCIIIsAlpha(cString[0]) && cString[0] != '_' && cString[0] != '$') || strpbrk(cString, " \n\r\t\b\f\\\"'") != NULL) { [JSON prependString: @"\""]; [JSON appendString: @"\""]; } @@ -1776,18 +1787,18 @@ data = [OFMutableData dataWithCapacity: length + 2]; [data addItem: &type]; [data addItem: &tmp]; } else if (length <= UINT16_MAX) { uint8_t type = 0xDA; - uint16_t tmp = OF_BSWAP16_IF_LE((uint16_t)length); + uint16_t tmp = OFToBigEndian16((uint16_t)length); data = [OFMutableData dataWithCapacity: length + 3]; [data addItem: &type]; [data addItems: &tmp count: sizeof(tmp)]; } else if (length <= UINT32_MAX) { uint8_t type = 0xDB; - uint32_t tmp = OF_BSWAP32_IF_LE((uint32_t)length); + uint32_t tmp = OFToBigEndian32((uint32_t)length); data = [OFMutableData dataWithCapacity: length + 5]; [data addItem: &type]; [data addItems: &tmp count: sizeof(tmp)]; } else @@ -1796,56 +1807,57 @@ [data addItems: self.UTF8String count: length]; return data; } -- (of_range_t)rangeOfString: (OFString *)string +- (OFRange)rangeOfString: (OFString *)string { return [self rangeOfString: string options: 0 - range: of_range(0, self.length)]; + range: OFRangeMake(0, self.length)]; } -- (of_range_t)rangeOfString: (OFString *)string options: (int)options +- (OFRange)rangeOfString: (OFString *)string + options: (OFStringSearchOptions)options { return [self rangeOfString: string options: options - range: of_range(0, self.length)]; + range: OFRangeMake(0, self.length)]; } -- (of_range_t)rangeOfString: (OFString *)string - options: (int)options - range: (of_range_t)range +- (OFRange)rangeOfString: (OFString *)string + options: (OFStringSearchOptions)options + range: (OFRange)range { void *pool; - const of_unichar_t *searchCharacters; - of_unichar_t *characters; + const OFUnichar *searchCharacters; + OFUnichar *characters; size_t searchLength; if ((searchLength = string.length) == 0) - return of_range(0, 0); + return OFRangeMake(0, 0); if (searchLength > range.length) - return of_range(OF_NOT_FOUND, 0); + return OFRangeMake(OFNotFound, 0); - if (range.length > SIZE_MAX / sizeof(of_unichar_t)) + if (range.length > SIZE_MAX / sizeof(OFUnichar)) @throw [OFOutOfRangeException exception]; pool = objc_autoreleasePoolPush(); searchCharacters = string.characters; - characters = of_alloc(range.length, sizeof(of_unichar_t)); + characters = OFAllocMemory(range.length, sizeof(OFUnichar)); @try { [self getCharacters: characters inRange: range]; - if (options & OF_STRING_SEARCH_BACKWARDS) { + if (options & OFStringSearchBackwards) { for (size_t i = range.length - searchLength;; i--) { if (memcmp(characters + i, searchCharacters, - searchLength * sizeof(of_unichar_t)) == 0) { + searchLength * sizeof(OFUnichar)) == 0) { objc_autoreleasePoolPop(pool); - return of_range(range.location + i, + return OFRangeMake(range.location + i, searchLength); } /* No match and we're at the last character */ if (i == 0) @@ -1853,61 +1865,61 @@ } } else { for (size_t i = 0; i <= range.length - searchLength; i++) { if (memcmp(characters + i, searchCharacters, - searchLength * sizeof(of_unichar_t)) == 0) { + searchLength * sizeof(OFUnichar)) == 0) { objc_autoreleasePoolPop(pool); - return of_range(range.location + i, + return OFRangeMake(range.location + i, searchLength); } } } } @finally { - free(characters); + OFFreeMemory(characters); } objc_autoreleasePoolPop(pool); - return of_range(OF_NOT_FOUND, 0); + return OFRangeMake(OFNotFound, 0); } - (size_t)indexOfCharacterFromSet: (OFCharacterSet *)characterSet { return [self indexOfCharacterFromSet: characterSet options: 0 - range: of_range(0, self.length)]; -} - -- (size_t)indexOfCharacterFromSet: (OFCharacterSet *)characterSet - options: (int)options -{ - return [self indexOfCharacterFromSet: characterSet - options: options - range: of_range(0, self.length)]; -} - -- (size_t)indexOfCharacterFromSet: (OFCharacterSet *)characterSet - options: (int)options - range: (of_range_t)range -{ - bool (*characterIsMember)(id, SEL, of_unichar_t) = - (bool (*)(id, SEL, of_unichar_t))[characterSet - methodForSelector: @selector(characterIsMember:)]; - of_unichar_t *characters; - - if (range.length == 0) - return OF_NOT_FOUND; - - if (range.length > SIZE_MAX / sizeof(of_unichar_t)) - @throw [OFOutOfRangeException exception]; - - characters = of_alloc(range.length, sizeof(of_unichar_t)); - @try { - [self getCharacters: characters inRange: range]; - - if (options & OF_STRING_SEARCH_BACKWARDS) { + range: OFRangeMake(0, self.length)]; +} + +- (size_t)indexOfCharacterFromSet: (OFCharacterSet *)characterSet + options: (OFStringSearchOptions)options +{ + return [self indexOfCharacterFromSet: characterSet + options: options + range: OFRangeMake(0, self.length)]; +} + +- (size_t)indexOfCharacterFromSet: (OFCharacterSet *)characterSet + options: (OFStringSearchOptions)options + range: (OFRange)range +{ + bool (*characterIsMember)(id, SEL, OFUnichar) = + (bool (*)(id, SEL, OFUnichar))[characterSet + methodForSelector: @selector(characterIsMember:)]; + OFUnichar *characters; + + if (range.length == 0) + return OFNotFound; + + if (range.length > SIZE_MAX / sizeof(OFUnichar)) + @throw [OFOutOfRangeException exception]; + + characters = OFAllocMemory(range.length, sizeof(OFUnichar)); + @try { + [self getCharacters: characters inRange: range]; + + if (options & OFStringSearchBackwards) { for (size_t i = range.length - 1;; i--) { if (characterIsMember(characterSet, @selector(characterIsMember:), characters[i])) return range.location + i; @@ -1922,20 +1934,20 @@ @selector(characterIsMember:), characters[i])) return range.location + i; } } @finally { - free(characters); + OFFreeMemory(characters); } - return OF_NOT_FOUND; + return OFNotFound; } - (bool)containsString: (OFString *)string { void *pool; - const of_unichar_t *characters, *searchCharacters; + const OFUnichar *characters, *searchCharacters; size_t length, searchLength; if ((searchLength = string.length) == 0) return true; @@ -1947,11 +1959,11 @@ characters = self.characters; searchCharacters = string.characters; for (size_t i = 0; i <= length - searchLength; i++) { if (memcmp(characters + i, searchCharacters, - searchLength * sizeof(of_unichar_t)) == 0) { + searchLength * sizeof(OFUnichar)) == 0) { objc_autoreleasePoolPop(pool); return true; } } @@ -1960,19 +1972,19 @@ return false; } - (OFString *)substringFromIndex: (size_t)idx { - return [self substringWithRange: of_range(idx, self.length - idx)]; + return [self substringWithRange: OFRangeMake(idx, self.length - idx)]; } - (OFString *)substringToIndex: (size_t)idx { - return [self substringWithRange: of_range(0, idx)]; + return [self substringWithRange: OFRangeMake(0, idx)]; } -- (OFString *)substringWithRange: (of_range_t)range +- (OFString *)substringWithRange: (OFRange)range { void *pool; OFString *ret; if (range.length > SIZE_MAX - range.location || @@ -2039,11 +2051,11 @@ } - (OFString *)stringByReplacingOccurrencesOfString: (OFString *)string withString: (OFString *)replacement options: (int)options - range: (of_range_t)range + range: (OFRange)range { OFMutableString *new = [[self mutableCopy] autorelease]; [new replaceOccurrencesOfString: string withString: replacement options: options @@ -2100,61 +2112,61 @@ return new; } - (bool)hasPrefix: (OFString *)prefix { - of_unichar_t *tmp; + OFUnichar *tmp; size_t prefixLength; bool hasPrefix; if ((prefixLength = prefix.length) > self.length) return false; - tmp = of_alloc(prefixLength, sizeof(of_unichar_t)); + tmp = OFAllocMemory(prefixLength, sizeof(OFUnichar)); @try { void *pool = objc_autoreleasePoolPush(); - [self getCharacters: tmp inRange: of_range(0, prefixLength)]; + [self getCharacters: tmp inRange: OFRangeMake(0, prefixLength)]; hasPrefix = (memcmp(tmp, prefix.characters, - prefixLength * sizeof(of_unichar_t)) == 0); + prefixLength * sizeof(OFUnichar)) == 0); objc_autoreleasePoolPop(pool); } @finally { - free(tmp); + OFFreeMemory(tmp); } return hasPrefix; } - (bool)hasSuffix: (OFString *)suffix { - of_unichar_t *tmp; - const of_unichar_t *suffixCharacters; + OFUnichar *tmp; + const OFUnichar *suffixCharacters; size_t length, suffixLength; bool hasSuffix; if ((suffixLength = suffix.length) > self.length) return false; length = self.length; - tmp = of_alloc(suffixLength, sizeof(of_unichar_t)); + tmp = OFAllocMemory(suffixLength, sizeof(OFUnichar)); @try { void *pool = objc_autoreleasePoolPush(); [self getCharacters: tmp - inRange: of_range(length - suffixLength, + inRange: OFRangeMake(length - suffixLength, suffixLength)]; suffixCharacters = suffix.characters; hasSuffix = (memcmp(tmp, suffixCharacters, - suffixLength * sizeof(of_unichar_t)) == 0); + suffixLength * sizeof(OFUnichar)) == 0); objc_autoreleasePoolPop(pool); } @finally { - free(tmp); + OFFreeMemory(tmp); } return hasSuffix; } @@ -2162,16 +2174,16 @@ { return [self componentsSeparatedByString: delimiter options: 0]; } - (OFArray *)componentsSeparatedByString: (OFString *)delimiter - options: (int)options + options: (OFStringSeparationOptions)options { void *pool; OFMutableArray *array; - const of_unichar_t *characters, *delimiterCharacters; - bool skipEmpty = (options & OF_STRING_SKIP_EMPTY); + const OFUnichar *characters, *delimiterCharacters; + bool skipEmpty = (options & OFStringSkipEmptyComponents); size_t length = self.length; size_t delimiterLength = delimiter.length; size_t last; OFString *component; @@ -2197,21 +2209,22 @@ } last = 0; for (size_t i = 0; i <= length - delimiterLength; i++) { if (memcmp(characters + i, delimiterCharacters, - delimiterLength * sizeof(of_unichar_t)) != 0) + delimiterLength * sizeof(OFUnichar)) != 0) continue; - component = [self substringWithRange: of_range(last, i - last)]; + component = [self substringWithRange: + OFRangeMake(last, i - last)]; if (!skipEmpty || component.length > 0) [array addObject: component]; i += delimiterLength - 1; last = i + 1; } - component = [self substringWithRange: of_range(last, length - last)]; + component = [self substringWithRange: OFRangeMake(last, length - last)]; if (!skipEmpty || component.length > 0) [array addObject: component]; [array makeImmutable]; @@ -2227,38 +2240,38 @@ options: 0]; } - (OFArray *) componentsSeparatedByCharactersInSet: (OFCharacterSet *)characterSet - options: (int)options + options: (OFStringSeparationOptions)options { OFMutableArray *array = [OFMutableArray array]; void *pool = objc_autoreleasePoolPush(); - bool skipEmpty = (options & OF_STRING_SKIP_EMPTY); - const of_unichar_t *characters = self.characters; + bool skipEmpty = (options & OFStringSkipEmptyComponents); + const OFUnichar *characters = self.characters; size_t length = self.length; - bool (*characterIsMember)(id, SEL, of_unichar_t) = - (bool (*)(id, SEL, of_unichar_t))[characterSet + bool (*characterIsMember)(id, SEL, OFUnichar) = + (bool (*)(id, SEL, OFUnichar))[characterSet methodForSelector: @selector(characterIsMember:)]; size_t last; last = 0; for (size_t i = 0; i < length; i++) { if (characterIsMember(characterSet, @selector(characterIsMember:), characters[i])) { if (!skipEmpty || i != last) { OFString *component = [self substringWithRange: - of_range(last, i - last)]; + OFRangeMake(last, i - last)]; [array addObject: component]; } last = i + 1; } } if (!skipEmpty || length != last) { OFString *component = [self substringWithRange: - of_range(last, length - last)]; + OFRangeMake(last, length - last)]; [array addObject: component]; } [array makeImmutable]; @@ -2277,11 +2290,11 @@ void *pool = objc_autoreleasePoolPush(); const char *UTF8String = self.UTF8String; bool negative = false; long long value = 0; - while (of_ascii_isspace(*UTF8String)) + while (OFASCIIIsSpace(*UTF8String)) UTF8String++; switch (*UTF8String) { case '-': negative = true; @@ -2308,19 +2321,19 @@ if (base == 0) base = 10; while (*UTF8String != '\0') { - unsigned char c = of_ascii_toupper(*UTF8String++); + unsigned char c = OFASCIIToUpper(*UTF8String++); if (c >= '0' && c <= '9') c -= '0'; else if (c >= 'A' && c <= 'Z') c -= ('A' - 10); - else if (of_ascii_isspace(c)) { + else if (OFASCIIIsSpace(c)) { while (*UTF8String != '\0') - if (!of_ascii_isspace(*UTF8String++)) + if (!OFASCIIIsSpace(*UTF8String++)) @throw [OFInvalidFormatException exception]; break; } else @@ -2352,11 +2365,11 @@ { void *pool = objc_autoreleasePoolPush(); const char *UTF8String = self.UTF8String; unsigned long long value = 0; - while (of_ascii_isspace(*UTF8String)) + while (OFASCIIIsSpace(*UTF8String)) UTF8String++; switch (*UTF8String) { case '-': @throw [OFInvalidFormatException exception]; @@ -2383,19 +2396,19 @@ if (base == 0) base = 10; while (*UTF8String != '\0') { - unsigned char c = of_ascii_toupper(*UTF8String++); + unsigned char c = OFASCIIToUpper(*UTF8String++); if (c >= '0' && c <= '9') c -= '0'; else if (c >= 'A' && c <= 'Z') c -= ('A' - 10); - else if (of_ascii_isspace(c)) { + else if (OFASCIIIsSpace(c)) { while (*UTF8String != '\0') - if (!of_ascii_isspace(*UTF8String++)) + if (!OFASCIIIsSpace(*UTF8String++)) @throw [OFInvalidFormatException exception]; break; } else @@ -2419,19 +2432,19 @@ - (float)floatValue { void *pool = objc_autoreleasePoolPush(); OFString *stripped = self.stringByDeletingEnclosingWhitespaces; - if ([stripped caseInsensitiveCompare: @"INF"] == OF_ORDERED_SAME || - [stripped caseInsensitiveCompare: @"INFINITY"] == OF_ORDERED_SAME) + if ([stripped caseInsensitiveCompare: @"INF"] == OFOrderedSame || + [stripped caseInsensitiveCompare: @"INFINITY"] == OFOrderedSame) return INFINITY; - if ([stripped caseInsensitiveCompare: @"-INF"] == OF_ORDERED_SAME || - [stripped caseInsensitiveCompare: @"-INFINITY"] == OF_ORDERED_SAME) + if ([stripped caseInsensitiveCompare: @"-INF"] == OFOrderedSame || + [stripped caseInsensitiveCompare: @"-INFINITY"] == OFOrderedSame) return -INFINITY; - if ([stripped caseInsensitiveCompare: @"NAN"] == OF_ORDERED_SAME) + if ([stripped caseInsensitiveCompare: @"NAN"] == OFOrderedSame) return NAN; - if ([stripped caseInsensitiveCompare: @"-NAN"] == OF_ORDERED_SAME) + if ([stripped caseInsensitiveCompare: @"-NAN"] == OFOrderedSame) return -NAN; #ifdef HAVE_STRTOF_L const char *UTF8String = self.UTF8String; #else @@ -2442,28 +2455,28 @@ OFString *decimalPoint = [OFLocale decimalPoint]; const char *UTF8String = [self stringByReplacingOccurrencesOfString: @"." withString: decimalPoint].UTF8String; #endif - char *endPointer = NULL; + char *endPtr = NULL; float value; errno = 0; #ifdef HAVE_STRTOF_L - value = strtof_l(UTF8String, &endPointer, cLocale); + value = strtof_l(UTF8String, &endPtr, cLocale); #else - value = strtof(UTF8String, &endPointer); + value = strtof(UTF8String, &endPtr); #endif if (value == HUGE_VALF && errno == ERANGE) @throw [OFOutOfRangeException exception]; /* Check if there are any invalid chars left */ - if (endPointer != NULL) - for (; *endPointer != '\0'; endPointer++) + if (endPtr != NULL) + for (; *endPtr != '\0'; endPtr++) /* Use isspace since strtof uses the same. */ - if (!isspace((unsigned char)*endPointer)) + if (!isspace((unsigned char)*endPtr)) @throw [OFInvalidFormatException exception]; objc_autoreleasePoolPop(pool); return value; @@ -2472,19 +2485,19 @@ - (double)doubleValue { void *pool = objc_autoreleasePoolPush(); OFString *stripped = self.stringByDeletingEnclosingWhitespaces; - if ([stripped caseInsensitiveCompare: @"INF"] == OF_ORDERED_SAME || - [stripped caseInsensitiveCompare: @"INFINITY"] == OF_ORDERED_SAME) + if ([stripped caseInsensitiveCompare: @"INF"] == OFOrderedSame || + [stripped caseInsensitiveCompare: @"INFINITY"] == OFOrderedSame) return INFINITY; - if ([stripped caseInsensitiveCompare: @"-INF"] == OF_ORDERED_SAME || - [stripped caseInsensitiveCompare: @"-INFINITY"] == OF_ORDERED_SAME) + if ([stripped caseInsensitiveCompare: @"-INF"] == OFOrderedSame || + [stripped caseInsensitiveCompare: @"-INFINITY"] == OFOrderedSame) return -INFINITY; - if ([stripped caseInsensitiveCompare: @"NAN"] == OF_ORDERED_SAME) + if ([stripped caseInsensitiveCompare: @"NAN"] == OFOrderedSame) return NAN; - if ([stripped caseInsensitiveCompare: @"-NAN"] == OF_ORDERED_SAME) + if ([stripped caseInsensitiveCompare: @"-NAN"] == OFOrderedSame) return -NAN; #ifdef HAVE_STRTOD_L const char *UTF8String = self.UTF8String; #else @@ -2495,87 +2508,88 @@ OFString *decimalPoint = [OFLocale decimalPoint]; const char *UTF8String = [self stringByReplacingOccurrencesOfString: @"." withString: decimalPoint].UTF8String; #endif - char *endPointer = NULL; + char *endPtr = NULL; double value; errno = 0; #ifdef HAVE_STRTOD_L - value = strtod_l(UTF8String, &endPointer, cLocale); + value = strtod_l(UTF8String, &endPtr, cLocale); #else - value = strtod(UTF8String, &endPointer); + value = strtod(UTF8String, &endPtr); #endif if (value == HUGE_VAL && errno == ERANGE) @throw [OFOutOfRangeException exception]; /* Check if there are any invalid chars left */ - if (endPointer != NULL) - for (; *endPointer != '\0'; endPointer++) + if (endPtr != NULL) + for (; *endPtr != '\0'; endPtr++) /* Use isspace since strtod uses the same. */ - if (!isspace((unsigned char)*endPointer)) + if (!isspace((unsigned char)*endPtr)) @throw [OFInvalidFormatException exception]; objc_autoreleasePoolPop(pool); return value; } -- (const of_unichar_t *)characters +- (const OFUnichar *)characters { size_t length = self.length; - of_unichar_t *buffer; + OFUnichar *buffer; - buffer = of_alloc(length, sizeof(of_unichar_t)); + buffer = OFAllocMemory(length, sizeof(OFUnichar)); @try { - [self getCharacters: buffer inRange: of_range(0, length)]; + [self getCharacters: buffer inRange: OFRangeMake(0, length)]; return [[OFData dataWithItemsNoCopy: buffer count: length - itemSize: sizeof(of_unichar_t) + itemSize: sizeof(OFUnichar) freeWhenDone: true] items]; } @catch (id e) { - free(buffer); + OFFreeMemory(buffer); @throw e; } } -- (const of_char16_t *)UTF16String +- (const OFChar16 *)UTF16String { - return [self UTF16StringWithByteOrder: OF_BYTE_ORDER_NATIVE]; + return [self UTF16StringWithByteOrder: OFByteOrderNative]; } -- (const of_char16_t *)UTF16StringWithByteOrder: (of_byte_order_t)byteOrder +- (const OFChar16 *)UTF16StringWithByteOrder: (OFByteOrder)byteOrder { void *pool = objc_autoreleasePoolPush(); - const of_unichar_t *characters = self.characters; + const OFUnichar *characters = self.characters; size_t length = self.length; - of_char16_t *buffer; + OFChar16 *buffer; size_t j; - bool swap = (byteOrder != OF_BYTE_ORDER_NATIVE); + bool swap = (byteOrder != OFByteOrderNative); /* Allocate memory for the worst case */ - buffer = of_alloc((length + 1) * 2, sizeof(of_char16_t)); + buffer = OFAllocMemory((length + 1) * 2, sizeof(OFChar16)); j = 0; for (size_t i = 0; i < length; i++) { - of_unichar_t c = characters[i]; + OFUnichar c = characters[i]; if (c > 0x10FFFF) { - free(buffer); + OFFreeMemory(buffer); @throw [OFInvalidEncodingException exception]; } if (swap) { if (c > 0xFFFF) { c -= 0x10000; - buffer[j++] = OF_BSWAP16(0xD800 | (c >> 10)); - buffer[j++] = OF_BSWAP16(0xDC00 | (c & 0x3FF)); + buffer[j++] = OFByteSwap16(0xD800 | (c >> 10)); + buffer[j++] = + OFByteSwap16(0xDC00 | (c & 0x3FF)); } else - buffer[j++] = OF_BSWAP16(c); + buffer[j++] = OFByteSwap16(c); } else { if (c > 0xFFFF) { c -= 0x10000; buffer[j++] = 0xD800 | (c >> 10); buffer[j++] = 0xDC00 | (c & 0x3FF); @@ -2584,31 +2598,31 @@ } } buffer[j] = 0; @try { - buffer = of_realloc(buffer, j + 1, sizeof(of_char16_t)); + buffer = OFResizeMemory(buffer, j + 1, sizeof(OFChar16)); } @catch (OFOutOfMemoryException *e) { /* We don't care, as we only tried to make it smaller */ } objc_autoreleasePoolPop(pool); @try { return [[OFData dataWithItemsNoCopy: buffer count: j + 1 - itemSize: sizeof(of_char16_t) + itemSize: sizeof(OFChar16) freeWhenDone: true] items]; } @catch (id e) { - free(buffer); + OFFreeMemory(buffer); @throw e; } } - (size_t)UTF16StringLength { - const of_unichar_t *characters = self.characters; + const OFUnichar *characters = self.characters; size_t length, UTF16StringLength; length = UTF16StringLength = self.length; for (size_t i = 0; i < length; i++) @@ -2616,40 +2630,40 @@ UTF16StringLength++; return UTF16StringLength; } -- (const of_char32_t *)UTF32String +- (const OFChar32 *)UTF32String { - return [self UTF32StringWithByteOrder: OF_BYTE_ORDER_NATIVE]; + return [self UTF32StringWithByteOrder: OFByteOrderNative]; } -- (const of_char32_t *)UTF32StringWithByteOrder: (of_byte_order_t)byteOrder +- (const OFChar32 *)UTF32StringWithByteOrder: (OFByteOrder)byteOrder { size_t length = self.length; - of_char32_t *buffer; + OFChar32 *buffer; - buffer = of_alloc(length + 1, sizeof(of_char32_t)); + buffer = OFAllocMemory(length + 1, sizeof(OFChar32)); @try { - [self getCharacters: buffer inRange: of_range(0, length)]; + [self getCharacters: buffer inRange: OFRangeMake(0, length)]; buffer[length] = 0; - if (byteOrder != OF_BYTE_ORDER_NATIVE) + if (byteOrder != OFByteOrderNative) for (size_t i = 0; i < length; i++) - buffer[i] = OF_BSWAP32(buffer[i]); + buffer[i] = OFByteSwap32(buffer[i]); return [[OFData dataWithItemsNoCopy: buffer count: length + 1 - itemSize: sizeof(of_char32_t) + itemSize: sizeof(OFChar32) freeWhenDone: true] items]; } @catch (id e) { - free(buffer); + OFFreeMemory(buffer); @throw e; } } -- (OFData *)dataWithEncoding: (of_string_encoding_t)encoding +- (OFData *)dataWithEncoding: (OFStringEncoding)encoding { void *pool = objc_autoreleasePoolPush(); OFData *data = [OFData dataWithItems: [self cStringWithEncoding: encoding] count: [self cStringLengthWithEncoding: encoding]]; @@ -2662,18 +2676,18 @@ } #ifdef OF_HAVE_UNICODE_TABLES - (OFString *)decomposedStringWithCanonicalMapping { - return decomposedString(self, of_unicode_decomposition_table, - OF_UNICODE_DECOMPOSITION_TABLE_SIZE); + return decomposedString(self, OFUnicodeDecompositionTable, + OFUnicodeDecompositionTableSize); } - (OFString *)decomposedStringWithCompatibilityMapping { - return decomposedString(self, of_unicode_decomposition_compat_table, - OF_UNICODE_DECOMPOSITION_COMPAT_TABLE_SIZE); + return decomposedString(self, OFUnicodeDecompositionCompatTable, + OFUnicodeDecompositionCompatTableSize); } #endif #ifdef OF_WINDOWS - (OFString *)stringByExpandingWindowsEnvironmentStrings @@ -2687,11 +2701,11 @@ return self; return [OFString stringWithUTF16String: buffer length: length - 1]; } else { - of_string_encoding_t encoding = [OFLocale encoding]; + OFStringEncoding encoding = [OFLocale encoding]; char buffer[512]; size_t length; if ((length = ExpandEnvironmentStringsA( [self cStringWithEncoding: encoding], buffer, @@ -2706,14 +2720,14 @@ #endif #ifdef OF_HAVE_FILES - (void)writeToFile: (OFString *)path { - [self writeToFile: path encoding: OF_STRING_ENCODING_UTF_8]; + [self writeToFile: path encoding: OFStringEncodingUTF8]; } -- (void)writeToFile: (OFString *)path encoding: (of_string_encoding_t)encoding +- (void)writeToFile: (OFString *)path encoding: (OFStringEncoding)encoding { void *pool = objc_autoreleasePoolPush(); OFFile *file = [OFFile fileWithPath: path mode: @"w"]; [file writeString: self encoding: encoding]; objc_autoreleasePoolPop(pool); @@ -2720,14 +2734,14 @@ } #endif - (void)writeToURL: (OFURL *)URL { - [self writeToURL: URL encoding: OF_STRING_ENCODING_UTF_8]; + [self writeToURL: URL encoding: OFStringEncodingUTF8]; } -- (void)writeToURL: (OFURL *)URL encoding: (of_string_encoding_t)encoding +- (void)writeToURL: (OFURL *)URL encoding: (OFStringEncoding)encoding { void *pool = objc_autoreleasePoolPush(); OFURLHandler *URLHandler; OFStream *stream; @@ -2739,14 +2753,14 @@ objc_autoreleasePoolPop(pool); } #ifdef OF_HAVE_BLOCKS -- (void)enumerateLinesUsingBlock: (of_string_line_enumeration_block_t)block +- (void)enumerateLinesUsingBlock: (OFStringLineEnumerationBlock)block { void *pool = objc_autoreleasePoolPush(); - const of_unichar_t *characters = self.characters; + const OFUnichar *characters = self.characters; size_t i, last = 0, length = self.length; bool stop = false, lastCarriageReturn = false; for (i = 0; i < length && !stop; i++) { if (lastCarriageReturn && characters[i] == '\n') { @@ -2758,22 +2772,22 @@ if (characters[i] == '\n' || characters[i] == '\r') { void *pool2 = objc_autoreleasePoolPush(); block([self substringWithRange: - of_range(last, i - last)], &stop); + OFRangeMake(last, i - last)], &stop); last = i + 1; objc_autoreleasePoolPop(pool2); } lastCarriageReturn = (characters[i] == '\r'); } if (!stop) - block([self substringWithRange: of_range(last, i - last)], + block([self substringWithRange: OFRangeMake(last, i - last)], &stop); objc_autoreleasePoolPop(pool); } #endif @end Index: src/OFSubarray.h ================================================================== --- src/OFSubarray.h +++ src/OFSubarray.h @@ -18,13 +18,13 @@ OF_ASSUME_NONNULL_BEGIN @interface OFSubarray: OFArray { OFArray *_array; - of_range_t _range; + OFRange _range; } -+ (instancetype)arrayWithArray: (OFArray *)array range: (of_range_t)range; -- (instancetype)initWithArray: (OFArray *)array range: (of_range_t)range; ++ (instancetype)arrayWithArray: (OFArray *)array range: (OFRange)range; +- (instancetype)initWithArray: (OFArray *)array range: (OFRange)range; @end OF_ASSUME_NONNULL_END Index: src/OFSubarray.m ================================================================== --- src/OFSubarray.m +++ src/OFSubarray.m @@ -18,16 +18,16 @@ #import "OFSubarray.h" #import "OFOutOfRangeException.h" @implementation OFSubarray -+ (instancetype)arrayWithArray: (OFArray *)array range: (of_range_t)range ++ (instancetype)arrayWithArray: (OFArray *)array range: (OFRange)range { return [[[self alloc] initWithArray: array range: range] autorelease]; } -- (instancetype)initWithArray: (OFArray *)array range: (of_range_t)range +- (instancetype)initWithArray: (OFArray *)array range: (OFRange)range { self = [super init]; @try { /* Should usually be retain, as it's useless with a copy */ @@ -59,11 +59,11 @@ @throw [OFOutOfRangeException exception]; return [_array objectAtIndex: idx + _range.location]; } -- (void)getObjects: (id *)buffer inRange: (of_range_t)range +- (void)getObjects: (id *)buffer inRange: (OFRange)range { if (range.length > SIZE_MAX - range.location || range.location + range.length > _range.length) @throw [OFOutOfRangeException exception]; @@ -75,36 +75,36 @@ - (size_t)indexOfObject: (id)object { size_t idx = [_array indexOfObject: object]; if (idx < _range.location) - return OF_NOT_FOUND; + return OFNotFound; idx -= _range.location; if (idx >= _range.length) - return OF_NOT_FOUND; + return OFNotFound; return idx; } - (size_t)indexOfObjectIdenticalTo: (id)object { size_t idx = [_array indexOfObjectIdenticalTo: object]; if (idx < _range.location) - return OF_NOT_FOUND; + return OFNotFound; idx -= _range.location; if (idx >= _range.length) - return OF_NOT_FOUND; + return OFNotFound; return idx; } -- (OFArray *)objectsInRange: (of_range_t)range +- (OFArray *)objectsInRange: (OFRange)range { if (range.length > SIZE_MAX - range.location || range.location + range.length > _range.length) @throw [OFOutOfRangeException exception]; Index: src/OFSystemInfo.m ================================================================== --- src/OFSystemInfo.m +++ src/OFSystemInfo.m @@ -41,16 +41,15 @@ #import "OFSystemInfo.h" #import "OFApplication.h" #import "OFArray.h" #import "OFDictionary.h" #import "OFLocale.h" +#import "OFOnce.h" #import "OFString.h" #import "OFNotImplementedException.h" -#import "once.h" - #if defined(OF_MACOS) || defined(OF_IOS) # ifdef HAVE_SYSDIR_H # include # endif #endif @@ -89,11 +88,11 @@ extern NSSearchPathEnumerationState NSGetNextSearchPathEnumeration( NSSearchPathEnumerationState, char *); #endif #if defined(OF_X86_64) || defined(OF_X86) -struct x86_regs { +struct X86Regs { uint32_t eax, ebx, ecx, edx; }; #endif static size_t pageSize = 4096; @@ -162,11 +161,11 @@ #elif defined(OF_WINDOWS) # ifdef OF_HAVE_FILES void *pool = objc_autoreleasePoolPush(); @try { - of_string_encoding_t encoding = [OFLocale encoding]; + OFStringEncoding encoding = [OFLocale encoding]; char systemDir[PATH_MAX]; UINT systemDirLen; OFString *systemDirString; const char *path; void *buffer; @@ -235,14 +234,14 @@ encoding: [OFLocale encoding]]; #endif } #if defined(OF_X86_64) || defined(OF_X86) -static OF_INLINE struct x86_regs OF_CONST_FUNC -x86_cpuid(uint32_t eax, uint32_t ecx) +static OF_INLINE struct X86Regs OF_CONST_FUNC +x86CPUID(uint32_t eax, uint32_t ecx) { - struct x86_regs regs; + struct X86Regs regs; # if defined(OF_X86_64) && defined(__GNUC__) __asm__ ( "cpuid" : "=a"(regs.eax), "=b"(regs.ebx), "=c"(regs.ecx), "=d"(regs.edx) @@ -331,20 +330,20 @@ return OBJFW_VERSION_MINOR; } + (OFString *)operatingSystemName { - static of_once_t onceControl = OF_ONCE_INIT; - of_once(&onceControl, initOperatingSystemName); + static OFOnceControl onceControl = OFOnceControlInitValue; + OFOnce(&onceControl, initOperatingSystemName); return operatingSystemName; } + (OFString *)operatingSystemVersion { - static of_once_t onceControl = OF_ONCE_INIT; - of_once(&onceControl, initOperatingSystemVersion); + static OFOnceControl onceControl = OFOnceControlInitValue; + OFOnce(&onceControl, initOperatingSystemVersion); return operatingSystemVersion; } #ifdef OF_HAVE_FILES @@ -388,11 +387,11 @@ if ((home = [env objectForKey: @"HOME"]) == nil) @throw [OFNotImplementedException exceptionWithSelector: _cmd object: self]; - [path deleteCharactersInRange: of_range(0, 1)]; + [path deleteCharactersInRange: OFRangeMake(0, 1)]; [path prependString: home]; } [path makeImmutable]; @@ -480,11 +479,11 @@ if ((home = [env objectForKey: @"HOME"]) == nil) @throw [OFNotImplementedException exceptionWithSelector: _cmd object: self]; - [path deleteCharactersInRange: of_range(0, 1)]; + [path deleteCharactersInRange: OFRangeMake(0, 1)]; [path prependString: home]; } [path appendString: @"/Preferences"]; [path makeImmutable]; @@ -528,11 +527,11 @@ #endif + (OFString *)CPUVendor { #if (defined(OF_X86_64) || defined(OF_X86)) && defined(__GNUC__) - struct x86_regs regs = x86_cpuid(0, 0); + struct X86Regs regs = x86CPUID(0, 0); uint32_t buffer[3]; if (regs.eax == 0) return nil; @@ -539,11 +538,11 @@ buffer[0] = regs.ebx; buffer[1] = regs.edx; buffer[2] = regs.ecx; return [OFString stringWithCString: (char *)buffer - encoding: OF_STRING_ENCODING_ASCII + encoding: OFStringEncodingASCII length: 12]; #else return nil; #endif } @@ -554,20 +553,20 @@ uint32_t buffer[12]; size_t i; i = 0; for (uint32_t eax = 0x80000002; eax <= 0x80000004; eax++) { - struct x86_regs regs = x86_cpuid(eax, 0); + struct X86Regs regs = x86CPUID(eax, 0); buffer[i++] = regs.eax; buffer[i++] = regs.ebx; buffer[i++] = regs.ecx; buffer[i++] = regs.edx; } return [OFString stringWithCString: (char *)buffer - encoding: OF_STRING_ENCODING_ASCII]; + encoding: OFStringEncodingASCII]; #elif defined(OF_AMIGAOS4) CONST_STRPTR model, version; GetCPUInfoTags(GCIT_ModelString, &model, GCIT_VersionString, &version, TAG_END); @@ -574,70 +573,70 @@ if (version != NULL) return [OFString stringWithFormat: @"%s V%s", model, version]; else return [OFString stringWithCString: model - encoding: OF_STRING_ENCODING_ASCII]; + encoding: OFStringEncodingASCII]; #else return nil; #endif } #if defined(OF_X86_64) || defined(OF_X86) + (bool)supportsMMX { - return (x86_cpuid(1, 0).edx & (1u << 23)); + return (x86CPUID(1, 0).edx & (1u << 23)); } + (bool)supportsSSE { - return (x86_cpuid(1, 0).edx & (1u << 25)); + return (x86CPUID(1, 0).edx & (1u << 25)); } + (bool)supportsSSE2 { - return (x86_cpuid(1, 0).edx & (1u << 26)); + return (x86CPUID(1, 0).edx & (1u << 26)); } + (bool)supportsSSE3 { - return (x86_cpuid(1, 0).ecx & (1u << 0)); + return (x86CPUID(1, 0).ecx & (1u << 0)); } + (bool)supportsSSSE3 { - return (x86_cpuid(1, 0).ecx & (1u << 9)); + return (x86CPUID(1, 0).ecx & (1u << 9)); } + (bool)supportsSSE41 { - return (x86_cpuid(1, 0).ecx & (1u << 19)); + return (x86CPUID(1, 0).ecx & (1u << 19)); } + (bool)supportsSSE42 { - return (x86_cpuid(1, 0).ecx & (1u << 20)); + return (x86CPUID(1, 0).ecx & (1u << 20)); } + (bool)supportsAVX { - return (x86_cpuid(1, 0).ecx & (1u << 28)); + return (x86CPUID(1, 0).ecx & (1u << 28)); } + (bool)supportsAVX2 { - return x86_cpuid(0, 0).eax >= 7 && (x86_cpuid(7, 0).ebx & (1u << 5)); + return x86CPUID(0, 0).eax >= 7 && (x86CPUID(7, 0).ebx & (1u << 5)); } + (bool)supportsAESNI { - return (x86_cpuid(1, 0).ecx & (1u << 25)); + return (x86CPUID(1, 0).ecx & (1u << 25)); } + (bool)supportsSHAExtensions { - return (x86_cpuid(7, 0).ebx & (1u << 29)); + return (x86CPUID(7, 0).ebx & (1u << 29)); } #endif #if defined(OF_POWERPC) || defined(OF_POWERPC64) + (bool)supportsAltiVec Index: src/OFTCPSocket.h ================================================================== --- src/OFTCPSocket.h +++ src/OFTCPSocket.h @@ -28,11 +28,11 @@ * @brief A block which is called when the socket connected. * * @param exception An exception which occurred while connecting the socket or * `nil` on success */ -typedef void (^of_tcp_socket_async_connect_block_t)(id _Nullable exception); +typedef void (^OFTCPSocketAsyncConnectBlock)(id _Nullable exception); #endif /** * @protocol OFTCPSocketDelegate OFTCPSocket.h ObjFW/OFTCPSocket.h * @@ -168,11 +168,11 @@ * @param port The port on the host to connect to * @param runLoopMode The run loop mode in which to perform the async connect */ - (void)asyncConnectToHost: (OFString *)host port: (uint16_t)port - runLoopMode: (of_run_loop_mode_t)runLoopMode; + runLoopMode: (OFRunLoopMode)runLoopMode; #ifdef OF_HAVE_BLOCKS /** * @brief Asynchronously connect the OFTCPSocket to the specified destination. * @@ -180,11 +180,11 @@ * @param port The port on the host to connect to * @param block The block to execute once the connection has been established */ - (void)asyncConnectToHost: (OFString *)host port: (uint16_t)port - block: (of_tcp_socket_async_connect_block_t)block; + block: (OFTCPSocketAsyncConnectBlock)block; /** * @brief Asynchronously connect the OFTCPSocket to the specified destination. * * @param host The host to connect to @@ -192,12 +192,12 @@ * @param runLoopMode The run loop mode in which to perform the async connect * @param block The block to execute once the connection has been established */ - (void)asyncConnectToHost: (OFString *)host port: (uint16_t)port - runLoopMode: (of_run_loop_mode_t)runLoopMode - block: (of_tcp_socket_async_connect_block_t)block; + runLoopMode: (OFRunLoopMode)runLoopMode + block: (OFTCPSocketAsyncConnectBlock)block; #endif /** * @brief Bind the socket to the specified host and port. * @@ -211,11 +211,11 @@ @end #ifdef __cplusplus extern "C" { #endif -extern Class _Nullable of_tls_socket_class; +extern Class _Nullable OFTLSSocketClass; #ifdef __cplusplus } #endif OF_ASSUME_NONNULL_END Index: src/OFTCPSocket.m ================================================================== --- src/OFTCPSocket.m +++ src/OFTCPSocket.m @@ -35,10 +35,12 @@ #import "OFData.h" #import "OFDate.h" #import "OFIPSocketAsyncConnector.h" #import "OFRunLoop.h" #import "OFRunLoop+Private.h" +#import "OFSocket.h" +#import "OFSocket+Private.h" #import "OFString.h" #import "OFTCPSocketSOCKS5Connector.h" #import "OFThread.h" #import "OFAlreadyConnectedException.h" @@ -46,17 +48,14 @@ #import "OFGetOptionFailedException.h" #import "OFNotImplementedException.h" #import "OFNotOpenException.h" #import "OFSetOptionFailedException.h" -#import "socket.h" -#import "socket_helpers.h" +static const OFRunLoopMode connectRunLoopMode = + @"OFTCPSocketConnectRunLoopMode"; -static const of_run_loop_mode_t connectRunLoopMode = - @"of_tcp_socket_connect_mode"; - -Class of_tls_socket_class = Nil; +Class OFTLSSocketClass = Nil; static OFString *defaultSOCKS5Host = nil; static uint16_t defaultSOCKS5Port = 1080; @interface OFTCPSocket () @@ -134,23 +133,23 @@ [_SOCKS5Host release]; [super dealloc]; } -- (bool)of_createSocketForAddress: (const of_socket_address_t *)address +- (bool)of_createSocketForAddress: (const OFSocketAddress *)address errNo: (int *)errNo { #if SOCK_CLOEXEC == 0 && defined(HAVE_FCNTL) && defined(FD_CLOEXEC) int flags; #endif - if (_socket != INVALID_SOCKET) + if (_socket != OFInvalidSocketHandle) @throw [OFAlreadyConnectedException exceptionWithSocket: self]; if ((_socket = socket(address->sockaddr.sockaddr.sa_family, - SOCK_STREAM | SOCK_CLOEXEC, 0)) == INVALID_SOCKET) { - *errNo = of_socket_errno(); + SOCK_STREAM | SOCK_CLOEXEC, 0)) == OFInvalidSocketHandle) { + *errNo = OFSocketErrNo(); return false; } #if SOCK_CLOEXEC == 0 && defined(HAVE_FCNTL) && defined(FD_CLOEXEC) if ((flags = fcntl(_socket, F_GETFD, 0)) != -1) @@ -158,30 +157,30 @@ #endif return true; } -- (bool)of_connectSocketToAddress: (const of_socket_address_t *)address +- (bool)of_connectSocketToAddress: (const OFSocketAddress *)address errNo: (int *)errNo { - if (_socket == INVALID_SOCKET) + if (_socket == OFInvalidSocketHandle) @throw [OFNotOpenException exceptionWithObject: self]; /* Cast needed for AmigaOS, where the argument is declared non-const */ if (connect(_socket, (struct sockaddr *)&address->sockaddr.sockaddr, address->length) != 0) { - *errNo = of_socket_errno(); + *errNo = OFSocketErrNo(); return false; } return true; } - (void)of_closeSocket { closesocket(_socket); - _socket = INVALID_SOCKET; + _socket = OFInvalidSocketHandle; } - (void)connectToHost: (OFString *)host port: (uint16_t)port { void *pool = objc_autoreleasePoolPush(); @@ -211,21 +210,21 @@ - (void)asyncConnectToHost: (OFString *)host port: (uint16_t)port { [self asyncConnectToHost: host port: port - runLoopMode: of_run_loop_mode_default]; + runLoopMode: OFDefaultRunLoopMode]; } - (void)asyncConnectToHost: (OFString *)host port: (uint16_t)port - runLoopMode: (of_run_loop_mode_t)runLoopMode + runLoopMode: (OFRunLoopMode)runLoopMode { void *pool = objc_autoreleasePoolPush(); id delegate; - if (_socket != INVALID_SOCKET) + if (_socket != OFInvalidSocketHandle) @throw [OFAlreadyConnectedException exceptionWithSocket: self]; if (_SOCKS5Host != nil) { delegate = [[[OFTCPSocketSOCKS5Connector alloc] initWithSocket: self @@ -253,27 +252,27 @@ } #ifdef OF_HAVE_BLOCKS - (void)asyncConnectToHost: (OFString *)host port: (uint16_t)port - block: (of_tcp_socket_async_connect_block_t)block + block: (OFTCPSocketAsyncConnectBlock)block { [self asyncConnectToHost: host port: port - runLoopMode: of_run_loop_mode_default + runLoopMode: OFDefaultRunLoopMode block: block]; } - (void)asyncConnectToHost: (OFString *)host port: (uint16_t)port - runLoopMode: (of_run_loop_mode_t)runLoopMode - block: (of_tcp_socket_async_connect_block_t)block + runLoopMode: (OFRunLoopMode)runLoopMode + block: (OFTCPSocketAsyncConnectBlock)block { void *pool = objc_autoreleasePoolPush(); id delegate = nil; - if (_socket != INVALID_SOCKET) + if (_socket != OFInvalidSocketHandle) @throw [OFAlreadyConnectedException exceptionWithSocket: self]; if (_SOCKS5Host != nil) { delegate = [[[OFTCPSocketSOCKS5Connector alloc] initWithSocket: self @@ -300,36 +299,36 @@ - (uint16_t)bindToHost: (OFString *)host port: (uint16_t)port { const int one = 1; void *pool = objc_autoreleasePoolPush(); OFData *socketAddresses; - of_socket_address_t address; + OFSocketAddress address; #if SOCK_CLOEXEC == 0 && defined(HAVE_FCNTL) && defined(FD_CLOEXEC) int flags; #endif - if (_socket != INVALID_SOCKET) + if (_socket != OFInvalidSocketHandle) @throw [OFAlreadyConnectedException exceptionWithSocket: self]; if (_SOCKS5Host != nil) @throw [OFNotImplementedException exceptionWithSelector: _cmd object: self]; socketAddresses = [[OFThread DNSResolver] resolveAddressesForHost: host - addressFamily: OF_SOCKET_ADDRESS_FAMILY_ANY]; + addressFamily: OFSocketAddressFamilyAny]; - address = *(of_socket_address_t *)[socketAddresses itemAtIndex: 0]; - of_socket_address_set_port(&address, port); + address = *(OFSocketAddress *)[socketAddresses itemAtIndex: 0]; + OFSocketAddressSetPort(&address, port); if ((_socket = socket(address.sockaddr.sockaddr.sa_family, - SOCK_STREAM | SOCK_CLOEXEC, 0)) == INVALID_SOCKET) + SOCK_STREAM | SOCK_CLOEXEC, 0)) == OFInvalidSocketHandle) @throw [OFBindFailedException exceptionWithHost: host port: port socket: self - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; _canBlock = true; #if SOCK_CLOEXEC == 0 && defined(HAVE_FCNTL) && defined(FD_CLOEXEC) if ((flags = fcntl(_socket, F_GETFD, 0)) != -1) @@ -342,14 +341,14 @@ #if defined(OF_HPUX) || defined(OF_WII) || defined(OF_NINTENDO_3DS) if (port != 0) { #endif if (bind(_socket, &address.sockaddr.sockaddr, address.length) != 0) { - int errNo = of_socket_errno(); + int errNo = OFSocketErrNo(); closesocket(_socket); - _socket = INVALID_SOCKET; + _socket = OFInvalidSocketHandle; @throw [OFBindFailedException exceptionWithHost: host port: port socket: self errNo: errNo]; @@ -361,23 +360,23 @@ int ret; while (rnd < 1024) rnd = (uint16_t)rand(); - of_socket_address_set_port(&address, rnd); + OFSocketAddressSetPort(&address, rnd); if ((ret = bind(_socket, &address.sockaddr.sockaddr, address.length)) == 0) { port = rnd; break; } - if (of_socket_errno() != EADDRINUSE) { - int errNo = of_socket_errno(); + if (OFSocketErrNo() != EADDRINUSE) { + int errNo = OFSocketErrNo(); closesocket(_socket); - _socket = INVALID_SOCKET; + _socket = OFInvalidSocketHandle; @throw [OFBindFailedException exceptionWithHost: host port: port socket: self @@ -394,41 +393,41 @@ #if !defined(OF_HPUX) && !defined(OF_WII) && !defined(OF_NINTENDO_3DS) memset(&address, 0, sizeof(address)); address.length = (socklen_t)sizeof(address.sockaddr); - if (of_getsockname(_socket, &address.sockaddr.sockaddr, + if (OFGetSockName(_socket, &address.sockaddr.sockaddr, &address.length) != 0) { - int errNo = of_socket_errno(); + int errNo = OFSocketErrNo(); closesocket(_socket); - _socket = INVALID_SOCKET; + _socket = OFInvalidSocketHandle; @throw [OFBindFailedException exceptionWithHost: host port: port socket: self errNo: errNo]; } if (address.sockaddr.sockaddr.sa_family == AF_INET) - return OF_BSWAP16_IF_LE(address.sockaddr.in.sin_port); + return OFFromBigEndian16(address.sockaddr.in.sin_port); # ifdef OF_HAVE_IPV6 else if (address.sockaddr.sockaddr.sa_family == AF_INET6) - return OF_BSWAP16_IF_LE(address.sockaddr.in6.sin6_port); + return OFFromBigEndian16(address.sockaddr.in6.sin6_port); # endif else { closesocket(_socket); - _socket = INVALID_SOCKET; + _socket = OFInvalidSocketHandle; @throw [OFBindFailedException exceptionWithHost: host port: port socket: self errNo: EAFNOSUPPORT]; } #else closesocket(_socket); - _socket = INVALID_SOCKET; + _socket = OFInvalidSocketHandle; @throw [OFBindFailedException exceptionWithHost: host port: port socket: self errNo: EADDRNOTAVAIL]; #endif @@ -441,11 +440,11 @@ if (setsockopt(_socket, SOL_SOCKET, SO_KEEPALIVE, (char *)&v, (socklen_t)sizeof(v)) != 0) @throw [OFSetOptionFailedException exceptionWithObject: self - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; } - (bool)sendsKeepAlives { int v; @@ -453,11 +452,11 @@ if (getsockopt(_socket, SOL_SOCKET, SO_KEEPALIVE, (char *)&v, &len) != 0 || len != sizeof(v)) @throw [OFGetOptionFailedException exceptionWithObject: self - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; return v; } #endif @@ -468,11 +467,11 @@ if (setsockopt(_socket, IPPROTO_TCP, TCP_NODELAY, (char *)&v, (socklen_t)sizeof(v)) != 0) @throw [OFSetOptionFailedException exceptionWithObject: self - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; } - (bool)canDelaySendingSegments { int v; @@ -480,11 +479,11 @@ if (getsockopt(_socket, IPPROTO_TCP, TCP_NODELAY, (char *)&v, &len) != 0 || len != sizeof(v)) @throw [OFGetOptionFailedException exceptionWithObject: self - errNo: of_socket_errno()]; + errNo: OFSocketErrNo()]; return !v; } #endif Index: src/OFTCPSocketSOCKS5Connector.h ================================================================== --- src/OFTCPSocketSOCKS5Connector.h +++ src/OFTCPSocketSOCKS5Connector.h @@ -24,21 +24,14 @@ OFTCPSocket *_socket; OFString *_host; uint16_t _port; id _Nullable _delegate; #ifdef OF_HAVE_BLOCKS - of_tcp_socket_async_connect_block_t _Nullable _block; + OFTCPSocketAsyncConnectBlock _Nullable _block; #endif id _Nullable _exception; - enum { - OF_SOCKS5_STATE_SEND_AUTHENTICATION = 1, - OF_SOCKS5_STATE_READ_VERSION, - OF_SOCKS5_STATE_SEND_REQUEST, - OF_SOCKS5_STATE_READ_RESPONSE, - OF_SOCKS5_STATE_READ_ADDRESS, - OF_SOCKS5_STATE_READ_ADDRESS_LENGTH, - } _SOCKS5State; + uint_least8_t _SOCKS5State; /* Longest read is domain name (max 255 bytes) + port */ unsigned char _buffer[257]; OFMutableData *_Nullable _request; } @@ -45,13 +38,12 @@ - (instancetype)initWithSocket: (OFTCPSocket *)sock host: (OFString *)host port: (uint16_t)port delegate: (nullable id )delegate #ifdef OF_HAVE_BLOCKS - block: (nullable of_tcp_socket_async_connect_block_t) - block + block: (nullable OFTCPSocketAsyncConnectBlock)block #endif ; - (void)didConnect; @end OF_ASSUME_NONNULL_END Index: src/OFTCPSocketSOCKS5Connector.m ================================================================== --- src/OFTCPSocketSOCKS5Connector.m +++ src/OFTCPSocketSOCKS5Connector.m @@ -22,18 +22,27 @@ #import "OFData.h" #import "OFRunLoop.h" #import "OFString.h" #import "OFConnectionFailedException.h" + +enum { + stateSendAuthentication = 1, + stateReadVersion, + stateSendRequest, + stateReadResponse, + stateReadAddress, + stateReadAddressLength, +}; @implementation OFTCPSocketSOCKS5Connector - (instancetype)initWithSocket: (OFTCPSocket *)sock host: (OFString *)host port: (uint16_t)port delegate: (id )delegate #ifdef OF_HAVE_BLOCKS - block: (of_tcp_socket_async_connect_block_t)block + block: (OFTCPSocketAsyncConnectBlock)block #endif { self = [super init]; @try { @@ -104,21 +113,21 @@ return; } data = [OFData dataWithItems: "\x05\x01\x00" count: 3]; - _SOCKS5State = OF_SOCKS5_STATE_SEND_AUTHENTICATION; + _SOCKS5State = stateSendAuthentication; [_socket asyncWriteData: data runLoopMode: [OFRunLoop currentRunLoop].currentMode]; } - (bool)stream: (OFStream *)sock didReadIntoBuffer: (void *)buffer length: (size_t)length exception: (id)exception { - of_run_loop_mode_t runLoopMode; + OFRunLoopMode runLoopMode; unsigned char *SOCKSVersion; uint8_t hostLength; unsigned char port[2]; unsigned char *response, *addressLength; @@ -129,11 +138,11 @@ } runLoopMode = [OFRunLoop currentRunLoop].currentMode; switch (_SOCKS5State) { - case OF_SOCKS5_STATE_READ_VERSION: + case stateReadVersion: SOCKSVersion = buffer; if (SOCKSVersion[0] != 5 || SOCKSVersion[1] != 0) { _exception = [[OFConnectionFailedException alloc] initWithHost: _host @@ -155,14 +164,14 @@ port[0] = _port >> 8; port[1] = _port & 0xFF; [_request addItems: port count: 2]; - _SOCKS5State = OF_SOCKS5_STATE_SEND_REQUEST; + _SOCKS5State = stateSendRequest; [_socket asyncWriteData: _request runLoopMode: runLoopMode]; return false; - case OF_SOCKS5_STATE_READ_RESPONSE: + case stateReadResponse: response = buffer; if (response[0] != 5 || response[2] != 0) { _exception = [[OFConnectionFailedException alloc] initWithHost: _host @@ -217,23 +226,23 @@ } /* Skip the rest of the response */ switch (response[3]) { case 1: /* IPv4 */ - _SOCKS5State = OF_SOCKS5_STATE_READ_ADDRESS; + _SOCKS5State = stateReadAddress; [_socket asyncReadIntoBuffer: _buffer exactLength: 4 + 2 runLoopMode: runLoopMode]; return false; case 3: /* Domain name */ - _SOCKS5State = OF_SOCKS5_STATE_READ_ADDRESS_LENGTH; + _SOCKS5State = stateReadAddressLength; [_socket asyncReadIntoBuffer: _buffer exactLength: 1 runLoopMode: runLoopMode]; return false; case 4: /* IPv6 */ - _SOCKS5State = OF_SOCKS5_STATE_READ_ADDRESS; + _SOCKS5State = stateReadAddress; [_socket asyncReadIntoBuffer: _buffer exactLength: 16 + 2 runLoopMode: runLoopMode]; return false; default: @@ -245,17 +254,17 @@ [self didConnect]; return false; } return false; - case OF_SOCKS5_STATE_READ_ADDRESS: + case stateReadAddress: [self didConnect]; return false; - case OF_SOCKS5_STATE_READ_ADDRESS_LENGTH: + case stateReadAddressLength: addressLength = buffer; - _SOCKS5State = OF_SOCKS5_STATE_READ_ADDRESS; + _SOCKS5State = stateReadAddress; [_socket asyncReadIntoBuffer: _buffer exactLength: addressLength[0] + 2 runLoopMode: runLoopMode]; return false; default: @@ -267,11 +276,11 @@ - (OFData *)stream: (OFStream *)sock didWriteData: (OFData *)data bytesWritten: (size_t)bytesWritten exception: (id)exception { - of_run_loop_mode_t runLoopMode; + OFRunLoopMode runLoopMode; if (exception != nil) { _exception = [exception retain]; [self didConnect]; return nil; @@ -278,21 +287,21 @@ } runLoopMode = [OFRunLoop currentRunLoop].currentMode; switch (_SOCKS5State) { - case OF_SOCKS5_STATE_SEND_AUTHENTICATION: - _SOCKS5State = OF_SOCKS5_STATE_READ_VERSION; + case stateSendAuthentication: + _SOCKS5State = stateReadVersion; [_socket asyncReadIntoBuffer: _buffer exactLength: 2 runLoopMode: runLoopMode]; return nil; - case OF_SOCKS5_STATE_SEND_REQUEST: + case stateSendRequest: [_request release]; _request = nil; - _SOCKS5State = OF_SOCKS5_STATE_READ_RESPONSE; + _SOCKS5State = stateReadResponse; [_socket asyncReadIntoBuffer: _buffer exactLength: 4 runLoopMode: runLoopMode]; return nil; default: ADDED src/OFTLSKey.h Index: src/OFTLSKey.h ================================================================== --- src/OFTLSKey.h +++ src/OFTLSKey.h @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "objfw-defs.h" + +#include + +#include "platform.h" + +#if !defined(OF_HAVE_THREADS) || \ + (!defined(OF_HAVE_PTHREADS) && !defined(OF_WINDOWS) && !defined(OF_AMIGAOS)) +# error No thread-local storage available! +#endif + +#import "macros.h" + +#if defined(OF_HAVE_PTHREADS) +# include +typedef pthread_key_t OFTLSKey; +#elif defined(OF_WINDOWS) +# include +typedef DWORD OFTLSKey; +#elif defined(OF_MORPHOS) +# include +typedef ULONG OFTLSKey; +#elif defined(OF_AMIGAOS) +typedef struct _OFTLSKey { + struct objc_hashtable *table; + struct _OFTLSKey *next, *previous; +} *OFTLSKey; +#endif + +#ifdef __cplusplus +extern "C" { +#endif +extern int OFTLSKeyNew(OFTLSKey *key); +extern int OFTLSKeyFree(OFTLSKey key); +#ifdef __cplusplus +} +#endif + +/* TLS keys are inlined for performance. */ + +#if defined(OF_HAVE_PTHREADS) +static OF_INLINE void * +OFTLSKeyGet(OFTLSKey key) +{ + return pthread_getspecific(key); +} + +static OF_INLINE int +OFTLSKeySet(OFTLSKey key, void *ptr) +{ + return pthread_setspecific(key, ptr); +} +#elif defined(OF_WINDOWS) +static OF_INLINE void * +OFTLSKeyGet(OFTLSKey key) +{ + return TlsGetValue(key); +} + +static OF_INLINE int +OFTLSKeySet(OFTLSKey key, void *ptr) +{ + return (TlsSetValue(key, ptr) ? 0 : EINVAL); +} +#elif defined(OF_MORPHOS) +static OF_INLINE void * +OFTLSKeyGet(OFTLSKey key) +{ + return (void *)TLSGetValue(key); +} + +static OF_INLINE int +OFTLSKeySet(OFTLSKey key, void *ptr) +{ + return (TLSSetValue(key, (APTR)ptr) ? 0 : EINVAL); +} +#elif defined(OF_AMIGAOS) +/* Those are too big too inline. */ +# ifdef __cplusplus +extern "C" { +# endif +extern void *OFTLSKeyGet(OFTLSKey key); +extern int OFTLSKeySet(OFTLSKey key, void *ptr); +# ifdef __cplusplus +} +# endif +#endif ADDED src/OFTLSKey.m Index: src/OFTLSKey.m ================================================================== --- src/OFTLSKey.m +++ src/OFTLSKey.m @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#include "platform.h" + +#if defined(OF_HAVE_PTHREADS) +# include "platform/posix/OFTLSKey.m" +#elif defined(OF_WINDOWS) +# include "platform/windows/OFTLSKey.m" +#elif defined(OF_MORPHOS) +# include "platform/morphos/OFTLSKey.m" +#elif defined(OF_AMIGAOS) +# include "platform/amiga/OFTLSKey.m" +#endif Index: src/OFTarArchive.h ================================================================== --- src/OFTarArchive.h +++ src/OFTarArchive.h @@ -29,23 +29,23 @@ */ OF_SUBCLASSING_RESTRICTED @interface OFTarArchive: OFObject { OFStream *_stream; - enum { - OF_TAR_ARCHIVE_MODE_READ, - OF_TAR_ARCHIVE_MODE_WRITE, - OF_TAR_ARCHIVE_MODE_APPEND + enum OFTarArchiveMode { + OFTarArchiveModeRead, + OFTarArchiveModeWrite, + OFTarArchiveModeAppend } _mode; - of_string_encoding_t _encoding; + OFStringEncoding _encoding; OFStream *_Nullable _lastReturnedStream; } /** * @brief The encoding to use for the archive. Defaults to UTF-8. */ -@property (nonatomic) of_string_encoding_t encoding; +@property (nonatomic) OFStringEncoding encoding; /** * @brief A stream for reading the current entry. * * @note This is only available in read mode. Index: src/OFTarArchive.m ================================================================== --- src/OFTarArchive.m +++ src/OFTarArchive.m @@ -84,19 +84,19 @@ @try { _stream = [stream retain]; if ([mode isEqual: @"r"]) - _mode = OF_TAR_ARCHIVE_MODE_READ; + _mode = OFTarArchiveModeRead; else if ([mode isEqual: @"w"]) - _mode = OF_TAR_ARCHIVE_MODE_WRITE; + _mode = OFTarArchiveModeWrite; else if ([mode isEqual: @"a"]) - _mode = OF_TAR_ARCHIVE_MODE_APPEND; + _mode = OFTarArchiveModeAppend; else @throw [OFInvalidArgumentException exception]; - if (_mode == OF_TAR_ARCHIVE_MODE_APPEND) { + if (_mode == OFTarArchiveModeAppend) { uint32_t buffer[1024 / sizeof(uint32_t)]; bool empty = true; if (![_stream isKindOfClass: [OFSeekableStream class]]) @throw [OFInvalidArgumentException exception]; @@ -114,11 +114,11 @@ [(OFSeekableStream *)stream seekToOffset: -1024 whence: SEEK_END]; } - _encoding = OF_STRING_ENCODING_UTF_8; + _encoding = OFStringEncodingUTF8; } @catch (id e) { [self release]; @throw e; } @@ -156,11 +156,11 @@ { OFTarArchiveEntry *entry; uint32_t buffer[512 / sizeof(uint32_t)]; bool empty = true; - if (_mode != OF_TAR_ARCHIVE_MODE_READ) + if (_mode != OFTarArchiveModeRead) @throw [OFInvalidArgumentException exception]; [(OFTarArchiveFileReadStream *)_lastReturnedStream of_skip]; @try { [_lastReturnedStream close]; @@ -200,11 +200,11 @@ return entry; } - (OFStream *)streamForReadingCurrentEntry { - if (_mode != OF_TAR_ARCHIVE_MODE_READ) + if (_mode != OFTarArchiveModeRead) @throw [OFInvalidArgumentException exception]; if (_lastReturnedStream == nil) @throw [OFInvalidArgumentException exception]; @@ -214,12 +214,11 @@ - (OFStream *)streamForWritingEntry: (OFTarArchiveEntry *)entry { void *pool; - if (_mode != OF_TAR_ARCHIVE_MODE_WRITE && - _mode != OF_TAR_ARCHIVE_MODE_APPEND) + if (_mode != OFTarArchiveModeWrite && _mode != OFTarArchiveModeAppend) @throw [OFInvalidArgumentException exception]; pool = objc_autoreleasePoolPush(); @try { @@ -253,16 +252,14 @@ /* Might have already been closed by the user - that's fine. */ } [_lastReturnedStream release]; _lastReturnedStream = nil; - if (_mode == OF_TAR_ARCHIVE_MODE_WRITE || - _mode == OF_TAR_ARCHIVE_MODE_APPEND) { + if (_mode == OFTarArchiveModeWrite || _mode == OFTarArchiveModeAppend) { char buffer[1024]; memset(buffer, '\0', 1024); - [_stream writeBuffer: buffer - length: 1024]; + [_stream writeBuffer: buffer length: 1024]; } [_stream release]; _stream = nil; } @@ -360,14 +357,14 @@ { if (_stream == nil || _skipped) return; if ([_stream isKindOfClass: [OFSeekableStream class]] && - _toRead <= INT64_MAX && (of_offset_t)_toRead == (int64_t)_toRead) { + _toRead <= INT64_MAX && (OFFileOffset)_toRead == (int64_t)_toRead) { uint64_t size; - [(OFSeekableStream *)_stream seekToOffset: (of_offset_t)_toRead + [(OFSeekableStream *)_stream seekToOffset: (OFFileOffset)_toRead whence: SEEK_CUR]; _toRead = 0; size = _entry.size; Index: src/OFTarArchiveEntry+Private.h ================================================================== --- src/OFTarArchiveEntry+Private.h +++ src/OFTarArchiveEntry+Private.h @@ -21,12 +21,12 @@ @class OFStream; OF_DIRECT_MEMBERS @interface OFTarArchiveEntry () - (instancetype)of_initWithHeader: (unsigned char [_Nonnull 512])header - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding OF_METHOD_FAMILY(init); - (void)of_writeToStream: (OFStream *)stream - encoding: (of_string_encoding_t)encoding; + encoding: (OFStringEncoding)encoding; @end OF_ASSUME_NONNULL_END Index: src/OFTarArchiveEntry.h ================================================================== --- src/OFTarArchiveEntry.h +++ src/OFTarArchiveEntry.h @@ -22,28 +22,28 @@ @class OFDate; /** * @brief The type of the archive entry. */ -typedef enum of_tar_archive_entry_type_t { +typedef enum { /** Normal file */ - OF_TAR_ARCHIVE_ENTRY_TYPE_FILE = '0', + OFTarArchiveEntryTypeFile = '0', /** Hard link */ - OF_TAR_ARCHIVE_ENTRY_TYPE_LINK = '1', + OFTarArchiveEntryTypeLink = '1', /** Symbolic link */ - OF_TAR_ARCHIVE_ENTRY_TYPE_SYMLINK = '2', + OFTarArchiveEntryTypeSymlink = '2', /** Character device */ - OF_TAR_ARCHIVE_ENTRY_TYPE_CHARACTER_DEVICE = '3', + OFTarArchiveEntryTypeCharacterDevice = '3', /** Block device */ - OF_TAR_ARCHIVE_ENTRY_TYPE_BLOCK_DEVICE = '4', + OFTarArchiveEntryTypeBlockDevice = '4', /** Directory */ - OF_TAR_ARCHIVE_ENTRY_TYPE_DIRECTORY = '5', + OFTarArchiveEntryTypeDirectory = '5', /** FIFO */ - OF_TAR_ARCHIVE_ENTRY_TYPE_FIFO = '6', + OFTarArchiveEntryTypeFIFO = '6', /** Contiguous file */ - OF_TAR_ARCHIVE_ENTRY_TYPE_CONTIGUOUS_FILE = '7', -} of_tar_archive_entry_type_t; + OFTarArchiveEntryTypeContiguousFile = '7', +} OFTarArchiveEntryType; /** * @class OFTarArchiveEntry OFTarArchiveEntry.h ObjFW/OFTarArchiveEntry.h * * @brief A class which represents an entry of a tar archive. @@ -53,11 +53,11 @@ OFString *_fileName; unsigned long _mode; unsigned long long _size; unsigned long _UID, _GID; OFDate *_modificationDate; - of_tar_archive_entry_type_t _type; + OFTarArchiveEntryType _type; OFString *_Nullable _targetFileName; OFString *_Nullable _owner, *_Nullable _group; unsigned long _deviceMajor, _deviceMinor; OF_RESERVE_IVARS(OFTarArchiveEntry, 4) } @@ -93,13 +93,13 @@ @property (readonly, retain, nonatomic) OFDate *modificationDate; /** * @brief The type of the archive entry. * - * See @ref of_tar_archive_entry_type_t. + * See @ref OFTarArchiveEntryType. */ -@property (readonly, nonatomic) of_tar_archive_entry_type_t type; +@property (readonly, nonatomic) OFTarArchiveEntryType type; /** * @brief The file name of the target (for a hard link or symbolic link). */ @property OF_NULLABLE_PROPERTY (readonly, copy, nonatomic) Index: src/OFTarArchiveEntry.m ================================================================== --- src/OFTarArchiveEntry.m +++ src/OFTarArchiveEntry.m @@ -23,11 +23,11 @@ #import "OFOutOfRangeException.h" static OFString * stringFromBuffer(const unsigned char *buffer, size_t length, - of_string_encoding_t encoding) + OFStringEncoding encoding) { for (size_t i = 0; i < length; i++) if (buffer[i] == '\0') length = i; @@ -36,11 +36,11 @@ length: length]; } static void stringToBuffer(unsigned char *buffer, OFString *string, size_t length, - of_string_encoding_t encoding) + OFStringEncoding encoding) { size_t cStringLength = [string cStringLengthWithEncoding: encoding]; if (cStringLength > length) @throw [OFOutOfRangeException exception]; @@ -63,11 +63,11 @@ if (buffer[0] == 0x80) { for (size_t i = 1; i < length; i++) value = (value << 8) | buffer[i]; } else value = [stringFromBuffer(buffer, length, - OF_STRING_ENCODING_ASCII) unsignedLongLongValueWithBase: 8]; + OFStringEncodingASCII) unsignedLongLongValueWithBase: 8]; if (value > max) @throw [OFOutOfRangeException exception]; return value; @@ -83,11 +83,11 @@ { OF_INVALID_INIT_METHOD } - (instancetype)of_initWithHeader: (unsigned char [512])header - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { self = [super init]; @try { void *pool = objc_autoreleasePoolPush(); @@ -102,20 +102,20 @@ header + 116, 8, ULONG_MAX); _size = (unsigned long long)octalValueFromBuffer( header + 124, 12, ULLONG_MAX); _modificationDate = [[OFDate alloc] initWithTimeIntervalSince1970: - (of_time_interval_t)octalValueFromBuffer( + (OFTimeInterval)octalValueFromBuffer( header + 136, 12, ULLONG_MAX)]; _type = header[156]; targetFileName = stringFromBuffer(header + 157, 100, encoding); if (targetFileName.length > 0) _targetFileName = [targetFileName copy]; if (_type == '\0') - _type = OF_TAR_ARCHIVE_ENTRY_TYPE_FILE; + _type = OFTarArchiveEntryTypeFile; if (memcmp(header + 257, "ustar\0" "00", 8) == 0) { OFString *prefix; _owner = [stringFromBuffer(header + 265, 32, encoding) @@ -151,11 +151,11 @@ { self = [super init]; @try { _fileName = [fileName copy]; - _type = OF_TAR_ARCHIVE_ENTRY_TYPE_FILE; + _type = OFTarArchiveEntryTypeFile; _mode = 0644; } @catch (id e) { [self release]; @throw e; } @@ -230,11 +230,11 @@ - (OFDate *)modificationDate { return _modificationDate; } -- (of_tar_archive_entry_type_t)type +- (OFTarArchiveEntryType)type { return _type; } - (OFString *)targetFileName @@ -288,33 +288,33 @@ return [ret autorelease]; } - (void)of_writeToStream: (OFStream *)stream - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { unsigned char buffer[512]; unsigned long long modificationDate; uint16_t checksum = 0; stringToBuffer(buffer, _fileName, 100, encoding); stringToBuffer(buffer + 100, [OFString stringWithFormat: @"%06" PRIo16 " ", _mode], 8, - OF_STRING_ENCODING_ASCII); + OFStringEncodingASCII); stringToBuffer(buffer + 108, [OFString stringWithFormat: @"%06" PRIo16 " ", _UID], 8, - OF_STRING_ENCODING_ASCII); + OFStringEncodingASCII); stringToBuffer(buffer + 116, [OFString stringWithFormat: @"%06" PRIo16 " ", _GID], 8, - OF_STRING_ENCODING_ASCII); + OFStringEncodingASCII); stringToBuffer(buffer + 124, [OFString stringWithFormat: @"%011" PRIo64 " ", _size], 12, - OF_STRING_ENCODING_ASCII); + OFStringEncodingASCII); modificationDate = _modificationDate.timeIntervalSince1970; stringToBuffer(buffer + 136, [OFString stringWithFormat: @"%011llo", modificationDate], - 12, OF_STRING_ENCODING_ASCII); + 12, OFStringEncodingASCII); /* * During checksumming, the checksum field is expected to be set to 8 * spaces. */ @@ -327,21 +327,21 @@ memcpy(buffer + 257, "ustar\0" "00", 8); stringToBuffer(buffer + 265, _owner, 32, encoding); stringToBuffer(buffer + 297, _group, 32, encoding); stringToBuffer(buffer + 329, [OFString stringWithFormat: @"%06" PRIo32 " ", _deviceMajor], 8, - OF_STRING_ENCODING_ASCII); + OFStringEncodingASCII); stringToBuffer(buffer + 337, [OFString stringWithFormat: @"%06" PRIo32 " ", _deviceMinor], 8, - OF_STRING_ENCODING_ASCII); + OFStringEncodingASCII); memset(buffer + 345, '\0', 155 + 12); /* Fill in the checksum */ for (size_t i = 0; i < 500; i++) checksum += buffer[i]; stringToBuffer(buffer + 148, [OFString stringWithFormat: @"%06" PRIo16, checksum], 7, - OF_STRING_ENCODING_ASCII); + OFStringEncodingASCII); [stream writeBuffer: buffer length: sizeof(buffer)]; } @end Index: src/OFThread.h ================================================================== --- src/OFThread.h +++ src/OFThread.h @@ -14,13 +14,12 @@ */ #include #import "OFObject.h" - #ifdef OF_HAVE_THREADS -# import "thread.h" +# import "OFPlainThread.h" #endif OF_ASSUME_NONNULL_BEGIN /** @file */ @@ -36,11 +35,11 @@ /** * @brief A block to be executed in a new thread. * * @return The object which should be returned when the thread is joined */ -typedef id _Nullable (^of_thread_block_t)(void); +typedef id _Nullable (^OFThreadBlock)(void); #endif /** * @class OFThread OFThread.h ObjFW/OFThread.h * @@ -62,22 +61,22 @@ @interface OFThread: OFObject #ifdef OF_HAVE_THREADS { @private - of_thread_t _thread; - of_thread_attr_t _attr; - enum of_thread_running { - OF_THREAD_NOT_RUNNING, - OF_THREAD_RUNNING, - OF_THREAD_WAITING_FOR_JOIN + OFPlainThread _thread; + OFPlainThreadAttributes _attr; + enum OFThreadState { + OFThreadStateNotRunning, + OFThreadStateRunning, + OFThreadStateWaitingForJoin } _running; # ifndef OF_OBJFW_RUNTIME void *_pool; # endif # ifdef OF_HAVE_BLOCKS - of_thread_block_t _Nullable _threadBlock; + OFThreadBlock _Nullable _threadBlock; # endif jmp_buf _exitEnv; id _returnValue; bool _supportsSockets; OFRunLoop *_Nullable _runLoop; @@ -117,12 +116,11 @@ # ifdef OF_HAVE_BLOCKS /** * @brief The block to execute in the thread. */ -@property OF_NULLABLE_PROPERTY (readonly, nonatomic) - of_thread_block_t threadBlock; +@property OF_NULLABLE_PROPERTY (readonly, nonatomic) OFThreadBlock threadBlock; # endif /** * @brief The run loop for the thread. */ @@ -167,11 +165,11 @@ * @brief Creates a new thread with the specified block. * * @param threadBlock A block which is executed by the thread * @return A new, autoreleased thread */ -+ (instancetype)threadWithThreadBlock: (of_thread_block_t)threadBlock; ++ (instancetype)threadWithThreadBlock: (OFThreadBlock)threadBlock; # endif /** * @brief Returns the current thread. * @@ -215,11 +213,11 @@ * @brief Suspends execution of the current thread for the specified time * interval. * * @param timeInterval The number of seconds to sleep */ -+ (void)sleepForTimeInterval: (of_time_interval_t)timeInterval; ++ (void)sleepForTimeInterval: (OFTimeInterval)timeInterval; /** * @brief Suspends execution of the current thread until the specified date. * * @param date The date to wait for @@ -267,11 +265,11 @@ * @brief Initializes an already allocated thread with the specified block. * * @param threadBlock A block which is executed by the thread * @return An initialized OFThread. */ -- (instancetype)initWithThreadBlock: (of_thread_block_t)threadBlock; +- (instancetype)initWithThreadBlock: (OFThreadBlock)threadBlock; # endif /** * @brief The main routine of the thread. You need to reimplement this! * Index: src/OFThread.m ================================================================== --- src/OFThread.m +++ src/OFThread.m @@ -46,10 +46,13 @@ # include <3ds/svc.h> #endif #import "OFThread.h" #import "OFThread+Private.h" +#ifdef OF_HAVE_ATOMIC_OPS +# import "OFAtomic.h" +#endif #import "OFDate.h" #import "OFDictionary.h" #ifdef OF_HAVE_SOCKETS # import "OFDNSResolver.h" #endif @@ -75,21 +78,17 @@ # import "OFThreadJoinFailedException.h" # import "OFThreadStartFailedException.h" # import "OFThreadStillRunningException.h" #endif -#ifdef OF_HAVE_ATOMIC_OPS -# import "atomic.h" -#endif - #if defined(OF_HAVE_THREADS) -# import "tlskey.h" +# import "OFTLSKey.h" # if defined(OF_AMIGAOS) && defined(OF_HAVE_SOCKETS) -# import "socket.h" +# import "OFSocket.h" # endif -static of_tlskey_t threadSelfKey; +static OFTLSKey threadSelfKey; static OFThread *mainThread; #elif defined(OF_HAVE_SOCKETS) static OFDNSResolver *DNSResolver; #endif @@ -99,28 +98,28 @@ callMain(id object) { OFThread *thread = (OFThread *)object; OFString *name; - if (of_tlskey_set(threadSelfKey, thread) != 0) + if (OFTLSKeySet(threadSelfKey, thread) != 0) @throw [OFInitializationFailedException exceptionWithClass: thread.class]; #ifndef OF_OBJFW_RUNTIME thread->_pool = objc_autoreleasePoolPush(); #endif name = thread.name; if (name != nil) - of_thread_set_name( + OFSetThreadName( [name cStringWithEncoding: [OFLocale encoding]]); else - of_thread_set_name(object_getClassName(thread)); + OFSetThreadName(object_getClassName(thread)); #if defined(OF_AMIGAOS) && defined(OF_HAVE_SOCKETS) if (thread.supportsSockets) - if (!of_socket_init()) + if (!OFSocketInit()) @throw [OFInitializationFailedException exceptionWithClass: thread.class]; #endif /* @@ -144,14 +143,14 @@ objc_autoreleasePoolPop(thread->_pool); #endif #if defined(OF_AMIGAOS) && !defined(OF_MORPHOS) && defined(OF_HAVE_SOCKETS) if (thread.supportsSockets) - of_socket_deinit(); + OFSocketDeinit(); #endif - thread->_running = OF_THREAD_WAITING_FOR_JOIN; + thread->_running = OFThreadStateWaitingForJoin; [thread release]; } @synthesize name = _name; @@ -162,11 +161,11 @@ + (void)initialize { if (self != [OFThread class]) return; - if (of_tlskey_new(&threadSelfKey) != 0) + if (OFTLSKeyNew(&threadSelfKey) != 0) @throw [OFInitializationFailedException exceptionWithClass: self]; } + (instancetype)thread @@ -173,19 +172,19 @@ { return [[[self alloc] init] autorelease]; } # ifdef OF_HAVE_BLOCKS -+ (instancetype)threadWithThreadBlock: (of_thread_block_t)threadBlock ++ (instancetype)threadWithThreadBlock: (OFThreadBlock)threadBlock { return [[[self alloc] initWithThreadBlock: threadBlock] autorelease]; } # endif + (OFThread *)currentThread { - return of_tlskey_get(threadSelfKey); + return OFTLSKeyGet(threadSelfKey); } + (OFThread *)mainThread { return mainThread; @@ -194,16 +193,16 @@ + (bool)isMainThread { if (mainThread == nil) return false; - return (of_tlskey_get(threadSelfKey) == mainThread); + return (OFTLSKeyGet(threadSelfKey) == mainThread); } + (OFMutableDictionary *)threadDictionary { - OFThread *thread = of_tlskey_get(threadSelfKey); + OFThread *thread = OFTLSKeyGet(threadSelfKey); if (thread == nil) return nil; if (thread->_threadDictionary == nil) @@ -215,11 +214,11 @@ #ifdef OF_HAVE_SOCKETS + (OFDNSResolver *)DNSResolver { # ifdef OF_HAVE_THREADS - OFThread *thread = of_tlskey_get(threadSelfKey); + OFThread *thread = OFTLSKeyGet(threadSelfKey); if (thread == nil) return nil; if (thread->_DNSResolver == nil) @@ -233,11 +232,11 @@ return DNSResolver; # endif } #endif -+ (void)sleepForTimeInterval: (of_time_interval_t)timeInterval ++ (void)sleepForTimeInterval: (OFTimeInterval)timeInterval { if (timeInterval < 0) return; #if defined(OF_WINDOWS) @@ -317,16 +316,16 @@ OF_UNREACHABLE } + (void)terminateWithObject: (id)object { - OFThread *thread = of_tlskey_get(threadSelfKey); + OFThread *thread = OFTLSKeyGet(threadSelfKey); if (thread == mainThread) @throw [OFInvalidArgumentException exception]; - OF_ENSURE(thread != nil); + OFEnsure(thread != nil); thread->_returnValue = [object retain]; longjmp(thread->_exitEnv, 1); OF_UNREACHABLE @@ -335,14 +334,14 @@ + (void)setName: (OFString *)name { [OFThread currentThread].name = name; if (name != nil) - of_thread_set_name( + OFSetThreadName( [name cStringWithEncoding: [OFLocale encoding]]); else - of_thread_set_name(class_getName([self class])); + OFSetThreadName(class_getName([self class])); } + (OFString *)name { return [OFThread currentThread].name; @@ -349,24 +348,24 @@ } + (void)of_createMainThread { mainThread = [[OFThread alloc] init]; - mainThread->_thread = of_thread_current(); - mainThread->_running = OF_THREAD_RUNNING; + mainThread->_thread = OFCurrentPlainThread(); + mainThread->_running = OFThreadStateRunning; - if (of_tlskey_set(threadSelfKey, mainThread) != 0) + if (OFTLSKeySet(threadSelfKey, mainThread) != 0) @throw [OFInitializationFailedException exceptionWithClass: self]; } - (instancetype)init { self = [super init]; @try { - if (of_thread_attr_init(&_attr) != 0) + if (OFPlainThreadAttributesInit(&_attr) != 0) @throw [OFInitializationFailedException exceptionWithClass: self.class]; } @catch (id e) { [self release]; @throw e; @@ -374,11 +373,11 @@ return self; } # ifdef OF_HAVE_BLOCKS -- (instancetype)initWithThreadBlock: (of_thread_block_t)threadBlock +- (instancetype)initWithThreadBlock: (OFThreadBlock)threadBlock { self = [self init]; @try { _threadBlock = [threadBlock copy]; @@ -415,24 +414,24 @@ - (void)start { int error; - if (_running == OF_THREAD_RUNNING) + if (_running == OFThreadStateRunning) @throw [OFThreadStillRunningException exceptionWithThread: self]; - if (_running == OF_THREAD_WAITING_FOR_JOIN) { - of_thread_detach(_thread); + if (_running == OFThreadStateWaitingForJoin) { + OFPlainThreadDetach(_thread); [_returnValue release]; } [self retain]; - _running = OF_THREAD_RUNNING; + _running = OFThreadStateRunning; - if ((error = of_thread_new(&_thread, [_name cStringWithEncoding: + if ((error = OFPlainThreadNew(&_thread, [_name cStringWithEncoding: [OFLocale encoding]], callMain, self, &_attr)) != 0) { [self release]; @throw [OFThreadStartFailedException exceptionWithThread: self errNo: error]; @@ -441,20 +440,20 @@ - (id)join { int error; - if (_running == OF_THREAD_NOT_RUNNING) + if (_running == OFThreadStateNotRunning) @throw [OFThreadJoinFailedException exceptionWithThread: self errNo: EINVAL]; - if ((error = of_thread_join(_thread)) != 0) + if ((error = OFPlainThreadJoin(_thread)) != 0) @throw [OFThreadJoinFailedException exceptionWithThread: self errNo: error]; - _running = OF_THREAD_NOT_RUNNING; + _running = OFThreadStateNotRunning; return _returnValue; } - (id)copy @@ -466,11 +465,12 @@ { # if defined(OF_HAVE_ATOMIC_OPS) && !defined(__clang_analyzer__) if (_runLoop == nil) { OFRunLoop *tmp = [[OFRunLoop alloc] init]; - if (!of_atomic_ptr_cmpswap((void **)&_runLoop, nil, tmp)) + if (!OFAtomicPointerCompareAndSwap( + (void **)&_runLoop, nil, tmp)) [tmp release]; } # else @synchronized (self) { if (_runLoop == nil) @@ -486,11 +486,11 @@ return _attr.priority; } - (void)setPriority: (float)priority { - if (_running == OF_THREAD_RUNNING) + if (_running == OFThreadStateRunning) @throw [OFThreadStillRunningException exceptionWithThread: self]; _attr.priority = priority; } @@ -500,11 +500,11 @@ return _attr.stackSize; } - (void)setStackSize: (size_t)stackSize { - if (_running == OF_THREAD_RUNNING) + if (_running == OFThreadStateRunning) @throw [OFThreadStillRunningException exceptionWithThread: self]; _attr.stackSize = stackSize; } @@ -514,29 +514,29 @@ return _supportsSockets; } - (void)setSupportsSockets: (bool)supportsSockets { - if (_running == OF_THREAD_RUNNING) + if (_running == OFThreadStateRunning) @throw [OFThreadStillRunningException exceptionWithThread: self]; _supportsSockets = supportsSockets; } - (void)dealloc { - if (_running == OF_THREAD_RUNNING) + if (_running == OFThreadStateRunning) @throw [OFThreadStillRunningException exceptionWithThread: self]; /* * We should not be running anymore, but call detach in order to free * the resources. */ - if (_running == OF_THREAD_WAITING_FOR_JOIN) - of_thread_detach(_thread); + if (_running == OFThreadStateWaitingForJoin) + OFPlainThreadDetach(_thread); [_returnValue release]; # ifdef OF_HAVE_BLOCKS [_threadBlock release]; # endif Index: src/OFThreadPool.h ================================================================== --- src/OFThreadPool.h +++ src/OFThreadPool.h @@ -21,11 +21,11 @@ #ifdef OF_HAVE_BLOCKS /** * @brief A block for a job which should be executed in a thread pool. */ -typedef void (^of_thread_pool_block_t)(void); +typedef void (^OFThreadPoolBlock)(void); #endif @class OFCondition; @class OFList OF_GENERIC(ObjectType); @class OFMutableArray OF_GENERIC(ObjectType); @@ -102,15 +102,15 @@ /** * @brief Executes the specified block as soon as a thread is ready. * * @param block The block to execute */ -- (void)dispatchWithBlock: (of_thread_pool_block_t)block; +- (void)dispatchWithBlock: (OFThreadPoolBlock)block; #endif /** * @brief Waits until all jobs are done. */ - (void)waitUntilDone; @end OF_ASSUME_NONNULL_END Index: src/OFThreadPool.m ================================================================== --- src/OFThreadPool.m +++ src/OFThreadPool.m @@ -29,19 +29,19 @@ { id _target; SEL _selector; id _object; #ifdef OF_HAVE_BLOCKS - of_thread_pool_block_t _block; + OFThreadPoolBlock _block; #endif } - (instancetype)initWithTarget: (id)target selector: (SEL)selector object: (id)object; #ifdef OF_HAVE_BLOCKS -- (instancetype)initWithBlock: (of_thread_pool_block_t)block; +- (instancetype)initWithBlock: (OFThreadPoolBlock)block; #endif - (void)perform; @end @implementation OFThreadPoolJob @@ -62,11 +62,11 @@ return self; } #ifdef OF_HAVE_BLOCKS -- (instancetype)initWithBlock: (of_thread_pool_block_t)block +- (instancetype)initWithBlock: (OFThreadPoolBlock)block { self = [super init]; @try { _block = [block copy]; @@ -160,32 +160,32 @@ for (;;) { OFThreadPoolJob *job; [_queueCondition lock]; @try { - of_list_object_t *listObject; + OFListItem listItem; if (_terminate) { objc_autoreleasePoolPop(pool); return nil; } - listObject = _queue.firstListObject; + listItem = _queue.firstListItem; - while (listObject == NULL) { + while (listItem == NULL) { [_queueCondition wait]; if (_terminate) { objc_autoreleasePoolPop(pool); return nil; } - listObject = _queue.firstListObject; + listItem = _queue.firstListItem; } - job = [[listObject->object retain] autorelease]; - [_queue removeListObject: listObject]; + job = [[OFListItemObject(listItem) retain] autorelease]; + [_queue removeListItem: listItem]; } @finally { [_queueCondition unlock]; } if (_terminate) { @@ -340,11 +340,11 @@ [job release]; } } #ifdef OF_HAVE_BLOCKS -- (void)dispatchWithBlock: (of_thread_pool_block_t)block +- (void)dispatchWithBlock: (OFThreadPoolBlock)block { OFThreadPoolJob *job = [[OFThreadPoolJob alloc] initWithBlock: block]; @try { [self of_dispatchJob: job]; } @finally { Index: src/OFTimer+Private.h ================================================================== --- src/OFTimer+Private.h +++ src/OFTimer+Private.h @@ -18,9 +18,9 @@ OF_ASSUME_NONNULL_BEGIN OF_DIRECT_MEMBERS @interface OFTimer () - (void)of_setInRunLoop: (nullable OFRunLoop *)runLoop - mode: (nullable of_run_loop_mode_t)mode; + mode: (nullable OFRunLoopMode)mode; @end OF_ASSUME_NONNULL_END Index: src/OFTimer.h ================================================================== --- src/OFTimer.h +++ src/OFTimer.h @@ -30,11 +30,11 @@ /** * @brief A block to execute when a timer fires. * * @param timer The timer which fired */ -typedef void (^of_timer_block_t)(OFTimer *timer); +typedef void (^OFTimerBlock)(OFTimer *timer); #endif /** * @class OFTimer OFTimer.h ObjFW/OFTimer.h * @@ -42,33 +42,33 @@ */ OF_SUBCLASSING_RESTRICTED @interface OFTimer: OFObject { OFDate *_fireDate; - of_time_interval_t _interval; + OFTimeInterval _interval; id _target; id _Nullable _object1, _object2, _object3, _object4; SEL _selector; unsigned char _arguments; bool _repeats; #ifdef OF_HAVE_BLOCKS - of_timer_block_t _block; + OFTimerBlock _block; #endif bool _valid; #ifdef OF_HAVE_THREADS OFCondition *_condition; bool _done; #endif OFRunLoop *_Nullable _inRunLoop; - of_run_loop_mode_t _Nullable _inRunLoopMode; + OFRunLoopMode _Nullable _inRunLoopMode; } /** * @brief The time interval in which the timer will repeat, if it is a * repeating timer. */ -@property (readonly, nonatomic) of_time_interval_t timeInterval; +@property (readonly, nonatomic) OFTimeInterval timeInterval; /** * @brief Whether the timer is repeating. */ @property (readonly, nonatomic, getter=isRepeating) bool repeating; @@ -95,11 +95,11 @@ * @param target The target on which to call the selector * @param selector The selector to call on the target * @param repeats Whether the timer repeats after it has been executed * @return A new, autoreleased timer */ -+ (instancetype)scheduledTimerWithTimeInterval: (of_time_interval_t)timeInterval ++ (instancetype)scheduledTimerWithTimeInterval: (OFTimeInterval)timeInterval target: (id)target selector: (SEL)selector repeats: (bool)repeats; /** @@ -110,11 +110,11 @@ * @param selector The selector to call on the target * @param object An object to pass when calling the selector on the target * @param repeats Whether the timer repeats after it has been executed * @return A new, autoreleased timer */ -+ (instancetype)scheduledTimerWithTimeInterval: (of_time_interval_t)timeInterval ++ (instancetype)scheduledTimerWithTimeInterval: (OFTimeInterval)timeInterval target: (id)target selector: (SEL)selector object: (nullable id)object repeats: (bool)repeats; @@ -129,11 +129,11 @@ * @param object2 The second object to pass when calling the selector on the * target * @param repeats Whether the timer repeats after it has been executed * @return A new, autoreleased timer */ -+ (instancetype)scheduledTimerWithTimeInterval: (of_time_interval_t)timeInterval ++ (instancetype)scheduledTimerWithTimeInterval: (OFTimeInterval)timeInterval target: (id)target selector: (SEL)selector object: (nullable id)object1 object: (nullable id)object2 repeats: (bool)repeats; @@ -151,11 +151,11 @@ * @param object3 The third object to pass when calling the selector on the * target * @param repeats Whether the timer repeats after it has been executed * @return A new, autoreleased timer */ -+ (instancetype)scheduledTimerWithTimeInterval: (of_time_interval_t)timeInterval ++ (instancetype)scheduledTimerWithTimeInterval: (OFTimeInterval)timeInterval target: (id)target selector: (SEL)selector object: (nullable id)object1 object: (nullable id)object2 object: (nullable id)object3 @@ -176,11 +176,11 @@ * @param object4 The fourth object to pass when calling the selector on the * target * @param repeats Whether the timer repeats after it has been executed * @return A new, autoreleased timer */ -+ (instancetype)scheduledTimerWithTimeInterval: (of_time_interval_t)timeInterval ++ (instancetype)scheduledTimerWithTimeInterval: (OFTimeInterval)timeInterval target: (id)target selector: (SEL)selector object: (nullable id)object1 object: (nullable id)object2 object: (nullable id)object3 @@ -194,13 +194,13 @@ * @param timeInterval The time interval after which the timer should be fired * @param repeats Whether the timer repeats after it has been executed * @param block The block to invoke when the timer fires * @return A new, autoreleased timer */ -+ (instancetype)scheduledTimerWithTimeInterval: (of_time_interval_t)timeInterval ++ (instancetype)scheduledTimerWithTimeInterval: (OFTimeInterval)timeInterval repeats: (bool)repeats - block: (of_timer_block_t)block; + block: (OFTimerBlock)block; #endif /** * @brief Creates a new timer with the specified time interval. * @@ -208,11 +208,11 @@ * @param target The target on which to call the selector * @param selector The selector to call on the target * @param repeats Whether the timer repeats after it has been executed * @return A new, autoreleased timer */ -+ (instancetype)timerWithTimeInterval: (of_time_interval_t)timeInterval ++ (instancetype)timerWithTimeInterval: (OFTimeInterval)timeInterval target: (id)target selector: (SEL)selector repeats: (bool)repeats; /** @@ -223,11 +223,11 @@ * @param selector The selector to call on the target * @param object An object to pass when calling the selector on the target * @param repeats Whether the timer repeats after it has been executed * @return A new, autoreleased timer */ -+ (instancetype)timerWithTimeInterval: (of_time_interval_t)timeInterval ++ (instancetype)timerWithTimeInterval: (OFTimeInterval)timeInterval target: (id)target selector: (SEL)selector object: (nullable id)object repeats: (bool)repeats; @@ -242,11 +242,11 @@ * @param object2 The second object to pass when calling the selector on the * target * @param repeats Whether the timer repeats after it has been executed * @return A new, autoreleased timer */ -+ (instancetype)timerWithTimeInterval: (of_time_interval_t)timeInterval ++ (instancetype)timerWithTimeInterval: (OFTimeInterval)timeInterval target: (id)target selector: (SEL)selector object: (nullable id)object1 object: (nullable id)object2 repeats: (bool)repeats; @@ -264,11 +264,11 @@ * @param object3 The third object to pass when calling the selector on the * target * @param repeats Whether the timer repeats after it has been executed * @return A new, autoreleased timer */ -+ (instancetype)timerWithTimeInterval: (of_time_interval_t)timeInterval ++ (instancetype)timerWithTimeInterval: (OFTimeInterval)timeInterval target: (id)target selector: (SEL)selector object: (nullable id)object1 object: (nullable id)object2 object: (nullable id)object3 @@ -289,11 +289,11 @@ * @param object4 The fourth object to pass when calling the selector on the * target * @param repeats Whether the timer repeats after it has been executed * @return A new, autoreleased timer */ -+ (instancetype)timerWithTimeInterval: (of_time_interval_t)timeInterval ++ (instancetype)timerWithTimeInterval: (OFTimeInterval)timeInterval target: (id)target selector: (SEL)selector object: (nullable id)object1 object: (nullable id)object2 object: (nullable id)object3 @@ -307,13 +307,13 @@ * @param timeInterval The time interval after which the timer should be fired * @param repeats Whether the timer repeats after it has been executed * @param block The block to invoke when the timer fires * @return A new, autoreleased timer */ -+ (instancetype)timerWithTimeInterval: (of_time_interval_t)timeInterval ++ (instancetype)timerWithTimeInterval: (OFTimeInterval)timeInterval repeats: (bool)repeats - block: (of_timer_block_t)block; + block: (OFTimerBlock)block; #endif - (instancetype)init OF_UNAVAILABLE; /** @@ -327,11 +327,11 @@ * @param selector The selector to call on the target * @param repeats Whether the timer repeats after it has been executed * @return An initialized timer */ - (instancetype)initWithFireDate: (OFDate *)fireDate - interval: (of_time_interval_t)interval + interval: (OFTimeInterval)interval target: (id)target selector: (SEL)selector repeats: (bool)repeats; /** @@ -346,11 +346,11 @@ * @param object An object to pass when calling the selector on the target * @param repeats Whether the timer repeats after it has been executed * @return An initialized timer */ - (instancetype)initWithFireDate: (OFDate *)fireDate - interval: (of_time_interval_t)interval + interval: (OFTimeInterval)interval target: (id)target selector: (SEL)selector object: (nullable id)object repeats: (bool)repeats; @@ -369,11 +369,11 @@ * target * @param repeats Whether the timer repeats after it has been executed * @return An initialized timer */ - (instancetype)initWithFireDate: (OFDate *)fireDate - interval: (of_time_interval_t)interval + interval: (OFTimeInterval)interval target: (id)target selector: (SEL)selector object: (nullable id)object1 object: (nullable id)object2 repeats: (bool)repeats; @@ -395,11 +395,11 @@ * target * @param repeats Whether the timer repeats after it has been executed * @return An initialized timer */ - (instancetype)initWithFireDate: (OFDate *)fireDate - interval: (of_time_interval_t)interval + interval: (OFTimeInterval)interval target: (id)target selector: (SEL)selector object: (nullable id)object1 object: (nullable id)object2 object: (nullable id)object3 @@ -424,11 +424,11 @@ * target * @param repeats Whether the timer repeats after it has been executed * @return An initialized timer */ - (instancetype)initWithFireDate: (OFDate *)fireDate - interval: (of_time_interval_t)interval + interval: (OFTimeInterval)interval target: (id)target selector: (SEL)selector object: (nullable id)object1 object: (nullable id)object2 object: (nullable id)object3 @@ -446,22 +446,22 @@ * @param repeats Whether the timer repeats after it has been executed * @param block The block to invoke when the timer fires * @return An initialized timer */ - (instancetype)initWithFireDate: (OFDate *)fireDate - interval: (of_time_interval_t)interval + interval: (OFTimeInterval)interval repeats: (bool)repeats - block: (of_timer_block_t)block; + block: (OFTimerBlock)block; #endif /** * @brief Compares the timer to another timer. * * @param timer The timer to compare the string to * @return The result of the comparison */ -- (of_comparison_result_t)compare: (OFTimer *)timer; +- (OFComparisonResult)compare: (OFTimer *)timer; /** * @brief Fires the timer, meaning it will execute the specified selector on the * target. */ Index: src/OFTimer.m ================================================================== --- src/OFTimer.m +++ src/OFTimer.m @@ -31,11 +31,11 @@ #import "OFInvalidArgumentException.h" @implementation OFTimer @synthesize timeInterval = _interval, repeating = _repeats, valid = _valid; -+ (instancetype)scheduledTimerWithTimeInterval: (of_time_interval_t)timeInterval ++ (instancetype)scheduledTimerWithTimeInterval: (OFTimeInterval)timeInterval target: (id)target selector: (SEL)selector repeats: (bool)repeats { void *pool = objc_autoreleasePoolPush(); @@ -52,11 +52,11 @@ objc_autoreleasePoolPop(pool); return [timer autorelease]; } -+ (instancetype)scheduledTimerWithTimeInterval: (of_time_interval_t)timeInterval ++ (instancetype)scheduledTimerWithTimeInterval: (OFTimeInterval)timeInterval target: (id)target selector: (SEL)selector object: (id)object repeats: (bool)repeats { @@ -75,11 +75,11 @@ objc_autoreleasePoolPop(pool); return [timer autorelease]; } -+ (instancetype)scheduledTimerWithTimeInterval: (of_time_interval_t)timeInterval ++ (instancetype)scheduledTimerWithTimeInterval: (OFTimeInterval)timeInterval target: (id)target selector: (SEL)selector object: (id)object1 object: (id)object2 repeats: (bool)repeats @@ -100,11 +100,11 @@ objc_autoreleasePoolPop(pool); return [timer autorelease]; } -+ (instancetype)scheduledTimerWithTimeInterval: (of_time_interval_t)timeInterval ++ (instancetype)scheduledTimerWithTimeInterval: (OFTimeInterval)timeInterval target: (id)target selector: (SEL)selector object: (id)object1 object: (id)object2 object: (id)object3 @@ -127,11 +127,11 @@ objc_autoreleasePoolPop(pool); return [timer autorelease]; } -+ (instancetype)scheduledTimerWithTimeInterval: (of_time_interval_t)timeInterval ++ (instancetype)scheduledTimerWithTimeInterval: (OFTimeInterval)timeInterval target: (id)target selector: (SEL)selector object: (id)object1 object: (id)object2 object: (id)object3 @@ -157,13 +157,13 @@ return [timer autorelease]; } #ifdef OF_HAVE_BLOCKS -+ (instancetype)scheduledTimerWithTimeInterval: (of_time_interval_t)timeInterval ++ (instancetype)scheduledTimerWithTimeInterval: (OFTimeInterval)timeInterval repeats: (bool)repeats - block: (of_timer_block_t)block + block: (OFTimerBlock)block { void *pool = objc_autoreleasePoolPush(); OFDate *fireDate = [OFDate dateWithTimeIntervalSinceNow: timeInterval]; id timer = [[[self alloc] initWithFireDate: fireDate interval: timeInterval @@ -177,11 +177,11 @@ return [timer autorelease]; } #endif -+ (instancetype)timerWithTimeInterval: (of_time_interval_t)timeInterval ++ (instancetype)timerWithTimeInterval: (OFTimeInterval)timeInterval target: (id)target selector: (SEL)selector repeats: (bool)repeats { void *pool = objc_autoreleasePoolPush(); @@ -196,11 +196,11 @@ objc_autoreleasePoolPop(pool); return [timer autorelease]; } -+ (instancetype)timerWithTimeInterval: (of_time_interval_t)timeInterval ++ (instancetype)timerWithTimeInterval: (OFTimeInterval)timeInterval target: (id)target selector: (SEL)selector object: (id)object repeats: (bool)repeats { @@ -217,11 +217,11 @@ objc_autoreleasePoolPop(pool); return [timer autorelease]; } -+ (instancetype)timerWithTimeInterval: (of_time_interval_t)timeInterval ++ (instancetype)timerWithTimeInterval: (OFTimeInterval)timeInterval target: (id)target selector: (SEL)selector object: (id)object1 object: (id)object2 repeats: (bool)repeats @@ -240,11 +240,11 @@ objc_autoreleasePoolPop(pool); return [timer autorelease]; } -+ (instancetype)timerWithTimeInterval: (of_time_interval_t)timeInterval ++ (instancetype)timerWithTimeInterval: (OFTimeInterval)timeInterval target: (id)target selector: (SEL)selector object: (id)object1 object: (id)object2 object: (id)object3 @@ -265,11 +265,11 @@ objc_autoreleasePoolPop(pool); return [timer autorelease]; } -+ (instancetype)timerWithTimeInterval: (of_time_interval_t)timeInterval ++ (instancetype)timerWithTimeInterval: (OFTimeInterval)timeInterval target: (id)target selector: (SEL)selector object: (id)object1 object: (id)object2 object: (id)object3 @@ -293,13 +293,13 @@ return [timer autorelease]; } #ifdef OF_HAVE_BLOCKS -+ (instancetype)timerWithTimeInterval: (of_time_interval_t)timeInterval ++ (instancetype)timerWithTimeInterval: (OFTimeInterval)timeInterval repeats: (bool)repeats - block: (of_timer_block_t)block + block: (OFTimerBlock)block { void *pool = objc_autoreleasePoolPush(); OFDate *fireDate = [OFDate dateWithTimeIntervalSinceNow: timeInterval]; id timer = [[[self alloc] initWithFireDate: fireDate interval: timeInterval @@ -317,11 +317,11 @@ { OF_INVALID_INIT_METHOD } - (instancetype)of_initWithFireDate: (OFDate *)fireDate - interval: (of_time_interval_t)interval + interval: (OFTimeInterval)interval target: (id)target selector: (SEL)selector object: (id)object1 object: (id)object2 object: (id)object3 @@ -354,11 +354,11 @@ return self; } - (instancetype)initWithFireDate: (OFDate *)fireDate - interval: (of_time_interval_t)interval + interval: (OFTimeInterval)interval target: (id)target selector: (SEL)selector repeats: (bool)repeats { return [self of_initWithFireDate: fireDate @@ -372,11 +372,11 @@ arguments: 0 repeats: repeats]; } - (instancetype)initWithFireDate: (OFDate *)fireDate - interval: (of_time_interval_t)interval + interval: (OFTimeInterval)interval target: (id)target selector: (SEL)selector object: (id)object repeats: (bool)repeats { @@ -391,11 +391,11 @@ arguments: 1 repeats: repeats]; } - (instancetype)initWithFireDate: (OFDate *)fireDate - interval: (of_time_interval_t)interval + interval: (OFTimeInterval)interval target: (id)target selector: (SEL)selector object: (id)object1 object: (id)object2 repeats: (bool)repeats @@ -411,11 +411,11 @@ arguments: 2 repeats: repeats]; } - (instancetype)initWithFireDate: (OFDate *)fireDate - interval: (of_time_interval_t)interval + interval: (OFTimeInterval)interval target: (id)target selector: (SEL)selector object: (id)object1 object: (id)object2 object: (id)object3 @@ -432,11 +432,11 @@ arguments: 3 repeats: repeats]; } - (instancetype)initWithFireDate: (OFDate *)fireDate - interval: (of_time_interval_t)interval + interval: (OFTimeInterval)interval target: (id)target selector: (SEL)selector object: (id)object1 object: (id)object2 object: (id)object3 @@ -455,13 +455,13 @@ repeats: repeats]; } #ifdef OF_HAVE_BLOCKS - (instancetype)initWithFireDate: (OFDate *)fireDate - interval: (of_time_interval_t)interval + interval: (OFTimeInterval)interval repeats: (bool)repeats - block: (of_timer_block_t)block + block: (OFTimerBlock)block { self = [super init]; @try { _fireDate = [fireDate retain]; @@ -504,22 +504,22 @@ #endif [super dealloc]; } -- (of_comparison_result_t)compare: (OFTimer *)timer +- (OFComparisonResult)compare: (OFTimer *)timer { if (![timer isKindOfClass: [OFTimer class]]) @throw [OFInvalidArgumentException exception]; return [_fireDate compare: timer->_fireDate]; } -- (void)of_setInRunLoop: (OFRunLoop *)runLoop mode: (of_run_loop_mode_t)mode +- (void)of_setInRunLoop: (OFRunLoop *)runLoop mode: (OFRunLoopMode)mode { OFRunLoop *oldInRunLoop = _inRunLoop; - of_run_loop_mode_t oldInRunLoopMode = _inRunLoopMode; + OFRunLoopMode oldInRunLoopMode = _inRunLoopMode; _inRunLoop = [runLoop retain]; [oldInRunLoop release]; _inRunLoopMode = [mode copy]; @@ -533,16 +533,16 @@ id object1 = [[_object1 retain] autorelease]; id object2 = [[_object2 retain] autorelease]; id object3 = [[_object3 retain] autorelease]; id object4 = [[_object4 retain] autorelease]; - OF_ENSURE(_arguments <= 4); + OFEnsure(_arguments <= 4); if (_repeats && _valid) { int64_t missedIntervals = -_fireDate.timeIntervalSinceNow / _interval; - of_time_interval_t newFireDate; + OFTimeInterval newFireDate; OFRunLoop *runLoop; /* In case the clock was changed backwards */ if (missedIntervals < 0) missedIntervals = 0; Index: src/OFTriple.m ================================================================== --- src/OFTriple.m +++ src/OFTriple.m @@ -97,19 +97,19 @@ return true; } - (unsigned long)hash { - uint32_t hash; - - OF_HASH_INIT(hash); - - OF_HASH_ADD_HASH(hash, [_firstObject hash]); - OF_HASH_ADD_HASH(hash, [_secondObject hash]); - OF_HASH_ADD_HASH(hash, [_thirdObject hash]); - - OF_HASH_FINALIZE(hash); + unsigned long hash; + + OFHashInit(&hash); + + OFHashAddHash(&hash, [_firstObject hash]); + OFHashAddHash(&hash, [_secondObject hash]); + OFHashAddHash(&hash, [_thirdObject hash]); + + OFHashFinalize(&hash); return hash; } - (id)copy Index: src/OFUDPSocket+Private.h ================================================================== --- src/OFUDPSocket+Private.h +++ src/OFUDPSocket+Private.h @@ -17,10 +17,10 @@ OF_ASSUME_NONNULL_BEGIN OF_DIRECT_MEMBERS @interface OFUDPSocket () -- (uint16_t)of_bindToAddress: (of_socket_address_t *)address +- (uint16_t)of_bindToAddress: (OFSocketAddress *)address extraType: (int)extraType; @end OF_ASSUME_NONNULL_END Index: src/OFUDPSocket.h ================================================================== --- src/OFUDPSocket.h +++ src/OFUDPSocket.h @@ -30,15 +30,16 @@ /** * @class OFUDPSocket OFUDPSocket.h ObjFW/OFUDPSocket.h * * @brief A class which provides methods to create and use UDP sockets. * - * Addresses are of type @ref of_socket_address_t. You can use the current - * thread's @ref OFDNSResolver to create an address for a host / port pair and - * @ref of_socket_address_ip_string to get the IP string / port pair for an - * address. If you want to compare two addresses, you can use @ref - * of_socket_address_equal and you can use @ref of_socket_address_hash to get a + * Addresses are of type @ref OFSocketAddress. You can use the current thread's + * @ref OFDNSResolver to create an address for a host / port pair, + * @ref OFSocketAddressString to get the IP address string for an address and + * @ref OFSocketAddressPort to get the port for an address. If you want to + * compare two addresses, you can use + * @ref OFSocketAddressEqual and you can use @ref OFSocketAddressHash to get a * hash to use in e.g. @ref OFMapTable. * * @warning Even though the OFCopying protocol is implemented, it does *not* * return an independent copy of the socket, but instead retains it. * This is so that the socket can be used as a key for a dictionary, Index: src/OFUDPSocket.m ================================================================== --- src/OFUDPSocket.m +++ src/OFUDPSocket.m @@ -28,40 +28,36 @@ #import "OFUDPSocket.h" #import "OFUDPSocket+Private.h" #import "OFDNSResolver.h" #import "OFData.h" +#import "OFSocket.h" +#import "OFSocket+Private.h" #import "OFThread.h" #import "OFAlreadyConnectedException.h" #import "OFBindFailedException.h" -#import "socket.h" -#import "socket_helpers.h" - @implementation OFUDPSocket @dynamic delegate; -- (uint16_t)of_bindToAddress: (of_socket_address_t *)address +- (uint16_t)of_bindToAddress: (OFSocketAddress *)address extraType: (int)extraType OF_DIRECT { void *pool = objc_autoreleasePoolPush(); - OFString *host; uint16_t port; #if SOCK_CLOEXEC == 0 && defined(HAVE_FCNTL) && defined(FD_CLOEXEC) int flags; #endif if ((_socket = socket(address->sockaddr.sockaddr.sa_family, - SOCK_DGRAM | SOCK_CLOEXEC | extraType, 0)) == INVALID_SOCKET) { - host = of_socket_address_ip_string(address, &port); + SOCK_DGRAM | SOCK_CLOEXEC | extraType, 0)) == OFInvalidSocketHandle) @throw [OFBindFailedException - exceptionWithHost: host - port: port + exceptionWithHost: OFSocketAddressString(address) + port: OFSocketAddressPort(address) socket: self - errNo: of_socket_errno()]; - } + errNo: OFSocketErrNo()]; _canBlock = true; #if SOCK_CLOEXEC == 0 && defined(HAVE_FCNTL) && defined(FD_CLOEXEC) /* {} needed to avoid warning with Clang 10 if next #if is false. */ @@ -69,24 +65,24 @@ fcntl(_socket, F_SETFD, flags | FD_CLOEXEC); } #endif #if defined(OF_HPUX) || defined(OF_WII) || defined(OF_NINTENDO_3DS) - if (of_socket_address_get_port(address) != 0) { + if (OFSocketAddressPort(address) != 0) { #endif if (bind(_socket, &address->sockaddr.sockaddr, address->length) != 0) { - int errNo = of_socket_errno(); + int errNo = OFSocketErrNo(); closesocket(_socket); - _socket = INVALID_SOCKET; + _socket = OFInvalidSocketHandle; - host = of_socket_address_ip_string(address, &port); - @throw [OFBindFailedException exceptionWithHost: host - port: port - socket: self - errNo: errNo]; + @throw [OFBindFailedException + exceptionWithHost: OFSocketAddressString(address) + port: OFSocketAddressPort(address) + socket: self + errNo: errNo]; } #if defined(OF_HPUX) || defined(OF_WII) || defined(OF_NINTENDO_3DS) } else { for (;;) { uint16_t rnd = 0; @@ -93,26 +89,26 @@ int ret; while (rnd < 1024) rnd = (uint16_t)rand(); - of_socket_address_set_port(address, rnd); + OFSocketAddressSetPort(address, rnd); if ((ret = bind(_socket, &address->sockaddr.sockaddr, address->length)) == 0) { port = rnd; break; } - if (of_socket_errno() != EADDRINUSE) { - int errNo = of_socket_errno(); + if (OFSocketErrNo() != EADDRINUSE) { + int errNo = OFSocketErrNo(); + OFString *host = OFSocketAddressString(address); + uint16_t port = OFSocketAddressPort(port); closesocket(_socket); - _socket = INVALID_SOCKET; + _socket = OFInvalidSocketHandle; - host = of_socket_address_ip_string( - address, &port); @throw [OFBindFailedException exceptionWithHost: host port: port socket: self errNo: errNo]; @@ -121,77 +117,77 @@ } #endif objc_autoreleasePoolPop(pool); - if ((port = of_socket_address_get_port(address)) > 0) + if ((port = OFSocketAddressPort(address)) > 0) return port; #if !defined(OF_HPUX) && !defined(OF_WII) && !defined(OF_NINTENDO_3DS) memset(address, 0, sizeof(*address)); address->length = (socklen_t)sizeof(address->sockaddr); - if (of_getsockname(_socket, &address->sockaddr.sockaddr, + if (OFGetSockName(_socket, &address->sockaddr.sockaddr, &address->length) != 0) { - int errNo = of_socket_errno(); + int errNo = OFSocketErrNo(); closesocket(_socket); - _socket = INVALID_SOCKET; + _socket = OFInvalidSocketHandle; - host = of_socket_address_ip_string(address, &port); - @throw [OFBindFailedException exceptionWithHost: host - port: port - socket: self - errNo: errNo]; + @throw [OFBindFailedException + exceptionWithHost: OFSocketAddressString(address) + port: OFSocketAddressPort(address) + socket: self + errNo: errNo]; } if (address->sockaddr.sockaddr.sa_family == AF_INET) - return OF_BSWAP16_IF_LE(address->sockaddr.in.sin_port); + return OFFromBigEndian16(address->sockaddr.in.sin_port); # ifdef OF_HAVE_IPV6 else if (address->sockaddr.sockaddr.sa_family == AF_INET6) - return OF_BSWAP16_IF_LE(address->sockaddr.in6.sin6_port); + return OFFromBigEndian16(address->sockaddr.in6.sin6_port); # endif else { closesocket(_socket); - _socket = INVALID_SOCKET; + _socket = OFInvalidSocketHandle; - host = of_socket_address_ip_string(address, &port); - @throw [OFBindFailedException exceptionWithHost: host - port: port - socket: self - errNo: EAFNOSUPPORT]; + @throw [OFBindFailedException + exceptionWithHost: OFSocketAddressString(address) + port: OFSocketAddressPort(address) + socket: self + errNo: EAFNOSUPPORT]; } #else closesocket(_socket); - _socket = INVALID_SOCKET; + _socket = OFInvalidSocketHandle; - host = of_socket_address_ip_string(address, &port); - @throw [OFBindFailedException exceptionWithHost: host - port: port - socket: self - errNo: EADDRNOTAVAIL]; + @throw [OFBindFailedException + exceptionWithHost: OFSocketAddressString(address) + port: OFSocketAddressPort(address) + socket: self + errNo: EADDRNOTAVAIL]; #endif } - (uint16_t)bindToHost: (OFString *)host port: (uint16_t)port { void *pool = objc_autoreleasePoolPush(); OFData *socketAddresses; - of_socket_address_t address; + OFSocketAddress address; - if (_socket != INVALID_SOCKET) + if (_socket != OFInvalidSocketHandle) @throw [OFAlreadyConnectedException exceptionWithSocket: self]; socketAddresses = [[OFThread DNSResolver] resolveAddressesForHost: host - addressFamily: OF_SOCKET_ADDRESS_FAMILY_ANY]; + addressFamily: OFSocketAddressFamilyAny]; - address = *(of_socket_address_t *)[socketAddresses itemAtIndex: 0]; - of_socket_address_set_port(&address, port); + address = *(OFSocketAddress *)[socketAddresses itemAtIndex: 0]; + OFSocketAddressSetPort(&address, port); port = [self of_bindToAddress: &address extraType: 0]; objc_autoreleasePoolPop(pool); return port; } @end Index: src/OFURL.h ================================================================== --- src/OFURL.h +++ src/OFURL.h @@ -365,13 +365,14 @@ @end #ifdef __cplusplus extern "C" { #endif -extern bool of_url_is_ipv6_host(OFString *host); +extern bool OFURLIsIPv6Host(OFString *host); +extern void OFURLVerifyIsEscaped(OFString *, OFCharacterSet *); #ifdef __cplusplus } #endif OF_ASSUME_NONNULL_END #import "OFMutableURL.h" Index: src/OFURL.m ================================================================== --- src/OFURL.m +++ src/OFURL.m @@ -19,25 +19,23 @@ #include #import "OFURL.h" #import "OFArray.h" #import "OFDictionary.h" -#import "OFNumber.h" -#import "OFString.h" -#import "OFXMLElement.h" - #ifdef OF_HAVE_FILES # import "OFFileManager.h" # import "OFFileURLHandler.h" #endif +#import "OFNumber.h" +#import "OFOnce.h" +#import "OFString.h" +#import "OFXMLElement.h" #import "OFInvalidArgumentException.h" #import "OFInvalidFormatException.h" #import "OFOutOfMemoryException.h" -#import "once.h" - @interface OFURLAllowedCharacterSetBase: OFCharacterSet @end @interface OFURLAllowedCharacterSet: OFURLAllowedCharacterSetBase @end @@ -58,12 +56,13 @@ static OFCharacterSet *URLSchemeAllowedCharacterSet = nil; static OFCharacterSet *URLPathAllowedCharacterSet = nil; static OFCharacterSet *URLQueryOrFragmentAllowedCharacterSet = nil; static OFCharacterSet *URLQueryKeyValueAllowedCharacterSet = nil; -static of_once_t URLAllowedCharacterSetOnce = OF_ONCE_INIT; -static of_once_t URLQueryOrFragmentAllowedCharacterSetOnce = OF_ONCE_INIT; +static OFOnceControl URLAllowedCharacterSetOnce = OFOnceControlInitValue; +static OFOnceControl URLQueryOrFragmentAllowedCharacterSetOnce = + OFOnceControlInitValue; static void initURLAllowedCharacterSet(void) { URLAllowedCharacterSet = [[OFURLAllowedCharacterSet alloc] init]; @@ -99,24 +98,24 @@ OF_DIRECT_MEMBERS @interface OFInvertedCharacterSetWithoutPercent: OFCharacterSet { OFCharacterSet *_characterSet; - bool (*_characterIsMember)(id, SEL, of_unichar_t); + bool (*_characterIsMember)(id, SEL, OFUnichar); } - (instancetype)initWithCharacterSet: (OFCharacterSet *)characterSet; @end bool -of_url_is_ipv6_host(OFString *host) +OFURLIsIPv6Host(OFString *host) { const char *UTF8String = host.UTF8String; bool hasColon = false; while (*UTF8String != '\0') { - if (!of_ascii_isdigit(*UTF8String) && *UTF8String != ':' && + if (!OFASCIIIsDigit(*UTF8String) && *UTF8String != ':' && (*UTF8String < 'a' || *UTF8String > 'f') && (*UTF8String < 'A' || *UTF8String > 'F')) return false; if (*UTF8String == ':') @@ -143,18 +142,18 @@ { } - (unsigned int)retainCount { - return OF_RETAIN_COUNT_MAX; + return OFMaxRetainCount; } @end @implementation OFURLAllowedCharacterSet -- (bool)characterIsMember: (of_unichar_t)character +- (bool)characterIsMember: (OFUnichar)character { - if (character < CHAR_MAX && of_ascii_isalnum(character)) + if (character < CHAR_MAX && OFASCIIIsAlnum(character)) return true; switch (character) { case '-': case '.': @@ -177,13 +176,13 @@ } } @end @implementation OFURLSchemeAllowedCharacterSet -- (bool)characterIsMember: (of_unichar_t)character +- (bool)characterIsMember: (OFUnichar)character { - if (character < CHAR_MAX && of_ascii_isalnum(character)) + if (character < CHAR_MAX && OFASCIIIsAlnum(character)) return true; switch (character) { case '+': case '-': @@ -194,13 +193,13 @@ } } @end @implementation OFURLPathAllowedCharacterSet -- (bool)characterIsMember: (of_unichar_t)character +- (bool)characterIsMember: (OFUnichar)character { - if (character < CHAR_MAX && of_ascii_isalnum(character)) + if (character < CHAR_MAX && OFASCIIIsAlnum(character)) return true; switch (character) { case '-': case '.': @@ -226,13 +225,13 @@ } } @end @implementation OFURLQueryOrFragmentAllowedCharacterSet -- (bool)characterIsMember: (of_unichar_t)character +- (bool)characterIsMember: (OFUnichar)character { - if (character < CHAR_MAX && of_ascii_isalnum(character)) + if (character < CHAR_MAX && OFASCIIIsAlnum(character)) return true; switch (character) { case '-': case '.': @@ -259,13 +258,13 @@ } } @end @implementation OFURLQueryKeyValueAllowedCharacterSet -- (bool)characterIsMember: (of_unichar_t)character +- (bool)characterIsMember: (OFUnichar)character { - if (character < CHAR_MAX && of_ascii_isalnum(character)) + if (character < CHAR_MAX && OFASCIIIsAlnum(character)) return true; switch (character) { case '-': case '.': @@ -296,11 +295,11 @@ { self = [super init]; @try { _characterSet = [characterSet retain]; - _characterIsMember = (bool (*)(id, SEL, of_unichar_t)) + _characterIsMember = (bool (*)(id, SEL, OFUnichar)) [_characterSet methodForSelector: @selector(characterIsMember:)]; } @catch (id e) { [self release]; @throw e; @@ -314,88 +313,88 @@ [_characterSet release]; [super dealloc]; } -- (bool)characterIsMember: (of_unichar_t)character +- (bool)characterIsMember: (OFUnichar)character { return (character != '%' && !_characterIsMember(_characterSet, @selector(characterIsMember:), character)); } @end void -of_url_verify_escaped(OFString *string, OFCharacterSet *characterSet) +OFURLVerifyIsEscaped(OFString *string, OFCharacterSet *characterSet) { void *pool = objc_autoreleasePoolPush(); characterSet = [[[OFInvertedCharacterSetWithoutPercent alloc] initWithCharacterSet: characterSet] autorelease]; - if ([string indexOfCharacterFromSet: characterSet] != OF_NOT_FOUND) + if ([string indexOfCharacterFromSet: characterSet] != OFNotFound) @throw [OFInvalidFormatException exception]; objc_autoreleasePoolPop(pool); } @implementation OFCharacterSet (URLCharacterSets) + (OFCharacterSet *)URLSchemeAllowedCharacterSet { - static of_once_t onceControl = OF_ONCE_INIT; - of_once(&onceControl, initURLSchemeAllowedCharacterSet); + static OFOnceControl onceControl = OFOnceControlInitValue; + OFOnce(&onceControl, initURLSchemeAllowedCharacterSet); return URLSchemeAllowedCharacterSet; } + (OFCharacterSet *)URLHostAllowedCharacterSet { - of_once(&URLAllowedCharacterSetOnce, initURLAllowedCharacterSet); + OFOnce(&URLAllowedCharacterSetOnce, initURLAllowedCharacterSet); return URLAllowedCharacterSet; } + (OFCharacterSet *)URLUserAllowedCharacterSet { - of_once(&URLAllowedCharacterSetOnce, initURLAllowedCharacterSet); + OFOnce(&URLAllowedCharacterSetOnce, initURLAllowedCharacterSet); return URLAllowedCharacterSet; } + (OFCharacterSet *)URLPasswordAllowedCharacterSet { - of_once(&URLAllowedCharacterSetOnce, initURLAllowedCharacterSet); + OFOnce(&URLAllowedCharacterSetOnce, initURLAllowedCharacterSet); return URLAllowedCharacterSet; } + (OFCharacterSet *)URLPathAllowedCharacterSet { - static of_once_t onceControl = OF_ONCE_INIT; - of_once(&onceControl, initURLPathAllowedCharacterSet); + static OFOnceControl onceControl = OFOnceControlInitValue; + OFOnce(&onceControl, initURLPathAllowedCharacterSet); return URLPathAllowedCharacterSet; } + (OFCharacterSet *)URLQueryAllowedCharacterSet { - of_once(&URLQueryOrFragmentAllowedCharacterSetOnce, + OFOnce(&URLQueryOrFragmentAllowedCharacterSetOnce, initURLQueryOrFragmentAllowedCharacterSet); return URLQueryOrFragmentAllowedCharacterSet; } + (OFCharacterSet *)URLQueryKeyValueAllowedCharacterSet { - static of_once_t onceControl = OF_ONCE_INIT; - of_once(&onceControl, initURLQueryKeyValueAllowedCharacterSet); + static OFOnceControl onceControl = OFOnceControlInitValue; + OFOnce(&onceControl, initURLQueryKeyValueAllowedCharacterSet); return URLQueryKeyValueAllowedCharacterSet; } + (OFCharacterSet *)URLFragmentAllowedCharacterSet { - of_once(&URLQueryOrFragmentAllowedCharacterSetOnce, + OFOnce(&URLQueryOrFragmentAllowedCharacterSetOnce, initURLQueryOrFragmentAllowedCharacterSet); return URLQueryOrFragmentAllowedCharacterSet; } @end @@ -441,31 +440,26 @@ @try { void *pool = objc_autoreleasePoolPush(); char *tmp, *tmp2; bool isIPv6Host = false; - if ((UTF8String2 = of_strdup(string.UTF8String)) == NULL) - @throw [OFOutOfMemoryException - exceptionWithRequestedSize: - string.UTF8StringLength]; - - UTF8String = UTF8String2; + UTF8String = UTF8String2 = OFStrDup(string.UTF8String); if ((tmp = strchr(UTF8String, ':')) == NULL) @throw [OFInvalidFormatException exception]; if (strncmp(tmp, "://", 3) != 0) @throw [OFInvalidFormatException exception]; for (tmp2 = UTF8String; tmp2 < tmp; tmp2++) - *tmp2 = of_ascii_tolower(*tmp2); + *tmp2 = OFASCIIToLower(*tmp2); _URLEncodedScheme = [[OFString alloc] initWithUTF8String: UTF8String length: tmp - UTF8String]; - of_url_verify_escaped(_URLEncodedScheme, + OFURLVerifyIsEscaped(_URLEncodedScheme, [OFCharacterSet URLSchemeAllowedCharacterSet]); UTF8String = tmp + 3; if ((tmp = strchr(UTF8String, '/')) != NULL) { @@ -486,27 +480,27 @@ _URLEncodedUser = [[OFString alloc] initWithUTF8String: UTF8String]; _URLEncodedPassword = [[OFString alloc] initWithUTF8String: tmp3]; - of_url_verify_escaped(_URLEncodedPassword, + OFURLVerifyIsEscaped(_URLEncodedPassword, [OFCharacterSet URLPasswordAllowedCharacterSet]); } else _URLEncodedUser = [[OFString alloc] initWithUTF8String: UTF8String]; - of_url_verify_escaped(_URLEncodedUser, + OFURLVerifyIsEscaped(_URLEncodedUser, [OFCharacterSet URLUserAllowedCharacterSet]); UTF8String = tmp2; } if (UTF8String[0] == '[') { tmp2 = UTF8String++; - while (of_ascii_isdigit(*UTF8String) || + while (OFASCIIIsDigit(*UTF8String) || *UTF8String == ':' || (*UTF8String >= 'a' && *UTF8String <= 'f') || (*UTF8String >= 'A' && *UTF8String <= 'F')) UTF8String++; @@ -523,11 +517,11 @@ OFString *portString; tmp2 = ++UTF8String; while (*UTF8String != '\0') { - if (!of_ascii_isdigit(*UTF8String)) + if (!OFASCIIIsDigit(*UTF8String)) @throw [OFInvalidFormatException exception]; UTF8String++; } @@ -566,21 +560,21 @@ } else _URLEncodedHost = [[OFString alloc] initWithUTF8String: UTF8String]; if (!isIPv6Host) - of_url_verify_escaped(_URLEncodedHost, + OFURLVerifyIsEscaped(_URLEncodedHost, [OFCharacterSet URLHostAllowedCharacterSet]); if ((UTF8String = tmp) != NULL) { if ((tmp = strchr(UTF8String, '#')) != NULL) { *tmp = '\0'; _URLEncodedFragment = [[OFString alloc] initWithUTF8String: tmp + 1]; - of_url_verify_escaped(_URLEncodedFragment, + OFURLVerifyIsEscaped(_URLEncodedFragment, [OFCharacterSet URLFragmentAllowedCharacterSet]); } if ((tmp = strchr(UTF8String, '?')) != NULL) { @@ -587,11 +581,11 @@ *tmp = '\0'; _URLEncodedQuery = [[OFString alloc] initWithUTF8String: tmp + 1]; - of_url_verify_escaped(_URLEncodedQuery, + OFURLVerifyIsEscaped(_URLEncodedQuery, [OFCharacterSet URLQueryAllowedCharacterSet]); } UTF8String--; @@ -598,20 +592,20 @@ *UTF8String = '/'; _URLEncodedPath = [[OFString alloc] initWithUTF8String: UTF8String]; - of_url_verify_escaped(_URLEncodedPath, + OFURLVerifyIsEscaped(_URLEncodedPath, [OFCharacterSet URLPathAllowedCharacterSet]); } objc_autoreleasePoolPop(pool); } @catch (id e) { [self release]; @throw e; } @finally { - free(UTF8String2); + OFFreeMemory(UTF8String2); } return self; } @@ -632,32 +626,27 @@ _URLEncodedHost = [URL->_URLEncodedHost copy]; _port = [URL->_port copy]; _URLEncodedUser = [URL->_URLEncodedUser copy]; _URLEncodedPassword = [URL->_URLEncodedPassword copy]; - if ((UTF8String2 = of_strdup(string.UTF8String)) == NULL) - @throw [OFOutOfMemoryException - exceptionWithRequestedSize: - string.UTF8StringLength]; - - UTF8String = UTF8String2; + UTF8String = UTF8String2 = OFStrDup(string.UTF8String); if ((tmp = strchr(UTF8String, '#')) != NULL) { *tmp = '\0'; _URLEncodedFragment = [[OFString alloc] initWithUTF8String: tmp + 1]; - of_url_verify_escaped(_URLEncodedFragment, + OFURLVerifyIsEscaped(_URLEncodedFragment, [OFCharacterSet URLFragmentAllowedCharacterSet]); } if ((tmp = strchr(UTF8String, '?')) != NULL) { *tmp = '\0'; _URLEncodedQuery = [[OFString alloc] initWithUTF8String: tmp + 1]; - of_url_verify_escaped(_URLEncodedQuery, + OFURLVerifyIsEscaped(_URLEncodedQuery, [OFCharacterSet URLQueryAllowedCharacterSet]); } if (*UTF8String == '/') _URLEncodedPath = [[OFString alloc] @@ -674,15 +663,15 @@ OFMutableString *path = [OFMutableString stringWithString: (URL->_URLEncodedPath != nil ? URL->_URLEncodedPath : @"/")]; - of_range_t range = [path + OFRange range = [path rangeOfString: @"/" - options: OF_STRING_SEARCH_BACKWARDS]; + options: OFStringSearchBackwards]; - if (range.location == OF_NOT_FOUND) + if (range.location == OFNotFound) @throw [OFInvalidFormatException exception]; range.location++; range.length = path.length - range.location; @@ -693,19 +682,19 @@ _URLEncodedPath = [path copy]; } } - of_url_verify_escaped(_URLEncodedPath, + OFURLVerifyIsEscaped(_URLEncodedPath, [OFCharacterSet URLPathAllowedCharacterSet]); objc_autoreleasePoolPop(pool); } @catch (id e) { [self release]; @throw e; } @finally { - free(UTF8String2); + OFFreeMemory(UTF8String2); } return self; } @@ -773,11 +762,11 @@ void *pool = objc_autoreleasePoolPush(); OFString *stringValue; @try { if (![element.name isEqual: self.className] || - ![element.namespace isEqual: OF_SERIALIZATION_NS]) + ![element.namespace isEqual: OFSerializationNS]) @throw [OFInvalidArgumentException exception]; stringValue = element.stringValue; } @catch (id e) { [self release]; @@ -844,24 +833,24 @@ return true; } - (unsigned long)hash { - uint32_t hash; - - OF_HASH_INIT(hash); - - OF_HASH_ADD_HASH(hash, _URLEncodedScheme.hash); - OF_HASH_ADD_HASH(hash, _URLEncodedHost.hash); - OF_HASH_ADD_HASH(hash, _port.hash); - OF_HASH_ADD_HASH(hash, _URLEncodedUser.hash); - OF_HASH_ADD_HASH(hash, _URLEncodedPassword.hash); - OF_HASH_ADD_HASH(hash, _URLEncodedPath.hash); - OF_HASH_ADD_HASH(hash, _URLEncodedQuery.hash); - OF_HASH_ADD_HASH(hash, _URLEncodedFragment.hash); - - OF_HASH_FINALIZE(hash); + unsigned long hash; + + OFHashInit(&hash); + + OFHashAddHash(&hash, _URLEncodedScheme.hash); + OFHashAddHash(&hash, _URLEncodedHost.hash); + OFHashAddHash(&hash, _port.hash); + OFHashAddHash(&hash, _URLEncodedUser.hash); + OFHashAddHash(&hash, _URLEncodedPassword.hash); + OFHashAddHash(&hash, _URLEncodedPath.hash); + OFHashAddHash(&hash, _URLEncodedQuery.hash); + OFHashAddHash(&hash, _URLEncodedFragment.hash); + + OFHashFinalize(&hash); return hash; } - (OFString *)scheme @@ -877,13 +866,13 @@ - (OFString *)host { if ([_URLEncodedHost hasPrefix: @"["] && [_URLEncodedHost hasSuffix: @"]"]) { OFString *host = [_URLEncodedHost substringWithRange: - of_range(1, _URLEncodedHost.length - 2)]; + OFRangeMake(1, _URLEncodedHost.length - 2)]; - if (!of_url_is_ipv6_host(host)) + if (!OFURLIsIPv6Host(host)) @throw [OFInvalidArgumentException exception]; return host; } @@ -1188,15 +1177,15 @@ { void *pool = objc_autoreleasePoolPush(); OFXMLElement *element; element = [OFXMLElement elementWithName: self.className - namespace: OF_SERIALIZATION_NS + namespace: OFSerializationNS stringValue: self.string]; [element retain]; objc_autoreleasePoolPop(pool); return [element autorelease]; } @end Index: src/OFURLHandler.h ================================================================== --- src/OFURLHandler.h +++ src/OFURLHandler.h @@ -96,24 +96,23 @@ /** * @brief Returns the attributes for the item at the specified URL. * * @param URL The URL to return the attributes for * @return A dictionary of attributes for the specified URL, with the keys of - * type @ref of_file_attribute_key_t + * type @ref OFFileAttributeKey */ -- (of_file_attributes_t)attributesOfItemAtURL: (OFURL *)URL; +- (OFFileAttributes)attributesOfItemAtURL: (OFURL *)URL; /** * @brief Sets the attributes for the item at the specified URL. * * All attributes not part of the dictionary are left unchanged. * * @param attributes The attributes to set for the specified URL * @param URL The URL of the item to set the attributes for */ -- (void)setAttributes: (of_file_attributes_t)attributes - ofItemAtURL: (OFURL *)URL; +- (void)setAttributes: (OFFileAttributes)attributes ofItemAtURL: (OFURL *)URL; /** * @brief Checks whether a file exists at the specified URL. * * @param URL The URL to check Index: src/OFURLHandler.m ================================================================== --- src/OFURLHandler.m +++ src/OFURLHandler.m @@ -138,17 +138,16 @@ - (OFStream *)openItemAtURL: (OFURL *)URL mode: (OFString *)mode { OF_UNRECOGNIZED_SELECTOR } -- (of_file_attributes_t)attributesOfItemAtURL: (OFURL *)URL +- (OFFileAttributes)attributesOfItemAtURL: (OFURL *)URL { OF_UNRECOGNIZED_SELECTOR } -- (void)setAttributes: (of_file_attributes_t)attributes - ofItemAtURL: (OFURL *)URL +- (void)setAttributes: (OFFileAttributes)attributes ofItemAtURL: (OFURL *)URL { OF_UNRECOGNIZED_SELECTOR } - (bool)fileExistsAtURL: (OFURL *)URL Index: src/OFUTF8String.h ================================================================== --- src/OFUTF8String.h +++ src/OFUTF8String.h @@ -24,29 +24,28 @@ * * Since constant strings don't have `_storage`, they have to allocate * it on the first access. Strings created at runtime just set the * pointer to `&_storage`. */ - struct of_string_utf8_ivars { + struct OFUTF8StringIvars { char *cString; size_t cStringLength; bool isUTF8; size_t length; - bool hashed; + bool hasHash; unsigned long hash; bool freeWhenDone; } *restrict _s; - struct of_string_utf8_ivars _storage; + struct OFUTF8StringIvars _storage; } @end #ifdef __cplusplus extern "C" { #endif -extern int of_string_utf8_check(const char *, size_t, size_t *); -extern size_t of_string_utf8_get_index(const char *, size_t); -extern size_t of_string_utf8_get_position(const char *, size_t, size_t); +extern int OFUTF8StringCheck(const char *, size_t, size_t *); +extern size_t OFUTF8StringIndexToPosition(const char *, size_t, size_t); #ifdef __cplusplus } #endif OF_ASSUME_NONNULL_END Index: src/OFUTF8String.m ================================================================== --- src/OFUTF8String.m +++ src/OFUTF8String.m @@ -23,10 +23,11 @@ # include #endif #import "OFUTF8String.h" #import "OFUTF8String+Private.h" +#import "OFASPrintF.h" #import "OFArray.h" #import "OFData.h" #import "OFMutableUTF8String.h" #import "OFInitializationFailedException.h" @@ -34,57 +35,56 @@ #import "OFInvalidEncodingException.h" #import "OFInvalidFormatException.h" #import "OFOutOfMemoryException.h" #import "OFOutOfRangeException.h" -#import "of_asprintf.h" #import "unicode.h" -extern const of_char16_t of_iso_8859_2_table[]; -extern const size_t of_iso_8859_2_table_offset; -extern const of_char16_t of_iso_8859_3_table[]; -extern const size_t of_iso_8859_3_table_offset; -extern const of_char16_t of_iso_8859_15_table[]; -extern const size_t of_iso_8859_15_table_offset; -extern const of_char16_t of_windows_1251_table[]; -extern const size_t of_windows_1251_table_offset; -extern const of_char16_t of_windows_1252_table[]; -extern const size_t of_windows_1252_table_offset; -extern const of_char16_t of_codepage_437_table[]; -extern const size_t of_codepage_437_table_offset; -extern const of_char16_t of_codepage_850_table[]; -extern const size_t of_codepage_850_table_offset; -extern const of_char16_t of_codepage_858_table[]; -extern const size_t of_codepage_858_table_offset; -extern const of_char16_t of_mac_roman_table[]; -extern const size_t of_mac_roman_table_offset; -extern const of_char16_t of_koi8_r_table[]; -extern const size_t of_koi8_r_table_offset; -extern const of_char16_t of_koi8_u_table[]; -extern const size_t of_koi8_u_table_offset; +extern const OFChar16 OFISO8859_2Table[]; +extern const size_t OFISO8859_2TableOffset; +extern const OFChar16 OFISO8859_3Table[]; +extern const size_t OFISO8859_3TableOffset; +extern const OFChar16 OFISO8859_15Table[]; +extern const size_t OFISO8859_15TableOffset; +extern const OFChar16 OFWindows1251Table[]; +extern const size_t OFWindows1251TableOffset; +extern const OFChar16 OFWindows1252Table[]; +extern const size_t OFWindows1252TableOffset; +extern const OFChar16 OFCodepage437Table[]; +extern const size_t OFCodepage437TableOffset; +extern const OFChar16 OFCodepage850Table[]; +extern const size_t OFCodepage850TableOffset; +extern const OFChar16 OFCodepage858Table[]; +extern const size_t OFCodepage858TableOffset; +extern const OFChar16 OFMacRomanTable[]; +extern const size_t OFMacRomanTableOffset; +extern const OFChar16 OFKOI8RTable[]; +extern const size_t OFKOI8RTableOffset; +extern const OFChar16 OFKOI8UTable[]; +extern const size_t OFKOI8UTableOffset; static inline int memcasecmp(const char *first, const char *second, size_t length) { for (size_t i = 0; i < length; i++) { unsigned char f = first[i]; unsigned char s = second[i]; - f = of_ascii_toupper(f); - s = of_ascii_toupper(s); + f = OFASCIIToUpper(f); + s = OFASCIIToUpper(s); if (f > s) - return OF_ORDERED_DESCENDING; + return OFOrderedDescending; if (f < s) - return OF_ORDERED_ASCENDING; + return OFOrderedAscending; } - return OF_ORDERED_SAME; + return OFOrderedSame; } int -of_string_utf8_check(const char *UTF8String, size_t UTF8Length, size_t *length) +OFUTF8StringCheck(const char *UTF8String, size_t UTF8Length, size_t *length) { size_t tmpLength = UTF8Length; int isUTF8 = 0; for (size_t i = 0; i < UTF8Length; i++) { @@ -147,11 +147,11 @@ return isUTF8; } size_t -of_string_utf8_get_index(const char *string, size_t position) +positionToIndex(const char *string, size_t position) { size_t idx = position; for (size_t i = 0; i < position; i++) if OF_UNLIKELY ((string[i] & 0xC0) == 0x80) @@ -159,11 +159,11 @@ return idx; } size_t -of_string_utf8_get_position(const char *string, size_t idx, size_t length) +OFUTF8StringIndexToPosition(const char *string, size_t idx, size_t length) { for (size_t i = 0; i <= idx; i++) if OF_UNLIKELY ((string[i] & 0xC0) == 0x80) if (++idx > length) @throw [OFInvalidFormatException exception]; @@ -177,11 +177,11 @@ self = [super init]; @try { _s = &_storage; - _s->cString = of_alloc_zeroed(1, 1); + _s->cString = OFAllocZeroedMemory(1, 1); _s->freeWhenDone = true; } @catch (id e) { [self release]; @throw e; } @@ -205,11 +205,11 @@ _s = &_storage; _s->cString = storage; _s->cStringLength = UTF8StringLength; - switch (of_string_utf8_check(UTF8String, UTF8StringLength, + switch (OFUTF8StringCheck(UTF8String, UTF8StringLength, &_s->length)) { case 1: _s->isUTF8 = true; break; case -1: @@ -225,38 +225,38 @@ return self; } - (instancetype)initWithCString: (const char *)cString - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding length: (size_t)cStringLength { self = [super init]; @try { - const of_char16_t *table; + const OFChar16 *table; size_t tableOffset, j; - if (encoding == OF_STRING_ENCODING_UTF_8 && + if (encoding == OFStringEncodingUTF8 && cStringLength >= 3 && memcmp(cString, "\xEF\xBB\xBF", 3) == 0) { cString += 3; cStringLength -= 3; } _s = &_storage; - _s->cString = of_alloc(cStringLength + 1, 1); + _s->cString = OFAllocMemory(cStringLength + 1, 1); _s->cStringLength = cStringLength; _s->freeWhenDone = true; - if (encoding == OF_STRING_ENCODING_UTF_8 || - encoding == OF_STRING_ENCODING_ASCII) { - switch (of_string_utf8_check(cString, cStringLength, + if (encoding == OFStringEncodingUTF8 || + encoding == OFStringEncodingASCII) { + switch (OFUTF8StringCheck(cString, cStringLength, &_s->length)) { case 1: - if (encoding == OF_STRING_ENCODING_ASCII) + if (encoding == OFStringEncodingASCII) @throw [OFInvalidEncodingException exception]; _s->isUTF8 = true; break; @@ -271,11 +271,11 @@ } /* All other encodings we support are single byte encodings */ _s->length = cStringLength; - if (encoding == OF_STRING_ENCODING_ISO_8859_1) { + if (encoding == OFStringEncodingISO8859_1) { j = 0; for (size_t i = 0; i < cStringLength; i++) { char buffer[4]; size_t bytes; @@ -283,19 +283,19 @@ _s->cString[j++] = cString[i]; continue; } _s->isUTF8 = true; - bytes = of_string_utf8_encode( + bytes = OFUTF8StringEncode( (uint8_t)cString[i], buffer); if (bytes == 0) @throw [OFInvalidEncodingException exception]; _s->cStringLength += bytes - 1; - _s->cString = of_realloc(_s->cString, + _s->cString = OFResizeMemory(_s->cString, _s->cStringLength + 1, 1); memcpy(_s->cString + j, buffer, bytes); j += bytes; } @@ -307,54 +307,54 @@ switch (encoding) { #define CASE(encoding, var) \ case encoding: \ table = var; \ - tableOffset = var##_offset; \ + tableOffset = var##Offset; \ break; #ifdef HAVE_ISO_8859_2 - CASE(OF_STRING_ENCODING_ISO_8859_2, of_iso_8859_2_table) + CASE(OFStringEncodingISO8859_2, OFISO8859_2Table) #endif #ifdef HAVE_ISO_8859_3 - CASE(OF_STRING_ENCODING_ISO_8859_3, of_iso_8859_3_table) + CASE(OFStringEncodingISO8859_3, OFISO8859_3Table) #endif #ifdef HAVE_ISO_8859_15 - CASE(OF_STRING_ENCODING_ISO_8859_15, of_iso_8859_15_table) + CASE(OFStringEncodingISO8859_15, OFISO8859_15Table) #endif #ifdef HAVE_WINDOWS_1251 - CASE(OF_STRING_ENCODING_WINDOWS_1251, of_windows_1251_table) + CASE(OFStringEncodingWindows1251, OFWindows1251Table) #endif #ifdef HAVE_WINDOWS_1252 - CASE(OF_STRING_ENCODING_WINDOWS_1252, of_windows_1252_table) + CASE(OFStringEncodingWindows1252, OFWindows1252Table) #endif #ifdef HAVE_CODEPAGE_437 - CASE(OF_STRING_ENCODING_CODEPAGE_437, of_codepage_437_table) + CASE(OFStringEncodingCodepage437, OFCodepage437Table) #endif #ifdef HAVE_CODEPAGE_850 - CASE(OF_STRING_ENCODING_CODEPAGE_850, of_codepage_850_table) + CASE(OFStringEncodingCodepage850, OFCodepage850Table) #endif #ifdef HAVE_CODEPAGE_858 - CASE(OF_STRING_ENCODING_CODEPAGE_858, of_codepage_858_table) + CASE(OFStringEncodingCodepage858, OFCodepage858Table) #endif #ifdef HAVE_MAC_ROMAN - CASE(OF_STRING_ENCODING_MAC_ROMAN, of_mac_roman_table) + CASE(OFStringEncodingMacRoman, OFMacRomanTable) #endif #ifdef HAVE_KOI8_R - CASE(OF_STRING_ENCODING_KOI8_R, of_koi8_r_table) + CASE(OFStringEncodingKOI8R, OFKOI8RTable) #endif #ifdef HAVE_KOI8_U - CASE(OF_STRING_ENCODING_KOI8_U, of_koi8_u_table) + CASE(OFStringEncodingKOI8U, OFKOI8UTable) #endif #undef CASE default: @throw [OFInvalidEncodingException exception]; } j = 0; for (size_t i = 0; i < cStringLength; i++) { unsigned char character = (unsigned char)cString[i]; - of_unichar_t unichar; + OFUnichar unichar; char buffer[4]; size_t byteLength; if (character < tableOffset) { _s->cString[j++] = cString[i]; @@ -365,17 +365,17 @@ if (unichar == 0xFFFF) @throw [OFInvalidEncodingException exception]; _s->isUTF8 = true; - byteLength = of_string_utf8_encode(unichar, buffer); + byteLength = OFUTF8StringEncode(unichar, buffer); if (byteLength == 0) @throw [OFInvalidEncodingException exception]; _s->cStringLength += byteLength - 1; - _s->cString = of_realloc(_s->cString, + _s->cString = OFResizeMemory(_s->cString, _s->cStringLength + 1, 1); memcpy(_s->cString + j, buffer, byteLength); j += byteLength; } @@ -411,11 +411,11 @@ memcmp(UTF8String, "\xEF\xBB\xBF", 3) == 0) { UTF8String += 3; UTF8StringLength -= 3; } - switch (of_string_utf8_check(UTF8String, UTF8StringLength, + switch (OFUTF8StringCheck(UTF8String, UTF8StringLength, &_s->length)) { case 1: _s->isUTF8 = true; break; case -1: @@ -448,11 +448,11 @@ else _s->isUTF8 = true; _s->length = string.length; - _s->cString = of_alloc(_s->cStringLength + 1, 1); + _s->cString = OFAllocMemory(_s->cStringLength + 1, 1); memcpy(_s->cString, string.UTF8String, _s->cStringLength + 1); _s->freeWhenDone = true; } @catch (id e) { [self release]; @throw e; @@ -459,27 +459,27 @@ } return self; } -- (instancetype)initWithCharacters: (const of_unichar_t *)characters +- (instancetype)initWithCharacters: (const OFUnichar *)characters length: (size_t)length { self = [super init]; @try { size_t j; _s = &_storage; - _s->cString = of_alloc((length * 4) + 1, 1); + _s->cString = OFAllocMemory((length * 4) + 1, 1); _s->length = length; _s->freeWhenDone = true; j = 0; for (size_t i = 0; i < length; i++) { - size_t len = of_string_utf8_encode(characters[i], + size_t len = OFUTF8StringEncode(characters[i], _s->cString + j); if (len == 0) @throw [OFInvalidEncodingException exception]; @@ -491,11 +491,11 @@ _s->cString[j] = '\0'; _s->cStringLength = j; @try { - _s->cString = of_realloc(_s->cString, j + 1, 1); + _s->cString = OFResizeMemory(_s->cString, j + 1, 1); } @catch (OFOutOfMemoryException *e) { /* We don't care, as we only tried to make it smaller */ } } @catch (id e) { [self release]; @@ -503,13 +503,13 @@ } return self; } -- (instancetype)initWithUTF16String: (const of_char16_t *)string +- (instancetype)initWithUTF16String: (const OFChar16 *)string length: (size_t)length - byteOrder: (of_byte_order_t)byteOrder + byteOrder: (OFByteOrder)byteOrder { self = [super init]; @try { size_t j; @@ -520,38 +520,38 @@ length--; } else if (length > 0 && *string == 0xFFFE) { swap = true; string++; length--; - } else if (byteOrder != OF_BYTE_ORDER_NATIVE) + } else if (byteOrder != OFByteOrderNative) swap = true; _s = &_storage; - _s->cString = of_alloc((length * 4) + 1, 1); + _s->cString = OFAllocMemory((length * 4) + 1, 1); _s->length = length; _s->freeWhenDone = true; j = 0; for (size_t i = 0; i < length; i++) { - of_unichar_t character = - (swap ? OF_BSWAP16(string[i]) : string[i]); + OFUnichar character = + (swap ? OFByteSwap16(string[i]) : string[i]); size_t len; /* Missing high surrogate */ if ((character & 0xFC00) == 0xDC00) @throw [OFInvalidEncodingException exception]; if ((character & 0xFC00) == 0xD800) { - of_char16_t nextCharacter; + OFChar16 nextCharacter; if (length <= i + 1) @throw [OFInvalidEncodingException exception]; nextCharacter = (swap - ? OF_BSWAP16(string[i + 1]) + ? OFByteSwap16(string[i + 1]) : string[i + 1]); if ((nextCharacter & 0xFC00) != 0xDC00) @throw [OFInvalidEncodingException exception]; @@ -561,11 +561,11 @@ i++; _s->length--; } - len = of_string_utf8_encode(character, _s->cString + j); + len = OFUTF8StringEncode(character, _s->cString + j); if (len == 0) @throw [OFInvalidEncodingException exception]; if (len > 1) @@ -576,11 +576,11 @@ _s->cString[j] = '\0'; _s->cStringLength = j; @try { - _s->cString = of_realloc(_s->cString, j + 1, 1); + _s->cString = OFResizeMemory(_s->cString, j + 1, 1); } @catch (OFOutOfMemoryException *e) { /* We don't care, as we only tried to make it smaller */ } } @catch (id e) { [self release]; @@ -588,13 +588,13 @@ } return self; } -- (instancetype)initWithUTF32String: (const of_char32_t *)characters +- (instancetype)initWithUTF32String: (const OFChar32 *)characters length: (size_t)length - byteOrder: (of_byte_order_t)byteOrder + byteOrder: (OFByteOrder)byteOrder { self = [super init]; @try { size_t j; @@ -605,24 +605,25 @@ length--; } else if (length > 0 && *characters == 0xFFFE0000) { swap = true; characters++; length--; - } else if (byteOrder != OF_BYTE_ORDER_NATIVE) + } else if (byteOrder != OFByteOrderNative) swap = true; _s = &_storage; - _s->cString = of_alloc((length * 4) + 1, 1); + _s->cString = OFAllocMemory((length * 4) + 1, 1); _s->length = length; _s->freeWhenDone = true; j = 0; for (size_t i = 0; i < length; i++) { char buffer[4]; - size_t len = of_string_utf8_encode( - (swap ? OF_BSWAP32(characters[i]) : characters[i]), + size_t len = OFUTF8StringEncode((swap + ? OFByteSwap32(characters[i]) + : characters[i]), buffer); switch (len) { case 1: _s->cString[j++] = buffer[0]; @@ -643,11 +644,11 @@ _s->cString[j] = '\0'; _s->cStringLength = j; @try { - _s->cString = of_realloc(_s->cString, j + 1, 1); + _s->cString = OFResizeMemory(_s->cString, j + 1, 1); } @catch (OFOutOfMemoryException *e) { /* We don't care, as we only tried to make it smaller */ } } @catch (id e) { [self release]; @@ -669,31 +670,31 @@ if (format == nil) @throw [OFInvalidArgumentException exception]; _s = &_storage; - if ((cStringLength = of_vasprintf(&tmp, format.UTF8String, + if ((cStringLength = OFVASPrintF(&tmp, format.UTF8String, arguments)) == -1) @throw [OFInvalidFormatException exception]; _s->cStringLength = cStringLength; @try { - switch (of_string_utf8_check(tmp, cStringLength, + switch (OFUTF8StringCheck(tmp, cStringLength, &_s->length)) { case 1: _s->isUTF8 = true; break; case -1: @throw [OFInvalidEncodingException exception]; } - _s->cString = of_alloc(cStringLength + 1, 1); + _s->cString = OFAllocMemory(cStringLength + 1, 1); memcpy(_s->cString, tmp, cStringLength + 1); _s->freeWhenDone = true; } @finally { - free(tmp); + OFFreeMemory(tmp); } } @catch (id e) { [self release]; @throw e; } @@ -702,25 +703,25 @@ } - (void)dealloc { if (_s != NULL && _s->freeWhenDone) - free(_s->cString); + OFFreeMemory(_s->cString); [super dealloc]; } - (size_t)getCString: (char *)cString maxLength: (size_t)maxLength - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { switch (encoding) { - case OF_STRING_ENCODING_ASCII: + case OFStringEncodingASCII: if (_s->isUTF8) @throw [OFInvalidEncodingException exception]; /* intentional fall-through */ - case OF_STRING_ENCODING_UTF_8: + case OFStringEncodingUTF8: if (_s->cStringLength + 1 > maxLength) @throw [OFOutOfRangeException exception]; memcpy(cString, _s->cString, _s->cStringLength + 1); @@ -730,18 +731,18 @@ maxLength: maxLength encoding: encoding]; } } -- (const char *)cStringWithEncoding: (of_string_encoding_t)encoding +- (const char *)cStringWithEncoding: (OFStringEncoding)encoding { switch (encoding) { - case OF_STRING_ENCODING_ASCII: + case OFStringEncodingASCII: if (_s->isUTF8) @throw [OFInvalidEncodingException exception]; /* intentional fall-through */ - case OF_STRING_ENCODING_UTF_8: + case OFStringEncodingUTF8: return _s->cString; default: return [super cStringWithEncoding: encoding]; } } @@ -754,15 +755,15 @@ - (size_t)length { return _s->length; } -- (size_t)cStringLengthWithEncoding: (of_string_encoding_t)encoding +- (size_t)cStringLengthWithEncoding: (OFStringEncoding)encoding { switch (encoding) { - case OF_STRING_ENCODING_UTF_8: - case OF_STRING_ENCODING_ASCII: + case OFStringEncodingUTF8: + case OFStringEncodingASCII: return _s->cStringLength; default: return [super cStringLengthWithEncoding: encoding]; } } @@ -788,26 +789,26 @@ string.length != _s->length) return false; if (([string isKindOfClass: [OFUTF8String class]] || [string isKindOfClass: [OFMutableUTF8String class]]) && - _s->hashed && string->_s->hashed && _s->hash != string->_s->hash) + _s->hasHash && string->_s->hasHash && _s->hash != string->_s->hash) return false; if (strcmp(_s->cString, string.UTF8String) != 0) return false; return true; } -- (of_comparison_result_t)compare: (OFString *)string +- (OFComparisonResult)compare: (OFString *)string { size_t otherCStringLength, minimumCStringLength; int compare; if (string == self) - return OF_ORDERED_SAME; + return OFOrderedSame; if (![string isKindOfClass: [OFString class]]) @throw [OFInvalidArgumentException exception]; otherCStringLength = string.UTF8StringLength; @@ -815,33 +816,33 @@ ? otherCStringLength : _s->cStringLength); if ((compare = memcmp(_s->cString, string.UTF8String, minimumCStringLength)) == 0) { if (_s->cStringLength > otherCStringLength) - return OF_ORDERED_DESCENDING; + return OFOrderedDescending; if (_s->cStringLength < otherCStringLength) - return OF_ORDERED_ASCENDING; - return OF_ORDERED_SAME; + return OFOrderedAscending; + return OFOrderedSame; } if (compare > 0) - return OF_ORDERED_DESCENDING; + return OFOrderedDescending; else - return OF_ORDERED_ASCENDING; + return OFOrderedAscending; } -- (of_comparison_result_t)caseInsensitiveCompare: (OFString *)string +- (OFComparisonResult)caseInsensitiveCompare: (OFString *)string { const char *otherCString; size_t otherCStringLength, minimumCStringLength; #ifdef OF_HAVE_UNICODE_TABLES size_t i, j; #endif int compare; if (string == self) - return OF_ORDERED_SAME; + return OFOrderedSame; otherCString = string.UTF8String; otherCStringLength = string.UTF8StringLength; #ifdef OF_HAVE_UNICODE_TABLES @@ -851,141 +852,141 @@ ? otherCStringLength : _s->cStringLength); if ((compare = memcasecmp(_s->cString, otherCString, minimumCStringLength)) == 0) { if (_s->cStringLength > otherCStringLength) - return OF_ORDERED_DESCENDING; + return OFOrderedDescending; if (_s->cStringLength < otherCStringLength) - return OF_ORDERED_ASCENDING; - return OF_ORDERED_SAME; + return OFOrderedAscending; + return OFOrderedSame; } if (compare > 0) - return OF_ORDERED_DESCENDING; + return OFOrderedDescending; else - return OF_ORDERED_ASCENDING; + return OFOrderedAscending; #ifdef OF_HAVE_UNICODE_TABLES } i = j = 0; while (i < _s->cStringLength && j < otherCStringLength) { - of_unichar_t c1, c2; + OFUnichar c1, c2; ssize_t l1, l2; - l1 = of_string_utf8_decode(_s->cString + i, + l1 = OFUTF8StringDecode(_s->cString + i, _s->cStringLength - i, &c1); - l2 = of_string_utf8_decode(otherCString + j, + l2 = OFUTF8StringDecode(otherCString + j, otherCStringLength - j, &c2); if (l1 <= 0 || l2 <= 0 || c1 > 0x10FFFF || c2 > 0x10FFFF) @throw [OFInvalidEncodingException exception]; - if (c1 >> 8 < OF_UNICODE_CASEFOLDING_TABLE_SIZE) { - of_unichar_t tc = - of_unicode_casefolding_table[c1 >> 8][c1 & 0xFF]; + if (c1 >> 8 < OFUnicodeCaseFoldingTableSize) { + OFUnichar tc = + OFUnicodeCaseFoldingTable[c1 >> 8][c1 & 0xFF]; if (tc) c1 = tc; } - if (c2 >> 8 < OF_UNICODE_CASEFOLDING_TABLE_SIZE) { - of_unichar_t tc = - of_unicode_casefolding_table[c2 >> 8][c2 & 0xFF]; + if (c2 >> 8 < OFUnicodeCaseFoldingTableSize) { + OFUnichar tc = + OFUnicodeCaseFoldingTable[c2 >> 8][c2 & 0xFF]; if (tc) c2 = tc; } if (c1 > c2) - return OF_ORDERED_DESCENDING; + return OFOrderedDescending; if (c1 < c2) - return OF_ORDERED_ASCENDING; + return OFOrderedAscending; i += l1; j += l2; } if (_s->cStringLength - i > otherCStringLength - j) - return OF_ORDERED_DESCENDING; + return OFOrderedDescending; else if (_s->cStringLength - i < otherCStringLength - j) - return OF_ORDERED_ASCENDING; + return OFOrderedAscending; #endif - return OF_ORDERED_SAME; + return OFOrderedSame; } - (unsigned long)hash { - uint32_t hash; + unsigned long hash; - if (_s->hashed) + if (_s->hasHash) return _s->hash; - OF_HASH_INIT(hash); + OFHashInit(&hash); for (size_t i = 0; i < _s->cStringLength; i++) { - of_unichar_t c; + OFUnichar c; ssize_t length; - if ((length = of_string_utf8_decode(_s->cString + i, + if ((length = OFUTF8StringDecode(_s->cString + i, _s->cStringLength - i, &c)) <= 0) @throw [OFInvalidEncodingException exception]; - OF_HASH_ADD(hash, (c & 0xFF0000) >> 16); - OF_HASH_ADD(hash, (c & 0x00FF00) >> 8); - OF_HASH_ADD(hash, c & 0x0000FF); + OFHashAdd(&hash, (c & 0xFF0000) >> 16); + OFHashAdd(&hash, (c & 0x00FF00) >> 8); + OFHashAdd(&hash, c & 0x0000FF); i += length - 1; } - OF_HASH_FINALIZE(hash); + OFHashFinalize(&hash); _s->hash = hash; - _s->hashed = true; + _s->hasHash = true; return hash; } -- (of_unichar_t)characterAtIndex: (size_t)idx +- (OFUnichar)characterAtIndex: (size_t)idx { - of_unichar_t character; + OFUnichar character; if (idx >= _s->length) @throw [OFOutOfRangeException exception]; if (!_s->isUTF8) return _s->cString[idx]; - idx = of_string_utf8_get_position(_s->cString, idx, _s->cStringLength); + idx = OFUTF8StringIndexToPosition(_s->cString, idx, _s->cStringLength); - if (of_string_utf8_decode(_s->cString + idx, - _s->cStringLength - idx, &character) <= 0) + if (OFUTF8StringDecode(_s->cString + idx, _s->cStringLength - idx, + &character) <= 0) @throw [OFInvalidEncodingException exception]; return character; } -- (void)getCharacters: (of_unichar_t *)buffer inRange: (of_range_t)range +- (void)getCharacters: (OFUnichar *)buffer inRange: (OFRange)range { /* TODO: Could be slightly optimized */ void *pool = objc_autoreleasePoolPush(); - const of_unichar_t *characters = self.characters; + const OFUnichar *characters = self.characters; if (range.length > SIZE_MAX - range.location || range.location + range.length > _s->length) @throw [OFOutOfRangeException exception]; memcpy(buffer, characters + range.location, - range.length * sizeof(of_unichar_t)); + range.length * sizeof(OFUnichar)); objc_autoreleasePoolPop(pool); } -- (of_range_t)rangeOfString: (OFString *)string - options: (int)options - range: (of_range_t)range +- (OFRange)rangeOfString: (OFString *)string + options: (OFStringSearchOptions)options + range: (OFRange)range { const char *cString = string.UTF8String; size_t cStringLength = string.UTF8StringLength; size_t rangeLocation, rangeLength; @@ -992,55 +993,55 @@ if (range.length > SIZE_MAX - range.location || range.location + range.length > _s->length) @throw [OFOutOfRangeException exception]; if (_s->isUTF8) { - rangeLocation = of_string_utf8_get_position( + rangeLocation = OFUTF8StringIndexToPosition( _s->cString, range.location, _s->cStringLength); - rangeLength = of_string_utf8_get_position( + rangeLength = OFUTF8StringIndexToPosition( _s->cString + rangeLocation, range.length, _s->cStringLength - rangeLocation); } else { rangeLocation = range.location; rangeLength = range.length; } if (cStringLength == 0) - return of_range(0, 0); + return OFRangeMake(0, 0); if (cStringLength > rangeLength) - return of_range(OF_NOT_FOUND, 0); + return OFRangeMake(OFNotFound, 0); - if (options & OF_STRING_SEARCH_BACKWARDS) { + if (options & OFStringSearchBackwards) { for (size_t i = rangeLength - cStringLength;; i--) { if (memcmp(_s->cString + rangeLocation + i, cString, cStringLength) == 0) { - range.location += of_string_utf8_get_index( + range.location += positionToIndex( _s->cString + rangeLocation, i); range.length = string.length; return range; } /* Did not match and we're at the last char */ if (i == 0) - return of_range(OF_NOT_FOUND, 0); + return OFRangeMake(OFNotFound, 0); } } else { for (size_t i = 0; i <= rangeLength - cStringLength; i++) { if (memcmp(_s->cString + rangeLocation + i, cString, cStringLength) == 0) { - range.location += of_string_utf8_get_index( + range.location += positionToIndex( _s->cString + rangeLocation, i); range.length = string.length; return range; } } } - return of_range(OF_NOT_FOUND, 0); + return OFRangeMake(OFNotFound, 0); } - (bool)containsString: (OFString *)string { const char *cString = string.UTF8String; @@ -1057,22 +1058,22 @@ return true; return false; } -- (OFString *)substringWithRange: (of_range_t)range +- (OFString *)substringWithRange: (OFRange)range { size_t start = range.location; size_t end = range.location + range.length; if (range.length > SIZE_MAX - range.location || end > _s->length) @throw [OFOutOfRangeException exception]; if (_s->isUTF8) { - start = of_string_utf8_get_position(_s->cString, start, + start = OFUTF8StringIndexToPosition(_s->cString, start, _s->cStringLength); - end = of_string_utf8_get_position(_s->cString, end, + end = OFUTF8StringIndexToPosition(_s->cString, end, _s->cStringLength); } return [OFString stringWithUTF8String: _s->cString + start length: end - start]; @@ -1098,17 +1099,17 @@ return (memcmp(_s->cString + (_s->cStringLength - cStringLength), suffix.UTF8String, cStringLength) == 0); } - (OFArray *)componentsSeparatedByString: (OFString *)delimiter - options: (int)options + options: (OFStringSeparationOptions)options { void *pool; OFMutableArray *array; const char *cString; size_t cStringLength; - bool skipEmpty = (options & OF_STRING_SKIP_EMPTY); + bool skipEmpty = (options & OFStringSkipEmptyComponents); size_t last; OFString *component; if (delimiter == nil) @throw [OFInvalidArgumentException exception]; @@ -1150,71 +1151,71 @@ objc_autoreleasePoolPop(pool); return array; } -- (const of_unichar_t *)characters +- (const OFUnichar *)characters { - of_unichar_t *buffer = of_alloc(_s->length, sizeof(of_unichar_t)); + OFUnichar *buffer = OFAllocMemory(_s->length, sizeof(OFUnichar)); size_t i = 0, j = 0; while (i < _s->cStringLength) { - of_unichar_t c; + OFUnichar c; ssize_t cLen; - cLen = of_string_utf8_decode(_s->cString + i, + cLen = OFUTF8StringDecode(_s->cString + i, _s->cStringLength - i, &c); if (cLen <= 0 || c > 0x10FFFF) { - free(buffer); + OFFreeMemory(buffer); @throw [OFInvalidEncodingException exception]; } buffer[j++] = c; i += cLen; } return [[OFData dataWithItemsNoCopy: buffer count: _s->length - itemSize: sizeof(of_unichar_t) + itemSize: sizeof(OFUnichar) freeWhenDone: true] items]; } -- (const of_char32_t *)UTF32StringWithByteOrder: (of_byte_order_t)byteOrder +- (const OFChar32 *)UTF32StringWithByteOrder: (OFByteOrder)byteOrder { - of_char32_t *buffer = of_alloc(_s->length + 1, sizeof(of_char32_t)); + OFChar32 *buffer = OFAllocMemory(_s->length + 1, sizeof(OFChar32)); size_t i = 0, j = 0; while (i < _s->cStringLength) { - of_char32_t c; + OFChar32 c; ssize_t cLen; - cLen = of_string_utf8_decode(_s->cString + i, + cLen = OFUTF8StringDecode(_s->cString + i, _s->cStringLength - i, &c); if (cLen <= 0 || c > 0x10FFFF) { - free(buffer); + OFFreeMemory(buffer); @throw [OFInvalidEncodingException exception]; } - if (byteOrder != OF_BYTE_ORDER_NATIVE) - buffer[j++] = OF_BSWAP32(c); + if (byteOrder != OFByteOrderNative) + buffer[j++] = OFByteSwap32(c); else buffer[j++] = c; i += cLen; } buffer[j] = 0; return [[OFData dataWithItemsNoCopy: buffer count: _s->length + 1 - itemSize: sizeof(of_char32_t) + itemSize: sizeof(OFChar32) freeWhenDone: true] items]; } #ifdef OF_HAVE_BLOCKS -- (void)enumerateLinesUsingBlock: (of_string_line_enumeration_block_t)block +- (void)enumerateLinesUsingBlock: (OFStringLineEnumerationBlock)block { void *pool; const char *cString = _s->cString; const char *last = cString; bool stop = false, lastCarriageReturn = false; Index: src/OFValue.h ================================================================== --- src/OFValue.h +++ src/OFValue.h @@ -45,36 +45,36 @@ * If the value is not pointer-sized, @ref OFOutOfRangeException is thrown. */ @property (readonly, nonatomic) id nonretainedObjectValue; /** - * @brief The value as a range. - * - * If the value is not range-sized, @ref OFOutOfRangeException is thrown. - */ -@property (readonly, nonatomic) of_range_t rangeValue; - -/** - * @brief The value as a point. - * - * If the value is not point-sized, @ref OFOutOfRangeException is thrown. - */ -@property (readonly, nonatomic) of_point_t pointValue; - -/** - * @brief The value as a dimension. - * - * If the value is not dimension-sized, @ref OFOutOfRangeException is thrown. - */ -@property (readonly, nonatomic) of_dimension_t dimensionValue; - -/** - * @brief The value as a rectangle. - * - * If the value is not rectangle-sized, @ref OFOutOfRangeException is thrown. - */ -@property (readonly, nonatomic) of_rectangle_t rectangleValue; + * @brief The value as an OFRange. + * + * If the value is not OFRange-sized, @ref OFOutOfRangeException is thrown. + */ +@property (readonly, nonatomic) OFRange rangeValue; + +/** + * @brief The value as an OFPoint. + * + * If the value is not OFPoint-sized, @ref OFOutOfRangeException is thrown. + */ +@property (readonly, nonatomic) OFPoint pointValue; + +/** + * @brief The value as an OFSize. + * + * If the value is not OFSize-sized, @ref OFOutOfRangeException is thrown. + */ +@property (readonly, nonatomic) OFSize sizeValue; + +/** + * @brief The value as a OFRect. + * + * If the value is not OFRect-sized, @ref OFOutOfRangeException is thrown. + */ +@property (readonly, nonatomic) OFRect rectValue; /** * @brief Creates a new, autorelease OFValue with the specified bytes of the * specified type. * @@ -111,37 +111,36 @@ * @brief Creates a new, autoreleased OFValue containing the specified range. * * @param range The range the OFValue should contain * @return A new, autoreleased OFValue */ -+ (instancetype)valueWithRange: (of_range_t)range; ++ (instancetype)valueWithRange: (OFRange)range; /** * @brief Creates a new, autoreleased OFValue containing the specified point. * * @param point The point the OFValue should contain * @return A new, autoreleased OFValue */ -+ (instancetype)valueWithPoint: (of_point_t)point; ++ (instancetype)valueWithPoint: (OFPoint)point; /** - * @brief Creates a new, autoreleased OFValue containing the specified - * dimension. + * @brief Creates a new, autoreleased OFValue containing the specified size. * - * @param dimension The dimension the OFValue should contain + * @param size The size the OFValue should contain * @return A new, autoreleased OFValue */ -+ (instancetype)valueWithDimension: (of_dimension_t)dimension; ++ (instancetype)valueWithSize: (OFSize)size; /** * @brief Creates a new, autoreleased OFValue containing the specified * rectangle. * - * @param rectangle The rectangle the OFValue should contain + * @param rect The rectangle the OFValue should contain * @return A new, autoreleased OFValue */ -+ (instancetype)valueWithRectangle: (of_rectangle_t)rectangle; ++ (instancetype)valueWithRect: (OFRect)rect; /** * @brief Initializes an already allocated OFValue with the specified bytes of * the specified type. * @@ -150,69 +149,10 @@ * @return An initialized OFValue */ - (instancetype)initWithBytes: (const void *)bytes objCType: (const char *)objCType; -/** - * @brief Initializes an already allocated OFValue containing the specified - * pointer. - * - * Only the raw value of the pointer is stored and no data will be copied. - * - * @param pointer The pointer the OFValue should contain - * @return An initialized OFValue - */ -- (instancetype)initWithPointer: (const void *)pointer; - -/** - * @brief Initializes an already allocated OFValue containing the specified - * non-retained object. - * - * The object is not retained, which makes this useful for storing objects in - * collections without retaining them. - * - * @param object The object the OFValue should contain without retaining it - * @return An initialized OFValue - */ -- (instancetype)initWithNonretainedObject: (id)object; - -/** - * @brief Initializes an already allocated OFValue containing the specified - * range. - * - * @param range The range the OFValue should contain - * @return An initialized OFValue - */ -- (instancetype)initWithRange: (of_range_t)range; - -/** - * @brief Initializes an already allocated OFValue containing the specified - * point. - * - * @param point The point the OFValue should contain - * @return An initialized OFValue - */ -- (instancetype)initWithPoint: (of_point_t)point; - -/** - * @brief Initializes an already allocated OFValue containing the specified - * dimension. - * - * @param dimension The dimension the OFValue should contain - * @return An initialized OFValue - */ -- (instancetype)initWithDimension: (of_dimension_t)dimension; - -/** - * @brief Initializes an already allocated OFValue containing the specified - * rectangle. - * - * @param rectangle The rectangle the OFValue should contain - * @return An initialized OFValue - */ -- (instancetype)initWithRectangle: (of_rectangle_t)rectangle; - /** * @brief Gets the value. * * If the specified size does not match, this raises an * @ref OFOutOfRangeException. Index: src/OFValue.m ================================================================== --- src/OFValue.m +++ src/OFValue.m @@ -13,153 +13,71 @@ * file. */ #import "OFValue.h" #import "OFBytesValue.h" -#import "OFDimensionValue.h" #import "OFMethodSignature.h" #import "OFNonretainedObjectValue.h" #import "OFPointValue.h" #import "OFPointerValue.h" #import "OFRangeValue.h" -#import "OFRectangleValue.h" +#import "OFRectValue.h" +#import "OFSizeValue.h" #import "OFString.h" #import "OFOutOfMemoryException.h" -static struct { - Class isa; -} placeholder; - -@interface OFValuePlaceholder: OFValue -@end - -@implementation OFValuePlaceholder -- (instancetype)initWithBytes: (const void *)bytes - objCType: (const char *)objCType -{ - return (id)[[OFBytesValue alloc] initWithBytes: bytes - objCType: objCType]; -} - -- (instancetype)initWithPointer: (const void *)pointer -{ - return (id)[[OFPointerValue alloc] initWithPointer: pointer]; -} - -- (instancetype)initWithNonretainedObject: (id)object -{ - return (id)[[OFNonretainedObjectValue alloc] - initWithNonretainedObject: object]; -} - -- (instancetype)initWithRange: (of_range_t)range -{ - return (id)[[OFRangeValue alloc] initWithRange: range]; -} - -- (instancetype)initWithPoint: (of_point_t)point -{ - return (id)[[OFPointValue alloc] initWithPoint: point]; -} - -- (instancetype)initWithDimension: (of_dimension_t)dimension -{ - return (id)[[OFDimensionValue alloc] initWithDimension: dimension]; -} - -- (instancetype)initWithRectangle: (of_rectangle_t)rectangle -{ - return (id)[[OFRectangleValue alloc] initWithRectangle: rectangle]; -} -@end - @implementation OFValue -+ (void)initialize -{ - if (self == [OFValue class]) - placeholder.isa = [OFValuePlaceholder class]; -} - + (instancetype)alloc { if (self == [OFValue class]) - return (id)&placeholder; + return [OFBytesValue alloc]; return [super alloc]; } + (instancetype)valueWithBytes: (const void *)bytes objCType: (const char *)objCType { - return [[[self alloc] initWithBytes: bytes - objCType: objCType] autorelease]; + return [[[OFBytesValue alloc] initWithBytes: bytes + objCType: objCType] autorelease]; } + (instancetype)valueWithPointer: (const void *)pointer { - return [[[self alloc] initWithPointer: pointer] autorelease]; + return [[[OFPointerValue alloc] initWithPointer: pointer] autorelease]; } + (instancetype)valueWithNonretainedObject: (id)object { - return [[[self alloc] initWithNonretainedObject: object] autorelease]; -} - -+ (instancetype)valueWithRange: (of_range_t)range -{ - return [[[self alloc] initWithRange: range] autorelease]; -} - -+ (instancetype)valueWithPoint: (of_point_t)point -{ - return [[[self alloc] initWithPoint: point] autorelease]; -} - -+ (instancetype)valueWithDimension: (of_dimension_t)dimension -{ - return [[[self alloc] initWithDimension: dimension] autorelease]; -} - -+ (instancetype)valueWithRectangle: (of_rectangle_t)rectangle -{ - return [[[self alloc] initWithRectangle: rectangle] autorelease]; + return [[[OFNonretainedObjectValue alloc] + initWithNonretainedObject: object] autorelease]; +} + ++ (instancetype)valueWithRange: (OFRange)range +{ + return [[[OFRangeValue alloc] initWithRange: range] autorelease]; +} + ++ (instancetype)valueWithPoint: (OFPoint)point +{ + return [[[OFPointValue alloc] initWithPoint: point] autorelease]; +} + ++ (instancetype)valueWithSize: (OFSize)size +{ + return [[[OFSizeValue alloc] initWithSize: size] autorelease]; +} + ++ (instancetype)valueWithRect: (OFRect)rect +{ + return [[[OFRectValue alloc] initWithRect: rect] autorelease]; } - (instancetype)initWithBytes: (const void *)bytes objCType: (const char *)objCType { - OF_INVALID_INIT_METHOD -} - -- (instancetype)initWithPointer: (const void *)pointer -{ - OF_INVALID_INIT_METHOD -} - -- (instancetype)initWithNonretainedObject: (id)object -{ - OF_INVALID_INIT_METHOD -} - -- (instancetype)initWithRange: (of_range_t)range -{ - OF_INVALID_INIT_METHOD -} - -- (instancetype)initWithPoint: (of_point_t)point -{ - OF_INVALID_INIT_METHOD -} - -- (instancetype)initWithDimension: (of_dimension_t)dimension -{ - OF_INVALID_INIT_METHOD -} - -- (instancetype)initWithRectangle: (of_rectangle_t)rectangle -{ OF_INVALID_INIT_METHOD } - (bool)isEqual: (id)object { @@ -177,50 +95,50 @@ objCType = self.objCType; if (strcmp([object objCType], objCType) != 0) return false; - size = of_sizeof_type_encoding(objCType); + size = OFSizeOfTypeEncoding(objCType); - value = of_alloc(1, size); + value = OFAllocMemory(1, size); @try { - otherValue = of_alloc(1, size); + otherValue = OFAllocMemory(1, size); } @catch (id e) { - free(value); + OFFreeMemory(value); @throw e; } @try { [self getValue: value size: size]; [object getValue: otherValue size: size]; ret = (memcmp(value, otherValue, size) == 0); } @finally { - free(value); - free(otherValue); + OFFreeMemory(value); + OFFreeMemory(otherValue); } return ret; } - (unsigned long)hash { - size_t size = of_sizeof_type_encoding(self.objCType); + size_t size = OFSizeOfTypeEncoding(self.objCType); unsigned char *value; - uint32_t hash; + unsigned long hash; - value = of_alloc(1, size); + value = OFAllocMemory(1, size); @try { [self getValue: value size: size]; - OF_HASH_INIT(hash); + OFHashInit(&hash); for (size_t i = 0; i < size; i++) - OF_HASH_ADD(hash, value[i]); + OFHashAdd(&hash, value[i]); - OF_HASH_FINALIZE(hash); + OFHashFinalize(&hash); } @finally { - free(value); + OFFreeMemory(value); } return hash; } @@ -251,46 +169,46 @@ id ret; [self getValue: &ret size: sizeof(ret)]; return ret; } -- (of_range_t)rangeValue +- (OFRange)rangeValue +{ + OFRange ret; + [self getValue: &ret size: sizeof(ret)]; + return ret; +} + +- (OFPoint)pointValue { - of_range_t ret; + OFPoint ret; [self getValue: &ret size: sizeof(ret)]; return ret; } -- (of_point_t)pointValue +- (OFSize)sizeValue { - of_point_t ret; + OFSize ret; [self getValue: &ret size: sizeof(ret)]; return ret; } -- (of_dimension_t)dimensionValue -{ - of_dimension_t ret; - [self getValue: &ret size: sizeof(ret)]; - return ret; -} - -- (of_rectangle_t)rectangleValue -{ - of_rectangle_t ret; +- (OFRect)rectValue +{ + OFRect ret; [self getValue: &ret size: sizeof(ret)]; return ret; } - (OFString *)description { OFMutableString *ret = [OFMutableString stringWithString: @" 0) @@ -297,14 +215,14 @@ [ret appendString: @" "]; [ret appendFormat: @"%02x", value[i]]; } } @finally { - free(value); + OFFreeMemory(value); } [ret appendString: @">"]; [ret makeImmutable]; return ret; } @end Index: src/OFWin32ConsoleStdIOStream.h ================================================================== --- src/OFWin32ConsoleStdIOStream.h +++ src/OFWin32ConsoleStdIOStream.h @@ -11,22 +11,20 @@ * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ -#define OF_STDIO_STREAM_WIN32CONSOLE_H - #import "OFStdIOStream.h" OF_ASSUME_NONNULL_BEGIN @interface OFWin32ConsoleStdIOStream: OFStdIOStream { HANDLE _handle; WORD _attributes; - of_char16_t _incompleteUTF16Surrogate; + OFChar16 _incompleteUTF16Surrogate; char _incompleteUTF8Surrogate[4]; size_t _incompleteUTF8SurrogateLen; } @end OF_ASSUME_NONNULL_END Index: src/OFWin32ConsoleStdIOStream.m ================================================================== --- src/OFWin32ConsoleStdIOStream.m +++ src/OFWin32ConsoleStdIOStream.m @@ -24,11 +24,11 @@ * write() suddenly returns the number of characters - instead of bytes - * written and read() just returns 0 as soon as a Unicode character is being * read. * * Therefore, instead of just using the UTF-8 codepage, this captures all reads - * and writes to of_std{in,out,err} on the low level, interprets the buffer as + * and writes to OFStd{In,Out,Err} on the low level, interprets the buffer as * UTF-8 and converts to / from UTF-16 to use ReadConsoleW() / WriteConsoleW(). * Doing so is safe, as the console only supports text anyway and thus it does * not matter if binary gets garbled by the conversion (e.g. because invalid * UTF-8 gets converted to U+FFFD). * @@ -35,12 +35,10 @@ * In order to not do this when redirecting input / output to a file (as the * file would then be read / written in the wrong encoding and break reading / * writing binary), it checks that the handle is indeed a console. */ -#define OF_STDIO_STREAM_WIN32_CONSOLE_M - #include "config.h" #include #include #include @@ -58,24 +56,24 @@ #import "OFReadFailedException.h" #import "OFWriteFailedException.h" #include -static of_string_encoding_t +static OFStringEncoding codepageToEncoding(UINT codepage) { switch (codepage) { case 437: - return OF_STRING_ENCODING_CODEPAGE_437; + return OFStringEncodingCodepage437; case 850: - return OF_STRING_ENCODING_CODEPAGE_850; + return OFStringEncodingCodepage850; case 858: - return OF_STRING_ENCODING_CODEPAGE_858; + return OFStringEncodingCodepage858; case 1251: - return OF_STRING_ENCODING_WINDOWS_1251; + return OFStringEncodingWindows1251; case 1252: - return OF_STRING_ENCODING_WINDOWS_1252; + return OFStringEncodingWindows1252; default: @throw [OFInvalidEncodingException exception]; } } @@ -86,17 +84,17 @@ if (self != [OFWin32ConsoleStdIOStream class]) return; if ((fd = _fileno(stdin)) >= 0) - of_stdin = [[OFWin32ConsoleStdIOStream alloc] + OFStdIn = [[OFWin32ConsoleStdIOStream alloc] of_initWithFileDescriptor: fd]; if ((fd = _fileno(stdout)) >= 0) - of_stdout = [[OFWin32ConsoleStdIOStream alloc] + OFStdOut = [[OFWin32ConsoleStdIOStream alloc] of_initWithFileDescriptor: fd]; if ((fd = _fileno(stderr)) >= 0) - of_stderr = [[OFWin32ConsoleStdIOStream alloc] + OFStdErr = [[OFWin32ConsoleStdIOStream alloc] of_initWithFileDescriptor: fd]; } - (instancetype)of_initWithFileDescriptor: (int)fd { @@ -126,17 +124,17 @@ - (size_t)lowlevelReadIntoBuffer: (void *)buffer_ length: (size_t)length { void *pool = objc_autoreleasePoolPush(); char *buffer = buffer_; - of_char16_t *UTF16; + OFChar16 *UTF16; size_t j = 0; if (length > UINT32_MAX) @throw [OFOutOfRangeException exception]; - UTF16 = of_alloc(length, sizeof(of_char16_t)); + UTF16 = OFAllocMemory(length, sizeof(OFChar16)); @try { DWORD UTF16Len; OFMutableData *rest = nil; size_t i = 0; @@ -146,11 +144,11 @@ @throw [OFReadFailedException exceptionWithObject: self requestedLength: length * 2 errNo: EIO]; } else { - of_string_encoding_t encoding; + OFStringEncoding encoding; OFString *string; size_t stringLen; if (!ReadConsoleA(_handle, (char *)UTF16, (DWORD)length, &UTF16Len, NULL)) @@ -171,17 +169,17 @@ UTF16Len = (DWORD)stringLen; memcpy(UTF16, string.UTF16String, stringLen); } if (UTF16Len > 0 && _incompleteUTF16Surrogate != 0) { - of_unichar_t c = + OFUnichar c = (((_incompleteUTF16Surrogate & 0x3FF) << 10) | (UTF16[0] & 0x3FF)) + 0x10000; char UTF8[4]; size_t UTF8Len; - if ((UTF8Len = of_string_utf8_encode(c, UTF8)) == 0) + if ((UTF8Len = OFUTF8StringEncode(c, UTF8)) == 0) @throw [OFInvalidEncodingException exception]; if (UTF8Len <= length) { memcpy(buffer, UTF8, UTF8Len); j += UTF8Len; @@ -195,20 +193,20 @@ _incompleteUTF16Surrogate = 0; i++; } for (; i < UTF16Len; i++) { - of_unichar_t c = UTF16[i]; + OFUnichar c = UTF16[i]; char UTF8[4]; size_t UTF8Len; /* Missing high surrogate */ if ((c & 0xFC00) == 0xDC00) @throw [OFInvalidEncodingException exception]; if ((c & 0xFC00) == 0xD800) { - of_char16_t next; + OFChar16 next; if (UTF16Len <= i + 1) { _incompleteUTF16Surrogate = c; if (rest != nil) { @@ -234,11 +232,11 @@ 0x10000; i++; } - if ((UTF8Len = of_string_utf8_encode(c, UTF8)) == 0) + if ((UTF8Len = OFUTF8StringEncode(c, UTF8)) == 0) @throw [OFInvalidEncodingException exception]; if (j + UTF8Len <= length) { memcpy(buffer + j, UTF8, UTF8Len); j += UTF8Len; @@ -251,11 +249,11 @@ } if (rest != nil) [self unreadFromBuffer: rest.items length: rest.count]; } @finally { - free(UTF16); + OFFreeMemory(UTF16); } objc_autoreleasePoolPop(pool); return j; @@ -262,27 +260,27 @@ } - (size_t)lowlevelWriteBuffer: (const void *)buffer_ length: (size_t)length { const char *buffer = buffer_; - of_char16_t *tmp; + OFChar16 *tmp; size_t i = 0, j = 0; if (length > SIZE_MAX / 2) @throw [OFOutOfRangeException exception]; if (_incompleteUTF8SurrogateLen > 0) { - of_unichar_t c; - of_char16_t UTF16[2]; + OFUnichar c; + OFChar16 UTF16[2]; ssize_t UTF8Len; size_t toCopy; DWORD UTF16Len, bytesWritten; - UTF8Len = -of_string_utf8_decode( + UTF8Len = -OFUTF8StringDecode( _incompleteUTF8Surrogate, _incompleteUTF8SurrogateLen, &c); - OF_ENSURE(UTF8Len > 0); + OFEnsure(UTF8Len > 0); toCopy = UTF8Len - _incompleteUTF8SurrogateLen; if (toCopy > length) toCopy = length; @@ -291,11 +289,11 @@ _incompleteUTF8SurrogateLen += toCopy; if (_incompleteUTF8SurrogateLen < (size_t)UTF8Len) return 0; - UTF8Len = of_string_utf8_decode( + UTF8Len = OFUTF8StringDecode( _incompleteUTF8Surrogate, _incompleteUTF8SurrogateLen, &c); if (UTF8Len <= 0 || c > 0x10FFFF) { assert(UTF8Len == 0 || UTF8Len < -4); @@ -324,11 +322,11 @@ } else { void *pool = objc_autoreleasePoolPush(); OFString *string = [OFString stringWithUTF16String: UTF16 length: UTF16Len]; - of_string_encoding_t encoding = + OFStringEncoding encoding = codepageToEncoding(GetConsoleOutputCP()); size_t nativeLen = [string cStringLengthWithEncoding: encoding]; if (nativeLen > UINT32_MAX) @@ -355,23 +353,23 @@ _incompleteUTF8SurrogateLen = 0; i += toCopy; } - tmp = of_alloc(length * 2, sizeof(of_char16_t)); + tmp = OFAllocMemory(length * 2, sizeof(OFChar16)); @try { DWORD bytesWritten; while (i < length) { - of_unichar_t c; + OFUnichar c; ssize_t UTF8Len; - UTF8Len = of_string_utf8_decode(buffer + i, length - i, + UTF8Len = OFUTF8StringDecode(buffer + i, length - i, &c); if (UTF8Len < 0 && UTF8Len >= -4) { - OF_ENSURE(length - i < 4); + OFEnsure(length - i < 4); memcpy(_incompleteUTF8Surrogate, buffer + i, length - i); _incompleteUTF8SurrogateLen = length - i; @@ -407,11 +405,11 @@ errNo: EIO]; } else { void *pool = objc_autoreleasePoolPush(); OFString *string = [OFString stringWithUTF16String: tmp length: j]; - of_string_encoding_t encoding = + OFStringEncoding encoding = codepageToEncoding(GetConsoleOutputCP()); size_t nativeLen = [string cStringLengthWithEncoding: encoding]; if (nativeLen > UINT32_MAX) @@ -434,11 +432,11 @@ exceptionWithObject: self requestedLength: j * 2 bytesWritten: bytesWritten * 2 errNo: 0]; } @finally { - free(tmp); + OFFreeMemory(tmp); } /* * We do not count in bytes when writing to the Win32 console. But * since any incomplete write is an exception here anyway, we can just @@ -580,19 +578,19 @@ csbi.dwCursorPosition.X = column; SetConsoleCursorPosition(_handle, csbi.dwCursorPosition); } -- (void)setCursorPosition: (of_point_t)position +- (void)setCursorPosition: (OFPoint)position { if (position.x < 0 || position.y < 0) @throw [OFInvalidArgumentException exception]; SetConsoleCursorPosition(_handle, (COORD){ position.x, position.y }); } -- (void)setRelativeCursorPosition: (of_point_t)position +- (void)setRelativeCursorPosition: (OFPoint)position { CONSOLE_SCREEN_BUFFER_INFO csbi; if (!GetConsoleScreenBufferInfo(_handle, &csbi)) return; Index: src/OFWindowsRegistryKey.m ================================================================== --- src/OFWindowsRegistryKey.m +++ src/OFWindowsRegistryKey.m @@ -285,11 +285,11 @@ if (data.itemSize != 1) @throw [OFInvalidFormatException exception]; if ([OFSystemInfo isWindowsNT]) { - const of_char16_t *UTF16String = data.items; + const OFChar16 *UTF16String = data.items; size_t length = data.count; if (length % 2 == 1) @throw [OFInvalidFormatException exception]; @@ -349,13 +349,13 @@ OFData *data; if ([OFSystemInfo isWindowsNT]) data = [OFData dataWithItems: string.UTF16String count: string.UTF16StringLength + 1 - itemSize: sizeof(of_char16_t)]; + itemSize: sizeof(OFChar16)]; else { - of_string_encoding_t encoding = [OFLocale encoding]; + OFStringEncoding encoding = [OFLocale encoding]; const char *cString = [string cStringWithEncoding: encoding]; size_t length = [string cStringLengthWithEncoding: encoding]; data = [OFData dataWithItems: cString count: length + 1]; } Index: src/OFXMLAttribute.m ================================================================== --- src/OFXMLAttribute.m +++ src/OFXMLAttribute.m @@ -74,11 +74,11 @@ @try { void *pool = objc_autoreleasePoolPush(); if (![element.name isEqual: self.className] || - ![element.namespace isEqual: OF_SERIALIZATION_NS]) + ![element.namespace isEqual: OFSerializationNS]) @throw [OFInvalidArgumentException exception]; _name = [[element attributeForName: @"name"].stringValue copy]; _namespace = [[element attributeForName: @"namespace"] .stringValue copy]; @@ -138,19 +138,19 @@ return true; } - (unsigned long)hash { - uint32_t hash; - - OF_HASH_INIT(hash); - - OF_HASH_ADD_HASH(hash, _name.hash); - OF_HASH_ADD_HASH(hash, _namespace.hash); - OF_HASH_ADD_HASH(hash, _stringValue.hash); - - OF_HASH_FINALIZE(hash); + unsigned long hash; + + OFHashInit(&hash); + + OFHashAddHash(&hash, _name.hash); + OFHashAddHash(&hash, _namespace.hash); + OFHashAddHash(&hash, _stringValue.hash); + + OFHashFinalize(&hash); return hash; } - (OFXMLElement *)XMLElementBySerializing @@ -157,11 +157,11 @@ { void *pool = objc_autoreleasePoolPush(); OFXMLElement *element; element = [OFXMLElement elementWithName: self.className - namespace: OF_SERIALIZATION_NS]; + namespace: OFSerializationNS]; [element addAttributeWithName: @"name" stringValue: _name]; if (_namespace != nil) [element addAttributeWithName: @"namespace" stringValue: _namespace]; Index: src/OFXMLCDATA.m ================================================================== --- src/OFXMLCDATA.m +++ src/OFXMLCDATA.m @@ -48,11 +48,11 @@ @try { void *pool = objc_autoreleasePoolPush(); if (![element.name isEqual: self.className] || - ![element.namespace isEqual: OF_SERIALIZATION_NS]) + ![element.namespace isEqual: OFSerializationNS]) @throw [OFInvalidArgumentException exception]; _CDATA = [element.stringValue copy]; objc_autoreleasePoolPop(pool); @@ -134,11 +134,11 @@ - (OFXMLElement *)XMLElementBySerializing { OFXMLElement *element = [OFXMLElement elementWithName: self.className - namespace: OF_SERIALIZATION_NS]; + namespace: OFSerializationNS]; [element addChild: self]; return element; } @end Index: src/OFXMLCharacters.m ================================================================== --- src/OFXMLCharacters.m +++ src/OFXMLCharacters.m @@ -48,11 +48,11 @@ @try { void *pool = objc_autoreleasePoolPush(); if (![element.name isEqual: self.className] || - ![element.namespace isEqual: OF_SERIALIZATION_NS]) + ![element.namespace isEqual: OFSerializationNS]) @throw [OFInvalidArgumentException exception]; _characters = [element.stringValue copy]; objc_autoreleasePoolPop(pool); @@ -125,9 +125,9 @@ } - (OFXMLElement *)XMLElementBySerializing { return [OFXMLElement elementWithName: self.className - namespace: OF_SERIALIZATION_NS + namespace: OFSerializationNS stringValue: _characters]; } @end Index: src/OFXMLComment.h ================================================================== --- src/OFXMLComment.h +++ src/OFXMLComment.h @@ -22,30 +22,35 @@ * * @brief A class for representing XML comments. */ @interface OFXMLComment: OFXMLNode { - OFString *_comment; + OFString *_text; OF_RESERVE_IVARS(OFXMLComment, 4) } /** - * @brief Creates a new OFXMLComment with the specified string. + * @brief The comment text. + */ +@property (readonly, nonatomic) OFString *text; + +/** + * @brief Creates a new OFXMLComment with the specified text. * - * @param string The string for the comment + * @param text The text for the comment * @return A new OFXMLComment */ -+ (instancetype)commentWithString: (OFString *)string; ++ (instancetype)commentWithText: (OFString *)text; /** * @brief Initializes an already allocated OFXMLComment with the specified - * string. + * text. * - * @param string The string for the comment + * @param text The text for the comment * @return An initialized OFXMLComment */ -- (instancetype)initWithString: (OFString *)string; +- (instancetype)initWithText: (OFString *)text; - (instancetype)initWithSerialization: (OFXMLElement *)element; @end OF_ASSUME_NONNULL_END Index: src/OFXMLComment.m ================================================================== --- src/OFXMLComment.m +++ src/OFXMLComment.m @@ -23,21 +23,23 @@ #import "OFXMLElement.h" #import "OFInvalidArgumentException.h" @implementation OFXMLComment -+ (instancetype)commentWithString: (OFString *)string +@synthesize text = _text; + ++ (instancetype)commentWithText: (OFString *)text { - return [[[self alloc] initWithString: string] autorelease]; + return [[[self alloc] initWithText: text] autorelease]; } -- (instancetype)initWithString: (OFString *)string +- (instancetype)initWithText: (OFString *)text { self = [super of_init]; @try { - _comment = [string copy]; + _text = [text copy]; } @catch (id e) { [self release]; @throw e; } @@ -50,14 +52,14 @@ @try { void *pool = objc_autoreleasePoolPush(); if (![element.name isEqual: self.className] || - ![element.namespace isEqual: OF_SERIALIZATION_NS]) + ![element.namespace isEqual: OFSerializationNS]) @throw [OFInvalidArgumentException exception]; - _comment = [element.stringValue copy]; + _text = [element.stringValue copy]; objc_autoreleasePoolPop(pool); } @catch (id e) { [self release]; @throw e; @@ -66,11 +68,11 @@ return self; } - (void)dealloc { - [_comment release]; + [_text release]; [super dealloc]; } - (bool)isEqual: (id)object @@ -83,63 +85,62 @@ if (![object isKindOfClass: [OFXMLComment class]]) return false; comment = object; - return ([comment->_comment isEqual: _comment]); + return ([comment->_text isEqual: _text]); } - (unsigned long)hash { - return _comment.hash; + return _text.hash; } - (OFString *)stringValue { return @""; } - (OFString *)XMLString { - return [OFString stringWithFormat: @"", _comment]; + return [OFString stringWithFormat: @"", _text]; } - (OFString *)XMLStringWithIndentation: (unsigned int)indentation { - return [OFString stringWithFormat: @"", _comment]; + return [OFString stringWithFormat: @"", _text]; } - (OFString *)XMLStringWithIndentation: (unsigned int)indentation level: (unsigned int)level { OFString *ret; if (indentation > 0 && level > 0) { - char *whitespaces = of_alloc((level * indentation) + 1, 1); + char *whitespaces = OFAllocMemory((level * indentation) + 1, 1); memset(whitespaces, ' ', level * indentation); whitespaces[level * indentation] = 0; @try { ret = [OFString stringWithFormat: @"%s", - whitespaces, - _comment]; + whitespaces, _text]; } @finally { - free(whitespaces); + OFFreeMemory(whitespaces); } } else - ret = [OFString stringWithFormat: @"", _comment]; + ret = [OFString stringWithFormat: @"", _text]; return ret; } - (OFString *)description { - return [OFString stringWithFormat: @"", _comment]; + return [OFString stringWithFormat: @"", _text]; } - (OFXMLElement *)XMLElementBySerializing { return [OFXMLElement elementWithName: self.className - namespace: OF_SERIALIZATION_NS - stringValue: _comment]; + namespace: OFSerializationNS + stringValue: _text]; } @end Index: src/OFXMLElement+Serialization.m ================================================================== --- src/OFXMLElement+Serialization.m +++ src/OFXMLElement+Serialization.m @@ -30,11 +30,11 @@ void *pool = objc_autoreleasePoolPush(); Class class; id object; if ((class = objc_getClass([_name cStringWithEncoding: - OF_STRING_ENCODING_ASCII])) == Nil) + OFStringEncodingASCII])) == Nil) @throw [OFInvalidArgumentException exception]; if (![class conformsToProtocol: @protocol(OFSerialization)]) @throw [OFInvalidArgumentException exception]; Index: src/OFXMLElement.m ================================================================== --- src/OFXMLElement.m +++ src/OFXMLElement.m @@ -206,11 +206,11 @@ @throw [OFInvalidArgumentException exception]; pool = objc_autoreleasePoolPush(); parser = [OFXMLParser parser]; - builder = [OFXMLElementBuilder elementBuilder]; + builder = [OFXMLElementBuilder builder]; delegate = [[[OFXMLElementElementBuilderDelegate alloc] init] autorelease]; parser.delegate = builder; builder.delegate = delegate; @@ -237,11 +237,11 @@ [self release]; pool = objc_autoreleasePoolPush(); parser = [OFXMLParser parser]; - builder = [OFXMLElementBuilder elementBuilder]; + builder = [OFXMLElementBuilder builder]; delegate = [[[OFXMLElementElementBuilderDelegate alloc] init] autorelease]; parser.delegate = builder; builder.delegate = delegate; @@ -268,11 +268,11 @@ OFXMLElement *childrenElement; OFEnumerator *keyEnumerator, *objectEnumerator; OFString *key, *object; if (![element.name isEqual: self.className] || - ![element.namespace isEqual: OF_SERIALIZATION_NS]) + ![element.namespace isEqual: OFSerializationNS]) @throw [OFInvalidArgumentException exception]; _name = [[element attributeForName: @"name"].stringValue copy]; _namespace = [[element attributeForName: @"namespace"] .stringValue copy]; @@ -279,20 +279,20 @@ _defaultNamespace = [[element attributeForName: @"defaultNamespace"].stringValue copy]; attributesElement = [[element elementForName: @"attributes" - namespace: OF_SERIALIZATION_NS] elementsForNamespace: - OF_SERIALIZATION_NS].firstObject; + namespace: OFSerializationNS] elementsForNamespace: + OFSerializationNS].firstObject; namespacesElement = [[element elementForName: @"namespaces" - namespace: OF_SERIALIZATION_NS] elementsForNamespace: - OF_SERIALIZATION_NS].firstObject; + namespace: OFSerializationNS] elementsForNamespace: + OFSerializationNS].firstObject; childrenElement = [[element elementForName: @"children" - namespace: OF_SERIALIZATION_NS] elementsForNamespace: - OF_SERIALIZATION_NS].firstObject; + namespace: OFSerializationNS] elementsForNamespace: + OFSerializationNS].firstObject; _attributes = [attributesElement.objectByDeserializing mutableCopy]; _namespaces = [namespacesElement.objectByDeserializing mutableCopy]; @@ -450,11 +450,11 @@ else defaultNS = _defaultNamespace; i = 0; length = _name.UTF8StringLength + 3 + (level * indentation); - cString = of_alloc(length, 1); + cString = OFAllocMemory(length, 1); @try { memset(cString + i, ' ', level * indentation); i += level * indentation; @@ -461,11 +461,11 @@ /* Start of tag */ cString[i++] = '<'; if (prefix != nil && ![_namespace isEqual: defaultNS]) { length += prefix.UTF8StringLength + 1; - cString = of_realloc(cString, length, 1); + cString = OFResizeMemory(cString, length, 1); memcpy(cString + i, prefix.UTF8String, prefix.UTF8StringLength); i += prefix.UTF8StringLength; cString[i++] = ':'; @@ -477,11 +477,11 @@ /* xmlns if necessary */ if (prefix == nil && ((_namespace != nil && ![_namespace isEqual: defaultNS]) || (_namespace == nil && defaultNS != nil))) { length += _namespace.UTF8StringLength + 9; - cString = of_realloc(cString, length, 1); + cString = OFResizeMemory(cString, length, 1); memcpy(cString + i, " xmlns='", 8); i += 8; memcpy(cString + i, _namespace.UTF8String, _namespace.UTF8StringLength); @@ -510,11 +510,11 @@ element: self]; length += attributeNameLength + (attributePrefix != nil ? attributePrefix.UTF8StringLength + 1 : 0) + tmp.UTF8StringLength + 4; - cString = of_realloc(cString, length, 1); + cString = OFResizeMemory(cString, length, 1); cString[i++] = ' '; if (attributePrefix != nil) { memcpy(cString + i, attributePrefix.UTF8String, attributePrefix.UTF8StringLength); @@ -580,11 +580,11 @@ if (indent) [tmp addItem: "\n"]; length += tmp.count + _name.UTF8StringLength + 2 + (indent ? level * indentation : 0); - cString = of_realloc(cString, length, 1); + cString = OFResizeMemory(cString, length, 1); cString[i++] = '>'; memcpy(cString + i, tmp.items, tmp.count); i += tmp.count; @@ -596,11 +596,11 @@ cString[i++] = '<'; cString[i++] = '/'; if (prefix != nil) { length += prefix.UTF8StringLength + 1; - cString = of_realloc(cString, length, 1); + cString = OFResizeMemory(cString, length, 1); memcpy(cString + i, prefix.UTF8String, prefix.UTF8StringLength); i += prefix.UTF8StringLength; cString[i++] = ':'; @@ -617,11 +617,11 @@ objc_autoreleasePoolPop(pool); ret = [OFString stringWithUTF8String: cString length: length]; } @finally { - free(cString); + OFFreeMemory(cString); } return ret; } - (OFString *)XMLString @@ -653,11 +653,11 @@ { void *pool = objc_autoreleasePoolPush(); OFXMLElement *element; element = [OFXMLElement elementWithName: self.className - namespace: OF_SERIALIZATION_NS]; + namespace: OFSerializationNS]; if (_name != nil) [element addAttributeWithName: @"name" stringValue: _name]; if (_namespace != nil) @@ -671,11 +671,11 @@ if (_attributes != nil) { OFXMLElement *attributesElement; attributesElement = [OFXMLElement elementWithName: @"attributes" - namespace: OF_SERIALIZATION_NS]; + namespace: OFSerializationNS]; [attributesElement addChild: _attributes.XMLElementBySerializing]; [element addChild: attributesElement]; } @@ -690,11 +690,11 @@ @"http://www.w3.org/2000/xmlns/"]; if (namespacesCopy.count > 0) { namespacesElement = [OFXMLElement elementWithName: @"namespaces" - namespace: OF_SERIALIZATION_NS]; + namespace: OFSerializationNS]; [namespacesElement addChild: namespacesCopy.XMLElementBySerializing]; [element addChild: namespacesElement]; } } @@ -702,11 +702,11 @@ if (_children != nil) { OFXMLElement *childrenElement; childrenElement = [OFXMLElement elementWithName: @"children" - namespace: OF_SERIALIZATION_NS]; + namespace: OFSerializationNS]; [childrenElement addChild: _children.XMLElementBySerializing]; [element addChild: childrenElement]; } [element retain]; @@ -1012,26 +1012,26 @@ return true; } - (unsigned long)hash { - uint32_t hash; - - OF_HASH_INIT(hash); - - OF_HASH_ADD_HASH(hash, _name.hash); - OF_HASH_ADD_HASH(hash, _namespace.hash); - OF_HASH_ADD_HASH(hash, _defaultNamespace.hash); - OF_HASH_ADD_HASH(hash, _attributes.hash); - OF_HASH_ADD_HASH(hash, _namespaces.hash); - OF_HASH_ADD_HASH(hash, _children.hash); - - OF_HASH_FINALIZE(hash); + unsigned long hash; + + OFHashInit(&hash); + + OFHashAddHash(&hash, _name.hash); + OFHashAddHash(&hash, _namespace.hash); + OFHashAddHash(&hash, _defaultNamespace.hash); + OFHashAddHash(&hash, _attributes.hash); + OFHashAddHash(&hash, _namespaces.hash); + OFHashAddHash(&hash, _children.hash); + + OFHashFinalize(&hash); return hash; } - (id)copy { return [[[self class] alloc] initWithElement: self]; } @end Index: src/OFXMLElementBuilder.h ================================================================== --- src/OFXMLElementBuilder.h +++ src/OFXMLElementBuilder.h @@ -118,9 +118,9 @@ /** * @brief Creates a new element builder. * * @return A new, autoreleased OFXMLElementBuilder */ -+ (instancetype)elementBuilder; ++ (instancetype)builder; @end OF_ASSUME_NONNULL_END Index: src/OFXMLElementBuilder.m ================================================================== --- src/OFXMLElementBuilder.m +++ src/OFXMLElementBuilder.m @@ -14,25 +14,25 @@ */ #include "config.h" #import "OFXMLElementBuilder.h" -#import "OFXMLElement.h" +#import "OFArray.h" #import "OFXMLAttribute.h" -#import "OFXMLCharacters.h" #import "OFXMLCDATA.h" +#import "OFXMLCharacters.h" #import "OFXMLComment.h" -#import "OFXMLProcessingInstructions.h" +#import "OFXMLElement.h" #import "OFXMLParser.h" -#import "OFArray.h" +#import "OFXMLProcessingInstruction.h" #import "OFMalformedXMLException.h" @implementation OFXMLElementBuilder @synthesize delegate = _delegate; -+ (instancetype)elementBuilder ++ (instancetype)builder { return [[[self alloc] init] autorelease]; } - (instancetype)init @@ -54,15 +54,17 @@ [_stack release]; [super dealloc]; } -- (void)parser: (OFXMLParser *)parser - foundProcessingInstructions: (OFString *)pi +- (void)parser: (OFXMLParser *)parser + foundProcessingInstructionWithTarget: (OFString *)target + data: (OFString *)data { - OFXMLProcessingInstructions *node = [OFXMLProcessingInstructions - processingInstructionsWithString: pi]; + OFXMLProcessingInstruction *node = [OFXMLProcessingInstruction + processingInstructionWithTarget: target + data: data]; OFXMLElement *parent = _stack.lastObject; if (parent != nil) [parent addChild: node]; else if ([_delegate respondsToSelector: @@ -152,11 +154,11 @@ } - (void)parser: (OFXMLParser *)parser foundComment: (OFString *)comment { - OFXMLComment *node = [OFXMLComment commentWithString: comment]; + OFXMLComment *node = [OFXMLComment commentWithText: comment]; OFXMLElement *parent = _stack.lastObject; if (parent != nil) [parent addChild: node]; else if ([_delegate respondsToSelector: Index: src/OFXMLParser.h ================================================================== --- src/OFXMLParser.h +++ src/OFXMLParser.h @@ -32,18 +32,20 @@ * @brief A protocol that needs to be implemented by delegates for OFXMLParser. */ @protocol OFXMLParserDelegate @optional /** - * @brief This callback is called when the XML parser found processing - * instructions. - * - * @param parser The parser which found processing instructions - * @param processingInstructions The processing instructions - */ -- (void)parser: (OFXMLParser *)parser - foundProcessingInstructions: (OFString *)processingInstructions; + * @brief This callback is called when the XML parser found a processing + * instruction. + * + * @param parser The parser which found a processing instruction + * @param target The target of the processing instruction + * @param data The data of the processing instruction + */ +- (void)parser: (OFXMLParser *)parser + foundProcessingInstructionWithTarget: (OFString *)target + data: (OFString *)data; /** * @brief This callback is called when the XML parser found the start of a new * tag. * @@ -126,32 +128,11 @@ */ OF_SUBCLASSING_RESTRICTED @interface OFXMLParser: OFObject { id _Nullable _delegate; - enum of_xml_parser_state { - OF_XMLPARSER_IN_BYTE_ORDER_MARK, - OF_XMLPARSER_OUTSIDE_TAG, - OF_XMLPARSER_TAG_OPENED, - OF_XMLPARSER_IN_PROCESSING_INSTRUCTIONS, - OF_XMLPARSER_IN_TAG_NAME, - OF_XMLPARSER_IN_CLOSE_TAG_NAME, - OF_XMLPARSER_IN_TAG, - OF_XMLPARSER_IN_ATTRIBUTE_NAME, - OF_XMLPARSER_EXPECT_ATTRIBUTE_EQUAL_SIGN, - OF_XMLPARSER_EXPECT_ATTRIBUTE_DELIMITER, - OF_XMLPARSER_IN_ATTRIBUTE_VALUE, - OF_XMLPARSER_EXPECT_TAG_CLOSE, - OF_XMLPARSER_EXPECT_SPACE_OR_TAG_CLOSE, - OF_XMLPARSER_IN_EXCLAMATION_MARK, - OF_XMLPARSER_IN_CDATA_OPENING, - OF_XMLPARSER_IN_CDATA, - OF_XMLPARSER_IN_COMMENT_OPENING, - OF_XMLPARSER_IN_COMMENT_1, - OF_XMLPARSER_IN_COMMENT_2, - OF_XMLPARSER_IN_DOCTYPE - } _state; + uint_least8_t _state; size_t _i, _last; const char *_Nullable _data; OFMutableData *_buffer; OFString *_Nullable _name, *_Nullable _prefix; OFMutableArray @@ -163,11 +144,11 @@ OFMutableArray OF_GENERIC(OFString *) *_previous; size_t _level; bool _acceptProlog; size_t _lineNumber; bool _lastCarriageReturn, _finishedParsing; - of_string_encoding_t _encoding; + OFStringEncoding _encoding; size_t _depthLimit; } /** * @brief The delegate that is used by the XML parser. Index: src/OFXMLParser.m ================================================================== --- src/OFXMLParser.m +++ src/OFXMLParser.m @@ -18,36 +18,60 @@ #define OF_XML_PARSER_M #include #import "OFXMLParser.h" -#import "OFString.h" #import "OFArray.h" -#import "OFDictionary.h" +#import "OFCharacterSet.h" #import "OFData.h" -#import "OFXMLAttribute.h" -#import "OFStream.h" +#import "OFDictionary.h" #ifdef OF_HAVE_FILES # import "OFFile.h" #endif +#import "OFStream.h" +#import "OFString.h" #import "OFSystemInfo.h" +#import "OFXMLAttribute.h" #import "OFInitializationFailedException.h" #import "OFInvalidArgumentException.h" #import "OFInvalidEncodingException.h" #import "OFInvalidFormatException.h" #import "OFMalformedXMLException.h" #import "OFOutOfRangeException.h" #import "OFUnboundPrefixException.h" + +enum { + stateInByteOrderMark, + stateOutsideTag, + stateTagOpened, + stateInProcessingInstruction, + stateInTagName, + stateInCloseTagName, + stateInTag, + stateInAttributeName, + stateExpectAttributeEqualSign, + stateExpectAttributeDelimiter, + stateInAttributeValue, + stateExpectTagClose, + stateExpectSpaceOrTagClose, + stateInExclamationMark, + stateInCDATAOpening, + stateInCDATA, + stateInCommentOpening, + stateInComment1, + stateInComment2, + stateInDOCTYPE +}; @interface OFXMLParser () @end static void inByteOrderMarkState(OFXMLParser *); static void outsideTagState(OFXMLParser *); static void tagOpenedState(OFXMLParser *); -static void inProcessingInstructionsState(OFXMLParser *); +static void inProcessingInstructionState(OFXMLParser *); static void inTagNameState(OFXMLParser *); static void inCloseTagNameState(OFXMLParser *); static void inTagState(OFXMLParser *); static void inAttributeNameState(OFXMLParser *); static void expectAttributeEqualSignState(OFXMLParser *); @@ -60,42 +84,39 @@ static void inCDATAState(OFXMLParser *); static void inCommentOpeningState(OFXMLParser *); static void inCommentState1(OFXMLParser *); static void inCommentState2(OFXMLParser *); static void inDOCTYPEState(OFXMLParser *); -typedef void (*state_function_t)(OFXMLParser *); -static state_function_t lookupTable[] = { - [OF_XMLPARSER_IN_BYTE_ORDER_MARK] = inByteOrderMarkState, - [OF_XMLPARSER_OUTSIDE_TAG] = outsideTagState, - [OF_XMLPARSER_TAG_OPENED] = tagOpenedState, - [OF_XMLPARSER_IN_PROCESSING_INSTRUCTIONS] = - inProcessingInstructionsState, - [OF_XMLPARSER_IN_TAG_NAME] = inTagNameState, - [OF_XMLPARSER_IN_CLOSE_TAG_NAME] = inCloseTagNameState, - [OF_XMLPARSER_IN_TAG] = inTagState, - [OF_XMLPARSER_IN_ATTRIBUTE_NAME] = inAttributeNameState, - [OF_XMLPARSER_EXPECT_ATTRIBUTE_EQUAL_SIGN] = - expectAttributeEqualSignState, - [OF_XMLPARSER_EXPECT_ATTRIBUTE_DELIMITER] = - expectAttributeDelimiterState, - [OF_XMLPARSER_IN_ATTRIBUTE_VALUE] = inAttributeValueState, - [OF_XMLPARSER_EXPECT_TAG_CLOSE] = expectTagCloseState, - [OF_XMLPARSER_EXPECT_SPACE_OR_TAG_CLOSE] = expectSpaceOrTagCloseState, - [OF_XMLPARSER_IN_EXCLAMATION_MARK] = inExclamationMarkState, - [OF_XMLPARSER_IN_CDATA_OPENING] = inCDATAOpeningState, - [OF_XMLPARSER_IN_CDATA] = inCDATAState, - [OF_XMLPARSER_IN_COMMENT_OPENING] = inCommentOpeningState, - [OF_XMLPARSER_IN_COMMENT_1] = inCommentState1, - [OF_XMLPARSER_IN_COMMENT_2] = inCommentState2, - [OF_XMLPARSER_IN_DOCTYPE] = inDOCTYPEState +typedef void (*StateFunction)(OFXMLParser *); +static StateFunction lookupTable[] = { + [stateInByteOrderMark] = inByteOrderMarkState, + [stateOutsideTag] = outsideTagState, + [stateTagOpened] = tagOpenedState, + [stateInProcessingInstruction] = inProcessingInstructionState, + [stateInTagName] = inTagNameState, + [stateInCloseTagName] = inCloseTagNameState, + [stateInTag] = inTagState, + [stateInAttributeName] = inAttributeNameState, + [stateExpectAttributeEqualSign] = expectAttributeEqualSignState, + [stateExpectAttributeDelimiter] = expectAttributeDelimiterState, + [stateInAttributeValue] = inAttributeValueState, + [stateExpectTagClose] = expectTagCloseState, + [stateExpectSpaceOrTagClose] = expectSpaceOrTagCloseState, + [stateInExclamationMark] = inExclamationMarkState, + [stateInCDATAOpening] = inCDATAOpeningState, + [stateInCDATA] = inCDATAState, + [stateInCommentOpening] = inCommentOpeningState, + [stateInComment1] = inCommentState1, + [stateInComment2] = inCommentState2, + [stateInDOCTYPE] = inDOCTYPEState }; static OF_INLINE void appendToBuffer(OFMutableData *buffer, const char *string, - of_string_encoding_t encoding, size_t length) + OFStringEncoding encoding, size_t length) { - if OF_LIKELY(encoding == OF_STRING_ENCODING_UTF_8) + if OF_LIKELY(encoding == OFStringEncodingUTF8) [buffer addItems: string count: length]; else { void *pool = objc_autoreleasePoolPush(); OFString *tmp = [OFString stringWithCString: string encoding: encoding @@ -209,11 +230,11 @@ @"xmlns", @"http://www.w3.org/2000/xmlns/", nil]; [_namespaces addObject: dict]; _acceptProlog = true; _lineNumber = 1; - _encoding = OF_STRING_ENCODING_UTF_8; + _encoding = OFStringEncodingUTF8; _depthLimit = 32; objc_autoreleasePoolPop(pool); } @catch (id e) { [self release]; @@ -255,12 +276,12 @@ _lineNumber++; _lastCarriageReturn = (_data[_i] == '\r'); } - /* In OF_XMLPARSER_IN_TAG, there can be only spaces */ - if (length - _last > 0 && _state != OF_XMLPARSER_IN_TAG) + /* In stateInTag, there can be only spaces */ + if (length - _last > 0 && _state != stateInTag) appendToBuffer(_buffer, _data + _last, _encoding, length - _last); } - (void)parseString: (OFString *)string @@ -269,38 +290,38 @@ } - (void)parseStream: (OFStream *)stream { size_t pageSize = [OFSystemInfo pageSize]; - char *buffer = of_alloc(1, pageSize); + char *buffer = OFAllocMemory(1, pageSize); @try { while (!stream.atEndOfStream) { size_t length = [stream readIntoBuffer: buffer length: pageSize]; [self parseBuffer: buffer length: length]; } } @finally { - free(buffer); + OFFreeMemory(buffer); } } static void inByteOrderMarkState(OFXMLParser *self) { if (self->_data[self->_i] != "\xEF\xBB\xBF"[self->_level]) { if (self->_level == 0) { - self->_state = OF_XMLPARSER_OUTSIDE_TAG; + self->_state = stateOutsideTag; self->_i--; return; } @throw [OFMalformedXMLException exceptionWithParser: self]; } if (self->_level++ == 2) - self->_state = OF_XMLPARSER_OUTSIDE_TAG; + self->_state = stateOutsideTag; self->_last = self->_i + 1; } /* Not in a tag */ @@ -336,11 +357,11 @@ } [self->_buffer removeAllItems]; self->_last = self->_i + 1; - self->_state = OF_XMLPARSER_TAG_OPENED; + self->_state = stateTagOpened; } /* Tag was just opened */ static void tagOpenedState(OFXMLParser *self) @@ -350,38 +371,38 @@ @throw [OFMalformedXMLException exceptionWithParser: self]; switch (self->_data[self->_i]) { case '?': self->_last = self->_i + 1; - self->_state = OF_XMLPARSER_IN_PROCESSING_INSTRUCTIONS; + self->_state = stateInProcessingInstruction; self->_level = 0; break; case '/': self->_last = self->_i + 1; - self->_state = OF_XMLPARSER_IN_CLOSE_TAG_NAME; + self->_state = stateInCloseTagName; self->_acceptProlog = false; break; case '!': self->_last = self->_i + 1; - self->_state = OF_XMLPARSER_IN_EXCLAMATION_MARK; + self->_state = stateInExclamationMark; self->_acceptProlog = false; break; default: if (self->_depthLimit > 0 && self->_previous.count >= self->_depthLimit) @throw [OFOutOfRangeException exception]; - self->_state = OF_XMLPARSER_IN_TAG_NAME; + self->_state = stateInTagName; self->_acceptProlog = false; self->_i--; break; } } /* */ static bool -parseXMLProcessingInstructions(OFXMLParser *self, OFString *pi) +parseXMLProcessingInstruction(OFXMLParser *self, OFString *data) { const char *cString; size_t length, last; int PIState = 0; OFString *attribute = nil; @@ -392,15 +413,12 @@ if (!self->_acceptProlog) return false; self->_acceptProlog = false; - pi = [pi substringFromIndex: 3]; - pi = pi.stringByDeletingEnclosingWhitespaces; - - cString = pi.UTF8String; - length = pi.UTF8StringLength; + cString = data.UTF8String; + length = data.UTF8StringLength; last = 0; for (size_t i = 0; i < length; i++) { switch (PIState) { case 0: @@ -451,11 +469,11 @@ } if ([attribute isEqual: @"encoding"]) { @try { self->_encoding = - of_string_parse_encoding(value); + OFStringEncodingParseName(value); } @catch (OFInvalidArgumentException *e) { @throw [OFInvalidEncodingException exception]; } } @@ -471,42 +489,56 @@ return false; return true; } -/* Inside processing instructions */ +/* Inside processing instruction */ static void -inProcessingInstructionsState(OFXMLParser *self) +inProcessingInstructionState(OFXMLParser *self) { if (self->_data[self->_i] == '?') self->_level = 1; else if (self->_level == 1 && self->_data[self->_i] == '>') { void *pool = objc_autoreleasePoolPush(); - OFString *PI; + OFString *PI, *target, *data = nil; + OFCharacterSet *whitespaceCS; + size_t pos; appendToBuffer(self->_buffer, self->_data + self->_last, self->_encoding, self->_i - self->_last); PI = transformString(self, self->_buffer, 1, false); - if ([PI isEqual: @"xml"] || [PI hasPrefix: @"xml "] || - [PI hasPrefix: @"xml\t"] || [PI hasPrefix: @"xml\r"] || - [PI hasPrefix: @"xml\n"]) - if (!parseXMLProcessingInstructions(self, PI)) + whitespaceCS = [OFCharacterSet + characterSetWithCharactersInString: @" \r\n\r"]; + pos = [PI indexOfCharacterFromSet: whitespaceCS]; + if (pos != OFNotFound) { + target = [PI substringToIndex: pos]; + data = [[PI substringFromIndex: pos + 1] + stringByDeletingEnclosingWhitespaces]; + + if (data.length == 0) + data = nil; + } else + target = PI; + + if ([target caseInsensitiveCompare: @"xml"] == OFOrderedSame) + if (!parseXMLProcessingInstruction(self, data)) @throw [OFMalformedXMLException exceptionWithParser: self]; - if ([self->_delegate respondsToSelector: - @selector(parser:foundProcessingInstructions:)]) + if ([self->_delegate respondsToSelector: @selector( + parser:foundProcessingInstructionWithTarget:data:)]) [self->_delegate parser: self - foundProcessingInstructions: PI]; + foundProcessingInstructionWithTarget: target + data: data]; objc_autoreleasePoolPop(pool); [self->_buffer removeAllItems]; self->_last = self->_i + 1; - self->_state = OF_XMLPARSER_OUTSIDE_TAG; + self->_state = stateOutsideTag; } else self->_level = 0; } /* Inside a tag, no name yet */ @@ -546,13 +578,11 @@ self->_name = [bufferString copy]; self->_prefix = nil; } if (self->_data[self->_i] == '>' || self->_data[self->_i] == '/') { - OFString *namespace; - - namespace = namespaceForPrefix(self->_prefix, + OFString *namespace = namespaceForPrefix(self->_prefix, self->_namespaces); if (self->_prefix != nil && namespace == nil) @throw [OFUnboundPrefixException exceptionWithPrefix: self->_prefix @@ -582,14 +612,13 @@ [self->_name release]; [self->_prefix release]; self->_name = self->_prefix = nil; self->_state = (self->_data[self->_i] == '/' - ? OF_XMLPARSER_EXPECT_TAG_CLOSE - : OF_XMLPARSER_OUTSIDE_TAG); + ? stateExpectTagClose : stateOutsideTag); } else - self->_state = OF_XMLPARSER_IN_TAG; + self->_state = stateInTag; if (self->_data[self->_i] != '/') [self->_namespaces addObject: [OFMutableDictionary dictionary]]; objc_autoreleasePoolPop(pool); @@ -663,12 +692,11 @@ [self->_prefix release]; self->_name = self->_prefix = nil; self->_last = self->_i + 1; self->_state = (self->_data[self->_i] == '>' - ? OF_XMLPARSER_OUTSIDE_TAG - : OF_XMLPARSER_EXPECT_SPACE_OR_TAG_CLOSE); + ? stateOutsideTag : stateExpectSpaceOrTagClose); if (self->_previous.count == 0) self->_finishedParsing = true; } @@ -685,11 +713,11 @@ if (self->_data[self->_i] != ' ' && self->_data[self->_i] != '\t' && self->_data[self->_i] != '\n' && self->_data[self->_i] != '\r') { self->_last = self->_i; - self->_state = OF_XMLPARSER_IN_ATTRIBUTE_NAME; + self->_state = stateInAttributeName; self->_i--; } return; } @@ -744,12 +772,11 @@ [self->_attributes removeAllObjects]; self->_name = self->_prefix = nil; self->_last = self->_i + 1; self->_state = (self->_data[self->_i] == '/' - ? OF_XMLPARSER_EXPECT_TAG_CLOSE - : OF_XMLPARSER_OUTSIDE_TAG); + ? stateExpectTagClose : stateOutsideTag); } /* Looking for attribute name */ static void inAttributeNameState(OFXMLParser *self) @@ -793,21 +820,20 @@ [self->_buffer removeAllItems]; self->_last = self->_i + 1; self->_state = (self->_data[self->_i] == '=' - ? OF_XMLPARSER_EXPECT_ATTRIBUTE_DELIMITER - : OF_XMLPARSER_EXPECT_ATTRIBUTE_EQUAL_SIGN); + ? stateExpectAttributeDelimiter : stateExpectAttributeEqualSign); } /* Expecting equal sign of an attribute */ static void expectAttributeEqualSignState(OFXMLParser *self) { if (self->_data[self->_i] == '=') { self->_last = self->_i + 1; - self->_state = OF_XMLPARSER_EXPECT_ATTRIBUTE_DELIMITER; + self->_state = stateExpectAttributeDelimiter; return; } if (self->_data[self->_i] != ' ' && self->_data[self->_i] != '\t' && self->_data[self->_i] != '\n' && self->_data[self->_i] != '\r') @@ -826,11 +852,11 @@ if (self->_data[self->_i] != '\'' && self->_data[self->_i] != '"') @throw [OFMalformedXMLException exceptionWithParser: self]; self->_delimiter = self->_data[self->_i]; - self->_state = OF_XMLPARSER_IN_ATTRIBUTE_VALUE; + self->_state = stateInAttributeValue; } /* Looking for attribute value */ static void inAttributeValueState(OFXMLParser *self) @@ -870,20 +896,20 @@ [self->_attributeName release]; [self->_attributePrefix release]; self->_attributeName = self->_attributePrefix = nil; self->_last = self->_i + 1; - self->_state = OF_XMLPARSER_IN_TAG; + self->_state = stateInTag; } /* Expecting closing '>' */ static void expectTagCloseState(OFXMLParser *self) { if (self->_data[self->_i] == '>') { self->_last = self->_i + 1; - self->_state = OF_XMLPARSER_OUTSIDE_TAG; + self->_state = stateOutsideTag; } else @throw [OFMalformedXMLException exceptionWithParser: self]; } /* Expecting closing '>' or space */ @@ -890,11 +916,11 @@ static void expectSpaceOrTagCloseState(OFXMLParser *self) { if (self->_data[self->_i] == '>') { self->_last = self->_i + 1; - self->_state = OF_XMLPARSER_OUTSIDE_TAG; + self->_state = stateOutsideTag; } else if (self->_data[self->_i] != ' ' && self->_data[self->_i] != '\t' && self->_data[self->_i] != '\n' && self->_data[self->_i] != '\r') @throw [OFMalformedXMLException exceptionWithParser: self]; } @@ -905,16 +931,16 @@ { if (self->_finishedParsing && self->_data[self->_i] != '-') @throw [OFMalformedXMLException exceptionWithParser: self]; if (self->_data[self->_i] == '-') - self->_state = OF_XMLPARSER_IN_COMMENT_OPENING; + self->_state = stateInCommentOpening; else if (self->_data[self->_i] == '[') { - self->_state = OF_XMLPARSER_IN_CDATA_OPENING; + self->_state = stateInCDATAOpening; self->_level = 0; } else if (self->_data[self->_i] == 'D') { - self->_state = OF_XMLPARSER_IN_DOCTYPE; + self->_state = stateInDOCTYPE; self->_level = 0; } else @throw [OFMalformedXMLException exceptionWithParser: self]; self->_last = self->_i + 1; @@ -926,11 +952,11 @@ { if (self->_data[self->_i] != "CDATA["[self->_level]) @throw [OFMalformedXMLException exceptionWithParser: self]; if (++self->_level == 6) { - self->_state = OF_XMLPARSER_IN_CDATA; + self->_state = stateInCDATA; self->_level = 0; } self->_last = self->_i + 1; } @@ -955,11 +981,11 @@ objc_autoreleasePoolPop(pool); [self->_buffer removeAllItems]; self->_last = self->_i + 1; - self->_state = OF_XMLPARSER_OUTSIDE_TAG; + self->_state = stateOutsideTag; } else self->_level = 0; } /* Comment */ @@ -968,11 +994,11 @@ { if (self->_data[self->_i] != '-') @throw [OFMalformedXMLException exceptionWithParser: self]; self->_last = self->_i + 1; - self->_state = OF_XMLPARSER_IN_COMMENT_1; + self->_state = stateInComment1; self->_level = 0; } static void inCommentState1(OFXMLParser *self) @@ -981,11 +1007,11 @@ self->_level++; else self->_level = 0; if (self->_level == 2) - self->_state = OF_XMLPARSER_IN_COMMENT_2; + self->_state = stateInComment2; } static void inCommentState2(OFXMLParser *self) { @@ -1008,11 +1034,11 @@ objc_autoreleasePoolPop(pool); [self->_buffer removeAllItems]; self->_last = self->_i + 1; - self->_state = OF_XMLPARSER_OUTSIDE_TAG; + self->_state = stateOutsideTag; } /* In */ static void inDOCTYPEState(OFXMLParser *self) @@ -1025,11 +1051,11 @@ @throw [OFMalformedXMLException exceptionWithParser: self]; self->_level++; if (self->_level > 6 && self->_data[self->_i] == '>') - self->_state = OF_XMLPARSER_OUTSIDE_TAG; + self->_state = stateOutsideTag; self->_last = self->_i + 1; } - (size_t)lineNumber ADDED src/OFXMLProcessingInstruction.h Index: src/OFXMLProcessingInstruction.h ================================================================== --- src/OFXMLProcessingInstruction.h +++ src/OFXMLProcessingInstruction.h @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#import "OFXMLNode.h" + +OF_ASSUME_NONNULL_BEGIN + +/** + * @class OFXMLProcessingInstruction \ + * OFXMLProcessingInstruction.h ObjFW/OFXMLProcessingInstruction.h + * + * @brief A class for representing an XML processing instruction. + */ +@interface OFXMLProcessingInstruction: OFXMLNode +{ + OFString *_target, *_data; + OF_RESERVE_IVARS(OFXMLProcessingInstruction, 4) +} + +/** + * @brief The target of the processing instruction. + */ +@property (readonly, nonatomic) OFString *target; + +/** + * @brief The data of the processing instruction. + */ +@property OF_NULLABLE_PROPERTY (readonly, nonatomic) OFString *data; + +/** + * @brief Creates a new OFXMLProcessingInstruction with the specified target + * and data. + * + * @param target The target for the processing instruction + * @param data The data for the processing instruction + * @return A new OFXMLProcessingInstruction + */ ++ (instancetype)processingInstructionWithTarget: (OFString *)target + data: (OFString *)data; + +/** + * @brief Initializes an already allocated OFXMLProcessingInstruction with the + * specified target and data. + * + * @param target The target for the processing instruction + * @param data The data for the processing instruction + * @return An initialized OFXMLProcessingInstruction + */ +- (instancetype)initWithTarget: (OFString *)target + data: (OFString *)data OF_DESIGNATED_INITIALIZER; + +- (instancetype)initWithSerialization: (OFXMLElement *)element; +@end + +OF_ASSUME_NONNULL_END ADDED src/OFXMLProcessingInstruction.m Index: src/OFXMLProcessingInstruction.m ================================================================== --- src/OFXMLProcessingInstruction.m +++ src/OFXMLProcessingInstruction.m @@ -0,0 +1,187 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#include + +#import "OFXMLProcessingInstruction.h" +#import "OFString.h" +#import "OFXMLAttribute.h" +#import "OFXMLElement.h" +#import "OFXMLNode+Private.h" + +#import "OFInvalidArgumentException.h" + +@implementation OFXMLProcessingInstruction +@synthesize target = _target, data = _data; + ++ (instancetype)processingInstructionWithTarget: (OFString *)target + data: (OFString *)data +{ + return [[[self alloc] initWithTarget: target + data: data] autorelease]; +} + +- (instancetype)initWithTarget: (OFString *)target + data: (OFString *)data +{ + self = [super of_init]; + + @try { + _target = [target copy]; + _data = [data copy]; + } @catch (id e) { + [self release]; + @throw e; + } + + return self; +} + +- (instancetype)initWithSerialization: (OFXMLElement *)element +{ + @try { + void *pool = objc_autoreleasePoolPush(); + OFXMLAttribute *targetAttr; + + if (![element.name isEqual: self.className] || + ![element.namespace isEqual: OFSerializationNS]) + @throw [OFInvalidArgumentException exception]; + + targetAttr = [element attributeForName: @"target" + namespace: OFSerializationNS]; + if (targetAttr.stringValue.length == 0) + @throw [OFInvalidArgumentException exception]; + + self = [self initWithTarget: targetAttr.stringValue + data: element.stringValue]; + + objc_autoreleasePoolPop(pool); + } @catch (id e) { + [self release]; + @throw e; + } + + return self; +} + +- (void)dealloc +{ + [_target release]; + [_data release]; + + [super dealloc]; +} + +- (bool)isEqual: (id)object +{ + OFXMLProcessingInstruction *processingInstruction; + + if (object == self) + return true; + + if (![object isKindOfClass: [OFXMLProcessingInstruction class]]) + return false; + + processingInstruction = object; + + if (![processingInstruction->_target isEqual: _target]) + return false; + + if (processingInstruction->_data != _data && + ![processingInstruction->_data isEqual: _data]) + return false; + + return true; +} + +- (unsigned long)hash +{ + unsigned long hash; + + OFHashInit(&hash); + OFHashAddHash(&hash, _target.hash); + OFHashAddHash(&hash, _data.hash); + OFHashFinalize(&hash); + + return hash; +} + +- (OFString *)stringValue +{ + return @""; +} + +- (OFString *)XMLString +{ + if (_data.length > 0) + return [OFString stringWithFormat: @"", + _target, _data]; + else + return [OFString stringWithFormat: @"", _target]; +} + +- (OFString *)XMLStringWithIndentation: (unsigned int)indentation +{ + return self.XMLString; +} + +- (OFString *)XMLStringWithIndentation: (unsigned int)indentation + level: (unsigned int)level +{ + if (indentation > 0 && level > 0) { + OFString *ret; + char *whitespaces = OFAllocMemory((level * indentation) + 1, 1); + memset(whitespaces, ' ', level * indentation); + whitespaces[level * indentation] = 0; + + @try { + if (_data.length > 0) + ret = [OFString stringWithFormat: + @"%s", whitespaces, + _target, _data]; + else + ret = [OFString stringWithFormat: + @"%s", whitespaces, _target]; + } @finally { + OFFreeMemory(whitespaces); + } + + return ret; + } else + return self.XMLString; +} + +- (OFString *)description +{ + return self.XMLString; +} + +- (OFXMLElement *)XMLElementBySerializing +{ + OFXMLElement *ret = [OFXMLElement elementWithName: self.className + namespace: OFSerializationNS + stringValue: _data]; + void *pool = objc_autoreleasePoolPush(); + + [ret addAttribute: [OFXMLAttribute attributeWithName: @"target" + stringValue: _target]]; + + objc_autoreleasePoolPop(pool); + + return ret; +} +@end DELETED src/OFXMLProcessingInstructions.h Index: src/OFXMLProcessingInstructions.h ================================================================== --- src/OFXMLProcessingInstructions.h +++ src/OFXMLProcessingInstructions.h @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#import "OFXMLNode.h" - -OF_ASSUME_NONNULL_BEGIN - -/** - * @class OFXMLProcessingInstructions \ - * OFXMLProcessingInstructions.h ObjFW/OFXMLProcessingInstructions.h - * - * @brief A class for representing XML processing instructions. - */ -@interface OFXMLProcessingInstructions: OFXMLNode -{ - OFString *_processingInstructions; - OF_RESERVE_IVARS(OFXMLProcessingInstructions, 4) -} - -/** - * @brief Creates a new OFXMLProcessingInstructions with the specified string. - * - * @param string The string for the processing instructions - * @return A new OFXMLProcessingInstructions - */ -+ (instancetype)processingInstructionsWithString: (OFString *)string; - -/** - * @brief Initializes an already allocated OFXMLProcessingInstructions with the - * specified string. - * - * @param string The string for the processing instructions - * @return An initialized OFXMLProcessingInstructions - */ -- (instancetype)initWithString: (OFString *)string; - -- (instancetype)initWithSerialization: (OFXMLElement *)element; -@end - -OF_ASSUME_NONNULL_END DELETED src/OFXMLProcessingInstructions.m Index: src/OFXMLProcessingInstructions.m ================================================================== --- src/OFXMLProcessingInstructions.m +++ src/OFXMLProcessingInstructions.m @@ -1,146 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#include - -#import "OFXMLProcessingInstructions.h" -#import "OFXMLNode+Private.h" -#import "OFString.h" -#import "OFXMLElement.h" - -#import "OFInvalidArgumentException.h" - -@implementation OFXMLProcessingInstructions -+ (instancetype)processingInstructionsWithString: (OFString *)string -{ - return [[[self alloc] initWithString: string] autorelease]; -} - -- (instancetype)initWithString: (OFString *)string -{ - self = [super of_init]; - - @try { - _processingInstructions = [string copy]; - } @catch (id e) { - [self release]; - @throw e; - } - - return self; -} - -- (instancetype)initWithSerialization: (OFXMLElement *)element -{ - self = [super of_init]; - - @try { - void *pool = objc_autoreleasePoolPush(); - - if (![element.name isEqual: self.className] || - ![element.namespace isEqual: OF_SERIALIZATION_NS]) - @throw [OFInvalidArgumentException exception]; - - _processingInstructions = [element.stringValue copy]; - - objc_autoreleasePoolPop(pool); - } @catch (id e) { - [self release]; - @throw e; - } - - return self; -} - -- (void)dealloc -{ - [_processingInstructions release]; - - [super dealloc]; -} - -- (bool)isEqual: (id)object -{ - OFXMLProcessingInstructions *processingInstructions; - - if (object == self) - return true; - - if (![object isKindOfClass: [OFXMLProcessingInstructions class]]) - return false; - - processingInstructions = object; - - return [processingInstructions->_processingInstructions - isEqual: _processingInstructions]; -} - -- (unsigned long)hash -{ - return _processingInstructions.hash; -} - -- (OFString *)stringValue -{ - return @""; -} - -- (OFString *)XMLString -{ - return [OFString stringWithFormat: @"", _processingInstructions]; -} - -- (OFString *)XMLStringWithIndentation: (unsigned int)indentation -{ - return [OFString stringWithFormat: @"", _processingInstructions]; -} - -- (OFString *)XMLStringWithIndentation: (unsigned int)indentation - level: (unsigned int)level -{ - OFString *ret; - - if (indentation > 0 && level > 0) { - char *whitespaces = of_alloc((level * indentation) + 1, 1); - memset(whitespaces, ' ', level * indentation); - whitespaces[level * indentation] = 0; - - @try { - ret = [OFString stringWithFormat: - @"%s", whitespaces, _processingInstructions]; - } @finally { - free(whitespaces); - } - } else - ret = [OFString stringWithFormat: @"", - _processingInstructions]; - - return ret; -} - -- (OFString *)description -{ - return [OFString stringWithFormat: @"", _processingInstructions]; -} - -- (OFXMLElement *)XMLElementBySerializing -{ - return [OFXMLElement elementWithName: self.className - namespace: OF_SERIALIZATION_NS - stringValue: _processingInstructions]; -} -@end Index: src/OFZIPArchive.h ================================================================== --- src/OFZIPArchive.h +++ src/OFZIPArchive.h @@ -32,15 +32,11 @@ OF_SUBCLASSING_RESTRICTED @interface OFZIPArchive: OFObject { OFStream *_stream; int64_t _offset; - enum { - OF_ZIP_ARCHIVE_MODE_READ, - OF_ZIP_ARCHIVE_MODE_WRITE, - OF_ZIP_ARCHIVE_MODE_APPEND - } _mode; + uint_least8_t _mode; uint32_t _diskNumber, _centralDirectoryDisk; uint64_t _centralDirectoryEntriesInDisk, _centralDirectoryEntries; uint64_t _centralDirectorySize; int64_t _centralDirectoryOffset; OFString *_Nullable _archiveComment; @@ -169,7 +165,18 @@ /** * @brief Closes the OFZIPArchive. */ - (void)close; @end + +#ifdef __cplusplus +extern "C" { +#endif +extern uint32_t OFZIPArchiveReadField32(const uint8_t *_Nonnull *_Nonnull, + uint16_t *_Nonnull); +extern uint64_t OFZIPArchiveReadField64(const uint8_t *_Nonnull *_Nonnull, + uint16_t *_Nonnull); +#ifdef __cplusplus +} +#endif OF_ASSUME_NONNULL_END Index: src/OFZIPArchive.m ================================================================== --- src/OFZIPArchive.m +++ src/OFZIPArchive.m @@ -18,10 +18,11 @@ #include #import "OFZIPArchive.h" #import "OFZIPArchiveEntry.h" #import "OFZIPArchiveEntry+Private.h" +#import "OFCRC32.h" #import "OFData.h" #import "OFArray.h" #import "OFDictionary.h" #import "OFStream.h" #import "OFSeekableStream.h" @@ -29,12 +30,10 @@ # import "OFFile.h" #endif #import "OFInflateStream.h" #import "OFInflate64Stream.h" -#import "crc32.h" - #import "OFChecksumMismatchException.h" #import "OFInvalidArgumentException.h" #import "OFInvalidFormatException.h" #import "OFNotImplementedException.h" #import "OFNotOpenException.h" @@ -47,10 +46,16 @@ /* * FIXME: Current limitations: * - Split archives are not supported. * - Encrypted files cannot be read. */ + +enum { + modeRead, + modeWrite, + modeAppend +}; OF_DIRECT_MEMBERS @interface OFZIPArchive () - (void)of_readZIPInfo; - (void)of_readEntries; @@ -101,11 +106,11 @@ - (instancetype)initWithStream: (OFStream *)stream entry: (OFMutableZIPArchiveEntry *)entry; @end uint32_t -of_zip_archive_read_field32(const uint8_t **data, uint16_t *size) +OFZIPArchiveReadField32(const uint8_t **data, uint16_t *size) { uint32_t field = 0; if (*size < 4) @throw [OFInvalidFormatException exception]; @@ -118,11 +123,11 @@ return field; } uint64_t -of_zip_archive_read_field64(const uint8_t **data, uint16_t *size) +OFZIPArchiveReadField64(const uint8_t **data, uint16_t *size) { uint64_t field = 0; if (*size < 8) @throw [OFInvalidFormatException exception]; @@ -136,11 +141,11 @@ return field; } static void seekOrThrowInvalidFormat(OFSeekableStream *stream, - of_offset_t offset, int whence) + OFFileOffset offset, int whence) { @try { [stream seekToOffset: offset whence: whence]; } @catch (OFSeekFailedException *e) { if (e.errNo == EINVAL) @@ -174,35 +179,34 @@ { self = [super init]; @try { if ([mode isEqual: @"r"]) - _mode = OF_ZIP_ARCHIVE_MODE_READ; + _mode = modeRead; else if ([mode isEqual: @"w"]) - _mode = OF_ZIP_ARCHIVE_MODE_WRITE; + _mode = modeWrite; else if ([mode isEqual: @"a"]) - _mode = OF_ZIP_ARCHIVE_MODE_APPEND; + _mode = modeAppend; else @throw [OFInvalidArgumentException exception]; _stream = [stream retain]; _entries = [[OFMutableArray alloc] init]; _pathToEntryMap = [[OFMutableDictionary alloc] init]; - if (_mode == OF_ZIP_ARCHIVE_MODE_READ || - _mode == OF_ZIP_ARCHIVE_MODE_APPEND) { + if (_mode == modeRead || _mode == modeAppend) { if (![stream isKindOfClass: [OFSeekableStream class]]) @throw [OFInvalidArgumentException exception]; [self of_readZIPInfo]; [self of_readEntries]; } - if (_mode == OF_ZIP_ARCHIVE_MODE_APPEND) { + if (_mode == modeAppend) { _offset = _centralDirectoryOffset; seekOrThrowInvalidFormat((OFSeekableStream *)_stream, - (of_offset_t)_offset, SEEK_SET); + (OFFileOffset)_offset, SEEK_SET); } } @catch (id e) { /* * If we are in write or append mode, we do not want -[close] * to write anything to it on error - after all, it might not @@ -254,11 +258,11 @@ - (void)of_readZIPInfo { void *pool = objc_autoreleasePoolPush(); uint16_t commentLength; - of_offset_t offset = -22; + OFFileOffset offset = -22; bool valid = false; do { seekOrThrowInvalidFormat((OFSeekableStream *)_stream, offset, SEEK_END); @@ -280,11 +284,11 @@ _centralDirectoryOffset = [_stream readLittleEndianInt32]; commentLength = [_stream readLittleEndianInt16]; _archiveComment = [[_stream readStringWithLength: commentLength - encoding: OF_STRING_ENCODING_CODEPAGE_437] copy]; + encoding: OFStringEncodingCodepage437] copy]; if (_diskNumber == 0xFFFF || _centralDirectoryDisk == 0xFFFF || _centralDirectoryEntriesInDisk == 0xFFFF || _centralDirectoryEntries == 0xFFFF || @@ -306,15 +310,15 @@ * central directory record. */ [_stream readLittleEndianInt32]; offset64 = [_stream readLittleEndianInt64]; - if (offset64 < 0 || (of_offset_t)offset64 != offset64) + if (offset64 < 0 || (OFFileOffset)offset64 != offset64) @throw [OFOutOfRangeException exception]; seekOrThrowInvalidFormat((OFSeekableStream *)_stream, - (of_offset_t)offset64, SEEK_SET); + (OFFileOffset)offset64, SEEK_SET); if ([_stream readLittleEndianInt32] != 0x06064B50) @throw [OFInvalidFormatException exception]; size = [_stream readLittleEndianInt64]; @@ -333,11 +337,11 @@ _centralDirectoryEntries = [_stream readLittleEndianInt64]; _centralDirectorySize = [_stream readLittleEndianInt64]; _centralDirectoryOffset = [_stream readLittleEndianInt64]; if (_centralDirectoryOffset < 0 || - (of_offset_t)_centralDirectoryOffset != + (OFFileOffset)_centralDirectoryOffset != _centralDirectoryOffset) @throw [OFOutOfRangeException exception]; } objc_autoreleasePoolPop(pool); @@ -346,15 +350,15 @@ - (void)of_readEntries { void *pool = objc_autoreleasePoolPush(); if (_centralDirectoryOffset < 0 || - (of_offset_t)_centralDirectoryOffset != _centralDirectoryOffset) + (OFFileOffset)_centralDirectoryOffset != _centralDirectoryOffset) @throw [OFOutOfRangeException exception]; seekOrThrowInvalidFormat((OFSeekableStream *)_stream, - (of_offset_t)_centralDirectoryOffset, SEEK_SET); + (OFFileOffset)_centralDirectoryOffset, SEEK_SET); for (size_t i = 0; i < _centralDirectoryEntries; i++) { OFZIPArchiveEntry *entry = [[[OFZIPArchiveEntry alloc] of_initWithStream: _stream] autorelease]; @@ -399,12 +403,11 @@ [_lastReturnedStream close]; } @catch (OFNotOpenException *e) { /* Might have already been closed by the user - that's fine. */ } - if ((_mode == OF_ZIP_ARCHIVE_MODE_WRITE || - _mode == OF_ZIP_ARCHIVE_MODE_APPEND) && + if ((_mode == modeWrite || _mode == modeAppend) && [_lastReturnedStream isKindOfClass: [OFZIPArchiveFileWriteStream class]]) { OFZIPArchiveFileWriteStream *stream = (OFZIPArchiveFileWriteStream *)_lastReturnedStream; @@ -429,11 +432,11 @@ void *pool = objc_autoreleasePoolPush(); OFZIPArchiveEntry *entry; OFZIPArchiveLocalFileHeader *localFileHeader; int64_t offset64; - if (_mode != OF_ZIP_ARCHIVE_MODE_READ) + if (_mode != modeRead) @throw [OFInvalidArgumentException exception]; if ((entry = [_pathToEntryMap objectForKey: path]) == nil) @throw [OFOpenItemFailedException exceptionWithPath: path mode: @"r" @@ -440,15 +443,15 @@ errNo: ENOENT]; [self of_closeLastReturnedStream]; offset64 = entry.of_localFileHeaderOffset; - if (offset64 < 0 || (of_offset_t)offset64 != offset64) + if (offset64 < 0 || (OFFileOffset)offset64 != offset64) @throw [OFOutOfRangeException exception]; seekOrThrowInvalidFormat((OFSeekableStream *)_stream, - (of_offset_t)offset64, SEEK_SET); + (OFFileOffset)offset64, SEEK_SET); localFileHeader = [[[OFZIPArchiveLocalFileHeader alloc] initWithStream: _stream] autorelease]; if (![localFileHeader matchesEntry: entry]) @throw [OFInvalidFormatException exception]; @@ -479,12 +482,11 @@ OFMutableZIPArchiveEntry *entry; OFString *fileName; OFData *extraField; uint16_t fileNameLength, extraFieldLength; - if (_mode != OF_ZIP_ARCHIVE_MODE_WRITE && - _mode != OF_ZIP_ARCHIVE_MODE_APPEND) + if (_mode != modeWrite && _mode != modeAppend) @throw [OFInvalidArgumentException exception]; pool = objc_autoreleasePoolPush(); entry = [[entry_ mutableCopy] autorelease]; @@ -492,12 +494,11 @@ @throw [OFOpenItemFailedException exceptionWithPath: entry.fileName mode: @"w" errNo: EEXIST]; - if (entry.compressionMethod != - OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_NONE) + if (entry.compressionMethod != OFZIPArchiveEntryCompressionMethodNone) @throw [OFNotImplementedException exceptionWithSelector: _cmd object: self]; [self of_closeLastReturnedStream]; @@ -533,12 +534,11 @@ offsetAdd += 4 + (5 * 2) + (3 * 4) + (2 * 2); [_stream writeString: fileName]; offsetAdd += fileNameLength; - [_stream writeLittleEndianInt16: - OF_ZIP_ARCHIVE_ENTRY_EXTRA_FIELD_ZIP64]; + [_stream writeLittleEndianInt16: OFZIPArchiveEntryExtraFieldTagZIP64]; [_stream writeLittleEndianInt16: 16]; /* We use the data descriptor */ [_stream writeLittleEndianInt64: 0]; [_stream writeLittleEndianInt64: 0]; offsetAdd += (2 * 2) + (2 * 8); @@ -615,12 +615,11 @@ if (_stream == nil) @throw [OFNotOpenException exceptionWithObject: self]; [self of_closeLastReturnedStream]; - if (_mode == OF_ZIP_ARCHIVE_MODE_WRITE || - _mode == OF_ZIP_ARCHIVE_MODE_APPEND) + if (_mode == modeWrite || _mode == modeAppend) [self of_writeCentralDirectory]; [_stream release]; _stream = nil; } @@ -633,11 +632,11 @@ @try { void *pool = objc_autoreleasePoolPush(); OFMutableData *extraField = nil; uint16_t fileNameLength, extraFieldLength; - of_string_encoding_t encoding; + OFStringEncoding encoding; size_t ZIP64Index; uint16_t ZIP64Size; if ([stream readLittleEndianInt32] != 0x04034B50) @throw [OFInvalidFormatException exception]; @@ -651,33 +650,32 @@ _compressedSize = [stream readLittleEndianInt32]; _uncompressedSize = [stream readLittleEndianInt32]; fileNameLength = [stream readLittleEndianInt16]; extraFieldLength = [stream readLittleEndianInt16]; encoding = (_generalPurposeBitFlag & (1u << 11) - ? OF_STRING_ENCODING_UTF_8 - : OF_STRING_ENCODING_CODEPAGE_437); + ? OFStringEncodingUTF8 : OFStringEncodingCodepage437); _fileName = [[stream readStringWithLength: fileNameLength encoding: encoding] copy]; if (extraFieldLength > 0) extraField = [[[stream readDataWithCount: extraFieldLength] mutableCopy] autorelease]; - ZIP64Index = of_zip_archive_entry_extra_field_find(extraField, - OF_ZIP_ARCHIVE_ENTRY_EXTRA_FIELD_ZIP64, &ZIP64Size); + ZIP64Index = OFZIPArchiveEntryExtraFieldFind(extraField, + OFZIPArchiveEntryExtraFieldTagZIP64, &ZIP64Size); - if (ZIP64Index != OF_NOT_FOUND) { + if (ZIP64Index != OFNotFound) { const uint8_t *ZIP64 = [extraField itemAtIndex: ZIP64Index]; - of_range_t range = - of_range(ZIP64Index - 4, ZIP64Size + 4); + OFRange range = + OFRangeMake(ZIP64Index - 4, ZIP64Size + 4); if (_uncompressedSize == 0xFFFFFFFF) - _uncompressedSize = of_zip_archive_read_field64( + _uncompressedSize = OFZIPArchiveReadField64( &ZIP64, &ZIP64Size); if (_compressedSize == 0xFFFFFFFF) - _compressedSize = of_zip_archive_read_field64( + _compressedSize = OFZIPArchiveReadField64( &ZIP64, &ZIP64Size); if (ZIP64Size > 0) @throw [OFInvalidFormatException exception]; @@ -734,18 +732,18 @@ @try { _stream = [stream retain]; switch (entry.compressionMethod) { - case OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_NONE: + case OFZIPArchiveEntryCompressionMethodNone: _decompressedStream = [stream retain]; break; - case OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_DEFLATE: + case OFZIPArchiveEntryCompressionMethodDeflate: _decompressedStream = [[OFInflateStream alloc] initWithStream: stream]; break; - case OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_DEFLATE64: + case OFZIPArchiveEntryCompressionMethodDeflate64: _decompressedStream = [[OFInflate64Stream alloc] initWithStream: stream]; break; default: @throw [OFNotImplementedException @@ -804,11 +802,11 @@ length = (size_t)_toRead; ret = [_decompressedStream readIntoBuffer: buffer length: length]; _toRead -= ret; - _CRC32 = of_crc32(_CRC32, buffer, ret); + _CRC32 = OFCRC32(_CRC32, buffer, ret); if (_toRead == 0) { _atEndOfStream = true; if (~_CRC32 != _entry.CRC32) { @@ -889,11 +887,11 @@ @throw [OFOutOfRangeException exception]; bytesWritten = [_stream writeBuffer: buffer length: length]; _bytesWritten += (int64_t)bytesWritten; - _CRC32 = of_crc32(_CRC32, buffer, length); + _CRC32 = OFCRC32(_CRC32, buffer, length); return bytesWritten; } - (void)close Index: src/OFZIPArchiveEntry.h ================================================================== --- src/OFZIPArchiveEntry.h +++ src/OFZIPArchiveEntry.h @@ -17,75 +17,79 @@ OF_ASSUME_NONNULL_BEGIN /** @file */ -enum { - OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_NONE = 0, - OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_SHRINK = 1, - OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_REDUCE_FACTOR_1 = 2, - OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_REDUCE_FACTOR_2 = 3, - OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_REDUCE_FACTOR_3 = 4, - OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_REDUCE_FACTOR_4 = 5, - OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_IMPLODE = 6, - OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_DEFLATE = 8, - OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_DEFLATE64 = 9, - OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_BZIP2 = 12, - OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_LZMA = 14, - OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_WAVPACK = 97, - OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_PPMD = 98 -}; +typedef enum { + OFZIPArchiveEntryCompressionMethodNone = 0, + OFZIPArchiveEntryCompressionMethodShrink = 1, + OFZIPArchiveEntryCompressionMethodReduceFactor1 = 2, + OFZIPArchiveEntryCompressionMethodReduceFactor2 = 3, + OFZIPArchiveEntryCompressionMethodReduceFactor3 = 4, + OFZIPArchiveEntryCompressionMethodReduceFactor4 = 5, + OFZIPArchiveEntryCompressionMethodImplode = 6, + OFZIPArchiveEntryCompressionMethodDeflate = 8, + OFZIPArchiveEntryCompressionMethodDeflate64 = 9, + OFZIPArchiveEntryCompressionMethodBZIP2 = 12, + OFZIPArchiveEntryCompressionMethodLZMA = 14, + OFZIPArchiveEntryCompressionMethodWavPack = 97, + OFZIPArchiveEntryCompressionMethodPPMd = 98 +} OFZIPArchiveEntryCompressionMethod; /** * @brief Attribute compatibility part of ZIP versions. */ -enum of_zip_archive_entry_attribute_compatibility { +typedef enum { /** MS-DOS and OS/2 */ - OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_MSDOS = 0, + OFZIPArchiveEntryAttributeCompatibilityMSDOS = 0, /** Amiga */ - OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_AMIGA = 1, + OFZIPArchiveEntryAttributeCompatibilityAmiga = 1, /** OpenVMS */ - OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_OPENVMS = 2, + OFZIPArchiveEntryAttributeCompatibilityOpenVMS = 2, /** UNIX */ - OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_UNIX = 3, + OFZIPArchiveEntryAttributeCompatibilityUNIX = 3, /** VM/CMS */ - OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_VM_CMS = 4, + OFZIPArchiveEntryAttributeCompatibilityVM_CMS = 4, /** Atari ST */ - OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_ATARI_ST = 5, + OFZIPArchiveEntryAttributeCompatibilityAtariST = 5, /** OS/2 HPFS */ - OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_OS2_HPFS = 6, + OFZIPArchiveEntryAttributeCompatibilityOS2HPFS = 6, /** Macintosh */ - OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_MACINTOSH = 7, + OFZIPArchiveEntryAttributeCompatibilityMacintosh = 7, /** Z-System */ - OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_Z_SYSTEM = 8, + OFZIPArchiveEntryAttributeCompatibilityZSystem = 8, /** CP/M */ - OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_CP_M = 9, + OFZIPArchiveEntryAttributeCompatibilityCPM = 9, /** Windows NTFS */ - OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_WINDOWS_NTFS = 10, + OFZIPArchiveEntryAttributeCompatibilityWindowsNTFS = 10, /** MVS (OS/390 - Z/OS) */ - OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_MVS = 11, + OFZIPArchiveEntryAttributeCompatibilityMVS = 11, /** VSE */ - OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_VSE = 12, + OFZIPArchiveEntryAttributeCompatibilityVSE = 12, /** Acorn RISC OS */ - OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_ACORN_RISC_OS = 13, + OFZIPArchiveEntryAttributeCompatibilityAcornRISCOS = 13, /** VFAT */ - OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_VFAT = 14, + OFZIPArchiveEntryAttributeCompatibilityVFAT = 14, /** Alternate MVS */ - OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_ALTERNATE_MVS = 15, + OFZIPArchiveEntryAttributeCompatibilityAlternateMVS = 15, /** BeOS */ - OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_BEOS = 16, + OFZIPArchiveEntryAttributeCompatibilityBeOS = 16, /** Tandem */ - OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_TANDEM = 17, + OFZIPArchiveEntryAttributeCompatibilityTandem = 17, /** OS/400 */ - OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_OS_400 = 18, + OFZIPArchiveEntryAttributeCompatibilityOS400 = 18, /** OS X (Darwin) */ - OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_OS_X = 19 -}; + OFZIPArchiveEntryAttributeCompatibilityOSX = 19 +} OFZIPArchiveEntryAttributeCompatibility; -enum { - OF_ZIP_ARCHIVE_ENTRY_EXTRA_FIELD_ZIP64 = 0x0001 -}; +/** + * @brief Tags for the extra field. + */ +typedef enum { + /** ZIP64 extra field tag */ + OFZIPArchiveEntryExtraFieldTagZIP64 = 0x0001 +} OFZIPArchiveEntryExtraFieldTag; @class OFString; @class OFData; @class OFFile; @class OFDate; @@ -96,12 +100,14 @@ * @brief A class which represents an entry in the central directory of a ZIP * archive. */ @interface OFZIPArchiveEntry: OFObject { - uint16_t _versionMadeBy, _minVersionNeeded, _generalPurposeBitFlag; - uint16_t _compressionMethod; + OFZIPArchiveEntryAttributeCompatibility _versionMadeBy; + OFZIPArchiveEntryAttributeCompatibility _minVersionNeeded; + uint16_t _generalPurposeBitFlag; + OFZIPArchiveEntryCompressionMethod _compressionMethod; uint16_t _lastModifiedFileTime, _lastModifiedFileDate; uint32_t _CRC32; uint64_t _compressedSize, _uncompressedSize; OFString *_fileName; OFData *_Nullable _extraField; @@ -134,22 +140,24 @@ /** * @brief The version which made the entry. * * The lower 8 bits are the ZIP specification version.@n * The upper 8 bits are the attribute compatibility. - * See @ref of_zip_archive_entry_attribute_compatibility. + * See @ref OFZIPArchiveEntryAttributeCompatibility. */ -@property (readonly, nonatomic) uint16_t versionMadeBy; +@property (readonly, nonatomic) + OFZIPArchiveEntryAttributeCompatibility versionMadeBy; /** * @brief The minimum version required to extract the file. * * The lower 8 bits are the ZIP specification version.@n * The upper 8 bits are the attribute compatibility. - * See @ref of_zip_archive_entry_attribute_compatibility. + * See @ref OFZIPArchiveEntryAttributeCompatibility. */ -@property (readonly, nonatomic) uint16_t minVersionNeeded; +@property (readonly, nonatomic) + OFZIPArchiveEntryAttributeCompatibility minVersionNeeded; /** * @brief The last modification date of the entry's file. * * @note Due to limitations of the ZIP format, this has only 2 second precision. @@ -158,19 +166,20 @@ /** * @brief The compression method of the entry. * * Supported values are: - * Value | Description - * --------------------------------------------------|--------------- - * OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_NONE | No compression - * OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_DEFLATE | Deflate - * OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_DEFLATE64 | Deflate64 + * Value | Description + * --------------------------------------------|--------------- + * OFZIPArchiveEntryCompressionMethodNone | No compression + * OFZIPArchiveEntryCompressionMethodDeflate | Deflate + * OFZIPArchiveEntryCompressionMethodDeflate64 | Deflate64 * * Other values may be returned, but the file cannot be extracted then. */ -@property (readonly, nonatomic) uint16_t compressionMethod; +@property (readonly, nonatomic) + OFZIPArchiveEntryCompressionMethod compressionMethod; /** * @brief The compressed size of the entry's file. */ @property (readonly, nonatomic) uint64_t compressedSize; @@ -227,21 +236,21 @@ * @brief Converts the ZIP entry version to a string. * * @param version The ZIP entry version to convert to a string * @return The ZIP entry version as a string */ -extern OFString *of_zip_archive_entry_version_to_string(uint16_t version); +extern OFString *OFZIPArchiveEntryVersionToString(uint16_t version); /** * @brief Convers the ZIP entry compression method to a string. * * @param compressionMethod The ZIP entry compression method to convert to a * string * @return The ZIP entry compression method as a string */ -extern OFString *of_zip_archive_entry_compression_method_to_string( - uint16_t compressionMethod); +extern OFString *OFZIPArchiveEntryCompressionMethodName( + OFZIPArchiveEntryCompressionMethod compressionMethod); /** * @brief Gets a pointer to and the size of the extensible data field with the * specified tag. * @@ -248,16 +257,16 @@ * @param extraField The extra field to search for an extensible data field with * the specified tag * @param tag The tag to look for * @param size A pointer to an uint16_t that should be set to the size * @return The index at which the extra field content starts in the OFData, or - * OF_NOT_FOUND + * `OFNotFound` */ -extern size_t of_zip_archive_entry_extra_field_find(OFData *extraField, - uint16_t tag, uint16_t *size); +extern size_t OFZIPArchiveEntryExtraFieldFind(OFData *extraField, + OFZIPArchiveEntryExtraFieldTag tag, uint16_t *size); #ifdef __cplusplus } #endif OF_ASSUME_NONNULL_END #import "OFMutableZIPArchiveEntry.h" Index: src/OFZIPArchiveEntry.m ================================================================== --- src/OFZIPArchiveEntry.m +++ src/OFZIPArchiveEntry.m @@ -24,77 +24,74 @@ #import "OFInvalidArgumentException.h" #import "OFInvalidFormatException.h" #import "OFOutOfRangeException.h" -extern uint32_t of_zip_archive_read_field32(const uint8_t **, uint16_t *); -extern uint64_t of_zip_archive_read_field64(const uint8_t **, uint16_t *); - OFString * -of_zip_archive_entry_version_to_string(uint16_t version) +OFZIPArchiveEntryVersionToString(uint16_t version) { const char *attrCompat = NULL; switch (version >> 8) { - case OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_MSDOS: + case OFZIPArchiveEntryAttributeCompatibilityMSDOS: attrCompat = "MS-DOS or OS/2"; break; - case OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_AMIGA: + case OFZIPArchiveEntryAttributeCompatibilityAmiga: attrCompat = "Amiga"; break; - case OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_OPENVMS: + case OFZIPArchiveEntryAttributeCompatibilityOpenVMS: attrCompat = "OpenVMS"; break; - case OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_UNIX: + case OFZIPArchiveEntryAttributeCompatibilityUNIX: attrCompat = "UNIX"; break; - case OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_VM_CMS: + case OFZIPArchiveEntryAttributeCompatibilityVM_CMS: attrCompat = "VM/CMS"; break; - case OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_ATARI_ST: + case OFZIPArchiveEntryAttributeCompatibilityAtariST: attrCompat = "Atari ST"; break; - case OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_OS2_HPFS: + case OFZIPArchiveEntryAttributeCompatibilityOS2HPFS: attrCompat = "OS/2 HPFS"; break; - case OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_MACINTOSH: + case OFZIPArchiveEntryAttributeCompatibilityMacintosh: attrCompat = "Macintosh"; break; - case OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_Z_SYSTEM: + case OFZIPArchiveEntryAttributeCompatibilityZSystem: attrCompat = "Z-System"; break; - case OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_CP_M: + case OFZIPArchiveEntryAttributeCompatibilityCPM: attrCompat = "CP/M"; break; - case OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_WINDOWS_NTFS: + case OFZIPArchiveEntryAttributeCompatibilityWindowsNTFS: attrCompat = "Windows NTFS"; break; - case OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_MVS: + case OFZIPArchiveEntryAttributeCompatibilityMVS: attrCompat = "MVS (OS/390 - Z/OS)"; break; - case OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_VSE: + case OFZIPArchiveEntryAttributeCompatibilityVSE: attrCompat = "VSE"; break; - case OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_ACORN_RISC_OS: + case OFZIPArchiveEntryAttributeCompatibilityAcornRISCOS: attrCompat = "Acorn RISC OS"; break; - case OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_VFAT: + case OFZIPArchiveEntryAttributeCompatibilityVFAT: attrCompat = "VFAT"; break; - case OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_ALTERNATE_MVS: + case OFZIPArchiveEntryAttributeCompatibilityAlternateMVS: attrCompat = "Alternate MVS"; break; - case OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_BEOS: + case OFZIPArchiveEntryAttributeCompatibilityBeOS: attrCompat = "BeOS"; break; - case OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_TANDEM: + case OFZIPArchiveEntryAttributeCompatibilityTandem: attrCompat = "Tandem"; break; - case OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_OS_400: + case OFZIPArchiveEntryAttributeCompatibilityOS400: attrCompat = "OS/400"; break; - case OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_OS_X: + case OFZIPArchiveEntryAttributeCompatibilityOSX: attrCompat = "OS X (Darwin)"; break; } if (attrCompat != NULL) @@ -106,47 +103,48 @@ @"%u.%u, unknown %02X", (version % 0xFF) / 10, (version & 0xFF) % 10, version >> 8]; } OFString * -of_zip_archive_entry_compression_method_to_string(uint16_t compressionMethod) +OFZIPArchiveEntryCompressionMethodName( + OFZIPArchiveEntryCompressionMethod compressionMethod) { switch (compressionMethod) { - case OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_NONE: + case OFZIPArchiveEntryCompressionMethodNone: return @"none"; - case OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_SHRINK: + case OFZIPArchiveEntryCompressionMethodShrink: return @"Shrink"; - case OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_REDUCE_FACTOR_1: + case OFZIPArchiveEntryCompressionMethodReduceFactor1: return @"Reduce (factor 1)"; - case OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_REDUCE_FACTOR_2: + case OFZIPArchiveEntryCompressionMethodReduceFactor2: return @"Reduce (factor 2)"; - case OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_REDUCE_FACTOR_3: + case OFZIPArchiveEntryCompressionMethodReduceFactor3: return @"Reduce (factor 3)"; - case OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_REDUCE_FACTOR_4: + case OFZIPArchiveEntryCompressionMethodReduceFactor4: return @"Reduce (factor 4)"; - case OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_IMPLODE: + case OFZIPArchiveEntryCompressionMethodImplode: return @"Implode"; - case OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_DEFLATE: + case OFZIPArchiveEntryCompressionMethodDeflate: return @"Deflate"; - case OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_DEFLATE64: + case OFZIPArchiveEntryCompressionMethodDeflate64: return @"Deflate64"; - case OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_BZIP2: + case OFZIPArchiveEntryCompressionMethodBZIP2: return @"BZip2"; - case OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_LZMA: + case OFZIPArchiveEntryCompressionMethodLZMA: return @"LZMA"; - case OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_WAVPACK: + case OFZIPArchiveEntryCompressionMethodWavPack: return @"WavPack"; - case OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_PPMD: + case OFZIPArchiveEntryCompressionMethodPPMd: return @"PPMd"; default: return @"unknown"; } } size_t -of_zip_archive_entry_extra_field_find(OFData *extraField, uint16_t tag, - uint16_t *size) +OFZIPArchiveEntryExtraFieldFind(OFData *extraField, + OFZIPArchiveEntryExtraFieldTag tag, uint16_t *size) { const uint8_t *bytes = extraField.items; size_t count = extraField.count; for (size_t i = 0; i < count;) { @@ -168,11 +166,11 @@ i += 4 + currentSize; } *size = 0; - return OF_NOT_FOUND; + return OFNotFound; } @implementation OFZIPArchiveEntry + (instancetype)entryWithFileName: (OFString *)fileName { @@ -211,11 +209,11 @@ @try { void *pool = objc_autoreleasePoolPush(); OFMutableData *extraField = nil; uint16_t fileNameLength, extraFieldLength, fileCommentLength; - of_string_encoding_t encoding; + OFStringEncoding encoding; size_t ZIP64Index; uint16_t ZIP64Size; if ([stream readLittleEndianInt32] != 0x02014B50) @throw [OFInvalidFormatException exception]; @@ -236,12 +234,11 @@ _internalAttributes = [stream readLittleEndianInt16]; _versionSpecificAttributes = [stream readLittleEndianInt32]; _localFileHeaderOffset = [stream readLittleEndianInt32]; encoding = (_generalPurposeBitFlag & (1u << 11) - ? OF_STRING_ENCODING_UTF_8 - : OF_STRING_ENCODING_CODEPAGE_437); + ? OFStringEncodingUTF8 : OFStringEncodingCodepage437); _fileName = [[stream readStringWithLength: fileNameLength encoding: encoding] copy]; if (extraFieldLength > 0) extraField = [[[stream readDataWithCount: @@ -249,31 +246,30 @@ if (fileCommentLength > 0) _fileComment = [[stream readStringWithLength: fileCommentLength encoding: encoding] copy]; - ZIP64Index = of_zip_archive_entry_extra_field_find(extraField, - OF_ZIP_ARCHIVE_ENTRY_EXTRA_FIELD_ZIP64, &ZIP64Size); + ZIP64Index = OFZIPArchiveEntryExtraFieldFind(extraField, + OFZIPArchiveEntryExtraFieldTagZIP64, &ZIP64Size); - if (ZIP64Index != OF_NOT_FOUND) { + if (ZIP64Index != OFNotFound) { const uint8_t *ZIP64 = [extraField itemAtIndex: ZIP64Index]; - of_range_t range = - of_range(ZIP64Index - 4, ZIP64Size + 4); + OFRange range = + OFRangeMake(ZIP64Index - 4, ZIP64Size + 4); if (_uncompressedSize == 0xFFFFFFFF) - _uncompressedSize = of_zip_archive_read_field64( + _uncompressedSize = OFZIPArchiveReadField64( &ZIP64, &ZIP64Size); if (_compressedSize == 0xFFFFFFFF) - _compressedSize = of_zip_archive_read_field64( + _compressedSize = OFZIPArchiveReadField64( &ZIP64, &ZIP64Size); if (_localFileHeaderOffset == 0xFFFFFFFF) _localFileHeaderOffset = - of_zip_archive_read_field64(&ZIP64, - &ZIP64Size); + OFZIPArchiveReadField64(&ZIP64, &ZIP64Size); if (_startDiskNumber == 0xFFFF) - _startDiskNumber = of_zip_archive_read_field32( + _startDiskNumber = OFZIPArchiveReadField32( &ZIP64, &ZIP64Size); if (ZIP64Size > 0 || _localFileHeaderOffset < 0) @throw [OFInvalidFormatException exception]; @@ -350,16 +346,16 @@ - (OFData *)extraField { return _extraField; } -- (uint16_t)versionMadeBy +- (OFZIPArchiveEntryAttributeCompatibility)versionMadeBy { return _versionMadeBy; } -- (uint16_t)minVersionNeeded +- (OFZIPArchiveEntryAttributeCompatibility)minVersionNeeded { return _minVersionNeeded; } - (OFDate *)modificationDate @@ -384,11 +380,11 @@ objc_autoreleasePoolPop(pool); return [date autorelease]; } -- (uint16_t)compressionMethod +- (OFZIPArchiveEntryCompressionMethod)compressionMethod { return _compressionMethod; } - (uint64_t)compressedSize @@ -433,12 +429,11 @@ - (OFString *)description { void *pool = objc_autoreleasePoolPush(); OFString *compressionMethod = - of_zip_archive_entry_compression_method_to_string( - _compressionMethod); + OFZIPArchiveEntryCompressionMethodName(_compressionMethod); OFString *ret = [OFString stringWithFormat: @"<%@:\n" @"\tFile name = %@\n" @"\tFile comment = %@\n" @"\tGeneral purpose bit flag = %u\n" @@ -489,11 +484,11 @@ size += (4 + (6 * 2) + (3 * 4) + (5 * 2) + (2 * 4)); [stream writeString: _fileName]; size += (uint64_t)_fileName.UTF8StringLength; - [stream writeLittleEndianInt16: OF_ZIP_ARCHIVE_ENTRY_EXTRA_FIELD_ZIP64]; + [stream writeLittleEndianInt16: OFZIPArchiveEntryExtraFieldTagZIP64]; [stream writeLittleEndianInt16: 28]; [stream writeLittleEndianInt64: _uncompressedSize]; [stream writeLittleEndianInt64: _compressedSize]; [stream writeLittleEndianInt64: _localFileHeaderOffset]; [stream writeLittleEndianInt32: _startDiskNumber]; Index: src/ObjFW.h ================================================================== --- src/ObjFW.h +++ src/ObjFW.h @@ -114,11 +114,11 @@ #import "OFXMLElement.h" #import "OFXMLAttribute.h" #import "OFXMLCharacters.h" #import "OFXMLCDATA.h" #import "OFXMLComment.h" -#import "OFXMLProcessingInstructions.h" +#import "OFXMLProcessingInstruction.h" #import "OFXMLParser.h" #import "OFXMLElementBuilder.h" #import "OFMessagePackExtension.h" @@ -126,11 +126,10 @@ #import "OFSystemInfo.h" #import "OFLocale.h" #import "OFOptionsParser.h" #import "OFTimer.h" #import "OFRunLoop.h" -#import "OFSandbox.h" #ifdef OF_WINDOWS # import "OFWindowsRegistryKey.h" #endif @@ -210,11 +209,10 @@ #import "OFRemoveItemFailedException.h" #ifdef OF_HAVE_SOCKETS # import "OFResolveHostFailedException.h" #endif #import "OFRetrieveItemAttributesFailedException.h" -#import "OFSandboxActivationFailedException.h" #import "OFSeekFailedException.h" #import "OFSetItemAttributesFailedException.h" #import "OFSetOptionFailedException.h" #ifdef OF_WINDOWS # import "OFSetWindowsRegistryValueFailedException.h" @@ -238,33 +236,29 @@ #ifdef OF_HAVE_PLUGINS # import "OFPlugin.h" #endif #ifdef OF_HAVE_ATOMIC_OPS -# import "atomic.h" -#endif - -#import "OFLocking.h" -#import "OFThread.h" -#import "once.h" -#ifdef OF_HAVE_THREADS -# import "thread.h" -# import "tlskey.h" -# import "mutex.h" -# import "condition.h" -# import "OFThreadPool.h" -# import "OFMutex.h" -# import "OFRecursiveMutex.h" -# import "OFCondition.h" -#endif - -#import "base64.h" -#import "crc16.h" -#import "crc32.h" -#import "huffman_tree.h" -#import "of_asprintf.h" -#import "of_strptime.h" -#import "pbkdf2.h" -#import "scrypt.h" -#ifdef OF_HAVE_UNICODE_TABLES -# import "unicode.h" -#endif +# import "OFAtomic.h" +#endif +#import "OFLocking.h" +#import "OFOnce.h" +#import "OFThread.h" +#ifdef OF_HAVE_THREADS +# import "OFCondition.h" +# import "OFMutex.h" +# import "OFPlainCondition.h" +# import "OFPlainMutex.h" +# import "OFPlainThread.h" +# import "OFRecursiveMutex.h" +# import "OFTLSKey.h" +# import "OFThreadPool.h" +#endif + +#import "OFASPrintF.h" +#import "OFBase64.h" +#import "OFCRC16.h" +#import "OFCRC32.h" +#import "OFHuffmanTree.h" +#import "OFPBKDF2.h" +#import "OFScrypt.h" +#import "OFStrPTime.h" DELETED src/atomic.h Index: src/atomic.h ================================================================== --- src/atomic.h +++ src/atomic.h @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include - -#import "macros.h" - -#ifndef OF_HAVE_ATOMIC_OPS -# error No atomic operations available! -#endif - -#if !defined(OF_HAVE_THREADS) -# import "atomic_no_threads.h" -#elif (defined(OF_X86_64) || defined(OF_X86)) && defined(__GNUC__) -# import "atomic_x86.h" -#elif defined(OF_POWERPC) && defined(__GNUC__) && !defined(__APPLE_CC__) && \ - !defined(OF_AIX) -# import "atomic_powerpc.h" -#elif defined(OF_HAVE_ATOMIC_BUILTINS) -# import "atomic_builtins.h" -#elif defined(OF_HAVE_SYNC_BUILTINS) -# import "atomic_sync_builtins.h" -#elif defined(OF_HAVE_OSATOMIC) -# import "atomic_osatomic.h" -#else -# error No atomic operations available! -#endif DELETED src/atomic_builtins.h Index: src/atomic_builtins.h ================================================================== --- src/atomic_builtins.h +++ src/atomic_builtins.h @@ -1,150 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -static OF_INLINE int -of_atomic_int_add(volatile int *_Nonnull p, int i) -{ - return __atomic_add_fetch(p, i, __ATOMIC_RELAXED); -} - -static OF_INLINE int32_t -of_atomic_int32_add(volatile int32_t *_Nonnull p, int32_t i) -{ - return __atomic_add_fetch(p, i, __ATOMIC_RELAXED); -} - -static OF_INLINE void *_Nullable -of_atomic_ptr_add(void *volatile _Nullable *_Nonnull p, intptr_t i) -{ - return __atomic_add_fetch(p, i, __ATOMIC_RELAXED); -} - -static OF_INLINE int -of_atomic_int_sub(volatile int *_Nonnull p, int i) -{ - return __atomic_sub_fetch(p, i, __ATOMIC_RELAXED); -} - -static OF_INLINE int32_t -of_atomic_int32_sub(volatile int32_t *_Nonnull p, int32_t i) -{ - return __atomic_sub_fetch(p, i, __ATOMIC_RELAXED); -} - -static OF_INLINE void *_Nullable -of_atomic_ptr_sub(void *volatile _Nullable *_Nonnull p, intptr_t i) -{ - return __atomic_sub_fetch(p, i, __ATOMIC_RELAXED); -} - -static OF_INLINE int -of_atomic_int_inc(volatile int *_Nonnull p) -{ - return __atomic_add_fetch(p, 1, __ATOMIC_RELAXED); -} - -static OF_INLINE int32_t -of_atomic_int32_inc(volatile int32_t *_Nonnull p) -{ - return __atomic_add_fetch(p, 1, __ATOMIC_RELAXED); -} - -static OF_INLINE int -of_atomic_int_dec(volatile int *_Nonnull p) -{ - return __atomic_sub_fetch(p, 1, __ATOMIC_RELAXED); -} - -static OF_INLINE int32_t -of_atomic_int32_dec(volatile int32_t *_Nonnull p) -{ - return __atomic_sub_fetch(p, 1, __ATOMIC_RELAXED); -} - -static OF_INLINE unsigned int -of_atomic_int_or(volatile unsigned int *_Nonnull p, unsigned int i) -{ - return __atomic_or_fetch(p, i, __ATOMIC_RELAXED); -} - -static OF_INLINE uint32_t -of_atomic_int32_or(volatile uint32_t *_Nonnull p, uint32_t i) -{ - return __atomic_or_fetch(p, i, __ATOMIC_RELAXED); -} - -static OF_INLINE unsigned int -of_atomic_int_and(volatile unsigned int *_Nonnull p, unsigned int i) -{ - return __atomic_and_fetch(p, i, __ATOMIC_RELAXED); -} - -static OF_INLINE uint32_t -of_atomic_int32_and(volatile uint32_t *_Nonnull p, uint32_t i) -{ - return __atomic_and_fetch(p, i, __ATOMIC_RELAXED); -} - -static OF_INLINE unsigned int -of_atomic_int_xor(volatile unsigned int *_Nonnull p, unsigned int i) -{ - return __atomic_xor_fetch(p, i, __ATOMIC_RELAXED); -} - -static OF_INLINE uint32_t -of_atomic_int32_xor(volatile uint32_t *_Nonnull p, uint32_t i) -{ - return __atomic_xor_fetch(p, i, __ATOMIC_RELAXED); -} - -static OF_INLINE bool -of_atomic_int_cmpswap(volatile int *_Nonnull p, int o, int n) -{ - return __atomic_compare_exchange(p, &o, &n, false, - __ATOMIC_RELAXED, __ATOMIC_RELAXED); -} - -static OF_INLINE bool -of_atomic_int32_cmpswap(volatile int32_t *_Nonnull p, int32_t o, int32_t n) -{ - return __atomic_compare_exchange(p, &o, &n, false, - __ATOMIC_RELAXED, __ATOMIC_RELAXED); -} - -static OF_INLINE bool -of_atomic_ptr_cmpswap(void *volatile _Nullable *_Nonnull p, - void *_Nullable o, void *_Nullable n) -{ - return __atomic_compare_exchange(p, &o, &n, false, - __ATOMIC_RELAXED, __ATOMIC_RELAXED); -} - -static OF_INLINE void -of_memory_barrier_full(void) -{ - __atomic_thread_fence(__ATOMIC_SEQ_CST); -} - -static OF_INLINE void -of_memory_barrier_acquire(void) -{ - __atomic_thread_fence(__ATOMIC_ACQUIRE); -} - -static OF_INLINE void -of_memory_barrier_release(void) -{ - __atomic_thread_fence(__ATOMIC_RELEASE); -} DELETED src/atomic_no_threads.h Index: src/atomic_no_threads.h ================================================================== --- src/atomic_no_threads.h +++ src/atomic_no_threads.h @@ -1,162 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -static OF_INLINE int -of_atomic_int_add(volatile int *_Nonnull p, int i) -{ - return (*p += i); -} - -static OF_INLINE int32_t -of_atomic_int32_add(volatile int32_t *_Nonnull p, int32_t i) -{ - return (*p += i); -} - -static OF_INLINE void *_Nullable -of_atomic_ptr_add(void *volatile _Nullable *_Nonnull p, intptr_t i) -{ - return (*(char *volatile *)p += i); -} - -static OF_INLINE int -of_atomic_int_sub(volatile int *_Nonnull p, int i) -{ - return (*p -= i); -} - -static OF_INLINE int32_t -of_atomic_int32_sub(volatile int32_t *_Nonnull p, int32_t i) -{ - return (*p -= i); -} - -static OF_INLINE void *_Nullable -of_atomic_ptr_sub(void *volatile _Nullable *_Nonnull p, intptr_t i) -{ - return (*(char *volatile *)p -= i); -} - -static OF_INLINE int -of_atomic_int_inc(volatile int *_Nonnull p) -{ - return ++*p; -} - -static OF_INLINE int32_t -of_atomic_int32_inc(volatile int32_t *_Nonnull p) -{ - return ++*p; -} - -static OF_INLINE int -of_atomic_int_dec(volatile int *_Nonnull p) -{ - return --*p; -} - -static OF_INLINE int32_t -of_atomic_int32_dec(volatile int32_t *_Nonnull p) -{ - return --*p; -} - -static OF_INLINE unsigned int -of_atomic_int_or(volatile unsigned int *_Nonnull p, unsigned int i) -{ - return (*p |= i); -} - -static OF_INLINE uint32_t -of_atomic_int32_or(volatile uint32_t *_Nonnull p, uint32_t i) -{ - return (*p |= i); -} - -static OF_INLINE unsigned int -of_atomic_int_and(volatile unsigned int *_Nonnull p, unsigned int i) -{ - return (*p &= i); -} - -static OF_INLINE uint32_t -of_atomic_int32_and(volatile uint32_t *_Nonnull p, uint32_t i) -{ - return (*p &= i); -} - -static OF_INLINE unsigned int -of_atomic_int_xor(volatile unsigned int *_Nonnull p, unsigned int i) -{ - return (*p ^= i); -} - -static OF_INLINE uint32_t -of_atomic_int32_xor(volatile uint32_t *_Nonnull p, uint32_t i) -{ - return (*p ^= i); -} - -static OF_INLINE bool -of_atomic_int_cmpswap(volatile int *_Nonnull p, int o, int n) -{ - if (*p == o) { - *p = n; - return true; - } - - return false; -} - -static OF_INLINE bool -of_atomic_int32_cmpswap(volatile int32_t *_Nonnull p, int32_t o, int32_t n) -{ - if (*p == o) { - *p = n; - return true; - } - - return false; -} - -static OF_INLINE bool -of_atomic_ptr_cmpswap(void *volatile _Nullable *_Nonnull p, - void *_Nullable o, void *_Nullable n) -{ - if (*p == o) { - *p = n; - return true; - } - - return false; -} - -static OF_INLINE void -of_memory_barrier(void) -{ - /* nop */ -} - -static OF_INLINE void -of_memory_barrier_acquire(void) -{ - /* nop */ -} - -static OF_INLINE void -of_memory_barrier_release(void) -{ - /* nop */ -} DELETED src/atomic_osatomic.h Index: src/atomic_osatomic.h ================================================================== --- src/atomic_osatomic.h +++ src/atomic_osatomic.h @@ -1,157 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include - -static OF_INLINE int -of_atomic_int_add(volatile int *_Nonnull p, int i) -{ - return OSAtomicAdd32(i, p); -} - -static OF_INLINE int32_t -of_atomic_int32_add(volatile int32_t *_Nonnull p, int32_t i) -{ - return OSAtomicAdd32(i, p); -} - -static OF_INLINE void *_Nullable -of_atomic_ptr_add(void *volatile _Nullable *_Nonnull p, intptr_t i) -{ -#ifdef __LP64__ - return (void *)OSAtomicAdd64(i, (int64_t *)p); -#else - return (void *)OSAtomicAdd32(i, (int32_t *)p); -#endif -} - -static OF_INLINE int -of_atomic_int_sub(volatile int *_Nonnull p, int i) -{ - return OSAtomicAdd32(-i, p); -} - -static OF_INLINE int32_t -of_atomic_int32_sub(volatile int32_t *_Nonnull p, int32_t i) -{ - return OSAtomicAdd32(-i, p); -} - -static OF_INLINE void *_Nullable -of_atomic_ptr_sub(void *volatile _Nullable *_Nonnull p, intptr_t i) -{ -#ifdef __LP64__ - return (void *)OSAtomicAdd64(-i, (int64_t *)p); -#else - return (void *)OSAtomicAdd32(-i, (int32_t *)p); -#endif -} - -static OF_INLINE int -of_atomic_int_inc(volatile int *_Nonnull p) -{ - return OSAtomicIncrement32(p); -} - -static OF_INLINE int32_t -of_atomic_int32_inc(volatile int32_t *_Nonnull p) -{ - return OSAtomicIncrement32(p); -} - -static OF_INLINE int -of_atomic_int_dec(volatile int *_Nonnull p) -{ - return OSAtomicDecrement32(p); -} - -static OF_INLINE int32_t -of_atomic_int32_dec(volatile int32_t *_Nonnull p) -{ - return OSAtomicDecrement32(p); -} - -static OF_INLINE unsigned int -of_atomic_int_or(volatile unsigned int *_Nonnull p, unsigned int i) -{ - return OSAtomicOr32(i, p); -} - -static OF_INLINE uint32_t -of_atomic_int32_or(volatile uint32_t *_Nonnull p, uint32_t i) -{ - return OSAtomicOr32(i, p); -} - -static OF_INLINE unsigned int -of_atomic_int_and(volatile unsigned int *_Nonnull p, unsigned int i) -{ - return OSAtomicAnd32(i, p); -} - -static OF_INLINE uint32_t -of_atomic_int32_and(volatile uint32_t *_Nonnull p, uint32_t i) -{ - return OSAtomicAnd32(i, p); -} - -static OF_INLINE unsigned int -of_atomic_int_xor(volatile unsigned int *_Nonnull p, unsigned int i) -{ - return OSAtomicXor32(i, p); -} - -static OF_INLINE uint32_t -of_atomic_int32_xor(volatile uint32_t *_Nonnull p, uint32_t i) -{ - return OSAtomicXor32(i, p); -} - -static OF_INLINE bool -of_atomic_int_cmpswap(volatile int *_Nonnull p, int o, int n) -{ - return OSAtomicCompareAndSwapInt(o, n, p); -} - -static OF_INLINE bool -of_atomic_int32_cmpswap(volatile int32_t *_Nonnull p, int32_t o, int32_t n) -{ - return OSAtomicCompareAndSwap32(o, n, p); -} - -static OF_INLINE bool -of_atomic_ptr_cmpswap(void *volatile _Nullable *_Nonnull p, - void *_Nullable o, void *_Nullable n) -{ - return OSAtomicCompareAndSwapPtr(o, n, p); -} - -static OF_INLINE void -of_memory_barrier(void) -{ - OSMemoryBarrier(); -} - -static OF_INLINE void -of_memory_barrier_acquire(void) -{ - OSMemoryBarrier(); -} - -static OF_INLINE void -of_memory_barrier_release(void) -{ - OSMemoryBarrier(); -} DELETED src/atomic_powerpc.h Index: src/atomic_powerpc.h ================================================================== --- src/atomic_powerpc.h +++ src/atomic_powerpc.h @@ -1,397 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -static OF_INLINE int -of_atomic_int_add(volatile int *_Nonnull p, int i) -{ - __asm__ __volatile__ ( - "0:\n\t" - "lwarx %0, 0, %2\n\t" - "add %0, %0, %1\n\t" - "stwcx. %0, 0, %2\n\t" - "bne- 0b" - : "=&r"(i) - : "r"(i), "r"(p) - : "cc", "memory" - ); - - return i; -} - -static OF_INLINE int32_t -of_atomic_int32_add(volatile int32_t *_Nonnull p, int32_t i) -{ - __asm__ __volatile__ ( - "0:\n\t" - "lwarx %0, 0, %2\n\t" - "add %0, %0, %1\n\t" - "stwcx. %0, 0, %2\n\t" - "bne- 0b" - : "=&r"(i) - : "r"(i), "r"(p) - : "cc", "memory" - ); - - return i; -} - -static OF_INLINE void *_Nullable -of_atomic_ptr_add(void *volatile _Nullable *_Nonnull p, intptr_t i) -{ - __asm__ __volatile__ ( - "0:\n\t" - "lwarx %0, 0, %2\n\t" - "add %0, %0, %1\n\t" - "stwcx. %0, 0, %2\n\t" - "bne- 0b" - : "=&r"(i) - : "r"(i), "r"(p) - : "cc", "memory" - ); - - return (void *)i; -} - -static OF_INLINE int -of_atomic_int_sub(volatile int *_Nonnull p, int i) -{ - __asm__ __volatile__ ( - "0:\n\t" - "lwarx %0, 0, %2\n\t" - "sub %0, %0, %1\n\t" - "stwcx. %0, 0, %2\n\t" - "bne- 0b" - : "=&r"(i) - : "r"(i), "r"(p) - : "cc", "memory" - ); - - return i; -} - -static OF_INLINE int32_t -of_atomic_int32_sub(volatile int32_t *_Nonnull p, int32_t i) -{ - __asm__ __volatile__ ( - "0:\n\t" - "lwarx %0, 0, %2\n\t" - "sub %0, %0, %1\n\t" - "stwcx. %0, 0, %2\n\t" - "bne- 0b" - : "=&r"(i) - : "r"(i), "r"(p) - : "cc", "memory" - ); - - return i; -} - -static OF_INLINE void *_Nullable -of_atomic_ptr_sub(void *volatile _Nullable *_Nonnull p, intptr_t i) -{ - __asm__ __volatile__ ( - "0:\n\t" - "lwarx %0, 0, %2\n\t" - "sub %0, %0, %1\n\t" - "stwcx. %0, 0, %2\n\t" - "bne- 0b" - : "=&r"(i) - : "r"(i), "r"(p) - : "cc", "memory" - ); - - return (void *)i; -} - -static OF_INLINE int -of_atomic_int_inc(volatile int *_Nonnull p) -{ - int i; - - __asm__ __volatile__ ( - "0:\n\t" - "lwarx %0, 0, %1\n\t" - "addi %0, %0, 1\n\t" - "stwcx. %0, 0, %1\n\t" - "bne- 0b" - : "=&r"(i) - : "r"(p) - : "cc", "memory" - ); - - return i; -} - -static OF_INLINE int32_t -of_atomic_int32_inc(volatile int32_t *_Nonnull p) -{ - int32_t i; - - __asm__ __volatile__ ( - "0:\n\t" - "lwarx %0, 0, %1\n\t" - "addi %0, %0, 1\n\t" - "stwcx. %0, 0, %1\n\t" - "bne- 0b" - : "=&r"(i) - : "r"(p) - : "cc", "memory" - ); - - return i; -} - -static OF_INLINE int -of_atomic_int_dec(volatile int *_Nonnull p) -{ - int i; - - __asm__ __volatile__ ( - "0:\n\t" - "lwarx %0, 0, %1\n\t" - "subi %0, %0, 1\n\t" - "stwcx. %0, 0, %1\n\t" - "bne- 0b" - : "=&r"(i) - : "r"(p) - : "cc", "memory" - ); - - return i; -} - -static OF_INLINE int32_t -of_atomic_int32_dec(volatile int32_t *_Nonnull p) -{ - int32_t i; - - __asm__ __volatile__ ( - "0:\n\t" - "lwarx %0, 0, %1\n\t" - "subi %0, %0, 1\n\t" - "stwcx. %0, 0, %1\n\t" - "bne- 0b" - : "=&r"(i) - : "r"(p) - : "cc", "memory" - ); - - return i; -} - -static OF_INLINE unsigned int -of_atomic_int_or(volatile unsigned int *_Nonnull p, unsigned int i) -{ - __asm__ __volatile__ ( - "0:\n\t" - "lwarx %0, 0, %2\n\t" - "or %0, %0, %1\n\t" - "stwcx. %0, 0, %2\n\t" - "bne- 0b" - : "=&r"(i) - : "r"(i), "r"(p) - : "cc", "memory" - ); - - return i; -} - -static OF_INLINE uint32_t -of_atomic_int32_or(volatile uint32_t *_Nonnull p, uint32_t i) -{ - __asm__ __volatile__ ( - "0:\n\t" - "lwarx %0, 0, %2\n\t" - "or %0, %0, %1\n\t" - "stwcx. %0, 0, %2\n\t" - "bne- 0b" - : "=&r"(i) - : "r"(i), "r"(p) - : "cc", "memory" - ); - - return i; -} - -static OF_INLINE unsigned int -of_atomic_int_and(volatile unsigned int *_Nonnull p, unsigned int i) -{ - __asm__ __volatile__ ( - "0:\n\t" - "lwarx %0, 0, %2\n\t" - "and %0, %0, %1\n\t" - "stwcx. %0, 0, %2\n\t" - "bne- 0b" - : "=&r"(i) - : "r"(i), "r"(p) - : "cc", "memory" - ); - - return i; -} - -static OF_INLINE uint32_t -of_atomic_int32_and(volatile uint32_t *_Nonnull p, uint32_t i) -{ - __asm__ __volatile__ ( - "0:\n\t" - "lwarx %0, 0, %2\n\t" - "and %0, %0, %1\n\t" - "stwcx. %0, 0, %2\n\t" - "bne- 0b" - : "=&r"(i) - : "r"(i), "r"(p) - : "cc", "memory" - ); - - return i; -} - -static OF_INLINE unsigned int -of_atomic_int_xor(volatile unsigned int *_Nonnull p, unsigned int i) -{ - __asm__ __volatile__ ( - "0:\n\t" - "lwarx %0, 0, %2\n\t" - "xor %0, %0, %1\n\t" - "stwcx. %0, 0, %2\n\t" - "bne- 0b" - : "=&r"(i) - : "r"(i), "r"(p) - : "cc", "memory" - ); - - return i; -} - -static OF_INLINE uint32_t -of_atomic_int32_xor(volatile uint32_t *_Nonnull p, uint32_t i) -{ - __asm__ __volatile__ ( - "0:\n\t" - "lwarx %0, 0, %2\n\t" - "xor %0, %0, %1\n\t" - "stwcx. %0, 0, %2\n\t" - "bne- 0b" - : "=&r"(i) - : "r"(i), "r"(p) - : "cc", "memory" - ); - - return i; -} - -static OF_INLINE bool -of_atomic_int_cmpswap(volatile int *_Nonnull p, int o, int n) -{ - int r; - - __asm__ __volatile__ ( - "0:\n\t" - "lwarx %0, 0, %3\n\t" - "cmpw %0, %1\n\t" - "bne 1f\n\t" - "stwcx. %2, 0, %3\n\t" - "bne- 0b\n\t" - "li %0, 1\n\t" - "b 2f\n\t" - "1:\n\t" - "stwcx. %0, 0, %3\n\t" - "li %0, 0\n\t" - "2:" - : "=&r"(r) - : "r"(o), "r"(n), "r"(p) - : "cc", "memory" - ); - - return r; -} - -static OF_INLINE bool -of_atomic_int32_cmpswap(volatile int32_t *_Nonnull p, int32_t o, int32_t n) -{ - int r; - - __asm__ __volatile__ ( - "0:\n\t" - "lwarx %0, 0, %3\n\t" - "cmpw %0, %1\n\t" - "bne 1f\n\t" - "stwcx. %2, 0, %3\n\t" - "bne- 0b\n\t" - "li %0, 1\n\t" - "b 2f\n\t" - "1:\n\t" - "stwcx. %0, 0, %3\n\t" - "li %0, 0\n\t" - "2:" - : "=&r"(r) - : "r"(o), "r"(n), "r"(p) - : "cc", "memory" - ); - - return r; -} - -static OF_INLINE bool -of_atomic_ptr_cmpswap(void *volatile _Nullable *_Nonnull p, - void *_Nullable o, void *_Nullable n) -{ - int r; - - __asm__ __volatile__ ( - "0:\n\t" - "lwarx %0, 0, %3\n\t" - "cmpw %0, %1\n\t" - "bne 1f\n\t" - "stwcx. %2, 0, %3\n\t" - "bne- 0b\n\t" - "li %0, 1\n\t" - "b 2f\n\t" - "1:\n\t" - "stwcx. %0, 0, %3\n\t" - "li %0, 0\n\t" - "2:" - : "=&r"(r) - : "r"(o), "r"(n), "r"(p) - : "cc", "memory" - ); - - return r; -} - -static OF_INLINE void -of_memory_barrier(void) -{ - __asm__ __volatile__ ( - ".long 0x7C2004AC /* lwsync */" ::: "memory" - ); -} - -static OF_INLINE void -of_memory_barrier_acquire(void) -{ - __asm__ __volatile__ ( - ".long 0x7C2004AC /* lwsync */" ::: "memory" - ); -} - -static OF_INLINE void -of_memory_barrier_release(void) -{ - __asm__ __volatile__ ( - ".long 0x7C2004AC /* lwsync */" ::: "memory" - ); -} DELETED src/atomic_sync_builtins.h Index: src/atomic_sync_builtins.h ================================================================== --- src/atomic_sync_builtins.h +++ src/atomic_sync_builtins.h @@ -1,147 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -static OF_INLINE int -of_atomic_int_add(volatile int *_Nonnull p, int i) -{ - return __sync_add_and_fetch(p, i); -} - -static OF_INLINE int32_t -of_atomic_int32_add(volatile int32_t *_Nonnull p, int32_t i) -{ - return __sync_add_and_fetch(p, i); -} - -static OF_INLINE void *_Nullable -of_atomic_ptr_add(void *volatile _Nullable *_Nonnull p, intptr_t i) -{ - return __sync_add_and_fetch(p, (void *)i); -} - -static OF_INLINE int -of_atomic_int_sub(volatile int *_Nonnull p, int i) -{ - return __sync_sub_and_fetch(p, i); -} - -static OF_INLINE int32_t -of_atomic_int32_sub(volatile int32_t *_Nonnull p, int32_t i) -{ - return __sync_sub_and_fetch(p, i); -} - -static OF_INLINE void *_Nullable -of_atomic_ptr_sub(void *volatile _Nullable *_Nonnull p, intptr_t i) -{ - return __sync_sub_and_fetch(p, (void *)i); -} - -static OF_INLINE int -of_atomic_int_inc(volatile int *_Nonnull p) -{ - return __sync_add_and_fetch(p, 1); -} - -static OF_INLINE int32_t -of_atomic_int32_inc(volatile int32_t *_Nonnull p) -{ - return __sync_add_and_fetch(p, 1); -} - -static OF_INLINE int -of_atomic_int_dec(volatile int *_Nonnull p) -{ - return __sync_sub_and_fetch(p, 1); -} - -static OF_INLINE int32_t -of_atomic_int32_dec(volatile int32_t *_Nonnull p) -{ - return __sync_sub_and_fetch(p, 1); -} - -static OF_INLINE unsigned int -of_atomic_int_or(volatile unsigned int *_Nonnull p, unsigned int i) -{ - return __sync_or_and_fetch(p, i); -} - -static OF_INLINE uint32_t -of_atomic_int32_or(volatile uint32_t *_Nonnull p, uint32_t i) -{ - return __sync_or_and_fetch(p, i); -} - -static OF_INLINE unsigned int -of_atomic_int_and(volatile unsigned int *_Nonnull p, unsigned int i) -{ - return __sync_and_and_fetch(p, i); -} - -static OF_INLINE uint32_t -of_atomic_int32_and(volatile uint32_t *_Nonnull p, uint32_t i) -{ - return __sync_and_and_fetch(p, i); -} - -static OF_INLINE unsigned int -of_atomic_int_xor(volatile unsigned int *_Nonnull p, unsigned int i) -{ - return __sync_xor_and_fetch(p, i); -} - -static OF_INLINE uint32_t -of_atomic_int32_xor(volatile uint32_t *_Nonnull p, uint32_t i) -{ - return __sync_xor_and_fetch(p, i); -} - -static OF_INLINE bool -of_atomic_int_cmpswap(volatile int *_Nonnull p, int o, int n) -{ - return __sync_bool_compare_and_swap(p, o, n); -} - -static OF_INLINE bool -of_atomic_int32_cmpswap(volatile int32_t *_Nonnull p, int32_t o, int32_t n) -{ - return __sync_bool_compare_and_swap(p, o, n); -} - -static OF_INLINE bool -of_atomic_ptr_cmpswap(void *volatile _Nullable *_Nonnull p, - void *_Nullable o, void *_Nullable n) -{ - return __sync_bool_compare_and_swap(p, o, n); -} - -static OF_INLINE void -of_memory_barrier(void) -{ - __sync_synchronize(); -} - -static OF_INLINE void -of_memory_barrier_acquire(void) -{ - __sync_synchronize(); -} - -static OF_INLINE void -of_memory_barrier_release(void) -{ - __sync_synchronize(); -} DELETED src/atomic_x86.h Index: src/atomic_x86.h ================================================================== --- src/atomic_x86.h +++ src/atomic_x86.h @@ -1,502 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -OF_ASSUME_NONNULL_BEGIN - -static OF_INLINE int -of_atomic_int_add(volatile int *_Nonnull p, int i) -{ - if (sizeof(int) == 4) - __asm__ __volatile__ ( - "lock\n\t" - "xaddl %0, %2\n\t" - "addl %1, %0" - : "+&r"(i) - : "r"(i), "m"(*p) - ); -#ifdef OF_X86_64 - else if (sizeof(int) == 8) - __asm__ __volatile__ ( - "lock\n\t" - "xaddq %0, %2\n\t" - "addq %1, %0" - : "+&r"(i) - : "r"(i), "m"(*p) - ); -#endif - else - abort(); - - return i; -} - -static OF_INLINE int32_t -of_atomic_int32_add(volatile int32_t *_Nonnull p, int32_t i) -{ - __asm__ __volatile__ ( - "lock\n\t" - "xaddl %0, %2\n\t" - "addl %1, %0" - : "+&r"(i) - : "r"(i), "m"(*p) - ); - - return i; -} - -static OF_INLINE void *_Nullable -of_atomic_ptr_add(void *volatile _Nullable *_Nonnull p, intptr_t i) -{ -#if defined(OF_X86_64) - __asm__ __volatile__ ( - "lock\n\t" - "xaddq %0, %2\n\t" - "addq %1, %0" - : "+&r"(i) - : "r"(i), "m"(*p) - ); - - return (void *)i; -#elif defined(OF_X86) - __asm__ __volatile__ ( - "lock\n\t" - "xaddl %0, %2\n\t" - "addl %1, %0" - : "+&r"(i) - : "r"(i), "m"(*p) - ); - - return (void *)i; -#endif -} - -static OF_INLINE int -of_atomic_int_sub(volatile int *_Nonnull p, int i) -{ - if (sizeof(int) == 4) - __asm__ __volatile__ ( - "negl %0\n\t" - "lock\n\t" - "xaddl %0, %2\n\t" - "subl %1, %0" - : "+&r"(i) - : "r"(i), "m"(*p) - ); -#ifdef OF_X86_64 - else if (sizeof(int) == 8) - __asm__ __volatile__ ( - "negq %0\n\t" - "lock\n\t" - "xaddq %0, %2\n\t" - "subq %1, %0" - : "+&r"(i) - : "r"(i), "m"(*p) - ); -#endif - else - abort(); - - return i; -} - -static OF_INLINE int32_t -of_atomic_int32_sub(volatile int32_t *_Nonnull p, int32_t i) -{ - __asm__ __volatile__ ( - "negl %0\n\t" - "lock\n\t" - "xaddl %0, %2\n\t" - "subl %1, %0" - : "+&r"(i) - : "r"(i), "m"(*p) - ); - - return i; -} - -static OF_INLINE void *_Nullable -of_atomic_ptr_sub(void *volatile _Nullable *_Nonnull p, intptr_t i) -{ -#if defined(OF_X86_64) - __asm__ __volatile__ ( - "negq %0\n\t" - "lock\n\t" - "xaddq %0, %2\n\t" - "subq %1, %0" - : "+&r"(i) - : "r"(i), "m"(*p) - ); - - return (void *)i; -#elif defined(OF_X86) - __asm__ __volatile__ ( - "negl %0\n\t" - "lock\n\t" - "xaddl %0, %2\n\t" - "subl %1, %0" - : "+&r"(i) - : "r"(i), "m"(*p) - ); - - return (void *)i; -#endif -} - -static OF_INLINE int -of_atomic_int_inc(volatile int *_Nonnull p) -{ - int i; - - if (sizeof(int) == 4) - __asm__ __volatile__ ( - "xorl %0, %0\n\t" - "incl %0\n\t" - "lock\n\t" - "xaddl %0, %1\n\t" - "incl %0" - : "=&r"(i) - : "m"(*p) - ); -#ifdef OF_X86_64 - else if (sizeof(int) == 8) - __asm__ __volatile__ ( - "xorq %0, %0\n\t" - "incq %0\n\t" - "lock\n\t" - "xaddq %0, %1\n\t" - "incq %0" - : "=&r"(i) - : "m"(*p) - ); -#endif - else - abort(); - - return i; -} - -static OF_INLINE int32_t -of_atomic_int32_inc(volatile int32_t *_Nonnull p) -{ - int32_t i; - - __asm__ __volatile__ ( - "xorl %0, %0\n\t" - "incl %0\n\t" - "lock\n\t" - "xaddl %0, %1\n\t" - "incl %0" - : "=&r"(i) - : "m"(*p) - ); - - return i; -} - -static OF_INLINE int -of_atomic_int_dec(volatile int *_Nonnull p) -{ - int i; - - if (sizeof(int) == 4) - __asm__ __volatile__ ( - "xorl %0, %0\n\t" - "decl %0\n\t" - "lock\n\t" - "xaddl %0, %1\n\t" - "decl %0" - : "=&r"(i) - : "m"(*p) - ); -#ifdef OF_X86_64 - else if (sizeof(int) == 8) - __asm__ __volatile__ ( - "xorq %0, %0\n\t" - "decq %0\n\t" - "lock\n\t" - "xaddq %0, %1\n\t" - "decq %0" - : "=&r"(i) - : "m"(*p) - ); -#endif - else - abort(); - - return i; -} - -static OF_INLINE int32_t -of_atomic_int32_dec(volatile int32_t *_Nonnull p) -{ - int32_t i; - - __asm__ __volatile__ ( - "xorl %0, %0\n\t" - "decl %0\n\t" - "lock\n\t" - "xaddl %0, %1\n\t" - "decl %0" - : "=&r"(i) - : "m"(*p) - ); - - return i; -} - -static OF_INLINE unsigned int -of_atomic_int_or(volatile unsigned int *_Nonnull p, unsigned int i) -{ - if (sizeof(int) == 4) - __asm__ __volatile__ ( - "0:\n\t" - "movl %2, %0\n\t" - "movl %0, %%eax\n\t" - "orl %1, %0\n\t" - "lock\n\t" - "cmpxchg %0, %2\n\t" - "jne 0b" - : "=&r"(i) - : "r"(i), "m"(*p) - : "eax", "cc" - ); -#ifdef OF_X86_64 - else if (sizeof(int) == 8) - __asm__ __volatile__ ( - "0:\n\t" - "movq %2, %0\n\t" - "movq %0, %%rax\n\t" - "orq %1, %0\n\t" - "lock\n\t" - "cmpxchg %0, %2\n\t" - "jne 0b" - : "=&r"(i) - : "r"(i), "m"(*p) - : "rax", "cc" - ); -#endif - else - abort(); - - return i; -} - -static OF_INLINE uint32_t -of_atomic_int32_or(volatile uint32_t *_Nonnull p, uint32_t i) -{ - __asm__ __volatile__ ( - "0:\n\t" - "movl %2, %0\n\t" - "movl %0, %%eax\n\t" - "orl %1, %0\n\t" - "lock\n\t" - "cmpxchg %0, %2\n\t" - "jne 0b" - : "=&r"(i) - : "r"(i), "m"(*p) - : "eax", "cc" - ); - - return i; -} - -static OF_INLINE unsigned int -of_atomic_int_and(volatile unsigned int *_Nonnull p, unsigned int i) -{ - if (sizeof(int) == 4) - __asm__ __volatile__ ( - "0:\n\t" - "movl %2, %0\n\t" - "movl %0, %%eax\n\t" - "andl %1, %0\n\t" - "lock\n\t" - "cmpxchg %0, %2\n\t" - "jne 0b" - : "=&r"(i) - : "r"(i), "m"(*p) - : "eax", "cc" - ); -#ifdef OF_X86_64 - else if (sizeof(int) == 8) - __asm__ __volatile__ ( - "0:\n\t" - "movq %2, %0\n\t" - "movq %0, %%rax\n\t" - "andq %1, %0\n\t" - "lock\n\t" - "cmpxchg %0, %2\n\t" - "jne 0b" - : "=&r"(i) - : "r"(i), "m"(*p) - : "rax", "cc" - ); -#endif - else - abort(); - - return i; -} - -static OF_INLINE uint32_t -of_atomic_int32_and(volatile uint32_t *_Nonnull p, uint32_t i) -{ - __asm__ __volatile__ ( - "0:\n\t" - "movl %2, %0\n\t" - "movl %0, %%eax\n\t" - "andl %1, %0\n\t" - "lock\n\t" - "cmpxchg %0, %2\n\t" - "jne 0b" - : "=&r"(i) - : "r"(i), "m"(*p) - : "eax", "cc" - ); - - return i; -} - -static OF_INLINE unsigned int -of_atomic_int_xor(volatile unsigned int *_Nonnull p, unsigned int i) -{ - if (sizeof(int) == 4) - __asm__ __volatile__ ( - "0:\n\t" - "movl %2, %0\n\t" - "movl %0, %%eax\n\t" - "xorl %1, %0\n\t" - "lock\n\t" - "cmpxchg %0, %2\n\t" - "jne 0b" - : "=&r"(i) - : "r"(i), "m"(*p) - : "eax", "cc" - ); -#ifdef OF_X86_64 - else if (sizeof(int) == 8) - __asm__ __volatile__ ( - "0:\n\t" - "movq %2, %0\n\t" - "movq %0, %%rax\n\t" - "xorq %1, %0\n\t" - "lock\n\t" - "cmpxchg %0, %2\n\t" - "jne 0b" - : "=&r"(i) - : "r"(i), "m"(*p) - : "rax", "cc" - ); -#endif - else - abort(); - - return i; -} - -static OF_INLINE uint32_t -of_atomic_int32_xor(volatile uint32_t *_Nonnull p, uint32_t i) -{ - __asm__ __volatile__ ( - "0:\n\t" - "movl %2, %0\n\t" - "movl %0, %%eax\n\t" - "xorl %1, %0\n\t" - "lock\n\t" - "cmpxchgl %0, %2\n\t" - "jne 0b" - : "=&r"(i) - : "r"(i), "m"(*p) - : "eax", "cc" - ); - - return i; -} - -static OF_INLINE bool -of_atomic_int_cmpswap(volatile int *_Nonnull p, int o, int n) -{ - int r; - - __asm__ __volatile__ ( - "lock\n\t" - "cmpxchg %2, %3\n\t" - "sete %b0\n\t" - "movzbl %b0, %0" - : "=&d"(r), "+a"(o) /* use d instead of r to avoid a gcc bug */ - : "r"(n), "m"(*p) - : "cc" - ); - - return r; -} - -static OF_INLINE bool -of_atomic_int32_cmpswap(volatile int32_t *_Nonnull p, int32_t o, int32_t n) -{ - int r; - - __asm__ __volatile__ ( - "lock\n\t" - "cmpxchg %2, %3\n\t" - "sete %b0\n\t" - "movzbl %b0, %0" - : "=&d"(r), "+a"(o) /* use d instead of r to avoid a gcc bug */ - : "r"(n), "m"(*p) - : "cc" - ); - - return r; -} - -static OF_INLINE bool -of_atomic_ptr_cmpswap(void *volatile _Nullable *_Nonnull p, - void *_Nullable o, void *_Nullable n) -{ - int r; - - __asm__ __volatile__ ( - "lock\n\t" - "cmpxchg %2, %3\n\t" - "sete %b0\n\t" - "movzbl %b0, %0" - : "=&d"(r), "+a"(o) /* use d instead of r to avoid a gcc bug */ - : "r"(n), "m"(*p) - : "cc" - ); - - return r; -} - -static OF_INLINE void -of_memory_barrier(void) -{ - __asm__ __volatile__ ( - "mfence" ::: "memory" - ); -} - -static OF_INLINE void -of_memory_barrier_acquire(void) -{ - __asm__ __volatile__ ("" ::: "memory"); -} - -static OF_INLINE void -of_memory_barrier_release(void) -{ - __asm__ __volatile__ ("" ::: "memory"); -} - -OF_ASSUME_NONNULL_END DELETED src/base64.h Index: src/base64.h ================================================================== --- src/base64.h +++ src/base64.h @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#ifndef __STDC_LIMIT_MACROS -# define __STDC_LIMIT_MACROS -#endif -#ifndef __STDC_CONSTANT_MACROS -# define __STDC_CONSTANT_MACROS -#endif - -#import "macros.h" - -OF_ASSUME_NONNULL_BEGIN - -@class OFString; -@class OFMutableData; - -#ifdef __cplusplus -extern "C" { -#endif -extern OFString *of_base64_encode(const void *, size_t); -extern bool of_base64_decode(OFMutableData *, const char *, size_t); -#ifdef __cplusplus -} -#endif - -OF_ASSUME_NONNULL_END DELETED src/base64.m Index: src/base64.m ================================================================== --- src/base64.m +++ src/base64.m @@ -1,156 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#import "OFString.h" -#import "OFData.h" -#import "base64.h" - -const uint8_t of_base64_encode_table[64] = { - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', - 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', - 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', - 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', - '4', '5', '6', '7', '8', '9', '+', '/' -}; - -const int8_t of_base64_decode_table[128] = { - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, 0, -1, -1, -1, 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, -1, -1, -1, -1, -1, -1, 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, -1, -1, -1, -1, -1 -}; - -OFString * -of_base64_encode(const void *data, size_t length) -{ - OFMutableString *ret = [OFMutableString string]; - uint8_t *buffer = (uint8_t *)data; - size_t i; - uint8_t rest; - char tb[4]; - uint32_t sb; - - rest = length % 3; - - for (i = 0; i < length - rest; i += 3) { - sb = (buffer[i] << 16) | (buffer[i + 1] << 8) | buffer[i + 2]; - - tb[0] = of_base64_encode_table[(sb & 0xFC0000) >> 18]; - tb[1] = of_base64_encode_table[(sb & 0x03F000) >> 12]; - tb[2] = of_base64_encode_table[(sb & 0x000FC0) >> 6]; - tb[3] = of_base64_encode_table[sb & 0x00003F]; - - [ret appendCString: tb - encoding: OF_STRING_ENCODING_ASCII - length: 4]; - } - - switch (rest) { - case 1: - tb[0] = of_base64_encode_table[buffer[i] >> 2]; - tb[1] = of_base64_encode_table[(buffer[i] & 3) << 4]; - tb[2] = tb[3] = '='; - - [ret appendCString: tb - encoding: OF_STRING_ENCODING_ASCII - length: 4]; - - break; - case 2: - sb = (buffer[i] << 16) | (buffer[i + 1] << 8); - - tb[0] = of_base64_encode_table[(sb & 0xFC0000) >> 18]; - tb[1] = of_base64_encode_table[(sb & 0x03F000) >> 12]; - tb[2] = of_base64_encode_table[(sb & 0x000FC0) >> 6]; - tb[3] = '='; - - [ret appendCString: tb - encoding: OF_STRING_ENCODING_ASCII - length: 4]; - - break; - } - - [ret makeImmutable]; - - return ret; -} - -bool -of_base64_decode(OFMutableData *data, const char *string, size_t length) -{ - const uint8_t *buffer = (const uint8_t *)string; - size_t i; - - if ((length & 3) != 0) - return false; - - if (data.itemSize != 1) - return false; - - for (i = 0; i < length; i += 4) { - uint32_t sb = 0; - uint8_t count = 3; - char db[3]; - int8_t tmp; - - if (buffer[i] > 0x7F || buffer[i + 1] > 0x7F || - buffer[i + 2] > 0x7F || buffer[i + 3] > 0x7F) - return false; - - if (buffer[i] == '=' || buffer[i + 1] == '=' || - (buffer[i + 2] == '=' && buffer[i + 3] != '=')) - return false; - - if (buffer[i + 2] == '=') - count--; - if (buffer[i + 3] == '=') - count--; - - if ((tmp = of_base64_decode_table[buffer[i]]) == -1) - return false; - - sb |= tmp << 18; - - if ((tmp = of_base64_decode_table[buffer[i + 1]]) == -1) - return false; - - sb |= tmp << 12; - - if ((tmp = of_base64_decode_table[buffer[i + 2]]) == -1) - return false; - - sb |= tmp << 6; - - if ((tmp = of_base64_decode_table[buffer[i + 3]]) == -1) - return false; - - sb |= tmp; - - db[0] = (sb & 0xFF0000) >> 16; - db[1] = (sb & 0x00FF00) >> 8; - db[2] = sb & 0x0000FF; - - [data addItems: db count: count]; - } - - return true; -} DELETED src/block.h Index: src/block.h ================================================================== --- src/block.h +++ src/block.h @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#ifndef OBJFW_BLOCK_H -#define OBJFW_BLOCK_H - -#include "macros.h" - -OF_ASSUME_NONNULL_BEGIN - -typedef struct of_block_literal_t { -#ifdef __OBJC__ - Class isa; -#else - void *isa; -#endif - int flags; - int reserved; - void (*invoke)(void *block, ...); - struct of_block_descriptor_t { - unsigned long reserved; - unsigned long size; - void (*_Nullable copy_helper)(void *dest, void *src); - void (*_Nullable dispose_helper)(void *src); - const char *signature; - } *descriptor; -} of_block_literal_t; - -#ifdef __cplusplus -extern "C" { -#endif -extern void *_Block_copy(const void *); -extern void _Block_release(const void *); - -# if defined(OF_WINDOWS) && \ - (defined(OF_NO_SHARED) || defined(OF_COMPILING_OBJFW)) -/* - * Clang has implicit declarations for these, but they are dllimport. When - * compiling ObjFW itself or using it as a static library, these need to be - * dllexport. Interestingly, this still works when using it as a shared library. - */ -extern __declspec(dllexport) struct objc_class _NSConcreteStackBlock; -extern __declspec(dllexport) struct objc_class _NSConcreteGlobalBlock; -extern __declspec(dllexport) void _Block_object_assign(void *, const void *, - const int); -extern __declspec(dllexport) void _Block_object_dispose(const void *, - const int); -# endif -#ifdef __cplusplus -} -#endif - -#ifndef Block_copy -# define Block_copy(...) \ - ((__typeof__(__VA_ARGS__))_Block_copy((const void *)(__VA_ARGS__))) -#endif -#ifndef Block_release -# define Block_release(...) _Block_release((const void *)(__VA_ARGS__)) -#endif - -OF_ASSUME_NONNULL_END - -#endif DELETED src/condition.h Index: src/condition.h ================================================================== --- src/condition.h +++ src/condition.h @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "objfw-defs.h" - -#include "platform.h" - -#if !defined(OF_HAVE_THREADS) || \ - (!defined(OF_HAVE_PTHREADS) && !defined(OF_WINDOWS) && !defined(OF_AMIGAOS)) -# error No conditions available! -#endif - -/* For of_time_interval_t */ -#import "OFObject.h" - -#import "mutex.h" - -#if defined(OF_HAVE_PTHREADS) -# include -typedef pthread_cond_t of_condition_t; -#elif defined(OF_WINDOWS) -# include -typedef struct { - HANDLE event; - volatile int count; -} of_condition_t; -#elif defined(OF_AMIGAOS) -# include -typedef struct { - struct of_condition_waiting_task { - struct Task *task; - unsigned char sigBit; - struct of_condition_waiting_task *next; - } *waitingTasks; -} of_condition_t; -#endif - -#ifdef __cplusplus -extern "C" { -#endif -extern int of_condition_new(of_condition_t *condition); -extern int of_condition_signal(of_condition_t *condition); -extern int of_condition_broadcast(of_condition_t *condition); -extern int of_condition_wait(of_condition_t *condition, of_mutex_t *mutex); -extern int of_condition_timed_wait(of_condition_t *condition, - of_mutex_t *mutex, of_time_interval_t timeout); -#ifdef OF_AMIGAOS -extern int of_condition_wait_or_signal(of_condition_t *condition, - of_mutex_t *mutex, ULONG *signalMask); -extern int of_condition_timed_wait_or_signal(of_condition_t *condition, - of_mutex_t *mutex, of_time_interval_t timeout, ULONG *signalMask); -#endif -extern int of_condition_free(of_condition_t *condition); -#ifdef __cplusplus -} -#endif DELETED src/condition.m Index: src/condition.m ================================================================== --- src/condition.m +++ src/condition.m @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#include "platform.h" - -#if defined(OF_HAVE_PTHREADS) -# include "platform/posix/condition.m" -#elif defined(OF_WINDOWS) -# include "platform/windows/condition.m" -#elif defined(OF_AMIGAOS) -# include "platform/amiga/condition.m" -#endif DELETED src/crc16.h Index: src/crc16.h ================================================================== --- src/crc16.h +++ src/crc16.h @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#ifndef __STDC_LIMIT_MACROS -# define __STDC_LIMIT_MACROS -#endif -#ifndef __STDC_CONSTANT_MACROS -# define __STDC_CONSTANT_MACROS -#endif - -#import "macros.h" - -#ifdef __cplusplus -extern "C" { -#endif -extern uint16_t of_crc16(uint16_t crc, const void *_Nonnull bytes, - size_t length); -#ifdef __cplusplus -} -#endif DELETED src/crc16.m Index: src/crc16.m ================================================================== --- src/crc16.m +++ src/crc16.m @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#import "crc16.h" - -#define CRC16_MAGIC 0xA001 - -uint16_t -of_crc16(uint16_t crc, const void *bytes_, size_t length) -{ - const unsigned char *bytes = bytes_; - - for (size_t i = 0; i < length; i++) { - crc ^= bytes[i]; - - for (uint8_t j = 0; j < 8; j++) - crc = (crc >> 1) ^ (CRC16_MAGIC & (~(crc & 1) + 1)); - } - - return crc; -} DELETED src/crc32.h Index: src/crc32.h ================================================================== --- src/crc32.h +++ src/crc32.h @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#ifndef __STDC_LIMIT_MACROS -# define __STDC_LIMIT_MACROS -#endif -#ifndef __STDC_CONSTANT_MACROS -# define __STDC_CONSTANT_MACROS -#endif - -#import "macros.h" - -#ifdef __cplusplus -extern "C" { -#endif -extern uint32_t of_crc32(uint32_t crc, const void *_Nonnull bytes, - size_t length); -#ifdef __cplusplus -} -#endif DELETED src/crc32.m Index: src/crc32.m ================================================================== --- src/crc32.m +++ src/crc32.m @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#import "crc32.h" - -#define CRC32_MAGIC 0xEDB88320 - -uint32_t -of_crc32(uint32_t crc, const void *bytes_, size_t length) -{ - const unsigned char *bytes = bytes_; - - for (size_t i = 0; i < length; i++) { - crc ^= bytes[i]; - - for (uint8_t j = 0; j < 8; j++) - crc = (crc >> 1) ^ (CRC32_MAGIC & (~(crc & 1) + 1)); - } - - return crc; -} Index: src/encodings/codepage-437.m ================================================================== --- src/encodings/codepage-437.m +++ src/encodings/codepage-437.m @@ -17,11 +17,11 @@ #import "OFString.h" #import "common.h" -const of_char16_t of_codepage_437_table[] = { +const OFChar16 OFCodepage437Table[] = { 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, @@ -35,12 +35,12 @@ 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 }; -const size_t of_codepage_437_table_offset = - 256 - (sizeof(of_codepage_437_table) / sizeof(*of_codepage_437_table)); +const size_t OFCodepage437TableOffset = + 256 - (sizeof(OFCodepage437Table) / sizeof(*OFCodepage437Table)); static const unsigned char page0[] = { 0xFF, 0xAD, 0x9B, 0x9C, 0x00, 0x9D, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xAE, 0xAA, 0x00, 0x00, 0x00, 0xF8, 0xF1, 0xFD, 0x00, 0x00, 0xE6, 0x00, 0xFA, @@ -127,15 +127,15 @@ 0xFE }; static const uint8_t page25Start = 0x00; bool -of_unicode_to_codepage_437(const of_unichar_t *input, unsigned char *output, +OFUnicodeToCodepage437(const OFUnichar *input, unsigned char *output, size_t length, bool lossy) { for (size_t i = 0; i < length; i++) { - of_unichar_t c = input[i]; + OFUnichar c = input[i]; if OF_UNLIKELY (c > 0x7F) { uint8_t idx; if OF_UNLIKELY (c > 0xFFFF) { Index: src/encodings/codepage-850.m ================================================================== --- src/encodings/codepage-850.m +++ src/encodings/codepage-850.m @@ -17,11 +17,11 @@ #import "OFString.h" #import "common.h" -const of_char16_t of_codepage_850_table[] = { +const OFChar16 OFCodepage850Table[] = { 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192, 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, @@ -35,12 +35,12 @@ 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4, 0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 }; -const size_t of_codepage_850_table_offset = - 256 - (sizeof(of_codepage_850_table) / sizeof(*of_codepage_850_table)); +const size_t OFCodepage850TableOffset = + 256 - (sizeof(OFCodepage850Table) / sizeof(*OFCodepage850Table)); static const unsigned char page0[] = { 0xFF, 0xAD, 0xBD, 0x9C, 0xCF, 0xBE, 0xDD, 0xF5, 0xF9, 0xB8, 0xA6, 0xAE, 0xAA, 0xF0, 0xA9, 0xEE, @@ -103,15 +103,15 @@ 0xFE }; static const uint8_t page25Start = 0x00; bool -of_unicode_to_codepage_850(const of_unichar_t *input, unsigned char *output, +OFUnicodeToCodepage850(const OFUnichar *input, unsigned char *output, size_t length, bool lossy) { for (size_t i = 0; i < length; i++) { - of_unichar_t c = input[i]; + OFUnichar c = input[i]; if OF_UNLIKELY (c > 0x7F) { uint8_t idx; if OF_UNLIKELY (c > 0xFFFF) { Index: src/encodings/codepage-858.m ================================================================== --- src/encodings/codepage-858.m +++ src/encodings/codepage-858.m @@ -17,11 +17,11 @@ #import "OFString.h" #import "common.h" -const of_char16_t of_codepage_858_table[] = { +const OFChar16 OFCodepage858Table[] = { 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192, 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, @@ -35,12 +35,12 @@ 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4, 0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 }; -const size_t of_codepage_858_table_offset = - 256 - (sizeof(of_codepage_858_table) / sizeof(*of_codepage_858_table)); +const size_t OFCodepage858TableOffset = + 256 - (sizeof(OFCodepage858Table) / sizeof(*OFCodepage858Table)); static const unsigned char page0[] = { 0xFF, 0xAD, 0xBD, 0x9C, 0xCF, 0xBE, 0xDD, 0xF5, 0xF9, 0xB8, 0xA6, 0xAE, 0xAA, 0xF0, 0xA9, 0xEE, @@ -109,15 +109,15 @@ 0xFE }; static const uint8_t page25Start = 0x00; bool -of_unicode_to_codepage_858(const of_unichar_t *input, unsigned char *output, +OFUnicodeToCodepage858(const OFUnichar *input, unsigned char *output, size_t length, bool lossy) { for (size_t i = 0; i < length; i++) { - of_unichar_t c = input[i]; + OFUnichar c = input[i]; if OF_UNLIKELY (c > 0x7F) { uint8_t idx; if OF_UNLIKELY (c > 0xFFFF) { Index: src/encodings/iso-8859-15.m ================================================================== --- src/encodings/iso-8859-15.m +++ src/encodings/iso-8859-15.m @@ -17,11 +17,11 @@ #import "OFString.h" #import "common.h" -const of_char16_t of_iso_8859_15_table[] = { +const OFChar16 OFISO8859_15Table[] = { 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AC, 0x00A5, 0x0160, 0x00A7, 0x0161, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x017D, 0x00B5, 0x00B6, 0x00B7, 0x017E, 0x00B9, 0x00BA, 0x00BB, 0x0152, 0x0153, 0x0178, 0x00BF, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, @@ -31,12 +31,12 @@ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF }; -const size_t of_iso_8859_15_table_offset = - 256 - (sizeof(of_iso_8859_15_table) / sizeof(*of_iso_8859_15_table)); +const size_t OFISO8859_15TableOffset = + 256 - (sizeof(OFISO8859_15Table) / sizeof(*OFISO8859_15Table)); static const unsigned char page0[] = { 0x00, 0xA5, 0x00, 0xA7, 0x00, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0x00, 0xB5, 0xB6, 0xB7, 0x00, 0xB9, 0xBA, 0xBB, @@ -58,15 +58,15 @@ 0xA4 }; static const uint8_t page20Start = 0xAC; bool -of_unicode_to_iso_8859_15(const of_unichar_t *input, unsigned char *output, +OFUnicodeToISO8859_15(const OFUnichar *input, unsigned char *output, size_t length, bool lossy) { for (size_t i = 0; i < length; i++) { - of_unichar_t c = input[i]; + OFUnichar c = input[i]; if OF_UNLIKELY (c > 0x7F) { uint8_t idx; if OF_UNLIKELY (c > 0xFFFF) { Index: src/encodings/iso-8859-2.m ================================================================== --- src/encodings/iso-8859-2.m +++ src/encodings/iso-8859-2.m @@ -17,11 +17,11 @@ #import "OFString.h" #import "common.h" -const of_char16_t of_iso_8859_2_table[] = { +const OFChar16 OFISO8859_2Table[] = { 0x00A0, 0x0104, 0x02D8, 0x0141, 0x00A4, 0x013D, 0x015A, 0x00A7, 0x00A8, 0x0160, 0x015E, 0x0164, 0x0179, 0x00AD, 0x017D, 0x017B, 0x00B0, 0x0105, 0x02DB, 0x0142, 0x00B4, 0x013E, 0x015B, 0x02C7, 0x00B8, 0x0161, 0x015F, 0x0165, 0x017A, 0x02DD, 0x017E, 0x017C, 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, @@ -31,12 +31,12 @@ 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F, 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9 }; -const size_t of_iso_8859_2_table_offset = - 256 - (sizeof(of_iso_8859_2_table) / sizeof(*of_iso_8859_2_table)); +const size_t OFISO8859_2TableOffset = + 256 - (sizeof(OFISO8859_2Table) / sizeof(*OFISO8859_2Table)); static const unsigned char page0[] = { 0xA0, 0x00, 0x00, 0x00, 0xA4, 0x00, 0x00, 0xA7, 0xA8, 0x00, 0x00, 0x00, 0x00, 0xAD, 0x00, 0x00, 0xB0, 0x00, 0x00, 0x00, 0xB4, 0x00, 0x00, 0x00, @@ -78,15 +78,15 @@ 0x00, 0xA2, 0xFF, 0x00, 0xB2, 0x00, 0xBD }; static const uint8_t page2Start = 0xC7; bool -of_unicode_to_iso_8859_2(const of_unichar_t *input, unsigned char *output, +OFUnicodeToISO8859_2(const OFUnichar *input, unsigned char *output, size_t length, bool lossy) { for (size_t i = 0; i < length; i++) { - of_unichar_t c = input[i]; + OFUnichar c = input[i]; if OF_UNLIKELY (c > 0x7F) { uint8_t idx; if OF_UNLIKELY (c > 0xFFFF) { Index: src/encodings/iso-8859-3.m ================================================================== --- src/encodings/iso-8859-3.m +++ src/encodings/iso-8859-3.m @@ -17,11 +17,11 @@ #import "OFString.h" #import "common.h" -const of_char16_t of_iso_8859_3_table[] = { +const OFChar16 OFISO8859_3Table[] = { 0x00A0, 0x0126, 0x02D8, 0x00A3, 0x00A4, 0xFFFF, 0x0124, 0x00A7, 0x00A8, 0x0130, 0x015E, 0x011E, 0x0134, 0x00AD, 0xFFFF, 0x017B, 0x00B0, 0x0127, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x0125, 0x00B7, 0x00B8, 0x0131, 0x015F, 0x011F, 0x0135, 0x00BD, 0xFFFF, 0x017C, 0x00C0, 0x00C1, 0x00C2, 0xFFFF, 0x00C4, 0x010A, 0x0108, 0x00C7, @@ -31,12 +31,12 @@ 0x00E0, 0x00E1, 0x00E2, 0xFFFF, 0x00E4, 0x010B, 0x0109, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0xFFFF, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x0121, 0x00F6, 0x00F7, 0x011D, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x016D, 0x015D, 0x02D9 }; -const size_t of_iso_8859_3_table_offset = - 256 - (sizeof(of_iso_8859_3_table) / sizeof(*of_iso_8859_3_table)); +const size_t OFISO8859_3TableOffset = + 256 - (sizeof(OFISO8859_3Table) / sizeof(*OFISO8859_3Table)); static const unsigned char page0[] = { 0xA0, 0x00, 0x00, 0xA3, 0xA4, 0x00, 0x00, 0xA7, 0xA8, 0x00, 0x00, 0x00, 0x00, 0xAD, 0x00, 0x00, 0xB0, 0x00, 0xB2, 0xB3, 0xB4, 0xB5, 0x00, 0xB7, @@ -75,15 +75,15 @@ 0xA2, 0xFF }; static const uint8_t page2Start = 0xD8; bool -of_unicode_to_iso_8859_3(const of_unichar_t *input, unsigned char *output, +OFUnicodeToISO8859_3(const OFUnichar *input, unsigned char *output, size_t length, bool lossy) { for (size_t i = 0; i < length; i++) { - of_unichar_t c = input[i]; + OFUnichar c = input[i]; if OF_UNLIKELY (c > 0x7F) { uint8_t idx; if OF_UNLIKELY (c > 0xFFFF) { Index: src/encodings/koi8-r.m ================================================================== --- src/encodings/koi8-r.m +++ src/encodings/koi8-r.m @@ -17,11 +17,11 @@ #import "OFString.h" #import "common.h" -const of_char16_t of_koi8_r_table[] = { +const OFChar16 OFKOI8RTable[] = { 0x2500, 0x2502, 0x250C, 0x2510, 0x2514, 0x2518, 0x251C, 0x2524, 0x252C, 0x2534, 0x253C, 0x2580, 0x2584, 0x2588, 0x258C, 0x2590, 0x2591, 0x2592, 0x2593, 0x2320, 0x25A0, 0x2219, 0x221A, 0x2248, 0x2264, 0x2265, 0x00A0, 0x2321, 0x00B0, 0x00B2, 0x00B7, 0x00F7, 0x2550, 0x2551, 0x2552, 0x0451, 0x2553, 0x2554, 0x2555, 0x2556, @@ -35,12 +35,12 @@ 0x042E, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, 0x0425, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x042F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, 0x042C, 0x042B, 0x0417, 0x0428, 0x042D, 0x0429, 0x0427, 0x042A }; -const size_t of_koi8_r_table_offset = - 256 - (sizeof(of_koi8_r_table) / sizeof(*of_koi8_r_table)); +const size_t OFKOI8RTableOffset = + 256 - (sizeof(OFKOI8RTable) / sizeof(*OFKOI8RTable)); static const unsigned char page0[] = { 0x9A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9C, 0x00, 0x9D, 0x00, 0x00, 0x00, 0x00, 0x9E, @@ -113,15 +113,15 @@ 0x94 }; static const uint8_t page25Start = 0x00; bool -of_unicode_to_koi8_r(const of_unichar_t *input, unsigned char *output, - size_t length, bool lossy) +OFUnicodeToKOI8R(const OFUnichar *input, unsigned char *output, size_t length, + bool lossy) { for (size_t i = 0; i < length; i++) { - of_unichar_t c = input[i]; + OFUnichar c = input[i]; if OF_UNLIKELY (c > 0x7F) { uint8_t idx; if OF_UNLIKELY (c > 0xFFFF) { Index: src/encodings/koi8-u.m ================================================================== --- src/encodings/koi8-u.m +++ src/encodings/koi8-u.m @@ -17,11 +17,11 @@ #import "OFString.h" #import "common.h" -const of_char16_t of_koi8_u_table[] = { +const OFChar16 OFKOI8UTable[] = { 0x2500, 0x2502, 0x250C, 0x2510, 0x2514, 0x2518, 0x251C, 0x2524, 0x252C, 0x2534, 0x253C, 0x2580, 0x2584, 0x2588, 0x258C, 0x2590, 0x2591, 0x2592, 0x2593, 0x2320, 0x25A0, 0x2219, 0x221A, 0x2248, 0x2264, 0x2265, 0x00A0, 0x2321, 0x00B0, 0x00B2, 0x00B7, 0x00F7, 0x2550, 0x2551, 0x2552, 0x0451, 0x0454, 0x2554, 0x0456, 0x0457, @@ -35,12 +35,12 @@ 0x042E, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, 0x0425, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x042F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, 0x042C, 0x042B, 0x0417, 0x0428, 0x042D, 0x0429, 0x0427, 0x042A }; -const size_t of_koi8_u_table_offset = - 256 - (sizeof(of_koi8_u_table) / sizeof(*of_koi8_u_table)); +const size_t OFKOI8UTableOffset = + 256 - (sizeof(OFKOI8UTable) / sizeof(*OFKOI8UTable)); static const unsigned char page0[] = { 0x9A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9C, 0x00, 0x9D, 0x00, 0x00, 0x00, 0x00, 0x9E, @@ -121,15 +121,15 @@ 0x94 }; static const uint8_t page25Start = 0x00; bool -of_unicode_to_koi8_u(const of_unichar_t *input, unsigned char *output, - size_t length, bool lossy) +OFUnicodeToKOI8U(const OFUnichar *input, unsigned char *output, size_t length, + bool lossy) { for (size_t i = 0; i < length; i++) { - of_unichar_t c = input[i]; + OFUnichar c = input[i]; if OF_UNLIKELY (c > 0x7F) { uint8_t idx; if OF_UNLIKELY (c > 0xFFFF) { Index: src/encodings/mac-roman.m ================================================================== --- src/encodings/mac-roman.m +++ src/encodings/mac-roman.m @@ -17,11 +17,11 @@ #import "OFString.h" #import "common.h" -const of_char16_t of_mac_roman_table[] = { +const OFChar16 OFMacRomanTable[] = { 0x00C4, 0x00C5, 0x00C7, 0x00C9, 0x00D1, 0x00D6, 0x00DC, 0x00E1, 0x00E0, 0x00E2, 0x00E4, 0x00E3, 0x00E5, 0x00E7, 0x00E9, 0x00E8, 0x00EA, 0x00EB, 0x00ED, 0x00EC, 0x00EE, 0x00EF, 0x00F1, 0x00F3, 0x00F2, 0x00F4, 0x00F6, 0x00F5, 0x00FA, 0x00F9, 0x00FB, 0x00FC, 0x2020, 0x00B0, 0x00A2, 0x00A3, 0x00A7, 0x2022, 0x00B6, 0x00DF, @@ -35,12 +35,12 @@ 0x2021, 0x00B7, 0x201A, 0x201E, 0x2030, 0x00C2, 0x00CA, 0x00C1, 0x00CB, 0x00C8, 0x00CD, 0x00CE, 0x00CF, 0x00CC, 0x00D3, 0x00D4, 0xF8FF, 0x00D2, 0x00DA, 0x00DB, 0x00D9, 0x0131, 0x02C6, 0x02DC, 0x00AF, 0x02D8, 0x02D9, 0x02DA, 0x00B8, 0x02DD, 0x02DB, 0x02C7 }; -const size_t of_mac_roman_table_offset = - 256 - (sizeof(of_mac_roman_table) / sizeof(*of_mac_roman_table)); +const size_t OFMacRomanTableOffset = + 256 - (sizeof(OFMacRomanTable) / sizeof(*OFMacRomanTable)); static const unsigned char page0[] = { 0xCA, 0xC1, 0xA2, 0xA3, 0x00, 0xB4, 0x00, 0xA4, 0xAC, 0xA9, 0xBB, 0xC7, 0xC2, 0x00, 0xA8, 0xF8, 0xA1, 0xB1, 0x00, 0x00, 0xAB, 0xB5, 0xA6, 0xE1, @@ -147,15 +147,15 @@ 0xDE, 0xDF }; static const uint8_t pageFBStart = 0x01; bool -of_unicode_to_mac_roman(const of_unichar_t *input, unsigned char *output, +OFUnicodeToMacRoman(const OFUnichar *input, unsigned char *output, size_t length, bool lossy) { for (size_t i = 0; i < length; i++) { - of_unichar_t c = input[i]; + OFUnichar c = input[i]; if OF_UNLIKELY (c > 0x7F) { uint8_t idx; if OF_UNLIKELY (c > 0xFFFF) { Index: src/encodings/windows-1251.m ================================================================== --- src/encodings/windows-1251.m +++ src/encodings/windows-1251.m @@ -17,11 +17,11 @@ #import "OFString.h" #import "common.h" -const of_char16_t of_windows_1251_table[] = { +const OFChar16 OFWindows1251Table[] = { 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021, 0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F, 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0xFFFF, 0x2122, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F, 0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7, @@ -35,12 +35,12 @@ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F }; -const size_t of_windows_1251_table_offset = - 256 - (sizeof(of_windows_1251_table) / sizeof(*of_windows_1251_table)); +const size_t OFWindows1251TableOffset = + 256 - (sizeof(OFWindows1251Table) / sizeof(*OFWindows1251Table)); static const unsigned char page0[] = { 0xA0, 0x00, 0x00, 0x00, 0xA4, 0x00, 0xA6, 0xA7, 0x00, 0xA9, 0x00, 0xAB, 0xAC, 0xAD, 0xAE, 0x00, 0xB0, 0xB1, 0x00, 0x00, 0x00, 0xB5, 0xB6, 0xB7, @@ -100,15 +100,15 @@ 0x00, 0x00, 0x00, 0x00, 0x99 }; static const uint8_t page21Start = 0x16; bool -of_unicode_to_windows_1251(const of_unichar_t *input, unsigned char *output, +OFUnicodeToWindows1251(const OFUnichar *input, unsigned char *output, size_t length, bool lossy) { for (size_t i = 0; i < length; i++) { - of_unichar_t c = input[i]; + OFUnichar c = input[i]; if OF_UNLIKELY (c > 0x7F) { uint8_t idx; if OF_UNLIKELY (c > 0xFFFF) { Index: src/encodings/windows-1252.m ================================================================== --- src/encodings/windows-1252.m +++ src/encodings/windows-1252.m @@ -17,11 +17,11 @@ #import "OFString.h" #import "common.h" -const of_char16_t of_windows_1252_table[] = { +const OFChar16 OFWindows1252Table[] = { 0x20AC, 0xFFFF, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0xFFFF, 0x017D, 0xFFFF, 0xFFFF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0xFFFF, 0x017E, 0x0178, 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, @@ -35,12 +35,12 @@ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF }; -const size_t of_windows_1252_table_offset = - 256 - (sizeof(of_windows_1252_table) / sizeof(*of_windows_1252_table)); +const size_t OFWindows1252TableOffset = + 256 - (sizeof(OFWindows1252Table) / sizeof(*OFWindows1252Table)); static const unsigned char page0[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -96,15 +96,15 @@ 0x99 }; static const uint8_t page21Start = 0x22; bool -of_unicode_to_windows_1252(const of_unichar_t *input, unsigned char *output, +OFUnicodeToWindows1252(const OFUnichar *input, unsigned char *output, size_t length, bool lossy) { for (size_t i = 0; i < length; i++) { - of_unichar_t c = input[i]; + OFUnichar c = input[i]; if OF_UNLIKELY (c > 0x7F) { uint8_t idx; if OF_UNLIKELY (c > 0xFFFF) { Index: src/exceptions/Makefile ================================================================== --- src/exceptions/Makefile +++ src/exceptions/Makefile @@ -31,11 +31,10 @@ OFOutOfRangeException.m \ OFReadFailedException.m \ OFReadOrWriteFailedException.m \ OFRemoveItemFailedException.m \ OFRetrieveItemAttributesFailedException.m \ - OFSandboxActivationFailedException.m \ OFSeekFailedException.m \ OFSetItemAttributesFailedException.m \ OFSetOptionFailedException.m \ OFStillLockedException.m \ OFTruncatedDataException.m \ @@ -75,10 +74,12 @@ OFDeleteWindowsRegistryValueFailedException.m \ OFGetWindowsRegistryValueFailedException.m \ OFOpenWindowsRegistryKeyFailedException.m \ OFSetWindowsRegistryValueFailedException.m -INCLUDES = ${SRCS:.m=.h} +INCLUDES := ${SRCS:.m=.h} + +SRCS += OFSandboxActivationFailedException.m include ../../buildsys.mk CPPFLAGS += -I. -I.. -I../.. -I../runtime Index: src/exceptions/OFAcceptFailedException.m ================================================================== --- src/exceptions/OFAcceptFailedException.m +++ src/exceptions/OFAcceptFailedException.m @@ -55,8 +55,8 @@ - (OFString *)description { return [OFString stringWithFormat: @"Failed to accept connection in socket of class %@: %@", - [_socket class], of_strerror(_errNo)]; + [_socket class], OFStrError(_errNo)]; } @end Index: src/exceptions/OFAllocFailedException.m ================================================================== --- src/exceptions/OFAllocFailedException.m +++ src/exceptions/OFAllocFailedException.m @@ -44,11 +44,11 @@ return self; } - (unsigned int)retainCount { - return OF_RETAIN_COUNT_MAX; + return OFMaxRetainCount; } - (void)release { } Index: src/exceptions/OFBindFailedException.h ================================================================== --- src/exceptions/OFBindFailedException.h +++ src/exceptions/OFBindFailedException.h @@ -17,11 +17,11 @@ #ifndef OF_HAVE_SOCKETS # error No sockets available! #endif -#import "socket.h" +#import "OFSocket.h" OF_ASSUME_NONNULL_BEGIN /** * @class OFBindFailedException \ Index: src/exceptions/OFBindFailedException.m ================================================================== --- src/exceptions/OFBindFailedException.m +++ src/exceptions/OFBindFailedException.m @@ -106,13 +106,13 @@ { if (_host != nil) return [OFString stringWithFormat: @"Binding to port %" @PRIu16 @" on host %@ failed in " @"socket of type %@: %@", - _port, _host, [_socket class], of_strerror(_errNo)]; + _port, _host, [_socket class], OFStrError(_errNo)]; else return [OFString stringWithFormat: @"Binding to port %" @PRIx16 @" for packet type %" @PRIx8 @" failed in socket of type %@: %@", - _port, _packetType, [_socket class], of_strerror(_errNo)]; + _port, _packetType, [_socket class], OFStrError(_errNo)]; } @end Index: src/exceptions/OFChangeCurrentDirectoryPathFailedException.m ================================================================== --- src/exceptions/OFChangeCurrentDirectoryPathFailedException.m +++ src/exceptions/OFChangeCurrentDirectoryPathFailedException.m @@ -60,8 +60,8 @@ - (OFString *)description { return [OFString stringWithFormat: @"Failed to change the current directory path to %@: %@", - _path, of_strerror(_errNo)]; + _path, OFStrError(_errNo)]; } @end Index: src/exceptions/OFConnectionFailedException.h ================================================================== --- src/exceptions/OFConnectionFailedException.h +++ src/exceptions/OFConnectionFailedException.h @@ -17,11 +17,11 @@ #ifndef OF_HAVE_SOCKETS # error No sockets available! #endif -#import "socket.h" +#import "OFSocket.h" OF_ASSUME_NONNULL_BEGIN /** * @class OFConnectionFailedException \ Index: src/exceptions/OFConnectionFailedException.m ================================================================== --- src/exceptions/OFConnectionFailedException.m +++ src/exceptions/OFConnectionFailedException.m @@ -115,20 +115,20 @@ { if (_host != nil) return [OFString stringWithFormat: @"A connection to %@ on port %" @PRIu16 @" could not be " @"established in socket of type %@: %@", - _host, _port, [_socket class], of_strerror(_errNo)]; + _host, _port, [_socket class], OFStrError(_errNo)]; else if (memcmp(_node, "\0\0\0\0\0", IPX_NODE_LEN) == 0) return [OFString stringWithFormat: @"A connection to %02X%02X%02X%02X%02X%02X port %" @PRIu16 @" on network %" @PRIX32 " could not be established in " @"socket of type %@: %@", _node[0], _node[1], _node[2], _node[3], _node[4], _node[5], - _port, _network, [_socket class], of_strerror(_errNo)]; + _port, _network, [_socket class], OFStrError(_errNo)]; else return [OFString stringWithFormat: @"A connection could not be established in socket of " @"type %@: %@", - [_socket class], of_strerror(_errNo)]; + [_socket class], OFStrError(_errNo)]; } @end Index: src/exceptions/OFCopyItemFailedException.m ================================================================== --- src/exceptions/OFCopyItemFailedException.m +++ src/exceptions/OFCopyItemFailedException.m @@ -69,8 +69,8 @@ } - (OFString *)description { return [OFString stringWithFormat: @"Failed to copy item %@ to %@: %@", - _sourceURL, _destinationURL, of_strerror(_errNo)]; + _sourceURL, _destinationURL, OFStrError(_errNo)]; } @end Index: src/exceptions/OFCreateDirectoryFailedException.m ================================================================== --- src/exceptions/OFCreateDirectoryFailedException.m +++ src/exceptions/OFCreateDirectoryFailedException.m @@ -60,8 +60,8 @@ } - (OFString *)description { return [OFString stringWithFormat: - @"Failed to create directory %@: %@", _URL, of_strerror(_errNo)]; + @"Failed to create directory %@: %@", _URL, OFStrError(_errNo)]; } @end Index: src/exceptions/OFCreateSymbolicLinkFailedException.m ================================================================== --- src/exceptions/OFCreateSymbolicLinkFailedException.m +++ src/exceptions/OFCreateSymbolicLinkFailedException.m @@ -69,8 +69,8 @@ - (OFString *)description { return [OFString stringWithFormat: @"Failed to create symbolic link %@ with target %@: %@", - _URL, _target, of_strerror(_errNo)]; + _URL, _target, OFStrError(_errNo)]; } @end Index: src/exceptions/OFCreateWindowsRegistryKeyFailedException.m ================================================================== --- src/exceptions/OFCreateWindowsRegistryKeyFailedException.m +++ src/exceptions/OFCreateWindowsRegistryKeyFailedException.m @@ -78,8 +78,8 @@ - (OFString *)description { return [OFString stringWithFormat: @"Failed to create subkey at path %@: %@", - _path, of_windows_status_to_string(_status)]; + _path, OFWindowsStatusToString(_status)]; } @end Index: src/exceptions/OFDNSQueryFailedException.h ================================================================== --- src/exceptions/OFDNSQueryFailedException.h +++ src/exceptions/OFDNSQueryFailedException.h @@ -27,48 +27,49 @@ * @brief An exception indicating that a DNS query failed. */ @interface OFDNSQueryFailedException: OFException { OFDNSQuery *_query; - of_dns_resolver_error_t _error; + OFDNSResolverErrorCode _errorCode; } /** * @brief The query which could not be performed. */ @property (readonly, nonatomic) OFDNSQuery *query; /** - * @brief The error from the resolver. + * @brief The error code from the resolver. */ -@property (readonly, nonatomic) of_dns_resolver_error_t error; +@property (readonly, nonatomic) OFDNSResolverErrorCode errorCode; /** * @brief Creates a new, autoreleased DNS query failed exception. * * @param query The query which could not be performed - * @param error The error from the resolver + * @param errorCode The error from the resolver * @return A new, autoreleased address translation failed exception */ + (instancetype)exceptionWithQuery: (OFDNSQuery *)query - error: (of_dns_resolver_error_t)error; + errorCode: (OFDNSResolverErrorCode)errorCode; /** * @brief Initializes an already allocated DNS query failed exception. * * @param query The query which could not be performed - * @param error The error from the resolver + * @param errorCode The error from the resolver * @return An initialized address translation failed exception */ - (instancetype)initWithQuery: (OFDNSQuery *)query - error: (of_dns_resolver_error_t)error; + errorCode: (OFDNSResolverErrorCode)errorCode; @end #ifdef __cplusplus extern "C" { #endif -extern OFString *of_dns_resolver_error_to_string(of_dns_resolver_error_t error); +extern OFString *OFDNSResolverErrorCodeDescription( + OFDNSResolverErrorCode errorCode); #ifdef __cplusplus } #endif OF_ASSUME_NONNULL_END Index: src/exceptions/OFDNSQueryFailedException.m ================================================================== --- src/exceptions/OFDNSQueryFailedException.m +++ src/exceptions/OFDNSQueryFailedException.m @@ -17,57 +17,58 @@ #import "OFDNSQueryFailedException.h" #import "OFString.h" OFString * -of_dns_resolver_error_to_string(of_dns_resolver_error_t error) +OFDNSResolverErrorCodeDescription(OFDNSResolverErrorCode errorCode) { - switch (error) { - case OF_DNS_RESOLVER_ERROR_TIMEOUT: + switch (errorCode) { + case OFDNSResolverErrorCodeTimeout: return @"The query timed out."; - case OF_DNS_RESOLVER_ERROR_CANCELED: + case OFDNSResolverErrorCodeCanceled: return @"The query was canceled."; - case OF_DNS_RESOLVER_ERROR_NO_RESULT: + case OFDNSResolverErrorCodeNoResult: return @"No result for the specified host with the specified " @"type and class."; - case OF_DNS_RESOLVER_ERROR_SERVER_INVALID_FORMAT: + case OFDNSResolverErrorCodeServerInvalidFormat: return @"The server considered the query to be malformed."; - case OF_DNS_RESOLVER_ERROR_SERVER_FAILURE: + case OFDNSResolverErrorCodeServerFailure: return @"The server was unable to process due to an internal " @"error."; - case OF_DNS_RESOLVER_ERROR_SERVER_NAME_ERROR: + case OFDNSResolverErrorCodeServerNameError: return @"The server returned an error that the domain does not " @"exist."; - case OF_DNS_RESOLVER_ERROR_SERVER_NOT_IMPLEMENTED: + case OFDNSResolverErrorCodeServerNotImplemented: return @"The server does not have support for the requested " @"query."; - case OF_DNS_RESOLVER_ERROR_SERVER_REFUSED: + case OFDNSResolverErrorCodeServerRefused: return @"The server refused the query."; - case OF_DNS_RESOLVER_ERROR_NO_NAME_SERVER: + case OFDNSResolverErrorCodeNoNameServer: return @"There was no name server to query."; default: return @"Unknown error."; } } @implementation OFDNSQueryFailedException -@synthesize query = _query, error = _error; +@synthesize query = _query, errorCode = _errorCode; + (instancetype)exceptionWithQuery: (OFDNSQuery *)query - error: (of_dns_resolver_error_t)error + errorCode: (OFDNSResolverErrorCode)errorCode { - return [[[self alloc] initWithQuery: query error: error] autorelease]; + return [[[self alloc] initWithQuery: query + errorCode: errorCode] autorelease]; } - (instancetype)initWithQuery: (OFDNSQuery *)query - error: (of_dns_resolver_error_t)error + errorCode: (OFDNSResolverErrorCode)errorCode { self = [super init]; @try { _query = [query copy]; - _error = error; + _errorCode = errorCode; } @catch (id e) { [self release]; @throw e; } @@ -83,8 +84,8 @@ - (OFString *)description { return [OFString stringWithFormat: @"DNS query %@ could not be performed: %@", - _query, of_dns_resolver_error_to_string(_error)]; + _query, OFDNSResolverErrorCodeDescription(_errorCode)]; } @end Index: src/exceptions/OFDeleteWindowsRegistryKeyFailedException.m ================================================================== --- src/exceptions/OFDeleteWindowsRegistryKeyFailedException.m +++ src/exceptions/OFDeleteWindowsRegistryKeyFailedException.m @@ -65,8 +65,8 @@ - (OFString *)description { return [OFString stringWithFormat: @"Failed to delete subkey at path %@: %@", - _subkeyPath, of_windows_status_to_string(_status)]; + _subkeyPath, OFWindowsStatusToString(_status)]; } @end Index: src/exceptions/OFDeleteWindowsRegistryValueFailedException.m ================================================================== --- src/exceptions/OFDeleteWindowsRegistryValueFailedException.m +++ src/exceptions/OFDeleteWindowsRegistryValueFailedException.m @@ -65,8 +65,8 @@ - (OFString *)description { return [OFString stringWithFormat: @"Failed to delete value named %@: %@", - _valueName, of_windows_status_to_string(_status)]; + _valueName, OFWindowsStatusToString(_status)]; } @end Index: src/exceptions/OFException.h ================================================================== --- src/exceptions/OFException.h +++ src/exceptions/OFException.h @@ -23,11 +23,11 @@ @class OFArray OF_GENERIC(ObjectType); @class OFMutableArray OF_GENERIC(ObjectType); @class OFString; -#define OF_BACKTRACE_SIZE 16 +#define OFBacktraceSize 16 #if defined(OF_WINDOWS) && defined(OF_HAVE_SOCKETS) # ifndef EADDRINUSE # define EADDRINUSE WSAEADDRINUSE # endif @@ -143,11 +143,11 @@ * The OFException class is the base class for all exceptions in ObjFW, except * the OFAllocFailedException. */ @interface OFException: OFObject { - void *_backtrace[OF_BACKTRACE_SIZE]; + void *_backtrace[OFBacktraceSize]; } /** * @brief Creates a new, autoreleased exception. * @@ -172,14 +172,14 @@ @end #ifdef __cplusplus extern "C" { #endif -extern OFString *of_strerror(int errNo); +extern OFString *OFStrError(int errNo); #ifdef OF_WINDOWS -extern OFString *of_windows_status_to_string(LSTATUS status); +extern OFString *OFWindowsStatusToString(LSTATUS status); #endif #ifdef __cplusplus } #endif OF_ASSUME_NONNULL_END Index: src/exceptions/OFException.m ================================================================== --- src/exceptions/OFException.m +++ src/exceptions/OFException.m @@ -25,21 +25,20 @@ #endif #import "OFException.h" #import "OFArray.h" #import "OFLocale.h" +#ifdef OF_HAVE_THREADS +# import "OFPlainMutex.h" +#endif #import "OFString.h" #import "OFSystemInfo.h" #import "OFInitializationFailedException.h" #import "OFLockFailedException.h" #import "OFUnlockFailedException.h" -#ifdef OF_HAVE_THREADS -# import "mutex.h" -#endif - #if defined(OF_WINDOWS) && defined(OF_HAVE_SOCKETS) # include #endif #if defined(OF_ARM) && !defined(__ARM_DWARF_EH__) @@ -48,13 +47,13 @@ struct _Unwind_Context; typedef enum { _URC_OK = 0, _URC_END_OF_STACK = 5 -}_Unwind_Reason_Code; +} _Unwind_Reason_Code; -struct backtrace_ctx { +struct BacktraceCtx { void **backtrace; uint8_t i; }; #ifdef HAVE__UNWIND_BACKTRACE @@ -67,25 +66,25 @@ extern int _Unwind_VRS_Get(struct _Unwind_Context *, int, uint32_t, int, void *); #endif #if !defined(HAVE_STRERROR_R) && defined(OF_HAVE_THREADS) -static of_mutex_t mutex; +static OFPlainMutex mutex; OF_CONSTRUCTOR() { - OF_ENSURE(of_mutex_new(&mutex) == 0); + OFEnsure(OFPlainMutexNew(&mutex) == 0); } OF_DESTRUCTOR() { - of_mutex_free(&mutex); + OFPlainMutexFree(&mutex); } #endif OFString * -of_strerror(int errNo) +OFStrError(int errNo) { OFString *ret; #ifdef HAVE_STRERROR_R char buffer[256]; #endif @@ -189,21 +188,21 @@ ret = [OFString stringWithCString: buffer encoding: [OFLocale encoding]]; #else # ifdef OF_HAVE_THREADS - if (of_mutex_lock(&mutex) != 0) + if (OFPlainMutexLock(&mutex) != 0) @throw [OFLockFailedException exception]; @try { # endif ret = [OFString stringWithCString: strerror(errNo) encoding: [OFLocale encoding]]; # ifdef OF_HAVE_THREADS } @finally { - if (of_mutex_unlock(&mutex) != 0) + if (OFPlainMutexUnlock(&mutex) != 0) @throw [OFUnlockFailedException exception]; } # endif #endif @@ -210,11 +209,11 @@ return ret; } #ifdef OF_WINDOWS OFString * -of_windows_status_to_string(LSTATUS status) +OFWindowsStatusToString(LSTATUS status) { OFString *string = nil; void *buffer; if ([OFSystemInfo isWindowsNT]) { @@ -253,15 +252,15 @@ } #endif #ifdef HAVE__UNWIND_BACKTRACE static _Unwind_Reason_Code -backtrace_callback(struct _Unwind_Context *ctx, void *data) +backtraceCallback(struct _Unwind_Context *ctx, void *data) { - struct backtrace_ctx *bt = data; + struct BacktraceCtx *bt = data; - if (bt->i < OF_BACKTRACE_SIZE) { + if (bt->i < OFBacktraceSize) { # ifndef HAVE_ARM_EHABI_EXCEPTIONS bt->backtrace[bt->i++] = (void *)_Unwind_GetIP(ctx); # else uintptr_t ip; @@ -282,17 +281,17 @@ } #ifdef HAVE__UNWIND_BACKTRACE - (instancetype)init { - struct backtrace_ctx ctx; + struct BacktraceCtx ctx; self = [super init]; ctx.backtrace = _backtrace; ctx.i = 0; - _Unwind_Backtrace(backtrace_callback, &ctx); + _Unwind_Backtrace(backtraceCallback, &ctx); return self; } #endif @@ -307,12 +306,11 @@ #ifdef HAVE__UNWIND_BACKTRACE OFMutableArray OF_GENERIC(OFString *) *backtrace = [OFMutableArray array]; void *pool = objc_autoreleasePoolPush(); - for (uint8_t i = 0; - i < OF_BACKTRACE_SIZE && _backtrace[i] != NULL; i++) { + for (uint8_t i = 0; i < OFBacktraceSize && _backtrace[i] != NULL; i++) { # ifdef HAVE_DLADDR Dl_info info; if (dladdr(_backtrace[i], &info)) { OFString *frame; Index: src/exceptions/OFGetCurrentDirectoryPathFailedException.m ================================================================== --- src/exceptions/OFGetCurrentDirectoryPathFailedException.m +++ src/exceptions/OFGetCurrentDirectoryPathFailedException.m @@ -47,8 +47,8 @@ - (OFString *)description { return [OFString stringWithFormat: @"Getting the current directory path failed: %@", - of_strerror(_errNo)]; + OFStrError(_errNo)]; } @end Index: src/exceptions/OFGetOptionFailedException.m ================================================================== --- src/exceptions/OFGetOptionFailedException.m +++ src/exceptions/OFGetOptionFailedException.m @@ -55,8 +55,8 @@ - (OFString *)description { return [OFString stringWithFormat: @"Getting an option in an object of type %@ failed: %@", - [_object class], of_strerror(_errNo)]; + [_object class], OFStrError(_errNo)]; } @end Index: src/exceptions/OFGetWindowsRegistryValueFailedException.m ================================================================== --- src/exceptions/OFGetWindowsRegistryValueFailedException.m +++ src/exceptions/OFGetWindowsRegistryValueFailedException.m @@ -63,8 +63,8 @@ - (OFString *)description { return [OFString stringWithFormat: @"Failed to get value named %@: %@", - _valueName, of_windows_status_to_string(_status)]; + _valueName, OFWindowsStatusToString(_status)]; } @end Index: src/exceptions/OFHTTPRequestFailedException.m ================================================================== --- src/exceptions/OFHTTPRequestFailedException.m +++ src/exceptions/OFHTTPRequestFailedException.m @@ -59,12 +59,12 @@ [super dealloc]; } - (OFString *)description { - const char *method = of_http_request_method_to_string(_request.method); + const char *method = OFHTTPRequestMethodName(_request.method); return [OFString stringWithFormat: @"An HTTP %s request with URL %@ failed with code %hd!", method, _request.URL, _response.statusCode]; } @end Index: src/exceptions/OFLinkFailedException.m ================================================================== --- src/exceptions/OFLinkFailedException.m +++ src/exceptions/OFLinkFailedException.m @@ -69,8 +69,8 @@ } - (OFString *)description { return [OFString stringWithFormat: @"Failed to link file %@ to %@: %@", - _sourceURL, _destinationURL, of_strerror(_errNo)]; + _sourceURL, _destinationURL, OFStrError(_errNo)]; } @end Index: src/exceptions/OFListenFailedException.m ================================================================== --- src/exceptions/OFListenFailedException.m +++ src/exceptions/OFListenFailedException.m @@ -62,8 +62,8 @@ - (OFString *)description { return [OFString stringWithFormat: @"Failed to listen in socket of type %@ with a back log of %d: %@", - [_socket class], _backlog, of_strerror(_errNo)]; + [_socket class], _backlog, OFStrError(_errNo)]; } @end Index: src/exceptions/OFMoveItemFailedException.m ================================================================== --- src/exceptions/OFMoveItemFailedException.m +++ src/exceptions/OFMoveItemFailedException.m @@ -70,8 +70,8 @@ - (OFString *)description { return [OFString stringWithFormat: @"Failed to move item at %@ to %@: %@", - _sourceURL, _destinationURL, of_strerror(_errNo)]; + _sourceURL, _destinationURL, OFStrError(_errNo)]; } @end Index: src/exceptions/OFObserveFailedException.m ================================================================== --- src/exceptions/OFObserveFailedException.m +++ src/exceptions/OFObserveFailedException.m @@ -64,8 +64,8 @@ - (OFString *)description { return [OFString stringWithFormat: @"An observer of class %@ failed to observe: %@", - _observer.class, of_strerror(_errNo)]; + _observer.class, OFStrError(_errNo)]; } @end Index: src/exceptions/OFOpenItemFailedException.m ================================================================== --- src/exceptions/OFOpenItemFailedException.m +++ src/exceptions/OFOpenItemFailedException.m @@ -105,11 +105,11 @@ item = _path; if (_mode != nil) return [OFString stringWithFormat: @"Failed to open item %@ with mode %@: %@", - item, _mode, of_strerror(_errNo)]; + item, _mode, OFStrError(_errNo)]; else return [OFString stringWithFormat: - @"Failed to open item %@: %@", item, of_strerror(_errNo)]; + @"Failed to open item %@: %@", item, OFStrError(_errNo)]; } @end Index: src/exceptions/OFOpenWindowsRegistryKeyFailedException.m ================================================================== --- src/exceptions/OFOpenWindowsRegistryKeyFailedException.m +++ src/exceptions/OFOpenWindowsRegistryKeyFailedException.m @@ -74,8 +74,8 @@ - (OFString *)description { return [OFString stringWithFormat: @"Failed to open subkey at path %@: %@", - _path, of_windows_status_to_string(_status)]; + _path, OFWindowsStatusToString(_status)]; } @end Index: src/exceptions/OFReadFailedException.m ================================================================== --- src/exceptions/OFReadFailedException.m +++ src/exceptions/OFReadFailedException.m @@ -21,8 +21,8 @@ @implementation OFReadFailedException - (OFString *)description { return [OFString stringWithFormat: @"Failed to read %zu bytes from an object of type %@: %@", - _requestedLength, [_object class], of_strerror(_errNo)]; + _requestedLength, [_object class], OFStrError(_errNo)]; } @end Index: src/exceptions/OFReadOrWriteFailedException.m ================================================================== --- src/exceptions/OFReadOrWriteFailedException.m +++ src/exceptions/OFReadOrWriteFailedException.m @@ -64,8 +64,8 @@ - (OFString *)description { return [OFString stringWithFormat: @"Failed to read or write %zu bytes from / to an object of type " @"%@: %@", - _requestedLength, [_object class], of_strerror(_errNo)]; + _requestedLength, [_object class], OFStrError(_errNo)]; } @end Index: src/exceptions/OFRemoveItemFailedException.m ================================================================== --- src/exceptions/OFRemoveItemFailedException.m +++ src/exceptions/OFRemoveItemFailedException.m @@ -60,8 +60,8 @@ } - (OFString *)description { return [OFString stringWithFormat: - @"Failed to remove item at URL %@: %@", _URL, of_strerror(_errNo)]; + @"Failed to remove item at URL %@: %@", _URL, OFStrError(_errNo)]; } @end Index: src/exceptions/OFResolveHostFailedException.h ================================================================== --- src/exceptions/OFResolveHostFailedException.h +++ src/exceptions/OFResolveHostFailedException.h @@ -25,12 +25,12 @@ * @brief An exception indicating that resolving a host failed. */ @interface OFResolveHostFailedException: OFException { OFString *_host; - of_socket_address_family_t _addressFamily; - of_dns_resolver_error_t _error; + OFSocketAddressFamily _addressFamily; + OFDNSResolverErrorCode _errorCode; } /** * @brief The host which could not be resolved. */ @@ -37,40 +37,40 @@ @property (readonly, nonatomic) OFString *host; /** * @brief The address family for which the host could not be resolved. */ -@property (readonly, nonatomic) of_socket_address_family_t addressFamily; +@property (readonly, nonatomic) OFSocketAddressFamily addressFamily; /** - * @brief The error from the resolver. + * @brief The error code from the resolver. */ -@property (readonly, nonatomic) of_dns_resolver_error_t error; +@property (readonly, nonatomic) OFDNSResolverErrorCode errorCode; /** * @brief Creates a new, autoreleased resolve host failed exception. * * @param host The host which could not be resolved * @param addressFamily The address family for which the host could not be * resolved - * @param error The error from the resolver + * @param errorCode The error code from the resolver * @return A new, autoreleased address translation failed exception */ + (instancetype)exceptionWithHost: (OFString *)host - addressFamily: (of_socket_address_family_t)addressFamily - error: (of_dns_resolver_error_t)error; + addressFamily: (OFSocketAddressFamily)addressFamily + errorCode: (OFDNSResolverErrorCode)errorCode; /** * @brief Initializes an already allocated resolve host failed exception. * * @param host The host which could not be resolved * @param addressFamily The address family for which the host could not be * resolved - * @param error The error from the resolver + * @param errorCode The error code from the resolver * @return An initialized address translation failed exception */ - (instancetype)initWithHost: (OFString *)host - addressFamily: (of_socket_address_family_t)addressFamily - error: (of_dns_resolver_error_t)error; + addressFamily: (OFSocketAddressFamily)addressFamily + errorCode: (OFDNSResolverErrorCode)errorCode; @end OF_ASSUME_NONNULL_END Index: src/exceptions/OFResolveHostFailedException.m ================================================================== --- src/exceptions/OFResolveHostFailedException.m +++ src/exceptions/OFResolveHostFailedException.m @@ -18,31 +18,32 @@ #import "OFResolveHostFailedException.h" #import "OFDNSQueryFailedException.h" #import "OFString.h" @implementation OFResolveHostFailedException -@synthesize host = _host, addressFamily = _addressFamily, error = _error; +@synthesize host = _host, addressFamily = _addressFamily; +@synthesize errorCode = _errorCode; + (instancetype)exceptionWithHost: (OFString *)host - addressFamily: (of_socket_address_family_t)addressFamily - error: (of_dns_resolver_error_t)error + addressFamily: (OFSocketAddressFamily)addressFamily + errorCode: (OFDNSResolverErrorCode)errorCode { return [[[self alloc] initWithHost: host addressFamily: addressFamily - error: error] autorelease]; + errorCode: errorCode] autorelease]; } - (instancetype)initWithHost: (OFString *)host - addressFamily: (of_socket_address_family_t)addressFamily - error: (of_dns_resolver_error_t)error + addressFamily: (OFSocketAddressFamily)addressFamily + errorCode: (OFDNSResolverErrorCode)errorCode { self = [super init]; @try { _host = [host copy]; _addressFamily = addressFamily; - _error = error; + _errorCode = errorCode; } @catch (id e) { [self release]; @throw e; } @@ -58,8 +59,8 @@ - (OFString *)description { return [OFString stringWithFormat: @"The host %@ could not be resolved: %@", - _host, of_dns_resolver_error_to_string(_error)]; + _host, OFDNSResolverErrorCodeDescription(_errorCode)]; } @end Index: src/exceptions/OFRetrieveItemAttributesFailedException.m ================================================================== --- src/exceptions/OFRetrieveItemAttributesFailedException.m +++ src/exceptions/OFRetrieveItemAttributesFailedException.m @@ -61,8 +61,8 @@ - (OFString *)description { return [OFString stringWithFormat: @"Failed to retrieve attributes for item %@: %@", - _URL, of_strerror(_errNo)]; + _URL, OFStrError(_errNo)]; } @end Index: src/exceptions/OFSandboxActivationFailedException.h ================================================================== --- src/exceptions/OFSandboxActivationFailedException.h +++ src/exceptions/OFSandboxActivationFailedException.h @@ -17,53 +17,22 @@ OF_ASSUME_NONNULL_BEGIN @class OFSandbox; -/** - * @class OFSandboxActivationFailedException \ - * OFSandboxActivationFailedException.h \ - * ObjFW/OFSandboxActivationFailedException.h - * - * @brief An exception indicating that sandboxing the process failed. - */ @interface OFSandboxActivationFailedException: OFException { OFSandbox *_sandbox; int _errNo; } -/** - * @brief The sandbox which could not be activated. - */ @property (readonly, nonatomic) OFSandbox *sandbox; - -/** - * @brief The errno of the error that occurred. - */ @property (readonly, nonatomic) int errNo; + (instancetype)exception OF_UNAVAILABLE; - -/** - * @brief Creates a new, autoreleased sandboxing failed exception. - * - * @param sandbox The sandbox which could not be activated - * @param errNo The errno of the error that occurred - * @return A new, autoreleased sandboxing failed exception - */ + (instancetype)exceptionWithSandbox: (OFSandbox *)sandbox errNo: (int)errNo; - - (instancetype)init OF_UNAVAILABLE; - -/** - * @brief Initializes an already allocated sandboxing failed exception. - * - * @param sandbox The sandbox which could not be activated - * @param errNo The errno of the error that occurred - * @return An initialized sandboxing failed exception - */ - (instancetype)initWithSandbox: (OFSandbox *)sandbox errNo: (int)errNo OF_DESIGNATED_INITIALIZER; @end OF_ASSUME_NONNULL_END Index: src/exceptions/OFSandboxActivationFailedException.m ================================================================== --- src/exceptions/OFSandboxActivationFailedException.m +++ src/exceptions/OFSandboxActivationFailedException.m @@ -56,8 +56,8 @@ } - (OFString *)description { return [OFString stringWithFormat: - @"The sandbox could not be applied: %@", of_strerror(_errNo)]; + @"The sandbox could not be applied: %@", OFStrError(_errNo)]; } @end Index: src/exceptions/OFSeekFailedException.h ================================================================== --- src/exceptions/OFSeekFailedException.h +++ src/exceptions/OFSeekFailedException.h @@ -25,11 +25,11 @@ * @brief An exception indicating that seeking in a stream failed. */ @interface OFSeekFailedException: OFException { OFSeekableStream *_stream; - of_offset_t _offset; + OFFileOffset _offset; int _whence, _errNo; } /** * @brief The stream for which seeking failed. @@ -37,11 +37,11 @@ @property (readonly, nonatomic) OFSeekableStream *stream; /** * @brief The offset to which seeking failed. */ -@property (readonly, nonatomic) of_offset_t offset; +@property (readonly, nonatomic) OFFileOffset offset; /** * @brief To what the offset is relative. */ @property (readonly, nonatomic) int whence; @@ -61,11 +61,11 @@ * @param whence To what the offset is relative * @param errNo The errno of the error that occurred * @return A new, autoreleased seek failed exception */ + (instancetype)exceptionWithStream: (OFSeekableStream *)stream - offset: (of_offset_t)offset + offset: (OFFileOffset)offset whence: (int)whence errNo: (int)errNo; - (instancetype)init OF_UNAVAILABLE; @@ -77,11 +77,11 @@ * @param whence To what the offset is relative * @param errNo The errno of the error that occurred * @return An initialized seek failed exception */ - (instancetype)initWithStream: (OFSeekableStream *)stream - offset: (of_offset_t)offset + offset: (OFFileOffset)offset whence: (int)whence errNo: (int)errNo OF_DESIGNATED_INITIALIZER; @end OF_ASSUME_NONNULL_END Index: src/exceptions/OFSeekFailedException.m ================================================================== --- src/exceptions/OFSeekFailedException.m +++ src/exceptions/OFSeekFailedException.m @@ -27,11 +27,11 @@ { OF_UNRECOGNIZED_SELECTOR } + (instancetype)exceptionWithStream: (OFSeekableStream *)stream - offset: (of_offset_t)offset + offset: (OFFileOffset)offset whence: (int)whence errNo: (int)errNo { return [[[self alloc] initWithStream: stream offset: offset @@ -43,11 +43,11 @@ { OF_INVALID_INIT_METHOD } - (instancetype)initWithStream: (OFSeekableStream *)stream - offset: (of_offset_t)offset + offset: (OFFileOffset)offset whence: (int)whence errNo: (int)errNo { self = [super init]; @@ -68,8 +68,8 @@ - (OFString *)description { return [OFString stringWithFormat: @"Seeking failed in stream of type %@: %@", - _stream.class, of_strerror(_errNo)]; + _stream.class, OFStrError(_errNo)]; } @end Index: src/exceptions/OFSetItemAttributesFailedException.h ================================================================== --- src/exceptions/OFSetItemAttributesFailedException.h +++ src/exceptions/OFSetItemAttributesFailedException.h @@ -28,12 +28,12 @@ * @brief An exception indicating an item's attributes could not be set. */ @interface OFSetItemAttributesFailedException: OFException { OFURL *_URL; - of_file_attributes_t _attributes; - of_file_attribute_key_t _failedAttribute; + OFFileAttributes _attributes; + OFFileAttributeKey _failedAttribute; int _errNo; } /** * @brief The URL of the item whose attributes could not be set. @@ -46,16 +46,16 @@ @property (readonly, nonatomic) int errNo; /** * @brief The attributes that should have been set. */ -@property (readonly, nonatomic) of_file_attributes_t attributes; +@property (readonly, nonatomic) OFFileAttributes attributes; /** * @brief The first attribute that could not be set. */ -@property (readonly, nonatomic) of_file_attribute_key_t failedAttribute; +@property (readonly, nonatomic) OFFileAttributeKey failedAttribute; + (instancetype)exception OF_UNAVAILABLE; /** * @brief Creates a new, autoreleased set item attributes failed exception. @@ -66,12 +66,12 @@ * @param failedAttribute The first attribute that could not be set * @param errNo The errno of the error that occurred * @return A new, autoreleased set item attributes failed exception */ + (instancetype)exceptionWithURL: (OFURL *)URL - attributes: (of_file_attributes_t)attributes - failedAttribute: (of_file_attribute_key_t)failedAttribute + attributes: (OFFileAttributes)attributes + failedAttribute: (OFFileAttributeKey)failedAttribute errNo: (int)errNo; - (instancetype)init OF_UNAVAILABLE; /** @@ -83,11 +83,11 @@ * @param failedAttribute The first attribute that could not be set * @param errNo The errno of the error that occurred * @return An initialized set item attributes failed exception */ - (instancetype)initWithURL: (OFURL *)URL - attributes: (of_file_attributes_t)attributes - failedAttribute: (of_file_attribute_key_t)failedAttribute + attributes: (OFFileAttributes)attributes + failedAttribute: (OFFileAttributeKey)failedAttribute errNo: (int)errNo OF_DESIGNATED_INITIALIZER; @end OF_ASSUME_NONNULL_END Index: src/exceptions/OFSetItemAttributesFailedException.m ================================================================== --- src/exceptions/OFSetItemAttributesFailedException.m +++ src/exceptions/OFSetItemAttributesFailedException.m @@ -27,12 +27,12 @@ { OF_UNRECOGNIZED_SELECTOR } + (instancetype)exceptionWithURL: (OFURL *)URL - attributes: (of_file_attributes_t)attributes - failedAttribute: (of_file_attribute_key_t)failedAttribute + attributes: (OFFileAttributes)attributes + failedAttribute: (OFFileAttributeKey)failedAttribute errNo: (int)errNo { return [[[self alloc] initWithURL: URL attributes: attributes failedAttribute: failedAttribute @@ -43,12 +43,12 @@ { OF_INVALID_INIT_METHOD } - (instancetype)initWithURL: (OFURL *)URL - attributes: (of_file_attributes_t)attributes - failedAttribute: (of_file_attribute_key_t)failedAttribute + attributes: (OFFileAttributes)attributes + failedAttribute: (OFFileAttributeKey)failedAttribute errNo: (int)errNo { self = [super init]; @try { @@ -75,8 +75,8 @@ - (OFString *)description { return [OFString stringWithFormat: @"Failed to set attribute %@ for item %@: %@", - _failedAttribute, _URL, of_strerror(_errNo)]; + _failedAttribute, _URL, OFStrError(_errNo)]; } @end Index: src/exceptions/OFSetOptionFailedException.m ================================================================== --- src/exceptions/OFSetOptionFailedException.m +++ src/exceptions/OFSetOptionFailedException.m @@ -55,8 +55,8 @@ - (OFString *)description { return [OFString stringWithFormat: @"Setting an option in an object of type %@ failed: %@", - [_object class], of_strerror(_errNo)]; + [_object class], OFStrError(_errNo)]; } @end Index: src/exceptions/OFSetWindowsRegistryValueFailedException.m ================================================================== --- src/exceptions/OFSetWindowsRegistryValueFailedException.m +++ src/exceptions/OFSetWindowsRegistryValueFailedException.m @@ -74,8 +74,8 @@ - (OFString *)description { return [OFString stringWithFormat: @"Failed to set value named %@ of type %u: %@", - _valueName, _type, of_windows_status_to_string(_status)]; + _valueName, _type, OFWindowsStatusToString(_status)]; } @end Index: src/exceptions/OFWriteFailedException.m ================================================================== --- src/exceptions/OFWriteFailedException.m +++ src/exceptions/OFWriteFailedException.m @@ -66,8 +66,8 @@ { return [OFString stringWithFormat: @"Failed to write %zu bytes (after %zu bytes written) to an " @"object of type %@: %@", _requestedLength, _bytesWritten, [_object class], - of_strerror(_errNo)]; + OFStrError(_errNo)]; } @end Index: src/forwarding/apple-forwarding-arm.S ================================================================== --- src/forwarding/apple-forwarding-arm.S +++ src/forwarding/apple-forwarding-arm.S @@ -13,12 +13,12 @@ * file. */ #include "config.h" -.globl _of_forward -.globl _of_forward_stret +.globl _OFForward +.globl _OFForward_stret .section __TEXT, __objc_methname, cstring_literals str_forwardingTargetForSelector_: .asciz "forwardingTargetForSelector:" @@ -30,11 +30,11 @@ .long 0, 0 .section __TEXT, __text, regular, pure_instructions .arm .align 2 -_of_forward: +_OFForward: stmfd sp!, {r0-r4, lr} vstmdb sp!, {d0-d7} ldr r4, sel_forwardingTargetForSelector_$indirect_L0 L0: @@ -66,19 +66,19 @@ b _objc_msgSend 0: vldmia sp!, {d0-d7} ldmfd sp!, {r0-r4, lr} - b _of_method_not_found + b _OFMethodNotFound .data_region sel_forwardingTargetForSelector_$indirect_L0: .long sel_forwardingTargetForSelector_-(L0+8) .end_data_region .align 2 -_of_forward_stret: +_OFForward_stret: stmfd sp!, {r0-r4, lr} vstmdb sp!, {d0-d7} ldr r4, sel_forwardingTargetForSelector_$indirect_L1 L1: @@ -114,11 +114,11 @@ b _objc_msgSend_stret 0: vldmia sp!, {d0-d7} ldmfd sp!, {r0-r4, lr} - b _of_method_not_found_stret + b _OFMethodNotFound_stret .data_region sel_forwardingTargetForSelector_$indirect_L1: .long sel_forwardingTargetForSelector_-(L1+8) .end_data_region Index: src/forwarding/apple-forwarding-arm64.S ================================================================== --- src/forwarding/apple-forwarding-arm64.S +++ src/forwarding/apple-forwarding-arm64.S @@ -13,12 +13,12 @@ * file. */ #include "config.h" -.globl _of_forward -.globl _of_forward_stret +.globl _OFForward +.globl _OFForward_stret .section __TEXT, __objc_methname, cstring_literals str_forwardingTargetForSelector_: .asciz "forwardingTargetForSelector:" @@ -29,12 +29,12 @@ .section __DATA, __objc_imageinfo, regular, no_dead_strip .long 0, 0 .section __TEXT, __text, regular, pure_instructions .align 2 -_of_forward: -_of_forward_stret: +_OFForward: +_OFForward_stret: stp fp, lr, [sp, #-208]! mov fp, sp sub sp, sp, #208 /* Save all arguments, x8 and x19 */ @@ -93,6 +93,6 @@ ldr x19, [sp, #72] mov sp, fp ldp fp, lr, [sp], #208 - b _of_method_not_found + b _OFMethodNotFound Index: src/forwarding/apple-forwarding-i386.S ================================================================== --- src/forwarding/apple-forwarding-i386.S +++ src/forwarding/apple-forwarding-i386.S @@ -13,12 +13,12 @@ * file. */ #include "config.h" -.globl _of_forward -.globl _of_forward_stret +.globl _OFForward +.globl _OFForward_stret .section __TEXT, __cstring, cstring_literals str_forwardingTargetForSelector_: .asciz "forwardingTargetForSelector:" @@ -28,11 +28,11 @@ .section __OBJC, __image_info .long 0, 0 .section __TEXT, __text, regular, pure_instructions -_of_forward: +_OFForward: pushl %ebp movl %esp, %ebp pushl %ebx subl $20, %esp @@ -76,13 +76,13 @@ 0: addl $20, %esp popl %ebx popl %ebp - jmp _of_method_not_found + jmp _OFMethodNotFound -_of_forward_stret: +_OFForward_stret: pushl %ebp movl %esp, %ebp pushl %ebx subl $20, %esp @@ -126,10 +126,10 @@ 0: addl $20, %esp popl %ebx popl %ebp - jmp _of_method_not_found_stret + jmp _OFMethodNotFound_stret get_eip: movl (%esp), %ebx ret Index: src/forwarding/apple-forwarding-powerpc.S ================================================================== --- src/forwarding/apple-forwarding-powerpc.S +++ src/forwarding/apple-forwarding-powerpc.S @@ -13,12 +13,12 @@ * file. */ #include "config.h" -.globl _of_forward -.globl _of_forward_stret +.globl _OFForward +.globl _OFForward_stret .section __TEXT, __cstring, cstring_literals str_forwardingTargetForSelector_: .asciz "forwardingTargetForSelector:" @@ -28,11 +28,11 @@ .section __OBJC, __image_info .long 0, 0 .section __TEXT, __text, regular, pure_instructions -_of_forward: +_OFForward: mflr r0 stw r0, 8(r1) stwu r1, -192(r1) /* @@ -128,13 +128,13 @@ addi r1, r1, 192 lwz r0, 8(r1) mtlr r0 - b _of_method_not_found + b _OFMethodNotFound -_of_forward_stret: +_OFForward_stret: mflr r0 stw r0, 8(r1) stwu r1, -184(r1) /* @@ -234,6 +234,6 @@ addi r1, r1, 184 lwz r0, 8(r1) mtlr r0 - b _of_method_not_found_stret + b _OFMethodNotFound_stret Index: src/forwarding/apple-forwarding-x86_64.S ================================================================== --- src/forwarding/apple-forwarding-x86_64.S +++ src/forwarding/apple-forwarding-x86_64.S @@ -13,12 +13,12 @@ * file. */ #include "config.h" -.globl _of_forward -.globl _of_forward_stret +.globl _OFForward +.globl _OFForward_stret .section __TEXT, __objc_methname, cstring_literals str_forwardingTargetForSelector_: .asciz "forwardingTargetForSelector:" @@ -28,11 +28,11 @@ .section __DATA, __objc_imageinfo, regular, no_dead_strip .long 0, 0 .section __TEXT, __text, regular, pure_instructions -_of_forward: +_OFForward: pushq %rbp movq %rsp, %rbp /* Save all arguments */ subq $0xC0, %rsp /* 16-byte alignment */ @@ -99,13 +99,13 @@ movq -0x18(%rbp), %rsi movq %rbp, %rsp popq %rbp - jmp _of_method_not_found + jmp _OFMethodNotFound -_of_forward_stret: +_OFForward_stret: pushq %rbp movq %rsp, %rbp /* Save all arguments */ subq $0xC0, %rsp /* 16-byte alignment */ @@ -173,6 +173,6 @@ movq -0x20(%rbp), %rdx movq %rbp, %rsp popq %rbp - jmp _of_method_not_found_stret + jmp _OFMethodNotFound_stret Index: src/forwarding/forwarding-arm-elf.S ================================================================== --- src/forwarding/forwarding-arm-elf.S +++ src/forwarding/forwarding-arm-elf.S @@ -19,15 +19,15 @@ #ifdef HAVE_VFP2 .fpu vfp #endif -.globl of_forward -.globl of_forward_stret +.globl OFForward +.globl OFForward_stret .section .text -of_forward: +OFForward: #ifdef HAVE_VFP2 vstmdb sp!, {d0-d7} #endif stmfd sp!, {r0-r4, lr} @@ -74,15 +74,15 @@ 0: ldmfd sp!, {r0-r4, lr} #ifdef HAVE_VFP2 vldmia sp!, {d0-d7} #endif - b of_method_not_found(PLT) -.type of_forward, %function -.size of_forward, .-of_forward + b OFMethodNotFound(PLT) +.type OFForward, %function +.size OFForward, .-OFForward -of_forward_stret: +OFForward_stret: #ifdef HAVE_VFP2 vstmdb sp!, {d0-d7} #endif stmfd sp!, {r0-r4, lr} @@ -130,13 +130,13 @@ 0: ldmfd sp!, {r0-r4, lr} #ifdef HAVE_VFP2 vldmia sp!, {d0-d7} #endif - b of_method_not_found_stret(PLT) -.type of_forward_stret, %function -.size of_forward_stret, .-of_forward_stret + b OFMethodNotFound_stret(PLT) +.type OFForward_stret, %function +.size OFForward_stret, .-OFForward_stret init: ldr r0, module$indirect_.L2 .L2: add r0, pc Index: src/forwarding/forwarding-arm64-elf.S ================================================================== --- src/forwarding/forwarding-arm64-elf.S +++ src/forwarding/forwarding-arm64-elf.S @@ -15,16 +15,16 @@ #include "config.h" #include "platform.h" -.globl of_forward -.globl of_forward_stret +.globl OFForward +.globl OFForward_stret .section .text -of_forward: -of_forward_stret: +OFForward: +OFForward_stret: stp fp, lr, [sp, #-208]! mov fp, sp sub sp, sp, #208 /* Save all arguments, x8 and x19 */ @@ -94,15 +94,15 @@ ldr x19, [sp, #72] mov sp, fp ldp fp, lr, [sp], #208 - b of_method_not_found -.type of_forward, %function -.size of_forward, .-of_forward -.type of_forward_stret, %function -.size of_forward_stret, .-of_forward_stret + b OFMethodNotFound +.type OFForward, %function +.size OFForward, .-OFForward +.type OFForward_stret, %function +.size OFForward_stret, .-OFForward_stret init: adrp x0, module add x0, x0, :lo12:module b __objc_exec_class Index: src/forwarding/forwarding-mips-elf.S ================================================================== --- src/forwarding/forwarding-mips-elf.S +++ src/forwarding/forwarding-mips-elf.S @@ -15,12 +15,12 @@ #include "config.h" #include "platform.h" -.globl of_forward -.globl of_forward_stret +.globl OFForward +.globl OFForward_stret #ifdef OF_PIC .macro j_pic symbol lw $t9, %call16(\symbol)($gp) jr $t9 @@ -37,11 +37,11 @@ jal \symbol .endm #endif .section .text -of_forward: +OFForward: #ifdef OF_PIC lui $gp, %hi(_gp_disp) addiu $gp, $gp, %lo(_gp_disp) addu $gp, $gp, $t9 #endif @@ -158,14 +158,14 @@ lw $ra, 16($sp) addiu $sp, $sp, 96 j_pic of_method_not_found -.type of_forward, %function -.size of_forward, .-of_forward +.type OFForward, %function +.size OFForward, .-OFForward -of_forward_stret: +OFForward_stret: #ifdef OF_PIC lui $gp, %hi(_gp_disp) addiu $gp, $gp, %lo(_gp_disp) addu $gp, $gp, $t9 #endif @@ -284,12 +284,12 @@ lw $ra, 16($sp) addiu $sp, $sp, 96 j_pic of_method_not_found_stret -.type of_forward_stret, %function -.size of_forward_stret, .-of_forward_stret +.type OFForward_stret, %function +.size OFForward_stret, .-OFForward_stret init: #ifdef OF_PIC lui $gp, %hi(_gp_disp) addiu $gp, $gp, %lo(_gp_disp) Index: src/forwarding/forwarding-powerpc-elf.S ================================================================== --- src/forwarding/forwarding-powerpc-elf.S +++ src/forwarding/forwarding-powerpc-elf.S @@ -15,15 +15,15 @@ #include "config.h" #include "platform.h" -.globl of_forward -.globl of_forward_stret +.globl OFForward +.globl OFForward_stret .section .text -of_forward: +OFForward: stwu %r1, -112(%r1) mflr %r0 stw %r0, 116(%r1) #ifdef OF_PIC stw %r30, 104(%r1) @@ -139,11 +139,11 @@ 0: lwz %r3, 8(%r1) lwz %r4, 12(%r1) #ifdef OF_PIC - lwz %r0, .Lgot_of_method_not_found-.Lbiased_got2(%r30) + lwz %r0, .Lgot_OFMethodNotFound-.Lbiased_got2(%r30) mtctr %r0 lwz %r30, 104(%r1) #endif lwz %r0, 116(%r1) @@ -151,16 +151,16 @@ addi %r1, %r1, 112 #ifdef OF_PIC bctr #else - b of_method_not_found + b OFMethodNotFound #endif -.type of_forward, @function -.size of_forward, .-of_forward +.type OFForward, @function +.size OFForward, .-OFForward -of_forward_stret: +OFForward_stret: stwu %r1, -112(%r1) mflr %r0 stw %r0, 116(%r1) #ifdef OF_PIC stw %r30, 104(%r1) @@ -278,11 +278,11 @@ lwz %r3, 8(%r1) lwz %r4, 12(%r1) lwz %r5, 16(%r1) #ifdef OF_PIC - lwz %r0, .Lgot_of_method_not_found_stret-.Lbiased_got2(%r30) + lwz %r0, .Lgot_OFMethodNotFound_stret-.Lbiased_got2(%r30) mtctr %r0 lwz %r30, 104(%r1) #endif lwz %r0, 116(%r1) @@ -290,14 +290,14 @@ addi %r1, %r1, 112 #ifdef OF_PIC bctr #else - b of_method_not_found_stret + b OFMethodNotFound_stret #endif -.type of_forward_stret, @function -.size of_forward_stret, .-of_forward_stret +.type OFForward_stret, @function +.size OFForward_stret, .-OFForward_stret init: stwu %r1, -16(%r1) mflr %r0 stw %r0, 20(%r1) @@ -349,14 +349,14 @@ .Lbiased_got2 = .+0x8000 .Lgot_module: .long module .Lgot_sel_forwardingTargetForSelector_: .long sel_forwardingTargetForSelector_ -.Lgot_of_method_not_found: - .long of_method_not_found -.Lgot_of_method_not_found_stret: - .long of_method_not_found_stret +.Lgot_OFMethodNotFound: + .long OFMethodNotFound +.Lgot_OFMethodNotFound_stret: + .long OFMethodNotFound_stret #endif #ifdef OF_LINUX .section .note.GNU-stack, "", @progbits #endif Index: src/forwarding/forwarding-sparc-elf.S ================================================================== --- src/forwarding/forwarding-sparc-elf.S +++ src/forwarding/forwarding-sparc-elf.S @@ -15,15 +15,15 @@ #include "config.h" #include "platform.h" -.globl of_forward -.globl of_forward_stret +.globl OFForward +.globl OFForward_stret .section .text -of_forward: +OFForward: save %sp, -96, %sp #ifdef OF_PIC sethi %hi(_GLOBAL_OFFSET_TABLE_ - 4), %l7 call add_pc @@ -75,16 +75,16 @@ jmpl %o0, %g0 restore 0: - call of_method_not_found + call OFMethodNotFound restore -.type of_forward, %function -.size of_forward, .-of_forward +.type OFForward, %function +.size OFForward, .-OFForward -of_forward_stret: +OFForward_stret: save %sp, -96, %sp #ifdef OF_PIC sethi %hi(_GLOBAL_OFFSET_TABLE_ - 4), %l7 call add_pc @@ -136,14 +136,14 @@ jmpl %o0, %g0 restore 0: - call of_method_not_found_stret + call OFMethodNotFound_stret restore -.type of_forward_stret, %function -.size of_forward_stret, .-of_forward_stret +.type OFForward_stret, %function +.size OFForward_stret, .-OFForward_stret init: save %sp, -96, %sp #ifdef OF_PIC Index: src/forwarding/forwarding-sparc64-elf.S ================================================================== --- src/forwarding/forwarding-sparc64-elf.S +++ src/forwarding/forwarding-sparc64-elf.S @@ -15,17 +15,17 @@ #include "config.h" #include "platform.h" -.globl of_forward -.globl of_forward_stret +.globl OFForward +.globl OFForward_stret #define BIAS 2047 .section .text -of_forward: +OFForward: save %sp, -304, %sp /* * Save all floating point registers as they can be used for parameter * passing. @@ -109,16 +109,16 @@ jmpl %o0, %g0 restore 0: - call of_method_not_found + call OFMethodNotFound restore -.type of_forward, %function -.size of_forward, .-of_forward +.type OFForward, %function +.size OFForward, .-OFForward -of_forward_stret: +OFForward_stret: save %sp, -304, %sp /* * Save all floating point registers as they can be used for parameter * passing. @@ -202,14 +202,14 @@ jmpl %o0, %g0 restore 0: - call of_method_not_found_stret + call OFMethodNotFound_stret restore -.type of_forward_stret, %function -.size of_forward_stret, .-of_forward_stret +.type OFForward_stret, %function +.size OFForward_stret, .-OFForward_stret init: save %sp, -176, %sp sethi %hi(_GLOBAL_OFFSET_TABLE_ - 4), %l7 Index: src/forwarding/forwarding-x86-elf.S ================================================================== --- src/forwarding/forwarding-x86-elf.S +++ src/forwarding/forwarding-x86-elf.S @@ -15,15 +15,15 @@ #include "config.h" #include "platform.h" -.globl of_forward -.globl of_forward_stret +.globl OFForward +.globl OFForward_stret .section .text -of_forward: +OFForward: pushl %ebp movl %esp, %ebp pushl %ebx subl $20, %esp @@ -73,21 +73,21 @@ popl %ebp jmp *%eax 0: - leal of_method_not_found@GOTOFF(%ebx), %eax + leal OFMethodNotFound@GOTOFF(%ebx), %eax addl $20, %esp popl %ebx popl %ebp jmp *%eax -.type of_forward, %function -.size of_forward, .-of_forward +.type OFForward, %function +.size OFForward, .-OFForward -of_forward_stret: +OFForward_stret: pushl %ebp movl %esp, %ebp pushl %ebx subl $20, %esp @@ -137,19 +137,19 @@ popl %ebp jmp *%eax 0: - leal of_method_not_found_stret@GOTOFF(%ebx), %eax + leal OFMethodNotFound_stret@GOTOFF(%ebx), %eax addl $20, %esp popl %ebx popl %ebp jmp *%eax -.type of_forward_stret, %function -.size of_forward_stret, .-of_forward_stret +.type OFForward_stret, %function +.size OFForward_stret, .-OFForward_stret init: pushl %ebp movl %esp, %ebp Index: src/forwarding/forwarding-x86-win32.S ================================================================== --- src/forwarding/forwarding-x86-win32.S +++ src/forwarding/forwarding-x86-win32.S @@ -13,15 +13,15 @@ * file. */ #include "config.h" -.globl _of_forward -.globl _of_forward_stret +.globl _OFForward +.globl _OFForward_stret .section .text -_of_forward: +_OFForward: pushl %ebp movl %esp, %ebp pushl %ebx subl $20, %esp @@ -72,17 +72,17 @@ 0: addl $20, %esp popl %ebx popl %ebp - jmp _of_method_not_found -.def _of_forward + jmp _OFMethodNotFound +.def _OFForward .scl 2 .type 32 .endef -_of_forward_stret: +_OFForward_stret: pushl %ebp movl %esp, %ebp pushl %ebx subl $20, %esp @@ -133,12 +133,12 @@ 0: addl $20, %esp popl %ebx popl %ebp - jmp _of_method_not_found_stret -.def _of_forward_stret + jmp _OFMethodNotFound_stret +.def _OFForward_stret .scl 2 .type 32 .endef init: Index: src/forwarding/forwarding-x86_64-elf.S ================================================================== --- src/forwarding/forwarding-x86_64-elf.S +++ src/forwarding/forwarding-x86_64-elf.S @@ -15,15 +15,15 @@ #include "config.h" #include "platform.h" -.globl of_forward -.globl of_forward_stret +.globl OFForward +.globl OFForward_stret .section .text -of_forward: +OFForward: pushq %rbp movq %rsp, %rbp /* Save all arguments */ subq $0xC0, %rsp /* 16-byte alignment */ @@ -100,15 +100,15 @@ movq -0x18(%rbp), %rsi movq %rbp, %rsp popq %rbp - jmp of_method_not_found@PLT -.type of_forward, %function -.size of_forward, .-of_forward + jmp OFMethodNotFound@PLT +.type OFForward, %function +.size OFForward, .-OFForward -of_forward_stret: +OFForward_stret: pushq %rbp movq %rsp, %rbp /* Save all arguments */ subq $0xC0, %rsp /* 16-byte alignment */ @@ -187,13 +187,13 @@ movq -0x20(%rbp), %rdx movq %rbp, %rsp popq %rbp - jmp of_method_not_found_stret@PLT -.type of_forward_stret, %function -.size of_forward_stret, .-of_forward_stret + jmp OFMethodNotFound_stret@PLT +.type OFForward_stret, %function +.size OFForward_stret, .-OFForward_stret init: leaq module(%rip), %rdi jmp __objc_exec_class@PLT Index: src/forwarding/forwarding-x86_64-macho.S ================================================================== --- src/forwarding/forwarding-x86_64-macho.S +++ src/forwarding/forwarding-x86_64-macho.S @@ -15,15 +15,15 @@ #include "config.h" #include "platform.h" -.globl _of_forward -.globl _of_forward_stret +.globl _OFForward +.globl _OFForward_stret .section __TEXT, __text, regular, pure_instructions -_of_forward: +_OFForward: pushq %rbp movq %rsp, %rbp /* Save all arguments */ subq $0xC0, %rsp /* 16-byte alignment */ @@ -100,13 +100,13 @@ movq -0x18(%rbp), %rsi movq %rbp, %rsp popq %rbp - jmp _of_method_not_found + jmp _OFMethodNotFound -_of_forward_stret: +_OFForward_stret: pushq %rbp movq %rsp, %rbp /* Save all arguments */ subq $0xC0, %rsp /* 16-byte alignment */ @@ -185,11 +185,11 @@ movq -0x20(%rbp), %rdx movq %rbp, %rsp popq %rbp - jmp _of_method_not_found_stret + jmp _OFMethodNotFound_stret init: leaq module(%rip), %rdi jmp ___objc_exec_class Index: src/forwarding/forwarding-x86_64-win64.S ================================================================== --- src/forwarding/forwarding-x86_64-win64.S +++ src/forwarding/forwarding-x86_64-win64.S @@ -13,15 +13,15 @@ * file. */ #include "config.h" -.globl of_forward -.globl of_forward_stret +.globl OFForward +.globl OFForward_stret .section .text -of_forward: +OFForward: pushq %rbp movq %rsp, %rbp /* Save all arguments */ subq $0x90, %rsp /* 16-byte alignment */ @@ -86,17 +86,17 @@ movq -0x38(%rbp), %rdx movq %rbp, %rsp popq %rbp - jmp of_method_not_found -.def of_forward + jmp OFMethodNotFound +.def OFForward .scl 2 .type 32 .endef -of_forward_stret: +OFForward_stret: pushq %rbp movq %rsp, %rbp /* Save all arguments */ subq $0x90, %rsp /* 16-byte alignment */ @@ -163,12 +163,12 @@ movq -0x40(%rbp), %r8 movq %rbp, %rsp popq %rbp - jmp of_method_not_found_stret -.def of_forward_stret + jmp OFMethodNotFound_stret +.def OFForward_stret .scl 2 .type 32 .endef init: DELETED src/huffman_tree.h Index: src/huffman_tree.h ================================================================== --- src/huffman_tree.h +++ src/huffman_tree.h @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include -#include - -#import "macros.h" - -#import "OFInvalidFormatException.h" - -OF_ASSUME_NONNULL_BEGIN - -struct of_huffman_tree { - struct of_huffman_tree *_Nullable leaves[2]; - uint16_t value; -}; - -static OF_INLINE bool -of_huffman_tree_walk(id _Nullable stream, - bool (*bitReader)(id _Nullable, uint16_t *_Nonnull, uint8_t), - struct of_huffman_tree *_Nonnull *_Nonnull tree, uint16_t *_Nonnull value) -{ - struct of_huffman_tree *iter = *tree; - uint16_t bits; - - while (iter->value == 0xFFFF) { - if OF_UNLIKELY (!bitReader(stream, &bits, 1)) { - *tree = iter; - return false; - } - - if OF_UNLIKELY (iter->leaves[bits] == NULL) - @throw [OFInvalidFormatException exception]; - - iter = iter->leaves[bits]; - } - - *value = iter->value; - return true; -} - -#ifdef __cplusplus -extern "C" { -#endif -extern struct of_huffman_tree *_Nonnull of_huffman_tree_construct( - uint8_t lengths[_Nonnull], uint16_t count); -extern struct of_huffman_tree *_Nonnull of_huffman_tree_construct_single( - uint16_t value); -extern void of_huffman_tree_release(struct of_huffman_tree *_Nonnull tree); -#ifdef __cplusplus -} -#endif - -OF_ASSUME_NONNULL_END DELETED src/huffman_tree.m Index: src/huffman_tree.m ================================================================== --- src/huffman_tree.m +++ src/huffman_tree.m @@ -1,130 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#include -#include - -#import "huffman_tree.h" - -#import "OFInvalidFormatException.h" -#import "OFOutOfMemoryException.h" - -static struct of_huffman_tree * -newTree(void) -{ - struct of_huffman_tree *tree; - - tree = of_alloc(1, sizeof(*tree)); - tree->leaves[0] = tree->leaves[1] = NULL; - tree->value = 0xFFFF; - - return tree; -} - -static void -insertTree(struct of_huffman_tree *tree, uint16_t code, uint8_t length, - uint16_t value) -{ - while (length > 0) { - uint8_t bit; - - length--; - bit = (code & (1u << length)) >> length; - - if (tree->leaves[bit] == NULL) - tree->leaves[bit] = newTree(); - - tree = tree->leaves[bit]; - } - - tree->value = value; -} - -struct of_huffman_tree * -of_huffman_tree_construct(uint8_t lengths[], uint16_t count) -{ - struct of_huffman_tree *tree; - uint16_t *lengthCount = NULL; - uint16_t code, maxCode = 0, *nextCode = NULL; - uint_fast8_t maxBit = 0; - - @try { - for (uint16_t i = 0; i < count; i++) { - uint_fast8_t length = lengths[i]; - - if OF_UNLIKELY (length > maxBit) { - lengthCount = of_realloc(lengthCount, - length + 1, sizeof(uint16_t)); - nextCode = of_realloc(nextCode, - length + 1, sizeof(uint16_t)); - - for (uint_fast8_t j = maxBit + 1; j <= length; - j++) { - lengthCount[j] = 0; - nextCode[j] = 0; - } - - maxBit = length; - } - - if (length > 0) { - lengthCount[length]++; - maxCode = i; - } - } - - code = 0; - for (size_t i = 1; i <= maxBit; i++) { - code = (code + lengthCount[i - 1]) << 1; - nextCode[i] = code; - } - - tree = newTree(); - - for (uint16_t i = 0; i <= maxCode; i++) { - uint8_t length = lengths[i]; - - if (length > 0) - insertTree(tree, nextCode[length]++, length, i); - } - } @finally { - free(lengthCount); - free(nextCode); - } - - return tree; -} - -struct of_huffman_tree * -of_huffman_tree_construct_single(uint16_t value) -{ - struct of_huffman_tree *tree = newTree(); - - tree->value = value; - - return tree; -} - -void -of_huffman_tree_release(struct of_huffman_tree *tree) -{ - for (uint_fast8_t i = 0; i < 2; i++) - if OF_LIKELY (tree->leaves[i] != NULL) - of_huffman_tree_release(tree->leaves[i]); - - free(tree); -} Index: src/invocation/apple-call-x86_64.S ================================================================== --- src/invocation/apple-call-x86_64.S +++ src/invocation/apple-call-x86_64.S @@ -15,23 +15,23 @@ #include "config.h" #include "invoke-x86_64.h" -.globl _of_invocation_call +.globl _OFInvocationCall .section __TEXT, __text, regular, pure_instructions -_of_invocation_call: +_OFInvocationCall: pushq %rbp movq %rsp, %rbp subq $16, %rsp andq $-16, %rsp movq %rdi, -8(%rbp) - leaq OFFSET_STACK(%rdi), %rdx - movq OFFSET_STACK_SIZE(%rdi), %rcx + leaq offsetStack(%rdi), %rdx + movq offsetStackSize(%rdi), %rcx testq $1, %rcx jnz Lfix_align Lfill_stack: @@ -43,54 +43,54 @@ pushq %r11 jmp Lfill_stack Lstack_filled: - movb OFFSET_NUM_SSE_USED(%rdi), %al - - movaps OFFSET_SSE_INOUT+112(%rdi), %xmm7 - movaps OFFSET_SSE_INOUT+96(%rdi), %xmm6 - movaps OFFSET_SSE_INOUT+80(%rdi), %xmm5 - movaps OFFSET_SSE_INOUT+64(%rdi), %xmm4 - movaps OFFSET_SSE_INOUT+48(%rdi), %xmm3 - movaps OFFSET_SSE_INOUT+32(%rdi), %xmm2 - movaps OFFSET_SSE_INOUT+16(%rdi), %xmm1 - movaps OFFSET_SSE_INOUT(%rdi), %xmm0 - - movq OFFSET_GPR_IN+40(%rdi), %r9 - movq OFFSET_GPR_IN+32(%rdi), %r8 - movq OFFSET_GPR_IN+24(%rdi), %rcx - movq OFFSET_GPR_IN+16(%rdi), %rdx - movq OFFSET_GPR_IN+8(%rdi), %rsi - - movb OFFSET_RETURN_TYPE(%rdi), %r11b - movq OFFSET_GPR_IN(%rdi), %rdi - - cmpb $RETURN_TYPE_STRET, %r11b + movb offsetNumSSEUsed(%rdi), %al + + movaps offsetSSEInOut+112(%rdi), %xmm7 + movaps offsetSSEInOut+96(%rdi), %xmm6 + movaps offsetSSEInOut+80(%rdi), %xmm5 + movaps offsetSSEInOut+64(%rdi), %xmm4 + movaps offsetSSEInOut+48(%rdi), %xmm3 + movaps offsetSSEInOut+32(%rdi), %xmm2 + movaps offsetSSEInOut+16(%rdi), %xmm1 + movaps offsetSSEInOut(%rdi), %xmm0 + + movq offsetGPRIn+40(%rdi), %r9 + movq offsetGPRIn+32(%rdi), %r8 + movq offsetGPRIn+24(%rdi), %rcx + movq offsetGPRIn+16(%rdi), %rdx + movq offsetGPRIn+8(%rdi), %rsi + + movb offsetReturnType(%rdi), %r11b + movq offsetGPRIn(%rdi), %rdi + + cmpb $returnTypeStret, %r11b je Lcall_send_stret - cmpb $RETURN_TYPE_JMP, %r11b + cmpb $returnTypeJmp, %r11b je _objc_msgSend - cmpb $RETURN_TYPE_JMP_STRET, %r11b + cmpb $returnTypeJmpStret, %r11b je _objc_msgSend_stret call _objc_msgSend Lafter_send: movq -8(%rbp), %rdi - movq %rax, OFFSET_GPR_OUT(%rdi) - movq %rdx, OFFSET_GPR_OUT+8(%rdi) - movaps %xmm0, OFFSET_SSE_INOUT(%rdi) - movaps %xmm1, OFFSET_SSE_INOUT+16(%rdi) - - movb OFFSET_RETURN_TYPE(%rdi), %r11b - - cmpb $RETURN_TYPE_X87, %r11b + movq %rax, offsetGPROut(%rdi) + movq %rdx, offsetGPROut+8(%rdi) + movaps %xmm0, offsetSSEInOut(%rdi) + movaps %xmm1, offsetSSEInOut+16(%rdi) + + movb offsetReturnType(%rdi), %r11b + + cmpb $returnTypeX87, %r11b je Lpop_long_double - cmpb $RETURN_TYPE_COMPLEX_X87, %r11b + cmpb $returnTypeComplexX87, %r11b je Lpop_complex_long_double Lreturn: movq %rbp, %rsp popq %rbp @@ -105,12 +105,12 @@ Lcall_send_stret: call _objc_msgSend_stret jmp Lafter_send Lpop_long_double: - fstpt OFFSET_X87_OUT(%rdi) + fstpt offsetX87Out(%rdi) jmp Lreturn Lpop_complex_long_double: - fstpt OFFSET_X87_OUT(%rdi) - fstpt OFFSET_X87_OUT+16(%rdi) + fstpt offsetX87Out(%rdi) + fstpt offsetX87Out+16(%rdi) jmp Lreturn Index: src/invocation/call-x86_64-elf.S ================================================================== --- src/invocation/call-x86_64-elf.S +++ src/invocation/call-x86_64-elf.S @@ -15,37 +15,37 @@ #include "config.h" #include "invoke-x86_64.h" -.globl of_invocation_call +.globl OFInvocationCall .section .text -of_invocation_call: +OFInvocationCall: pushq %rbp movq %rsp, %rbp subq $16, %rsp andq $-16, %rsp movq %rdi, -8(%rbp) - movb OFFSET_RETURN_TYPE(%rdi), %r11b - cmpb $RETURN_TYPE_STRET, %r11b + movb offsetReturnType(%rdi), %r11b + cmpb $returnTypeStret, %r11b je .Llookup_stret - cmpb $RETURN_TYPE_JMP_STRET, %r11b + cmpb $returnTypeJmpStret, %r11b je .Llookup_stret - movq OFFSET_GPR_IN+8(%rdi), %rsi - movq OFFSET_GPR_IN+0(%rdi), %rdi + movq offsetGPRIn+8(%rdi), %rsi + movq offsetGPRIn+0(%rdi), %rdi call objc_msg_lookup@PLT .Lafter_lookup: movq %rax, -16(%rbp) movq -8(%rbp), %rdi - leaq OFFSET_STACK(%rdi), %rdx - movq OFFSET_STACK_SIZE(%rdi), %rcx + leaq offsetStack(%rdi), %rdx + movq offsetStackSize(%rdi), %rcx testq $1, %rcx jnz .Lfix_align .Lfill_stack: @@ -57,51 +57,51 @@ pushq %r11 jmp .Lfill_stack .Lstack_filled: - movb OFFSET_NUM_SSE_USED(%rdi), %al - - movaps OFFSET_SSE_INOUT+112(%rdi), %xmm7 - movaps OFFSET_SSE_INOUT+96(%rdi), %xmm6 - movaps OFFSET_SSE_INOUT+80(%rdi), %xmm5 - movaps OFFSET_SSE_INOUT+64(%rdi), %xmm4 - movaps OFFSET_SSE_INOUT+48(%rdi), %xmm3 - movaps OFFSET_SSE_INOUT+32(%rdi), %xmm2 - movaps OFFSET_SSE_INOUT+16(%rdi), %xmm1 - movaps OFFSET_SSE_INOUT(%rdi), %xmm0 - - movq OFFSET_GPR_IN+40(%rdi), %r9 - movq OFFSET_GPR_IN+32(%rdi), %r8 - movq OFFSET_GPR_IN+24(%rdi), %rcx - movq OFFSET_GPR_IN+16(%rdi), %rdx - movq OFFSET_GPR_IN+8(%rdi), %rsi - - movb OFFSET_RETURN_TYPE(%rdi), %r11b - movq OFFSET_GPR_IN(%rdi), %rdi - - cmpb $RETURN_TYPE_JMP, %r11b + movb offsetNumSSEUsed(%rdi), %al + + movaps offsetSSEInOut+112(%rdi), %xmm7 + movaps offsetSSEInOut+96(%rdi), %xmm6 + movaps offsetSSEInOut+80(%rdi), %xmm5 + movaps offsetSSEInOut+64(%rdi), %xmm4 + movaps offsetSSEInOut+48(%rdi), %xmm3 + movaps offsetSSEInOut+32(%rdi), %xmm2 + movaps offsetSSEInOut+16(%rdi), %xmm1 + movaps offsetSSEInOut(%rdi), %xmm0 + + movq offsetGPRIn+40(%rdi), %r9 + movq offsetGPRIn+32(%rdi), %r8 + movq offsetGPRIn+24(%rdi), %rcx + movq offsetGPRIn+16(%rdi), %rdx + movq offsetGPRIn+8(%rdi), %rsi + + movb offsetReturnType(%rdi), %r11b + movq offsetGPRIn(%rdi), %rdi + + cmpb $returnTypeJmp, %r11b je .Ljmp_into_method - cmpb $RETURN_TYPE_JMP_STRET, %r11b + cmpb $returnTypeJmpStret, %r11b je .Ljmp_into_method movq -16(%rbp), %r11 call *%r11 .Lafter_send: movq -8(%rbp), %rdi - movq %rax, OFFSET_GPR_OUT(%rdi) - movq %rdx, OFFSET_GPR_OUT+8(%rdi) - movaps %xmm0, OFFSET_SSE_INOUT(%rdi) - movaps %xmm1, OFFSET_SSE_INOUT+16(%rdi) - - movb OFFSET_RETURN_TYPE(%rdi), %r11b - - cmpb $RETURN_TYPE_X87, %r11b + movq %rax, offsetGPROut(%rdi) + movq %rdx, offsetGPROut+8(%rdi) + movaps %xmm0, offsetSSEInOut(%rdi) + movaps %xmm1, offsetSSEInOut+16(%rdi) + + movb offsetReturnType(%rdi), %r11b + + cmpb $returnTypeX87, %r11b je .Lpop_long_double - cmpb $RETURN_TYPE_COMPLEX_X87, %r11b + cmpb $returnTypeComplexX87, %r11b je .Lpop_complex_long_double .Lreturn: movq %rbp, %rsp popq %rbp @@ -112,27 +112,27 @@ xorq %r11, %r11 pushq %r11 jmp .Lfill_stack .Llookup_stret: - movq OFFSET_GPR_IN+16(%rdi), %rsi - movq OFFSET_GPR_IN+8(%rdi), %rdi + movq offsetGPRIn+16(%rdi), %rsi + movq offsetGPRIn+8(%rdi), %rdi call objc_msg_lookup_stret@PLT jmp .Lafter_lookup .Ljmp_into_method: movq -16(%rbp), %r11 jmp *%r11 .Lpop_long_double: - fstpt OFFSET_X87_OUT(%rdi) + fstpt offsetX87Out(%rdi) jmp .Lreturn .Lpop_complex_long_double: - fstpt OFFSET_X87_OUT(%rdi) - fstpt OFFSET_X87_OUT+16(%rdi) + fstpt offsetX87Out(%rdi) + fstpt offsetX87Out+16(%rdi) jmp .Lreturn #ifdef OF_LINUX .section .note.GNU-stack, "", %progbits #endif Index: src/invocation/invoke-x86_64.h ================================================================== --- src/invocation/invoke-x86_64.h +++ src/invocation/invoke-x86_64.h @@ -11,25 +11,25 @@ * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ -#define RETURN_TYPE_NORMAL 0 -#define RETURN_TYPE_STRET 1 -#define RETURN_TYPE_X87 2 -#define RETURN_TYPE_COMPLEX_X87 3 -#define RETURN_TYPE_JMP 4 -#define RETURN_TYPE_JMP_STRET 5 - -#define NUM_GPR_IN 6 -#define NUM_GPR_OUT 2 -#define NUM_SSE_INOUT 8 -#define NUM_X87_OUT 2 - -#define OFFSET_GPR_IN 0 -#define OFFSET_GPR_OUT (OFFSET_GPR_IN + NUM_GPR_IN * 8) -#define OFFSET_SSE_INOUT (OFFSET_GPR_OUT + NUM_GPR_OUT * 8) -#define OFFSET_X87_OUT (OFFSET_SSE_INOUT + NUM_SSE_INOUT * 16) -#define OFFSET_NUM_SSE_USED (OFFSET_X87_OUT + NUM_X87_OUT * 16) -#define OFFSET_RETURN_TYPE (OFFSET_NUM_SSE_USED + 1) -#define OFFSET_STACK_SIZE (OFFSET_RETURN_TYPE + 7) -#define OFFSET_STACK (OFFSET_STACK_SIZE + 8) +#define returnTypeNormal 0 +#define returnTypeStret 1 +#define returnTypeX87 2 +#define returnTypeComplexX87 3 +#define returnTypeJmp 4 +#define returnTypeJmpStret 5 + +#define numGPRIn 6 +#define numGPROut 2 +#define numSSEInOut 8 +#define numX87Out 2 + +#define offsetGPRIn 0 +#define offsetGPROut (offsetGPRIn + numGPRIn * 8) +#define offsetSSEInOut (offsetGPROut + numGPROut * 8) +#define offsetX87Out (offsetSSEInOut + numSSEInOut * 16) +#define offsetNumSSEUsed (offsetX87Out + numX87Out * 16) +#define offsetReturnType (offsetNumSSEUsed + 1) +#define offsetStackSize (offsetReturnType + 7) +#define offsetStack (offsetStackSize + 8) Index: src/invocation/invoke-x86_64.m ================================================================== --- src/invocation/invoke-x86_64.m +++ src/invocation/invoke-x86_64.m @@ -27,28 +27,28 @@ #import "invoke-x86_64.h" #import "macros.h" -struct call_context { - uint64_t GPR[NUM_GPR_IN + NUM_GPR_OUT]; - __m128 SSE[NUM_SSE_INOUT]; - long double X87[NUM_X87_OUT]; +struct CallContext { + uint64_t GPR[numGPRIn + numGPROut]; + __m128 SSE[numSSEInOut]; + long double X87[numX87Out]; uint8_t numSSEUsed; uint8_t returnType; uint64_t stackSize; uint64_t stack[]; }; -extern void of_invocation_call(struct call_context *); +extern void OFInvocationCall(struct CallContext *); static void -pushGPR(struct call_context **context, uint_fast8_t *currentGPR, uint64_t value) +pushGPR(struct CallContext **context, uint_fast8_t *currentGPR, uint64_t value) { - struct call_context *newContext; + struct CallContext *newContext; - if (*currentGPR < NUM_GPR_IN) { + if (*currentGPR < numGPRIn) { (*context)->GPR[(*currentGPR)++] = value; return; } if ((newContext = realloc(*context, @@ -62,16 +62,16 @@ newContext->stackSize++; *context = newContext; } static void -pushDouble(struct call_context **context, uint_fast8_t *currentSSE, +pushDouble(struct CallContext **context, uint_fast8_t *currentSSE, double value) { - struct call_context *newContext; + struct CallContext *newContext; - if (*currentSSE < NUM_SSE_INOUT) { + if (*currentSSE < numSSEInOut) { (*context)->SSE[(*currentSSE)++] = (__m128)_mm_set_sd(value); (*context)->numSSEUsed++; return; } @@ -86,17 +86,17 @@ newContext->stackSize++; *context = newContext; } static void -pushQuad(struct call_context **context, uint_fast8_t *currentSSE, +pushQuad(struct CallContext **context, uint_fast8_t *currentSSE, double low, double high) { size_t stackSize; - struct call_context *newContext; + struct CallContext *newContext; - if (*currentSSE + 1 < NUM_SSE_INOUT) { + if (*currentSSE + 1 < numSSEInOut) { (*context)->SSE[(*currentSSE)++] = (__m128)_mm_set_sd(low); (*context)->SSE[(*currentSSE)++] = (__m128)_mm_set_sd(high); (*context)->numSSEUsed += 2; return; } @@ -117,13 +117,13 @@ newContext->stackSize = stackSize; *context = newContext; } static void -pushLongDouble(struct call_context **context, long double value) +pushLongDouble(struct CallContext **context, long double value) { - struct call_context *newContext; + struct CallContext *newContext; if ((newContext = realloc(*context, sizeof(**context) + ((*context)->stackSize + 2) * 8)) == NULL) { free(*context); @throw [OFOutOfMemoryException exceptionWithRequestedSize: @@ -134,16 +134,16 @@ newContext->stackSize += 2; *context = newContext; } static void -pushLongDoublePair(struct call_context **context, long double value[2]) +pushLongDoublePair(struct CallContext **context, long double value[2]) { size_t stackSize; - struct call_context *newContext; + struct CallContext *newContext; - stackSize = OF_ROUND_UP_POW2(2UL, (*context)->stackSize) + 4; + stackSize = OFRoundUpToPowerOf2(2UL, (*context)->stackSize) + 4; if ((newContext = realloc(*context, sizeof(**context) + stackSize * 8)) == NULL) { free(*context); @throw [OFOutOfMemoryException exceptionWithRequestedSize: @@ -157,17 +157,17 @@ *context = newContext; } #if defined(__SIZEOF_INT128__) && !defined(__clang__) static void -pushInt128(struct call_context **context, uint_fast8_t *currentGPR, +pushInt128(struct CallContext **context, uint_fast8_t *currentGPR, uint64_t value[2]) { size_t stackSize; - struct call_context *newContext; + struct CallContext *newContext; - if (*currentGPR + 1 < NUM_GPR_IN) { + if (*currentGPR + 1 < numGPRIn) { (*context)->GPR[(*currentGPR)++] = value[0]; (*context)->GPR[(*currentGPR)++] = value[1]; return; } @@ -187,15 +187,15 @@ *context = newContext; } #endif void -of_invocation_invoke(OFInvocation *invocation) +OFInvocationInvoke(OFInvocation *invocation) { OFMethodSignature *methodSignature = invocation.methodSignature; size_t numberOfArguments = methodSignature.numberOfArguments; - struct call_context *context; + struct CallContext *context; const char *typeEncoding; uint_fast8_t currentGPR = 0, currentSSE = 0; if ((context = calloc(sizeof(*context), 1)) == NULL) @throw [OFOutOfMemoryException exception]; @@ -335,23 +335,23 @@ case 't': case 'T': #endif case 'f': case 'd': - context->returnType = RETURN_TYPE_NORMAL; + context->returnType = returnTypeNormal; break; case 'D': - context->returnType = RETURN_TYPE_X87; + context->returnType = returnTypeX87; break; case 'j': switch (typeEncoding[1]) { case 'f': case 'd': - context->returnType = RETURN_TYPE_NORMAL; + context->returnType = returnTypeNormal; break; case 'D': - context->returnType = RETURN_TYPE_COMPLEX_X87; + context->returnType = returnTypeComplexX87; break; default: free(context); @throw [OFInvalidFormatException exception]; } @@ -363,21 +363,21 @@ default: free(context); @throw [OFInvalidFormatException exception]; } - of_invocation_call(context); + OFInvocationCall(context); switch (*typeEncoding) { case 'v': break; -#define CASE_GPR(encoding, type) \ - case encoding: \ - { \ - type tmp = (type)context->GPR[NUM_GPR_IN]; \ - [invocation setReturnValue: &tmp]; \ - } \ +#define CASE_GPR(encoding, type) \ + case encoding: \ + { \ + type tmp = (type)context->GPR[numGPRIn]; \ + [invocation setReturnValue: &tmp]; \ + } \ break; CASE_GPR('c', char) CASE_GPR('C', unsigned char) CASE_GPR('i', int) CASE_GPR('I', unsigned int) @@ -395,11 +395,11 @@ CASE_GPR('^', void *) #undef CASE_GPR #ifdef __SIZEOF_INT128__ case 't': case 'T':; - [invocation setReturnValue: &context->GPR[NUM_GPR_IN]]; + [invocation setReturnValue: &context->GPR[numGPRIn]]; break; #endif case 'f':; float floatTmp; _mm_store_ss(&floatTmp, context->SSE[0]); Index: src/invocation/invoke.m ================================================================== --- src/invocation/invoke.m +++ src/invocation/invoke.m @@ -19,7 +19,7 @@ #if defined(OF_X86_64) && (defined(OF_APPLE_RUNTIME) || defined(OF_ELF)) # include "invoke-x86_64.m" #else /* To not have an empty translation unit otherwise */ -int of_invocation_cannot_invoke; +int OFInvocationCannotInvoke; #endif Index: src/macros.h ================================================================== --- src/macros.h +++ src/macros.h @@ -100,16 +100,10 @@ # define OF_CONST_FUNC # define OF_NO_RETURN_FUNC # define OF_WEAK_REF(sym) #endif -#ifdef OF_BIG_ENDIAN -# define OF_BYTE_ORDER_NATIVE OF_BYTE_ORDER_BIG_ENDIAN -#else -# define OF_BYTE_ORDER_NATIVE OF_BYTE_ORDER_LITTLE_ENDIAN -#endif - #if __STDC_VERSION__ >= 201112L # define OF_ALIGNOF(type) _Alignof(type) # define OF_ALIGNAS(type) _Alignas(type) #else # define OF_ALIGNOF(type) __alignof__(type) @@ -353,23 +347,22 @@ # endif # endif # endif #endif -#define OF_RETAIN_COUNT_MAX UINT_MAX -#define OF_NOT_FOUND SIZE_MAX +#define OFMaxRetainCount UINT_MAX #ifdef OBJC_COMPILING_RUNTIME -# define OF_ENSURE(cond) \ +# define OFEnsure(cond) \ do { \ if OF_UNLIKELY (!(cond)) \ objc_error("ObjFWRT @ " __FILE__ ":" \ OF_STRINGIFY(__LINE__), \ "Failed to ensure condition:\n" #cond); \ } while(0) #else -# define OF_ENSURE(cond) \ +# define OFEnsure(cond) \ do { \ if OF_UNLIKELY (!(cond)) { \ fprintf(stderr, "Failed to ensure condition " \ "in " __FILE__ ":%d:\n" #cond "\n", \ __LINE__); \ @@ -376,17 +369,17 @@ abort(); \ } \ } while (0) #endif -#define OF_UNRECOGNIZED_SELECTOR of_method_not_found(self, _cmd); +#define OF_UNRECOGNIZED_SELECTOR OFMethodNotFound(self, _cmd); #if __has_feature(objc_arc) -# define OF_INVALID_INIT_METHOD of_method_not_found(self, _cmd); +# define OF_INVALID_INIT_METHOD OFMethodNotFound(self, _cmd); #else # define OF_INVALID_INIT_METHOD \ @try { \ - of_method_not_found(self, _cmd); \ + OFMethodNotFound(self, _cmd); \ } @catch (id e) { \ [self release]; \ @throw e; \ } \ \ @@ -416,33 +409,33 @@ #define OF_DESTRUCTOR(prio) \ static void __attribute__((__destructor__(prio))) \ OF_PREPROCESSOR_CONCAT(destructor, __LINE__)(void) static OF_INLINE uint16_t OF_CONST_FUNC -OF_BSWAP16_CONST(uint16_t i) +OFByteSwap16Const(uint16_t i) { return (i & 0xFF00) >> 8 | (i & 0x00FF) << 8; } static OF_INLINE uint32_t OF_CONST_FUNC -OF_BSWAP32_CONST(uint32_t i) +OFByteSwap32Const(uint32_t i) { return (i & 0xFF000000) >> 24 | (i & 0x00FF0000) >> 8 | (i & 0x0000FF00) << 8 | (i & 0x000000FF) << 24; } static OF_INLINE uint64_t OF_CONST_FUNC -OF_BSWAP64_CONST(uint64_t i) +OFByteSwap64Const(uint64_t i) { return (i & 0xFF00000000000000) >> 56 | (i & 0x00FF000000000000) >> 40 | (i & 0x0000FF0000000000) >> 24 | (i & 0x000000FF00000000) >> 8 | (i & 0x00000000FF000000) << 8 | (i & 0x0000000000FF0000) << 24 | (i & 0x000000000000FF00) << 40 | (i & 0x00000000000000FF) << 56; } static OF_INLINE uint16_t OF_CONST_FUNC -OF_BSWAP16_NONCONST(uint16_t i) +OFByteSwap16NonConst(uint16_t i) { #if defined(OF_HAVE_BUILTIN_BSWAP16) return __builtin_bswap16(i); #elif (defined(OF_X86_64) || defined(OF_X86)) && defined(__GNUC__) __asm__ ( @@ -468,11 +461,11 @@ #endif return i; } static OF_INLINE uint32_t OF_CONST_FUNC -OF_BSWAP32_NONCONST(uint32_t i) +OFByteSwap32NonConst(uint32_t i) { #if defined(OF_HAVE_BUILTIN_BSWAP32) return __builtin_bswap32(i); #elif (defined(OF_X86_64) || defined(OF_X86)) && defined(__GNUC__) __asm__ ( @@ -500,11 +493,11 @@ #endif return i; } static OF_INLINE uint64_t OF_CONST_FUNC -OF_BSWAP64_NONCONST(uint64_t i) +OFByteSwap64NonConst(uint64_t i) { #if defined(OF_HAVE_BUILTIN_BSWAP64) return __builtin_bswap64(i); #elif defined(OF_X86_64) && defined(__GNUC__) __asm__ ( @@ -519,359 +512,194 @@ "xchgl %%eax, %%edx" : "=A"(i) : "0"(i) ); #else - i = (uint64_t)OF_BSWAP32_NONCONST((uint32_t)(i & 0xFFFFFFFF)) << 32 | - OF_BSWAP32_NONCONST((uint32_t)(i >> 32)); + i = (uint64_t)OFByteSwap32NonConst((uint32_t)(i & 0xFFFFFFFF)) << 32 | + OFByteSwap32NonConst((uint32_t)(i >> 32)); #endif return i; } #ifdef __GNUC__ -# define OF_BSWAP16(i) \ - (__builtin_constant_p(i) ? OF_BSWAP16_CONST(i) : OF_BSWAP16_NONCONST(i)) -# define OF_BSWAP32(i) \ - (__builtin_constant_p(i) ? OF_BSWAP32_CONST(i) : OF_BSWAP32_NONCONST(i)) -# define OF_BSWAP64(i) \ - (__builtin_constant_p(i) ? OF_BSWAP64_CONST(i) : OF_BSWAP64_NONCONST(i)) +# define OFByteSwap16(i) \ + (__builtin_constant_p(i) ? OFByteSwap16Const(i) : OFByteSwap16NonConst(i)) +# define OFByteSwap32(i) \ + (__builtin_constant_p(i) ? OFByteSwap32Const(i) : OFByteSwap32NonConst(i)) +# define OFByteSwap64(i) \ + (__builtin_constant_p(i) ? OFByteSwap64Const(i) : OFByteSwap64NonConst(i)) #else -# define OF_BSWAP16(i) OF_BSWAP16_CONST(i) -# define OF_BSWAP32(i) OF_BSWAP32_CONST(i) -# define OF_BSWAP64(i) OF_BSWAP64_CONST(i) +# define OFByteSwap16(i) OFByteSwap16Const(i) +# define OFByteSwap32(i) OFByteSwap32Const(i) +# define OFByteSwap64(i) OFByteSwap64Const(i) #endif static OF_INLINE uint32_t -OF_FLOAT_TO_INT_RAW(float f) +OFFloatToRawUInt32(float f) { uint32_t ret; memcpy(&ret, &f, 4); return ret; } static OF_INLINE float -OF_INT_TO_FLOAT_RAW(uint32_t uInt32) +OFRawUInt32ToFloat(uint32_t uInt32) { float ret; memcpy(&ret, &uInt32, 4); return ret; } static OF_INLINE uint64_t -OF_DOUBLE_TO_INT_RAW(double d) +OFDoubleToRawUInt64(double d) { uint64_t ret; memcpy(&ret, &d, 8); return ret; } static OF_INLINE double -OF_INT_TO_DOUBLE_RAW(uint64_t uInt64) +OFRawUInt64ToDouble(uint64_t uInt64) { double ret; memcpy(&ret, &uInt64, 8); return ret; } static OF_INLINE float OF_CONST_FUNC -OF_BSWAP_FLOAT(float f) +OFByteSwapFloat(float f) { - return OF_INT_TO_FLOAT_RAW(OF_BSWAP32(OF_FLOAT_TO_INT_RAW(f))); + return OFRawUInt32ToFloat(OFByteSwap32(OFFloatToRawUInt32(f))); } static OF_INLINE double OF_CONST_FUNC -OF_BSWAP_DOUBLE(double d) +OFByteSwapDouble(double d) { - return OF_INT_TO_DOUBLE_RAW(OF_BSWAP64(OF_DOUBLE_TO_INT_RAW(d))); + return OFRawUInt64ToDouble(OFByteSwap64(OFDoubleToRawUInt64(d))); } #ifdef OF_BIG_ENDIAN -# define OF_BSWAP16_IF_BE(i) OF_BSWAP16(i) -# define OF_BSWAP32_IF_BE(i) OF_BSWAP32(i) -# define OF_BSWAP64_IF_BE(i) OF_BSWAP64(i) -# define OF_BSWAP16_IF_LE(i) (i) -# define OF_BSWAP32_IF_LE(i) (i) -# define OF_BSWAP64_IF_LE(i) (i) +# define OFFromBigEndian16(i) (i) +# define OFFromBigEndian32(i) (i) +# define OFFromBigEndian64(i) (i) +# define OFFromLittleEndian16(i) OFByteSwap16(i) +# define OFFromLittleEndian32(i) OFByteSwap32(i) +# define OFFromLittleEndian64(i) OFByteSwap64(i) +# define OFToBigEndian16(i) (i) +# define OFToBigEndian32(i) (i) +# define OFToBigEndian64(i) (i) +# define OFToLittleEndian16(i) OFByteSwap16(i) +# define OFToLittleEndian32(i) OFByteSwap32(i) +# define OFToLittleEndian64(i) OFByteSwap64(i) #else -# define OF_BSWAP16_IF_BE(i) (i) -# define OF_BSWAP32_IF_BE(i) (i) -# define OF_BSWAP64_IF_BE(i) (i) -# define OF_BSWAP16_IF_LE(i) OF_BSWAP16(i) -# define OF_BSWAP32_IF_LE(i) OF_BSWAP32(i) -# define OF_BSWAP64_IF_LE(i) OF_BSWAP64(i) +# define OFFromBigEndian16(i) OFByteSwap16(i) +# define OFFromBigEndian32(i) OFByteSwap32(i) +# define OFFromBigEndian64(i) OFByteSwap64(i) +# define OFFromLittleEndian16(i) (i) +# define OFFromLittleEndian32(i) (i) +# define OFFromLittleEndian64(i) (i) +# define OFToBigEndian16(i) OFByteSwap16(i) +# define OFToBigEndian32(i) OFByteSwap32(i) +# define OFToBigEndian64(i) OFByteSwap64(i) +# define OFToLittleEndian16(i) (i) +# define OFToLittleEndian32(i) (i) +# define OFToLittleEndian64(i) (i) #endif #ifdef OF_FLOAT_BIG_ENDIAN -# define OF_BSWAP_FLOAT_IF_BE(i) OF_BSWAP_FLOAT(i) -# define OF_BSWAP_DOUBLE_IF_BE(i) OF_BSWAP_DOUBLE(i) -# define OF_BSWAP_FLOAT_IF_LE(i) (i) -# define OF_BSWAP_DOUBLE_IF_LE(i) (i) +# define OFFromBigEndianFloat(f) (f) +# define OFFromBigEndianDouble(d) (d) +# define OFFromLittleEndianFloat(f) OFByteSwapFloat(f) +# define OFFromLittleEndianDouble(i) OFByteSwapDouble(d) +# define OFToBigEndianFloat(f) (f) +# define OFToBigEndianDouble(d) (d) +# define OFToLittleEndianFloat(f) OFByteSwapFloat(f) +# define OFToLittleEndianDouble(i) OFByteSwapDouble(d) #else -# define OF_BSWAP_FLOAT_IF_BE(i) (i) -# define OF_BSWAP_DOUBLE_IF_BE(i) (i) -# define OF_BSWAP_FLOAT_IF_LE(i) OF_BSWAP_FLOAT(i) -# define OF_BSWAP_DOUBLE_IF_LE(i) OF_BSWAP_DOUBLE(i) +# define OFFromBigEndianFloat(f) OFByteSwapFloat(f) +# define OFFromBigEndianDouble(d) OFByteSwapDouble(d) +# define OFFromLittleEndianFloat(f) (f) +# define OFFromLittleEndianDouble(d) (d) +# define OFToBigEndianFloat(f) OFByteSwapFloat(f) +# define OFToBigEndianDouble(d) OFByteSwapDouble(d) +# define OFToLittleEndianFloat(f) (f) +# define OFToLittleEndianDouble(d) (d) #endif -static OF_INLINE uint16_t -of_be16_ptr_read(void *_Nonnull ptr) -{ - uint16_t value; - memcpy(&value, ptr, sizeof(value)); - return OF_BSWAP16_IF_LE(value); -} - -static OF_INLINE uint32_t -of_be32_ptr_read(void *_Nonnull ptr) -{ - uint32_t value; - memcpy(&value, ptr, sizeof(value)); - return OF_BSWAP32_IF_LE(value); -} - -static OF_INLINE uint64_t -of_be64_ptr_read(void *_Nonnull ptr) -{ - uint64_t value; - memcpy(&value, ptr, sizeof(value)); - return OF_BSWAP64_IF_LE(value); -} - -static OF_INLINE float -of_be_float_ptr_read(void *_Nonnull ptr) -{ - float value; - memcpy(&value, ptr, sizeof(value)); - return OF_BSWAP_FLOAT_IF_LE(value); -} - -static OF_INLINE double -of_be_double_ptr_read(void *_Nonnull ptr) -{ - double value; - memcpy(&value, ptr, sizeof(value)); - return OF_BSWAP_DOUBLE_IF_LE(value); -} - -static OF_INLINE uint16_t -of_le16_ptr_read(void *_Nonnull ptr) -{ - uint16_t value; - memcpy(&value, ptr, sizeof(value)); - return OF_BSWAP16_IF_BE(value); -} - -static OF_INLINE uint32_t -of_le32_ptr_read(void *_Nonnull ptr) -{ - uint32_t value; - memcpy(&value, ptr, sizeof(value)); - return OF_BSWAP32_IF_BE(value); -} - -static OF_INLINE uint64_t -of_le64_ptr_read(void *_Nonnull ptr) -{ - uint64_t value; - memcpy(&value, ptr, sizeof(value)); - return OF_BSWAP64_IF_BE(value); -} - -static OF_INLINE float -of_le_float_ptr_read(void *_Nonnull ptr) -{ - float value; - memcpy(&value, ptr, sizeof(value)); - return OF_BSWAP_FLOAT_IF_BE(value); -} - -static OF_INLINE double -of_le_double_ptr_read(void *_Nonnull ptr) -{ - double value; - memcpy(&value, ptr, sizeof(value)); - return OF_BSWAP_DOUBLE_IF_BE(value); -} - -static OF_INLINE void -of_be16_ptr_write(void *_Nonnull ptr, uint16_t value) -{ - value = OF_BSWAP16_IF_LE(value); - memcpy(ptr, &value, sizeof(value)); -} - -static OF_INLINE void -of_be32_ptr_write(void *_Nonnull ptr, uint32_t value) -{ - value = OF_BSWAP32_IF_LE(value); - memcpy(ptr, &value, sizeof(value)); -} - -static OF_INLINE void -of_be64_ptr_write(void *_Nonnull ptr, uint64_t value) -{ - value = OF_BSWAP64_IF_LE(value); - memcpy(ptr, &value, sizeof(value)); -} - -static OF_INLINE void -of_be_float_ptr_write(void *_Nonnull ptr, float value) -{ - value = OF_BSWAP_FLOAT_IF_LE(value); - memcpy(ptr, &value, sizeof(value)); -} - -static OF_INLINE void -of_be_double_ptr_write(void *_Nonnull ptr, double value) -{ - value = OF_BSWAP_DOUBLE_IF_LE(value); - memcpy(ptr, &value, sizeof(value)); -} - -static OF_INLINE void -of_le16_ptr_write(void *_Nonnull ptr, uint16_t value) -{ - value = OF_BSWAP16_IF_BE(value); - memcpy(ptr, &value, sizeof(value)); -} - -static OF_INLINE void -of_le32_ptr_write(void *_Nonnull ptr, uint32_t value) -{ - value = OF_BSWAP32_IF_BE(value); - memcpy(ptr, &value, sizeof(value)); -} - -static OF_INLINE void -of_le64_ptr_write(void *_Nonnull ptr, uint64_t value) -{ - value = OF_BSWAP64_IF_BE(value); - memcpy(ptr, &value, sizeof(value)); -} - -static OF_INLINE void -of_le_float_ptr_write(void *_Nonnull ptr, float value) -{ - value = OF_BSWAP_FLOAT_IF_BE(value); - memcpy(ptr, &value, sizeof(value)); -} - -static OF_INLINE void -of_le_double_ptr_write(void *_Nonnull ptr, double value) -{ - value = OF_BSWAP_DOUBLE_IF_BE(value); - memcpy(ptr, &value, sizeof(value)); -} - -#define OF_ROL(value, bits) \ +#define OFRotateLeft(value, bits) \ (((bits) % (sizeof(value) * 8)) > 0 \ ? ((value) << ((bits) % (sizeof(value) * 8))) | \ ((value) >> (sizeof(value) * 8 - ((bits) % (sizeof(value) * 8)))) \ : (value)) -#define OF_ROR(value, bits) \ +#define OFRotateRight(value, bits) \ (((bits) % (sizeof(value) * 8)) > 0 \ ? ((value) >> ((bits) % (sizeof(value) * 8))) | \ ((value) << (sizeof(value) * 8 - ((bits) % (sizeof(value) * 8)))) \ : (value)) -#define OF_ROUND_UP_POW2(pow2, value) (((value) + (pow2) - 1) & ~((pow2) - 1)) - -#define OF_HASH_INIT(hash) hash = of_hash_seed; -#define OF_HASH_ADD(hash, byte) \ - { \ - hash += (uint8_t)(byte); \ - hash += (hash << 10); \ - hash ^= (hash >> 6); \ - } -#define OF_HASH_FINALIZE(hash) \ - { \ - hash += (hash << 3); \ - hash ^= (hash >> 11); \ - hash += (hash << 15); \ - } -#define OF_HASH_ADD_HASH(hash, other) \ - { \ - uint32_t otherCopy = (uint32_t)other; \ - OF_HASH_ADD(hash, (otherCopy >> 24) & 0xFF); \ - OF_HASH_ADD(hash, (otherCopy >> 16) & 0xFF); \ - OF_HASH_ADD(hash, (otherCopy >> 8) & 0xFF); \ - OF_HASH_ADD(hash, otherCopy & 0xFF); \ - } +#define OFRoundUpToPowerOf2(pow2, value) \ + (((value) + (pow2) - 1) & ~((pow2) - 1)) static OF_INLINE bool -of_bitset_isset(unsigned char *_Nonnull storage, size_t idx) +OFBitsetIsSet(unsigned char *_Nonnull storage, size_t idx) { return storage[idx / CHAR_BIT] & (1u << (idx % CHAR_BIT)); } static OF_INLINE void -of_bitset_set(unsigned char *_Nonnull storage, size_t idx) +OFBitsetSet(unsigned char *_Nonnull storage, size_t idx) { storage[idx / CHAR_BIT] |= (1u << (idx % CHAR_BIT)); } static OF_INLINE void -of_bitset_clear(unsigned char *_Nonnull storage, size_t idx) +OFBitsetClear(unsigned char *_Nonnull storage, size_t idx) { storage[idx / CHAR_BIT] &= ~(1u << (idx % CHAR_BIT)); } -static OF_INLINE char *_Nullable -of_strdup(const char *_Nonnull string) -{ - char *copy; - size_t length = strlen(string); - - if ((copy = (char *)malloc(length + 1)) == NULL) - return NULL; - - memcpy(copy, string, length + 1); - - return copy; -} - static OF_INLINE void -of_explicit_memset(void *_Nonnull buffer_, int character, size_t length) +OFZeroMemory(void *_Nonnull buffer_, size_t length) { volatile unsigned char *buffer = (volatile unsigned char *)buffer_; while (buffer < (unsigned char *)buffer_ + length) - *buffer++ = character; + *buffer++ = '\0'; } static OF_INLINE bool -of_ascii_isalpha(char c) +OFASCIIIsAlpha(char c) { return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')); } static OF_INLINE bool -of_ascii_isdigit(char c) +OFASCIIIsDigit(char c) { return (c >= '0' && c <= '9'); } static OF_INLINE bool -of_ascii_isalnum(char c) +OFASCIIIsAlnum(char c) { - return (of_ascii_isalpha(c) || of_ascii_isdigit(c)); + return (OFASCIIIsAlpha(c) || OFASCIIIsDigit(c)); } static OF_INLINE bool -of_ascii_isspace(char c) +OFASCIIIsSpace(char c) { return (c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '\f' || c == '\v'); } static OF_INLINE char -of_ascii_toupper(char c) +OFASCIIToUpper(char c) { return (c >= 'a' && c <= 'z' ? 'A' + (c - 'a') : c); } static OF_INLINE char -of_ascii_tolower(char c) +OFASCIIToLower(char c) { return (c >= 'A' && c <= 'Z' ? 'a' + (c - 'A') : c); } #endif Index: src/module.modulemap ================================================================== --- src/module.modulemap +++ src/module.modulemap @@ -1,16 +1,16 @@ framework module ObjFW { umbrella header "ObjFW.h" /* - * These are included by atomic.h, but should never be included + * These are included by OFAtomic.h, but should never be included * directly. */ - exclude header "atomic_builtins.h" - exclude header "atomic_no_threads.h" - exclude header "atomic_osatomic.h" - exclude header "atomic_powerpc.h" - exclude header "atomic_sync_builtins.h" - exclude header "atomic_x86.h" + exclude header "OFAtomic_builtins.h" + exclude header "OFAtomic_no_threads.h" + exclude header "OFAtomic_osatomic.h" + exclude header "OFAtomic_powerpc.h" + exclude header "OFAtomic_sync_builtins.h" + exclude header "OFAtomic_x86.h" export * } DELETED src/mutex.h Index: src/mutex.h ================================================================== --- src/mutex.h +++ src/mutex.h @@ -1,171 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "objfw-defs.h" - -#include - -#include "platform.h" - -#if !defined(OF_HAVE_THREADS) || \ - (!defined(OF_HAVE_PTHREADS) && !defined(OF_WINDOWS) && !defined(OF_AMIGAOS)) -# error No mutexes available! -#endif - -#import "macros.h" - -#if defined(OF_HAVE_PTHREADS) -# include -typedef pthread_mutex_t of_mutex_t; -#elif defined(OF_WINDOWS) -# include -typedef CRITICAL_SECTION of_mutex_t; -#elif defined(OF_AMIGAOS) -# include -typedef struct SignalSemaphore of_mutex_t; -#endif - -#if defined(OF_HAVE_ATOMIC_OPS) -# import "atomic.h" -typedef volatile int of_spinlock_t; -# define OF_SPINCOUNT 10 -#elif defined(OF_HAVE_PTHREAD_SPINLOCKS) -typedef pthread_spinlock_t of_spinlock_t; -#else -typedef of_mutex_t of_spinlock_t; -#endif - -#ifdef OF_HAVE_SCHED_YIELD -# include -#endif - -#if defined(OF_HAVE_RECURSIVE_PTHREAD_MUTEXES) || defined(OF_WINDOWS) || \ - defined(OF_AMIGAOS) -# define of_rmutex_t of_mutex_t -#else -# import "tlskey.h" -typedef struct { - of_mutex_t mutex; - of_tlskey_t count; -} of_rmutex_t; -#endif - -#ifdef __cplusplus -extern "C" { -#endif -extern int of_mutex_new(of_mutex_t *mutex); -extern int of_mutex_lock(of_mutex_t *mutex); -extern int of_mutex_trylock(of_mutex_t *mutex); -extern int of_mutex_unlock(of_mutex_t *mutex); -extern int of_mutex_free(of_mutex_t *mutex); -extern int of_rmutex_new(of_rmutex_t *rmutex); -extern int of_rmutex_lock(of_rmutex_t *rmutex); -extern int of_rmutex_trylock(of_rmutex_t *rmutex); -extern int of_rmutex_unlock(of_rmutex_t *rmutex); -extern int of_rmutex_free(of_rmutex_t *rmutex); -#ifdef __cplusplus -} -#endif - -/* Spinlocks are inlined for performance. */ - -static OF_INLINE void -of_thread_yield(void) -{ -#if defined(OF_HAVE_SCHED_YIELD) - sched_yield(); -#elif defined(OF_WINDOWS) - Sleep(0); -#endif -} - -static OF_INLINE int -of_spinlock_new(of_spinlock_t *spinlock) -{ -#if defined(OF_HAVE_ATOMIC_OPS) - *spinlock = 0; - return 0; -#elif defined(OF_HAVE_PTHREAD_SPINLOCKS) - return pthread_spin_init(spinlock, 0); -#else - return of_mutex_new(spinlock); -#endif -} - -static OF_INLINE int -of_spinlock_trylock(of_spinlock_t *spinlock) -{ -#if defined(OF_HAVE_ATOMIC_OPS) - if (of_atomic_int_cmpswap(spinlock, 0, 1)) { - of_memory_barrier_acquire(); - return 0; - } - - return EBUSY; -#elif defined(OF_HAVE_PTHREAD_SPINLOCKS) - return pthread_spin_trylock(spinlock); -#else - return of_mutex_trylock(spinlock); -#endif -} - -static OF_INLINE int -of_spinlock_lock(of_spinlock_t *spinlock) -{ -#if defined(OF_HAVE_ATOMIC_OPS) - size_t i; - - for (i = 0; i < OF_SPINCOUNT; i++) - if (of_spinlock_trylock(spinlock) == 0) - return 0; - - while (of_spinlock_trylock(spinlock) == EBUSY) - of_thread_yield(); - - return 0; -#elif defined(OF_HAVE_PTHREAD_SPINLOCKS) - return pthread_spin_lock(spinlock); -#else - return of_mutex_lock(spinlock); -#endif -} - -static OF_INLINE int -of_spinlock_unlock(of_spinlock_t *spinlock) -{ -#if defined(OF_HAVE_ATOMIC_OPS) - bool ret = of_atomic_int_cmpswap(spinlock, 1, 0); - - of_memory_barrier_release(); - - return (ret ? 0 : EINVAL); -#elif defined(OF_HAVE_PTHREAD_SPINLOCKS) - return pthread_spin_unlock(spinlock); -#else - return of_mutex_unlock(spinlock); -#endif -} - -static OF_INLINE int -of_spinlock_free(of_spinlock_t *spinlock) -{ -#if defined(OF_HAVE_ATOMIC_OPS) - return 0; -#elif defined(OF_HAVE_PTHREAD_SPINLOCKS) - return pthread_spin_destroy(spinlock); -#else - return of_mutex_free(spinlock); -#endif -} DELETED src/mutex.m Index: src/mutex.m ================================================================== --- src/mutex.m +++ src/mutex.m @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#include "platform.h" - -#if defined(OF_HAVE_PTHREADS) -# include "platform/posix/mutex.m" -#elif defined(OF_WINDOWS) -# include "platform/windows/mutex.m" -#elif defined(OF_AMIGAOS) -# include "platform/amiga/mutex.m" -#endif DELETED src/of_asprintf.h Index: src/of_asprintf.h ================================================================== --- src/of_asprintf.h +++ src/of_asprintf.h @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#ifndef __STDC_LIMIT_MACROS -# define __STDC_LIMIT_MACROS -#endif -#ifndef __STDC_CONSTANT_MACROS -# define __STDC_CONSTANT_MACROS -#endif - -#include - -#import "macros.h" - -OF_ASSUME_NONNULL_BEGIN - -#ifdef __cplusplus -extern "C" { -#endif -extern int of_asprintf( - char *_Nullable *_Nonnull, const char *_Nonnull, ...); -extern int of_vasprintf( - char *_Nullable *_Nonnull, const char *_Nonnull, va_list); -#ifdef __cplusplus -} -#endif - -OF_ASSUME_NONNULL_END DELETED src/of_asprintf.m Index: src/of_asprintf.m ================================================================== --- src/of_asprintf.m +++ src/of_asprintf.m @@ -1,796 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#include -#include -#include -#include -#include - -#ifdef HAVE_WCHAR_H -# include -#endif - -#ifdef HAVE_ASPRINTF_L -# include -#endif -#ifdef HAVE_XLOCALE_H -# include -#endif - -#ifdef OF_HAVE_SYS_TYPES_H -# include -#endif - -#import "OFString.h" -#import "OFLocale.h" - -#import "OFInitializationFailedException.h" - -#define MAX_SUBFORMAT_LEN 64 - -#ifndef HAVE_ASPRINTF -/* - * (v)asprintf might be declared, but HAVE_ASPRINTF not defined because - * configure determined it is broken. In this case, we must make sure there is - * no name clash. - */ -# define asprintf asprintf_ -# define vasprintf vasprintf_ -#endif - -struct context { - const char *format; - size_t formatLen; - char subformat[MAX_SUBFORMAT_LEN + 1]; - size_t subformatLen; - va_list arguments; - char *buffer; - size_t bufferLen; - size_t i, last; - enum { - STATE_STRING, - STATE_FORMAT_FLAGS, - STATE_FORMAT_FIELD_WIDTH, - STATE_FORMAT_LENGTH_MODIFIER, - STATE_FORMAT_CONVERSION_SPECIFIER - } state; - enum { - LENGTH_MODIFIER_NONE, - LENGTH_MODIFIER_HH, - LENGTH_MODIFIER_H, - LENGTH_MODIFIER_L, - LENGTH_MODIFIER_LL, - LENGTH_MODIFIER_J, - LENGTH_MODIFIER_Z, - LENGTH_MODIFIER_T, - LENGTH_MODIFIER_CAPITAL_L - } lengthModifier; - bool useLocale; -}; - -#ifdef HAVE_ASPRINTF_L -static locale_t cLocale; - -OF_CONSTRUCTOR() -{ - if ((cLocale = newlocale(LC_ALL_MASK, "C", NULL)) == NULL) - @throw [OFInitializationFailedException exception]; -} -#endif - -#ifndef HAVE_ASPRINTF -static int -vasprintf(char **string, const char *format, va_list arguments) -{ - int length; - size_t bufferLength = 128; - - *string = NULL; - - for (;;) { - free(*string); - - if ((*string = malloc(bufferLength)) == NULL) - return -1; - - length = vsnprintf(*string, bufferLength - 1, format, - arguments); - - if (length >= 0 && (size_t)length < bufferLength - 1) - break; - - if (bufferLength > INT_MAX / 2) { - free(*string); - return -1; - } - - bufferLength <<= 1; - } - - if (length > 0 && (size_t)length != bufferLength - 1) { - char *resized = realloc(*string, length + 1); - - /* Ignore if making it smaller failed. */ - if (resized != NULL) - *string = resized; - } - - return length; -} - -static int -asprintf(char **string, const char *format, ...) -{ - int ret; - va_list arguments; - - va_start(arguments, format); - ret = vasprintf(string, format, arguments); - va_end(arguments); - - return ret; -} -#endif - -static bool -appendString(struct context *ctx, const char *append, size_t appendLen) -{ - char *newBuf; - - if (appendLen == 0) - return true; - - if ((newBuf = realloc(ctx->buffer, - ctx->bufferLen + appendLen + 1)) == NULL) - return false; - - memcpy(newBuf + ctx->bufferLen, append, appendLen); - - ctx->buffer = newBuf; - ctx->bufferLen += appendLen; - - return true; -} - -static bool -appendSubformat(struct context *ctx, const char *subformat, - size_t subformatLen) -{ - if (ctx->subformatLen + subformatLen > MAX_SUBFORMAT_LEN) - return false; - - memcpy(ctx->subformat + ctx->subformatLen, subformat, subformatLen); - ctx->subformatLen += subformatLen; - ctx->subformat[ctx->subformatLen] = 0; - - return true; -} - -static bool -stringState(struct context *ctx) -{ - if (ctx->format[ctx->i] == '%') { - if (ctx->i > 0) - if (!appendString(ctx, ctx->format + ctx->last, - ctx->i - ctx->last)) - return false; - - if (!appendSubformat(ctx, ctx->format + ctx->i, 1)) - return false; - - ctx->last = ctx->i + 1; - ctx->state = STATE_FORMAT_FLAGS; - } - - return true; -} - -static bool -formatFlagsState(struct context *ctx) -{ - switch (ctx->format[ctx->i]) { - case '-': - case '+': - case ' ': - case '#': - case '0': - if (!appendSubformat(ctx, ctx->format + ctx->i, 1)) - return false; - - break; - case ',': - /* ObjFW extension: Use decimal point from locale */ - ctx->useLocale = true; - break; - default: - ctx->state = STATE_FORMAT_FIELD_WIDTH; - ctx->i--; - - break; - } - - return true; -} - -static bool -formatFieldWidthState(struct context *ctx) -{ - if ((ctx->format[ctx->i] >= '0' && ctx->format[ctx->i] <= '9') || - ctx->format[ctx->i] == '*' || ctx->format[ctx->i] == '.') { - if (!appendSubformat(ctx, ctx->format + ctx->i, 1)) - return false; - } else { - ctx->state = STATE_FORMAT_LENGTH_MODIFIER; - ctx->i--; - } - - return true; -} - -static bool -formatLengthModifierState(struct context *ctx) -{ - /* Only one allowed */ - switch (ctx->format[ctx->i]) { - case 'h': /* and also hh */ - if (ctx->formatLen > ctx->i + 1 && - ctx->format[ctx->i + 1] == 'h') { - if (!appendSubformat(ctx, ctx->format + ctx->i, 2)) - return false; - - ctx->i++; - ctx->lengthModifier = LENGTH_MODIFIER_HH; - } else { - if (!appendSubformat(ctx, ctx->format + ctx->i, 1)) - return false; - - ctx->lengthModifier = LENGTH_MODIFIER_H; - } - - break; - case 'l': /* and also ll */ - if (ctx->formatLen > ctx->i + 1 && - ctx->format[ctx->i + 1] == 'l') { -#ifndef OF_WINDOWS - if (!appendSubformat(ctx, ctx->format + ctx->i, 2)) - return false; -#else - if (!appendSubformat(ctx, "I64", 3)) - return false; -#endif - - ctx->i++; - ctx->lengthModifier = LENGTH_MODIFIER_LL; - } else { - if (!appendSubformat(ctx, ctx->format + ctx->i, 1)) - return false; - - ctx->lengthModifier = LENGTH_MODIFIER_L; - } - - break; - case 'j': -#if defined(OF_WINDOWS) - if (!appendSubformat(ctx, "I64", 3)) - return false; -#elif defined(_NEWLIB_VERSION) || defined(OF_HPUX) - if (!appendSubformat(ctx, "ll", 2)) - return false; -#else - if (!appendSubformat(ctx, ctx->format + ctx->i, 1)) - return false; -#endif - - ctx->lengthModifier = LENGTH_MODIFIER_J; - - break; - case 'z': -#if defined(OF_WINDOWS) - if (sizeof(size_t) == 8) - if (!appendSubformat(ctx, "I64", 3)) - return false; -#elif defined(_NEWLIB_VERSION) || defined(OF_HPUX) - if (!appendSubformat(ctx, "l", 1)) - return false; -#else - if (!appendSubformat(ctx, ctx->format + ctx->i, 1)) - return false; -#endif - - ctx->lengthModifier = LENGTH_MODIFIER_Z; - - break; - case 't': -#if defined(OF_WINDOWS) - if (sizeof(ptrdiff_t) == 8) - if (!appendSubformat(ctx, "I64", 3)) - return false; -#elif defined(_NEWLIB_VERSION) || defined(OF_HPUX) - if (!appendSubformat(ctx, "l", 1)) - return false; -#else - if (!appendSubformat(ctx, ctx->format + ctx->i, 1)) - return false; -#endif - - ctx->lengthModifier = LENGTH_MODIFIER_T; - - break; - case 'L': - if (!appendSubformat(ctx, ctx->format + ctx->i, 1)) - return false; - - ctx->lengthModifier = LENGTH_MODIFIER_CAPITAL_L; - - break; -#ifdef OF_WINDOWS - case 'I': /* win32 strangeness (I64 instead of ll or j) */ - if (ctx->formatLen > ctx->i + 2 && - ctx->format[ctx->i + 1] == '6' && - ctx->format[ctx->i + 2] == '4') { - if (!appendSubformat(ctx, ctx->format + ctx->i, 3)) - return false; - - ctx->i += 2; - ctx->lengthModifier = LENGTH_MODIFIER_LL; - } else - ctx->i--; - - break; -#endif -#ifdef OF_IOS - case 'q': /* iOS uses this for PRI?64 */ - if (!appendSubformat(ctx, ctx->format + ctx->i, 1)) - return false; - - ctx->lengthModifier = LENGTH_MODIFIER_LL; - - break; -#endif - default: - ctx->i--; - - break; - } - - ctx->state = STATE_FORMAT_CONVERSION_SPECIFIER; - return true; -} - -static bool -formatConversionSpecifierState(struct context *ctx) -{ - char *tmp = NULL; - int tmpLen = 0; -#ifndef HAVE_ASPRINTF_L - OFString *point; -#endif - - if (!appendSubformat(ctx, ctx->format + ctx->i, 1)) - return false; - - switch (ctx->format[ctx->i]) { - case '@': - if (ctx->lengthModifier != LENGTH_MODIFIER_NONE) - return false; - - ctx->subformat[ctx->subformatLen - 1] = 's'; - - @try { - id object; - - if ((object = va_arg(ctx->arguments, id)) != nil) { - void *pool = objc_autoreleasePoolPush(); - - tmpLen = asprintf(&tmp, ctx->subformat, - [object description].UTF8String); - - objc_autoreleasePoolPop(pool); - } else - tmpLen = asprintf(&tmp, ctx->subformat, - "(nil)"); - } @catch (id e) { - free(ctx->buffer); - @throw e; - } - - break; - case 'C': - if (ctx->lengthModifier != LENGTH_MODIFIER_NONE) - return false; - - ctx->subformat[ctx->subformatLen - 1] = 's'; - - { - char buffer[5]; - size_t len = of_string_utf8_encode( - va_arg(ctx->arguments, of_unichar_t), buffer); - - if (len == 0) - return false; - - buffer[len] = 0; - tmpLen = asprintf(&tmp, ctx->subformat, buffer); - } - - break; - case 'S': - if (ctx->lengthModifier != LENGTH_MODIFIER_NONE) - return false; - - ctx->subformat[ctx->subformatLen - 1] = 's'; - - { - const of_unichar_t *arg = - va_arg(ctx->arguments, const of_unichar_t *); - size_t j, len = of_string_utf32_length(arg); - char *buffer; - - if (SIZE_MAX / 4 < len || (SIZE_MAX / 4) - len < 1) - return false; - - if ((buffer = malloc((len * 4) + 1)) == NULL) - return false; - - j = 0; - for (size_t i = 0; i < len; i++) { - size_t clen = of_string_utf8_encode(arg[i], - buffer + j); - - if (clen == 0) { - free(buffer); - return false; - } - - j += clen; - } - buffer[j] = 0; - - tmpLen = asprintf(&tmp, ctx->subformat, buffer); - - free(buffer); - } - - break; - case 'd': - case 'i': - switch (ctx->lengthModifier) { - case LENGTH_MODIFIER_NONE: - case LENGTH_MODIFIER_HH: - case LENGTH_MODIFIER_H: - tmpLen = asprintf(&tmp, ctx->subformat, - va_arg(ctx->arguments, int)); - break; - case LENGTH_MODIFIER_L: - tmpLen = asprintf(&tmp, ctx->subformat, - va_arg(ctx->arguments, long)); - break; - case LENGTH_MODIFIER_LL: - tmpLen = asprintf(&tmp, ctx->subformat, - va_arg(ctx->arguments, long long)); - break; - case LENGTH_MODIFIER_J: - tmpLen = asprintf(&tmp, ctx->subformat, - va_arg(ctx->arguments, intmax_t)); - break; - case LENGTH_MODIFIER_Z: - tmpLen = asprintf(&tmp, ctx->subformat, - va_arg(ctx->arguments, ssize_t)); - break; - case LENGTH_MODIFIER_T: - tmpLen = asprintf(&tmp, ctx->subformat, - va_arg(ctx->arguments, ptrdiff_t)); - break; - default: - return false; - } - - break; - case 'o': - case 'u': - case 'x': - case 'X': - switch (ctx->lengthModifier) { - case LENGTH_MODIFIER_NONE: - case LENGTH_MODIFIER_HH: - case LENGTH_MODIFIER_H: - tmpLen = asprintf(&tmp, ctx->subformat, - va_arg(ctx->arguments, unsigned int)); - break; - case LENGTH_MODIFIER_L: - tmpLen = asprintf(&tmp, ctx->subformat, - va_arg(ctx->arguments, unsigned long)); - break; - case LENGTH_MODIFIER_LL: - tmpLen = asprintf(&tmp, ctx->subformat, - va_arg(ctx->arguments, unsigned long long)); - break; - case LENGTH_MODIFIER_J: - tmpLen = asprintf(&tmp, ctx->subformat, - va_arg(ctx->arguments, uintmax_t)); - break; - case LENGTH_MODIFIER_Z: - tmpLen = asprintf(&tmp, ctx->subformat, - va_arg(ctx->arguments, size_t)); - break; - case LENGTH_MODIFIER_T: - tmpLen = asprintf(&tmp, ctx->subformat, - va_arg(ctx->arguments, ptrdiff_t)); - break; - default: - return false; - } - - break; - case 'f': - case 'F': - case 'e': - case 'E': - case 'g': - case 'G': - case 'a': - case 'A': - switch (ctx->lengthModifier) { - case LENGTH_MODIFIER_NONE: - case LENGTH_MODIFIER_L: -#ifdef HAVE_ASPRINTF_L - if (!ctx->useLocale) - tmpLen = asprintf_l(&tmp, cLocale, - ctx->subformat, - va_arg(ctx->arguments, double)); - else -#endif - tmpLen = asprintf(&tmp, ctx->subformat, - va_arg(ctx->arguments, double)); - break; - case LENGTH_MODIFIER_CAPITAL_L: -#ifdef HAVE_ASPRINTF_L - if (!ctx->useLocale) - tmpLen = asprintf_l(&tmp, cLocale, - ctx->subformat, - va_arg(ctx->arguments, long double)); - else -#endif - tmpLen = asprintf(&tmp, ctx->subformat, - va_arg(ctx->arguments, long double)); - break; - default: - return false; - } - -#ifndef HAVE_ASPRINTF_L - if (tmpLen == -1) - return false; - - /* - * If there's no asprintf_l, we have no other choice than to - * use this ugly hack to replace the locale's decimal point - * back to ".". - */ - point = [OFLocale decimalPoint]; - - if (!ctx->useLocale && point != nil && ![point isEqual: @"."]) { - void *pool = objc_autoreleasePoolPush(); - char *tmp2; - - @try { - OFMutableString *tmpStr = [OFMutableString - stringWithUTF8String: tmp - length: tmpLen]; - [tmpStr replaceOccurrencesOfString: point - withString: @"."]; - - if (tmpStr.UTF8StringLength > INT_MAX) - return false; - - tmpLen = (int)tmpStr.UTF8StringLength; - tmp2 = malloc(tmpLen); - memcpy(tmp2, tmpStr.UTF8String, tmpLen); - } @finally { - free(tmp); - objc_autoreleasePoolPop(pool); - } - - tmp = tmp2; - } -#endif - - break; - case 'c': - switch (ctx->lengthModifier) { - case LENGTH_MODIFIER_NONE: - tmpLen = asprintf(&tmp, ctx->subformat, - va_arg(ctx->arguments, int)); - break; - case LENGTH_MODIFIER_L: -#ifdef HAVE_WCHAR_H -# if WINT_MAX >= INT_MAX - tmpLen = asprintf(&tmp, ctx->subformat, - va_arg(ctx->arguments, wint_t)); -# else - tmpLen = asprintf(&tmp, ctx->subformat, - va_arg(ctx->arguments, int)); -# endif - break; -#endif - default: - return false; - } - - break; - case 's': - switch (ctx->lengthModifier) { - case LENGTH_MODIFIER_NONE: - tmpLen = asprintf(&tmp, ctx->subformat, - va_arg(ctx->arguments, const char *)); - break; -#ifdef HAVE_WCHAR_T - case LENGTH_MODIFIER_L: - tmpLen = asprintf(&tmp, ctx->subformat, - va_arg(ctx->arguments, const wchar_t *)); - break; -#endif - default: - return false; - } - - break; - case 'p': - if (ctx->lengthModifier != LENGTH_MODIFIER_NONE) - return false; - - tmpLen = asprintf(&tmp, ctx->subformat, - va_arg(ctx->arguments, void *)); - - break; - case 'n': - switch (ctx->lengthModifier) { - case LENGTH_MODIFIER_NONE: - *va_arg(ctx->arguments, int *) = (int)ctx->bufferLen; - break; - case LENGTH_MODIFIER_HH: - *va_arg(ctx->arguments, signed char *) = - (signed char)ctx->bufferLen; - break; - case LENGTH_MODIFIER_H: - *va_arg(ctx->arguments, short *) = - (short)ctx->bufferLen; - break; - case LENGTH_MODIFIER_L: - *va_arg(ctx->arguments, long *) = - (long)ctx->bufferLen; - break; - case LENGTH_MODIFIER_LL: - *va_arg(ctx->arguments, long long *) = - (long long)ctx->bufferLen; - break; - case LENGTH_MODIFIER_J: - *va_arg(ctx->arguments, intmax_t *) = - (intmax_t)ctx->bufferLen; - break; - case LENGTH_MODIFIER_Z: - *va_arg(ctx->arguments, size_t *) = - (size_t)ctx->bufferLen; - break; - case LENGTH_MODIFIER_T: - *va_arg(ctx->arguments, ptrdiff_t *) = - (ptrdiff_t)ctx->bufferLen; - break; - default: - return false; - } - - break; - case '%': - if (ctx->lengthModifier != LENGTH_MODIFIER_NONE) - return false; - - if (!appendString(ctx, "%", 1)) - return false; - - break; - default: - return false; - } - - if (tmpLen == -1) - return false; - - if (tmp != NULL) { - if (!appendString(ctx, tmp, tmpLen)) { - free(tmp); - return false; - } - - free(tmp); - } - - memset(ctx->subformat, 0, MAX_SUBFORMAT_LEN); - ctx->subformatLen = 0; - ctx->lengthModifier = LENGTH_MODIFIER_NONE; - ctx->useLocale = false; - - ctx->last = ctx->i + 1; - ctx->state = STATE_STRING; - - return true; -} - -static bool (*states[])(struct context *) = { - stringState, - formatFlagsState, - formatFieldWidthState, - formatLengthModifierState, - formatConversionSpecifierState -}; - -int -of_vasprintf(char **string, const char *format, va_list arguments) -{ - struct context ctx; - - ctx.format = format; - ctx.formatLen = strlen(format); - memset(ctx.subformat, 0, MAX_SUBFORMAT_LEN + 1); - ctx.subformatLen = 0; - va_copy(ctx.arguments, arguments); - ctx.bufferLen = 0; - ctx.last = 0; - ctx.state = STATE_STRING; - ctx.lengthModifier = LENGTH_MODIFIER_NONE; - ctx.useLocale = false; - - if ((ctx.buffer = malloc(1)) == NULL) - return -1; - - for (ctx.i = 0; ctx.i < ctx.formatLen; ctx.i++) { - if (!states[ctx.state](&ctx)) { - free(ctx.buffer); - return -1; - } - } - - if (ctx.state != STATE_STRING) { - free(ctx.buffer); - return -1; - } - - if (!appendString(&ctx, ctx.format + ctx.last, - ctx.formatLen - ctx.last)) { - free(ctx.buffer); - return -1; - } - - ctx.buffer[ctx.bufferLen] = 0; - - *string = ctx.buffer; - return (ctx.bufferLen <= INT_MAX ? (int)ctx.bufferLen : -1); -} - -int -of_asprintf(char **string, const char *format, ...) -{ - va_list arguments; - int ret; - - va_start(arguments, format); - ret = of_vasprintf(string, format, arguments); - va_end(arguments); - - return ret; -} DELETED src/of_strptime.h Index: src/of_strptime.h ================================================================== --- src/of_strptime.h +++ src/of_strptime.h @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#ifndef __STDC_LIMIT_MACROS -# define __STDC_LIMIT_MACROS -#endif -#ifndef __STDC_CONSTANT_MACROS -# define __STDC_CONSTANT_MACROS -#endif - -#include - -#import "macros.h" - -OF_ASSUME_NONNULL_BEGIN - -#ifdef __cplusplus -extern "C" { -#endif -extern const char *of_strptime(const char *buf, const char *fmt, struct tm *tm, - short *tz); -#ifdef __cplusplus -} -#endif - -OF_ASSUME_NONNULL_END DELETED src/of_strptime.m Index: src/of_strptime.m ================================================================== --- src/of_strptime.m +++ src/of_strptime.m @@ -1,231 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#include - -#include - -#import "macros.h" - -const char * -of_strptime(const char *buffer, const char *format, struct tm *tm, short *tz) -{ - enum { - SEARCH_CONVERSION_SPECIFIER, - IN_CONVERSION_SPECIFIER - } state = SEARCH_CONVERSION_SPECIFIER; - size_t j, bufferLen, formatLen; - - bufferLen = strlen(buffer); - formatLen = strlen(format); - - j = 0; - for (size_t i = 0; i < formatLen; i++) { - if (j >= bufferLen) - return NULL; - - switch (state) { - case SEARCH_CONVERSION_SPECIFIER: - if (format[i] == '%') - state = IN_CONVERSION_SPECIFIER; - else if (format[i] != buffer[j++]) - return NULL; - - break; - - case IN_CONVERSION_SPECIFIER:; - int k, maxLen, number = 0; - - switch (format[i]) { - case 'd': - case 'e': - case 'H': - case 'm': - case 'M': - case 'S': - case 'y': - maxLen = 2; - break; - case 'Y': - maxLen = 4; - break; - case '%': - case 'a': - case 'b': - case 'n': - case 't': - case 'z': - maxLen = 0; - break; - default: - return NULL; - } - - if (maxLen > 0 && (buffer[j] < '0' || buffer[j] > '9')) - return NULL; - - for (k = 0; k < maxLen && j < bufferLen && - buffer[j] >= '0' && buffer[j] <= '9'; k++, j++) { - number *= 10; - number += buffer[j] - '0'; - } - - switch (format[i]) { - case 'a': - if (bufferLen < j + 3) - return NULL; - - if (memcmp(buffer + j, "Sun", 3) == 0) - tm->tm_wday = 0; - else if (memcmp(buffer + j, "Mon", 3) == 0) - tm->tm_wday = 1; - else if (memcmp(buffer + j, "Tue", 3) == 0) - tm->tm_wday = 2; - else if (memcmp(buffer + j, "Wed", 3) == 0) - tm->tm_wday = 3; - else if (memcmp(buffer + j, "Thu", 3) == 0) - tm->tm_wday = 4; - else if (memcmp(buffer + j, "Fri", 3) == 0) - tm->tm_wday = 5; - else if (memcmp(buffer + j, "Sat", 3) == 0) - tm->tm_wday = 6; - else - return NULL; - - j += 3; - break; - case 'b': - if (bufferLen < j + 3) - return NULL; - - if (memcmp(buffer + j, "Jan", 3) == 0) - tm->tm_mon = 0; - else if (memcmp(buffer + j, "Feb", 3) == 0) - tm->tm_mon = 1; - else if (memcmp(buffer + j, "Mar", 3) == 0) - tm->tm_mon = 2; - else if (memcmp(buffer + j, "Apr", 3) == 0) - tm->tm_mon = 3; - else if (memcmp(buffer + j, "May", 3) == 0) - tm->tm_mon = 4; - else if (memcmp(buffer + j, "Jun", 3) == 0) - tm->tm_mon = 5; - else if (memcmp(buffer + j, "Jul", 3) == 0) - tm->tm_mon = 6; - else if (memcmp(buffer + j, "Aug", 3) == 0) - tm->tm_mon = 7; - else if (memcmp(buffer + j, "Sep", 3) == 0) - tm->tm_mon = 8; - else if (memcmp(buffer + j, "Oct", 3) == 0) - tm->tm_mon = 9; - else if (memcmp(buffer + j, "Nov", 3) == 0) - tm->tm_mon = 10; - else if (memcmp(buffer + j, "Dec", 3) == 0) - tm->tm_mon = 11; - else - return NULL; - - j += 3; - break; - case 'd': - case 'e': - tm->tm_mday = number; - break; - case 'H': - tm->tm_hour = number; - break; - case 'm': - tm->tm_mon = number - 1; - break; - case 'M': - tm->tm_min = number; - break; - case 'S': - tm->tm_sec = number; - break; - case 'y': - if (number <= 68) - number += 100; - - tm->tm_year = number; - break; - case 'Y': - if (number < 1900) - return NULL; - - tm->tm_year = number - 1900; - break; - case 'z': - if (buffer[j] == '-' || buffer[j] == '+') { - const char *b = buffer + j; - - if (bufferLen < j + 5) - return NULL; - - if (tz == NULL) - break; - - *tz = (((short)b[1] - '0') * 600 + - ((short)b[2] - '0') * 60 + - ((short)b[3] - '0') * 10 + - ((short)b[4] - '0')) * - (b[0] == '-' ? -1 : 1); - - j += 5; - } else if (buffer[j] == 'Z') { - if (tz != NULL) - *tz = 0; - - j++; - } else if (buffer[j] == 'G') { - if (bufferLen < j + 3) - return NULL; - - if (buffer[j + 1] != 'M' || - buffer[j + 2] != 'T') - return NULL; - - if (tz != NULL) - *tz = 0; - - j += 3; - } else - return NULL; - - break; - case '%': - if (buffer[j++] != '%') - return NULL; - break; - case 'n': - if (buffer[j++] != '\n') - return NULL; - break; - case 't': - if (buffer[j++] != '\t') - return NULL; - break; - } - - state = SEARCH_CONVERSION_SPECIFIER; - - break; - } - } - - return buffer + j; -} DELETED src/once.h Index: src/once.h ================================================================== --- src/once.h +++ src/once.h @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "objfw-defs.h" - -#include "platform.h" - -#if defined(OF_HAVE_PTHREADS) -# include -typedef pthread_once_t of_once_t; -# define OF_ONCE_INIT PTHREAD_ONCE_INIT -#elif defined(OF_HAVE_ATOMIC_OPS) -typedef volatile int of_once_t; -# define OF_ONCE_INIT 0 -#elif defined(OF_AMIGAOS) || !defined(OF_HAVE_THREADS) -typedef int of_once_t; -# define OF_ONCE_INIT 0 -#endif - -#ifdef __cplusplus -extern "C" { -#endif -extern void of_once(of_once_t *control, void (*func)(void)); -#ifdef __cplusplus -} -#endif DELETED src/once.m Index: src/once.m ================================================================== --- src/once.m +++ src/once.m @@ -1,85 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#include - -#import "once.h" - -#ifdef OF_AMIGAOS -# include -#endif - -#if defined(OF_HAVE_THREADS) && defined(OF_HAVE_ATOMIC_OPS) -# import "atomic.h" -# import "mutex.h" -#endif - -void -of_once(of_once_t *control, void (*func)(void)) -{ -#if !defined(OF_HAVE_THREADS) - if (*control == 0) { - func(); - *control = 1; - } -#elif defined(OF_HAVE_PTHREADS) - pthread_once(control, func); -#elif defined(OF_HAVE_ATOMIC_OPS) - /* Avoid atomic operations in case it's already done. */ - if (*control == 2) - return; - - if (of_atomic_int_cmpswap(control, 0, 1)) { - func(); - - of_memory_barrier(); - - of_atomic_int_inc(control); - } else - while (*control == 1) - of_thread_yield(); -#elif defined(OF_AMIGAOS) - bool run = false; - - /* Avoid Forbid() in case it's already done. */ - if (*control == 2) - return; - - Forbid(); - - switch (*control) { - case 0: - *control = 1; - run = true; - break; - case 1: - while (*control == 1) { - Permit(); - Forbid(); - } - } - - Permit(); - - if (run) { - func(); - *control = 2; - } -#else -# error No of_once available -#endif -} DELETED src/pbkdf2.h Index: src/pbkdf2.h ================================================================== --- src/pbkdf2.h +++ src/pbkdf2.h @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#ifndef __STDC_LIMIT_MACROS -# define __STDC_LIMIT_MACROS -#endif -#ifndef __STDC_CONSTANT_MACROS -# define __STDC_CONSTANT_MACROS -#endif - -#import "macros.h" - -OF_ASSUME_NONNULL_BEGIN - -/** @file */ - -@class OFHMAC; - -/** - * @brief The parameters for @ref of_pbkdf2. - */ -typedef struct of_pbkdf2_parameters_t { - /** @brief The HMAC to use to derive a key. */ - __unsafe_unretained OFHMAC *HMAC; - /** @brief The number of iterations to perform. */ - size_t iterations; - /** @brief The salt to derive a key with. */ - const unsigned char *salt; - /** @brief The length of the salt. */ - size_t saltLength; - /** @brief The password to derive a key from. */ - const char *password; - /** @brief The length of the password. */ - size_t passwordLength; - /** @brief The buffer to write the key to. */ - unsigned char *key; - /** - * @brief The desired length for the derived key. - * - * @ref key needs to have enough storage. - */ - size_t keyLength; - /** @brief Whether data may be stored in swappable memory. */ - bool allowsSwappableMemory; -} of_pbkdf2_parameters_t; - -#ifdef __cplusplus -extern "C" { -#endif -/** - * @brief Derives a key from a password and a salt using PBKDF2. - * - * @note This will call @ref OFHMAC::reset on the `HMAC` first, making it - * possible to reuse the `HMAC`, but also meaning all previous results - * from the `HMAC` get invalidated if they have not been copied. - * - * @param param The parameters to use - */ -extern void of_pbkdf2(of_pbkdf2_parameters_t param); -#ifdef __cplusplus -} -#endif - -OF_ASSUME_NONNULL_END DELETED src/pbkdf2.m Index: src/pbkdf2.m ================================================================== --- src/pbkdf2.m +++ src/pbkdf2.m @@ -1,112 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#include - -#import "OFHMAC.h" -#import "OFSecureData.h" - -#import "OFInvalidArgumentException.h" -#import "OFOutOfMemoryException.h" -#import "OFOutOfRangeException.h" - -#import "pbkdf2.h" - -void -of_pbkdf2(of_pbkdf2_parameters_t param) -{ - void *pool = objc_autoreleasePoolPush(); - size_t blocks, digestSize = param.HMAC.digestSize; - OFSecureData *buffer = [OFSecureData - dataWithCount: digestSize - allowsSwappableMemory: param.allowsSwappableMemory]; - OFSecureData *digest = [OFSecureData - dataWithCount: digestSize - allowsSwappableMemory: param.allowsSwappableMemory]; - unsigned char *bufferItems = buffer.mutableItems; - unsigned char *digestItems = digest.mutableItems; - OFSecureData *extendedSalt; - unsigned char *extendedSaltItems; - - if (param.HMAC == nil || param.iterations == 0 || param.salt == NULL || - param.password == NULL || param.key == NULL || param.keyLength == 0) - @throw [OFInvalidArgumentException exception]; - - blocks = param.keyLength / digestSize; - if (param.keyLength % digestSize != 0) - blocks++; - - if (param.saltLength > SIZE_MAX - 4 || blocks > UINT32_MAX) - @throw [OFOutOfRangeException exception]; - - extendedSalt = [OFSecureData - dataWithCount: param.saltLength + 4 - allowsSwappableMemory: param.allowsSwappableMemory]; - extendedSaltItems = extendedSalt.mutableItems; - - @try { - uint32_t i = OF_BSWAP32_IF_LE(1); - - [param.HMAC setKey: param.password - length: param.passwordLength]; - - memcpy(extendedSaltItems, param.salt, param.saltLength); - - while (param.keyLength > 0) { - size_t length; - - memcpy(extendedSaltItems + param.saltLength, &i, 4); - - [param.HMAC reset]; - [param.HMAC updateWithBuffer: extendedSaltItems - length: param.saltLength + 4]; - memcpy(bufferItems, param.HMAC.digest, digestSize); - memcpy(digestItems, param.HMAC.digest, digestSize); - - for (size_t j = 1; j < param.iterations; j++) { - [param.HMAC reset]; - [param.HMAC updateWithBuffer: digestItems - length: digestSize]; - memcpy(digestItems, param.HMAC.digest, - digestSize); - - for (size_t k = 0; k < digestSize; k++) - bufferItems[k] ^= digestItems[k]; - } - - length = digestSize; - if (length > param.keyLength) - length = param.keyLength; - - memcpy(param.key, bufferItems, length); - param.key += length; - param.keyLength -= length; - - i = OF_BSWAP32_IF_LE(OF_BSWAP32_IF_LE(i) + 1); - } - } @catch (id e) { - [extendedSalt zero]; - [buffer zero]; - [digest zero]; - - @throw e; - } @finally { - [param.HMAC zero]; - } - - objc_autoreleasePoolPop(pool); -} ADDED src/platform/amiga/OFPlainCondition.m Index: src/platform/amiga/OFPlainCondition.m ================================================================== --- src/platform/amiga/OFPlainCondition.m +++ src/platform/amiga/OFPlainCondition.m @@ -0,0 +1,251 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#include + +#import "OFPlainCondition.h" + +#include +#include +#ifndef OF_AMIGAOS4 +# include +#endif + +int +OFPlainConditionNew(OFPlainCondition *condition) +{ + condition->waitingTasks = NULL; + + return 0; +} + +int +OFPlainConditionSignal(OFPlainCondition *condition) +{ + Forbid(); + @try { + if (condition->waitingTasks == NULL) + return 0; + + Signal(condition->waitingTasks->task, + (1ul << condition->waitingTasks->sigBit)); + + condition->waitingTasks = condition->waitingTasks->next; + } @finally { + Permit(); + } + + return 0; +} + +int +OFPlainConditionBroadcast(OFPlainCondition *condition) +{ + Forbid(); + @try { + if (condition->waitingTasks == NULL) + return 0; + + while (condition->waitingTasks != NULL) { + Signal(condition->waitingTasks->task, + (1ul << condition->waitingTasks->sigBit)); + + condition->waitingTasks = condition->waitingTasks->next; + } + } @finally { + Permit(); + } + + return 0; +} + +int +OFPlainConditionWait(OFPlainCondition *condition, OFPlainMutex *mutex) +{ + ULONG signalMask = 0; + + return OFPlainConditionWaitOrExecSignal(condition, mutex, &signalMask); +} + +int +OFPlainConditionWaitOrExecSignal(OFPlainCondition *condition, + OFPlainMutex *mutex, ULONG *signalMask) +{ + struct OFPlainConditionWaitingTask waitingTask = { + .task = FindTask(NULL), + .sigBit = AllocSignal(-1) + }; + int error = 0; + ULONG mask; + + if (waitingTask.sigBit == -1) + return EAGAIN; + + Forbid(); + + if ((error = OFPlainMutexUnlock(mutex)) != 0) { + FreeSignal(waitingTask.sigBit); + return error; + } + + waitingTask.next = condition->waitingTasks; + condition->waitingTasks = &waitingTask; + + mask = Wait((1ul << waitingTask.sigBit) | *signalMask); + if (mask & (1ul << waitingTask.sigBit) || (*signalMask &= mask)) + error = OFPlainMutexLock(mutex); + else + /* + * This should not happen - it means something interrupted the + * Wait(), so the best we can do is return EINTR. + */ + error = EINTR; + + FreeSignal(waitingTask.sigBit); + + Permit(); + + return error; +} + +int +OFPlainConditionTimedWait(OFPlainCondition *condition, OFPlainMutex *mutex, + OFTimeInterval timeout) +{ + ULONG signalMask = 0; + + return OFPlainConditionTimedWaitOrExecSignal(condition, mutex, timeout, + &signalMask); +} + +int +OFPlainConditionTimedWaitOrExecSignal(OFPlainCondition *condition, + OFPlainMutex *mutex, OFTimeInterval timeout, ULONG *signalMask) +{ + struct OFPlainConditionWaitingTask waitingTask = { + .task = FindTask(NULL), + .sigBit = AllocSignal(-1) + }; + struct MsgPort port = { + .mp_Node = { + .ln_Type = NT_MSGPORT + }, + .mp_Flags = PA_SIGNAL, + .mp_SigTask = waitingTask.task, + .mp_SigBit = AllocSignal(-1) + }; +#ifdef OF_AMIGAOS4 + struct TimeRequest request = { + .Request = { +#else + struct timerequest request = { + .tr_node = { +#endif + .io_Message = { + .mn_Node = { + .ln_Type = NT_MESSAGE + }, + .mn_ReplyPort = &port, + .mn_Length = sizeof(request) + }, + .io_Command = TR_ADDREQUEST + }, +#ifdef OF_AMIGAOS4 + .Time = { + .Seconds = (ULONG)timeout, + .Microseconds = + (timeout - request.Time.Seconds) * 1000000 +#else + .tr_time = { + .tv_sec = (ULONG)timeout, + .tv_micro = (timeout - request.tr_time.tv_sec) * 1000000 +#endif + } + }; + int error = 0; + ULONG mask; + + NewList(&port.mp_MsgList); + + if (waitingTask.sigBit == -1 || port.mp_SigBit == -1) { + error = EAGAIN; + goto fail; + } + + if (OpenDevice("timer.device", UNIT_MICROHZ, + (struct IORequest *)&request, 0) != 0) { + error = EAGAIN; + goto fail; + } + + Forbid(); + + if ((error = OFPlainMutexUnlock(mutex)) != 0) { + Permit(); + goto fail; + } + + waitingTask.next = condition->waitingTasks; + condition->waitingTasks = &waitingTask; + + SendIO((struct IORequest *)&request); + + mask = Wait((1ul << waitingTask.sigBit) | (1ul << port.mp_SigBit) | + *signalMask); + if (mask & (1ul << waitingTask.sigBit) || (*signalMask &= mask)) + error = OFPlainMutexLock(mutex); + else if (mask & (1ul << port.mp_SigBit)) + error = ETIMEDOUT; + else + /* + * This should not happen - it means something interrupted the + * Wait(), so the best we can do is return EINTR. + */ + error = EINTR; + + condition->waitingTasks = waitingTask.next; + + if (!CheckIO((struct IORequest *)&request)) { + AbortIO((struct IORequest *)&request); + WaitIO((struct IORequest *)&request); + } + CloseDevice((struct IORequest *)&request); + + Permit(); + +fail: + if (waitingTask.sigBit != -1) + FreeSignal(waitingTask.sigBit); + if (port.mp_SigBit != -1) + FreeSignal(port.mp_SigBit); + + return error; +} + +int +OFPlainConditionFree(OFPlainCondition *condition) +{ + Forbid(); + @try { + if (condition->waitingTasks != NULL) + return EBUSY; + } @finally { + Permit(); + } + + return 0; +} ADDED src/platform/amiga/OFPlainMutex.m Index: src/platform/amiga/OFPlainMutex.m ================================================================== --- src/platform/amiga/OFPlainMutex.m +++ src/platform/amiga/OFPlainMutex.m @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#include + +#import "OFPlainMutex.h" + +#include + +int +OFPlainMutexNew(OFPlainMutex *mutex) +{ + InitSemaphore(mutex); + + return 0; +} + +int +OFPlainMutexLock(OFPlainMutex *mutex) +{ + ObtainSemaphore(mutex); + + return 0; +} + +int +OFPlainMutexTryLock(OFPlainMutex *mutex) +{ + if (!AttemptSemaphore(mutex)) + return EBUSY; + + return 0; +} + +int +OFPlainMutexUnlock(OFPlainMutex *mutex) +{ + ReleaseSemaphore(mutex); + + return 0; +} + +int +OFPlainMutexFree(OFPlainMutex *mutex) +{ + return 0; +} + +int +OFPlainRecursiveMutexNew(OFPlainRecursiveMutex *rmutex) +{ + return OFPlainMutexNew(rmutex); +} + +int +OFPlainRecursiveMutexLock(OFPlainRecursiveMutex *rmutex) +{ + return OFPlainMutexLock(rmutex); +} + +int +OFPlainRecursiveMutexTryLock(OFPlainRecursiveMutex *rmutex) +{ + return OFPlainMutexTryLock(rmutex); +} + +int +OFPlainRecursiveMutexUnlock(OFPlainRecursiveMutex *rmutex) +{ + return OFPlainMutexUnlock(rmutex); +} + +int +OFPlainRecursiveMutexFree(OFPlainRecursiveMutex *rmutex) +{ + return OFPlainMutexFree(rmutex); +} ADDED src/platform/amiga/OFPlainThread.m Index: src/platform/amiga/OFPlainThread.m ================================================================== --- src/platform/amiga/OFPlainThread.m +++ src/platform/amiga/OFPlainThread.m @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#include +#include + +#import "OFPlainThread.h" +#import "OFData.h" +#import "OFTLSKey.h" + +#include +#include +#include + +#ifndef OF_MORPHOS +extern void OFTLSKeyThreadExited(void); +#endif +static OFTLSKey threadKey; + +OF_CONSTRUCTOR() +{ + OFEnsure(OFTLSKeyNew(&threadKey) == 0); +} + +static void +functionWrapper(void) +{ + bool detached = false; + OFPlainThread thread = + (OFPlainThread)((struct Process *)FindTask(NULL))->pr_ExitData; + OFEnsure(OFTLSKeySet(threadKey, thread) == 0); + + thread->function(thread->object); + + ObtainSemaphore(&thread->semaphore); + @try { + thread->done = true; + +#ifndef OF_MORPHOS + OFTLSKeyThreadExited(); +#endif + + if (thread->detached) + detached = true; + else if (thread->joinTask != NULL) + Signal(thread->joinTask, (1ul << thread->joinSigBit)); + } @finally { + ReleaseSemaphore(&thread->semaphore); + } + + if (detached) + free(thread); +} + +int +OFPlainThreadAttributesInit(OFPlainThreadAttributes *attr) +{ + attr->priority = 0; + attr->stackSize = 0; + + return 0; +} + +int +OFPlainThreadNew(OFPlainThread *thread, const char *name, void (*function)(id), + id object, const OFPlainThreadAttributes *attr) +{ + OFMutableData *tags = nil; + + if ((*thread = calloc(1, sizeof(**thread))) == NULL) + return ENOMEM; + + @try { + (*thread)->function = function; + (*thread)->object = object; + InitSemaphore(&(*thread)->semaphore); + + tags = [[OFMutableData alloc] + initWithItemSize: sizeof(struct TagItem) + capacity: 12]; +#define ADD_TAG(tag, data) \ + { \ + struct TagItem t = { \ + .ti_Tag = tag, \ + .ti_Data = data \ + }; \ + [tags addItem: &t]; \ + } + ADD_TAG(NP_Entry, (ULONG)functionWrapper) + ADD_TAG(NP_ExitData, (ULONG)*thread) +#ifdef OF_AMIGAOS4 + ADD_TAG(NP_Child, TRUE) +#endif +#ifdef OF_MORPHOS + ADD_TAG(NP_CodeType, CODETYPE_PPC); +#endif + if (name != NULL) + ADD_TAG(NP_Name, (ULONG)name); + + ADD_TAG(NP_Input, ((struct Process *)FindTask(NULL))->pr_CIS) + ADD_TAG(NP_Output, ((struct Process *)FindTask(NULL))->pr_COS) + ADD_TAG(NP_Error, ((struct Process *)FindTask(NULL))->pr_CES) + ADD_TAG(NP_CloseInput, FALSE) + ADD_TAG(NP_CloseOutput, FALSE) + ADD_TAG(NP_CloseError, FALSE) + + if (attr != NULL && attr->priority != 0) { + if (attr->priority < 1 || attr->priority > 1) + return EINVAL; + + /* + * -1 should be -128 (lowest possible priority) while + * +1 should be +127 (highest possible priority). + */ + ADD_TAG(NP_Priority, (attr->priority > 0 + ? attr->priority * 127 : attr->priority * 128)) + } + + if (attr != NULL && attr->stackSize != 0) + ADD_TAG(NP_StackSize, attr->stackSize) + else + ADD_TAG(NP_StackSize, + ((struct Process *)FindTask(NULL))->pr_StackSize) + + ADD_TAG(TAG_DONE, 0) +#undef ADD_TAG + + (*thread)->task = (struct Task *)CreateNewProc(tags.items); + if ((*thread)->task == NULL) { + free(*thread); + return EAGAIN; + } + } @catch (id e) { + free(*thread); + @throw e; + } @finally { + [tags release]; + } + + return 0; +} + +OFPlainThread +OFCurrentPlainThread(void) +{ + return OFTLSKeyGet(threadKey); +} + +int +OFPlainThreadJoin(OFPlainThread thread) +{ + ObtainSemaphore(&thread->semaphore); + + if (thread->done) { + ReleaseSemaphore(&thread->semaphore); + + free(thread); + return 0; + } + + @try { + if (thread->detached || thread->joinTask != NULL) + return EINVAL; + + if ((thread->joinSigBit = AllocSignal(-1)) == -1) + return EAGAIN; + + thread->joinTask = FindTask(NULL); + } @finally { + ReleaseSemaphore(&thread->semaphore); + } + + Wait(1ul << thread->joinSigBit); + FreeSignal(thread->joinSigBit); + + assert(thread->done); + free(thread); + + return 0; +} + +int +OFPlainThreadDetach(OFPlainThread thread) +{ + ObtainSemaphore(&thread->semaphore); + + if (thread->done) + free(thread); + else + thread->detached = true; + + ReleaseSemaphore(&thread->semaphore); + + return 0; +} + +void +OFSetThreadName(const char *name) +{ +} Index: src/platform/amiga/OFString+PathAdditions.m ================================================================== --- src/platform/amiga/OFString+PathAdditions.m +++ src/platform/amiga/OFString+PathAdditions.m @@ -117,12 +117,12 @@ OFString *ret, *fileName; size_t pos; fileName = self.lastPathComponent; pos = [fileName rangeOfString: @"." - options: OF_STRING_SEARCH_BACKWARDS].location; - if (pos == OF_NOT_FOUND || pos == 0) { + options: OFStringSearchBackwards].location; + if (pos == OFNotFound || pos == 0) { objc_autoreleasePoolPop(pool); return @""; } ret = [fileName substringFromIndex: pos + 1]; @@ -153,11 +153,11 @@ objc_autoreleasePoolPop(pool); return @""; } components = [components objectsInRange: - of_range(0, components.count - 1)]; + OFRangeMake(0, components.count - 1)]; ret = [OFString pathWithComponents: components]; [ret retain]; objc_autoreleasePoolPop(pool); return [ret autorelease]; @@ -176,12 +176,12 @@ pool = objc_autoreleasePoolPush(); components = [[self.pathComponents mutableCopy] autorelease]; fileName = components.lastObject; pos = [fileName rangeOfString: @"." - options: OF_STRING_SEARCH_BACKWARDS].location; - if (pos == OF_NOT_FOUND || pos == 0) { + options: OFStringSearchBackwards].location; + if (pos == OFNotFound || pos == 0) { objc_autoreleasePoolPop(pool); return [[self copy] autorelease]; } fileName = [fileName substringToIndex: pos]; @@ -233,11 +233,11 @@ } if ([component isEqual: @"/"] && parent != nil && ![parent isEqual: @"/"]) { [array removeObjectsInRange: - of_range(i - 1, 2)]; + OFRangeMake(i - 1, 2)]; done = false; break; } } ADDED src/platform/amiga/OFTLSKey.m Index: src/platform/amiga/OFTLSKey.m ================================================================== --- src/platform/amiga/OFTLSKey.m +++ src/platform/amiga/OFTLSKey.m @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#import "OFTLSKey.h" + +#include +#include + +/* + * As we use this file in both the runtime and ObjFW, and since AmigaOS always + * has the runtime, use the hashtable from the runtime. + */ +#import "runtime/private.h" + +static OFTLSKey firstKey = NULL, lastKey = NULL; +static struct SignalSemaphore semaphore; +static bool semaphoreInitialized = false; + +static uint32_t +hashFunc(const void *ptr) +{ + return (uint32_t)(uintptr_t)ptr; +} + +static bool +equalFunc(const void *ptr1, const void *ptr2) +{ + return (ptr1 == ptr2); +} + +OF_CONSTRUCTOR() +{ + if (!semaphoreInitialized) { + InitSemaphore(&semaphore); + semaphoreInitialized = true; + } +} + +int +OFTLSKeyNew(OFTLSKey *key) +{ + if (!semaphoreInitialized) { + /* + * We might be called from another constructor, while ours has + * not run yet. This is safe, as the constructor is definitely + * run before a thread is spawned. + */ + InitSemaphore(&semaphore); + semaphoreInitialized = true; + } + + if ((*key = malloc(sizeof(**key))) == NULL) + return ENOMEM; + + (*key)->table = NULL; + + ObtainSemaphore(&semaphore); + @try { + (*key)->next = NULL; + (*key)->previous = lastKey; + + if (lastKey != NULL) + lastKey->next = *key; + + lastKey = *key; + + if (firstKey == NULL) + firstKey = *key; + } @finally { + ReleaseSemaphore(&semaphore); + } + + /* We create the hash table lazily. */ + return 0; +} + +int +OFTLSKeyFree(OFTLSKey key) +{ + ObtainSemaphore(&semaphore); + @try { + if (key->previous != NULL) + key->previous->next = key->next; + if (key->next != NULL) + key->next->previous = key->previous; + + if (firstKey == key) + firstKey = key->next; + if (lastKey == key) + lastKey = key->previous; + + objc_hashtable_free(key->table); + free(key); + } @finally { + ReleaseSemaphore(&semaphore); + } + + return 0; +} + +void * +OFTLSKeyGet(OFTLSKey key) +{ + void *ret; + + ObtainSemaphore(&semaphore); + @try { + if (key->table == NULL) + return NULL; + + ret = objc_hashtable_get(key->table, FindTask(NULL)); + } @finally { + ReleaseSemaphore(&semaphore); + } + + return ret; +} + +int +OFTLSKeySet(OFTLSKey key, void *ptr) +{ + ObtainSemaphore(&semaphore); + @try { + struct Task *task = FindTask(NULL); + + if (key->table == NULL) + key->table = objc_hashtable_new(hashFunc, equalFunc, 2); + + if (ptr == NULL) + objc_hashtable_delete(key->table, task); + else + objc_hashtable_set(key->table, task, ptr); + } @finally { + ReleaseSemaphore(&semaphore); + } + + return 0; +} + +void +OFTLSKeyThreadExited(void) +{ + ObtainSemaphore(&semaphore); + @try { + struct Task *task = FindTask(NULL); + + for (OFTLSKey iter = firstKey; iter != NULL; iter = iter->next) + if (iter->table != NULL) + objc_hashtable_delete(iter->table, task); + } @finally { + ReleaseSemaphore(&semaphore); + } +} DELETED src/platform/amiga/condition.m Index: src/platform/amiga/condition.m ================================================================== --- src/platform/amiga/condition.m +++ src/platform/amiga/condition.m @@ -1,251 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#include - -#import "condition.h" - -#include -#include -#ifndef OF_AMIGAOS4 -# include -#endif - -int -of_condition_new(of_condition_t *condition) -{ - condition->waitingTasks = NULL; - - return 0; -} - -int -of_condition_signal(of_condition_t *condition) -{ - Forbid(); - @try { - if (condition->waitingTasks == NULL) - return 0; - - Signal(condition->waitingTasks->task, - (1ul << condition->waitingTasks->sigBit)); - - condition->waitingTasks = condition->waitingTasks->next; - } @finally { - Permit(); - } - - return 0; -} - -int -of_condition_broadcast(of_condition_t *condition) -{ - Forbid(); - @try { - if (condition->waitingTasks == NULL) - return 0; - - while (condition->waitingTasks != NULL) { - Signal(condition->waitingTasks->task, - (1ul << condition->waitingTasks->sigBit)); - - condition->waitingTasks = condition->waitingTasks->next; - } - } @finally { - Permit(); - } - - return 0; -} - -int -of_condition_wait(of_condition_t *condition, of_mutex_t *mutex) -{ - ULONG signalMask = 0; - - return of_condition_wait_or_signal(condition, mutex, &signalMask); -} - -int -of_condition_wait_or_signal(of_condition_t *condition, of_mutex_t *mutex, - ULONG *signalMask) -{ - struct of_condition_waiting_task waitingTask = { - .task = FindTask(NULL), - .sigBit = AllocSignal(-1) - }; - int error = 0; - ULONG mask; - - if (waitingTask.sigBit == -1) - return EAGAIN; - - Forbid(); - - if ((error = of_mutex_unlock(mutex)) != 0) { - FreeSignal(waitingTask.sigBit); - return error; - } - - waitingTask.next = condition->waitingTasks; - condition->waitingTasks = &waitingTask; - - mask = Wait((1ul << waitingTask.sigBit) | *signalMask); - if (mask & (1ul << waitingTask.sigBit) || (*signalMask &= mask)) - error = of_mutex_lock(mutex); - else - /* - * This should not happen - it means something interrupted the - * Wait(), so the best we can do is return EINTR. - */ - error = EINTR; - - FreeSignal(waitingTask.sigBit); - - Permit(); - - return error; -} - -int -of_condition_timed_wait(of_condition_t *condition, of_mutex_t *mutex, - of_time_interval_t timeout) -{ - ULONG signalMask = 0; - - return of_condition_timed_wait_or_signal(condition, mutex, timeout, - &signalMask); -} - -int -of_condition_timed_wait_or_signal(of_condition_t *condition, of_mutex_t *mutex, - of_time_interval_t timeout, ULONG *signalMask) -{ - struct of_condition_waiting_task waitingTask = { - .task = FindTask(NULL), - .sigBit = AllocSignal(-1) - }; - struct MsgPort port = { - .mp_Node = { - .ln_Type = NT_MSGPORT - }, - .mp_Flags = PA_SIGNAL, - .mp_SigTask = waitingTask.task, - .mp_SigBit = AllocSignal(-1) - }; -#ifdef OF_AMIGAOS4 - struct TimeRequest request = { - .Request = { -#else - struct timerequest request = { - .tr_node = { -#endif - .io_Message = { - .mn_Node = { - .ln_Type = NT_MESSAGE - }, - .mn_ReplyPort = &port, - .mn_Length = sizeof(request) - }, - .io_Command = TR_ADDREQUEST - }, -#ifdef OF_AMIGAOS4 - .Time = { - .Seconds = (ULONG)timeout, - .Microseconds = - (timeout - request.Time.Seconds) * 1000000 -#else - .tr_time = { - .tv_sec = (ULONG)timeout, - .tv_micro = (timeout - request.tr_time.tv_sec) * 1000000 -#endif - } - }; - int error = 0; - ULONG mask; - - NewList(&port.mp_MsgList); - - if (waitingTask.sigBit == -1 || port.mp_SigBit == -1) { - error = EAGAIN; - goto fail; - } - - if (OpenDevice("timer.device", UNIT_MICROHZ, - (struct IORequest *)&request, 0) != 0) { - error = EAGAIN; - goto fail; - } - - Forbid(); - - if ((error = of_mutex_unlock(mutex)) != 0) { - Permit(); - goto fail; - } - - waitingTask.next = condition->waitingTasks; - condition->waitingTasks = &waitingTask; - - SendIO((struct IORequest *)&request); - - mask = Wait((1ul << waitingTask.sigBit) | (1ul << port.mp_SigBit) | - *signalMask); - if (mask & (1ul << waitingTask.sigBit) || (*signalMask &= mask)) - error = of_mutex_lock(mutex); - else if (mask & (1ul << port.mp_SigBit)) - error = ETIMEDOUT; - else - /* - * This should not happen - it means something interrupted the - * Wait(), so the best we can do is return EINTR. - */ - error = EINTR; - - condition->waitingTasks = waitingTask.next; - - if (!CheckIO((struct IORequest *)&request)) { - AbortIO((struct IORequest *)&request); - WaitIO((struct IORequest *)&request); - } - CloseDevice((struct IORequest *)&request); - - Permit(); - -fail: - if (waitingTask.sigBit != -1) - FreeSignal(waitingTask.sigBit); - if (port.mp_SigBit != -1) - FreeSignal(port.mp_SigBit); - - return error; -} - -int -of_condition_free(of_condition_t *condition) -{ - Forbid(); - @try { - if (condition->waitingTasks != NULL) - return EBUSY; - } @finally { - Permit(); - } - - return 0; -} DELETED src/platform/amiga/mutex.m Index: src/platform/amiga/mutex.m ================================================================== --- src/platform/amiga/mutex.m +++ src/platform/amiga/mutex.m @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#include - -#import "mutex.h" - -#include - -int -of_mutex_new(of_mutex_t *mutex) -{ - InitSemaphore(mutex); - - return 0; -} - -int -of_mutex_lock(of_mutex_t *mutex) -{ - ObtainSemaphore(mutex); - - return 0; -} - -int -of_mutex_trylock(of_mutex_t *mutex) -{ - if (!AttemptSemaphore(mutex)) - return EBUSY; - - return 0; -} - -int -of_mutex_unlock(of_mutex_t *mutex) -{ - ReleaseSemaphore(mutex); - - return 0; -} - -int -of_mutex_free(of_mutex_t *mutex) -{ - return 0; -} - -int -of_rmutex_new(of_rmutex_t *rmutex) -{ - return of_mutex_new(rmutex); -} - -int -of_rmutex_lock(of_rmutex_t *rmutex) -{ - return of_mutex_lock(rmutex); -} - -int -of_rmutex_trylock(of_rmutex_t *rmutex) -{ - return of_mutex_trylock(rmutex); -} - -int -of_rmutex_unlock(of_rmutex_t *rmutex) -{ - return of_mutex_unlock(rmutex); -} - -int -of_rmutex_free(of_rmutex_t *rmutex) -{ - return of_mutex_free(rmutex); -} DELETED src/platform/amiga/thread.m Index: src/platform/amiga/thread.m ================================================================== --- src/platform/amiga/thread.m +++ src/platform/amiga/thread.m @@ -1,215 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#include -#include - -#import "OFData.h" - -#import "thread.h" -#import "tlskey.h" - -#include -#include -#include - -#ifndef OF_MORPHOS -extern void of_tlskey_thread_exited(void); -#endif -static of_tlskey_t threadKey; - -OF_CONSTRUCTOR() -{ - OF_ENSURE(of_tlskey_new(&threadKey) == 0); -} - -static void -functionWrapper(void) -{ - bool detached = false; - of_thread_t thread = - (of_thread_t)((struct Process *)FindTask(NULL))->pr_ExitData; - OF_ENSURE(of_tlskey_set(threadKey, thread) == 0); - - thread->function(thread->object); - - ObtainSemaphore(&thread->semaphore); - @try { - thread->done = true; - -#ifndef OF_MORPHOS - of_tlskey_thread_exited(); -#endif - - if (thread->detached) - detached = true; - else if (thread->joinTask != NULL) - Signal(thread->joinTask, (1ul << thread->joinSigBit)); - } @finally { - ReleaseSemaphore(&thread->semaphore); - } - - if (detached) - free(thread); -} - -int -of_thread_attr_init(of_thread_attr_t *attr) -{ - attr->priority = 0; - attr->stackSize = 0; - - return 0; -} - -int -of_thread_new(of_thread_t *thread, const char *name, void (*function)(id), - id object, const of_thread_attr_t *attr) -{ - OFMutableData *tags = nil; - - if ((*thread = calloc(1, sizeof(**thread))) == NULL) - return ENOMEM; - - @try { - (*thread)->function = function; - (*thread)->object = object; - InitSemaphore(&(*thread)->semaphore); - - tags = [[OFMutableData alloc] - initWithItemSize: sizeof(struct TagItem) - capacity: 12]; -#define ADD_TAG(tag, data) \ - { \ - struct TagItem t = { \ - .ti_Tag = tag, \ - .ti_Data = data \ - }; \ - [tags addItem: &t]; \ - } - ADD_TAG(NP_Entry, (ULONG)functionWrapper) - ADD_TAG(NP_ExitData, (ULONG)*thread) -#ifdef OF_AMIGAOS4 - ADD_TAG(NP_Child, TRUE) -#endif -#ifdef OF_MORPHOS - ADD_TAG(NP_CodeType, CODETYPE_PPC); -#endif - if (name != NULL) - ADD_TAG(NP_Name, (ULONG)name); - - ADD_TAG(NP_Input, ((struct Process *)FindTask(NULL))->pr_CIS) - ADD_TAG(NP_Output, ((struct Process *)FindTask(NULL))->pr_COS) - ADD_TAG(NP_Error, ((struct Process *)FindTask(NULL))->pr_CES) - ADD_TAG(NP_CloseInput, FALSE) - ADD_TAG(NP_CloseOutput, FALSE) - ADD_TAG(NP_CloseError, FALSE) - - if (attr != NULL && attr->priority != 0) { - if (attr->priority < 1 || attr->priority > 1) - return EINVAL; - - /* - * -1 should be -128 (lowest possible priority) while - * +1 should be +127 (highest possible priority). - */ - ADD_TAG(NP_Priority, (attr->priority > 0 - ? attr->priority * 127 : attr->priority * 128)) - } - - if (attr != NULL && attr->stackSize != 0) - ADD_TAG(NP_StackSize, attr->stackSize) - else - ADD_TAG(NP_StackSize, - ((struct Process *)FindTask(NULL))->pr_StackSize) - - ADD_TAG(TAG_DONE, 0) -#undef ADD_TAG - - (*thread)->task = (struct Task *)CreateNewProc(tags.items); - if ((*thread)->task == NULL) { - free(*thread); - return EAGAIN; - } - } @catch (id e) { - free(*thread); - @throw e; - } @finally { - [tags release]; - } - - return 0; -} - -of_thread_t -of_thread_current(void) -{ - return of_tlskey_get(threadKey); -} - -int -of_thread_join(of_thread_t thread) -{ - ObtainSemaphore(&thread->semaphore); - - if (thread->done) { - ReleaseSemaphore(&thread->semaphore); - - free(thread); - return 0; - } - - @try { - if (thread->detached || thread->joinTask != NULL) - return EINVAL; - - if ((thread->joinSigBit = AllocSignal(-1)) == -1) - return EAGAIN; - - thread->joinTask = FindTask(NULL); - } @finally { - ReleaseSemaphore(&thread->semaphore); - } - - Wait(1ul << thread->joinSigBit); - FreeSignal(thread->joinSigBit); - - assert(thread->done); - free(thread); - - return 0; -} - -int -of_thread_detach(of_thread_t thread) -{ - ObtainSemaphore(&thread->semaphore); - - if (thread->done) - free(thread); - else - thread->detached = true; - - ReleaseSemaphore(&thread->semaphore); - - return 0; -} - -void -of_thread_set_name(const char *name) -{ -} DELETED src/platform/amiga/tlskey.m Index: src/platform/amiga/tlskey.m ================================================================== --- src/platform/amiga/tlskey.m +++ src/platform/amiga/tlskey.m @@ -1,168 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#import "tlskey.h" - -#include -#include - -/* - * As we use this file in both the runtime and ObjFW, and since AmigaOS always - * has the runtime, use the hashtable from the runtime. - */ -#import "runtime/private.h" - -static of_tlskey_t firstKey = NULL, lastKey = NULL; -static struct SignalSemaphore semaphore; -static bool semaphoreInitialized = false; - -static uint32_t -hashFunc(const void *ptr) -{ - return (uint32_t)(uintptr_t)ptr; -} - -static bool -equalFunc(const void *ptr1, const void *ptr2) -{ - return (ptr1 == ptr2); -} - -OF_CONSTRUCTOR() -{ - if (!semaphoreInitialized) { - InitSemaphore(&semaphore); - semaphoreInitialized = true; - } -} - -int -of_tlskey_new(of_tlskey_t *key) -{ - if (!semaphoreInitialized) { - /* - * We might be called from another constructor, while ours has - * not run yet. This is safe, as the constructor is definitely - * run before a thread is spawned. - */ - InitSemaphore(&semaphore); - semaphoreInitialized = true; - } - - if ((*key = malloc(sizeof(**key))) == NULL) - return ENOMEM; - - (*key)->table = NULL; - - ObtainSemaphore(&semaphore); - @try { - (*key)->next = NULL; - (*key)->previous = lastKey; - - if (lastKey != NULL) - lastKey->next = *key; - - lastKey = *key; - - if (firstKey == NULL) - firstKey = *key; - } @finally { - ReleaseSemaphore(&semaphore); - } - - /* We create the hash table lazily. */ - return 0; -} - -int -of_tlskey_free(of_tlskey_t key) -{ - ObtainSemaphore(&semaphore); - @try { - if (key->previous != NULL) - key->previous->next = key->next; - if (key->next != NULL) - key->next->previous = key->previous; - - if (firstKey == key) - firstKey = key->next; - if (lastKey == key) - lastKey = key->previous; - - objc_hashtable_free(key->table); - free(key); - } @finally { - ReleaseSemaphore(&semaphore); - } - - return 0; -} - -void * -of_tlskey_get(of_tlskey_t key) -{ - void *ret; - - ObtainSemaphore(&semaphore); - @try { - if (key->table == NULL) - return NULL; - - ret = objc_hashtable_get(key->table, FindTask(NULL)); - } @finally { - ReleaseSemaphore(&semaphore); - } - - return ret; -} - -int -of_tlskey_set(of_tlskey_t key, void *ptr) -{ - ObtainSemaphore(&semaphore); - @try { - struct Task *task = FindTask(NULL); - - if (key->table == NULL) - key->table = objc_hashtable_new(hashFunc, equalFunc, 2); - - if (ptr == NULL) - objc_hashtable_delete(key->table, task); - else - objc_hashtable_set(key->table, task, ptr); - } @finally { - ReleaseSemaphore(&semaphore); - } - - return 0; -} - -void -of_tlskey_thread_exited(void) -{ - ObtainSemaphore(&semaphore); - @try { - struct Task *task = FindTask(NULL); - - for (of_tlskey_t iter = firstKey; iter != NULL; - iter = iter->next) - if (iter->table != NULL) - objc_hashtable_delete(iter->table, task); - } @finally { - ReleaseSemaphore(&semaphore); - } -} Index: src/platform/libfat/OFString+PathAdditions.m ================================================================== --- src/platform/libfat/OFString+PathAdditions.m +++ src/platform/libfat/OFString+PathAdditions.m @@ -151,12 +151,12 @@ OFString *ret, *fileName; size_t pos; fileName = self.lastPathComponent; pos = [fileName rangeOfString: @"." - options: OF_STRING_SEARCH_BACKWARDS].location; - if (pos == OF_NOT_FOUND || pos == 0) { + options: OFStringSearchBackwards].location; + if (pos == OFNotFound || pos == 0) { objc_autoreleasePoolPop(pool); return @""; } ret = [fileName substringFromIndex: pos + 1]; @@ -221,12 +221,12 @@ pool = objc_autoreleasePoolPush(); components = [[self.pathComponents mutableCopy] autorelease]; fileName = components.lastObject; pos = [fileName rangeOfString: @"." - options: OF_STRING_SEARCH_BACKWARDS].location; - if (pos == OF_NOT_FOUND || pos == 0) { + options: OFStringSearchBackwards].location; + if (pos == OFNotFound || pos == 0) { objc_autoreleasePoolPop(pool); return [[self copy] autorelease]; } fileName = [fileName substringToIndex: pos]; @@ -279,11 +279,11 @@ } if ([component isEqual: @".."] && parent != nil && ![parent isEqual: @".."]) { [array removeObjectsInRange: - of_range(i - 1, 2)]; + OFRangeMake(i - 1, 2)]; done = false; break; } } ADDED src/platform/morphos/OFTLSKey.m Index: src/platform/morphos/OFTLSKey.m ================================================================== --- src/platform/morphos/OFTLSKey.m +++ src/platform/morphos/OFTLSKey.m @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#import "OFTLSKey.h" + +int +OFTLSKeyNew(OFTLSKeyT *key) +{ + *key = TLSAllocA(NULL); + + if (*key == TLS_INVALID_INDEX) + return EAGAIN; + + return 0; +} + +int +OFTLSKeyFree(OFTLSKeyT key) +{ + return (TLSFree(key) ? 0 : EINVAL); +} DELETED src/platform/morphos/tlskey.m Index: src/platform/morphos/tlskey.m ================================================================== --- src/platform/morphos/tlskey.m +++ src/platform/morphos/tlskey.m @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#import "tlskey.h" - -int -of_tlskey_new(of_tlskey_t *key) -{ - *key = TLSAllocA(NULL); - - if (*key == TLS_INVALID_INDEX) - return EAGAIN; - - return 0; -} - -int -of_tlskey_free(of_tlskey_t key) -{ - return (TLSFree(key) ? 0 : EINVAL); -} ADDED src/platform/posix/OFPlainCondition.m Index: src/platform/posix/OFPlainCondition.m ================================================================== --- src/platform/posix/OFPlainCondition.m +++ src/platform/posix/OFPlainCondition.m @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#import "OFPlainCondition.h" + +int +OFPlainConditionNew(OFPlainCondition *condition) +{ + return pthread_cond_init(condition, NULL); +} + +int +OFPlainConditionSignal(OFPlainCondition *condition) +{ + return pthread_cond_signal(condition); +} + +int +OFPlainConditionBroadcast(OFPlainCondition *condition) +{ + return pthread_cond_broadcast(condition); +} + +int +OFPlainConditionWait(OFPlainCondition *condition, OFPlainMutex *mutex) +{ + return pthread_cond_wait(condition, mutex); +} + +int +OFPlainConditionTimedWait(OFPlainCondition *condition, OFPlainMutex *mutex, + OFTimeInterval timeout) +{ + struct timespec ts; + + ts.tv_sec = (time_t)timeout; + ts.tv_nsec = (long)((timeout - ts.tv_sec) * 1000000000); + + return pthread_cond_timedwait(condition, mutex, &ts); +} + +int +OFPlainConditionFree(OFPlainCondition *condition) +{ + return pthread_cond_destroy(condition); +} ADDED src/platform/posix/OFPlainMutex.m Index: src/platform/posix/OFPlainMutex.m ================================================================== --- src/platform/posix/OFPlainMutex.m +++ src/platform/posix/OFPlainMutex.m @@ -0,0 +1,197 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#import "OFPlainMutex.h" + +int +OFPlainMutexNew(OFPlainMutex *mutex) +{ + return pthread_mutex_init(mutex, NULL); +} + +int +OFPlainMutexLock(OFPlainMutex *mutex) +{ + return pthread_mutex_lock(mutex); +} + +int +OFPlainMutexTryLock(OFPlainMutex *mutex) +{ + return pthread_mutex_trylock(mutex); +} + +int +OFPlainMutexUnlock(OFPlainMutex *mutex) +{ + return pthread_mutex_unlock(mutex); +} + +int +OFPlainMutexFree(OFPlainMutex *mutex) +{ + return pthread_mutex_destroy(mutex); +} + +#ifdef OF_HAVE_RECURSIVE_PTHREAD_MUTEXES +int +OFPlainRecursiveMutexNew(OFPlainRecursiveMutex *rmutex) +{ + int error; + pthread_mutexattr_t attr; + + if ((error = pthread_mutexattr_init(&attr)) != 0) + return error; + + if ((error = pthread_mutexattr_settype(&attr, + PTHREAD_MUTEX_RECURSIVE)) != 0) + return error; + + if ((error = pthread_mutex_init(rmutex, &attr)) != 0) + return error; + + if ((error = pthread_mutexattr_destroy(&attr)) != 0) + return error; + + return 0; +} + +int +OFPlainRecursiveMutexLock(OFPlainRecursiveMutex *rmutex) +{ + return OFPlainMutexLock(rmutex); +} + +int +OFPlainRecursiveMutexTryLock(OFPlainRecursiveMutex *rmutex) +{ + return OFPlainMutexTryLock(rmutex); +} + +int +OFPlainRecursiveMutexUnlock(OFPlainRecursiveMutex *rmutex) +{ + return OFPlainMutexUnlock(rmutex); +} + +int +OFPlainRecursiveMutexFree(OFPlainRecursiveMutex *rmutex) +{ + return OFPlainMutexFree(rmutex); +} +#else +int +OFPlainRecursiveMutexNew(OFPlainRecursiveMutex *rmutex) +{ + int error; + + if ((error = OFPlainMutexNew(&rmutex->mutex)) != 0) + return error; + + if ((error = OFTLSKeyNew(&rmutex->count)) != 0) + return error; + + return 0; +} + +int +OFPlainRecursiveMutexLock(OFPlainRecursiveMutex *rmutex) +{ + uintptr_t count = (uintptr_t)OFTLSKeyGet(rmutex->count); + int error; + + if (count > 0) { + if ((error = OFTLSKeySet(rmutex->count, + (void *)(count + 1))) != 0) + return error; + + return 0; + } + + if ((error = OFPlainMutexLock(&rmutex->mutex)) != 0) + return error; + + if ((error = OFTLSKeySet(rmutex->count, (void *)1)) != 0) { + OFPlainMutexUnlock(&rmutex->mutex); + return error; + } + + return 0; +} + +int +OFPlainRecursiveMutexTryLock(OFPlainRecursiveMutex *rmutex) +{ + uintptr_t count = (uintptr_t)OFTLSKeyGet(rmutex->count); + int error; + + if (count > 0) { + if ((error = OFTLSKeySet(rmutex->count, + (void *)(count + 1))) != 0) + return error; + + return 0; + } + + if ((error = OFPlainMutexTryLock(&rmutex->mutex)) != 0) + return error; + + if ((error = OFTLSKeySet(rmutex->count, (void *)1)) != 0) { + OFPlainMutexUnlock(&rmutex->mutex); + return error; + } + + return 0; +} + +int +OFPlainRecursiveMutexUnlock(OFPlainRecursiveMutex *rmutex) +{ + uintptr_t count = (uintptr_t)OFTLSKeyGet(rmutex->count); + int error; + + if (count > 1) { + if ((error = OFTLSKeySet(rmutex->count, + (void *)(count - 1))) != 0) + return error; + + return 0; + } + + if ((error = OFTLSKeySet(rmutex->count, (void *)0)) != 0) + return error; + + if ((error = OFPlainMutexUnlock(&rmutex->mutex)) != 0) + return error; + + return 0; +} + +int +OFPlainRecursiveMutexFree(OFPlainRecursiveMutex *rmutex) +{ + int error; + + if ((error = OFPlainMutexFree(&rmutex->mutex)) != 0) + return error; + + if ((error = OFTLSKeyFree(rmutex->count)) != 0) + return error; + + return 0; +} +#endif ADDED src/platform/posix/OFPlainThread.m Index: src/platform/posix/OFPlainThread.m ================================================================== --- src/platform/posix/OFPlainThread.m +++ src/platform/posix/OFPlainThread.m @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#include + +#ifdef HAVE_PTHREAD_NP_H +# include +#endif + +#ifdef OF_HAIKU +# include +#endif + +#import "OFPlainThread.h" + +#import "macros.h" + +static int minPrio = 0, maxPrio = 0, normalPrio = 0; + +struct ThreadContext { + void (*function)(id object); + id object; + const char *name; +}; + +/* + * This is done here to make sure this is done as early as possible in the main + * thread. + */ +OF_CONSTRUCTOR() +{ + pthread_attr_t attr; + + if (pthread_attr_init(&attr) == 0) { +#ifdef HAVE_PTHREAD_ATTR_GETSCHEDPOLICY + int policy; +#endif + struct sched_param param; + +#ifdef HAVE_PTHREAD_ATTR_GETSCHEDPOLICY + if (pthread_attr_getschedpolicy(&attr, &policy) == 0) { + minPrio = sched_get_priority_min(policy); + maxPrio = sched_get_priority_max(policy); + + if (minPrio == -1 || maxPrio == -1) + minPrio = maxPrio = 0; + } +#endif + + if (pthread_attr_getschedparam(&attr, ¶m) != 0) + normalPrio = param.sched_priority; + else + minPrio = maxPrio = 0; + + pthread_attr_destroy(&attr); + } +} + +static void * +functionWrapper(void *data) +{ + struct ThreadContext *ctx = data; + + if (ctx->name != NULL) + OFSetThreadName(ctx->name); + + pthread_cleanup_push(free, data); + + ctx->function(ctx->object); + + pthread_cleanup_pop(1); + return NULL; +} + +int +OFPlainThreadAttributesInit(OFPlainThreadAttributes *attr) +{ + int error; + pthread_attr_t POSIXAttr; + + attr->priority = 0; + attr->stackSize = 0; + + if ((error = pthread_attr_init(&POSIXAttr)) != 0) { + if (error == ENOSYS) + return 0; + + return error; + } + + error = pthread_attr_getstacksize(&POSIXAttr, &attr->stackSize); + + pthread_attr_destroy(&POSIXAttr); + + return error; +} + +int +OFPlainThreadNew(OFPlainThread *thread, const char *name, void (*function)(id), + id object, const OFPlainThreadAttributes *attr) +{ + int error = 0; + pthread_attr_t POSIXAttr; + bool POSIXAttrAvailable = true; + + if ((error = pthread_attr_init(&POSIXAttr)) != 0) { + if (error == ENOSYS) + POSIXAttrAvailable = false; + else + return error; + } + + @try { + struct ThreadContext *ctx; + + if (attr != NULL && POSIXAttrAvailable) { +#ifndef OF_HPUX + struct sched_param param; +#endif + + if (attr->priority < -1 || attr->priority > 1) + return EINVAL; + +#ifndef OF_HPUX +# ifdef HAVE_PTHREAD_ATTR_SETINHERITSCHED + if ((error = pthread_attr_setinheritsched(&POSIXAttr, + PTHREAD_EXPLICIT_SCHED)) != 0) + return error; +# endif + + if ((error = pthread_attr_getschedparam(&POSIXAttr, + ¶m)) != 0) + return error; + + if (attr->priority < 0) { + param.sched_priority = minPrio + + (1.0f + attr->priority) * + (normalPrio - minPrio); + } else + param.sched_priority = normalPrio + + attr->priority * (maxPrio - normalPrio); + + if ((error = pthread_attr_setschedparam(&POSIXAttr, + ¶m)) != 0) + return error; +#endif + + if (attr->stackSize > 0) { + if ((error = pthread_attr_setstacksize( + &POSIXAttr, attr->stackSize)) != 0) + return error; + } + } + + if ((ctx = malloc(sizeof(*ctx))) == NULL) + return ENOMEM; + + ctx->function = function; + ctx->object = object; + ctx->name = name; + + error = pthread_create(thread, + (POSIXAttrAvailable ? &POSIXAttr : NULL), functionWrapper, + ctx); + } @finally { + if (POSIXAttrAvailable) + pthread_attr_destroy(&POSIXAttr); + } + + return error; +} + +int +OFPlainThreadJoin(OFPlainThread thread) +{ + void *ret; + + return pthread_join(thread, &ret); +} + +int +OFPlainThreadDetach(OFPlainThread thread) +{ + return pthread_detach(thread); +} + +void +OFSetThreadName(const char *name) +{ +#if defined(OF_HAIKU) + rename_thread(find_thread(NULL), name); +#elif defined(HAVE_PTHREAD_SET_NAME_NP) + pthread_set_name_np(pthread_self(), name); +#elif defined(HAVE_PTHREAD_SETNAME_NP) +# if defined(OF_MACOS) || defined(OF_IOS) + pthread_setname_np(name); +# elif defined(__GLIBC__) + char buffer[16]; + + strncpy(buffer, name, 15); + buffer[15] = 0; + + pthread_setname_np(pthread_self(), buffer); +# endif +#endif +} Index: src/platform/posix/OFString+PathAdditions.m ================================================================== --- src/platform/posix/OFString+PathAdditions.m +++ src/platform/posix/OFString+PathAdditions.m @@ -144,12 +144,12 @@ OFString *ret, *fileName; size_t pos; fileName = self.lastPathComponent; pos = [fileName rangeOfString: @"." - options: OF_STRING_SEARCH_BACKWARDS].location; - if (pos == OF_NOT_FOUND || pos == 0) { + options: OFStringSearchBackwards].location; + if (pos == OFNotFound || pos == 0) { objc_autoreleasePoolPop(pool); return @""; } ret = [fileName substringFromIndex: pos + 1]; @@ -213,12 +213,12 @@ pool = objc_autoreleasePoolPush(); components = [[self.pathComponents mutableCopy] autorelease]; fileName = components.lastObject; pos = [fileName rangeOfString: @"." - options: OF_STRING_SEARCH_BACKWARDS].location; - if (pos == OF_NOT_FOUND || pos == 0) { + options: OFStringSearchBackwards].location; + if (pos == OFNotFound || pos == 0) { objc_autoreleasePoolPop(pool); return [[self copy] autorelease]; } fileName = [fileName substringToIndex: pos]; @@ -275,11 +275,11 @@ } if ([component isEqual: @".."] && parent != nil && ![parent isEqual: @".."]) { [array removeObjectsInRange: - of_range(i - 1, 2)]; + OFRangeMake(i - 1, 2)]; done = false; break; } } Index: src/platform/posix/OFSubprocess.m ================================================================== --- src/platform/posix/OFSubprocess.m +++ src/platform/posix/OFSubprocess.m @@ -205,16 +205,16 @@ } @finally { char **iter; close(_readPipe[1]); close(_writePipe[0]); - free(argv); + OFFreeMemory(argv); for (iter = env; *iter != NULL; iter++) - free(*iter); + OFFreeMemory(*iter); - free(env); + OFFreeMemory(env); } objc_autoreleasePoolPop(pool); } @catch (id e) { [self release]; @@ -236,13 +236,13 @@ forProgramName: (OFString *)programName andArguments: (OFArray *)arguments { OFString *const *objects = arguments.objects; size_t i, count = arguments.count; - of_string_encoding_t encoding; + OFStringEncoding encoding; - *argv = of_alloc(count + 2, sizeof(char *)); + *argv = OFAllocMemory(count + 2, sizeof(char *)); encoding = [OFLocale encoding]; (*argv)[0] = (char *)[programName cStringWithEncoding: encoding]; @@ -255,19 +255,19 @@ - (char **)of_environmentForDictionary: (OFDictionary *)environment { char **envp; size_t count; - of_string_encoding_t encoding; + OFStringEncoding encoding; if (environment == nil) return NULL; encoding = [OFLocale encoding]; count = environment.count; - envp = of_alloc_zeroed(count + 1, sizeof(char *)); + envp = OFAllocZeroedMemory(count + 1, sizeof(char *)); @try { OFEnumerator *keyEnumerator = [environment keyEnumerator]; OFEnumerator *objectEnumerator = [environment objectEnumerator]; @@ -281,11 +281,11 @@ keyLen = [key cStringLengthWithEncoding: encoding]; objectLen = [object cStringLengthWithEncoding: encoding]; - envp[i] = of_alloc(keyLen + objectLen + 2, 1); + envp[i] = OFAllocMemory(keyLen + objectLen + 2, 1); memcpy(envp[i], [key cStringWithEncoding: encoding], keyLen); envp[i][keyLen] = '='; memcpy(envp[i] + keyLen + 1, @@ -292,13 +292,13 @@ [object cStringWithEncoding: encoding], objectLen); envp[i][keyLen + objectLen + 1] = '\0'; } } @catch (id e) { for (size_t i = 0; i < count; i++) - free(envp[i]); + OFFreeMemory(envp[i]); - free(envp); + OFFreeMemory(envp); @throw e; } return envp; ADDED src/platform/posix/OFTLSKey.m Index: src/platform/posix/OFTLSKey.m ================================================================== --- src/platform/posix/OFTLSKey.m +++ src/platform/posix/OFTLSKey.m @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#import "OFTLSKey.h" + +int +OFTLSKeyNew(OFTLSKey *key) +{ + return pthread_key_create(key, NULL); +} + +int +OFTLSKeyFree(OFTLSKey key) +{ + return pthread_key_delete(key); +} DELETED src/platform/posix/condition.m Index: src/platform/posix/condition.m ================================================================== --- src/platform/posix/condition.m +++ src/platform/posix/condition.m @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#import "condition.h" - -int -of_condition_new(of_condition_t *condition) -{ - return pthread_cond_init(condition, NULL); -} - -int -of_condition_signal(of_condition_t *condition) -{ - return pthread_cond_signal(condition); -} - -int -of_condition_broadcast(of_condition_t *condition) -{ - return pthread_cond_broadcast(condition); -} - -int -of_condition_wait(of_condition_t *condition, of_mutex_t *mutex) -{ - return pthread_cond_wait(condition, mutex); -} - -int -of_condition_timed_wait(of_condition_t *condition, of_mutex_t *mutex, - of_time_interval_t timeout) -{ - struct timespec ts; - - ts.tv_sec = (time_t)timeout; - ts.tv_nsec = (long)((timeout - ts.tv_sec) * 1000000000); - - return pthread_cond_timedwait(condition, mutex, &ts); -} - -int -of_condition_free(of_condition_t *condition) -{ - return pthread_cond_destroy(condition); -} DELETED src/platform/posix/mutex.m Index: src/platform/posix/mutex.m ================================================================== --- src/platform/posix/mutex.m +++ src/platform/posix/mutex.m @@ -1,197 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#import "mutex.h" - -int -of_mutex_new(of_mutex_t *mutex) -{ - return pthread_mutex_init(mutex, NULL); -} - -int -of_mutex_lock(of_mutex_t *mutex) -{ - return pthread_mutex_lock(mutex); -} - -int -of_mutex_trylock(of_mutex_t *mutex) -{ - return pthread_mutex_trylock(mutex); -} - -int -of_mutex_unlock(of_mutex_t *mutex) -{ - return pthread_mutex_unlock(mutex); -} - -int -of_mutex_free(of_mutex_t *mutex) -{ - return pthread_mutex_destroy(mutex); -} - -#ifdef OF_HAVE_RECURSIVE_PTHREAD_MUTEXES -int -of_rmutex_new(of_rmutex_t *rmutex) -{ - int error; - pthread_mutexattr_t attr; - - if ((error = pthread_mutexattr_init(&attr)) != 0) - return error; - - if ((error = pthread_mutexattr_settype(&attr, - PTHREAD_MUTEX_RECURSIVE)) != 0) - return error; - - if ((error = pthread_mutex_init(rmutex, &attr)) != 0) - return error; - - if ((error = pthread_mutexattr_destroy(&attr)) != 0) - return error; - - return 0; -} - -int -of_rmutex_lock(of_rmutex_t *rmutex) -{ - return of_mutex_lock(rmutex); -} - -int -of_rmutex_trylock(of_rmutex_t *rmutex) -{ - return of_mutex_trylock(rmutex); -} - -int -of_rmutex_unlock(of_rmutex_t *rmutex) -{ - return of_mutex_unlock(rmutex); -} - -int -of_rmutex_free(of_rmutex_t *rmutex) -{ - return of_mutex_free(rmutex); -} -#else -int -of_rmutex_new(of_rmutex_t *rmutex) -{ - int error; - - if ((error = of_mutex_new(&rmutex->mutex)) != 0) - return error; - - if ((error = of_tlskey_new(&rmutex->count)) != 0) - return error; - - return 0; -} - -int -of_rmutex_lock(of_rmutex_t *rmutex) -{ - uintptr_t count = (uintptr_t)of_tlskey_get(rmutex->count); - int error; - - if (count > 0) { - if ((error = of_tlskey_set(rmutex->count, - (void *)(count + 1))) != 0) - return error; - - return 0; - } - - if ((error = of_mutex_lock(&rmutex->mutex)) != 0) - return error; - - if ((error = of_tlskey_set(rmutex->count, (void *)1)) != 0) { - of_mutex_unlock(&rmutex->mutex); - return error; - } - - return 0; -} - -int -of_rmutex_trylock(of_rmutex_t *rmutex) -{ - uintptr_t count = (uintptr_t)of_tlskey_get(rmutex->count); - int error; - - if (count > 0) { - if ((error = of_tlskey_set(rmutex->count, - (void *)(count + 1))) != 0) - return error; - - return 0; - } - - if ((error = of_mutex_trylock(&rmutex->mutex)) != 0) - return error; - - if ((error = of_tlskey_set(rmutex->count, (void *)1)) != 0) { - of_mutex_unlock(&rmutex->mutex); - return error; - } - - return 0; -} - -int -of_rmutex_unlock(of_rmutex_t *rmutex) -{ - uintptr_t count = (uintptr_t)of_tlskey_get(rmutex->count); - int error; - - if (count > 1) { - if ((error = of_tlskey_set(rmutex->count, - (void *)(count - 1))) != 0) - return error; - - return 0; - } - - if ((error = of_tlskey_set(rmutex->count, (void *)0)) != 0) - return error; - - if ((error = of_mutex_unlock(&rmutex->mutex)) != 0) - return error; - - return 0; -} - -int -of_rmutex_free(of_rmutex_t *rmutex) -{ - int error; - - if ((error = of_mutex_free(&rmutex->mutex)) != 0) - return error; - - if ((error = of_tlskey_free(rmutex->count)) != 0) - return error; - - return 0; -} -#endif DELETED src/platform/posix/thread.m Index: src/platform/posix/thread.m ================================================================== --- src/platform/posix/thread.m +++ src/platform/posix/thread.m @@ -1,219 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#include - -#ifdef HAVE_PTHREAD_NP_H -# include -#endif - -#ifdef OF_HAIKU -# include -#endif - -#import "thread.h" -#import "macros.h" - -static int minPrio = 0, maxPrio = 0, normalPrio = 0; - -struct thread_ctx { - void (*function)(id object); - id object; - const char *name; -}; - -/* - * This is done here to make sure this is done as early as possible in the main - * thread. - */ -OF_CONSTRUCTOR() -{ - pthread_attr_t attr; - - if (pthread_attr_init(&attr) == 0) { -#ifdef HAVE_PTHREAD_ATTR_GETSCHEDPOLICY - int policy; -#endif - struct sched_param param; - -#ifdef HAVE_PTHREAD_ATTR_GETSCHEDPOLICY - if (pthread_attr_getschedpolicy(&attr, &policy) == 0) { - minPrio = sched_get_priority_min(policy); - maxPrio = sched_get_priority_max(policy); - - if (minPrio == -1 || maxPrio == -1) - minPrio = maxPrio = 0; - } -#endif - - if (pthread_attr_getschedparam(&attr, ¶m) != 0) - normalPrio = param.sched_priority; - else - minPrio = maxPrio = 0; - - pthread_attr_destroy(&attr); - } -} - -static void * -functionWrapper(void *data) -{ - struct thread_ctx *ctx = data; - - if (ctx->name != NULL) - of_thread_set_name(ctx->name); - - pthread_cleanup_push(free, data); - - ctx->function(ctx->object); - - pthread_cleanup_pop(1); - return NULL; -} - -int -of_thread_attr_init(of_thread_attr_t *attr) -{ - int error; - pthread_attr_t POSIXAttr; - - attr->priority = 0; - attr->stackSize = 0; - - if ((error = pthread_attr_init(&POSIXAttr)) != 0) { - if (error == ENOSYS) - return 0; - - return error; - } - - error = pthread_attr_getstacksize(&POSIXAttr, &attr->stackSize); - - pthread_attr_destroy(&POSIXAttr); - - return error; -} - -int -of_thread_new(of_thread_t *thread, const char *name, void (*function)(id), - id object, const of_thread_attr_t *attr) -{ - int error = 0; - pthread_attr_t POSIXAttr; - bool POSIXAttrAvailable = true; - - if ((error = pthread_attr_init(&POSIXAttr)) != 0) { - if (error == ENOSYS) - POSIXAttrAvailable = false; - else - return error; - } - - @try { - struct thread_ctx *ctx; - - if (attr != NULL && POSIXAttrAvailable) { -#ifndef OF_HPUX - struct sched_param param; -#endif - - if (attr->priority < -1 || attr->priority > 1) - return EINVAL; - -#ifndef OF_HPUX -# ifdef HAVE_PTHREAD_ATTR_SETINHERITSCHED - if ((error = pthread_attr_setinheritsched(&POSIXAttr, - PTHREAD_EXPLICIT_SCHED)) != 0) - return error; -# endif - - if ((error = pthread_attr_getschedparam(&POSIXAttr, - ¶m)) != 0) - return error; - - if (attr->priority < 0) { - param.sched_priority = minPrio + - (1.0f + attr->priority) * - (normalPrio - minPrio); - } else - param.sched_priority = normalPrio + - attr->priority * (maxPrio - normalPrio); - - if ((error = pthread_attr_setschedparam(&POSIXAttr, - ¶m)) != 0) - return error; -#endif - - if (attr->stackSize > 0) { - if ((error = pthread_attr_setstacksize( - &POSIXAttr, attr->stackSize)) != 0) - return error; - } - } - - if ((ctx = malloc(sizeof(*ctx))) == NULL) - return ENOMEM; - - ctx->function = function; - ctx->object = object; - ctx->name = name; - - error = pthread_create(thread, - (POSIXAttrAvailable ? &POSIXAttr : NULL), functionWrapper, - ctx); - } @finally { - if (POSIXAttrAvailable) - pthread_attr_destroy(&POSIXAttr); - } - - return error; -} - -int -of_thread_join(of_thread_t thread) -{ - void *ret; - - return pthread_join(thread, &ret); -} - -int -of_thread_detach(of_thread_t thread) -{ - return pthread_detach(thread); -} - -void -of_thread_set_name(const char *name) -{ -#if defined(OF_HAIKU) - rename_thread(find_thread(NULL), name); -#elif defined(HAVE_PTHREAD_SET_NAME_NP) - pthread_set_name_np(pthread_self(), name); -#elif defined(HAVE_PTHREAD_SETNAME_NP) -# if defined(OF_MACOS) || defined(OF_IOS) - pthread_setname_np(name); -# elif defined(__GLIBC__) - char buffer[16]; - - strncpy(buffer, name, 15); - buffer[15] = 0; - - pthread_setname_np(pthread_self(), buffer); -# endif -#endif -} DELETED src/platform/posix/tlskey.m Index: src/platform/posix/tlskey.m ================================================================== --- src/platform/posix/tlskey.m +++ src/platform/posix/tlskey.m @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#import "tlskey.h" - -int -of_tlskey_new(of_tlskey_t *key) -{ - return pthread_key_create(key, NULL); -} - -int -of_tlskey_free(of_tlskey_t key) -{ - return pthread_key_delete(key); -} ADDED src/platform/windows/OFPlainCondition.m Index: src/platform/windows/OFPlainCondition.m ================================================================== --- src/platform/windows/OFPlainCondition.m +++ src/platform/windows/OFPlainCondition.m @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#include + +#import "OFPlainCondition.h" + +#include + +int +OFPlainConditionNew(OFPlainCondition *condition) +{ + condition->count = 0; + + if ((condition->event = CreateEvent(NULL, FALSE, 0, NULL)) == NULL) + return EAGAIN; + + return 0; +} + +int +OFPlainConditionSignal(OFPlainCondition *condition) +{ + if (!SetEvent(condition->event)) { + switch (GetLastError()) { + case ERROR_INVALID_HANDLE: + return EINVAL; + default: + OFEnsure(0); + } + } + + return 0; +} + +int +OFPlainConditionBroadcast(OFPlainCondition *condition) +{ + int count = condition->count; + + for (int i = 0; i < count; i++) { + if (!SetEvent(condition->event)) { + switch (GetLastError()) { + case ERROR_INVALID_HANDLE: + return EINVAL; + default: + OFEnsure(0); + } + } + } + + return 0; +} + +int +OFPlainConditionWait(OFPlainCondition *condition, OFPlainMutex *mutex) +{ + int error; + DWORD status; + + if ((error = OFPlainMutexUnlock(mutex)) != 0) + return error; + + OFAtomicIntIncrease(&condition->count); + status = WaitForSingleObject(condition->event, INFINITE); + OFAtomicIntDecrease(&condition->count); + + switch (status) { + case WAIT_OBJECT_0: + return OFPlainMutexLock(mutex); + case WAIT_FAILED: + switch (GetLastError()) { + case ERROR_INVALID_HANDLE: + return EINVAL; + default: + OFEnsure(0); + } + default: + OFEnsure(0); + } +} + +int +OFPlainConditionTimedWait(OFPlainCondition *condition, OFPlainMutex *mutex, + OFTimeInterval timeout) +{ + int error; + DWORD status; + + if ((error = OFPlainMutexUnlock(mutex)) != 0) + return error; + + OFAtomicIntIncrease(&condition->count); + status = WaitForSingleObject(condition->event, timeout * 1000); + OFAtomicIntDecrease(&condition->count); + + switch (status) { + case WAIT_OBJECT_0: + return OFPlainMutexLock(mutex); + case WAIT_TIMEOUT: + return ETIMEDOUT; + case WAIT_FAILED: + switch (GetLastError()) { + case ERROR_INVALID_HANDLE: + return EINVAL; + default: + OFEnsure(0); + } + default: + OFEnsure(0); + } +} + +int +OFPlainConditionFree(OFPlainCondition *condition) +{ + if (condition->count != 0) + return EBUSY; + + return (CloseHandle(condition->event) ? 0 : EINVAL); +} ADDED src/platform/windows/OFPlainMutex.m Index: src/platform/windows/OFPlainMutex.m ================================================================== --- src/platform/windows/OFPlainMutex.m +++ src/platform/windows/OFPlainMutex.m @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#include + +#import "OFPlainMutex.h" + +#include + +int +OFPlainMutexNew(OFPlainMutex *mutex) +{ + InitializeCriticalSection(mutex); + + return 0; +} + +int +OFPlainMutexLock(OFPlainMutex *mutex) +{ + EnterCriticalSection(mutex); + + return 0; +} + +int +OFPlainMutexTryLock(OFPlainMutex *mutex) +{ + if (!TryEnterCriticalSection(mutex)) + return EBUSY; + + return 0; +} + +int +OFPlainMutexUnlock(OFPlainMutex *mutex) +{ + LeaveCriticalSection(mutex); + + return 0; +} + +int +OFPlainMutexFree(OFPlainMutex *mutex) +{ + DeleteCriticalSection(mutex); + + return 0; +} + +int +OFPlainRecursiveMutexNew(OFPlainRecursiveMutex *rmutex) +{ + return OFPlainMutexNew(rmutex); +} + +int +OFPlainRecursiveMutexLock(OFPlainRecursiveMutex *rmutex) +{ + return OFPlainMutexLock(rmutex); +} + +int +OFPlainRecursiveMutexTryLock(OFPlainRecursiveMutex *rmutex) +{ + return OFPlainMutexTryLock(rmutex); +} + +int +OFPlainRecursiveMutexUnlock(OFPlainRecursiveMutex *rmutex) +{ + return OFPlainMutexUnlock(rmutex); +} + +int +OFPlainRecursiveMutexFree(OFPlainRecursiveMutex *rmutex) +{ + return OFPlainMutexFree(rmutex); +} ADDED src/platform/windows/OFPlainThread.m Index: src/platform/windows/OFPlainThread.m ================================================================== --- src/platform/windows/OFPlainThread.m +++ src/platform/windows/OFPlainThread.m @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#include + +#import "OFPlainThread.h" + +#import "macros.h" + +#include + +struct ThreadContext { + void (*function)(id); + id object; +}; + +static WINAPI void +functionWrapper(struct ThreadContext *context) +{ + context->function(context->object); + + free(context); +} + +int +OFPlainThreadAttributesInit(OFPlainThreadAttributes *attr) +{ + attr->priority = 0; + attr->stackSize = 0; + + return 0; +} + +int +OFPlainThreadNew(OFPlainThread *thread, const char *name, void (*function)(id), + id object, const OFPlainThreadAttributes *attr) +{ + DWORD priority = THREAD_PRIORITY_NORMAL; + struct ThreadContext *context; + DWORD threadID; + + if (attr != NULL && attr->priority != 0) { + if (attr->priority < -1 || attr->priority > 1) + return EINVAL; + + if (attr->priority < 0) + priority = THREAD_PRIORITY_LOWEST + + (1.0 + attr->priority) * + (THREAD_PRIORITY_NORMAL - THREAD_PRIORITY_LOWEST); + else + priority = THREAD_PRIORITY_NORMAL + + attr->priority * + (THREAD_PRIORITY_HIGHEST - THREAD_PRIORITY_NORMAL); + } + + if ((context = malloc(sizeof(*context))) == NULL) + return ENOMEM; + + context->function = function; + context->object = object; + + *thread = CreateThread(NULL, (attr != NULL ? attr->stackSize : 0), + (LPTHREAD_START_ROUTINE)functionWrapper, context, 0, &threadID); + + if (thread == NULL) { + int error; + + switch (GetLastError()) { + case ERROR_NOT_ENOUGH_MEMORY: + error = ENOMEM; + break; + case ERROR_ACCESS_DENIED: + error = EACCES; + break; + default: + OFEnsure(0); + } + + free(context); + return error; + } + + if (attr != NULL && attr->priority != 0) + OFEnsure(!SetThreadPriority(*thread, priority)); + + return 0; +} + +int +OFPlainThreadJoin(OFPlainThread thread) +{ + switch (WaitForSingleObject(thread, INFINITE)) { + case WAIT_OBJECT_0: + CloseHandle(thread); + return 0; + case WAIT_FAILED: + switch (GetLastError()) { + case ERROR_INVALID_HANDLE: + return EINVAL; + default: + OFEnsure(0); + } + default: + OFEnsure(0); + } +} + +int +OFPlainThreadDetach(OFPlainThread thread) +{ + CloseHandle(thread); + + return 0; +} + +void +OFSetThreadName(const char *name) +{ +} Index: src/platform/windows/OFString+PathAdditions.m ================================================================== --- src/platform/windows/OFString+PathAdditions.m +++ src/platform/windows/OFString+PathAdditions.m @@ -155,12 +155,12 @@ OFString *ret, *fileName; size_t pos; fileName = self.lastPathComponent; pos = [fileName rangeOfString: @"." - options: OF_STRING_SEARCH_BACKWARDS].location; - if (pos == OF_NOT_FOUND || pos == 0) { + options: OFStringSearchBackwards].location; + if (pos == OFNotFound || pos == 0) { objc_autoreleasePoolPop(pool); return @""; } ret = [fileName substringFromIndex: pos + 1]; @@ -201,11 +201,11 @@ objc_autoreleasePoolPop(pool); return @"."; } components = [components objectsInRange: - of_range(0, components.count - 1)]; + OFRangeMake(0, components.count - 1)]; ret = [OFString pathWithComponents: components]; [ret retain]; objc_autoreleasePoolPop(pool); return [ret autorelease]; @@ -224,12 +224,12 @@ pool = objc_autoreleasePoolPush(); components = [[self.pathComponents mutableCopy] autorelease]; fileName = components.lastObject; pos = [fileName rangeOfString: @"." - options: OF_STRING_SEARCH_BACKWARDS].location; - if (pos == OF_NOT_FOUND || pos == 0) { + options: OFStringSearchBackwards].location; + if (pos == OFNotFound || pos == 0) { objc_autoreleasePoolPop(pool); return [[self copy] autorelease]; } fileName = [fileName substringToIndex: pos]; @@ -286,11 +286,11 @@ ![parent hasSuffix: @":"] && ![parent hasSuffix: @":\\"] && ![parent hasSuffix: @"://"] && (![parent hasPrefix: @"\\"] || i != 1)) { [array removeObjectsInRange: - of_range(i - 1, 2)]; + OFRangeMake(i - 1, 2)]; done = false; break; } } @@ -337,11 +337,11 @@ *URLEncodedHost = [[components objectAtIndex: 1] stringByURLEncodingWithAllowedCharacters: [OFCharacterSet URLHostAllowedCharacterSet]]; path = [OFString pathWithComponents: [components - objectsInRange: of_range(2, components.count - 2)]]; + objectsInRange: OFRangeMake(2, components.count - 2)]]; } path = [path stringByReplacingOccurrencesOfString: @"\\" withString: @"/"]; path = [path stringByPrependingString: @"/"]; Index: src/platform/windows/OFSubprocess.m ================================================================== --- src/platform/windows/OFSubprocess.m +++ src/platform/windows/OFSubprocess.m @@ -33,11 +33,11 @@ #import "OFWriteFailedException.h" #include @interface OFSubprocess () -- (of_char16_t *)of_wideEnvironmentForDictionary: (OFDictionary *)dictionary; +- (OFChar16 *)of_wideEnvironmentForDictionary: (OFDictionary *)dictionary; - (char *)of_environmentForDictionary: (OFDictionary *)environment; @end @implementation OFSubprocess + (instancetype)subprocessWithProgram: (OFString *)program @@ -180,11 +180,11 @@ [argumentsString appendString: @"\""]; } if ([OFSystemInfo isWindowsNT]) { size_t length; - of_char16_t *argumentsCopy; + OFChar16 *argumentsCopy; STARTUPINFOW si; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); si.hStdInput = _writePipe[0]; @@ -191,12 +191,12 @@ si.hStdOutput = _readPipe[1]; si.hStdError = GetStdHandle(STD_ERROR_HANDLE); si.dwFlags |= STARTF_USESTDHANDLES; length = argumentsString.UTF16StringLength; - argumentsCopy = of_alloc(length + 1, - sizeof(of_char16_t)); + argumentsCopy = OFAllocMemory(length + 1, + sizeof(OFChar16)); memcpy(argumentsCopy, argumentsString.UTF16String, (length + 1) * 2); @try { if (!CreateProcessW(program.UTF16String, argumentsCopy, NULL, NULL, TRUE, @@ -204,14 +204,14 @@ [self of_wideEnvironmentForDictionary: environment], NULL, &si, &pi)) @throw [OFInitializationFailedException exceptionWithClass: self.class]; } @finally { - free(argumentsCopy); + OFFreeMemory(argumentsCopy); } } else { - of_string_encoding_t encoding = [OFLocale encoding]; + OFStringEncoding encoding = [OFLocale encoding]; STARTUPINFO si; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); si.hStdInput = _writePipe[0]; @@ -249,22 +249,22 @@ [self close]; [super dealloc]; } -- (of_char16_t *)of_wideEnvironmentForDictionary: (OFDictionary *)environment +- (OFChar16 *)of_wideEnvironmentForDictionary: (OFDictionary *)environment { OFMutableData *env; OFEnumerator *keyEnumerator, *objectEnumerator; OFString *key, *object; - const of_char16_t equal = '='; - const of_char16_t zero[2] = { 0, 0 }; + const OFChar16 equal = '='; + const OFChar16 zero[2] = { 0, 0 }; if (environment == nil) return NULL; - env = [OFMutableData dataWithItemSize: sizeof(of_char16_t)]; + env = [OFMutableData dataWithItemSize: sizeof(OFChar16)]; keyEnumerator = [environment keyEnumerator]; objectEnumerator = [environment objectEnumerator]; while ((key = [keyEnumerator nextObject]) != nil && (object = [objectEnumerator nextObject]) != nil) { @@ -279,11 +279,11 @@ return env.mutableItems; } - (char *)of_environmentForDictionary: (OFDictionary *)environment { - of_string_encoding_t encoding = [OFLocale encoding]; + OFStringEncoding encoding = [OFLocale encoding]; OFMutableData *env; OFEnumerator *keyEnumerator, *objectEnumerator; OFString *key, *object; if (environment == nil) ADDED src/platform/windows/OFTLSKey.m Index: src/platform/windows/OFTLSKey.m ================================================================== --- src/platform/windows/OFTLSKey.m +++ src/platform/windows/OFTLSKey.m @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#import "OFTLSKey.h" + +int +OFTLSKeyNew(OFTLSKey *key) +{ + *key = TlsAlloc(); + + if (*key == TLS_OUT_OF_INDEXES) + return EAGAIN; + + return 0; +} + +int +OFTLSKeyFree(OFTLSKey key) +{ + return (TlsFree(key) ? 0 : EINVAL); +} DELETED src/platform/windows/condition.m Index: src/platform/windows/condition.m ================================================================== --- src/platform/windows/condition.m +++ src/platform/windows/condition.m @@ -1,135 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#include - -#import "condition.h" - -#include - -int -of_condition_new(of_condition_t *condition) -{ - condition->count = 0; - - if ((condition->event = CreateEvent(NULL, FALSE, 0, NULL)) == NULL) - return EAGAIN; - - return 0; -} - -int -of_condition_signal(of_condition_t *condition) -{ - if (!SetEvent(condition->event)) { - switch (GetLastError()) { - case ERROR_INVALID_HANDLE: - return EINVAL; - default: - OF_ENSURE(0); - } - } - - return 0; -} - -int -of_condition_broadcast(of_condition_t *condition) -{ - int count = condition->count; - - for (int i = 0; i < count; i++) { - if (!SetEvent(condition->event)) { - switch (GetLastError()) { - case ERROR_INVALID_HANDLE: - return EINVAL; - default: - OF_ENSURE(0); - } - } - } - - return 0; -} - -int -of_condition_wait(of_condition_t *condition, of_mutex_t *mutex) -{ - int error; - DWORD status; - - if ((error = of_mutex_unlock(mutex)) != 0) - return error; - - of_atomic_int_inc(&condition->count); - status = WaitForSingleObject(condition->event, INFINITE); - of_atomic_int_dec(&condition->count); - - switch (status) { - case WAIT_OBJECT_0: - return of_mutex_lock(mutex); - case WAIT_FAILED: - switch (GetLastError()) { - case ERROR_INVALID_HANDLE: - return EINVAL; - default: - OF_ENSURE(0); - } - default: - OF_ENSURE(0); - } -} - -int -of_condition_timed_wait(of_condition_t *condition, of_mutex_t *mutex, - of_time_interval_t timeout) -{ - int error; - DWORD status; - - if ((error = of_mutex_unlock(mutex)) != 0) - return error; - - of_atomic_int_inc(&condition->count); - status = WaitForSingleObject(condition->event, timeout * 1000); - of_atomic_int_dec(&condition->count); - - switch (status) { - case WAIT_OBJECT_0: - return of_mutex_lock(mutex); - case WAIT_TIMEOUT: - return ETIMEDOUT; - case WAIT_FAILED: - switch (GetLastError()) { - case ERROR_INVALID_HANDLE: - return EINVAL; - default: - OF_ENSURE(0); - } - default: - OF_ENSURE(0); - } -} - -int -of_condition_free(of_condition_t *condition) -{ - if (condition->count != 0) - return EBUSY; - - return (CloseHandle(condition->event) ? 0 : EINVAL); -} DELETED src/platform/windows/mutex.m Index: src/platform/windows/mutex.m ================================================================== --- src/platform/windows/mutex.m +++ src/platform/windows/mutex.m @@ -1,93 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#include - -#import "mutex.h" - -#include - -int -of_mutex_new(of_mutex_t *mutex) -{ - InitializeCriticalSection(mutex); - - return 0; -} - -int -of_mutex_lock(of_mutex_t *mutex) -{ - EnterCriticalSection(mutex); - - return 0; -} - -int -of_mutex_trylock(of_mutex_t *mutex) -{ - if (!TryEnterCriticalSection(mutex)) - return EBUSY; - - return 0; -} - -int -of_mutex_unlock(of_mutex_t *mutex) -{ - LeaveCriticalSection(mutex); - - return 0; -} - -int -of_mutex_free(of_mutex_t *mutex) -{ - DeleteCriticalSection(mutex); - - return 0; -} - -int -of_rmutex_new(of_rmutex_t *rmutex) -{ - return of_mutex_new(rmutex); -} - -int -of_rmutex_lock(of_rmutex_t *rmutex) -{ - return of_mutex_lock(rmutex); -} - -int -of_rmutex_trylock(of_rmutex_t *rmutex) -{ - return of_mutex_trylock(rmutex); -} - -int -of_rmutex_unlock(of_rmutex_t *rmutex) -{ - return of_mutex_unlock(rmutex); -} - -int -of_rmutex_free(of_rmutex_t *rmutex) -{ - return of_mutex_free(rmutex); -} DELETED src/platform/windows/thread.m Index: src/platform/windows/thread.m ================================================================== --- src/platform/windows/thread.m +++ src/platform/windows/thread.m @@ -1,132 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#include - -#import "thread.h" -#import "macros.h" - -#include - -struct thread_context { - void (*function)(id); - id object; -}; - -static WINAPI void -functionWrapper(struct thread_context *context) -{ - context->function(context->object); - - free(context); -} - -int -of_thread_attr_init(of_thread_attr_t *attr) -{ - attr->priority = 0; - attr->stackSize = 0; - - return 0; -} - -int -of_thread_new(of_thread_t *thread, const char *name, void (*function)(id), - id object, const of_thread_attr_t *attr) -{ - DWORD priority = THREAD_PRIORITY_NORMAL; - struct thread_context *context; - DWORD threadID; - - if (attr != NULL && attr->priority != 0) { - if (attr->priority < -1 || attr->priority > 1) - return EINVAL; - - if (attr->priority < 0) - priority = THREAD_PRIORITY_LOWEST + - (1.0 + attr->priority) * - (THREAD_PRIORITY_NORMAL - THREAD_PRIORITY_LOWEST); - else - priority = THREAD_PRIORITY_NORMAL + - attr->priority * - (THREAD_PRIORITY_HIGHEST - THREAD_PRIORITY_NORMAL); - } - - if ((context = malloc(sizeof(*context))) == NULL) - return ENOMEM; - - context->function = function; - context->object = object; - - *thread = CreateThread(NULL, (attr != NULL ? attr->stackSize : 0), - (LPTHREAD_START_ROUTINE)functionWrapper, context, 0, &threadID); - - if (thread == NULL) { - int error; - - switch (GetLastError()) { - case ERROR_NOT_ENOUGH_MEMORY: - error = ENOMEM; - break; - case ERROR_ACCESS_DENIED: - error = EACCES; - break; - default: - OF_ENSURE(0); - } - - free(context); - return error; - } - - if (attr != NULL && attr->priority != 0) - OF_ENSURE(!SetThreadPriority(*thread, priority)); - - return 0; -} - -int -of_thread_join(of_thread_t thread) -{ - switch (WaitForSingleObject(thread, INFINITE)) { - case WAIT_OBJECT_0: - CloseHandle(thread); - return 0; - case WAIT_FAILED: - switch (GetLastError()) { - case ERROR_INVALID_HANDLE: - return EINVAL; - default: - OF_ENSURE(0); - } - default: - OF_ENSURE(0); - } -} - -int -of_thread_detach(of_thread_t thread) -{ - CloseHandle(thread); - - return 0; -} - -void -of_thread_set_name(const char *name) -{ -} DELETED src/platform/windows/tlskey.m Index: src/platform/windows/tlskey.m ================================================================== --- src/platform/windows/tlskey.m +++ src/platform/windows/tlskey.m @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#import "tlskey.h" - -int -of_tlskey_new(of_tlskey_t *key) -{ - *key = TlsAlloc(); - - if (*key == TLS_OUT_OF_INDEXES) - return EAGAIN; - - return 0; -} - -int -of_tlskey_free(of_tlskey_t key) -{ - return (TlsFree(key) ? 0 : EINVAL); -} Index: src/runtime/Makefile ================================================================== --- src/runtime/Makefile +++ src/runtime/Makefile @@ -30,14 +30,14 @@ sparsearray.m \ static-instances.m \ synchronized.m \ tagged-pointer.m \ ${USE_SRCS_THREADS} -SRCS_THREADS = mutex.m \ - once.m \ - threading.m \ - tlskey.m +SRCS_THREADS = OFOnce.m \ + OFPlainMutex.m \ + OFTLSKey.m \ + threading.m INCLUDES = ObjFWRT.h includesubdir = ObjFWRT OBJS_EXTRA = lookup-asm/lookup-asm.a LIB_OBJS_EXTRA = lookup-asm/lookup-asm.lib.a ADDED src/runtime/OFOnce.m Index: src/runtime/OFOnce.m ================================================================== --- src/runtime/OFOnce.m +++ src/runtime/OFOnce.m @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#import "ObjFWRT.h" +#import "private.h" + +#include "../OFOnce.m" ADDED src/runtime/OFPlainMutex.m Index: src/runtime/OFPlainMutex.m ================================================================== --- src/runtime/OFPlainMutex.m +++ src/runtime/OFPlainMutex.m @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#import "ObjFWRT.h" +#import "private.h" + +#include "../OFPlainMutex.m" ADDED src/runtime/OFTLSKey.m Index: src/runtime/OFTLSKey.m ================================================================== --- src/runtime/OFTLSKey.m +++ src/runtime/OFTLSKey.m @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2008-2021 Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#import "ObjFWRT.h" +#import "private.h" + +#include "../OFTLSKey.m" Index: src/runtime/arc.m ================================================================== --- src/runtime/arc.m +++ src/runtime/arc.m @@ -17,21 +17,21 @@ #import "ObjFWRT.h" #import "private.h" #ifdef OF_HAVE_THREADS -# import "mutex.h" +# import "OFPlainMutex.h" #endif -struct weak_ref { +struct weakref { id **locations; size_t count; }; static struct objc_hashtable *hashtable; #ifdef OF_HAVE_THREADS -static of_spinlock_t spinlock; +static OFSpinlock spinlock; #endif static uint32_t hash(const void *object) { @@ -47,11 +47,11 @@ OF_CONSTRUCTOR() { hashtable = objc_hashtable_new(hash, equal, 2); #ifdef OF_HAVE_THREADS - if (of_spinlock_new(&spinlock) != 0) + if (OFSpinlockNew(&spinlock) != 0) OBJC_ERROR("Failed to create spinlock!"); #endif } id @@ -115,14 +115,14 @@ } id objc_storeWeak(id *object, id value) { - struct weak_ref *old; + struct weakref *old; #ifdef OF_HAVE_THREADS - if (of_spinlock_lock(&spinlock) != 0) + if (OFSpinlockLock(&spinlock) != 0) OBJC_ERROR("Failed to lock spinlock!"); #endif if (*object != nil && (old = objc_hashtable_get(hashtable, *object)) != NULL) { @@ -153,11 +153,11 @@ } } if (value != nil && class_respondsToSelector(object_getClass(value), @selector(allowsWeakReference)) && [value allowsWeakReference]) { - struct weak_ref *ref = objc_hashtable_get(hashtable, value); + struct weakref *ref = objc_hashtable_get(hashtable, value); if (ref == NULL) { if ((ref = calloc(1, sizeof(*ref))) == NULL) OBJC_ERROR("Not enough memory to allocate weak " "reference!"); @@ -175,11 +175,11 @@ value = nil; *object = value; #ifdef OF_HAVE_THREADS - if (of_spinlock_unlock(&spinlock) != 0) + if (OFSpinlockUnlock(&spinlock) != 0) OBJC_ERROR("Failed to unlock spinlock!"); #endif return value; } @@ -186,23 +186,23 @@ id objc_loadWeakRetained(id *object) { id value = nil; - struct weak_ref *ref; + struct weakref *ref; #ifdef OF_HAVE_THREADS - if (of_spinlock_lock(&spinlock) != 0) + if (OFSpinlockLock(&spinlock) != 0) OBJC_ERROR("Failed to lock spinlock!"); #endif if (*object != nil && (ref = objc_hashtable_get(hashtable, *object)) != NULL) value = *object; #ifdef OF_HAVE_THREADS - if (of_spinlock_unlock(&spinlock) != 0) + if (OFSpinlockUnlock(&spinlock) != 0) OBJC_ERROR("Failed to unlock spinlock!"); #endif if (class_respondsToSelector(object_getClass(value), @selector(retainWeakReference)) && [value retainWeakReference]) @@ -237,14 +237,14 @@ } void objc_moveWeak(id *dest, id *src) { - struct weak_ref *ref; + struct weakref *ref; #ifdef OF_HAVE_THREADS - if (of_spinlock_lock(&spinlock) != 0) + if (OFSpinlockLock(&spinlock) != 0) OBJC_ERROR("Failed to lock spinlock!"); #endif if (*src != nil && (ref = objc_hashtable_get(hashtable, *src)) != NULL) { @@ -258,22 +258,22 @@ *dest = *src; *src = nil; #ifdef OF_HAVE_THREADS - if (of_spinlock_unlock(&spinlock) != 0) + if (OFSpinlockUnlock(&spinlock) != 0) OBJC_ERROR("Failed to unlock spinlock!"); #endif } void objc_zero_weak_references(id value) { - struct weak_ref *ref; + struct weakref *ref; #ifdef OF_HAVE_THREADS - if (of_spinlock_lock(&spinlock) != 0) + if (OFSpinlockLock(&spinlock) != 0) OBJC_ERROR("Failed to lock spinlock!"); #endif if ((ref = objc_hashtable_get(hashtable, value)) != NULL) { for (size_t i = 0; i < ref->count; i++) @@ -283,9 +283,9 @@ free(ref->locations); free(ref); } #ifdef OF_HAVE_THREADS - if (of_spinlock_unlock(&spinlock) != 0) + if (OFSpinlockUnlock(&spinlock) != 0) OBJC_ERROR("Failed to unlock spinlock!"); #endif } Index: src/runtime/autorelease.m ================================================================== --- src/runtime/autorelease.m +++ src/runtime/autorelease.m @@ -25,11 +25,11 @@ # import #endif #import "macros.h" #if !defined(OF_HAVE_COMPILER_TLS) && defined(OF_HAVE_THREADS) -# import "tlskey.h" +# import "OFTLSKey.h" #endif #ifndef OF_OBJFW_RUNTIME @interface DummyObject - (void)release; @@ -39,41 +39,41 @@ #if defined(OF_HAVE_COMPILER_TLS) static thread_local id *objects = NULL; static thread_local uintptr_t count = 0; static thread_local uintptr_t size = 0; #elif defined(OF_HAVE_THREADS) -static of_tlskey_t objectsKey, countKey, sizeKey; +static OFTLSKey objectsKey, countKey, sizeKey; #else static id *objects = NULL; static uintptr_t count = 0; static uintptr_t size = 0; #endif #if !defined(OF_HAVE_COMPILER_TLS) && defined(OF_HAVE_THREADS) OF_CONSTRUCTOR() { - OF_ENSURE(of_tlskey_new(&objectsKey) == 0); - OF_ENSURE(of_tlskey_new(&countKey) == 0); - OF_ENSURE(of_tlskey_new(&sizeKey) == 0); + OFEnsure(OFTLSKeyNew(&objectsKey) == 0); + OFEnsure(OFTLSKeyNew(&countKey) == 0); + OFEnsure(OFTLSKeyNew(&sizeKey) == 0); } #endif void * objc_autoreleasePoolPush() { #if !defined(OF_HAVE_COMPILER_TLS) && defined(OF_HAVE_THREADS) - uintptr_t count = (uintptr_t)of_tlskey_get(countKey); + uintptr_t count = (uintptr_t)OFTLSKeyGet(countKey); #endif return (void *)count; } void objc_autoreleasePoolPop(void *pool) { #if !defined(OF_HAVE_COMPILER_TLS) && defined(OF_HAVE_THREADS) - id *objects = of_tlskey_get(objectsKey); - uintptr_t count = (uintptr_t)of_tlskey_get(countKey); + id *objects = OFTLSKeyGet(objectsKey); + uintptr_t count = (uintptr_t)OFTLSKeyGet(countKey); #endif uintptr_t idx = (uintptr_t)pool; bool freeMem = false; if (idx == (uintptr_t)-1) { @@ -83,12 +83,12 @@ for (uintptr_t i = idx; i < count; i++) { [objects[i] release]; #if !defined(OF_HAVE_COMPILER_TLS) && defined(OF_HAVE_THREADS) - objects = of_tlskey_get(objectsKey); - count = (uintptr_t)of_tlskey_get(countKey); + objects = OFTLSKeyGet(objectsKey); + count = (uintptr_t)OFTLSKeyGet(countKey); #endif } count = idx; @@ -96,47 +96,47 @@ free(objects); objects = NULL; #if defined(OF_HAVE_COMPILER_TLS) || !defined(OF_HAVE_THREADS) size = 0; #else - OF_ENSURE(of_tlskey_set(objectsKey, objects) == 0); - OF_ENSURE(of_tlskey_set(sizeKey, (void *)0) == 0); + OFEnsure(OFTLSKeySet(objectsKey, objects) == 0); + OFEnsure(OFTLSKeySet(sizeKey, (void *)0) == 0); #endif } #if !defined(OF_HAVE_COMPILER_TLS) && defined(OF_HAVE_THREADS) - OF_ENSURE(of_tlskey_set(countKey, (void *)count) == 0); + OFEnsure(OFTLSKeySet(countKey, (void *)count) == 0); #endif } id _objc_rootAutorelease(id object) { #if !defined(OF_HAVE_COMPILER_TLS) && defined(OF_HAVE_THREADS) - id *objects = of_tlskey_get(objectsKey); - uintptr_t count = (uintptr_t)of_tlskey_get(countKey); - uintptr_t size = (uintptr_t)of_tlskey_get(sizeKey); + id *objects = OFTLSKeyGet(objectsKey); + uintptr_t count = (uintptr_t)OFTLSKeyGet(countKey); + uintptr_t size = (uintptr_t)OFTLSKeyGet(sizeKey); #endif if (count >= size) { if (size == 0) size = 16; else size *= 2; - OF_ENSURE((objects = + OFEnsure((objects = realloc(objects, size * sizeof(id))) != NULL); #if !defined(OF_HAVE_COMPILER_TLS) && defined(OF_HAVE_THREADS) - OF_ENSURE(of_tlskey_set(objectsKey, objects) == 0); - OF_ENSURE(of_tlskey_set(sizeKey, (void *)size) == 0); + OFEnsure(OFTLSKeySet(objectsKey, objects) == 0); + OFEnsure(OFTLSKeySet(sizeKey, (void *)size) == 0); #endif } objects[count++] = object; #if !defined(OF_HAVE_COMPILER_TLS) && defined(OF_HAVE_THREADS) - OF_ENSURE(of_tlskey_set(countKey, (void *)count) == 0); + OFEnsure(OFTLSKeySet(countKey, (void *)count) == 0); #endif return object; } Index: src/runtime/class.m ================================================================== --- src/runtime/class.m +++ src/runtime/class.m @@ -629,11 +629,11 @@ if ((ret = malloc((classesCount + 1) * sizeof(Class))) == NULL) OBJC_ERROR("Failed to allocate memory for class list!"); count = objc_getClassList(ret, classesCount); - OF_ENSURE(count == classesCount); + OFEnsure(count == classesCount); ret[count] = Nil; if (length != NULL) *length = count; @@ -974,11 +974,11 @@ */ i = UINT32_MAX; } } - OF_ENSURE(classesCount == 0); + OFEnsure(classesCount == 0); if (emptyDTable != NULL) { objc_dtable_free(emptyDTable); emptyDTable = NULL; } Index: src/runtime/exception.m ================================================================== --- src/runtime/exception.m +++ src/runtime/exception.m @@ -24,11 +24,11 @@ #import "ObjFWRT.h" #import "private.h" #import "macros.h" #ifdef OF_HAVE_THREADS -# include "mutex.h" +# include "OFPlainMutex.h" #endif #ifdef HAVE_SEH_EXCEPTIONS # include #endif @@ -240,15 +240,15 @@ #endif static objc_uncaught_exception_handler_t uncaughtExceptionHandler; static struct objc_exception emergencyExceptions[NUM_EMERGENCY_EXCEPTIONS]; #ifdef OF_HAVE_THREADS -static of_spinlock_t emergencyExceptionsSpinlock; +static OFSpinlock emergencyExceptionsSpinlock; OF_CONSTRUCTOR() { - if (of_spinlock_new(&emergencyExceptionsSpinlock) != 0) + if (OFSpinlockNew(&emergencyExceptionsSpinlock) != 0) OBJC_ERROR("Cannot create spinlock!"); } #endif static uint64_t @@ -336,11 +336,11 @@ { uint64_t value; if (enc == DW_EH_PE_aligned) { const uintptr_t *aligned = (const uintptr_t *) - OF_ROUND_UP_POW2(sizeof(void *), (uintptr_t)*ptr); + OFRoundUpToPowerOf2(sizeof(void *), (uintptr_t)*ptr); *ptr = (const uint8_t *)(aligned + 1); return *aligned; } @@ -709,18 +709,18 @@ static void emergencyExceptionCleanup(_Unwind_Reason_Code reason, struct _Unwind_Exception *ex) { #ifdef OF_HAVE_THREADS - if (of_spinlock_lock(&emergencyExceptionsSpinlock) != 0) + if (OFSpinlockLock(&emergencyExceptionsSpinlock) != 0) OBJC_ERROR("Cannot lock spinlock!"); #endif ex->class = 0; #ifdef OF_HAVE_THREADS - if (of_spinlock_unlock(&emergencyExceptionsSpinlock) != 0) + if (OFSpinlockUnlock(&emergencyExceptionsSpinlock) != 0) OBJC_ERROR("Cannot unlock spinlock!"); #endif } void @@ -729,11 +729,11 @@ struct objc_exception *e = calloc(1, sizeof(*e)); bool emergency = false; if (e == NULL) { #ifdef OF_HAVE_THREADS - if (of_spinlock_lock(&emergencyExceptionsSpinlock) != 0) + if (OFSpinlockLock(&emergencyExceptionsSpinlock) != 0) OBJC_ERROR("Cannot lock spinlock!"); #endif for (uint_fast8_t i = 0; i < NUM_EMERGENCY_EXCEPTIONS; i++) { if (emergencyExceptions[i].exception.class == 0) { @@ -744,11 +744,11 @@ break; } } #ifdef OF_HAVE_THREADS - if (of_spinlock_unlock(&emergencyExceptionsSpinlock) != 0) + if (OFSpinlockUnlock(&emergencyExceptionsSpinlock) != 0) OBJC_ERROR("Cannot lock spinlock!"); #endif } if (e == NULL) Index: src/runtime/method.m ================================================================== --- src/runtime/method.m +++ src/runtime/method.m @@ -51,11 +51,11 @@ i = 0; for (iter = class->methodList; iter != NULL; iter = iter->next) for (unsigned int j = 0; j < iter->count; j++) methods[i++] = &iter->methods[j]; - OF_ENSURE(i == count); + OFEnsure(i == count); methods[count] = NULL; if (outCount != NULL) *outCount = count; Index: src/runtime/misc.m ================================================================== --- src/runtime/misc.m +++ src/runtime/misc.m @@ -129,5 +129,19 @@ abort(); #endif OF_UNREACHABLE } + +char * +objc_strdup(const char *string) +{ + char *copy; + size_t length = strlen(string); + + if ((copy = (char *)malloc(length + 1)) == NULL) + return NULL; + + memcpy(copy, string, length + 1); + + return copy; +} DELETED src/runtime/mutex.m Index: src/runtime/mutex.m ================================================================== --- src/runtime/mutex.m +++ src/runtime/mutex.m @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#import "ObjFWRT.h" -#import "private.h" - -#include "../mutex.m" DELETED src/runtime/once.m Index: src/runtime/once.m ================================================================== --- src/runtime/once.m +++ src/runtime/once.m @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#import "ObjFWRT.h" -#import "private.h" - -#include "../once.m" Index: src/runtime/private.h ================================================================== --- src/runtime/private.h +++ src/runtime/private.h @@ -330,10 +330,11 @@ #else # define objc_global_mutex_lock() # define objc_global_mutex_unlock() # define objc_global_mutex_free() #endif +extern char *_Nullable objc_strdup(const char *_Nonnull string); static inline IMP _Nullable objc_dtable_get(const struct objc_dtable *_Nonnull dtable, uint32_t idx) { #ifdef OF_SELUID24 Index: src/runtime/property.m ================================================================== --- src/runtime/property.m +++ src/runtime/property.m @@ -19,21 +19,21 @@ #import "ObjFWRT.h" #import "private.h" #ifdef OF_HAVE_THREADS -# import "mutex.h" +# import "OFPlainMutex.h" # define NUM_SPINLOCKS 8 /* needs to be a power of 2 */ # define SPINLOCK_HASH(p) ((unsigned)((uintptr_t)p >> 4) & (NUM_SPINLOCKS - 1)) -static of_spinlock_t spinlocks[NUM_SPINLOCKS]; +static OFSpinlock spinlocks[NUM_SPINLOCKS]; #endif #ifdef OF_HAVE_THREADS OF_CONSTRUCTOR() { for (size_t i = 0; i < NUM_SPINLOCKS; i++) - if (of_spinlock_new(&spinlocks[i]) != 0) + if (OFSpinlockNew(&spinlocks[i]) != 0) OBJC_ERROR("Failed to initialize spinlocks!"); } #endif id @@ -42,15 +42,15 @@ if (atomic) { id *ptr = (id *)(void *)((char *)self + offset); #ifdef OF_HAVE_THREADS unsigned hash = SPINLOCK_HASH(ptr); - OF_ENSURE(of_spinlock_lock(&spinlocks[hash]) == 0); + OFEnsure(OFSpinlockLock(&spinlocks[hash]) == 0); @try { return [[*ptr retain] autorelease]; } @finally { - OF_ENSURE(of_spinlock_unlock(&spinlocks[hash]) == 0); + OFEnsure(OFSpinlockUnlock(&spinlocks[hash]) == 0); } #else return [[*ptr retain] autorelease]; #endif } @@ -65,11 +65,11 @@ if (atomic) { id *ptr = (id *)(void *)((char *)self + offset); #ifdef OF_HAVE_THREADS unsigned hash = SPINLOCK_HASH(ptr); - OF_ENSURE(of_spinlock_lock(&spinlocks[hash]) == 0); + OFEnsure(OFSpinlockLock(&spinlocks[hash]) == 0); @try { #endif id old = *ptr; switch (copy) { @@ -84,11 +84,11 @@ } [old release]; #ifdef OF_HAVE_THREADS } @finally { - OF_ENSURE(of_spinlock_unlock(&spinlocks[hash]) == 0); + OFEnsure(OFSpinlockUnlock(&spinlocks[hash]) == 0); } #endif return; } @@ -117,15 +117,15 @@ { if (atomic) { #ifdef OF_HAVE_THREADS unsigned hash = SPINLOCK_HASH(src); - OF_ENSURE(of_spinlock_lock(&spinlocks[hash]) == 0); + OFEnsure(OFSpinlockLock(&spinlocks[hash]) == 0); #endif memcpy(dest, src, size); #ifdef OF_HAVE_THREADS - OF_ENSURE(of_spinlock_unlock(&spinlocks[hash]) == 0); + OFEnsure(OFSpinlockUnlock(&spinlocks[hash]) == 0); #endif return; } @@ -138,15 +138,15 @@ { if (atomic) { #ifdef OF_HAVE_THREADS unsigned hash = SPINLOCK_HASH(src); - OF_ENSURE(of_spinlock_lock(&spinlocks[hash]) == 0); + OFEnsure(OFSpinlockLock(&spinlocks[hash]) == 0); #endif memcpy(dest, src, size); #ifdef OF_HAVE_THREADS - OF_ENSURE(of_spinlock_unlock(&spinlocks[hash]) == 0); + OFEnsure(OFSpinlockUnlock(&spinlocks[hash]) == 0); #endif return; } @@ -189,11 +189,11 @@ i = 0; for (iter = class->propertyList; iter != NULL; iter = iter->next) for (unsigned int j = 0; j < iter->count; j++) properties[i++] = &iter->properties[j]; - OF_ENSURE(i == count); + OFEnsure(i == count); properties[count] = NULL; if (outCount != NULL) *outCount = count; @@ -217,22 +217,22 @@ if (strlen(name) != 1) return NULL; switch (*name) { case 'T': - ret = of_strdup(property->getter.typeEncoding); + ret = objc_strdup(property->getter.typeEncoding); nullIsError = true; break; case 'G': if (property->attributes & OBJC_PROPERTY_GETTER) { - ret = of_strdup(property->getter.name); + ret = objc_strdup(property->getter.name); nullIsError = true; } break; case 'S': if (property->attributes & OBJC_PROPERTY_SETTER) { - ret = of_strdup(property->setter.name); + ret = objc_strdup(property->setter.name); nullIsError = true; } break; #define BOOL_CASE(name, field, flag) \ case name: \ Index: src/runtime/selector.m ================================================================== --- src/runtime/selector.m +++ src/runtime/selector.m @@ -81,11 +81,11 @@ } if ((selector = malloc(sizeof(*selector))) == NULL) OBJC_ERROR("Not enough memory to allocate selector!"); - if ((selector->UID = (uintptr_t)of_strdup(name)) == 0) + if ((selector->UID = (uintptr_t)objc_strdup(name)) == 0) OBJC_ERROR("Not enough memory to allocate selector!"); selector->typeEncoding = NULL; if ((freeList = realloc(freeList, Index: src/runtime/synchronized.m ================================================================== --- src/runtime/synchronized.m +++ src/runtime/synchronized.m @@ -20,24 +20,24 @@ #import "ObjFWRT.h" #import "private.h" #ifdef OF_HAVE_THREADS -# import "mutex.h" +# import "OFPlainMutex.h" -static struct lock_s { - id object; - int count; - of_rmutex_t rmutex; - struct lock_s *next; +static struct lock { + id object; + int count; + OFPlainRecursiveMutex rmutex; + struct lock *next; } *locks = NULL; -static of_mutex_t mutex; +static OFPlainMutex mutex; OF_CONSTRUCTOR() { - if (of_mutex_new(&mutex) != 0) + if (OFPlainMutexNew(&mutex) != 0) OBJC_ERROR("Failed to create mutex!"); } #endif int @@ -45,48 +45,48 @@ { if (object == nil) return 0; #ifdef OF_HAVE_THREADS - struct lock_s *lock; + struct lock *lock; - if (of_mutex_lock(&mutex) != 0) + if (OFPlainMutexLock(&mutex) != 0) OBJC_ERROR("Failed to lock mutex!"); /* Look if we already have a lock */ for (lock = locks; lock != NULL; lock = lock->next) { if (lock->object != object) continue; lock->count++; - if (of_mutex_unlock(&mutex) != 0) + if (OFPlainMutexUnlock(&mutex) != 0) OBJC_ERROR("Failed to unlock mutex!"); - if (of_rmutex_lock(&lock->rmutex) != 0) + if (OFPlainRecursiveMutexLock(&lock->rmutex) != 0) OBJC_ERROR("Failed to lock mutex!"); return 0; } /* Create a new lock */ if ((lock = malloc(sizeof(*lock))) == NULL) OBJC_ERROR("Failed to allocate memory for mutex!"); - if (of_rmutex_new(&lock->rmutex) != 0) + if (OFPlainRecursiveMutexNew(&lock->rmutex) != 0) OBJC_ERROR("Failed to create mutex!"); lock->object = object; lock->count = 1; lock->next = locks; locks = lock; - if (of_mutex_unlock(&mutex) != 0) + if (OFPlainMutexUnlock(&mutex) != 0) OBJC_ERROR("Failed to unlock mutex!"); - if (of_rmutex_lock(&lock->rmutex) != 0) + if (OFPlainRecursiveMutexLock(&lock->rmutex) != 0) OBJC_ERROR("Failed to lock mutex!"); #endif return 0; } @@ -96,26 +96,26 @@ { if (object == nil) return 0; #ifdef OF_HAVE_THREADS - struct lock_s *lock, *last = NULL; + struct lock *lock, *last = NULL; - if (of_mutex_lock(&mutex) != 0) + if (OFPlainMutexLock(&mutex) != 0) OBJC_ERROR("Failed to lock mutex!"); for (lock = locks; lock != NULL; lock = lock->next) { if (lock->object != object) { last = lock; continue; } - if (of_rmutex_unlock(&lock->rmutex) != 0) + if (OFPlainRecursiveMutexUnlock(&lock->rmutex) != 0) OBJC_ERROR("Failed to unlock mutex!"); if (--lock->count == 0) { - if (of_rmutex_free(&lock->rmutex) != 0) + if (OFPlainRecursiveMutexFree(&lock->rmutex) != 0) OBJC_ERROR("Failed to destroy mutex!"); if (last != NULL) last->next = lock->next; if (locks == lock) @@ -122,11 +122,11 @@ locks = lock->next; free(lock); } - if (of_mutex_unlock(&mutex) != 0) + if (OFPlainMutexUnlock(&mutex) != 0) OBJC_ERROR("Failed to unlock mutex!"); return 0; } Index: src/runtime/threading.m ================================================================== --- src/runtime/threading.m +++ src/runtime/threading.m @@ -18,33 +18,34 @@ #include #include #import "ObjFWRT.h" #import "private.h" -#import "mutex.h" -#import "once.h" + +#import "OFOnce.h" +#import "OFPlainMutex.h" -static of_rmutex_t globalMutex; +static OFPlainRecursiveMutex globalMutex; static void init(void) { - if (of_rmutex_new(&globalMutex) != 0) + if (OFPlainRecursiveMutexNew(&globalMutex) != 0) OBJC_ERROR("Failed to create global mutex!"); } void objc_global_mutex_lock(void) { - static of_once_t once_control = OF_ONCE_INIT; - of_once(&once_control, init); + static OFOnceControl onceControl = OFOnceControlInitValue; + OFOnce(&onceControl, init); - if (of_rmutex_lock(&globalMutex) != 0) + if (OFPlainRecursiveMutexLock(&globalMutex) != 0) OBJC_ERROR("Failed to lock global mutex!"); } void objc_global_mutex_unlock(void) { - if (of_rmutex_unlock(&globalMutex) != 0) + if (OFPlainRecursiveMutexUnlock(&globalMutex) != 0) OBJC_ERROR("Failed to unlock global mutex!"); } DELETED src/runtime/tlskey.m Index: src/runtime/tlskey.m ================================================================== --- src/runtime/tlskey.m +++ src/runtime/tlskey.m @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#import "ObjFWRT.h" -#import "private.h" - -#include "../tlskey.m" DELETED src/scrypt.h Index: src/scrypt.h ================================================================== --- src/scrypt.h +++ src/scrypt.h @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#ifndef __STDC_LIMIT_MACROS -# define __STDC_LIMIT_MACROS -#endif -#ifndef __STDC_CONSTANT_MACROS -# define __STDC_CONSTANT_MACROS -#endif - -#import "macros.h" - -OF_ASSUME_NONNULL_BEGIN - -/** @file */ - -@class OFHMAC; - -/** - * @brief The parameters for @ref of_scrypt. - */ -typedef struct of_scrypt_parameters_t { - /** @brief The block size to use. */ - size_t blockSize; - /** @brief The CPU/memory cost factor to use. */ - size_t costFactor; - /** @brief The parallelization to use. */ - size_t parallelization; - /** @brief The salt to derive a key with. */ - const unsigned char *salt; - /** @brief The length of the salt. */ - size_t saltLength; - /** @brief The password to derive a key from. */ - const char *password; - /** @brief The length of the password. */ - size_t passwordLength; - /** @brief The buffer to write the key to. */ - unsigned char *key; - /** - * @brief The desired length for the derived key. - * - * @ref key needs to have enough storage. - */ - size_t keyLength; - /** @brief Whether data may be stored in swappable memory. */ - bool allowsSwappableMemory; -} of_scrypt_parameters_t; - -#ifdef __cplusplus -extern "C" { -#endif -extern void of_salsa20_8_core(uint32_t buffer[_Nonnull 16]); -extern void of_scrypt_block_mix(uint32_t *output, const uint32_t *input, - size_t blockSize); -extern void of_scrypt_romix(uint32_t *buffer, size_t blockSize, - size_t costFactor, uint32_t *tmp); - -/** - * @brief Derives a key from a password and a salt using scrypt. - * - * @param param The parameters to use - */ -extern void of_scrypt(of_scrypt_parameters_t param); -#ifdef __cplusplus -} -#endif - -OF_ASSUME_NONNULL_END DELETED src/scrypt.m Index: src/scrypt.m ================================================================== --- src/scrypt.m +++ src/scrypt.m @@ -1,219 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#import "OFHMAC.h" -#import "OFSHA256Hash.h" -#import "OFSecureData.h" - -#import "OFInvalidArgumentException.h" -#import "OFOutOfMemoryException.h" -#import "OFOutOfRangeException.h" - -#import "scrypt.h" -#import "pbkdf2.h" - -void -of_salsa20_8_core(uint32_t buffer[16]) -{ - uint32_t tmp[16]; - - for (uint_fast8_t i = 0; i < 16; i++) - tmp[i] = OF_BSWAP32_IF_BE(buffer[i]); - - for (uint_fast8_t i = 0; i < 8; i += 2) { - tmp[ 4] ^= OF_ROL(tmp[ 0] + tmp[12], 7); - tmp[ 8] ^= OF_ROL(tmp[ 4] + tmp[ 0], 9); - tmp[12] ^= OF_ROL(tmp[ 8] + tmp[ 4], 13); - tmp[ 0] ^= OF_ROL(tmp[12] + tmp[ 8], 18); - tmp[ 9] ^= OF_ROL(tmp[ 5] + tmp[ 1], 7); - tmp[13] ^= OF_ROL(tmp[ 9] + tmp[ 5], 9); - tmp[ 1] ^= OF_ROL(tmp[13] + tmp[ 9], 13); - tmp[ 5] ^= OF_ROL(tmp[ 1] + tmp[13], 18); - tmp[14] ^= OF_ROL(tmp[10] + tmp[ 6], 7); - tmp[ 2] ^= OF_ROL(tmp[14] + tmp[10], 9); - tmp[ 6] ^= OF_ROL(tmp[ 2] + tmp[14], 13); - tmp[10] ^= OF_ROL(tmp[ 6] + tmp[ 2], 18); - tmp[ 3] ^= OF_ROL(tmp[15] + tmp[11], 7); - tmp[ 7] ^= OF_ROL(tmp[ 3] + tmp[15], 9); - tmp[11] ^= OF_ROL(tmp[ 7] + tmp[ 3], 13); - tmp[15] ^= OF_ROL(tmp[11] + tmp[ 7], 18); - tmp[ 1] ^= OF_ROL(tmp[ 0] + tmp[ 3], 7); - tmp[ 2] ^= OF_ROL(tmp[ 1] + tmp[ 0], 9); - tmp[ 3] ^= OF_ROL(tmp[ 2] + tmp[ 1], 13); - tmp[ 0] ^= OF_ROL(tmp[ 3] + tmp[ 2], 18); - tmp[ 6] ^= OF_ROL(tmp[ 5] + tmp[ 4], 7); - tmp[ 7] ^= OF_ROL(tmp[ 6] + tmp[ 5], 9); - tmp[ 4] ^= OF_ROL(tmp[ 7] + tmp[ 6], 13); - tmp[ 5] ^= OF_ROL(tmp[ 4] + tmp[ 7], 18); - tmp[11] ^= OF_ROL(tmp[10] + tmp[ 9], 7); - tmp[ 8] ^= OF_ROL(tmp[11] + tmp[10], 9); - tmp[ 9] ^= OF_ROL(tmp[ 8] + tmp[11], 13); - tmp[10] ^= OF_ROL(tmp[ 9] + tmp[ 8], 18); - tmp[12] ^= OF_ROL(tmp[15] + tmp[14], 7); - tmp[13] ^= OF_ROL(tmp[12] + tmp[15], 9); - tmp[14] ^= OF_ROL(tmp[13] + tmp[12], 13); - tmp[15] ^= OF_ROL(tmp[14] + tmp[13], 18); - } - - for (uint_fast8_t i = 0; i < 16; i++) - buffer[i] = OF_BSWAP32_IF_BE(OF_BSWAP32_IF_BE(buffer[i]) + - tmp[i]); - - of_explicit_memset(tmp, 0, sizeof(tmp)); -} - -void -of_scrypt_block_mix(uint32_t *output, const uint32_t *input, size_t blockSize) -{ - uint32_t tmp[16]; - - /* Check defined here and executed in of_scrypt() */ -#define OVERFLOW_CHECK_1 \ - if (param.blockSize > SIZE_MAX / 2 || \ - 2 * param.blockSize - 1 > SIZE_MAX / 16) \ - @throw [OFOutOfRangeException exception]; - - memcpy(tmp, input + (2 * blockSize - 1) * 16, 64); - - for (size_t i = 0; i < 2 * blockSize; i++) { - for (size_t j = 0; j < 16; j++) - tmp[j] ^= input[i * 16 + j]; - - of_salsa20_8_core(tmp); - - /* - * Even indices are stored in the first half and odd ones in - * the second. - */ - memcpy(output + ((i / 2) + (i & 1) * blockSize) * 16, tmp, 64); - } - - of_explicit_memset(tmp, 0, sizeof(tmp)); -} - -void -of_scrypt_romix(uint32_t *buffer, size_t blockSize, size_t costFactor, - uint32_t *tmp) -{ - /* Check defined here and executed in of_scrypt() */ -#define OVERFLOW_CHECK_2 \ - if (param.blockSize > SIZE_MAX / 128 / param.costFactor) \ - @throw [OFOutOfRangeException exception]; - - uint32_t *tmp2 = tmp + 32 * blockSize; - - memcpy(tmp, buffer, 128 * blockSize); - - for (size_t i = 0; i < costFactor; i++) { - memcpy(tmp2 + i * 32 * blockSize, tmp, 128 * blockSize); - of_scrypt_block_mix(tmp, tmp2 + i * 32 * blockSize, blockSize); - } - - for (size_t i = 0; i < costFactor; i++) { - uint32_t j = OF_BSWAP32_IF_BE(tmp[(2 * blockSize - 1) * 16]) & - (costFactor - 1); - - for (size_t k = 0; k < 32 * blockSize; k++) - tmp[k] ^= tmp2[j * 32 * blockSize + k]; - - of_scrypt_block_mix(buffer, tmp, blockSize); - - if (i < costFactor - 1) - memcpy(tmp, buffer, 128 * blockSize); - } -} - -void -of_scrypt(of_scrypt_parameters_t param) -{ - OFSecureData *tmp = nil, *buffer = nil; - OFHMAC *HMAC = nil; - - if (param.blockSize == 0 || param.costFactor <= 1 || - (param.costFactor & (param.costFactor - 1)) != 0 || - param.parallelization == 0) - @throw [OFInvalidArgumentException exception]; - - /* - * These are defined by the functions above. They are defined there so - * that the check is next to the code and easy to verify, but actually - * checked here for performance. - */ - OVERFLOW_CHECK_1 - OVERFLOW_CHECK_2 - - @try { - uint32_t *tmpItems, *bufferItems; - - if (param.costFactor > SIZE_MAX - 1 || - (param.costFactor + 1) > SIZE_MAX / 128) - @throw [OFOutOfRangeException exception]; - - tmp = [[OFSecureData alloc] - initWithCount: (param.costFactor + 1) * 128 - itemSize: param.blockSize - allowsSwappableMemory: param.allowsSwappableMemory]; - tmpItems = tmp.mutableItems; - - if (param.parallelization > SIZE_MAX / 128) - @throw [OFOutOfRangeException exception]; - - buffer = [[OFSecureData alloc] - initWithCount: param.parallelization * 128 - itemSize: param.blockSize - allowsSwappableMemory: param.allowsSwappableMemory]; - bufferItems = buffer.mutableItems; - - HMAC = [[OFHMAC alloc] - initWithHashClass: [OFSHA256Hash class] - allowsSwappableMemory: param.allowsSwappableMemory]; - - of_pbkdf2((of_pbkdf2_parameters_t){ - .HMAC = HMAC, - .iterations = 1, - .salt = param.salt, - .saltLength = param.saltLength, - .password = param.password, - .passwordLength = param.passwordLength, - .key = (unsigned char *)bufferItems, - .keyLength = param.parallelization * 128 * - param.blockSize, - .allowsSwappableMemory = param.allowsSwappableMemory - }); - - for (size_t i = 0; i < param.parallelization; i++) - of_scrypt_romix(bufferItems + i * 32 * param.blockSize, - param.blockSize, param.costFactor, tmpItems); - - of_pbkdf2((of_pbkdf2_parameters_t){ - .HMAC = HMAC, - .iterations = 1, - .salt = (unsigned char *)bufferItems, - .saltLength = param.parallelization * 128 * - param.blockSize, - .password = param.password, - .passwordLength = param.passwordLength, - .key = param.key, - .keyLength = param.keyLength, - .allowsSwappableMemory = param.allowsSwappableMemory - }); - } @finally { - [tmp release]; - [buffer release]; - [HMAC release]; - } -} DELETED src/socket.h Index: src/socket.h ================================================================== --- src/socket.h +++ src/socket.h @@ -1,305 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "objfw-defs.h" - -#ifndef OF_HAVE_SOCKETS -# error No sockets available! -#endif - -#include - -#import "OFString.h" - -#ifdef OF_HAVE_SYS_SOCKET_H -# include -#endif -#ifdef OF_HAVE_NETINET_IN_H -# include -#endif -#ifdef OF_HAVE_NETINET_TCP_H -# include -#endif -#ifdef OF_HAVE_NETIPX_IPX_H -# include -#endif - -#include "platform.h" - -#ifdef OF_WINDOWS -# include -# include -# ifdef OF_HAVE_IPX -# include -# endif -#endif - -/** @file */ - -#ifdef OF_WII -# include -#endif - -#ifdef OF_PSP -# include -#endif - -#import "macros.h" -#if defined(OF_HAVE_THREADS) && defined(OF_AMIGAOS) -# import "tlskey.h" -#endif - -OF_ASSUME_NONNULL_BEGIN - -#ifndef OF_WINDOWS -typedef int of_socket_t; -#else -typedef SOCKET of_socket_t; -#endif - -#ifdef OF_WII -typedef u8 sa_family_t; -#endif - -#ifdef OF_MORPHOS -typedef long socklen_t; -typedef u_char sa_family_t; -typedef u_short in_port_t; -#endif - -/** - * @brief A socket address family. - */ -typedef enum { - /** An unknown address family. */ - OF_SOCKET_ADDRESS_FAMILY_UNKNOWN, - /** IPv4 */ - OF_SOCKET_ADDRESS_FAMILY_IPV4, - /** IPv6 */ - OF_SOCKET_ADDRESS_FAMILY_IPV6, - /** IPX */ - OF_SOCKET_ADDRESS_FAMILY_IPX, - /** Any address family */ - OF_SOCKET_ADDRESS_FAMILY_ANY = 255 -} of_socket_address_family_t; - -#ifndef OF_HAVE_IPV6 -struct sockaddr_in6 { - sa_family_t sin6_family; - in_port_t sin6_port; - uint32_t sin6_flowinfo; - struct in6_addr { - uint8_t s6_addr[16]; - } sin6_addr; - uint32_t sin6_scope_id; -}; -#endif - -#ifndef OF_HAVE_IPX -# define IPX_NODE_LEN 6 -struct sockaddr_ipx { - sa_family_t sipx_family; - uint32_t sipx_network; - unsigned char sipx_node[IPX_NODE_LEN]; - uint16_t sipx_port; - uint8_t sipx_type; -}; -#endif -#ifdef OF_WINDOWS -# define IPX_NODE_LEN 6 -# define sipx_family sa_family -# define sipx_network sa_netnum -# define sipx_node sa_nodenum -# define sipx_port sa_socket -#endif - -/** - * @struct of_socket_address_t socket.h ObjFW/socket.h - * - * @brief A struct which represents a host / port pair for a socket. - */ -struct OF_BOXABLE of_socket_address_t { - /* - * Even though struct sockaddr contains the family, we need to use our - * own family, as we need to support storing an IPv6 address on systems - * that don't support IPv6. These may not have AF_INET6 defined and we - * can't just define it, as the value is system-dependent and might - * clash with an existing value. - */ - of_socket_address_family_t family; - union { - struct sockaddr sockaddr; - struct sockaddr_in in; - struct sockaddr_in6 in6; - struct sockaddr_ipx ipx; - } sockaddr; - socklen_t length; -}; -typedef struct of_socket_address_t of_socket_address_t; - -#ifdef __cplusplus -extern "C" { -#endif -/** - * @brief Parses the specified IP and port into an of_socket_address_t. - * - * @param IP The IP to parse - * @param port The port to use - * @return The parsed IP and port as an of_socket_address_t - */ -extern of_socket_address_t of_socket_address_parse_ip( - OFString *IP, uint16_t port); - -/** - * @brief Parses the specified IPv4 and port into an of_socket_address_t. - * - * @param IP The IPv4 to parse - * @param port The port to use - * @return The parsed IPv4 and port as an of_socket_address_t - */ -extern of_socket_address_t of_socket_address_parse_ipv4( - OFString *IP, uint16_t port); - -/** - * @brief Parses the specified IPv6 and port into an of_socket_address_t. - * - * @param IP The IPv6 to parse - * @param port The port to use - * @return The parsed IPv6 and port as an of_socket_address_t - */ -extern of_socket_address_t of_socket_address_parse_ipv6( - OFString *IP, uint16_t port); - -/** - * @brief Creates an IPX address for the specified network, node and port. - * - * @param node The node in the IPX network - * @param network The IPX network - * @param port The IPX port (sometimes called socket number) on the node - */ -extern of_socket_address_t of_socket_address_ipx( - const unsigned char node[_Nonnull IPX_NODE_LEN], uint32_t network, - uint16_t port); - -/** - * @brief Compares two of_socket_address_t for equality. - * - * @param address1 The address to compare with the second address - * @param address2 The second address - * @return Whether the two addresses are equal - */ -extern bool of_socket_address_equal( - const of_socket_address_t *_Nonnull address1, - const of_socket_address_t *_Nonnull address2); - -/** - * @brief Returns the hash for the specified of_socket_address_t. - * - * @param address The address to hash - * @return The hash for the specified of_socket_address_t - */ -extern unsigned long of_socket_address_hash( - const of_socket_address_t *_Nonnull address); - -/** - * @brief Converts the specified of_socket_address_t to an IP string and port. - * - * @param address The address to convert to a string - * @param port A pointer to an uint16_t which should be set to the port of the - * address or NULL if the port is not needed - * @return The address as an IP string - */ -extern OFString *_Nonnull of_socket_address_ip_string( - const of_socket_address_t *_Nonnull address, uint16_t *_Nullable port); - -/** - * @brief Sets the port of the specified of_socket_address_t, independent of - * the address family used. - * - * @param address The address on which to set the port - * @param port The port to set on the address - */ -extern void of_socket_address_set_port(of_socket_address_t *_Nonnull address, - uint16_t port); - -/** - * @brief Returns the port of the specified of_socket_address_t, independent of - * the address family used. - * - * @param address The address on which to get the port - * @return The port of the address - */ -extern uint16_t of_socket_address_get_port( - const of_socket_address_t *_Nonnull address); - -/** - * @brief Sets the IPX network of the specified of_socket_address_t. - * - * @param address The address on which to set the IPX network - * @param network The IPX network to set on the address - */ -extern void of_socket_address_set_ipx_network( - of_socket_address_t *_Nonnull address, uint32_t network); - -/** - * @brief Returns the IPX network of the specified of_socket_address_t. - * - * @param address The address on which to get the IPX network - * @return The IPX network of the address - */ -extern uint32_t of_socket_address_get_ipx_network( - const of_socket_address_t *_Nonnull address); - -/** - * @brief Sets the IPX node of the specified of_socket_address_t. - * - * @param address The address on which to set the IPX node - * @param node The IPX node to set on the address - */ -extern void of_socket_address_set_ipx_node( - of_socket_address_t *_Nonnull address, - const unsigned char node[_Nonnull IPX_NODE_LEN]); - -/** - * @brief Gets the IPX node of the specified of_socket_address_t. - * - * @param address The address on which to get the IPX node - * @param node A byte array to store the IPX node of the address - */ -extern void of_socket_address_get_ipx_node( - const of_socket_address_t *_Nonnull address, - unsigned char node[_Nonnull IPX_NODE_LEN]); - -extern bool of_socket_init(void); -#if defined(OF_HAVE_THREADS) && defined(OF_AMIGAOS) && !defined(OF_MORPHOS) -extern void of_socket_deinit(void); -#endif -extern int of_socket_errno(void); -#if !defined(OF_WII) && !defined(OF_NINTENDO_3DS) -extern int of_getsockname(of_socket_t sock, struct sockaddr *restrict addr, - socklen_t *restrict addrLen); -#endif - -#if defined(OF_HAVE_THREADS) && defined(OF_AMIGAOS) && !defined(OF_MORPHOS) -extern of_tlskey_t of_socket_base_key; -# ifdef OF_AMIGAOS4 -extern of_tlskey_t of_socket_interface_key; -# endif -#endif -#ifdef __cplusplus -} -#endif - -OF_ASSUME_NONNULL_END DELETED src/socket.m Index: src/socket.m ================================================================== --- src/socket.m +++ src/socket.m @@ -1,858 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#ifndef _XOPEN_SOURCE_EXTENDED -# define _XOPEN_SOURCE_EXTENDED -#endif -#define _HPUX_ALT_XOPEN_SOCKET_API - -#ifdef OF_NINTENDO_3DS -# include /* For memalign() */ -#endif - -#include - -#import "OFArray.h" -#import "OFCharacterSet.h" -#import "OFLocale.h" -#ifdef OF_HAVE_THREADS -# import "OFMutex.h" -#endif -#import "OFString.h" - -#import "OFException.h" /* For some E* -> WSAE* defines */ -#import "OFInitializationFailedException.h" -#import "OFInvalidArgumentException.h" -#import "OFInvalidFormatException.h" -#import "OFLockFailedException.h" -#import "OFUnlockFailedException.h" - -#import "socket.h" -#import "socket_helpers.h" -#ifdef OF_HAVE_THREADS -# import "tlskey.h" -#endif -#import "once.h" - -#ifdef OF_AMIGAOS -# include -#endif - -#ifdef OF_NINTENDO_3DS -# include <3ds/types.h> -# include <3ds/services/soc.h> -#endif - -#if defined(OF_HAVE_THREADS) && (!defined(OF_AMIGAOS) || defined(OF_MORPHOS)) -static OFMutex *mutex; - -static void -releaseMutex(void) -{ - [mutex release]; -} -#endif -#if !defined(OF_AMIGAOS) || defined(OF_MORPHOS) || !defined(OF_HAVE_THREADS) -static bool initSuccessful = false; -#endif - -#ifdef OF_AMIGAOS -# if defined(OF_HAVE_THREADS) && !defined(OF_MORPHOS) -of_tlskey_t of_socket_base_key; -# ifdef OF_AMIGAOS4 -of_tlskey_t of_socket_interface_key; -# endif -# else -struct Library *SocketBase; -# ifdef OF_AMIGAOS4 -struct SocketIFace *ISocket = NULL; -# endif -# endif -#endif - -#if defined(OF_HAVE_THREADS) && defined(OF_AMIGAOS) && !defined(OF_MORPHOS) -OF_CONSTRUCTOR() -{ - if (of_tlskey_new(&of_socket_base_key) != 0) - @throw [OFInitializationFailedException exception]; - -# ifdef OF_AMIGAOS4 - if (of_tlskey_new(&of_socket_interface_key) != 0) - @throw [OFInitializationFailedException exception]; -# endif -} -#endif - -#if !defined(OF_AMIGAOS) || defined(OF_MORPHOS) || !defined(OF_HAVE_THREADS) -static void -init(void) -{ -# if defined(OF_WINDOWS) - WSADATA wsa; - - if (WSAStartup(MAKEWORD(2, 0), &wsa)) - return; -# elif defined(OF_AMIGAOS) - if ((SocketBase = OpenLibrary("bsdsocket.library", 4)) == NULL) - return; - -# ifdef OF_AMIGAOS4 - if ((ISocket = (struct SocketIFace *) - GetInterface(SocketBase, "main", 1, NULL)) == NULL) { - CloseLibrary(SocketBase); - return; - } -# endif -# elif defined(OF_WII) - if (net_init() < 0) - return; -# elif defined(OF_NINTENDO_3DS) - void *ctx; - - if ((ctx = memalign(0x1000, 0x100000)) == NULL) - return; - - if (socInit(ctx, 0x100000) != 0) - return; - - atexit((void (*)(void))socExit); -# endif - -# if defined(OF_HAVE_THREADS) && (!defined(OF_AMIGAOS) || defined(OF_MORPHOS)) - mutex = [[OFMutex alloc] init]; - atexit(releaseMutex); - -# ifdef OF_WII - if (of_spinlock_new(&spinlock) != 0) - return; -# endif -# endif - - initSuccessful = true; -} - -OF_DESTRUCTOR() -{ -# ifdef OF_AMIGAOS -# ifdef OF_AMIGAOS4 - if (ISocket != NULL) - DropInterface((struct Interface *)ISocket); -# endif - - if (SocketBase != NULL) - CloseLibrary(SocketBase); -# endif -} -#endif - -bool -of_socket_init(void) -{ -#if !defined(OF_AMIGAOS) || defined(OF_MORPHOS) || !defined(OF_HAVE_THREADS) - static of_once_t onceControl = OF_ONCE_INIT; - of_once(&onceControl, init); - - return initSuccessful; -#else - struct Library *socketBase; -# ifdef OF_AMIGAOS4 - struct SocketIFace *socketInterface; -# endif - -# ifdef OF_AMIGAOS4 - if ((socketInterface = of_tlskey_get(of_socket_interface_key)) != NULL) -# else - if ((socketBase = of_tlskey_get(of_socket_base_key)) != NULL) -# endif - return true; - - if ((socketBase = OpenLibrary("bsdsocket.library", 4)) == NULL) - return false; - -# ifdef OF_AMIGAOS4 - if ((socketInterface = (struct SocketIFace *) - GetInterface(socketBase, "main", 1, NULL)) == NULL) { - CloseLibrary(socketBase); - return false; - } -# endif - - if (of_tlskey_set(of_socket_base_key, socketBase) != 0) { - CloseLibrary(socketBase); -# ifdef OF_AMIGAOS4 - DropInterface((struct Interface *)socketInterface); -# endif - return false; - } - -# ifdef OF_AMIGAOS4 - if (of_tlskey_set(of_socket_interface_key, socketInterface) != 0) { - CloseLibrary(socketBase); - DropInterface((struct Interface *)socketInterface); - return false; - } -# endif - - return true; -#endif -} - -#if defined(OF_HAVE_THREADS) && defined(OF_AMIGAOS) && !defined(OF_MORPHOS) -void -of_socket_deinit(void) -{ - struct Library *socketBase = of_tlskey_get(of_socket_base_key); -# ifdef OF_AMIGAOS4 - struct SocketIFace *socketInterface = - of_tlskey_get(of_socket_interface_key); - - if (socketInterface != NULL) - DropInterface((struct Interface *)socketInterface); -# endif - if (socketBase != NULL) - CloseLibrary(socketBase); -} -#endif - -int -of_socket_errno() -{ -#if defined(OF_WINDOWS) - switch (WSAGetLastError()) { - case WSAEACCES: - return EACCES; - case WSAEADDRINUSE: - return EADDRINUSE; - case WSAEADDRNOTAVAIL: - return EADDRNOTAVAIL; - case WSAEAFNOSUPPORT: - return EAFNOSUPPORT; - case WSAEALREADY: - return EALREADY; - case WSAEBADF: - return EBADF; - case WSAECONNABORTED: - return ECONNABORTED; - case WSAECONNREFUSED: - return ECONNREFUSED; - case WSAECONNRESET: - return ECONNRESET; - case WSAEDESTADDRREQ: - return EDESTADDRREQ; - case WSAEDISCON: - return EPIPE; - case WSAEDQUOT: - return EDQUOT; - case WSAEFAULT: - return EFAULT; - case WSAEHOSTDOWN: - return EHOSTDOWN; - case WSAEHOSTUNREACH: - return EHOSTUNREACH; - case WSAEINPROGRESS: - return EINPROGRESS; - case WSAEINTR: - return EINTR; - case WSAEINVAL: - return EINVAL; - case WSAEISCONN: - return EISCONN; - case WSAELOOP: - return ELOOP; - case WSAEMSGSIZE: - return EMSGSIZE; - case WSAENAMETOOLONG: - return ENAMETOOLONG; - case WSAENETDOWN: - return ENETDOWN; - case WSAENETRESET: - return ENETRESET; - case WSAENETUNREACH: - return ENETUNREACH; - case WSAENOBUFS: - return ENOBUFS; - case WSAENOPROTOOPT: - return ENOPROTOOPT; - case WSAENOTCONN: - return ENOTCONN; - case WSAENOTEMPTY: - return ENOTEMPTY; - case WSAENOTSOCK: - return ENOTSOCK; - case WSAEOPNOTSUPP: - return EOPNOTSUPP; - case WSAEPFNOSUPPORT: - return EPFNOSUPPORT; - case WSAEPROCLIM: - return EPROCLIM; - case WSAEPROTONOSUPPORT: - return EPROTONOSUPPORT; - case WSAEPROTOTYPE: - return EPROTOTYPE; - case WSAEREMOTE: - return EREMOTE; - case WSAESHUTDOWN: - return ESHUTDOWN; - case WSAESOCKTNOSUPPORT: - return ESOCKTNOSUPPORT; - case WSAESTALE: - return ESTALE; - case WSAETIMEDOUT: - return ETIMEDOUT; - case WSAETOOMANYREFS: - return ETOOMANYREFS; - case WSAEUSERS: - return EUSERS; - case WSAEWOULDBLOCK: - return EWOULDBLOCK; - } - - return 0; -#elif defined(OF_AMIGAOS) - return Errno(); -#else - return errno; -#endif -} - -#ifndef OF_WII -int -of_getsockname(of_socket_t sock, struct sockaddr *restrict addr, - socklen_t *restrict addrLen) -{ - int ret; - -# if defined(OF_HAVE_THREADS) && (!defined(OF_AMIGAOS) || defined(OF_MORPHOS)) - [mutex lock]; -# endif - ret = getsockname(sock, addr, addrLen); -# if defined(OF_HAVE_THREADS) && (!defined(OF_AMIGAOS) || defined(OF_MORPHOS)) - [mutex unlock]; -# endif - - return ret; -} -#endif - -of_socket_address_t -of_socket_address_parse_ipv4(OFString *IPv4, uint16_t port) -{ - void *pool = objc_autoreleasePoolPush(); - OFCharacterSet *whitespaceCharacterSet = - [OFCharacterSet whitespaceCharacterSet]; - of_socket_address_t ret; - struct sockaddr_in *addrIn = &ret.sockaddr.in; - OFArray OF_GENERIC(OFString *) *components; - uint32_t addr; - - memset(&ret, '\0', sizeof(ret)); - ret.family = OF_SOCKET_ADDRESS_FAMILY_IPV4; -#if defined(OF_WII) || defined(OF_NINTENDO_3DS) - ret.length = 8; -#else - ret.length = sizeof(ret.sockaddr.in); -#endif - - addrIn->sin_family = AF_INET; - addrIn->sin_port = OF_BSWAP16_IF_LE(port); -#ifdef OF_WII - addrIn->sin_len = ret.length; -#endif - - components = [IPv4 componentsSeparatedByString: @"."]; - - if (components.count != 4) - @throw [OFInvalidFormatException exception]; - - addr = 0; - - for (OFString *component in components) { - unsigned long long number; - - if (component.length == 0) - @throw [OFInvalidFormatException exception]; - - if ([component indexOfCharacterFromSet: - whitespaceCharacterSet] != OF_NOT_FOUND) - @throw [OFInvalidFormatException exception]; - - number = component.unsignedLongLongValue; - - if (number > UINT8_MAX) - @throw [OFInvalidFormatException exception]; - - addr = (addr << 8) | ((uint32_t)number & 0xFF); - } - - addrIn->sin_addr.s_addr = OF_BSWAP32_IF_LE(addr); - - objc_autoreleasePoolPop(pool); - - return ret; -} - -static uint16_t -parseIPv6Component(OFString *component) -{ - unsigned long long number; - - if ([component indexOfCharacterFromSet: - [OFCharacterSet whitespaceCharacterSet]] != OF_NOT_FOUND) - @throw [OFInvalidFormatException exception]; - - number = [component unsignedLongLongValueWithBase: 16]; - - if (number > UINT16_MAX) - @throw [OFInvalidFormatException exception]; - - return (uint16_t)number; -} - -of_socket_address_t -of_socket_address_parse_ipv6(OFString *IPv6, uint16_t port) -{ - void *pool = objc_autoreleasePoolPush(); - of_socket_address_t ret; - struct sockaddr_in6 *addrIn6 = &ret.sockaddr.in6; - size_t doubleColon; - - memset(&ret, '\0', sizeof(ret)); - ret.family = OF_SOCKET_ADDRESS_FAMILY_IPV6; - ret.length = sizeof(ret.sockaddr.in6); - -#ifdef AF_INET6 - addrIn6->sin6_family = AF_INET6; -#else - addrIn6->sin6_family = AF_UNSPEC; -#endif - addrIn6->sin6_port = OF_BSWAP16_IF_LE(port); - - doubleColon = [IPv6 rangeOfString: @"::"].location; - - if (doubleColon != OF_NOT_FOUND) { - OFString *left = [IPv6 substringToIndex: doubleColon]; - OFString *right = [IPv6 substringFromIndex: doubleColon + 2]; - OFArray OF_GENERIC(OFString *) *leftComponents; - OFArray OF_GENERIC(OFString *) *rightComponents; - size_t i; - - if ([right hasPrefix: @":"] || [right containsString: @"::"]) - @throw [OFInvalidFormatException exception]; - - leftComponents = [left componentsSeparatedByString: @":"]; - rightComponents = [right componentsSeparatedByString: @":"]; - - if (leftComponents.count + rightComponents.count > 7) - @throw [OFInvalidFormatException exception]; - - i = 0; - for (OFString *component in leftComponents) { - uint16_t number = parseIPv6Component(component); - - addrIn6->sin6_addr.s6_addr[i++] = number >> 8; - addrIn6->sin6_addr.s6_addr[i++] = number; - } - - i = 16; - for (OFString *component in rightComponents.reversedArray) { - uint16_t number = parseIPv6Component(component); - - addrIn6->sin6_addr.s6_addr[--i] = number; - addrIn6->sin6_addr.s6_addr[--i] = number >> 8; - } - } else { - OFArray OF_GENERIC(OFString *) *components = - [IPv6 componentsSeparatedByString: @":"]; - size_t i; - - if (components.count != 8) - @throw [OFInvalidFormatException exception]; - - i = 0; - for (OFString *component in components) { - uint16_t number; - - if (component.length == 0) - @throw [OFInvalidFormatException exception]; - - number = parseIPv6Component(component); - - addrIn6->sin6_addr.s6_addr[i++] = number >> 8; - addrIn6->sin6_addr.s6_addr[i++] = number; - } - } - - objc_autoreleasePoolPop(pool); - - return ret; -} - -of_socket_address_t -of_socket_address_parse_ip(OFString *IP, uint16_t port) -{ - of_socket_address_t ret; - - @try { - ret = of_socket_address_parse_ipv6(IP, port); - } @catch (OFInvalidFormatException *e) { - ret = of_socket_address_parse_ipv4(IP, port); - } - - return ret; -} - -of_socket_address_t -of_socket_address_ipx(const unsigned char node[IPX_NODE_LEN], uint32_t network, - uint16_t port) -{ - of_socket_address_t ret; - - memset(&ret, '\0', sizeof(ret)); - ret.family = OF_SOCKET_ADDRESS_FAMILY_IPX; - ret.length = sizeof(ret.sockaddr.ipx); - -#ifdef AF_IPX - ret.sockaddr.ipx.sipx_family = AF_IPX; -#else - ret.sockaddr.ipx.sipx_family = AF_UNSPEC; -#endif - memcpy(ret.sockaddr.ipx.sipx_node, node, IPX_NODE_LEN); - network = OF_BSWAP32_IF_LE(network); - memcpy(&ret.sockaddr.ipx.sipx_network, &network, - sizeof(ret.sockaddr.ipx.sipx_network)); - ret.sockaddr.ipx.sipx_port = OF_BSWAP16_IF_LE(port); - - return ret; -} - -bool -of_socket_address_equal(const of_socket_address_t *address1, - const of_socket_address_t *address2) -{ - const struct sockaddr_in *addrIn1, *addrIn2; - const struct sockaddr_in6 *addrIn6_1, *addrIn6_2; - const struct sockaddr_ipx *addrIPX1, *addrIPX2; - - if (address1->family != address2->family) - return false; - - switch (address1->family) { - case OF_SOCKET_ADDRESS_FAMILY_IPV4: -#if defined(OF_WII) || defined(OF_NINTENDO_3DS) - if (address1->length < 8 || address2->length < 8) - @throw [OFInvalidArgumentException exception]; -#else - if (address1->length < (socklen_t)sizeof(struct sockaddr_in) || - address2->length < (socklen_t)sizeof(struct sockaddr_in)) - @throw [OFInvalidArgumentException exception]; -#endif - - addrIn1 = &address1->sockaddr.in; - addrIn2 = &address2->sockaddr.in; - - if (addrIn1->sin_port != addrIn2->sin_port) - return false; - if (addrIn1->sin_addr.s_addr != addrIn2->sin_addr.s_addr) - return false; - - break; - case OF_SOCKET_ADDRESS_FAMILY_IPV6: - if (address1->length < (socklen_t)sizeof(struct sockaddr_in6) || - address2->length < (socklen_t)sizeof(struct sockaddr_in6)) - @throw [OFInvalidArgumentException exception]; - - addrIn6_1 = &address1->sockaddr.in6; - addrIn6_2 = &address2->sockaddr.in6; - - if (addrIn6_1->sin6_port != addrIn6_2->sin6_port) - return false; - if (memcmp(addrIn6_1->sin6_addr.s6_addr, - addrIn6_2->sin6_addr.s6_addr, - sizeof(addrIn6_1->sin6_addr.s6_addr)) != 0) - return false; - - break; - case OF_SOCKET_ADDRESS_FAMILY_IPX: - if (address1->length < (socklen_t)sizeof(struct sockaddr_ipx) || - address2->length < (socklen_t)sizeof(struct sockaddr_ipx)) - @throw [OFInvalidArgumentException exception]; - - addrIPX1 = &address1->sockaddr.ipx; - addrIPX2 = &address2->sockaddr.ipx; - - if (addrIPX1->sipx_port != addrIPX2->sipx_port) - return false; - if (memcmp(&addrIPX1->sipx_network, &addrIPX2->sipx_network, - 4) != 0) - return false; - if (memcmp(addrIPX1->sipx_node, addrIPX2->sipx_node, - IPX_NODE_LEN) != 0) - return false; - - break; - default: - @throw [OFInvalidArgumentException exception]; - } - - return true; -} - -unsigned long -of_socket_address_hash(const of_socket_address_t *address) -{ - uint32_t hash; - - OF_HASH_INIT(hash); - OF_HASH_ADD(hash, address->family); - - switch (address->family) { - case OF_SOCKET_ADDRESS_FAMILY_IPV4: -#if defined(OF_WII) || defined(OF_NINTENDO_3DS) - if (address->length < 8) - @throw [OFInvalidArgumentException exception]; -#else - if (address->length < (socklen_t)sizeof(struct sockaddr_in)) - @throw [OFInvalidArgumentException exception]; -#endif - - OF_HASH_ADD(hash, address->sockaddr.in.sin_port >> 8); - OF_HASH_ADD(hash, address->sockaddr.in.sin_port); - OF_HASH_ADD(hash, address->sockaddr.in.sin_addr.s_addr >> 24); - OF_HASH_ADD(hash, address->sockaddr.in.sin_addr.s_addr >> 16); - OF_HASH_ADD(hash, address->sockaddr.in.sin_addr.s_addr >> 8); - OF_HASH_ADD(hash, address->sockaddr.in.sin_addr.s_addr); - - break; - case OF_SOCKET_ADDRESS_FAMILY_IPV6: - if (address->length < (socklen_t)sizeof(struct sockaddr_in6)) - @throw [OFInvalidArgumentException exception]; - - OF_HASH_ADD(hash, address->sockaddr.in6.sin6_port >> 8); - OF_HASH_ADD(hash, address->sockaddr.in6.sin6_port); - - for (size_t i = 0; - i < sizeof(address->sockaddr.in6.sin6_addr.s6_addr); i++) - OF_HASH_ADD(hash, - address->sockaddr.in6.sin6_addr.s6_addr[i]); - - break; - case OF_SOCKET_ADDRESS_FAMILY_IPX:; - unsigned char network[ - sizeof(address->sockaddr.ipx.sipx_network)]; - - if (address->length < (socklen_t)sizeof(struct sockaddr_ipx)) - @throw [OFInvalidArgumentException exception]; - - OF_HASH_ADD(hash, address->sockaddr.ipx.sipx_port >> 8); - OF_HASH_ADD(hash, address->sockaddr.ipx.sipx_port); - - memcpy(network, &address->sockaddr.ipx.sipx_network, - sizeof(network)); - - for (size_t i = 0; i < sizeof(network); i++) - OF_HASH_ADD(hash, network[i]); - - for (size_t i = 0; i < IPX_NODE_LEN; i++) - OF_HASH_ADD(hash, address->sockaddr.ipx.sipx_node[i]); - - break; - default: - @throw [OFInvalidArgumentException exception]; - } - - OF_HASH_FINALIZE(hash); - - return hash; -} - -static OFString * -IPv4String(const of_socket_address_t *address, uint16_t *port) -{ - const struct sockaddr_in *addrIn = &address->sockaddr.in; - uint32_t addr = OF_BSWAP32_IF_LE(addrIn->sin_addr.s_addr); - OFString *string; - - string = [OFString stringWithFormat: @"%u.%u.%u.%u", - (addr & 0xFF000000) >> 24, (addr & 0x00FF0000) >> 16, - (addr & 0x0000FF00) >> 8, addr & 0x000000FF]; - - if (port != NULL) - *port = OF_BSWAP16_IF_LE(addrIn->sin_port); - - return string; -} - -static OFString * -IPv6String(const of_socket_address_t *address, uint16_t *port) -{ - OFMutableString *string = [OFMutableString string]; - const struct sockaddr_in6 *addrIn6 = &address->sockaddr.in6; - int_fast8_t zerosStart = -1, maxZerosStart = -1; - uint_fast8_t zerosCount = 0, maxZerosCount = 0; - bool first = true; - - for (uint_fast8_t i = 0; i < 16; i += 2) { - if (addrIn6->sin6_addr.s6_addr[i] == 0 && - addrIn6->sin6_addr.s6_addr[i + 1] == 0) { - if (zerosStart >= 0) - zerosCount++; - else { - zerosStart = i; - zerosCount = 1; - } - } else { - if (zerosCount > maxZerosCount) { - maxZerosStart = zerosStart; - maxZerosCount = zerosCount; - } - - zerosStart = -1; - } - } - if (zerosCount > maxZerosCount) { - maxZerosStart = zerosStart; - maxZerosCount = zerosCount; - } - - if (maxZerosCount >= 2) { - for (int_fast8_t i = 0; i < maxZerosStart; i += 2) { - [string appendFormat: - (first ? @"%x" : @":%x"), - (addrIn6->sin6_addr.s6_addr[(uint_fast8_t)i] << 8) | - addrIn6->sin6_addr.s6_addr[(uint_fast8_t)i + 1]]; - first = false; - } - - [string appendString: @"::"]; - first = true; - - for (int_fast8_t i = maxZerosStart + (maxZerosCount * 2); - i < 16; i += 2) { - [string appendFormat: - (first ? @"%x" : @":%x"), - (addrIn6->sin6_addr.s6_addr[(uint_fast8_t)i] << 8) | - addrIn6->sin6_addr.s6_addr[(uint_fast8_t)i + 1]]; - first = false; - } - } else { - for (uint_fast8_t i = 0; i < 16; i += 2) { - [string appendFormat: - (first ? @"%x" : @":%x"), - (addrIn6->sin6_addr.s6_addr[i] << 8) | - addrIn6->sin6_addr.s6_addr[i + 1]]; - first = false; - } - } - - [string makeImmutable]; - - if (port != NULL) - *port = OF_BSWAP16_IF_LE(addrIn6->sin6_port); - - return string; -} - -OFString * -of_socket_address_ip_string(const of_socket_address_t *address, uint16_t *port) -{ - switch (address->family) { - case OF_SOCKET_ADDRESS_FAMILY_IPV4: - return IPv4String(address, port); - case OF_SOCKET_ADDRESS_FAMILY_IPV6: - return IPv6String(address, port); - default: - @throw [OFInvalidArgumentException exception]; - } -} - -void -of_socket_address_set_port(of_socket_address_t *address, uint16_t port) -{ - switch (address->family) { - case OF_SOCKET_ADDRESS_FAMILY_IPV4: - address->sockaddr.in.sin_port = OF_BSWAP16_IF_LE(port); - break; - case OF_SOCKET_ADDRESS_FAMILY_IPV6: - address->sockaddr.in6.sin6_port = OF_BSWAP16_IF_LE(port); - break; - case OF_SOCKET_ADDRESS_FAMILY_IPX: - address->sockaddr.ipx.sipx_port = OF_BSWAP16_IF_LE(port); - break; - default: - @throw [OFInvalidArgumentException exception]; - } -} - -uint16_t -of_socket_address_get_port(const of_socket_address_t *address) -{ - switch (address->family) { - case OF_SOCKET_ADDRESS_FAMILY_IPV4: - return OF_BSWAP16_IF_LE(address->sockaddr.in.sin_port); - case OF_SOCKET_ADDRESS_FAMILY_IPV6: - return OF_BSWAP16_IF_LE(address->sockaddr.in6.sin6_port); - case OF_SOCKET_ADDRESS_FAMILY_IPX: - return OF_BSWAP16_IF_LE(address->sockaddr.ipx.sipx_port); - default: - @throw [OFInvalidArgumentException exception]; - } -} - -void -of_socket_address_set_ipx_network(of_socket_address_t *address, - uint32_t network) -{ - if (address->family != OF_SOCKET_ADDRESS_FAMILY_IPX) - @throw [OFInvalidArgumentException exception]; - - network = OF_BSWAP32_IF_LE(network); - memcpy(&address->sockaddr.ipx.sipx_network, &network, - sizeof(address->sockaddr.ipx.sipx_network)); -} - -uint32_t -of_socket_address_get_ipx_network(const of_socket_address_t *address) -{ - uint32_t network; - - if (address->family != OF_SOCKET_ADDRESS_FAMILY_IPX) - @throw [OFInvalidArgumentException exception]; - - memcpy(&network, &address->sockaddr.ipx.sipx_network, sizeof(network)); - - return OF_BSWAP32_IF_LE(network); -} - -void -of_socket_address_set_ipx_node(of_socket_address_t *address, - const unsigned char node[IPX_NODE_LEN]) -{ - if (address->family != OF_SOCKET_ADDRESS_FAMILY_IPX) - @throw [OFInvalidArgumentException exception]; - - memcpy(address->sockaddr.ipx.sipx_node, node, IPX_NODE_LEN); -} - -void -of_socket_address_get_ipx_node(const of_socket_address_t *address, - unsigned char node[IPX_NODE_LEN]) -{ - if (address->family != OF_SOCKET_ADDRESS_FAMILY_IPX) - @throw [OFInvalidArgumentException exception]; - - memcpy(node, address->sockaddr.ipx.sipx_node, IPX_NODE_LEN); -} DELETED src/socket_helpers.h Index: src/socket_helpers.h ================================================================== --- src/socket_helpers.h +++ src/socket_helpers.h @@ -1,98 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#include "unistd_wrapper.h" - -#ifdef HAVE_ARPA_INET_H -# include -#endif -#ifdef HAVE_NETDB_H -# include -#endif - -#include "socket.h" - -#ifndef INVALID_SOCKET -# define INVALID_SOCKET -1 -#endif - -#ifndef INADDR_NONE -# define INADDR_NONE ((in_addr_t)-1) -#endif - -#ifndef SOMAXCONN -/* - * Use 16 as everything > 17 fails on Nintendo 3DS and 16 is a less arbitrary - * number than 17. - */ -# define SOMAXCONN 16 -#endif - -#ifndef SOCK_CLOEXEC -# define SOCK_CLOEXEC 0 -#endif - -#if defined(OF_AMIGAOS) -# ifdef OF_MORPHOS -# include -# else -# include -# endif -# include -# define closesocket(sock) CloseSocket(sock) -# define ioctlsocket(fd, req, arg) IoctlSocket(fd, req, arg) -# define hstrerror(err) "unknown (no hstrerror)" -# define SOCKET_ERROR -1 -# if defined(OF_HAVE_THREADS) && !defined(OF_MORPHOS) -# define SocketBase ((struct Library *)of_tlskey_get(of_socket_base_key)) -# ifdef OF_AMIGAOS4 -# define ISocket \ - ((struct SocketIFace *)of_tlskey_get(of_socket_interface_key)) -# endif -# endif -# ifdef OF_MORPHOS -typedef uint32_t in_addr_t; -# endif -#elif !defined(OF_WINDOWS) && !defined(OF_WII) -# define closesocket(sock) close(sock) -#endif - -#ifdef OF_WII -# define accept(sock, addr, addrlen) net_accept(sock, addr, addrlen) -# define bind(sock, addr, addrlen) net_bind(sock, addr, addrlen) -# define closesocket(sock) net_close(sock) -# define connect(sock, addr, addrlen) \ - net_connect(sock, (struct sockaddr *)addr, addrlen) -# define fcntl(fd, cmd, flags) net_fcntl(fd, cmd, flags) -# define h_errno 0 -# define hstrerror(err) "unknown (no hstrerror)" -# define listen(sock, backlog) net_listen(sock, backlog) -# define poll(fds, nfds, timeout) net_poll(fds, nfds, timeout) -# define recv(sock, buf, len, flags) net_recv(sock, buf, len, flags) -# define recvfrom(sock, buf, len, flags, addr, addrlen) \ - net_recvfrom(sock, buf, len, flags, addr, addrlen) -# define select(nfds, readfds, writefds, errorfds, timeout) \ - net_select(nfds, readfds, writefds, errorfds, timeout) -# define send(sock, buf, len, flags) net_send(sock, buf, len, flags) -# define sendto(sock, buf, len, flags, addr, addrlen) \ - net_sendto(sock, buf, len, flags, (struct sockaddr *)(addr), addrlen) -# define setsockopt(sock, level, name, value, len) \ - net_setsockopt(sock, level, name, value, len) -# define socket(domain, type, proto) net_socket(domain, type, proto) -typedef u32 in_addr_t; -typedef u32 nfds_t; -#endif DELETED src/thread.h Index: src/thread.h ================================================================== --- src/thread.h +++ src/thread.h @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "objfw-defs.h" - -#include "platform.h" - -#if !defined(OF_HAVE_THREADS) || \ - (!defined(OF_HAVE_PTHREADS) && !defined(OF_WINDOWS) && !defined(OF_AMIGAOS)) -# error No threads available! -#endif - -#import "macros.h" - -#if defined(OF_HAVE_PTHREADS) -# include -typedef pthread_t of_thread_t; -#elif defined(OF_WINDOWS) -# include -typedef HANDLE of_thread_t; -#elif defined(OF_AMIGAOS) -# include -# include -typedef struct { - struct Task *task; - void (*function)(id); - id object; - struct SignalSemaphore semaphore; - struct Task *joinTask; - unsigned char joinSigBit; - bool detached, done; -} *of_thread_t; -#endif - -typedef struct of_thread_attr_t { - float priority; - size_t stackSize; -} of_thread_attr_t; - -#if defined(OF_HAVE_PTHREADS) -# define of_thread_is_current(t) pthread_equal(t, pthread_self()) -# define of_thread_current() pthread_self() -#elif defined(OF_WINDOWS) -# define of_thread_is_current(t) (t == GetCurrentThread()) -# define of_thread_current() GetCurrentThread() -#elif defined(OF_AMIGAOS) -# define of_thread_is_current(t) (t->thread == FindTask(NULL)) -extern of_thread_t of_thread_current(void); -#endif - -#ifdef __cplusplus -extern "C" { -#endif -extern int of_thread_attr_init(of_thread_attr_t *attr); -extern int of_thread_new(of_thread_t *thread, const char *name, - void (*function)(id), id object, const of_thread_attr_t *attr); -extern void of_thread_set_name(const char *name); -extern int of_thread_join(of_thread_t thread); -extern int of_thread_detach(of_thread_t thread); -#ifdef __cplusplus -} -#endif DELETED src/thread.m Index: src/thread.m ================================================================== --- src/thread.m +++ src/thread.m @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#include "platform.h" - -#if defined(OF_HAVE_PTHREADS) -# include "platform/posix/thread.m" -#elif defined(OF_WINDOWS) -# include "platform/windows/thread.m" -#elif defined(OF_AMIGAOS) -# include "platform/amiga/thread.m" -#endif DELETED src/tlskey.h Index: src/tlskey.h ================================================================== --- src/tlskey.h +++ src/tlskey.h @@ -1,102 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "objfw-defs.h" - -#include - -#include "platform.h" - -#if !defined(OF_HAVE_THREADS) || \ - (!defined(OF_HAVE_PTHREADS) && !defined(OF_WINDOWS) && !defined(OF_AMIGAOS)) -# error No thread-local storage available! -#endif - -#import "macros.h" - -#if defined(OF_HAVE_PTHREADS) -# include -typedef pthread_key_t of_tlskey_t; -#elif defined(OF_WINDOWS) -# include -typedef DWORD of_tlskey_t; -#elif defined(OF_MORPHOS) -# include -typedef ULONG of_tlskey_t; -#elif defined(OF_AMIGAOS) -typedef struct of_tlskey { - struct objc_hashtable *table; - struct of_tlskey *next, *previous; -} *of_tlskey_t; -#endif - -#ifdef __cplusplus -extern "C" { -#endif -extern int of_tlskey_new(of_tlskey_t *key); -extern int of_tlskey_free(of_tlskey_t key); -#ifdef __cplusplus -} -#endif - -/* TLS keys are inlined for performance. */ - -#if defined(OF_HAVE_PTHREADS) -static OF_INLINE void * -of_tlskey_get(of_tlskey_t key) -{ - return pthread_getspecific(key); -} - -static OF_INLINE int -of_tlskey_set(of_tlskey_t key, void *ptr) -{ - return pthread_setspecific(key, ptr); -} -#elif defined(OF_WINDOWS) -static OF_INLINE void * -of_tlskey_get(of_tlskey_t key) -{ - return TlsGetValue(key); -} - -static OF_INLINE int -of_tlskey_set(of_tlskey_t key, void *ptr) -{ - return (TlsSetValue(key, ptr) ? 0 : EINVAL); -} -#elif defined(OF_MORPHOS) -static OF_INLINE void * -of_tlskey_get(of_tlskey_t key) -{ - return (void *)TLSGetValue(key); -} - -static OF_INLINE int -of_tlskey_set(of_tlskey_t key, void *ptr) -{ - return (TLSSetValue(key, (APTR)ptr) ? 0 : EINVAL); -} -#elif defined(OF_AMIGAOS) -/* Those are too big too inline. */ -# ifdef __cplusplus -extern "C" { -# endif -extern void *of_tlskey_get(of_tlskey_t key); -extern int of_tlskey_set(of_tlskey_t key, void *ptr); -# ifdef __cplusplus -} -# endif -#endif DELETED src/tlskey.m Index: src/tlskey.m ================================================================== --- src/tlskey.m +++ src/tlskey.m @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2008-2021 Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#include "platform.h" - -#if defined(OF_HAVE_PTHREADS) -# include "platform/posix/tlskey.m" -#elif defined(OF_WINDOWS) -# include "platform/windows/tlskey.m" -#elif defined(OF_MORPHOS) -# include "platform/morphos/tlskey.m" -#elif defined(OF_AMIGAOS) -# include "platform/amiga/tlskey.m" -#endif Index: src/unicode.h ================================================================== --- src/unicode.h +++ src/unicode.h @@ -13,30 +13,30 @@ * file. */ #import "OFString.h" -#define OF_UNICODE_UPPERCASE_TABLE_SIZE 0x1EA -#define OF_UNICODE_LOWERCASE_TABLE_SIZE 0x1EA -#define OF_UNICODE_TITLECASE_TABLE_SIZE 0x1EA -#define OF_UNICODE_CASEFOLDING_TABLE_SIZE 0x1EA -#define OF_UNICODE_DECOMPOSITION_TABLE_SIZE 0x2FB -#define OF_UNICODE_DECOMPOSITION_COMPAT_TABLE_SIZE 0x2FB +#define OFUnicodeUppercaseTableSize 0x1EA +#define OFUnicodeLowercaseTableSize 0x1EA +#define OFUnicodeTitlecaseTableSize 0x1EA +#define OFUnicodeCaseFoldingTableSize 0x1EA +#define OFUnicodeDecompositionTableSize 0x2FB +#define OFUnicodeDecompositionCompatTableSize 0x2FB #ifdef __cplusplus extern "C" { #endif -extern const of_unichar_t *const _Nonnull - of_unicode_uppercase_table[OF_UNICODE_UPPERCASE_TABLE_SIZE]; -extern const of_unichar_t *const _Nonnull - of_unicode_lowercase_table[OF_UNICODE_LOWERCASE_TABLE_SIZE]; -extern const of_unichar_t *const _Nonnull - of_unicode_titlecase_table[OF_UNICODE_TITLECASE_TABLE_SIZE]; -extern const of_unichar_t *const _Nonnull - of_unicode_casefolding_table[OF_UNICODE_CASEFOLDING_TABLE_SIZE]; -extern const char *const _Nullable *const _Nonnull - of_unicode_decomposition_table[OF_UNICODE_DECOMPOSITION_TABLE_SIZE]; -extern const char *const _Nullable *const _Nonnull - of_unicode_decomposition_compat_table[OF_UNICODE_DECOMPOSITION_COMPAT_TABLE_SIZE]; +extern const OFUnichar *const _Nonnull + OFUnicodeUppercaseTable[OFUnicodeUppercaseTableSize]; +extern const OFUnichar *const _Nonnull + OFUnicodeLowercaseTable[OFUnicodeLowercaseTableSize]; +extern const OFUnichar *const _Nonnull + OFUnicodeTitlecaseTable[OFUnicodeTitlecaseTableSize]; +extern const OFUnichar *const _Nonnull + OFUnicodeCaseFoldingTable[OFUnicodeCaseFoldingTableSize]; +extern const char *const _Nullable *const _Nonnull + OFUnicodeDecompositionTable[OFUnicodeDecompositionTableSize]; +extern const char *const _Nullable *const _Nonnull + OFUnicodeDecompositionCompatTable[OFUnicodeDecompositionCompatTableSize]; #ifdef __cplusplus } #endif Index: src/unicode.m ================================================================== --- src/unicode.m +++ src/unicode.m @@ -15,14 +15,14 @@ #include "config.h" #import "OFString.h" -static const of_unichar_t emptyPage[0x100] = { 0 }; +static const OFUnichar emptyPage[0x100] = { 0 }; static const char *emptyDecompositionPage[0x100] = { NULL }; -static const of_unichar_t uppercasePage0[0x100] = { +static const OFUnichar uppercasePage0[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -53,11 +53,11 @@ 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 0, 216, 217, 218, 219, 220, 221, 222, 376, }; -static const of_unichar_t uppercasePage1[0x100] = { +static const OFUnichar uppercasePage1[0x100] = { 0, 256, 0, 258, 0, 260, 0, 262, 0, 264, 0, 266, 0, 268, 0, 270, 0, 272, 0, 274, 0, 276, 0, 278, 0, 280, 0, 282, 0, 284, 0, 286, 0, 288, 0, 290, 0, 292, 0, 294, @@ -88,11 +88,11 @@ 0, 488, 0, 490, 0, 492, 0, 494, 0, 0, 497, 497, 0, 500, 0, 0, 0, 504, 0, 506, 0, 508, 0, 510, }; -static const of_unichar_t uppercasePage2[0x100] = { +static const OFUnichar uppercasePage2[0x100] = { 0, 512, 0, 514, 0, 516, 0, 518, 0, 520, 0, 522, 0, 524, 0, 526, 0, 528, 0, 530, 0, 532, 0, 534, 0, 536, 0, 538, 0, 540, 0, 542, 0, 0, 0, 546, 0, 548, 0, 550, @@ -123,11 +123,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t uppercasePage3[0x100] = { +static const OFUnichar uppercasePage3[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -158,11 +158,11 @@ 0, 1000, 0, 1002, 0, 1004, 0, 1006, 922, 929, 1017, 895, 0, 917, 0, 0, 1015, 0, 0, 1018, 0, 0, 0, 0, }; -static const of_unichar_t uppercasePage4[0x100] = { +static const OFUnichar uppercasePage4[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -193,11 +193,11 @@ 0, 1256, 0, 1258, 0, 1260, 0, 1262, 0, 1264, 0, 1266, 0, 1268, 0, 1270, 0, 1272, 0, 1274, 0, 1276, 0, 1278, }; -static const of_unichar_t uppercasePage5[0x100] = { +static const OFUnichar uppercasePage5[0x100] = { 0, 1280, 0, 1282, 0, 1284, 0, 1286, 0, 1288, 0, 1290, 0, 1292, 0, 1294, 0, 1296, 0, 1298, 0, 1300, 0, 1302, 0, 1304, 0, 1306, 0, 1308, 0, 1310, 0, 1312, 0, 1314, 0, 1316, 0, 1318, @@ -228,11 +228,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t uppercasePage16[0x100] = { +static const OFUnichar uppercasePage16[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -263,11 +263,11 @@ 7336, 7337, 7338, 7339, 7340, 7341, 7342, 7343, 7344, 7345, 7346, 7347, 7348, 7349, 7350, 7351, 7352, 7353, 7354, 0, 0, 7357, 7358, 7359, }; -static const of_unichar_t uppercasePage19[0x100] = { +static const OFUnichar uppercasePage19[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -298,11 +298,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5104, 5105, 5106, 5107, 5108, 5109, 0, 0, }; -static const of_unichar_t uppercasePage28[0x100] = { +static const OFUnichar uppercasePage28[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -333,11 +333,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t uppercasePage29[0x100] = { +static const OFUnichar uppercasePage29[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -368,11 +368,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t uppercasePage30[0x100] = { +static const OFUnichar uppercasePage30[0x100] = { 0, 7680, 0, 7682, 0, 7684, 0, 7686, 0, 7688, 0, 7690, 0, 7692, 0, 7694, 0, 7696, 0, 7698, 0, 7700, 0, 7702, 0, 7704, 0, 7706, 0, 7708, 0, 7710, 0, 7712, 0, 7714, 0, 7716, 0, 7718, @@ -403,11 +403,11 @@ 0, 7912, 0, 7914, 0, 7916, 0, 7918, 0, 7920, 0, 7922, 0, 7924, 0, 7926, 0, 7928, 0, 7930, 0, 7932, 0, 7934, }; -static const of_unichar_t uppercasePage31[0x100] = { +static const OFUnichar uppercasePage31[0x100] = { 7944, 7945, 7946, 7947, 7948, 7949, 7950, 7951, 0, 0, 0, 0, 0, 0, 0, 0, 7960, 7961, 7962, 7963, 7964, 7965, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7976, 7977, 7978, 7979, 7980, 7981, 7982, 7983, @@ -438,11 +438,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t uppercasePage33[0x100] = { +static const OFUnichar uppercasePage33[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -473,11 +473,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t uppercasePage36[0x100] = { +static const OFUnichar uppercasePage36[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -508,11 +508,11 @@ 9422, 9423, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t uppercasePage44[0x100] = { +static const OFUnichar uppercasePage44[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -543,11 +543,11 @@ 0, 0, 0, 0, 11499, 0, 11501, 0, 0, 0, 0, 11506, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t uppercasePage45[0x100] = { +static const OFUnichar uppercasePage45[0x100] = { 4256, 4257, 4258, 4259, 4260, 4261, 4262, 4263, 4264, 4265, 4266, 4267, 4268, 4269, 4270, 4271, 4272, 4273, 4274, 4275, 4276, 4277, 4278, 4279, 4280, 4281, 4282, 4283, 4284, 4285, 4286, 4287, 4288, 4289, 4290, 4291, 4292, 4293, 0, 4295, @@ -578,11 +578,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t uppercasePage166[0x100] = { +static const OFUnichar uppercasePage166[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -613,11 +613,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t uppercasePage167[0x100] = { +static const OFUnichar uppercasePage167[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42786, 0, 42788, 0, 42790, @@ -648,11 +648,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42997, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t uppercasePage171[0x100] = { +static const OFUnichar uppercasePage171[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -683,11 +683,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t uppercasePage255[0x100] = { +static const OFUnichar uppercasePage255[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -718,11 +718,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t uppercasePage260[0x100] = { +static const OFUnichar uppercasePage260[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -753,11 +753,11 @@ 66752, 66753, 66754, 66755, 66756, 66757, 66758, 66759, 66760, 66761, 66762, 66763, 66764, 66765, 66766, 66767, 66768, 66769, 66770, 66771, 0, 0, 0, 0, }; -static const of_unichar_t uppercasePage268[0x100] = { +static const OFUnichar uppercasePage268[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -788,11 +788,11 @@ 68776, 68777, 68778, 68779, 68780, 68781, 68782, 68783, 68784, 68785, 68786, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t uppercasePage280[0x100] = { +static const OFUnichar uppercasePage280[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -823,11 +823,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t uppercasePage366[0x100] = { +static const OFUnichar uppercasePage366[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -858,11 +858,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t uppercasePage489[0x100] = { +static const OFUnichar uppercasePage489[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125184, 125185, 125186, 125187, 125188, 125189, @@ -893,11 +893,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t lowercasePage0[0x100] = { +static const OFUnichar lowercasePage0[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -928,11 +928,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t lowercasePage1[0x100] = { +static const OFUnichar lowercasePage1[0x100] = { 257, 0, 259, 0, 261, 0, 263, 0, 265, 0, 267, 0, 269, 0, 271, 0, 273, 0, 275, 0, 277, 0, 279, 0, 281, 0, 283, 0, 285, 0, 287, 0, 289, 0, 291, 0, 293, 0, 295, 0, @@ -963,11 +963,11 @@ 489, 0, 491, 0, 493, 0, 495, 0, 0, 499, 499, 0, 501, 0, 405, 447, 505, 0, 507, 0, 509, 0, 511, 0, }; -static const of_unichar_t lowercasePage2[0x100] = { +static const OFUnichar lowercasePage2[0x100] = { 513, 0, 515, 0, 517, 0, 519, 0, 521, 0, 523, 0, 525, 0, 527, 0, 529, 0, 531, 0, 533, 0, 535, 0, 537, 0, 539, 0, 541, 0, 543, 0, 414, 0, 547, 0, 549, 0, 551, 0, @@ -998,11 +998,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t lowercasePage3[0x100] = { +static const OFUnichar lowercasePage3[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1033,11 +1033,11 @@ 1001, 0, 1003, 0, 1005, 0, 1007, 0, 0, 0, 0, 0, 952, 0, 0, 1016, 0, 1010, 1019, 0, 0, 891, 892, 893, }; -static const of_unichar_t lowercasePage4[0x100] = { +static const OFUnichar lowercasePage4[0x100] = { 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, @@ -1068,11 +1068,11 @@ 1257, 0, 1259, 0, 1261, 0, 1263, 0, 1265, 0, 1267, 0, 1269, 0, 1271, 0, 1273, 0, 1275, 0, 1277, 0, 1279, 0, }; -static const of_unichar_t lowercasePage5[0x100] = { +static const OFUnichar lowercasePage5[0x100] = { 1281, 0, 1283, 0, 1285, 0, 1287, 0, 1289, 0, 1291, 0, 1293, 0, 1295, 0, 1297, 0, 1299, 0, 1301, 0, 1303, 0, 1305, 0, 1307, 0, 1309, 0, 1311, 0, 1313, 0, 1315, 0, 1317, 0, 1319, 0, @@ -1103,11 +1103,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t lowercasePage16[0x100] = { +static const OFUnichar lowercasePage16[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1138,11 +1138,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t lowercasePage19[0x100] = { +static const OFUnichar lowercasePage19[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1173,11 +1173,11 @@ 43960, 43961, 43962, 43963, 43964, 43965, 43966, 43967, 5112, 5113, 5114, 5115, 5116, 5117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t lowercasePage28[0x100] = { +static const OFUnichar lowercasePage28[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1208,11 +1208,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t lowercasePage30[0x100] = { +static const OFUnichar lowercasePage30[0x100] = { 7681, 0, 7683, 0, 7685, 0, 7687, 0, 7689, 0, 7691, 0, 7693, 0, 7695, 0, 7697, 0, 7699, 0, 7701, 0, 7703, 0, 7705, 0, 7707, 0, 7709, 0, 7711, 0, 7713, 0, 7715, 0, 7717, 0, 7719, 0, @@ -1243,11 +1243,11 @@ 7913, 0, 7915, 0, 7917, 0, 7919, 0, 7921, 0, 7923, 0, 7925, 0, 7927, 0, 7929, 0, 7931, 0, 7933, 0, 7935, 0, }; -static const of_unichar_t lowercasePage31[0x100] = { +static const OFUnichar lowercasePage31[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 7936, 7937, 7938, 7939, 7940, 7941, 7942, 7943, 0, 0, 0, 0, 0, 0, 0, 0, 7952, 7953, 7954, 7955, 7956, 7957, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1278,11 +1278,11 @@ 8160, 8161, 8058, 8059, 8165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8056, 8057, 8060, 8061, 8179, 0, 0, 0, }; -static const of_unichar_t lowercasePage33[0x100] = { +static const OFUnichar lowercasePage33[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 969, 0, @@ -1313,11 +1313,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t lowercasePage36[0x100] = { +static const OFUnichar lowercasePage36[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1348,11 +1348,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t lowercasePage44[0x100] = { +static const OFUnichar lowercasePage44[0x100] = { 11312, 11313, 11314, 11315, 11316, 11317, 11318, 11319, 11320, 11321, 11322, 11323, 11324, 11325, 11326, 11327, 11328, 11329, 11330, 11331, 11332, 11333, 11334, 11335, 11336, 11337, 11338, 11339, 11340, 11341, 11342, 11343, 11344, 11345, 11346, 11347, 11348, 11349, 11350, 11351, @@ -1383,11 +1383,11 @@ 0, 0, 0, 11500, 0, 11502, 0, 0, 0, 0, 11507, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t lowercasePage166[0x100] = { +static const OFUnichar lowercasePage166[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1418,11 +1418,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t lowercasePage167[0x100] = { +static const OFUnichar lowercasePage167[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42787, 0, 42789, 0, 42791, 0, @@ -1453,11 +1453,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42998, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t lowercasePage255[0x100] = { +static const OFUnichar lowercasePage255[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65345, 65346, 65347, 65348, 65349, 65350, 65351, @@ -1488,11 +1488,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t lowercasePage260[0x100] = { +static const OFUnichar lowercasePage260[0x100] = { 66600, 66601, 66602, 66603, 66604, 66605, 66606, 66607, 66608, 66609, 66610, 66611, 66612, 66613, 66614, 66615, 66616, 66617, 66618, 66619, 66620, 66621, 66622, 66623, 66624, 66625, 66626, 66627, 66628, 66629, 66630, 66631, 66632, 66633, 66634, 66635, 66636, 66637, 66638, 66639, @@ -1523,11 +1523,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t lowercasePage268[0x100] = { +static const OFUnichar lowercasePage268[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1558,11 +1558,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t lowercasePage280[0x100] = { +static const OFUnichar lowercasePage280[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1593,11 +1593,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t lowercasePage366[0x100] = { +static const OFUnichar lowercasePage366[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1628,11 +1628,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t lowercasePage489[0x100] = { +static const OFUnichar lowercasePage489[0x100] = { 125218, 125219, 125220, 125221, 125222, 125223, 125224, 125225, 125226, 125227, 125228, 125229, 125230, 125231, 125232, 125233, 125234, 125235, 125236, 125237, 125238, 125239, 125240, 125241, 125242, 125243, 125244, 125245, 125246, 125247, 125248, 125249, 125250, 125251, 0, 0, 0, 0, 0, 0, @@ -1663,11 +1663,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t titlecasePage1[0x100] = { +static const OFUnichar titlecasePage1[0x100] = { 0, 256, 0, 258, 0, 260, 0, 262, 0, 264, 0, 266, 0, 268, 0, 270, 0, 272, 0, 274, 0, 276, 0, 278, 0, 280, 0, 282, 0, 284, 0, 286, 0, 288, 0, 290, 0, 292, 0, 294, @@ -1698,11 +1698,11 @@ 0, 488, 0, 490, 0, 492, 0, 494, 0, 498, 498, 498, 0, 500, 0, 0, 0, 504, 0, 506, 0, 508, 0, 510, }; -static const of_unichar_t titlecasePage16[0x100] = { +static const OFUnichar titlecasePage16[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1733,11 +1733,11 @@ 4328, 4329, 4330, 4331, 4332, 4333, 4334, 4335, 4336, 4337, 4338, 4339, 4340, 4341, 4342, 4343, 4344, 4345, 4346, 0, 0, 4349, 4350, 4351, }; -static const of_unichar_t casefoldingPage0[0x100] = { +static const OFUnichar caseFoldingPage0[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1768,11 +1768,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t casefoldingPage1[0x100] = { +static const OFUnichar caseFoldingPage1[0x100] = { 257, 0, 259, 0, 261, 0, 263, 0, 265, 0, 267, 0, 269, 0, 271, 0, 273, 0, 275, 0, 277, 0, 279, 0, 281, 0, 283, 0, 285, 0, 287, 0, 289, 0, 291, 0, 293, 0, 295, 0, @@ -1803,11 +1803,11 @@ 489, 0, 491, 0, 493, 0, 495, 0, 0, 499, 499, 0, 501, 0, 405, 447, 505, 0, 507, 0, 509, 0, 511, 0, }; -static const of_unichar_t casefoldingPage3[0x100] = { +static const OFUnichar caseFoldingPage3[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1838,11 +1838,11 @@ 1001, 0, 1003, 0, 1005, 0, 1007, 0, 954, 961, 0, 0, 952, 949, 0, 1016, 0, 1010, 1019, 0, 0, 891, 892, 893, }; -static const of_unichar_t casefoldingPage19[0x100] = { +static const OFUnichar caseFoldingPage19[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1873,11 +1873,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5104, 5105, 5106, 5107, 5108, 5109, 0, 0, }; -static const of_unichar_t casefoldingPage28[0x100] = { +static const OFUnichar caseFoldingPage28[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1908,11 +1908,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -static const of_unichar_t casefoldingPage30[0x100] = { +static const OFUnichar caseFoldingPage30[0x100] = { 7681, 0, 7683, 0, 7685, 0, 7687, 0, 7689, 0, 7691, 0, 7693, 0, 7695, 0, 7697, 0, 7699, 0, 7701, 0, 7703, 0, 7705, 0, 7707, 0, 7709, 0, 7711, 0, 7713, 0, 7715, 0, 7717, 0, 7719, 0, @@ -1943,11 +1943,11 @@ 7913, 0, 7915, 0, 7917, 0, 7919, 0, 7921, 0, 7923, 0, 7925, 0, 7927, 0, 7929, 0, 7931, 0, 7933, 0, 7935, 0, }; -static const of_unichar_t casefoldingPage31[0x100] = { +static const OFUnichar caseFoldingPage31[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 7936, 7937, 7938, 7939, 7940, 7941, 7942, 7943, 0, 0, 0, 0, 0, 0, 0, 0, 7952, 7953, 7954, 7955, 7956, 7957, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1978,11 +1978,11 @@ 8160, 8161, 8058, 8059, 8165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8056, 8057, 8060, 8061, 8179, 0, 0, 0, }; -static const of_unichar_t casefoldingPage171[0x100] = { +static const OFUnichar caseFoldingPage171[0x100] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -12362,11 +12362,11 @@ NULL, NULL, NULL, NULL, NULL, NULL, }; -const of_unichar_t *const of_unicode_uppercase_table[0x1EA] = { +const OFUnichar *const OFUnicodeUppercaseTable[0x1EA] = { uppercasePage0, uppercasePage1, uppercasePage2, uppercasePage3, uppercasePage4, uppercasePage5, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, uppercasePage16, emptyPage, emptyPage, uppercasePage19, @@ -12488,11 +12488,11 @@ emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, uppercasePage489 }; -const of_unichar_t *const of_unicode_lowercase_table[0x1EA] = { +const OFUnichar *const OFUnicodeLowercaseTable[0x1EA] = { lowercasePage0, lowercasePage1, lowercasePage2, lowercasePage3, lowercasePage4, lowercasePage5, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, lowercasePage16, emptyPage, emptyPage, lowercasePage19, @@ -12614,11 +12614,11 @@ emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, lowercasePage489 }; -const of_unichar_t *const of_unicode_titlecase_table[0x1EA] = { +const OFUnichar *const OFUnicodeTitlecaseTable[0x1EA] = { uppercasePage0, titlecasePage1, uppercasePage2, uppercasePage3, uppercasePage4, uppercasePage5, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, titlecasePage16, emptyPage, emptyPage, uppercasePage19, @@ -12740,22 +12740,22 @@ emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, uppercasePage489 }; -const of_unichar_t *const of_unicode_casefolding_table[0x1EA] = { - casefoldingPage0, casefoldingPage1, lowercasePage2, - casefoldingPage3, lowercasePage4, lowercasePage5, +const OFUnichar *const OFUnicodeCaseFoldingTable[0x1EA] = { + caseFoldingPage0, caseFoldingPage1, lowercasePage2, + caseFoldingPage3, lowercasePage4, lowercasePage5, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, lowercasePage16, emptyPage, - emptyPage, casefoldingPage19, emptyPage, + emptyPage, caseFoldingPage19, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, - emptyPage, casefoldingPage28, emptyPage, - casefoldingPage30, casefoldingPage31, emptyPage, + emptyPage, caseFoldingPage28, emptyPage, + caseFoldingPage30, caseFoldingPage31, emptyPage, lowercasePage33, emptyPage, emptyPage, lowercasePage36, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, lowercasePage44, emptyPage, emptyPage, emptyPage, @@ -12798,11 +12798,11 @@ emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, lowercasePage166, lowercasePage167, emptyPage, emptyPage, emptyPage, - casefoldingPage171, emptyPage, emptyPage, + caseFoldingPage171, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, @@ -12907,11 +12907,11 @@ emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, emptyPage, lowercasePage489 }; -const char *const *of_unicode_decomposition_table[0x2FB] = { +const char *const *OFUnicodeDecompositionTable[0x2FB] = { decompositionPage0, decompositionPage1, decompositionPage2, decompositionPage3, decompositionPage4, emptyDecompositionPage, decompositionPage6, emptyDecompositionPage, emptyDecompositionPage, decompositionPage9, decompositionPage10, decompositionPage11, decompositionPage12, decompositionPage13, emptyDecompositionPage, @@ -13165,11 +13165,11 @@ emptyDecompositionPage, emptyDecompositionPage, emptyDecompositionPage, emptyDecompositionPage, decompositionPage760, decompositionPage761, decompositionPage762 }; -const char *const *of_unicode_decomposition_compat_table[0x2FB] = { +const char *const *OFUnicodeDecompositionCompatTable[0x2FB] = { decompCompatPage0, decompCompatPage1, decompCompatPage2, decompCompatPage3, decompositionPage4, decompCompatPage5, decompCompatPage6, emptyDecompositionPage, emptyDecompositionPage, decompositionPage9, decompositionPage10, decompositionPage11, decompCompatPage12, decompCompatPage13, decompCompatPage14, Index: tests/ForwardingTests.m ================================================================== --- tests/ForwardingTests.m +++ tests/ForwardingTests.m @@ -125,11 +125,11 @@ - (uint32_t)forwardingTargetTest: (intptr_t)a0 : (intptr_t)a1 : (double)a2 : (double)a3 { - OF_ENSURE(self == target); + OFEnsure(self == target); if (a0 != (intptr_t)0xDEADBEEF) return 0; if (a1 != -1) return 0; @@ -144,11 +144,11 @@ - (OFString *)forwardingTargetVarArgTest: (OFConstantString *)fmt, ... { va_list args; OFString *ret; - OF_ENSURE(self == target); + OFEnsure(self == target); va_start(args, fmt); ret = [[[OFString alloc] initWithFormat: fmt arguments: args] autorelease]; va_end(args); @@ -156,20 +156,20 @@ return ret; } - (long double)forwardingTargetFPRetTest { - OF_ENSURE(self == target); + OFEnsure(self == target); return 12345678.00006103515625; } - (struct stret_test)forwardingTargetStRetTest { struct stret_test ret = { { 0 } }; - OF_ENSURE(self == target); + OFEnsure(self == target); memcpy(ret.s, "abcdefghijklmnopqrstuvwxyz", 27); return ret; } Index: tests/OFArrayTests.m ================================================================== --- tests/OFArrayTests.m +++ tests/OFArrayTests.m @@ -180,11 +180,11 @@ TEST(@"-[indexOfObjectIdenticalTo:]", [a[1] indexOfObjectIdenticalTo: c_ary[1]] == 1) TEST(@"-[objectsInRange:]", - [[a[0] objectsInRange: of_range(1, 2)] isEqual: + [[a[0] objectsInRange: OFRangeMake(1, 2)] isEqual: [arrayClass arrayWithObjects: c_ary[1], c_ary[2], nil]]) TEST(@"-[replaceObject:withObject:]", R([m[0] replaceObject: c_ary[1] withObject: c_ary[0]]) && [[m[0] objectAtIndex: 0] isEqual: c_ary[0]] && @@ -213,11 +213,11 @@ TEST(@"-[removeObjectAtIndex:]", R([m[1] removeObjectAtIndex: 1]) && m[1].count == 2 && [[m[1] objectAtIndex: 1] isEqual: c_ary[2]]) m[1] = [[a[0] mutableCopy] autorelease]; TEST(@"-[removeObjectsInRange:]", - R([m[1] removeObjectsInRange: of_range(0, 2)]) && + R([m[1] removeObjectsInRange: OFRangeMake(0, 2)]) && m[1].count == 1 && [[m[1] objectAtIndex: 0] isEqual: c_ary[2]]) m[1] = [[a[0] mutableCopy] autorelease]; [m[1] addObject: @"qux"]; [m[1] addObject: @"last"]; @@ -237,20 +237,20 @@ [m[1] addObject: @"z"]; TEST(@"-[sortedArray]", [[m[1] sortedArray] isEqual: [arrayClass arrayWithObjects: @"0", @"Bar", @"Baz", @"Foo", @"z", nil]] && [[m[1] sortedArrayUsingSelector: @selector(compare:) - options: OF_ARRAY_SORT_DESCENDING] + options: OFArraySortDescending] isEqual: [arrayClass arrayWithObjects: @"z", @"Foo", @"Baz", @"Bar", @"0", nil]]) EXPECT_EXCEPTION(@"Detect out of range in -[objectAtIndex:]", OFOutOfRangeException, [a[0] objectAtIndex: a[0].count]) EXPECT_EXCEPTION(@"Detect out of range in -[removeObjectsInRange:]", OFOutOfRangeException, [m[0] removeObjectsInRange: - of_range(0, m[0].count + 1)]) + OFRangeMake(0, m[0].count + 1)]) TEST(@"-[componentsJoinedByString:]", (a[1] = [arrayClass arrayWithObjects: @"", @"a", @"b", @"c", nil]) && [[a[1] componentsJoinedByString: @" "] isEqual: @" a b c"] && @@ -257,12 +257,13 @@ (a[1] = [arrayClass arrayWithObject: @"foo"]) && [[a[1] componentsJoinedByString: @" "] isEqual: @"foo"]) TEST(@"-[componentsJoinedByString:options]", (a[1] = [arrayClass arrayWithObjects: @"", @"foo", @"", @"", @"bar", - @"", nil]) && [[a[1] componentsJoinedByString: @" " - options: OF_ARRAY_SKIP_EMPTY] + @"", nil]) && + [[a[1] componentsJoinedByString: @" " + options: OFArraySkipEmptyComponents] isEqual: @"foo bar"]) m[0] = [[a[0] mutableCopy] autorelease]; ok = true; i = 0; Index: tests/OFCharacterSetTests.m ================================================================== --- tests/OFCharacterSetTests.m +++ tests/OFCharacterSetTests.m @@ -25,11 +25,11 @@ @interface SimpleCharacterSet: OFCharacterSet @end @implementation SimpleCharacterSet -- (bool)characterIsMember: (of_unichar_t)character +- (bool)characterIsMember: (OFUnichar)character { return (character % 2 == 0); } @end @@ -43,11 +43,11 @@ module = @"OFCharacterSet"; cs = [[[SimpleCharacterSet alloc] init] autorelease]; ok = true; - for (of_unichar_t c = 0; c < 65536; c++) { + for (OFUnichar c = 0; c < 65536; c++) { if (c % 2 == 0) { if (![cs characterIsMember: c]) ok = false; } else if ([cs characterIsMember: c]) ok = false; @@ -60,11 +60,11 @@ (cs = [OFCharacterSet characterSetWithCharactersInString: @"0123456789"]) && [cs isKindOfClass: [OFBitSetCharacterSet class]]) ok = true; - for (of_unichar_t c = 0; c < 65536; c++) { + for (OFUnichar c = 0; c < 65536; c++) { if (c >= '0' && c <= '9') { if (![cs characterIsMember: c]) ok = false; } else if ([cs characterIsMember: c]) ok = false; @@ -72,15 +72,16 @@ TEST(@"-[characterIsMember:]", ok); module = @"OFRangeCharacterSet"; TEST(@"+[characterSetWithRange:]", - (cs = [OFCharacterSet characterSetWithRange: of_range('0', 10)]) && + (cs = [OFCharacterSet + characterSetWithRange: OFRangeMake('0', 10)]) && [cs isKindOfClass: [OFRangeCharacterSet class]]) ok = true; - for (of_unichar_t c = 0; c < 65536; c++) { + for (OFUnichar c = 0; c < 65536; c++) { if (c >= '0' && c <= '9') { if (![cs characterIsMember: c]) ok = false; } else if ([cs characterIsMember: c]) ok = false; @@ -87,11 +88,11 @@ } TEST(@"-[characterIsMember:]", ok); ok = true; ics = cs.invertedSet; - for (of_unichar_t c = 0; c < 65536; c++) { + for (OFUnichar c = 0; c < 65536; c++) { if (c >= '0' && c <= '9') { if ([ics characterIsMember: c]) ok = false; } else if (![ics characterIsMember: c]) ok = false; Index: tests/OFDNSResolverTests.m ================================================================== --- tests/OFDNSResolverTests.m +++ tests/OFDNSResolverTests.m @@ -22,11 +22,11 @@ { void *pool = objc_autoreleasePoolPush(); OFDNSResolver *resolver = [OFDNSResolver resolver]; OFMutableString *staticHosts = [OFMutableString string]; - [of_stdout setForegroundColor: [OFColor lime]]; + [OFStdOut setForegroundColor: [OFColor lime]]; for (OFString *host in resolver.staticHosts) { OFString *IPs; if (staticHosts.length > 0) @@ -35,37 +35,37 @@ IPs = [[resolver.staticHosts objectForKey: host] componentsJoinedByString: @", "]; [staticHosts appendFormat: @"%@=(%@)", host, IPs]; } - [of_stdout writeFormat: @"[OFDNSResolver] Static hosts: %@\n", + [OFStdOut writeFormat: @"[OFDNSResolver] Static hosts: %@\n", staticHosts]; - [of_stdout writeFormat: @"[OFDNSResolver] Name servers: %@\n", + [OFStdOut writeFormat: @"[OFDNSResolver] Name servers: %@\n", [resolver.nameServers componentsJoinedByString: @", "]]; - [of_stdout writeFormat: @"[OFDNSResolver] Local domain: %@\n", + [OFStdOut writeFormat: @"[OFDNSResolver] Local domain: %@\n", resolver.localDomain]; - [of_stdout writeFormat: @"[OFDNSResolver] Search domains: %@\n", + [OFStdOut writeFormat: @"[OFDNSResolver] Search domains: %@\n", [resolver.searchDomains componentsJoinedByString: @", "]]; - [of_stdout writeFormat: @"[OFDNSResolver] Timeout: %lf\n", + [OFStdOut writeFormat: @"[OFDNSResolver] Timeout: %lf\n", resolver.timeout]; - [of_stdout writeFormat: @"[OFDNSResolver] Max attempts: %u\n", + [OFStdOut writeFormat: @"[OFDNSResolver] Max attempts: %u\n", resolver.maxAttempts]; - [of_stdout writeFormat: + [OFStdOut writeFormat: @"[OFDNSResolver] Min number of dots in absolute name: %u\n", resolver.minNumberOfDotsInAbsoluteName]; - [of_stdout writeFormat: @"[OFDNSResolver] Uses TCP: %u\n", + [OFStdOut writeFormat: @"[OFDNSResolver] Uses TCP: %u\n", resolver.usesTCP]; - [of_stdout writeFormat: + [OFStdOut writeFormat: @"[OFDNSResolver] Config reload interval: %lf\n", resolver.configReloadInterval]; objc_autoreleasePoolPop(pool); } @end Index: tests/OFDataTests.m ================================================================== --- tests/OFDataTests.m +++ tests/OFDataTests.m @@ -27,17 +27,17 @@ { void *pool = objc_autoreleasePoolPush(); OFMutableData *mutable; OFData *immutable; void *raw[2]; - of_range_t range; + OFRange range; TEST(@"+[dataWithItemSize:]", (mutable = [OFMutableData dataWithItemSize: 4096])) - raw[0] = of_alloc(1, 4096); - raw[1] = of_alloc(1, 4096); + raw[0] = OFAllocMemory(1, 4096); + raw[1] = OFAllocMemory(1, 4096); memset(raw[0], 0xFF, 4096); memset(raw[1], 0x42, 4096); TEST(@"-[addItem:]", R([mutable addItem: raw[0]]) && R([mutable addItem: raw[1]])) @@ -61,24 +61,24 @@ (mutable = [[immutable mutableCopy] autorelease]) && [mutable isEqual: immutable]) TEST(@"-[compare]", [mutable compare: immutable] == 0 && R([mutable removeLastItem]) && - [immutable compare: mutable] == OF_ORDERED_DESCENDING && - [mutable compare: immutable] == OF_ORDERED_ASCENDING && + [immutable compare: mutable] == OFOrderedDescending && + [mutable compare: immutable] == OFOrderedAscending && [[OFData dataWithItems: "aa" count: 2] compare: - [OFData dataWithItems: "z" count: 1]] == OF_ORDERED_ASCENDING) + [OFData dataWithItems: "z" count: 1]] == OFOrderedAscending) TEST(@"-[hash]", immutable.hash == 0x634A529F) mutable = [OFMutableData dataWithItems: "abcdef" count: 6]; TEST(@"-[removeLastItem]", R([mutable removeLastItem]) && mutable.count == 5 && memcmp(mutable.items, "abcde", 5) == 0) TEST(@"-[removeItemsInRange:]", - R([mutable removeItemsInRange: of_range(1, 2)]) && + R([mutable removeItemsInRange: OFRangeMake(1, 2)]) && mutable.count == 3 && memcmp(mutable.items, "ade", 3) == 0) TEST(@"-[insertItems:atIndex:count:]", R([mutable insertItems: "bc" atIndex: 1 count: 2]) && mutable.count == 5 && memcmp(mutable.items, "abcde", 5) == 0) @@ -89,51 +89,51 @@ range = [immutable rangeOfData: [OFData dataWithItems: "aa" count: 1 itemSize: 2] options: 0 - range: of_range(0, 7)]; + range: OFRangeMake(0, 7)]; TEST(@"-[rangeOfData:options:range:] #1", range.location == 0 && range.length == 1) range = [immutable rangeOfData: [OFData dataWithItems: "aa" count: 1 itemSize: 2] - options: OF_DATA_SEARCH_BACKWARDS - range: of_range(0, 7)]; + options: OFDataSearchBackwards + range: OFRangeMake(0, 7)]; TEST(@"-[rangeOfData:options:range:] #2", range.location == 5 && range.length == 1) range = [immutable rangeOfData: [OFData dataWithItems: "ac" count: 1 itemSize: 2] options: 0 - range: of_range(0, 7)]; + range: OFRangeMake(0, 7)]; TEST(@"-[rangeOfData:options:range:] #3", range.location == 2 && range.length == 1) range = [immutable rangeOfData: [OFData dataWithItems: "aabb" count: 2 itemSize: 2] - options: 0 - range: of_range(0, 7)]; + options: 0 + range: OFRangeMake(0, 7)]; TEST(@"-[rangeOfData:options:range:] #4", range.location == 5 && range.length == 2) TEST(@"-[rangeOfData:options:range:] #5", R(range = [immutable rangeOfData: [OFData dataWithItems: "aa" count: 1 itemSize: 2] options: 0 - range: of_range(1, 6)]) && + range: OFRangeMake(1, 6)]) && range.location == 5 && range.length == 1) range = [immutable rangeOfData: [OFData dataWithItems: "aa" count: 1 itemSize: 2] - options: OF_DATA_SEARCH_BACKWARDS - range: of_range(0, 5)]; + options: OFDataSearchBackwards + range: OFRangeMake(0, 5)]; TEST(@"-[rangeOfData:options:range:] #6", range.location == 0 && range.length == 1) EXPECT_EXCEPTION( @"-[rangeOfData:options:range:] failing on different itemSize", @@ -140,35 +140,37 @@ OFInvalidArgumentException, [immutable rangeOfData: [OFData dataWithItems: "aaa" count: 1 itemSize: 3] options: 0 - range: of_range(0, 1)]) + range: OFRangeMake(0, 1)]) EXPECT_EXCEPTION( @"-[rangeOfData:options:range:] failing on out of range", OFOutOfRangeException, [immutable rangeOfData: [OFData dataWithItems: "" count: 0 itemSize: 2] options: 0 - range: of_range(8, 1)]) + range: OFRangeMake(8, 1)]) TEST(@"-[subdataWithRange:]", - [[immutable subdataWithRange: of_range(2, 4)] + [[immutable subdataWithRange: OFRangeMake(2, 4)] isEqual: [OFData dataWithItems: "accdacaa" count: 4 itemSize: 2]] && - [[mutable subdataWithRange: of_range(2, 3)] + [[mutable subdataWithRange: OFRangeMake(2, 3)] isEqual: [OFData dataWithItems: "cde" count: 3]]) EXPECT_EXCEPTION(@"-[subdataWithRange:] failing on out of range #1", - OFOutOfRangeException, [immutable subdataWithRange: of_range(7, 1)]) + OFOutOfRangeException, + [immutable subdataWithRange: OFRangeMake(7, 1)]) EXPECT_EXCEPTION(@"-[subdataWithRange:] failing on out of range #2", - OFOutOfRangeException, [mutable subdataWithRange: of_range(6, 1)]) + OFOutOfRangeException, + [mutable subdataWithRange: OFRangeMake(6, 1)]) TEST(@"-[stringByMD5Hashing]", [mutable.stringByMD5Hashing isEqual: @"ab56b4d92b40713acc5af89985d4b786"]) TEST(@"-[stringByRIPEMD160Hashing]", [mutable.stringByRIPEMD160Hashing @@ -212,13 +214,13 @@ EXPECT_EXCEPTION(@"Detect out of range in -[addItems:count:]", OFOutOfRangeException, [mutable addItems: raw[0] count: SIZE_MAX]) EXPECT_EXCEPTION(@"Detect out of range in -[removeItemsInRange:]", OFOutOfRangeException, - [mutable removeItemsInRange: of_range(mutable.count, 1)]) + [mutable removeItemsInRange: OFRangeMake(mutable.count, 1)]) - free(raw[0]); - free(raw[1]); + OFFreeMemory(raw[0]); + OFFreeMemory(raw[1]); objc_autoreleasePoolPop(pool); } @end Index: tests/OFDateTests.m ================================================================== --- tests/OFDateTests.m +++ tests/OFDateTests.m @@ -28,12 +28,12 @@ OFDate *d1, *d2; struct tm tm; int16_t tz; const char *dstr = "Wed, 09 Jun 2021 +0200x"; - TEST(@"of_strptime()", - of_strptime(dstr, "%a, %d %b %Y %z", &tm, &tz) == dstr + 22 && + TEST(@"OFStrPTime()", + OFStrPTime(dstr, "%a, %d %b %Y %z", &tm, &tz) == dstr + 22 && tm.tm_wday == 3 && tm.tm_mday == 9 && tm.tm_mon == 5 && tm.tm_year == 2021 - 1900 && tz == 2 * 60) TEST(@"+[dateWithTimeIntervalSince1970:]", (d1 = [OFDate dateWithTimeIntervalSince1970: 0])) @@ -78,11 +78,11 @@ TEST(@"-[isEqual:]", [d1 isEqual: [OFDate dateWithTimeIntervalSince1970: 0]] && ![d1 isEqual: [OFDate dateWithTimeIntervalSince1970: 0.0000001]]) - TEST(@"-[compare:]", [d1 compare: d2] == OF_ORDERED_ASCENDING) + TEST(@"-[compare:]", [d1 compare: d2] == OFOrderedAscending) TEST(@"-[second]", d1.second == 0 && d2.second == 5) TEST(@"-[microsecond]", d1.microsecond == 0 && d2.microsecond == 2) Index: tests/OFDictionaryTests.m ================================================================== --- tests/OFDictionaryTests.m +++ tests/OFDictionaryTests.m @@ -138,11 +138,11 @@ if (existed) _mutations++; } -- (int)countByEnumeratingWithState: (of_fast_enumeration_state_t *)state +- (int)countByEnumeratingWithState: (OFFastEnumerationState *)state objects: (id *)objects count: (int)count { int ret = [super countByEnumeratingWithState: state objects: objects Index: tests/OFHTTPClientTests.m ================================================================== --- tests/OFHTTPClientTests.m +++ tests/OFHTTPClientTests.m @@ -50,32 +50,32 @@ [cond unlock]; client = [listener accept]; if (![[client readLine] isEqual: @"GET /foo HTTP/1.1"]) - OF_ENSURE(0); + OFEnsure(0); if (![[client readLine] hasPrefix: @"User-Agent:"]) - OF_ENSURE(0); + OFEnsure(0); if (![[client readLine] isEqual: @"Content-Length: 5"]) - OF_ENSURE(0); + OFEnsure(0); if (![[client readLine] isEqual: @"Content-Type: application/x-www-form-urlencoded; charset=UTF-8"]) - OF_ENSURE(0); + OFEnsure(0); if (![[client readLine] isEqual: [OFString stringWithFormat: @"Host: 127.0.0.1:%" @PRIu16, _port]]) - OF_ENSURE(0); + OFEnsure(0); if (![[client readLine] isEqual: @""]) - OF_ENSURE(0); + OFEnsure(0); [client readIntoBuffer: buffer exactLength: 5]; if (memcmp(buffer, "Hello", 5) != 0) - OF_ENSURE(0); + OFEnsure(0); [client writeString: @"HTTP/1.0 200 OK\r\n" @"cONTeNT-lENgTH: 7\r\n" @"\r\n" @"foo\n" @@ -97,11 +97,11 @@ - (void)client: (OFHTTPClient *)client didPerformRequest: (OFHTTPRequest *)request response: (OFHTTPResponse *)response_ exception: (id)exception { - OF_ENSURE(exception == nil); + OFEnsure(exception == nil); response = [response_ retain]; [[OFRunLoop mainRunLoop] stop]; } Index: tests/OFINIFileTests.m ================================================================== --- tests/OFINIFileTests.m +++ tests/OFINIFileTests.m @@ -50,11 +50,11 @@ OFString *writePath; #endif TEST(@"+[fileWithPath:encoding:]", (file = [OFINIFile fileWithPath: @"testfile.ini" - encoding: OF_STRING_ENCODING_CODEPAGE_437])) + encoding: OFStringEncodingCodepage437])) tests = [file categoryForName: @"tests"]; foobar = [file categoryForName: @"foobar"]; types = [file categoryForName: @"types"]; TEST(@"-[categoryForName:]", @@ -119,18 +119,18 @@ [[OFApplication environment] objectForKey: @"HOME"], @"tmp", @"tmpfile.ini", nil]]; # endif TEST(@"-[writeToFile:encoding:]", R([file writeToFile: writePath - encoding: OF_STRING_ENCODING_CODEPAGE_437]) && + encoding: OFStringEncodingCodepage437]) && [[OFString stringWithContentsOfFile: writePath - encoding: OF_STRING_ENCODING_CODEPAGE_437] + encoding: OFStringEncodingCodepage437] isEqual: output]) [[OFFileManager defaultManager] removeItemAtPath: writePath]; #else (void)output; #endif objc_autoreleasePoolPop(pool); } @end Index: tests/OFIPXSocketTests.m ================================================================== --- tests/OFIPXSocketTests.m +++ tests/OFIPXSocketTests.m @@ -24,11 +24,11 @@ @implementation TestsAppDelegate (OFIPXSocketTests) - (void)IPXSocketTests { void *pool = objc_autoreleasePoolPush(); OFIPXSocket *sock; - of_socket_address_t address1, address2; + OFSocketAddress address1, address2; char buffer[5]; TEST(@"+[socket]", (sock = [OFIPXSocket socket])) @try { @@ -35,18 +35,18 @@ TEST(@"-[bindToPort:packetType:]", R(address1 = [sock bindToPort: 0 packetType: 0])) } @catch (OFBindFailedException *e) { switch (e.errNo) { case EAFNOSUPPORT: - [of_stdout setForegroundColor: [OFColor lime]]; - [of_stdout writeLine: + [OFStdOut setForegroundColor: [OFColor lime]]; + [OFStdOut writeLine: @"\r[OFIPXSocket] -[bindToPort:packetType:]: " @"IPX unsupported, skipping tests"]; break; case EADDRNOTAVAIL: - [of_stdout setForegroundColor: [OFColor lime]]; - [of_stdout writeLine: + [OFStdOut setForegroundColor: [OFColor lime]]; + [OFStdOut writeLine: @"\r[OFIPXSocket] -[bindToPort:packetType:]: " @"IPX not configured, skipping tests"]; break; default: @throw e; @@ -60,12 +60,11 @@ R([sock sendBuffer: "Hello" length: 5 receiver: &address1])) TEST(@"-[receiveIntoBuffer:length:sender:]", [sock receiveIntoBuffer: buffer length: 5 sender: &address2] == 5 && memcmp(buffer, "Hello", 5) == 0 && - of_socket_address_equal(&address1, &address2) && - of_socket_address_hash(&address1) == - of_socket_address_hash(&address2)) + OFSocketAddressEqual(&address1, &address2) && + OFSocketAddressHash(&address1) == OFSocketAddressHash(&address2)) objc_autoreleasePoolPop(pool); } @end Index: tests/OFInvocationTests.m ================================================================== --- tests/OFInvocationTests.m +++ tests/OFInvocationTests.m @@ -146,26 +146,26 @@ : (complex float)c13 : (complex double)c14 : (complex float)c15 : (complex double)c16 { - OF_ENSURE(creal(c1) == 1.0 && cimag(c1) == 0.5); - OF_ENSURE(creal(c2) == 2.0 && cimag(c2) == 1.0); - OF_ENSURE(creal(c3) == 3.0 && cimag(c3) == 1.5); - OF_ENSURE(creal(c4) == 4.0 && cimag(c4) == 2.0); - OF_ENSURE(creal(c5) == 5.0 && cimag(c5) == 2.5); - OF_ENSURE(creal(c6) == 6.0 && cimag(c6) == 3.0); - OF_ENSURE(creal(c7) == 7.0 && cimag(c7) == 3.5); - OF_ENSURE(creal(c8) == 8.0 && cimag(c8) == 4.0); - OF_ENSURE(creal(c9) == 9.0 && cimag(c9) == 4.5); - OF_ENSURE(creal(c10) == 10.0 && cimag(c10) == 5.0); - OF_ENSURE(creal(c11) == 11.0 && cimag(c11) == 5.5); - OF_ENSURE(creal(c12) == 12.0 && cimag(c12) == 6.0); - OF_ENSURE(creal(c13) == 13.0 && cimag(c13) == 6.5); - OF_ENSURE(creal(c14) == 14.0 && cimag(c14) == 7.0); - OF_ENSURE(creal(c15) == 15.0 && cimag(c15) == 7.5); - OF_ENSURE(creal(c16) == 16.0 && cimag(c16) == 8.0); + OFEnsure(creal(c1) == 1.0 && cimag(c1) == 0.5); + OFEnsure(creal(c2) == 2.0 && cimag(c2) == 1.0); + OFEnsure(creal(c3) == 3.0 && cimag(c3) == 1.5); + OFEnsure(creal(c4) == 4.0 && cimag(c4) == 2.0); + OFEnsure(creal(c5) == 5.0 && cimag(c5) == 2.5); + OFEnsure(creal(c6) == 6.0 && cimag(c6) == 3.0); + OFEnsure(creal(c7) == 7.0 && cimag(c7) == 3.5); + OFEnsure(creal(c8) == 8.0 && cimag(c8) == 4.0); + OFEnsure(creal(c9) == 9.0 && cimag(c9) == 4.5); + OFEnsure(creal(c10) == 10.0 && cimag(c10) == 5.0); + OFEnsure(creal(c11) == 11.0 && cimag(c11) == 5.5); + OFEnsure(creal(c12) == 12.0 && cimag(c12) == 6.0); + OFEnsure(creal(c13) == 13.0 && cimag(c13) == 6.5); + OFEnsure(creal(c14) == 14.0 && cimag(c14) == 7.0); + OFEnsure(creal(c15) == 15.0 && cimag(c15) == 7.5); + OFEnsure(creal(c16) == 16.0 && cimag(c16) == 8.0); return (c1 + c2 + c3 + c4 + c5 + c6 + c7 + c8 + c9 + c10 + c11 + c12 + c13 + c14 + c15 + c16) / 16; } @@ -184,26 +184,26 @@ : (complex double)c13 : (complex float)c14 : (complex long double)c15 : (complex double)c16 { - OF_ENSURE(creal(c1) == 1.0 && cimag(c1) == 0.5); - OF_ENSURE(creal(c2) == 2.0 && cimag(c2) == 1.0); - OF_ENSURE(creal(c3) == 3.0 && cimag(c3) == 1.5); - OF_ENSURE(creal(c4) == 4.0 && cimag(c4) == 2.0); - OF_ENSURE(creal(c5) == 5.0 && cimag(c5) == 2.5); - OF_ENSURE(creal(c6) == 6.0 && cimag(c6) == 3.0); - OF_ENSURE(creal(c7) == 7.0 && cimag(c7) == 3.5); - OF_ENSURE(creal(c8) == 8.0 && cimag(c8) == 4.0); - OF_ENSURE(creal(c9) == 9.0 && cimag(c9) == 4.5); - OF_ENSURE(creal(c10) == 10.0 && cimag(c10) == 5.0); - OF_ENSURE(creal(c11) == 11.0 && cimag(c11) == 5.5); - OF_ENSURE(creal(c12) == 12.0 && cimag(c12) == 6.0); - OF_ENSURE(creal(c13) == 13.0 && cimag(c13) == 6.5); - OF_ENSURE(creal(c14) == 14.0 && cimag(c14) == 7.0); - OF_ENSURE(creal(c15) == 15.0 && cimag(c15) == 7.5); - OF_ENSURE(creal(c16) == 16.0 && cimag(c16) == 8.0); + OFEnsure(creal(c1) == 1.0 && cimag(c1) == 0.5); + OFEnsure(creal(c2) == 2.0 && cimag(c2) == 1.0); + OFEnsure(creal(c3) == 3.0 && cimag(c3) == 1.5); + OFEnsure(creal(c4) == 4.0 && cimag(c4) == 2.0); + OFEnsure(creal(c5) == 5.0 && cimag(c5) == 2.5); + OFEnsure(creal(c6) == 6.0 && cimag(c6) == 3.0); + OFEnsure(creal(c7) == 7.0 && cimag(c7) == 3.5); + OFEnsure(creal(c8) == 8.0 && cimag(c8) == 4.0); + OFEnsure(creal(c9) == 9.0 && cimag(c9) == 4.5); + OFEnsure(creal(c10) == 10.0 && cimag(c10) == 5.0); + OFEnsure(creal(c11) == 11.0 && cimag(c11) == 5.5); + OFEnsure(creal(c12) == 12.0 && cimag(c12) == 6.0); + OFEnsure(creal(c13) == 13.0 && cimag(c13) == 6.5); + OFEnsure(creal(c14) == 14.0 && cimag(c14) == 7.0); + OFEnsure(creal(c15) == 15.0 && cimag(c15) == 7.5); + OFEnsure(creal(c16) == 16.0 && cimag(c16) == 8.0); return (c1 + c2 + c3 + c4 + c5 + c6 + c7 + c8 + c9 + c10 + c11 + c12 + c13 + c14 + c15 + c16) / 16; } # endif @@ -227,26 +227,26 @@ : (__int128)i15 : (__int128)i16 { __int128 mask = (__int128)0xFFFFFFFFFFFFFFFF << 64; - OF_ENSURE(i1 == 1); - OF_ENSURE(i2 == mask + 2); - OF_ENSURE(i3 == mask + 3); - OF_ENSURE(i4 == mask + 4); - OF_ENSURE(i5 == 5); - OF_ENSURE(i6 == mask + 6); - OF_ENSURE(i7 == mask + 7); - OF_ENSURE(i8 == mask + 8); - OF_ENSURE(i9 == mask + 9); - OF_ENSURE(i10 == mask + 10); - OF_ENSURE(i11 == mask + 11); - OF_ENSURE(i12 == mask + 12); - OF_ENSURE(i13 == mask + 13); - OF_ENSURE(i14 == mask + 14); - OF_ENSURE(i15 == mask + 15); - OF_ENSURE(i16 == mask + 16); + OFEnsure(i1 == 1); + OFEnsure(i2 == mask + 2); + OFEnsure(i3 == mask + 3); + OFEnsure(i4 == mask + 4); + OFEnsure(i5 == 5); + OFEnsure(i6 == mask + 6); + OFEnsure(i7 == mask + 7); + OFEnsure(i8 == mask + 8); + OFEnsure(i9 == mask + 9); + OFEnsure(i10 == mask + 10); + OFEnsure(i11 == mask + 11); + OFEnsure(i12 == mask + 12); + OFEnsure(i13 == mask + 13); + OFEnsure(i14 == mask + 14); + OFEnsure(i15 == mask + 15); + OFEnsure(i16 == mask + 16); return ((i1 + (int)i2 + (int)i3 + (int)i4 + i5 + (int)i6 + (int)i7 + (int)i8 + (int)i9 + (int)i10 + (int)i11 + (int)i12 + (int)i13 + (int)i14 + (int)i15 + (int)i16) / 16) + mask; } Index: tests/OFJSONTests.m ================================================================== --- tests/OFJSONTests.m +++ tests/OFJSONTests.m @@ -39,17 +39,17 @@ TEST(@"-[objectByParsingJSON] #1", [s.objectByParsingJSON isEqual: d]) TEST(@"-[JSONRepresentation]", [[d JSONRepresentation] isEqual: @"{\"x\":[0.5,15,null,\"foo\",false],\"foo\":\"b\\na\\r\"}"]) - TEST(@"OF_JSON_REPRESENTATION_PRETTY", - [[d JSONRepresentationWithOptions: OF_JSON_REPRESENTATION_PRETTY] + TEST(@"OFJSONRepresentationOptionPretty", + [[d JSONRepresentationWithOptions: OFJSONRepresentationOptionPretty] isEqual: @"{\n\t\"x\": [\n\t\t0.5,\n\t\t15,\n\t\tnull,\n\t\t" @"\"foo\",\n\t\tfalse\n\t],\n\t\"foo\": \"b\\na\\r\"\n}"]) - TEST(@"OF_JSON_REPRESENTATION_JSON5", - [[d JSONRepresentationWithOptions: OF_JSON_REPRESENTATION_JSON5] + TEST(@"OFJSONRepresentationOptionJSON5", + [[d JSONRepresentationWithOptions: OFJSONRepresentationOptionJSON5] isEqual: @"{x:[0.5,15,null,\"foo\",false],foo:\"b\\\na\\r\"}"]) EXPECT_EXCEPTION(@"-[objectByParsingJSON] #2", OFInvalidJSONException, [@"{" objectByParsingJSON]) EXPECT_EXCEPTION(@"-[objectByParsingJSON] #3", OFInvalidJSONException, Index: tests/OFKernelEventObserverTests.m ================================================================== --- tests/OFKernelEventObserverTests.m +++ tests/OFKernelEventObserverTests.m @@ -180,11 +180,11 @@ _fails++; } break; default: - OF_ENSURE(0); + OFEnsure(0); } } @end @implementation TestsAppDelegate (OFKernelEventObserverTests) Index: tests/OFListTests.m ================================================================== --- tests/OFListTests.m +++ tests/OFListTests.m @@ -28,47 +28,49 @@ - (void)listTests { void *pool = objc_autoreleasePoolPush(); OFList *list; OFEnumerator *enumerator; - of_list_object_t *loe; + OFListItem iter; OFString *obj; size_t i; bool ok; TEST(@"+[list]", (list = [OFList list])) TEST(@"-[appendObject:]", [list appendObject: strings[0]] && [list appendObject: strings[1]] && [list appendObject: strings[2]]) - TEST(@"-[firstListObject]", - [list.firstListObject->object isEqual: strings[0]]) - - TEST(@"-[firstListObject]->next", - [list.firstListObject->next->object isEqual: strings[1]]) - - TEST(@"-[lastListObject]", - [list.lastListObject->object isEqual: strings[2]]) - - TEST(@"-[lastListObject]->previous", - [list.lastListObject->previous->object isEqual: strings[1]]) - - TEST(@"-[removeListObject:]", - R([list removeListObject: list.lastListObject]) && - [list.lastListObject->object isEqual: strings[1]] && - R([list removeListObject: list.firstListObject]) && - [list.firstListObject->object isEqual: list.lastListObject->object]) - - TEST(@"-[insertObject:beforeListObject:]", - [list insertObject: strings[0] - beforeListObject: list.lastListObject] && - [list.lastListObject->previous->object isEqual: strings[0]]) - - TEST(@"-[insertObject:afterListObject:]", + TEST(@"-[firstListItem]", + [OFListItemObject(list.firstListItem) isEqual: strings[0]]) + + TEST(@"OFListItemNext()", + [OFListItemObject(OFListItemNext(list.firstListItem)) + isEqual: strings[1]]) + + TEST(@"-[lastListItem]", + [OFListItemObject(list.lastListItem) isEqual: strings[2]]) + + TEST(@"OFListItemPrevious()", + [OFListItemObject(OFListItemPrevious(list.lastListItem)) + isEqual: strings[1]]) + + TEST(@"-[removeListItem:]", + R([list removeListItem: list.lastListItem]) && + [list.lastObject isEqual: strings[1]] && + R([list removeListItem: list.firstListItem]) && + [list.firstObject isEqual: list.lastObject]) + + TEST(@"-[insertObject:beforeListItem:]", + [list insertObject: strings[0] beforeListItem: list.lastListItem] && + [OFListItemObject(OFListItemPrevious(list.lastListItem)) + isEqual: strings[0]]) + + TEST(@"-[insertObject:afterListItem:]", [list insertObject: strings[2] - afterListObject: list.firstListObject->next] && - [list.lastListObject->object isEqual: strings[2]]) + afterListItem: OFListItemNext(list.firstListItem)] && + [list.lastObject isEqual: strings[2]]) TEST(@"-[count]", list.count == 3) TEST(@"-[containsObject:]", [list containsObject: strings[1]] && @@ -78,53 +80,54 @@ [list containsObjectIdenticalTo: strings[1]] && ![list containsObjectIdenticalTo: [OFString stringWithString: strings[1]]]) TEST(@"-[copy]", (list = [[list copy] autorelease]) && - [list.firstListObject->object isEqual: strings[0]] && - [list.firstListObject->next->object isEqual: strings[1]] && - [list.lastListObject->object isEqual: strings[2]]) + [list.firstObject isEqual: strings[0]] && + [OFListItemObject(OFListItemNext(list.firstListItem)) + isEqual: strings[1]] && + [list.lastObject isEqual: strings[2]]) TEST(@"-[isEqual:]", [list isEqual: [[list copy] autorelease]]) TEST(@"-[description]", [list.description isEqual: @"[\n\tFoo,\n\tBar,\n\tBaz\n]"]) TEST(@"-[objectEnumerator]", (enumerator = [list objectEnumerator])) - loe = list.firstListObject; + iter = list.firstListItem; i = 0; ok = true; while ((obj = [enumerator nextObject]) != nil) { - if (![obj isEqual: loe->object]) + if (![obj isEqual: OFListItemObject(iter)]) ok = false; - loe = loe->next; + iter = OFListItemNext(iter); i++; } if (list.count != i) ok = false; TEST(@"OFEnumerator's -[nextObject]", ok); - [list removeListObject: list.firstListObject]; + [list removeListItem: list.firstListItem]; EXPECT_EXCEPTION(@"Detection of mutation during enumeration", OFEnumerationMutationException, [enumerator nextObject]) [list prependObject: strings[0]]; - loe = list.firstListObject; + iter = list.firstListItem; i = 0; ok = true; for (OFString *object in list) { - if (![object isEqual: loe->object]) + if (![object isEqual: OFListItemObject(iter)]) ok = false; - loe = loe->next; + iter = OFListItemNext(iter); i++; } if (list.count != i) ok = false; @@ -134,11 +137,11 @@ ok = false; @try { for (OFString *object in list) { (void)object; - [list removeListObject: list.lastListObject]; + [list removeListItem: list.lastListItem]; } } @catch (OFEnumerationMutationException *e) { ok = true; } Index: tests/OFLocaleTests.m ================================================================== --- tests/OFLocaleTests.m +++ tests/OFLocaleTests.m @@ -20,22 +20,22 @@ @implementation TestsAppDelegate (OFLocaleTests) - (void)localeTests { void *pool = objc_autoreleasePoolPush(); - [of_stdout setForegroundColor: [OFColor lime]]; + [OFStdOut setForegroundColor: [OFColor lime]]; - [of_stdout writeFormat: @"[OFLocale] Language: %@\n", + [OFStdOut writeFormat: @"[OFLocale] Language: %@\n", [OFLocale language]]; - [of_stdout writeFormat: @"[OFLocale] Territory: %@\n", + [OFStdOut writeFormat: @"[OFLocale] Territory: %@\n", [OFLocale territory]]; - [of_stdout writeFormat: @"[OFLocale] Encoding: %@\n", - of_string_name_of_encoding([OFLocale encoding])]; + [OFStdOut writeFormat: @"[OFLocale] Encoding: %@\n", + OFStringEncodingName([OFLocale encoding])]; - [of_stdout writeFormat: @"[OFLocale] Decimal point: %@\n", + [OFStdOut writeFormat: @"[OFLocale] Decimal point: %@\n", [OFLocale decimalPoint]]; objc_autoreleasePoolPop(pool); } @end Index: tests/OFMethodSignatureTests.m ================================================================== --- tests/OFMethodSignatureTests.m +++ tests/OFMethodSignatureTests.m @@ -116,62 +116,62 @@ EXPECT_EXCEPTION(@"-[signatureWithObjCTypes:] #6", OFInvalidFormatException, [OFMethodSignature signatureWithObjCTypes: "{{}0"]) - TEST(@"of_sizeof_type_encoding() #1", - of_sizeof_type_encoding(@encode(struct test1_struct)) == + TEST(@"OFSizeOfTypeEncoding() #1", + OFSizeOfTypeEncoding(@encode(struct test1_struct)) == sizeof(struct test1_struct)) - TEST(@"of_sizeof_type_encoding() #2", - of_sizeof_type_encoding(@encode(struct test2_struct)) == + TEST(@"OFSizeOfTypeEncoding() #2", + OFSizeOfTypeEncoding(@encode(struct test2_struct)) == sizeof(struct test2_struct)) #if !defined(__STDC_NO_COMPLEX__) && defined(HAVE_COMPLEX_H) && \ OF_GCC_VERSION >= 402 - TEST(@"of_sizeof_type_encoding() #3", - of_sizeof_type_encoding(@encode(struct test3_struct)) == + TEST(@"OFSizeOfTypeEncoding() #3", + OFSizeOfTypeEncoding(@encode(struct test3_struct)) == sizeof(struct test3_struct)) #endif - TEST(@"of_sizeof_type_encoding() #4", - of_sizeof_type_encoding(@encode(union test3_union)) == + TEST(@"OFSizeOfTypeEncoding() #4", + OFSizeOfTypeEncoding(@encode(union test3_union)) == sizeof(union test3_union)) - TEST(@"of_sizeof_type_encoding() #5", - of_sizeof_type_encoding(@encode(union test4_union)) == + TEST(@"OFSizeOfTypeEncoding() #5", + OFSizeOfTypeEncoding(@encode(union test4_union)) == sizeof(union test4_union)) - TEST(@"of_sizeof_type_encoding() #6", - of_sizeof_type_encoding(@encode(struct test1_struct [5])) == + TEST(@"OFSizeOfTypeEncoding() #6", + OFSizeOfTypeEncoding(@encode(struct test1_struct [5])) == sizeof(struct test1_struct [5])) - TEST(@"of_alignof_type_encoding() #1", - of_alignof_type_encoding(@encode(struct test1_struct)) == + TEST(@"OFAlignmentOfTypeEncoding() #1", + OFAlignmentOfTypeEncoding(@encode(struct test1_struct)) == OF_ALIGNOF(struct test1_struct)) - TEST(@"of_alignof_type_encoding() #2", - of_alignof_type_encoding(@encode(struct test2_struct)) == + TEST(@"OFAlignmentOfTypeEncoding() #2", + OFAlignmentOfTypeEncoding(@encode(struct test2_struct)) == OF_ALIGNOF(struct test2_struct)) #if !defined(__STDC_NO_COMPLEX__) && defined(HAVE_COMPLEX_H) && \ OF_GCC_VERSION >= 402 - TEST(@"of_alignof_type_encoding() #3", - of_alignof_type_encoding(@encode(struct test3_struct)) == + TEST(@"OFAlignmentOfTypeEncoding() #3", + OFAlignmentOfTypeEncoding(@encode(struct test3_struct)) == OF_ALIGNOF(struct test3_struct)) #endif - TEST(@"of_alignof_type_encoding() #4", - of_alignof_type_encoding(@encode(union test3_union)) == + TEST(@"OFAlignmentOfTypeEncoding() #4", + OFAlignmentOfTypeEncoding(@encode(union test3_union)) == OF_ALIGNOF(union test3_union)) - TEST(@"of_alignof_type_encoding() #5", - of_alignof_type_encoding(@encode(union test4_union)) == + TEST(@"OFAlignmentOfTypeEncoding() #5", + OFAlignmentOfTypeEncoding(@encode(union test4_union)) == OF_ALIGNOF(union test4_union)) - TEST(@"of_alignof_type_encoding() #6", - of_alignof_type_encoding(@encode(struct test1_struct [5])) == + TEST(@"OFAlignmentOfTypeEncoding() #6", + OFAlignmentOfTypeEncoding(@encode(struct test1_struct [5])) == OF_ALIGNOF(struct test1_struct [5])) objc_autoreleasePoolPop(pool); } @end Index: tests/OFSPXSocketTests.m ================================================================== --- tests/OFSPXSocketTests.m +++ tests/OFSPXSocketTests.m @@ -37,11 +37,11 @@ @implementation SPXSocketDelegate - (bool)socket: (OFSequencedPacketSocket *)sock didAcceptSocket: (OFSequencedPacketSocket *)accepted exception: (id)exception { - OF_ENSURE(!_accepted); + OFEnsure(!_accepted); _accepted = (sock == _expectedServerSocket && accepted != nil && exception == nil); if (_accepted && _connected) @@ -54,11 +54,11 @@ didConnectToNode: (unsigned char [IPX_NODE_LEN])node network: (uint32_t)network port: (uint16_t)port exception: (id)exception { - OF_ENSURE(!_connected); + OFEnsure(!_connected); _connected = (sock == _expectedClientSocket && memcmp(node, _expectedNode, IPX_NODE_LEN) == 0 && network == _expectedNetwork && port == _expectedPort && exception == nil); @@ -71,12 +71,12 @@ @implementation TestsAppDelegate (OFSPXSocketTests) - (void)SPXSocketTests { void *pool = objc_autoreleasePoolPush(); OFSPXSocket *sockClient, *sockServer, *sockAccepted;; - of_socket_address_t address1; - const of_socket_address_t *address2; + OFSocketAddress address1; + const OFSocketAddress *address2; unsigned char node[IPX_NODE_LEN], node2[IPX_NODE_LEN]; uint32_t network; uint16_t port; char buffer[5]; SPXSocketDelegate *delegate; @@ -88,24 +88,24 @@ TEST(@"-[bindToPort:]", R(address1 = [sockServer bindToPort: 0])) } @catch (OFBindFailedException *e) { switch (e.errNo) { case EAFNOSUPPORT: - [of_stdout setForegroundColor: [OFColor lime]]; - [of_stdout writeLine: + [OFStdOut setForegroundColor: [OFColor lime]]; + [OFStdOut writeLine: @"\r[OFSPXSocket] -[bindToPort:]: " @"IPX unsupported, skipping tests"]; break; case ESOCKTNOSUPPORT: - [of_stdout setForegroundColor: [OFColor lime]]; - [of_stdout writeLine: + [OFStdOut setForegroundColor: [OFColor lime]]; + [OFStdOut writeLine: @"\r[OFSPXSocket] -[bindToPort:]: " @"SPX unsupported, skipping tests"]; break; case EADDRNOTAVAIL: - [of_stdout setForegroundColor: [OFColor lime]]; - [of_stdout writeLine: + [OFStdOut setForegroundColor: [OFColor lime]]; + [OFStdOut writeLine: @"\r[OFSPXSocket] -[bindToPort:]: " @"IPX not configured, skipping tests"]; break; default: @throw e; @@ -113,13 +113,13 @@ objc_autoreleasePoolPop(pool); return; } - of_socket_address_get_ipx_node(&address1, node); - network = of_socket_address_get_ipx_network(&address1); - port = of_socket_address_get_port(&address1); + OFSocketAddressIPXNode(&address1, node); + network = OFSocketAddressIPXNetwork(&address1); + port = OFSocketAddressPort(&address1); TEST(@"-[listen]", R([sockServer listen])) TEST(@"-[connectToNode:network:port:]", R([sockClient connectToNode: node network: network port: port])) @@ -133,13 +133,13 @@ [sockClient receiveIntoBuffer: buffer length: 5] == 5 && memcmp(buffer, "Hello", 5) == 0) TEST(@"-[remoteAddress]", (address2 = sockAccepted.remoteAddress) && - R(of_socket_address_get_ipx_node(address2, node2)) && + R(OFSocketAddressIPXNode(address2, node2)) && memcmp(node, node2, IPX_NODE_LEN) == 0 && - of_socket_address_get_ipx_network(address2) == network) + OFSocketAddressIPXNetwork(address2) == network) delegate = [[[SPXSocketDelegate alloc] init] autorelease]; sockServer = [OFSPXSocket socket]; delegate->_expectedServerSocket = sockServer; @@ -151,15 +151,15 @@ address1 = [sockServer bindToPort: 0]; [sockServer listen]; [sockServer asyncAccept]; - of_socket_address_get_ipx_node(&address1, node); + OFSocketAddressIPXNode(&address1, node); memcpy(delegate->_expectedNode, node, IPX_NODE_LEN); delegate->_expectedNetwork = network = - of_socket_address_get_ipx_network(&address1); - delegate->_expectedPort = port = of_socket_address_get_port(&address1); + OFSocketAddressIPXNetwork(&address1); + delegate->_expectedPort = port = OFSocketAddressPort(&address1); @try { [sockClient asyncConnectToNode: node network: network port: port]; @@ -170,12 +170,12 @@ TEST(@"-[asyncAccept] & -[asyncConnectToNode:network:port:]", delegate->_accepted && delegate->_connected) } @catch (OFObserveFailedException *e) { switch (e.errNo) { case ENOTSOCK: - [of_stdout setForegroundColor: [OFColor lime]]; - [of_stdout writeLine: + [OFStdOut setForegroundColor: [OFColor lime]]; + [OFStdOut writeLine: @"\r[OFSPXSocket] -[asyncAccept] & " @"-[asyncConnectToNode:network:port:]: select() " @"not supported for SPX, skipping test"]; break; default: Index: tests/OFSPXStreamSocketTests.m ================================================================== --- tests/OFSPXStreamSocketTests.m +++ tests/OFSPXStreamSocketTests.m @@ -37,11 +37,11 @@ @implementation SPXStreamSocketDelegate - (bool)socket: (OFStreamSocket *)sock didAcceptSocket: (OFStreamSocket *)accepted exception: (id)exception { - OF_ENSURE(!_accepted); + OFEnsure(!_accepted); _accepted = (sock == _expectedServerSocket && accepted != nil && exception == nil); if (_accepted && _connected) @@ -54,11 +54,11 @@ didConnectToNode: (unsigned char [IPX_NODE_LEN])node network: (uint32_t)network port: (uint16_t)port exception: (id)exception { - OF_ENSURE(!_connected); + OFEnsure(!_connected); _connected = (sock == _expectedClientSocket && memcmp(node, _expectedNode, IPX_NODE_LEN) == 0 && network == _expectedNetwork && port == _expectedPort && exception == nil); @@ -71,12 +71,12 @@ @implementation TestsAppDelegate (OFSPXStreamSocketTests) - (void)SPXStreamSocketTests { void *pool = objc_autoreleasePoolPush(); OFSPXStreamSocket *sockClient, *sockServer, *sockAccepted;; - of_socket_address_t address1; - const of_socket_address_t *address2; + OFSocketAddress address1; + const OFSocketAddress *address2; unsigned char node[IPX_NODE_LEN], node2[IPX_NODE_LEN]; uint32_t network; uint16_t port; char buffer[5]; SPXStreamSocketDelegate *delegate; @@ -88,24 +88,24 @@ TEST(@"-[bindToPort:]", R(address1 = [sockServer bindToPort: 0])) } @catch (OFBindFailedException *e) { switch (e.errNo) { case EAFNOSUPPORT: - [of_stdout setForegroundColor: [OFColor lime]]; - [of_stdout writeLine: + [OFStdOut setForegroundColor: [OFColor lime]]; + [OFStdOut writeLine: @"\r[OFSPXStreamSocket] -[bindToPort:]: " @"IPX unsupported, skipping tests"]; break; case ESOCKTNOSUPPORT: - [of_stdout setForegroundColor: [OFColor lime]]; - [of_stdout writeLine: + [OFStdOut setForegroundColor: [OFColor lime]]; + [OFStdOut writeLine: @"\r[OFSPXStreamSocket] -[bindToPort:]: " @"SPX unsupported, skipping tests"]; break; case EADDRNOTAVAIL: - [of_stdout setForegroundColor: [OFColor lime]]; - [of_stdout writeLine: + [OFStdOut setForegroundColor: [OFColor lime]]; + [OFStdOut writeLine: @"\r[OFSPXStreamSocket] -[bindToPort:]: " @"IPX not configured, skipping tests"]; break; default: @throw e; @@ -113,13 +113,13 @@ objc_autoreleasePoolPop(pool); return; } - of_socket_address_get_ipx_node(&address1, node); - network = of_socket_address_get_ipx_network(&address1); - port = of_socket_address_get_port(&address1); + OFSocketAddressIPXNode(&address1, node); + network = OFSocketAddressIPXNetwork(&address1); + port = OFSocketAddressPort(&address1); TEST(@"-[listen]", R([sockServer listen])) TEST(@"-[connectToNode:network:port:]", R([sockClient connectToNode: node network: network port: port])) @@ -136,13 +136,13 @@ [sockClient readIntoBuffer: buffer length: 3] == 3 && memcmp(buffer, "llo", 3) == 0) TEST(@"-[remoteAddress]", (address2 = sockAccepted.remoteAddress) && - R(of_socket_address_get_ipx_node(address2, node2)) && + R(OFSocketAddressIPXNode(address2, node2)) && memcmp(node, node2, IPX_NODE_LEN) == 0 && - of_socket_address_get_ipx_network(address2) == network) + OFSocketAddressIPXNetwork(address2) == network) delegate = [[[SPXStreamSocketDelegate alloc] init] autorelease]; sockServer = [OFSPXStreamSocket socket]; delegate->_expectedServerSocket = sockServer; @@ -154,15 +154,15 @@ address1 = [sockServer bindToPort: 0]; [sockServer listen]; [sockServer asyncAccept]; - of_socket_address_get_ipx_node(&address1, node); + OFSocketAddressIPXNode(&address1, node); memcpy(delegate->_expectedNode, node, IPX_NODE_LEN); delegate->_expectedNetwork = network = - of_socket_address_get_ipx_network(&address1); - delegate->_expectedPort = port = of_socket_address_get_port(&address1); + OFSocketAddressIPXNetwork(&address1); + delegate->_expectedPort = port = OFSocketAddressPort(&address1); @try { [sockClient asyncConnectToNode: node network: network port: port]; @@ -173,12 +173,12 @@ TEST(@"-[asyncAccept] & -[asyncConnectToNode:network:port:]", delegate->_accepted && delegate->_connected) } @catch (OFObserveFailedException *e) { switch (e.errNo) { case ENOTSOCK: - [of_stdout setForegroundColor: [OFColor lime]]; - [of_stdout writeLine: + [OFStdOut setForegroundColor: [OFColor lime]]; + [OFStdOut writeLine: @"\r[OFSPXStreamSocket] -[asyncAccept] & " @"-[asyncConnectToNode:network:port:]: select() " @"not supported for SPX, skipping test"]; break; default: Index: tests/OFSetTests.m ================================================================== --- tests/OFSetTests.m +++ tests/OFSetTests.m @@ -142,11 +142,11 @@ if (existed) _mutations++; } -- (int)countByEnumeratingWithState: (of_fast_enumeration_state_t *)state +- (int)countByEnumeratingWithState: (OFFastEnumerationState *)state objects: (id *)objects count: (int)count { int ret = [_set countByEnumeratingWithState: state objects: objects Index: tests/OFStreamTests.m ================================================================== --- tests/OFStreamTests.m +++ tests/OFStreamTests.m @@ -66,18 +66,18 @@ size_t pageSize = [OFSystemInfo pageSize]; StreamTester *t = [[[StreamTester alloc] init] autorelease]; OFString *str; char *cstr; - cstr = of_alloc(pageSize - 2, 1); + cstr = OFAllocMemory(pageSize - 2, 1); memset(cstr, 'X', pageSize - 3); cstr[pageSize - 3] = '\0'; TEST(@"-[readLine]", [[t readLine] isEqual: @"foo"] && [(str = [t readLine]) length] == pageSize - 3 && !strcmp(str.UTF8String, cstr)) - free(cstr); + OFFreeMemory(cstr); objc_autoreleasePoolPop(pool); } @end Index: tests/OFStringTests.m ================================================================== --- tests/OFStringTests.m +++ tests/OFStringTests.m @@ -32,14 +32,14 @@ static OFString *module = nil; static OFString *whitespace[] = { @" \r \t\n\t \tasd \t \t\t\r\n", @" \t\t \t\t \t \t" }; -static of_unichar_t ucstr[] = { +static OFUnichar ucstr[] = { 0xFEFF, 'f', 0xF6, 0xF6, 'b', 0xE4, 'r', 0x1F03A, 0 }; -static of_unichar_t sucstr[] = { +static OFUnichar sucstr[] = { 0xFFFE0000, 0x66000000, 0xF6000000, 0xF6000000, 0x62000000, 0xE4000000, 0x72000000, 0x3AF00100, 0 }; static uint16_t utf16str[] = { 0xFEFF, 'f', 0xF6, 0xF6, 'b', 0xE4, 'r', 0xD83C, 0xDC3A, 0 @@ -89,11 +89,11 @@ return self; } - (instancetype)initWithCString: (const char *)cString - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding length: (size_t)length { self = [super init]; @try { @@ -106,13 +106,13 @@ } return self; } -- (instancetype)initWithUTF16String: (const of_char16_t *)UTF16String +- (instancetype)initWithUTF16String: (const OFChar16 *)UTF16String length: (size_t)length - byteOrder: (of_byte_order_t)byteOrder + byteOrder: (OFByteOrder)byteOrder { self = [super init]; @try { _string = [[OFMutableString alloc] @@ -125,13 +125,13 @@ } return self; } -- (instancetype)initWithUTF32String: (const of_char32_t *)UTF32String +- (instancetype)initWithUTF32String: (const OFChar32 *)UTF32String length: (size_t)length - byteOrder: (of_byte_order_t)byteOrder + byteOrder: (OFByteOrder)byteOrder { self = [super init]; @try { _string = [[OFMutableString alloc] @@ -167,11 +167,11 @@ [_string release]; [super dealloc]; } -- (of_unichar_t)characterAtIndex: (size_t)idx +- (OFUnichar)characterAtIndex: (size_t)idx { return [_string characterAtIndex: idx]; } - (size_t)length @@ -185,11 +185,11 @@ { if (self == [SimpleMutableString class]) [self inheritMethodsFromClass: [SimpleString class]]; } -- (void)replaceCharactersInRange: (of_range_t)range +- (void)replaceCharactersInRange: (OFRange)range withString: (OFString *)string { [_string replaceCharactersInRange: range withString: string]; } @end @@ -215,11 +215,11 @@ void *pool = objc_autoreleasePoolPush(); OFMutableString *s[3]; OFString *is; OFArray *a; size_t i; - const of_unichar_t *ua; + const OFUnichar *ua; const uint16_t *u16a; OFCharacterSet *cs; EntityHandler *h; #ifdef OF_HAVE_BLOCKS __block int j; @@ -233,34 +233,34 @@ s[2] = [[s[0] copy] autorelease]; TEST(@"-[isEqual:]", [s[0] isEqual: s[2]] && ![s[0] isEqual: [[[OFObject alloc] init] autorelease]]) - TEST(@"-[compare:]", [s[0] compare: s[2]] == OF_ORDERED_SAME && - [s[0] compare: @""] != OF_ORDERED_SAME && - [C(@"") compare: @"a"] == OF_ORDERED_ASCENDING && - [C(@"a") compare: @"b"] == OF_ORDERED_ASCENDING && - [C(@"cd") compare: @"bc"] == OF_ORDERED_DESCENDING && - [C(@"ä") compare: @"ö"] == OF_ORDERED_ASCENDING && - [C(@"€") compare: @"ß"] == OF_ORDERED_DESCENDING && - [C(@"aa") compare: @"z"] == OF_ORDERED_ASCENDING) + TEST(@"-[compare:]", [s[0] compare: s[2]] == OFOrderedSame && + [s[0] compare: @""] != OFOrderedSame && + [C(@"") compare: @"a"] == OFOrderedAscending && + [C(@"a") compare: @"b"] == OFOrderedAscending && + [C(@"cd") compare: @"bc"] == OFOrderedDescending && + [C(@"ä") compare: @"ö"] == OFOrderedAscending && + [C(@"€") compare: @"ß"] == OFOrderedDescending && + [C(@"aa") compare: @"z"] == OFOrderedAscending) #ifdef OF_HAVE_UNICODE_TABLES TEST(@"-[caseInsensitiveCompare:]", - [C(@"a") caseInsensitiveCompare: @"A"] == OF_ORDERED_SAME && - [C(@"Ä") caseInsensitiveCompare: @"ä"] == OF_ORDERED_SAME && - [C(@"я") caseInsensitiveCompare: @"Я"] == OF_ORDERED_SAME && - [C(@"€") caseInsensitiveCompare: @"ß"] == OF_ORDERED_DESCENDING && - [C(@"ß") caseInsensitiveCompare: @"→"] == OF_ORDERED_ASCENDING && - [C(@"AA") caseInsensitiveCompare: @"z"] == OF_ORDERED_ASCENDING && + [C(@"a") caseInsensitiveCompare: @"A"] == OFOrderedSame && + [C(@"Ä") caseInsensitiveCompare: @"ä"] == OFOrderedSame && + [C(@"я") caseInsensitiveCompare: @"Я"] == OFOrderedSame && + [C(@"€") caseInsensitiveCompare: @"ß"] == OFOrderedDescending && + [C(@"ß") caseInsensitiveCompare: @"→"] == OFOrderedAscending && + [C(@"AA") caseInsensitiveCompare: @"z"] == OFOrderedAscending && [[stringClass stringWithUTF8String: "ABC"] caseInsensitiveCompare: [stringClass stringWithUTF8String: "AbD"]] == [C(@"abc") compare: @"abd"]) #else TEST(@"-[caseInsensitiveCompare:]", - [C(@"a") caseInsensitiveCompare: @"A"] == OF_ORDERED_SAME && - [C(@"AA") caseInsensitiveCompare: @"z"] == OF_ORDERED_ASCENDING && + [C(@"a") caseInsensitiveCompare: @"A"] == OFOrderedSame && + [C(@"AA") caseInsensitiveCompare: @"z"] == OFOrderedAscending && [[stringClass stringWithUTF8String: "ABC"] caseInsensitiveCompare: [stringClass stringWithUTF8String: "AbD"]] == [C(@"abc") compare: @"abd"]) #endif @@ -348,16 +348,16 @@ [is isEqual: @"fööbär🀺"]) #ifdef OF_HAVE_FILES TEST(@"+[stringWithContentsOfFile:encoding]", (is = [stringClass stringWithContentsOfFile: @"testfile.txt" - encoding: OF_STRING_ENCODING_ISO_8859_1]) && + encoding: OFStringEncodingISO8859_1]) && [is isEqual: @"testäöü"]) TEST(@"+[stringWithContentsOfURL:encoding]", (is = [stringClass stringWithContentsOfURL: [OFURL fileURLWithPath: @"testfile.txt"] - encoding: OF_STRING_ENCODING_ISO_8859_1]) && + encoding: OFStringEncodingISO8859_1]) && [is isEqual: @"testäöü"]) #endif TEST(@"-[appendUTFString:length:]", R([s[0] appendUTF8String: "\xEF\xBB\xBF" "barqux" length: 6]) && @@ -370,110 +370,110 @@ OFInvalidEncodingException, [stringClass stringWithUTF8String: "\xF0\x80\x80\xC0"]) TEST(@"Conversion of ISO 8859-1 to Unicode", [[stringClass stringWithCString: "\xE4\xF6\xFC" - encoding: OF_STRING_ENCODING_ISO_8859_1] + encoding: OFStringEncodingISO8859_1] isEqual: @"äöü"]) #ifdef HAVE_ISO_8859_15 TEST(@"Conversion of ISO 8859-15 to Unicode", [[stringClass stringWithCString: "\xA4\xA6\xA8\xB4\xB8\xBC\xBD\xBE" - encoding: OF_STRING_ENCODING_ISO_8859_15] + encoding: OFStringEncodingISO8859_15] isEqual: @"€ŠšŽžŒœŸ"]) #endif #ifdef HAVE_WINDOWS_1252 TEST(@"Conversion of Windows 1252 to Unicode", [[stringClass stringWithCString: "\x80\x82\x83\x84\x85\x86\x87\x88" "\x89\x8A\x8B\x8C\x8E\x91\x92\x93" "\x94\x95\x96\x97\x98\x99\x9A\x9B" "\x9C\x9E\x9F" - encoding: OF_STRING_ENCODING_WINDOWS_1252] + encoding: OFStringEncodingWindows1252] isEqual: @"€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ"]) #endif #ifdef HAVE_CODEPAGE_437 TEST(@"Conversion of Codepage 437 to Unicode", [[stringClass stringWithCString: "\xB0\xB1\xB2\xDB" - encoding: OF_STRING_ENCODING_CODEPAGE_437] + encoding: OFStringEncodingCodepage437] isEqual: @"░▒▓█"]) #endif TEST(@"Conversion of Unicode to ASCII #1", !strcmp([C(@"This is a test") cStringWithEncoding: - OF_STRING_ENCODING_ASCII], "This is a test")) + OFStringEncodingASCII], "This is a test")) EXPECT_EXCEPTION(@"Conversion of Unicode to ASCII #2", OFInvalidEncodingException, [C(@"This is a tést") - cStringWithEncoding: OF_STRING_ENCODING_ASCII]) + cStringWithEncoding: OFStringEncodingASCII]) TEST(@"Conversion of Unicode to ISO-8859-1 #1", !strcmp([C(@"This is ä test") cStringWithEncoding: - OF_STRING_ENCODING_ISO_8859_1], "This is \xE4 test")) + OFStringEncodingISO8859_1], "This is \xE4 test")) EXPECT_EXCEPTION(@"Conversion of Unicode to ISO-8859-1 #2", OFInvalidEncodingException, [C(@"This is ä t€st") cStringWithEncoding: - OF_STRING_ENCODING_ISO_8859_1]) + OFStringEncodingISO8859_1]) #ifdef HAVE_ISO_8859_15 TEST(@"Conversion of Unicode to ISO-8859-15 #1", !strcmp([C(@"This is ä t€st") cStringWithEncoding: - OF_STRING_ENCODING_ISO_8859_15], "This is \xE4 t\xA4st")) + OFStringEncodingISO8859_15], "This is \xE4 t\xA4st")) EXPECT_EXCEPTION(@"Conversion of Unicode to ISO-8859-15 #2", OFInvalidEncodingException, [C(@"This is ä t€st…") cStringWithEncoding: - OF_STRING_ENCODING_ISO_8859_15]) + OFStringEncodingISO8859_15]) #endif #ifdef HAVE_WINDOWS_1252 TEST(@"Conversion of Unicode to Windows-1252 #1", !strcmp([C(@"This is ä t€st…") cStringWithEncoding: - OF_STRING_ENCODING_WINDOWS_1252], "This is \xE4 t\x80st\x85")) + OFStringEncodingWindows1252], "This is \xE4 t\x80st\x85")) EXPECT_EXCEPTION(@"Conversion of Unicode to Windows-1252 #2", OFInvalidEncodingException, [C(@"This is ä t€st…‼") - cStringWithEncoding: OF_STRING_ENCODING_WINDOWS_1252]) + cStringWithEncoding: OFStringEncodingWindows1252]) #endif #ifdef HAVE_CODEPAGE_437 TEST(@"Conversion of Unicode to Codepage 437 #1", !strcmp([C(@"Tést strîng ░▒▓") cStringWithEncoding: - OF_STRING_ENCODING_CODEPAGE_437], "T\x82st str\x8Cng \xB0\xB1\xB2")) + OFStringEncodingCodepage437], "T\x82st str\x8Cng \xB0\xB1\xB2")) EXPECT_EXCEPTION(@"Conversion of Unicode to Codepage 437 #2", OFInvalidEncodingException, [C(@"T€st strîng ░▒▓") - cStringWithEncoding: OF_STRING_ENCODING_CODEPAGE_437]) + cStringWithEncoding: OFStringEncodingCodepage437]) #endif TEST(@"Lossy conversion of Unicode to ASCII", !strcmp([C(@"This is a tést") lossyCStringWithEncoding: - OF_STRING_ENCODING_ASCII], "This is a t?st")) + OFStringEncodingASCII], "This is a t?st")) TEST(@"Lossy conversion of Unicode to ISO-8859-1", !strcmp([C(@"This is ä t€st") lossyCStringWithEncoding: - OF_STRING_ENCODING_ISO_8859_1], "This is \xE4 t?st")) + OFStringEncodingISO8859_1], "This is \xE4 t?st")) #ifdef HAVE_ISO_8859_15 TEST(@"Lossy conversion of Unicode to ISO-8859-15", !strcmp([C(@"This is ä t€st…") lossyCStringWithEncoding: - OF_STRING_ENCODING_ISO_8859_15], "This is \xE4 t\xA4st?")) + OFStringEncodingISO8859_15], "This is \xE4 t\xA4st?")) #endif #ifdef HAVE_WINDOWS_1252 TEST(@"Lossy conversion of Unicode to Windows-1252", !strcmp([C(@"This is ä t€st…‼") lossyCStringWithEncoding: - OF_STRING_ENCODING_WINDOWS_1252], "This is \xE4 t\x80st\x85?")) + OFStringEncodingWindows1252], "This is \xE4 t\x80st\x85?")) #endif #ifdef HAVE_CODEPAGE_437 TEST(@"Lossy conversion of Unicode to Codepage 437", !strcmp([C(@"T€st strîng ░▒▓") lossyCStringWithEncoding: - OF_STRING_ENCODING_CODEPAGE_437], "T?st str\x8Cng \xB0\xB1\xB2")) + OFStringEncodingCodepage437], "T?st str\x8Cng \xB0\xB1\xB2")) #endif TEST(@"+[stringWithFormat:]", [(s[0] = [mutableStringClass stringWithFormat: @"%@:%d", @"test", 123]) @@ -485,57 +485,57 @@ TEST(@"-[rangeOfString:]", [C(@"𝄞öö") rangeOfString: @"öö"].location == 1 && [C(@"𝄞öö") rangeOfString: @"ö"].location == 1 && [C(@"𝄞öö") rangeOfString: @"𝄞"].location == 0 && - [C(@"𝄞öö") rangeOfString: @"x"].location == OF_NOT_FOUND && + [C(@"𝄞öö") rangeOfString: @"x"].location == OFNotFound && [C(@"𝄞öö") rangeOfString: @"öö" - options: OF_STRING_SEARCH_BACKWARDS].location == 1 && + options: OFStringSearchBackwards].location == 1 && [C(@"𝄞öö") rangeOfString: @"ö" - options: OF_STRING_SEARCH_BACKWARDS].location == 2 && + options: OFStringSearchBackwards].location == 2 && [C(@"𝄞öö") rangeOfString: @"𝄞" - options: OF_STRING_SEARCH_BACKWARDS].location == 0 && + options: OFStringSearchBackwards].location == 0 && [C(@"𝄞öö") rangeOfString: @"x" - options: OF_STRING_SEARCH_BACKWARDS].location == OF_NOT_FOUND) + options: OFStringSearchBackwards].location == OFNotFound) EXPECT_EXCEPTION( @"Detect out of range in -[rangeOfString:options:range:]", OFOutOfRangeException, - [C(@"𝄞öö") rangeOfString: @"ö" options: 0 range: of_range(3, 1)]) + [C(@"𝄞öö") rangeOfString: @"ö" options: 0 range: OFRangeMake(3, 1)]) cs = [OFCharacterSet characterSetWithCharactersInString: @"cđ"]; TEST(@"-[indexOfCharacterFromSet:]", [C(@"abcđabcđe") indexOfCharacterFromSet: cs] == 2 && [C(@"abcđabcđë") indexOfCharacterFromSet: cs - options: OF_STRING_SEARCH_BACKWARDS] == 7 && + options: OFStringSearchBackwards] == 7 && [C(@"abcđabcđë") indexOfCharacterFromSet: cs options: 0 - range: of_range(4, 4)] == 6 && + range: OFRangeMake(4, 4)] == 6 && [C(@"abcđabcđëf") indexOfCharacterFromSet: cs options: 0 - range: of_range(8, 2)] == OF_NOT_FOUND) + range: OFRangeMake(8, 2)] == OFNotFound) EXPECT_EXCEPTION( @"Detect out of range in -[indexOfCharacterFromSet:options:range:]", OFOutOfRangeException, [C(@"𝄞öö") indexOfCharacterFromSet: cs options: 0 - range: of_range(3, 1)]) + range: OFRangeMake(3, 1)]) TEST(@"-[substringWithRange:]", - [[C(@"𝄞öö") substringWithRange: of_range(1, 1)] isEqual: @"ö"] && - [[C(@"𝄞öö") substringWithRange: of_range(3, 0)] isEqual: @""]) + [[C(@"𝄞öö") substringWithRange: OFRangeMake(1, 1)] isEqual: @"ö"] && + [[C(@"𝄞öö") substringWithRange: OFRangeMake(3, 0)] isEqual: @""]) EXPECT_EXCEPTION(@"Detect out of range in -[substringWithRange:] #1", OFOutOfRangeException, - [C(@"𝄞öö") substringWithRange: of_range(2, 2)]) + [C(@"𝄞öö") substringWithRange: OFRangeMake(2, 2)]) EXPECT_EXCEPTION(@"Detect out of range in -[substringWithRange:] #2", OFOutOfRangeException, - [C(@"𝄞öö") substringWithRange: of_range(4, 0)]) + [C(@"𝄞öö") substringWithRange: OFRangeMake(4, 0)]) TEST(@"-[stringByAppendingString:]", [[C(@"foo") stringByAppendingString: @"bar"] isEqual: @"foobar"]) TEST(@"-[stringByPrependingString:]", @@ -608,11 +608,11 @@ i = 0; TEST(@"-[componentsSeparatedByString:options:]", (a = [C(@"fooXXbarXXXXbazXXXX") componentsSeparatedByString: @"XX" - options: OF_STRING_SKIP_EMPTY]) && + options: OFStringSkipEmptyComponents]) && [[a objectAtIndex: i++] isEqual: @"foo"] && [[a objectAtIndex: i++] isEqual: @"bar"] && [[a objectAtIndex: i++] isEqual: @"baz"] && a.count == i) @@ -637,11 +637,11 @@ i = 0; TEST(@"-[componentsSeparatedByCharactersInSet:options:]", (a = [C(@"fooXYbarXYZXbazXYXZ") componentsSeparatedByCharactersInSet: cs - options: OF_STRING_SKIP_EMPTY]) && + options: OFStringSkipEmptyComponents]) && [[a objectAtIndex: i++] isEqual: @"foo"] && [[a objectAtIndex: i++] isEqual: @"bar"] && [[a objectAtIndex: i++] isEqual: @"baz"] && a.count == i) @@ -1187,27 +1187,27 @@ TEST(@"-[characters]", (ua = C(@"fööbär🀺").characters) && !memcmp(ua, ucstr + 1, sizeof(ucstr) - 8)) #ifdef OF_BIG_ENDIAN -# define SWAPPED_BYTE_ORDER OF_BYTE_ORDER_LITTLE_ENDIAN +# define SWAPPED_BYTE_ORDER OFByteOrderLittleEndian #else -# define SWAPPED_BYTE_ORDER OF_BYTE_ORDER_BIG_ENDIAN +# define SWAPPED_BYTE_ORDER OFByteOrderBigEndian #endif TEST(@"-[UTF16String]", (u16a = C(@"fööbär🀺").UTF16String) && - !memcmp(u16a, utf16str + 1, of_string_utf16_length(utf16str) * 2) && + !memcmp(u16a, utf16str + 1, OFUTF16StringLength(utf16str) * 2) && (u16a = [C(@"fööbär🀺") UTF16StringWithByteOrder: SWAPPED_BYTE_ORDER]) && - !memcmp(u16a, sutf16str + 1, of_string_utf16_length(sutf16str) * 2)) + !memcmp(u16a, sutf16str + 1, OFUTF16StringLength(sutf16str) * 2)) TEST(@"-[UTF16StringLength]", C(@"fööbär🀺").UTF16StringLength == 8) TEST(@"-[UTF32String]", (ua = C(@"fööbär🀺").UTF32String) && - !memcmp(ua, ucstr + 1, of_string_utf32_length(ucstr) * 4) && + !memcmp(ua, ucstr + 1, OFUTF32StringLength(ucstr) * 4) && (ua = [C(@"fööbär🀺") UTF32StringWithByteOrder: SWAPPED_BYTE_ORDER]) && - !memcmp(ua, sucstr + 1, of_string_utf32_length(sucstr) * 4)) + !memcmp(ua, sucstr + 1, OFUTF32StringLength(sucstr) * 4)) #undef SWAPPED_BYTE_ORDER TEST(@"-[stringByMD5Hashing]", [C(@"asdfoobar").stringByMD5Hashing isEqual: @"184dce2ec49b5422c7cfd8728864db4c"]) @@ -1266,47 +1266,47 @@ [s[0] isEqual: @"abc€e"] && R([s[0] setCharacter: 'x' atIndex: 1]) && [s[0] isEqual: @"axc€e"]) TEST(@"-[deleteCharactersInRange:]", (s[0] = [mutableStringClass stringWithString: @"𝄞öööbä€"]) && - R([s[0] deleteCharactersInRange: of_range(1, 3)]) && + R([s[0] deleteCharactersInRange: OFRangeMake(1, 3)]) && [s[0] isEqual: @"𝄞bä€"] && - R([s[0] deleteCharactersInRange: of_range(0, 4)]) && + R([s[0] deleteCharactersInRange: OFRangeMake(0, 4)]) && [s[0] isEqual: @""]) TEST(@"-[replaceCharactersInRange:withString:]", (s[0] = [mutableStringClass stringWithString: @"𝄞öööbä€"]) && - R([s[0] replaceCharactersInRange: of_range(1, 3) + R([s[0] replaceCharactersInRange: OFRangeMake(1, 3) withString: @"äöüß"]) && [s[0] isEqual: @"𝄞äöüßbä€"] && - R([s[0] replaceCharactersInRange: of_range(4, 2) + R([s[0] replaceCharactersInRange: OFRangeMake(4, 2) withString: @"b"]) && [s[0] isEqual: @"𝄞äöübä€"] && - R([s[0] replaceCharactersInRange: of_range(0, 7) + R([s[0] replaceCharactersInRange: OFRangeMake(0, 7) withString: @""]) && [s[0] isEqual: @""]) EXPECT_EXCEPTION(@"Detect OoR in -[deleteCharactersInRange:] #1", OFOutOfRangeException, { s[0] = [mutableStringClass stringWithString: @"𝄞öö"]; - [s[0] deleteCharactersInRange: of_range(2, 2)]; + [s[0] deleteCharactersInRange: OFRangeMake(2, 2)]; }) EXPECT_EXCEPTION(@"Detect OoR in -[deleteCharactersInRange:] #2", OFOutOfRangeException, - [s[0] deleteCharactersInRange: of_range(4, 0)]) + [s[0] deleteCharactersInRange: OFRangeMake(4, 0)]) EXPECT_EXCEPTION(@"Detect OoR in " @"-[replaceCharactersInRange:withString:] #1", OFOutOfRangeException, - [s[0] replaceCharactersInRange: of_range(2, 2) withString: @""]) + [s[0] replaceCharactersInRange: OFRangeMake(2, 2) withString: @""]) EXPECT_EXCEPTION(@"Detect OoR in " @"-[replaceCharactersInRange:withString:] #2", OFOutOfRangeException, - [s[0] replaceCharactersInRange: of_range(4, 0) withString: @""]) + [s[0] replaceCharactersInRange: OFRangeMake(4, 0) withString: @""]) TEST(@"-[replaceOccurrencesOfString:withString:]", (s[0] = [mutableStringClass stringWithString: @"asd fo asd fofo asd"]) && R([s[0] replaceOccurrencesOfString: @"fo" withString: @"foo"]) && @@ -1319,11 +1319,11 @@ (s[0] = [mutableStringClass stringWithString: @"foofoobarfoobarfoo"]) && R([s[0] replaceOccurrencesOfString: @"oo" withString: @"óò" options: 0 - range: of_range(2, 15)]) && + range: OFRangeMake(2, 15)]) && [s[0] isEqual: @"foofóòbarfóòbarfoo"]) TEST(@"-[deleteLeadingWhitespaces]", (s[0] = [mutableStringClass stringWithString: whitespace[0]]) && R([s[0] deleteLeadingWhitespaces]) && Index: tests/OFSystemInfoTests.m ================================================================== --- tests/OFSystemInfoTests.m +++ tests/OFSystemInfoTests.m @@ -23,96 +23,96 @@ void *pool = objc_autoreleasePoolPush(); #ifdef OF_HAVE_FILES OFString *userConfigPath, *userDataPath; #endif - [of_stdout setForegroundColor: [OFColor lime]]; + [OFStdOut setForegroundColor: [OFColor lime]]; - [of_stdout writeFormat: @"[OFSystemInfo] Page size: %zd\n", + [OFStdOut writeFormat: @"[OFSystemInfo] Page size: %zd\n", [OFSystemInfo pageSize]]; - [of_stdout writeFormat: @"[OFSystemInfo] Number of CPUs: %zd\n", + [OFStdOut writeFormat: @"[OFSystemInfo] Number of CPUs: %zd\n", [OFSystemInfo numberOfCPUs]]; - [of_stdout writeFormat: @"[OFSystemInfo] ObjFW version: %@\n", + [OFStdOut writeFormat: @"[OFSystemInfo] ObjFW version: %@\n", [OFSystemInfo ObjFWVersion]]; - [of_stdout writeFormat: @"[OFSystemInfo] ObjFW version major: %u\n", + [OFStdOut writeFormat: @"[OFSystemInfo] ObjFW version major: %u\n", [OFSystemInfo ObjFWVersionMajor]]; - [of_stdout writeFormat: @"[OFSystemInfo] ObjFW version minor: %u\n", + [OFStdOut writeFormat: @"[OFSystemInfo] ObjFW version minor: %u\n", [OFSystemInfo ObjFWVersionMinor]]; - [of_stdout writeFormat: @"[OFSystemInfo] Operating system name: %@\n", + [OFStdOut writeFormat: @"[OFSystemInfo] Operating system name: %@\n", [OFSystemInfo operatingSystemName]]; - [of_stdout writeFormat: + [OFStdOut writeFormat: @"[OFSystemInfo] Operating system version: %@\n", [OFSystemInfo operatingSystemVersion]]; #ifdef OF_HAVE_FILES @try { userConfigPath = [OFSystemInfo userConfigPath]; } @catch (OFNotImplementedException *e) { userConfigPath = @"Not implemented"; } - [of_stdout writeFormat: @"[OFSystemInfo] User config path: %@\n", + [OFStdOut writeFormat: @"[OFSystemInfo] User config path: %@\n", userConfigPath]; @try { userDataPath = [OFSystemInfo userDataPath]; } @catch (OFNotImplementedException *e) { userDataPath = @"Not implemented"; } - [of_stdout writeFormat: @"[OFSystemInfo] User data path: %@\n", + [OFStdOut writeFormat: @"[OFSystemInfo] User data path: %@\n", userDataPath]; #endif - [of_stdout writeFormat: @"[OFSystemInfo] CPU vendor: %@\n", + [OFStdOut writeFormat: @"[OFSystemInfo] CPU vendor: %@\n", [OFSystemInfo CPUVendor]]; - [of_stdout writeFormat: @"[OFSystemInfo] CPU model: %@\n", + [OFStdOut writeFormat: @"[OFSystemInfo] CPU model: %@\n", [OFSystemInfo CPUModel]]; #if defined(OF_X86_64) || defined(OF_X86) - [of_stdout writeFormat: @"[OFSystemInfo] Supports MMX: %d\n", + [OFStdOut writeFormat: @"[OFSystemInfo] Supports MMX: %d\n", [OFSystemInfo supportsMMX]]; - [of_stdout writeFormat: @"[OFSystemInfo] Supports SSE: %d\n", + [OFStdOut writeFormat: @"[OFSystemInfo] Supports SSE: %d\n", [OFSystemInfo supportsSSE]]; - [of_stdout writeFormat: @"[OFSystemInfo] Supports SSE2: %d\n", + [OFStdOut writeFormat: @"[OFSystemInfo] Supports SSE2: %d\n", [OFSystemInfo supportsSSE2]]; - [of_stdout writeFormat: @"[OFSystemInfo] Supports SSE3: %d\n", + [OFStdOut writeFormat: @"[OFSystemInfo] Supports SSE3: %d\n", [OFSystemInfo supportsSSE3]]; - [of_stdout writeFormat: @"[OFSystemInfo] Supports SSSE3: %d\n", + [OFStdOut writeFormat: @"[OFSystemInfo] Supports SSSE3: %d\n", [OFSystemInfo supportsSSSE3]]; - [of_stdout writeFormat: @"[OFSystemInfo] Supports SSE4.1: %d\n", + [OFStdOut writeFormat: @"[OFSystemInfo] Supports SSE4.1: %d\n", [OFSystemInfo supportsSSE41]]; - [of_stdout writeFormat: @"[OFSystemInfo] Supports SSE4.2: %d\n", + [OFStdOut writeFormat: @"[OFSystemInfo] Supports SSE4.2: %d\n", [OFSystemInfo supportsSSE42]]; - [of_stdout writeFormat: @"[OFSystemInfo] Supports AVX: %d\n", + [OFStdOut writeFormat: @"[OFSystemInfo] Supports AVX: %d\n", [OFSystemInfo supportsAVX]]; - [of_stdout writeFormat: @"[OFSystemInfo] Supports AVX2: %d\n", + [OFStdOut writeFormat: @"[OFSystemInfo] Supports AVX2: %d\n", [OFSystemInfo supportsAVX2]]; - [of_stdout writeFormat: @"[OFSystemInfo] Supports AES-NI: %d\n", + [OFStdOut writeFormat: @"[OFSystemInfo] Supports AES-NI: %d\n", [OFSystemInfo supportsAESNI]]; - [of_stdout writeFormat: @"[OFSystemInfo] Supports SHA extensions: %d\n", + [OFStdOut writeFormat: @"[OFSystemInfo] Supports SHA extensions: %d\n", [OFSystemInfo supportsSHAExtensions]]; #endif #ifdef OF_POWERPC - [of_stdout writeFormat: @"[OFSystemInfo] Supports AltiVec: %d\n", + [OFStdOut writeFormat: @"[OFSystemInfo] Supports AltiVec: %d\n", [OFSystemInfo supportsAltiVec]]; #endif objc_autoreleasePoolPop(pool); } @end Index: tests/OFTCPSocketTests.m ================================================================== --- tests/OFTCPSocketTests.m +++ tests/OFTCPSocketTests.m @@ -41,11 +41,11 @@ R([client connectToHost: @"127.0.0.1" port: port])) TEST(@"-[accept]", (accepted = [server accept])) TEST(@"-[remoteAddress]", - [of_socket_address_ip_string(accepted.remoteAddress, NULL) + [OFSocketAddressString(accepted.remoteAddress) isEqual: @"127.0.0.1"]) TEST(@"-[writeString:]", [client writeString: @"Hello!"]) TEST(@"-[readIntoBuffer:length:]", Index: tests/OFUDPSocketTests.m ================================================================== --- tests/OFUDPSocketTests.m +++ tests/OFUDPSocketTests.m @@ -24,43 +24,42 @@ @implementation TestsAppDelegate (OFUDPSocketTests) - (void)UDPSocketTests { void *pool = objc_autoreleasePoolPush(); OFUDPSocket *sock; - uint16_t port1, port2; - of_socket_address_t addr1, addr2, addr3; + uint16_t port1; + OFSocketAddress addr1, addr2, addr3; char buf[6]; - OFString *host; TEST(@"+[socket]", (sock = [OFUDPSocket socket])) TEST(@"-[bindToHost:port:]", (port1 = [sock bindToHost: @"127.0.0.1" port: 0])) - addr1 = of_socket_address_parse_ip(@"127.0.0.1", port1); + addr1 = OFSocketAddressParseIP(@"127.0.0.1", port1); TEST(@"-[sendBuffer:length:receiver:]", R([sock sendBuffer: "Hello" length: 6 receiver: &addr1])) TEST(@"-[receiveIntoBuffer:length:sender:]", [sock receiveIntoBuffer: buf length: 6 sender: &addr2] == 6 && !memcmp(buf, "Hello", 6) && - (host = of_socket_address_ip_string(&addr2, &port2)) && - [host isEqual: @"127.0.0.1"] && port2 == port1) + [OFSocketAddressString(&addr2) isEqual: @"127.0.0.1"] && + OFSocketAddressPort(&addr2) == port1) - addr3 = of_socket_address_parse_ip(@"127.0.0.1", port1 + 1); + addr3 = OFSocketAddressParseIP(@"127.0.0.1", port1 + 1); /* * TODO: Move those tests elsewhere as soon as the DNS resolving part * is no longer in OFUDPSocket. */ - TEST(@"of_socket_address_equal()", - of_socket_address_equal(&addr1, &addr2) && - !of_socket_address_equal(&addr1, &addr3)) + TEST(@"OFSocketAddressEqual()", + OFSocketAddressEqual(&addr1, &addr2) && + !OFSocketAddressEqual(&addr1, &addr3)) - TEST(@"of_socket_address_hash()", - of_socket_address_hash(&addr1) == of_socket_address_hash(&addr2) && - of_socket_address_hash(&addr1) != of_socket_address_hash(&addr3)) + TEST(@"OFSocketAddressHash()", + OFSocketAddressHash(&addr1) == OFSocketAddressHash(&addr2) && + OFSocketAddressHash(&addr1) != OFSocketAddressHash(&addr3)) objc_autoreleasePoolPop(pool); } @end Index: tests/OFValueTests.m ================================================================== --- tests/OFValueTests.m +++ tests/OFValueTests.m @@ -23,31 +23,30 @@ @implementation TestsAppDelegate (OFValueTests) - (void)valueTests { void *pool = objc_autoreleasePoolPush(); - of_range_t range = of_range(1, 64), range2; - of_point_t point = of_point(1.5f, 3.0f), point2; - of_dimension_t dimension = of_dimension(4.5f, 5.0f), dimension2; - of_rectangle_t rectangle = of_rectangle(1.5f, 3.0f, 4.5f, 6.0f); - of_rectangle_t rectangle2; + OFRange range = OFRangeMake(1, 64), range2; + OFPoint point = OFPointMake(1.5f, 3.0f), point2; + OFSize size = OFSizeMake(4.5f, 5.0f), size2; + OFRect rect = OFRectMake(1.5f, 3.0f, 4.5f, 6.0f), rect2; OFValue *value; void *pointer = &value; TEST(@"+[valueWithBytes:objCType:]", (value = [OFValue valueWithBytes: &range - objCType: @encode(of_range_t)])) + objCType: @encode(OFRange)])) - TEST(@"-[objCType]", strcmp(value.objCType, @encode(of_range_t)) == 0) + TEST(@"-[objCType]", strcmp(value.objCType, @encode(OFRange)) == 0) TEST(@"-[getValue:size:]", - R([value getValue: &range2 size: sizeof(of_range_t)]) && - of_range_equal(range2, range)) + R([value getValue: &range2 size: sizeof(OFRange)]) && + OFRangeEqual(range2, range)) EXPECT_EXCEPTION(@"-[getValue:size:] with wrong size throws", OFOutOfRangeException, - [value getValue: &range size: sizeof(of_range_t) - 1]) + [value getValue: &range size: sizeof(OFRange) - 1]) TEST(@"+[valueWithPointer:]", (value = [OFValue valueWithPointer: pointer])) TEST(@"-[pointerValue]", @@ -75,19 +74,19 @@ TEST(@"+[valueWithRange:]", (value = [OFValue valueWithRange: range])) TEST(@"-[rangeValue]", - of_range_equal(value.rangeValue, range) && + OFRangeEqual(value.rangeValue, range) && (value = [OFValue valueWithBytes: &range - objCType: @encode(of_range_t)]) && - of_range_equal(value.rangeValue, range)) + objCType: @encode(OFRange)]) && + OFRangeEqual(value.rangeValue, range)) TEST(@"-[getValue:size:] for OFRangeValue", (value = [OFValue valueWithRange: range]) && R([value getValue: &range2 size: sizeof(range2)]) && - of_range_equal(range2, range)) + OFRangeEqual(range2, range)) EXPECT_EXCEPTION(@"-[rangeValue] with wrong size throws", OFOutOfRangeException, [[OFValue valueWithBytes: "a" objCType: @encode(char)] rangeValue]) @@ -94,71 +93,70 @@ TEST(@"+[valueWithPoint:]", (value = [OFValue valueWithPoint: point])) TEST(@"-[pointValue]", - of_point_equal(value.pointValue, point) && + OFPointEqual(value.pointValue, point) && (value = [OFValue valueWithBytes: &point - objCType: @encode(of_point_t)]) && - of_point_equal(value.pointValue, point)) + objCType: @encode(OFPoint)]) && + OFPointEqual(value.pointValue, point)) TEST(@"-[getValue:size:] for OFPointValue", (value = [OFValue valueWithPoint: point]) && R([value getValue: &point2 size: sizeof(point2)]) && - of_point_equal(point2, point)) + OFPointEqual(point2, point)) EXPECT_EXCEPTION(@"-[pointValue] with wrong size throws", OFOutOfRangeException, [[OFValue valueWithBytes: "a" objCType: @encode(char)] pointValue]) - TEST(@"+[valueWithDimension:]", - (value = [OFValue valueWithDimension: dimension])) - - TEST(@"-[dimensionValue]", - of_dimension_equal(value.dimensionValue, dimension) && - (value = [OFValue valueWithBytes: &dimension - objCType: @encode(of_dimension_t)]) && - of_dimension_equal(value.dimensionValue, dimension)) - - TEST(@"-[getValue:size:] for OFDimensionValue", - (value = [OFValue valueWithDimension: dimension]) && - R([value getValue: &dimension2 size: sizeof(dimension2)]) && - of_dimension_equal(dimension2, dimension)) - - EXPECT_EXCEPTION(@"-[dimensionValue] with wrong size throws", - OFOutOfRangeException, - [[OFValue valueWithBytes: "a" - objCType: @encode(char)] dimensionValue]) - - TEST(@"+[valueWithRectangle:]", - (value = [OFValue valueWithRectangle: rectangle])) - - TEST(@"-[rectangleValue]", - of_rectangle_equal(value.rectangleValue, rectangle) && - (value = [OFValue valueWithBytes: &rectangle - objCType: @encode(of_rectangle_t)]) && - of_rectangle_equal(value.rectangleValue, rectangle)) - - TEST(@"-[getValue:size:] for OFRectangleValue", - (value = [OFValue valueWithRectangle: rectangle]) && - R([value getValue: &rectangle2 size: sizeof(rectangle2)]) && - of_rectangle_equal(rectangle2, rectangle)) - - EXPECT_EXCEPTION(@"-[rectangleValue] with wrong size throws", - OFOutOfRangeException, - [[OFValue valueWithBytes: "a" - objCType: @encode(char)] rectangleValue]) - - TEST(@"-[isEqual:]", - [[OFValue valueWithRectangle: rectangle] - isEqual: [OFValue valueWithBytes: &rectangle - objCType: @encode(of_rectangle_t)]] && + TEST(@"+[valueWithSize:]", + (value = [OFValue valueWithSize: size])) + + TEST(@"-[sizeValue]", + OFSizeEqual(value.sizeValue, size) && + (value = [OFValue valueWithBytes: &size + objCType: @encode(OFSize)]) && + OFSizeEqual(value.sizeValue, size)) + + TEST(@"-[getValue:size:] for OFSizeValue", + (value = [OFValue valueWithSize: size]) && + R([value getValue: &size2 size: sizeof(size2)]) && + OFSizeEqual(size2, size)) + + EXPECT_EXCEPTION(@"-[sizeValue] with wrong size throws", + OFOutOfRangeException, + [[OFValue valueWithBytes: "a" + objCType: @encode(char)] sizeValue]) + + TEST(@"+[valueWithRect:]", + (value = [OFValue valueWithRect: rect])) + + TEST(@"-[rectValue]", + OFRectEqual(value.rectValue, rect) && + (value = [OFValue valueWithBytes: &rect + objCType: @encode(OFRect)]) && + OFRectEqual(value.rectValue, rect)) + + TEST(@"-[getValue:size:] for OFRectValue", + (value = [OFValue valueWithRect: rect]) && + R([value getValue: &rect2 size: sizeof(rect2)]) && + OFRectEqual(rect2, rect)) + + EXPECT_EXCEPTION(@"-[rectValue] with wrong size throws", + OFOutOfRangeException, + [[OFValue valueWithBytes: "a" objCType: @encode(char)] rectValue]) + + TEST(@"-[isEqual:]", + [[OFValue valueWithRect: rect] + isEqual: [OFValue valueWithBytes: &rect + objCType: @encode(OFRect)]] && ![[OFValue valueWithBytes: "a" objCType: @encode(signed char)] isEqual: [OFValue valueWithBytes: "a" objCType: @encode(unsigned char)]] && ![[OFValue valueWithBytes: "a" objCType: @encode(char)] isEqual: [OFValue valueWithBytes: "b" objCType: @encode(char)]]) objc_autoreleasePoolPop(pool); } @end Index: tests/OFXMLElementBuilderTests.m ================================================================== --- tests/OFXMLElementBuilderTests.m +++ tests/OFXMLElementBuilderTests.m @@ -23,26 +23,26 @@ @implementation TestsAppDelegate (OFXMLElementBuilderTests) - (void)elementBuilder: (OFXMLElementBuilder *)builder didBuildElement: (OFXMLElement *)element { - OF_ENSURE(i == 0); + OFEnsure(i == 0); nodes[i++] = [element retain]; } - (void)elementBuilder: (OFXMLElementBuilder *)builder didBuildParentlessNode: (OFXMLNode *)node { - OF_ENSURE(i == 1); + OFEnsure(i == 1); nodes[i++] = [node retain]; } - (void)XMLElementBuilderTests { void *pool = objc_autoreleasePoolPush(); OFXMLParser *p = [OFXMLParser parser]; - OFXMLElementBuilder *builder = [OFXMLElementBuilder elementBuilder]; + OFXMLElementBuilder *builder = [OFXMLElementBuilder builder]; OFString *str = @"barbaz" " " ""; p.delegate = builder; Index: tests/OFXMLNodeTests.m ================================================================== --- tests/OFXMLNodeTests.m +++ tests/OFXMLNodeTests.m @@ -63,12 +63,12 @@ TEST(@"+[CDATAWithString:]", (nodes[3] = [OFXMLCDATA CDATAWithString: @""]) && [[nodes[3] XMLString] isEqual: @"]]>"]); - TEST(@"+[commentWithString:]", - (nodes[3] = [OFXMLComment commentWithString: @" comment "]) && + TEST(@"+[commentWithText:]", + (nodes[3] = [OFXMLComment commentWithText: @" comment "]) && [[nodes[3] XMLString] isEqual: @""]) module = @"OFXMLElement"; TEST(@"-[addAttributeWithName:stringValue:]", Index: tests/OFXMLParserTests.m ================================================================== --- tests/OFXMLParserTests.m +++ tests/OFXMLParserTests.m @@ -22,11 +22,11 @@ static OFString *module = @"OFXMLParser"; static int i = 0; enum event_type { - PROCESSING_INSTRUCTIONS, + PROCESSING_INSTRUCTION, TAG_OPEN, TAG_CLOSE, STRING, CDATA, COMMENT @@ -46,16 +46,17 @@ i++; msg = [OFString stringWithFormat: @"Parsing part #%d", i]; switch (i) { case 1: - TEST(msg, type == PROCESSING_INSTRUCTIONS && - [string isEqual: @"xml version='1.0'"]) + TEST(msg, type == PROCESSING_INSTRUCTION && + [name isEqual: @"xml"] && + [string isEqual: @"version='1.0'"]) break; case 2: - TEST(msg, type == PROCESSING_INSTRUCTIONS && - [string isEqual: @"p?i"]) + TEST(msg, type == PROCESSING_INSTRUCTION && + [name isEqual: @"p?i"] && string == nil) break; case 3: TEST(msg, type == TAG_OPEN && [name isEqual: @"root"] && prefix == nil && ns == nil && attrs.count == 0) break; @@ -230,20 +231,21 @@ prefix == nil && ns == nil); break; } } -- (void)parser: (OFXMLParser *)parser - foundProcessingInstructions: (OFString *)pi +- (void)parser: (OFXMLParser *)parser + foundProcessingInstructionWithTarget: (OFString *)target + data: (OFString *)data { [self parser: parser - didCreateEvent: PROCESSING_INSTRUCTIONS - name: nil + didCreateEvent: PROCESSING_INSTRUCTION + name: target prefix: nil namespace: nil attributes: nil - string: pi]; + string: data]; } - (void)parser: (OFXMLParser *)parser didStartElement: (OFString *)name prefix: (OFString *)prefix @@ -369,22 +371,22 @@ EXPECT_EXCEPTION(@"Detection of junk after the document #2", OFMalformedXMLException, [parser parseString: @""]) parser = [OFXMLParser parser]; - EXPECT_EXCEPTION(@"Detection of invalid XML processing instructions #2", + EXPECT_EXCEPTION(@"Detection of invalid XML processing instruction #2", OFInvalidEncodingException, [parser parseString: @""]) parser = [OFXMLParser parser]; - EXPECT_EXCEPTION(@"Detection of invalid XML processing instructions #3", + EXPECT_EXCEPTION(@"Detection of invalid XML processing instruction #3", OFMalformedXMLException, [parser parseString: @""]) objc_autoreleasePoolPop(pool); } @end Index: tests/PBKDF2Tests.m ================================================================== --- tests/PBKDF2Tests.m +++ tests/PBKDF2Tests.m @@ -30,11 +30,11 @@ unsigned char key[25]; /* Test vectors from RFC 6070 */ TEST(@"PBKDF2-SHA1, 1 iteration", - R(of_pbkdf2((of_pbkdf2_parameters_t){ + R(OFPBKDF2((OFPBKDF2Parameters){ .HMAC = HMAC, .iterations = 1, .salt = (unsigned char *)"salt", .saltLength = 4, .password = "password", @@ -44,11 +44,11 @@ .allowsSwappableMemory = true })) && memcmp(key, "\x0C\x60\xC8\x0F\x96\x1F\x0E\x71\xF3\xA9\xB5" "\x24\xAF\x60\x12\x06\x2F\xE0\x37\xA6", 20) == 0) TEST(@"PBKDF2-SHA1, 2 iterations", - R(of_pbkdf2((of_pbkdf2_parameters_t){ + R(OFPBKDF2((OFPBKDF2Parameters){ .HMAC = HMAC, .iterations = 2, .salt = (unsigned char *)"salt", .saltLength = 4, .password = "password", @@ -58,11 +58,11 @@ .allowsSwappableMemory = true })) && memcmp(key, "\xEA\x6C\x01\x4D\xC7\x2D\x6F\x8C\xCD\x1E\xD9" "\x2A\xCE\x1D\x41\xF0\xD8\xDE\x89\x57", 20) == 0) TEST(@"PBKDF2-SHA1, 4096 iterations", - R(of_pbkdf2((of_pbkdf2_parameters_t){ + R(OFPBKDF2((OFPBKDF2Parameters){ .HMAC = HMAC, .iterations = 4096, .salt = (unsigned char *)"salt", .saltLength = 4, .password = "password", @@ -74,11 +74,11 @@ "\xD9\x26\xF7\x21\xD0\x65\xA4\x29\xC1", 20) == 0) /* This test takes too long, even on a fast machine. */ #if 0 TEST(@"PBKDF2-SHA1, 16777216 iterations", - R(of_pbkdf2((of_pbkdf2_parameters_t){ + R(OFPBKDF2((OFPBKDF2Parameters){ .HMAC = HMAC, .iterations = 16777216, .salt = (unsigned char *)"salt", .saltLength = 4, .password = "password", @@ -89,11 +89,11 @@ })) && memcmp(key, "\xEE\xFE\x3D\x61\xCD\x4D\xA4\xE4\xE9\x94\x5B" "\x3D\x6B\xA2\x15\x8C\x26\x34\xE9\x84", 20) == 0) #endif TEST(@"PBKDF2-SHA1, 4096 iterations, key > 1 block", - R(of_pbkdf2((of_pbkdf2_parameters_t){ + R(OFPBKDF2((OFPBKDF2Parameters){ .HMAC = HMAC, .iterations = 4096, .salt = (unsigned char *)"saltSALTsaltSALTsalt" "SALTsaltSALTsalt", .saltLength = 36, @@ -105,11 +105,11 @@ })) && memcmp(key, "\x3D\x2E\xEC\x4F\xE4\x1C\x84\x9B\x80\xC8\xD8\x36\x62" "\xC0\xE4\x4A\x8B\x29\x1A\x96\x4C\xF2\xF0\x70\x38", 25) == 0) TEST(@"PBKDF2-SHA1, 4096 iterations, key < 1 block", - R(of_pbkdf2((of_pbkdf2_parameters_t){ + R(OFPBKDF2((OFPBKDF2Parameters){ .HMAC = HMAC, .iterations = 4096, .salt = (unsigned char *)"sa\0lt", .saltLength = 5, .password = "pass\0word", Index: tests/ScryptTests.m ================================================================== --- tests/ScryptTests.m +++ tests/ScryptTests.m @@ -139,24 +139,24 @@ uint32_t ROMixBuffer[32], ROMixTmp[17 * 32]; unsigned char output[64]; TEST(@"Salsa20/8 Core", R(memcpy(salsa20Buffer, salsa20Input, 64)) && - R(of_salsa20_8_core(salsa20Buffer)) && + R(OFSalsa20_8Core(salsa20Buffer)) && memcmp(salsa20Buffer, salsa20Output, 64) == 0) TEST(@"Block mix", - R(of_scrypt_block_mix(blockMixBuffer, blockMixInput.u32, 1)) && + R(OFScryptBlockMix(blockMixBuffer, blockMixInput.u32, 1)) && memcmp(blockMixBuffer, blockMixOutput, 128) == 0) TEST(@"ROMix", R(memcpy(ROMixBuffer, ROMixInput, 128)) && - R(of_scrypt_romix(ROMixBuffer, 1, 16, ROMixTmp)) && + R(OFScryptROMix(ROMixBuffer, 1, 16, ROMixTmp)) && memcmp(ROMixBuffer, ROMixOutput, 128) == 0) TEST(@"scrypt test vector #1", - R(of_scrypt((of_scrypt_parameters_t){ + R(OFScrypt((OFScryptParameters){ .blockSize = 1, .costFactor = 16, .parallelization = 1, .salt = (unsigned char *)"", .saltLength = 0, @@ -166,11 +166,11 @@ .keyLength = 64, .allowsSwappableMemory = true })) && memcmp(output, testVector1, 64) == 0) TEST(@"scrypt test vector #2", - R(of_scrypt((of_scrypt_parameters_t){ + R(OFScrypt((OFScryptParameters){ .blockSize = 8, .costFactor = 1024, .parallelization = 16, .salt = (unsigned char *)"NaCl", .saltLength = 4, @@ -180,11 +180,11 @@ .keyLength = 64, .allowsSwappableMemory = true })) && memcmp(output, testVector2, 64) == 0) TEST(@"scrypt test vector #3", - R(of_scrypt((of_scrypt_parameters_t){ + R(OFScrypt((OFScryptParameters){ .blockSize = 8, .costFactor = 16384, .parallelization = 1, .salt = (unsigned char *)"SodiumChloride", .saltLength = 14, @@ -196,11 +196,11 @@ })) && memcmp(output, testVector3, 64) == 0) /* The forth test vector is too expensive to include it in the tests. */ #if 0 TEST(@"scrypt test vector #4", - R(of_scrypt((of_scrypt_parameters_t){ + R(OFScrypt((OFScryptParameters){ .blockSize = 8, .costFactor = 1048576, .parallelization = 1, .salt = (unsigned char *)"SodiumChloride", .saltLength = 14, Index: tests/SocketTests.m ================================================================== --- tests/SocketTests.m +++ tests/SocketTests.m @@ -56,169 +56,144 @@ @implementation TestsAppDelegate (SocketTests) - (void)socketTests { void *pool = objc_autoreleasePoolPush(); - of_socket_address_t addr; - uint16_t port; + OFSocketAddress addr; TEST(@"Parsing an IPv4", - R(addr = of_socket_address_parse_ip(@"127.0.0.1", 1234)) && - OF_BSWAP32_IF_LE(addr.sockaddr.in.sin_addr.s_addr) == 0x7F000001 && - OF_BSWAP16_IF_LE(addr.sockaddr.in.sin_port) == 1234) - - EXPECT_EXCEPTION(@"Refusing invalid IPv4 #1", - OFInvalidFormatException, - of_socket_address_parse_ip(@"127.0.0.0.1", 1234)) - - EXPECT_EXCEPTION(@"Refusing invalid IPv4 #2", - OFInvalidFormatException, - of_socket_address_parse_ip(@"127.0.0.256", 1234)) - - EXPECT_EXCEPTION(@"Refusing invalid IPv4 #3", - OFInvalidFormatException, - of_socket_address_parse_ip(@"127.0.0. 1", 1234)) - - EXPECT_EXCEPTION(@"Refusing invalid IPv4 #4", - OFInvalidFormatException, - of_socket_address_parse_ip(@" 127.0.0.1", 1234)) - - EXPECT_EXCEPTION(@"Refusing invalid IPv4 #5", - OFInvalidFormatException, - of_socket_address_parse_ip(@"127.0.a.1", 1234)) - - EXPECT_EXCEPTION(@"Refusing invalid IPv4 #6", - OFInvalidFormatException, - of_socket_address_parse_ip(@"127.0..1", 1234)) + R(addr = OFSocketAddressParseIP(@"127.0.0.1", 1234)) && + OFFromBigEndian32(addr.sockaddr.in.sin_addr.s_addr) == 0x7F000001 && + OFFromBigEndian16(addr.sockaddr.in.sin_port) == 1234) + + EXPECT_EXCEPTION(@"Refusing invalid IPv4 #1", OFInvalidFormatException, + OFSocketAddressParseIP(@"127.0.0.0.1", 1234)) + + EXPECT_EXCEPTION(@"Refusing invalid IPv4 #2", OFInvalidFormatException, + OFSocketAddressParseIP(@"127.0.0.256", 1234)) + + EXPECT_EXCEPTION(@"Refusing invalid IPv4 #3", OFInvalidFormatException, + OFSocketAddressParseIP(@"127.0.0. 1", 1234)) + + EXPECT_EXCEPTION(@"Refusing invalid IPv4 #4", OFInvalidFormatException, + OFSocketAddressParseIP(@" 127.0.0.1", 1234)) + + EXPECT_EXCEPTION(@"Refusing invalid IPv4 #5", OFInvalidFormatException, + OFSocketAddressParseIP(@"127.0.a.1", 1234)) + + EXPECT_EXCEPTION(@"Refusing invalid IPv4 #6", OFInvalidFormatException, + OFSocketAddressParseIP(@"127.0..1", 1234)) + + TEST(@"Port of an IPv4 address", OFSocketAddressPort(&addr) == 1234) TEST(@"Converting an IPv4 to a string", - [of_socket_address_ip_string(&addr, &port) isEqual: @"127.0.0.1"] && - port == 1234) + [OFSocketAddressString(&addr) isEqual: @"127.0.0.1"]) TEST(@"Parsing an IPv6 #1", - R(addr = of_socket_address_parse_ip( + R(addr = OFSocketAddressParseIP( @"1122:3344:5566:7788:99aa:bbCc:ddee:ff00", 1234)) && COMPARE_V6(addr, 0x1122, 0x3344, 0x5566, 0x7788, 0x99AA, 0xBBCC, 0xDDEE, 0xFF00) && - OF_BSWAP16_IF_LE(addr.sockaddr.in6.sin6_port) == 1234) + OFFromBigEndian16(addr.sockaddr.in6.sin6_port) == 1234) TEST(@"Parsing an IPv6 #2", - R(addr = of_socket_address_parse_ip(@"::", 1234)) && + R(addr = OFSocketAddressParseIP(@"::", 1234)) && COMPARE_V6(addr, 0, 0, 0, 0, 0, 0, 0, 0) && - OF_BSWAP16_IF_LE(addr.sockaddr.in6.sin6_port) == 1234) + OFFromBigEndian16(addr.sockaddr.in6.sin6_port) == 1234) TEST(@"Parsing an IPv6 #3", - R(addr = of_socket_address_parse_ip(@"aaAa::bBbb", 1234)) && + R(addr = OFSocketAddressParseIP(@"aaAa::bBbb", 1234)) && COMPARE_V6(addr, 0xAAAA, 0, 0, 0, 0, 0, 0, 0xBBBB) && - OF_BSWAP16_IF_LE(addr.sockaddr.in6.sin6_port) == 1234) + OFFromBigEndian16(addr.sockaddr.in6.sin6_port) == 1234) TEST(@"Parsing an IPv6 #4", - R(addr = of_socket_address_parse_ip(@"aaAa::", 1234)) && + R(addr = OFSocketAddressParseIP(@"aaAa::", 1234)) && COMPARE_V6(addr, 0xAAAA, 0, 0, 0, 0, 0, 0, 0) && - OF_BSWAP16_IF_LE(addr.sockaddr.in6.sin6_port) == 1234) + OFFromBigEndian16(addr.sockaddr.in6.sin6_port) == 1234) TEST(@"Parsing an IPv6 #5", - R(addr = of_socket_address_parse_ip(@"::aaAa", 1234)) && + R(addr = OFSocketAddressParseIP(@"::aaAa", 1234)) && COMPARE_V6(addr, 0, 0, 0, 0, 0, 0, 0, 0xAAAA) && - OF_BSWAP16_IF_LE(addr.sockaddr.in6.sin6_port) == 1234) - - EXPECT_EXCEPTION(@"Refusing invalid IPv6 #1", - OFInvalidFormatException, - of_socket_address_parse_ip(@"1:::2", 1234)) - - EXPECT_EXCEPTION(@"Refusing invalid IPv6 #2", - OFInvalidFormatException, - of_socket_address_parse_ip(@"1: ::2", 1234)) - - EXPECT_EXCEPTION(@"Refusing invalid IPv6 #3", - OFInvalidFormatException, - of_socket_address_parse_ip(@"1:: :2", 1234)) - - EXPECT_EXCEPTION(@"Refusing invalid IPv6 #4", - OFInvalidFormatException, - of_socket_address_parse_ip(@"1::2::3", 1234)) - - EXPECT_EXCEPTION(@"Refusing invalid IPv6 #5", - OFInvalidFormatException, - of_socket_address_parse_ip(@"10000::1", 1234)) - - EXPECT_EXCEPTION(@"Refusing invalid IPv6 #6", - OFInvalidFormatException, - of_socket_address_parse_ip(@"::10000", 1234)) - - EXPECT_EXCEPTION(@"Refusing invalid IPv6 #7", - OFInvalidFormatException, - of_socket_address_parse_ip(@"::1::", 1234)) - - EXPECT_EXCEPTION(@"Refusing invalid IPv6 #8", - OFInvalidFormatException, - of_socket_address_parse_ip(@"1:2:3:4:5:6:7:", 1234)) - - EXPECT_EXCEPTION(@"Refusing invalid IPv6 #9", - OFInvalidFormatException, - of_socket_address_parse_ip(@"1:2:3:4:5:6:7::", 1234)) - - EXPECT_EXCEPTION(@"Refusing invalid IPv6 #10", - OFInvalidFormatException, - of_socket_address_parse_ip(@"1:2", 1234)) + OFFromBigEndian16(addr.sockaddr.in6.sin6_port) == 1234) + + EXPECT_EXCEPTION(@"Refusing invalid IPv6 #1", OFInvalidFormatException, + OFSocketAddressParseIP(@"1:::2", 1234)) + + EXPECT_EXCEPTION(@"Refusing invalid IPv6 #2", OFInvalidFormatException, + OFSocketAddressParseIP(@"1: ::2", 1234)) + + EXPECT_EXCEPTION(@"Refusing invalid IPv6 #3", OFInvalidFormatException, + OFSocketAddressParseIP(@"1:: :2", 1234)) + + EXPECT_EXCEPTION(@"Refusing invalid IPv6 #4", OFInvalidFormatException, + OFSocketAddressParseIP(@"1::2::3", 1234)) + + EXPECT_EXCEPTION(@"Refusing invalid IPv6 #5", OFInvalidFormatException, + OFSocketAddressParseIP(@"10000::1", 1234)) + + EXPECT_EXCEPTION(@"Refusing invalid IPv6 #6", OFInvalidFormatException, + OFSocketAddressParseIP(@"::10000", 1234)) + + EXPECT_EXCEPTION(@"Refusing invalid IPv6 #7", OFInvalidFormatException, + OFSocketAddressParseIP(@"::1::", 1234)) + + EXPECT_EXCEPTION(@"Refusing invalid IPv6 #8", OFInvalidFormatException, + OFSocketAddressParseIP(@"1:2:3:4:5:6:7:", 1234)) + + EXPECT_EXCEPTION(@"Refusing invalid IPv6 #9", OFInvalidFormatException, + OFSocketAddressParseIP(@"1:2:3:4:5:6:7::", 1234)) + + EXPECT_EXCEPTION(@"Refusing invalid IPv6 #10", OFInvalidFormatException, + OFSocketAddressParseIP(@"1:2", 1234)) + + TEST(@"Port of an IPv6 address", OFSocketAddressPort(&addr) == 1234) SET_V6(addr, 0, 0, 0, 0, 0, 0, 0, 0) TEST(@"Converting an IPv6 to a string #1", - [of_socket_address_ip_string(&addr, &port) isEqual: @"::"] && - port == 1234) + [OFSocketAddressString(&addr) isEqual: @"::"]) SET_V6(addr, 0, 0, 0, 0, 0, 0, 0, 1) TEST(@"Converting an IPv6 to a string #2", - [of_socket_address_ip_string(&addr, &port) isEqual: @"::1"] && - port == 1234) + [OFSocketAddressString(&addr) isEqual: @"::1"]) SET_V6(addr, 1, 0, 0, 0, 0, 0, 0, 0) TEST(@"Converting an IPv6 to a string #3", - [of_socket_address_ip_string(&addr, &port) isEqual: @"1::"] && - port == 1234) + [OFSocketAddressString(&addr) isEqual: @"1::"]) SET_V6(addr, 0x1122, 0x3344, 0x5566, 0x7788, 0x99AA, 0xBBCC, 0xDDEE, 0xFF00) TEST(@"Converting an IPv6 to a string #4", - [of_socket_address_ip_string(&addr, &port) isEqual: - @"1122:3344:5566:7788:99aa:bbcc:ddee:ff00"] && - port == 1234) + [OFSocketAddressString(&addr) + isEqual: @"1122:3344:5566:7788:99aa:bbcc:ddee:ff00"]) SET_V6(addr, 0x1122, 0x3344, 0x5566, 0x7788, 0x99AA, 0xBBCC, 0xDDEE, 0) TEST(@"Converting an IPv6 to a string #5", - [of_socket_address_ip_string(&addr, &port) isEqual: - @"1122:3344:5566:7788:99aa:bbcc:ddee:0"] && - port == 1234) + [OFSocketAddressString(&addr) + isEqual: @"1122:3344:5566:7788:99aa:bbcc:ddee:0"]) SET_V6(addr, 0x1122, 0x3344, 0x5566, 0x7788, 0x99AA, 0xBBCC, 0, 0) TEST(@"Converting an IPv6 to a string #6", - [of_socket_address_ip_string(&addr, &port) isEqual: - @"1122:3344:5566:7788:99aa:bbcc::"] && - port == 1234) + [OFSocketAddressString(&addr) + isEqual: @"1122:3344:5566:7788:99aa:bbcc::"]) SET_V6(addr, 0, 0x3344, 0x5566, 0x7788, 0x99AA, 0xBBCC, 0xDDEE, 0xFF00) TEST(@"Converting an IPv6 to a string #7", - [of_socket_address_ip_string(&addr, &port) isEqual: - @"0:3344:5566:7788:99aa:bbcc:ddee:ff00"] && - port == 1234) + [OFSocketAddressString(&addr) + isEqual: @"0:3344:5566:7788:99aa:bbcc:ddee:ff00"]) SET_V6(addr, 0, 0, 0x5566, 0x7788, 0x99AA, 0xBBCC, 0xDDEE, 0xFF00) TEST(@"Converting an IPv6 to a string #8", - [of_socket_address_ip_string(&addr, &port) isEqual: - @"::5566:7788:99aa:bbcc:ddee:ff00"] && - port == 1234) + [OFSocketAddressString(&addr) + isEqual: @"::5566:7788:99aa:bbcc:ddee:ff00"]) SET_V6(addr, 0, 0, 0x5566, 0, 0, 0, 0xDDEE, 0xFF00) TEST(@"Converting an IPv6 to a string #9", - [of_socket_address_ip_string(&addr, &port) isEqual: - @"0:0:5566::ddee:ff00"] && - port == 1234) + [OFSocketAddressString(&addr) isEqual: @"0:0:5566::ddee:ff00"]) SET_V6(addr, 0, 0, 0x5566, 0x7788, 0x99AA, 0xBBCC, 0, 0) TEST(@"Converting an IPv6 to a string #10", - [of_socket_address_ip_string(&addr, &port) isEqual: - @"::5566:7788:99aa:bbcc:0:0"] && - port == 1234) + [OFSocketAddressString(&addr) + isEqual: @"::5566:7788:99aa:bbcc:0:0"]) objc_autoreleasePoolPop(pool); } @end Index: tests/TestsAppDelegate.m ================================================================== --- tests/TestsAppDelegate.m +++ tests/TestsAppDelegate.m @@ -49,10 +49,12 @@ # define id id_3ds # include <3ds.h> # undef id #endif +extern unsigned long OFHashSeed; + #ifdef OF_PSP static int exit_cb(int arg1, int arg2, void *arg) { sceKernelExitGame(); @@ -88,11 +90,11 @@ */ atexit(objc_exit); #endif /* We need deterministic hashes for tests */ - of_hash_seed = 0; + OFHashSeed = 0; #ifdef OF_WII GXRModeObj *rmode; void *xfb; @@ -137,26 +139,26 @@ #endif #if defined(OF_WII) || defined(OF_PSP) || defined(OF_NINTENDO_DS) || \ defined(OF_NINTENDO_3DS) @try { - return of_application_main(&argc, &argv, + return OFApplicationMain(&argc, &argv, [[TestsAppDelegate alloc] init]); } @catch (id e) { OFString *string = [OFString stringWithFormat: @"\nRuntime error: Unhandled exception:\n%@\n", e]; OFString *backtrace = [OFString stringWithFormat: @"\nBacktrace:\n %@\n\n", [[e backtrace] componentsJoinedByString: @"\n "]]; - [of_stdout setForegroundColor: [OFColor red]]; - [of_stdout writeString: string]; - [of_stdout writeString: backtrace]; + [OFStdOut setForegroundColor: [OFColor red]]; + [OFStdOut writeString: string]; + [OFStdOut writeString: backtrace]; # if defined(OF_WII) - [of_stdout reset]; - [of_stdout writeString: @"Press home button to exit!"]; + [OFStdOut reset]; + [OFStdOut writeString: @"Press home button to exit!"]; for (;;) { WPAD_ScanPads(); if (WPAD_ButtonsDown(0) & WPAD_BUTTON_HOME) @@ -165,22 +167,22 @@ VIDEO_WaitVSync(); } # elif defined(OF_PSP) sceKernelSleepThreadCB(); # elif defined(OF_NINTENDO_DS) - [of_stdout reset]; - [of_stdout writeString: @"Press start button to exit!"]; + [OFStdOut reset]; + [OFStdOut writeString: @"Press start button to exit!"]; for (;;) { swiWaitForVBlank(); scanKeys(); if (keysDown() & KEY_START) [OFApplication terminateWithStatus: 1]; } # elif defined(OF_NINTENDO_3DS) - [of_stdout reset]; - [of_stdout writeString: @"Press start button to exit!"]; + [OFStdOut reset]; + [OFStdOut writeString: @"Press start button to exit!"]; for (;;) { hidScanInput(); if (hidKeysDown() & KEY_START) @@ -191,48 +193,47 @@ # else abort(); # endif } #else - return of_application_main(&argc, &argv, - [[TestsAppDelegate alloc] init]); + return OFApplicationMain(&argc, &argv, [[TestsAppDelegate alloc] init]); #endif } @implementation TestsAppDelegate - (void)outputTesting: (OFString *)test inModule: (OFString *)module { - if (of_stdout.hasTerminal) { - [of_stdout setForegroundColor: [OFColor yellow]]; - [of_stdout writeFormat: @"[%@] %@: testing...", module, test]; + if (OFStdOut.hasTerminal) { + [OFStdOut setForegroundColor: [OFColor yellow]]; + [OFStdOut writeFormat: @"[%@] %@: testing...", module, test]; } else - [of_stdout writeFormat: @"[%@] %@: ", module, test]; + [OFStdOut writeFormat: @"[%@] %@: ", module, test]; } - (void)outputSuccess: (OFString *)test inModule: (OFString *)module { - if (of_stdout.hasTerminal) { - [of_stdout setForegroundColor: [OFColor lime]]; - [of_stdout eraseLine]; - [of_stdout writeFormat: @"\r[%@] %@: ok\n", module, test]; + if (OFStdOut.hasTerminal) { + [OFStdOut setForegroundColor: [OFColor lime]]; + [OFStdOut eraseLine]; + [OFStdOut writeFormat: @"\r[%@] %@: ok\n", module, test]; } else - [of_stdout writeLine: @"ok"]; + [OFStdOut writeLine: @"ok"]; } - (void)outputFailure: (OFString *)test inModule: (OFString *)module { - if (of_stdout.hasTerminal) { - [of_stdout setForegroundColor: [OFColor red]]; - [of_stdout eraseLine]; - [of_stdout writeFormat: @"\r[%@] %@: failed\n", module, test]; + if (OFStdOut.hasTerminal) { + [OFStdOut setForegroundColor: [OFColor red]]; + [OFStdOut eraseLine]; + [OFStdOut writeFormat: @"\r[%@] %@: failed\n", module, test]; #ifdef OF_WII - [of_stdout reset]; - [of_stdout writeLine: @"Press A to continue!"]; + [OFStdOut reset]; + [OFStdOut writeLine: @"Press A to continue!"]; for (;;) { WPAD_ScanPads(); if (WPAD_ButtonsDown(0) & WPAD_BUTTON_A) @@ -240,12 +241,12 @@ VIDEO_WaitVSync(); } #endif #ifdef OF_PSP - [of_stdout reset]; - [of_stdout writeLine: @"Press X to continue!"]; + [OFStdOut reset]; + [OFStdOut writeLine: @"Press X to continue!"]; for (;;) { SceCtrlData pad; sceCtrlReadBufferPositive(&pad, 1); @@ -257,23 +258,23 @@ } } } #endif #ifdef OF_NINTENDO_DS - [of_stdout reset]; - [of_stdout writeString: @"Press A to continue!"]; + [OFStdOut reset]; + [OFStdOut writeString: @"Press A to continue!"]; for (;;) { swiWaitForVBlank(); scanKeys(); if (keysDown() & KEY_A) break; } #endif #ifdef OF_NINTENDO_3DS - [of_stdout reset]; - [of_stdout writeString: @"Press A to continue!"]; + [OFStdOut reset]; + [OFStdOut writeString: @"Press A to continue!"]; for (;;) { hidScanInput(); if (hidKeysDown() & KEY_A) @@ -281,15 +282,15 @@ gspWaitForVBlank(); } #endif - [of_stdout writeString: @"\r"]; - [of_stdout reset]; - [of_stdout eraseLine]; + [OFStdOut writeString: @"\r"]; + [OFStdOut reset]; + [OFStdOut eraseLine]; } else - [of_stdout writeLine: @"failed"]; + [OFStdOut writeLine: @"failed"]; } - (void)applicationDidFinishLaunching { #if defined(OF_IOS) && defined(OF_HAVE_FILES) @@ -297,11 +298,11 @@ CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(mainBundle); UInt8 resourcesPath[PATH_MAX]; if (!CFURLGetFileSystemRepresentation(resourcesURL, true, resourcesPath, PATH_MAX)) { - [of_stderr writeString: @"Failed to locate resources!\n"]; + [OFStdErr writeString: @"Failed to locate resources!\n"]; [OFApplication terminateWithStatus: 1]; } [[OFFileManager defaultManager] changeCurrentDirectoryPath: [OFString stringWithUTF8String: (const char *)resourcesPath]]; @@ -389,17 +390,17 @@ [self DNSResolverTests]; #endif [self systemInfoTests]; [self localeTests]; - [of_stdout reset]; + [OFStdOut reset]; #if defined(OF_IOS) - [of_stdout writeFormat: @"%d tests failed!", _fails]; + [OFStdOut writeFormat: @"%d tests failed!", _fails]; [OFApplication terminateWithStatus: _fails]; #elif defined(OF_WII) - [of_stdout writeString: @"Press home button to exit!"]; + [OFStdOut writeString: @"Press home button to exit!"]; for (;;) { WPAD_ScanPads(); if (WPAD_ButtonsDown(0) & WPAD_BUTTON_HOME) @@ -406,24 +407,24 @@ [OFApplication terminateWithStatus: _fails]; VIDEO_WaitVSync(); } #elif defined(OF_PSP) - [of_stdout writeFormat: @"%d tests failed!", _fails]; + [OFStdOut writeFormat: @"%d tests failed!", _fails]; sceKernelSleepThreadCB(); #elif defined(OF_NINTENDO_DS) - [of_stdout writeString: @"Press start button to exit!"]; + [OFStdOut writeString: @"Press start button to exit!"]; for (;;) { swiWaitForVBlank(); scanKeys(); if (keysDown() & KEY_START) [OFApplication terminateWithStatus: _fails]; } #elif defined(OF_NINTENDO_3DS) - [of_stdout writeString: @"Press start button to exit!"]; + [OFStdOut writeString: @"Press start button to exit!"]; for (;;) { hidScanInput(); if (hidKeysDown() & KEY_START) Index: tests/plugin/TestPlugin.m ================================================================== --- tests/plugin/TestPlugin.m +++ tests/plugin/TestPlugin.m @@ -43,9 +43,9 @@ return num * 2; } @end id -init_plugin(void) +OFPluginInit(void) { return [[[TestPlugin alloc] init] autorelease]; } Index: tests/terminal/TerminalTests.m ================================================================== --- tests/terminal/TerminalTests.m +++ tests/terminal/TerminalTests.m @@ -36,84 +36,84 @@ [OFColor yellow], [OFColor navy], [OFColor blue], [OFColor teal], [OFColor aqua], nil]; size_t i; OFEnumerator OF_GENERIC(OFColor *) *reverseEnumerator; - [of_stdout writeFormat: @"%dx%d\n", of_stdout.columns, of_stdout.rows]; + [OFStdOut writeFormat: @"%dx%d\n", OFStdOut.columns, OFStdOut.rows]; i = 0; for (OFColor *color in colors) { - [of_stdout setForegroundColor: color]; - [of_stdout writeFormat: @"%zx", i++]; + [OFStdOut setForegroundColor: color]; + [OFStdOut writeFormat: @"%zx", i++]; } - [of_stdout reset]; - [of_stdout writeLine: @"R"]; + [OFStdOut reset]; + [OFStdOut writeLine: @"R"]; i = 0; for (OFColor *color in colors) { - [of_stdout setBackgroundColor: color]; - [of_stdout writeFormat: @"%zx", i++]; + [OFStdOut setBackgroundColor: color]; + [OFStdOut writeFormat: @"%zx", i++]; } - [of_stdout reset]; - [of_stdout writeLine: @"R"]; + [OFStdOut reset]; + [OFStdOut writeLine: @"R"]; i = 0; reverseEnumerator = [colors.reversedArray objectEnumerator]; for (OFColor *color in colors) { - [of_stdout setForegroundColor: color]; - [of_stdout setBackgroundColor: [reverseEnumerator nextObject]]; - [of_stdout writeFormat: @"%zx", i++]; + [OFStdOut setForegroundColor: color]; + [OFStdOut setBackgroundColor: [reverseEnumerator nextObject]]; + [OFStdOut writeFormat: @"%zx", i++]; } - [of_stdout reset]; - [of_stdout writeLine: @"R"]; + [OFStdOut reset]; + [OFStdOut writeLine: @"R"]; for (i = 0; i < colors.count * 2; i++) { if (i % 2) - [of_stdout setBackgroundColor: [colors objectAtIndex: + [OFStdOut setBackgroundColor: [colors objectAtIndex: ((i / 2) + 2) % colors.count]]; else - [of_stdout setForegroundColor: + [OFStdOut setForegroundColor: [colors objectAtIndex: i / 2]]; - [of_stdout writeFormat: @"%zx", i / 2]; - } - [of_stdout reset]; - [of_stdout writeLine: @"R"]; - - [of_stdout writeLine: @"Press return"]; - [of_stdin readLine]; - - [of_stdout setBackgroundColor: [OFColor green]]; - [of_stdout writeString: @"Hello!"]; - [OFThread sleepForTimeInterval: 2]; - [of_stdout eraseLine]; - [of_stdout writeString: @"World!"]; - [OFThread sleepForTimeInterval: 2]; - - [of_stdout clear]; - [OFThread sleepForTimeInterval: 2]; - - [of_stdout setCursorPosition: of_point(5, 3)]; - [of_stdout writeString: @"Text at (5, 3)"]; - [OFThread sleepForTimeInterval: 2]; - - [of_stdout setRelativeCursorPosition: of_point(-2, 0)]; - [OFThread sleepForTimeInterval: 2]; - [of_stdout setRelativeCursorPosition: of_point(2, 0)]; - [OFThread sleepForTimeInterval: 2]; - [of_stdout setRelativeCursorPosition: of_point(0, -2)]; - [OFThread sleepForTimeInterval: 2]; - [of_stdout setRelativeCursorPosition: of_point(0, 2)]; - [OFThread sleepForTimeInterval: 2]; - [of_stdout setRelativeCursorPosition: of_point(1, 1)]; - [OFThread sleepForTimeInterval: 2]; - [of_stdout setRelativeCursorPosition: of_point(-1, -1)]; - [OFThread sleepForTimeInterval: 2]; - - [of_stdout setCursorColumn: 2]; - [OFThread sleepForTimeInterval: 2]; - - [of_stdout reset]; + [OFStdOut writeFormat: @"%zx", i / 2]; + } + [OFStdOut reset]; + [OFStdOut writeLine: @"R"]; + + [OFStdOut writeLine: @"Press return"]; + [OFStdIn readLine]; + + [OFStdOut setBackgroundColor: [OFColor green]]; + [OFStdOut writeString: @"Hello!"]; + [OFThread sleepForTimeInterval: 2]; + [OFStdOut eraseLine]; + [OFStdOut writeString: @"World!"]; + [OFThread sleepForTimeInterval: 2]; + + [OFStdOut clear]; + [OFThread sleepForTimeInterval: 2]; + + [OFStdOut setCursorPosition: OFPointMake(5, 3)]; + [OFStdOut writeString: @"Text at (5, 3)"]; + [OFThread sleepForTimeInterval: 2]; + + [OFStdOut setRelativeCursorPosition: OFPointMake(-2, 0)]; + [OFThread sleepForTimeInterval: 2]; + [OFStdOut setRelativeCursorPosition: OFPointMake(2, 0)]; + [OFThread sleepForTimeInterval: 2]; + [OFStdOut setRelativeCursorPosition: OFPointMake(0, -2)]; + [OFThread sleepForTimeInterval: 2]; + [OFStdOut setRelativeCursorPosition: OFPointMake(0, 2)]; + [OFThread sleepForTimeInterval: 2]; + [OFStdOut setRelativeCursorPosition: OFPointMake(1, 1)]; + [OFThread sleepForTimeInterval: 2]; + [OFStdOut setRelativeCursorPosition: OFPointMake(-1, -1)]; + [OFThread sleepForTimeInterval: 2]; + + [OFStdOut setCursorColumn: 2]; + [OFThread sleepForTimeInterval: 2]; + + [OFStdOut reset]; [OFApplication terminate]; } @end Index: utils/ofarc/Archive.h ================================================================== --- utils/ofarc/Archive.h +++ utils/ofarc/Archive.h @@ -18,15 +18,15 @@ #import "OFArray.h" @protocol Archive + (instancetype)archiveWithStream: (OF_KINDOF(OFStream *))stream mode: (OFString *)mode - encoding: (of_string_encoding_t)encoding; + encoding: (OFStringEncoding)encoding; - (instancetype)initWithStream: (OF_KINDOF(OFStream *))stream mode: (OFString *)mode - encoding: (of_string_encoding_t)encoding; + encoding: (OFStringEncoding)encoding; - (void)listFiles; - (void)extractFiles: (OFArray OF_GENERIC(OFString *) *)files; - (void)printFiles: (OFArray OF_GENERIC(OFString *) *)files; @optional - (void)addFiles: (OFArray OF_GENERIC(OFString *) *)files; @end Index: utils/ofarc/GZIPArchive.m ================================================================== --- utils/ofarc/GZIPArchive.m +++ utils/ofarc/GZIPArchive.m @@ -28,14 +28,14 @@ static void setPermissions(OFString *destination, OFString *source) { #ifdef OF_FILE_MANAGER_SUPPORTS_PERMISSIONS OFFileManager *fileManager = [OFFileManager defaultManager]; - of_file_attributes_t attributes = - [fileManager attributesOfItemAtPath: source]; - of_file_attribute_key_t key = of_file_attribute_key_posix_permissions; - of_file_attributes_t destinationAttributes = [OFDictionary + OFFileAttributes attributes = [fileManager + attributesOfItemAtPath: source]; + OFFileAttributeKey key = OFFilePOSIXPermissions; + OFFileAttributes destinationAttributes = [OFDictionary dictionaryWithObject: [attributes objectForKey: key] forKey: key]; [fileManager setAttributes: destinationAttributes ofItemAtPath: destination]; @@ -44,18 +44,18 @@ static void setModificationDate(OFString *path, OFGZIPStream *stream) { OFDate *modificationDate = stream.modificationDate; - of_file_attributes_t attributes; + OFFileAttributes attributes; if (modificationDate == nil) return; attributes = [OFDictionary dictionaryWithObject: modificationDate - forKey: of_file_attribute_key_modification_date]; + forKey: OFFileModificationDate]; [[OFFileManager defaultManager] setAttributes: attributes ofItemAtPath: path]; } @implementation GZIPArchive @@ -65,20 +65,20 @@ app = (OFArc *)[OFApplication sharedApplication].delegate; } + (instancetype)archiveWithStream: (OF_KINDOF(OFStream *))stream mode: (OFString *)mode - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { return [[[self alloc] initWithStream: stream mode: mode encoding: encoding] autorelease]; } - (instancetype)initWithStream: (OF_KINDOF(OFStream *))stream mode: (OFString *)mode - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { self = [super init]; @try { _stream = [[OFGZIPStream alloc] initWithStream: stream @@ -98,11 +98,11 @@ [super dealloc]; } - (void)listFiles { - [of_stderr writeLine: OF_LOCALIZED(@"cannot_list_gz", + [OFStdErr writeLine: OF_LOCALIZED(@"cannot_list_gz", @"Cannot list files of a .gz archive!")]; app->_exitStatus = 1; } - (void)extractFiles: (OFArray OF_GENERIC(OFString *) *)files @@ -109,11 +109,11 @@ { OFString *fileName; OFFile *output; if (files.count != 0) { - [of_stderr writeLine: + [OFStdErr writeLine: OF_LOCALIZED(@"cannot_extract_specific_file_from_gz", @"Cannot extract a specific file of a .gz archive!")]; app->_exitStatus = 1; return; } @@ -120,11 +120,11 @@ fileName = app->_archivePath.lastPathComponent .stringByDeletingPathExtension; if (app->_outputLevel >= 0) - [of_stdout writeString: OF_LOCALIZED(@"extracting_file", + [OFStdOut writeString: OF_LOCALIZED(@"extracting_file", @"Extracting %[file]...", @"file", fileName)]; if (![app shouldExtractFile: fileName outFileName: fileName]) return; @@ -145,12 +145,12 @@ [output close]; setModificationDate(fileName, _stream); if (app->_outputLevel >= 0) { - [of_stdout writeString: @"\r"]; - [of_stdout writeLine: OF_LOCALIZED(@"extracting_file_done", + [OFStdOut writeString: @"\r"]; + [OFStdOut writeLine: OF_LOCALIZED(@"extracting_file_done", @"Extracting %[file]... done", @"file", fileName)]; } } @@ -158,24 +158,24 @@ { OFString *fileName = app->_archivePath.lastPathComponent .stringByDeletingPathExtension; if (files.count > 0) { - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeLine: OF_LOCALIZED( @"cannot_print_specific_file_from_gz", @"Cannot print a specific file of a .gz archive!")]; app->_exitStatus = 1; return; } while (!_stream.atEndOfStream) { ssize_t length = [app copyBlockFromStream: _stream - toStream: of_stdout + toStream: OFStdOut fileName: fileName]; if (length < 0) { app->_exitStatus = 1; return; } } } @end Index: utils/ofarc/LHAArchive.m ================================================================== --- utils/ofarc/LHAArchive.m +++ utils/ofarc/LHAArchive.m @@ -46,13 +46,13 @@ return; mode = [OFNumber numberWithUnsignedShort: mode.unsignedShortValue & 0777]; - of_file_attributes_t attributes = [OFDictionary + OFFileAttributes attributes = [OFDictionary dictionaryWithObject: mode - forKey: of_file_attribute_key_posix_permissions]; + forKey: OFFilePOSIXPermissions]; [[OFFileManager defaultManager] setAttributes: attributes ofItemAtPath: path]; #endif } @@ -59,11 +59,11 @@ static void setModificationDate(OFString *path, OFLHAArchiveEntry *entry) { OFDate *modificationDate = entry.modificationDate; - of_file_attributes_t attributes; + OFFileAttributes attributes; if (modificationDate == nil) { /* * Fall back to the original date if we have no modification * date, as the modification date is a UNIX extension. @@ -74,11 +74,11 @@ return; } attributes = [OFDictionary dictionaryWithObject: modificationDate - forKey: of_file_attribute_key_modification_date]; + forKey: OFFileModificationDate]; [[OFFileManager defaultManager] setAttributes: attributes ofItemAtPath: path]; } @implementation LHAArchive @@ -88,28 +88,28 @@ app = (OFArc *)[OFApplication sharedApplication].delegate; } + (instancetype)archiveWithStream: (OF_KINDOF(OFStream *))stream mode: (OFString *)mode - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { return [[[self alloc] initWithStream: stream mode: mode encoding: encoding] autorelease]; } - (instancetype)initWithStream: (OF_KINDOF(OFStream *))stream mode: (OFString *)mode - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { self = [super init]; @try { _archive = [[OFLHAArchive alloc] initWithStream: stream mode: mode]; - if (encoding != OF_STRING_ENCODING_AUTODETECT) + if (encoding != OFStringEncodingAutodetect) _archive.encoding = encoding; } @catch (id e) { [self release]; @throw e; } @@ -129,11 +129,11 @@ OFLHAArchiveEntry *entry; while ((entry = [_archive nextEntry]) != nil) { void *pool = objc_autoreleasePoolPush(); - [of_stdout writeLine: entry.fileName]; + [OFStdOut writeLine: entry.fileName]; if (app->_outputLevel >= 1) { OFString *date = [entry.date localDateStringWithFormat: @"%Y-%m-%d %H:%M:%S"]; OFString *compressedSize = [OFString stringWithFormat: @@ -141,78 +141,78 @@ OFString *uncompressedSize = [OFString stringWithFormat: @"%" PRIu32, entry.uncompressedSize]; OFString *CRC16 = [OFString stringWithFormat: @"%04" PRIX16, entry.CRC16]; - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED( @"list_compressed_size", @"[" @" 'Compressed: '," @" [" @" {'size == 1': '1 byte'}," @" {'': '%[size] bytes'}" @" ]" @"]".objectByParsingJSON, @"size", compressedSize)]; - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED( @"list_uncompressed_size", @"[" @" 'Uncompressed: '," @" [" @" {'size == 1': '1 byte'}," @" {'': '%[size] bytes'}" @" ]" @"]".objectByParsingJSON, @"size", uncompressedSize)]; - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED( @"list_compression_method", @"Compression method: %[method]", @"method", entry.compressionMethod)]; - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED(@"list_crc16", + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED(@"list_crc16", @"CRC16: %[crc16]", @"crc16", CRC16)]; - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED(@"list_date", + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED(@"list_date", @"Date: %[date]", @"date", date)]; if (entry.mode != nil) { OFString *modeString = [OFString stringWithFormat: @"%ho", entry.mode.unsignedShortValue]; - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED(@"list_mode", + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED(@"list_mode", @"Mode: %[mode]", @"mode", modeString)]; } if (entry.UID != nil) { - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED(@"list_uid", + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED(@"list_uid", @"UID: %[uid]", @"uid", entry.UID)]; } if (entry.GID != nil) { - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED(@"list_gid", + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED(@"list_gid", @"GID: %[gid]", @"gid", entry.GID)]; } if (entry.owner != nil) { - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED( @"list_owner", @"Owner: %[owner]", @"owner", entry.owner)]; } if (entry.group != nil) { - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED( @"list_group", @"Group: %[group]", @"group", entry.group)]; } @@ -219,23 +219,23 @@ if (app->_outputLevel >= 2) { OFString *headerLevel = [OFString stringWithFormat: @"%" PRIu8, entry.headerLevel]; - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED( @"list_header_level", @"Header level: %[level]", @"level", headerLevel)]; if (entry.operatingSystemIdentifier != '\0') { OFString *OSID = [OFString stringWithFormat: @"%c", entry.operatingSystemIdentifier]; - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED( @"list_osid", @"Operating system identifier: " "%[osid]", @"osid", OSID)]; } @@ -242,12 +242,12 @@ if (entry.modificationDate != nil) { OFString *modificationDate = entry.modificationDate.description; - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED( @"list_modification_date", @"Modification date: %[date]", @"date", modificationDate)]; } } @@ -254,12 +254,12 @@ if (app->_outputLevel >= 3) { OFString *extensions = indent(entry.extensions.description); - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED( @"list_extensions", @"Extensions: %[extensions]", @"extensions", extensions)]; } } @@ -290,21 +290,21 @@ [missing removeObject: fileName]; outFileName = [app safeLocalPathForPath: fileName]; if (outFileName == nil) { - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeLine: OF_LOCALIZED( @"refusing_to_extract_file", @"Refusing to extract %[file]!", @"file", fileName)]; app->_exitStatus = 1; goto outer_loop_end; } if (app->_outputLevel >= 0) - [of_stdout writeString: OF_LOCALIZED(@"extracting_file", + [OFStdOut writeString: OF_LOCALIZED(@"extracting_file", @"Extracting %[file]...", @"file", fileName)]; if ([fileName hasSuffix: @"/"]) { [fileManager createDirectoryAtPath: outFileName @@ -311,12 +311,12 @@ createParents: true]; setPermissions(outFileName, entry); setModificationDate(outFileName, entry); if (app->_outputLevel >= 0) { - [of_stdout writeString: @"\r"]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\r"]; + [OFStdOut writeLine: OF_LOCALIZED( @"extracting_file_done", @"Extracting %[file]... done", @"file", fileName)]; } @@ -354,12 +354,12 @@ percent = newPercent; percentString = [OFString stringWithFormat: @"%3u", percent]; - [of_stdout writeString: @"\r"]; - [of_stdout writeString: OF_LOCALIZED( + [OFStdOut writeString: @"\r"]; + [OFStdOut writeString: OF_LOCALIZED( @"extracting_file_percent", @"Extracting %[file]... %[percent]%", @"file", fileName, @"percent", percentString)]; } @@ -367,12 +367,12 @@ [output close]; setModificationDate(outFileName, entry); if (app->_outputLevel >= 0) { - [of_stdout writeString: @"\r"]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\r"]; + [OFStdOut writeLine: OF_LOCALIZED( @"extracting_file_done", @"Extracting %[file]... done", @"file", fileName)]; } @@ -380,11 +380,11 @@ objc_autoreleasePoolPop(pool); } if (missing.count > 0) { for (OFString *file in missing) - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeLine: OF_LOCALIZED( @"file_not_in_archive", @"File %[file] is not in the archive!", @"file", file)]; app->_exitStatus = 1; @@ -395,11 +395,11 @@ { OFMutableSet *files; OFLHAArchiveEntry *entry; if (files_.count < 1) { - [of_stderr writeLine: OF_LOCALIZED(@"print_no_file_specified", + [OFStdErr writeLine: OF_LOCALIZED(@"print_no_file_specified", @"Need one or more files to print!")]; app->_exitStatus = 1; return; } @@ -414,11 +414,11 @@ stream = [_archive streamForReadingCurrentEntry]; while (!stream.atEndOfStream) { ssize_t length = [app copyBlockFromStream: stream - toStream: of_stdout + toStream: OFStdOut fileName: fileName]; if (length < 0) { app->_exitStatus = 1; return; @@ -431,11 +431,11 @@ if (files.count == 0) break; } for (OFString *file in files) { - [of_stderr writeLine: OF_LOCALIZED(@"file_not_in_archive", + [OFStdErr writeLine: OF_LOCALIZED(@"file_not_in_archive", @"File %[file] is not in the archive!", @"file", file)]; app->_exitStatus = 1; } } @@ -443,25 +443,25 @@ - (void)addFiles: (OFArray OF_GENERIC(OFString *) *)files { OFFileManager *fileManager = [OFFileManager defaultManager]; if (files.count < 1) { - [of_stderr writeLine: OF_LOCALIZED(@"add_no_file_specified", + [OFStdErr writeLine: OF_LOCALIZED(@"add_no_file_specified", @"Need one or more files to add!")]; app->_exitStatus = 1; return; } for (OFString *fileName in files) { void *pool = objc_autoreleasePoolPush(); - of_file_attributes_t attributes; - of_file_type_t type; + OFFileAttributes attributes; + OFFileAttributeType type; OFMutableLHAArchiveEntry *entry; OFStream *output; if (app->_outputLevel >= 0) - [of_stdout writeString: OF_LOCALIZED(@"adding_file", + [OFStdOut writeString: OF_LOCALIZED(@"adding_file", @"Adding %[file]...", @"file", fileName)]; attributes = [fileManager attributesOfItemAtPath: fileName]; type = attributes.fileType; @@ -472,24 +472,24 @@ attributes.filePOSIXPermissions]; #endif entry.date = attributes.fileModificationDate; #ifdef OF_FILE_MANAGER_SUPPORTS_OWNER - entry.UID = - [OFNumber numberWithUnsignedLong: attributes.filePOSIXUID]; - entry.GID = - [OFNumber numberWithUnsignedLong: attributes.filePOSIXGID]; - entry.owner = attributes.fileOwner; - entry.group = attributes.fileGroup; + entry.UID = [OFNumber numberWithUnsignedLong: + attributes.fileOwnerAccountID]; + entry.GID = [OFNumber numberWithUnsignedLong: + attributes.fileGroupOwnerAccountID]; + entry.owner = attributes.fileOwnerAccountName; + entry.group = attributes.fileGroupOwnerAccountName; #endif - if ([type isEqual: of_file_type_directory]) + if ([type isEqual: OFFileTypeDirectory]) entry.compressionMethod = @"-lhd-"; output = [_archive streamForWritingEntry: entry]; - if ([type isEqual: of_file_type_regular]) { + if ([type isEqual: OFFileTypeRegular]) { unsigned long long written = 0; unsigned long long size = attributes.fileSize; int8_t percent = -1, newPercent; OFFile *input = [OFFile fileWithPath: fileName @@ -516,23 +516,23 @@ percent = newPercent; percentString = [OFString stringWithFormat: @"%3u", percent]; - [of_stdout writeString: @"\r"]; - [of_stdout writeString: OF_LOCALIZED( + [OFStdOut writeString: @"\r"]; + [OFStdOut writeString: OF_LOCALIZED( @"adding_file_percent", @"Adding %[file]... %[percent]%", @"file", fileName, @"percent", percentString)]; } } } if (app->_outputLevel >= 0) { - [of_stdout writeString: @"\r"]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\r"]; + [OFStdOut writeLine: OF_LOCALIZED( @"adding_file_done", @"Adding %[file]... done", @"file", fileName)]; } Index: utils/ofarc/OFArc.h ================================================================== --- utils/ofarc/OFArc.h +++ utils/ofarc/OFArc.h @@ -37,15 +37,15 @@ } - (id )openArchiveWithPath: (OFString *)path type: (OFString *)type mode: (char)mode - encoding: (of_string_encoding_t)encoding; + encoding: (OFStringEncoding)encoding; - (bool)shouldExtractFile: (OFString *)fileName outFileName: (OFString *)outFileName; - (ssize_t)copyBlockFromStream: (OFStream *)input toStream: (OFStream *)output fileName: (OFString *)fileName; - (nullable OFString *)safeLocalPathForPath: (OFString *)path; @end OF_ASSUME_NONNULL_END Index: utils/ofarc/OFArc.m ================================================================== --- utils/ofarc/OFArc.m +++ utils/ofarc/OFArc.m @@ -40,11 +40,11 @@ #import "OFOpenItemFailedException.h" #import "OFReadFailedException.h" #import "OFSeekFailedException.h" #import "OFWriteFailedException.h" -#define BUFFER_SIZE 4096 +#define bufferSize 4096 OF_APPLICATION_DELEGATE(OFArc) static void help(OFStream *stream, bool full, int status) @@ -79,19 +79,19 @@ [OFApplication terminateWithStatus: status]; } static void -mutuallyExclusiveError(of_unichar_t shortOption1, OFString *longOption1, - of_unichar_t shortOption2, OFString *longOption2) +mutuallyExclusiveError(OFUnichar shortOption1, OFString *longOption1, + OFUnichar shortOption2, OFString *longOption2) { OFString *shortOption1Str = [OFString stringWithFormat: @"%C", shortOption1]; OFString *shortOption2Str = [OFString stringWithFormat: @"%C", shortOption2]; - [of_stderr writeLine: OF_LOCALIZED(@"2_options_mutually_exclusive", + [OFStdErr writeLine: OF_LOCALIZED(@"2_options_mutually_exclusive", @"Error: -%[shortopt1] / --%[longopt1] and " @"-%[shortopt2] / --%[longopt2] " @"are mutually exclusive!", @"shortopt1", shortOption1Str, @"longopt1", longOption1, @@ -99,15 +99,15 @@ @"longopt2", longOption2)]; [OFApplication terminateWithStatus: 1]; } static void -mutuallyExclusiveError5(of_unichar_t shortOption1, OFString *longOption1, - of_unichar_t shortOption2, OFString *longOption2, - of_unichar_t shortOption3, OFString *longOption3, - of_unichar_t shortOption4, OFString *longOption4, - of_unichar_t shortOption5, OFString *longOption5) +mutuallyExclusiveError5(OFUnichar shortOption1, OFString *longOption1, + OFUnichar shortOption2, OFString *longOption2, + OFUnichar shortOption3, OFString *longOption3, + OFUnichar shortOption4, OFString *longOption4, + OFUnichar shortOption5, OFString *longOption5) { OFString *shortOption1Str = [OFString stringWithFormat: @"%C", shortOption1]; OFString *shortOption2Str = [OFString stringWithFormat: @"%C", shortOption2]; @@ -116,11 +116,11 @@ OFString *shortOption4Str = [OFString stringWithFormat: @"%C", shortOption4]; OFString *shortOption5Str = [OFString stringWithFormat: @"%C", shortOption5]; - [of_stderr writeLine: OF_LOCALIZED(@"5_options_mutually_exclusive", + [OFStdErr writeLine: OF_LOCALIZED(@"5_options_mutually_exclusive", @"Error: -%[shortopt1] / --%[longopt1], " @"-%[shortopt2] / --%[longopt2], -%[shortopt3] / --%[longopt3], " @"-%[shortopt4] / --%[longopt4] and\n" @" -%[shortopt5] / --%[longopt5] are mutually exclusive!", @"shortopt1", shortOption1Str, @@ -137,21 +137,21 @@ } static void writingNotSupported(OFString *type) { - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeLine: OF_LOCALIZED( @"writing_not_supported", @"Writing archives of type %[type] is not (yet) supported!", @"type", type)]; } @implementation OFArc - (void)applicationDidFinishLaunching { OFString *outputDir, *encodingString, *type; - const of_options_parser_option_t options[] = { + const OFOptionsParserOption options[] = { { 'a', @"append", 0, NULL, NULL }, { 'c', @"create", 0, NULL, NULL }, { 'C', @"directory", 1, NULL, &outputDir }, { 'E', @"encoding", 1, NULL, &encodingString }, { 'f', @"force", 0, NULL, NULL }, @@ -163,12 +163,12 @@ { 't', @"type", 1, NULL, &type }, { 'v', @"verbose", 0, NULL, NULL }, { 'x', @"extract", 0, NULL, NULL }, { '\0', nil, 0, NULL, NULL } }; - of_unichar_t option, mode = '\0'; - of_string_encoding_t encoding = OF_STRING_ENCODING_AUTODETECT; + OFUnichar option, mode = '\0'; + OFStringEncoding encoding = OFStringEncodingAutodetect; OFOptionsParser *optionsParser; OFArray OF_GENERIC(OFString *) *remainingArguments, *files; id archive; #ifdef OF_HAVE_SANDBOX @@ -180,11 +180,11 @@ sandbox.allowsChangingFileAttributes = true; sandbox.allowsUserDatabaseReading = true; /* Dropped after parsing options */ sandbox.allowsUnveil = true; - [OFApplication activateSandbox: sandbox]; + [OFApplication of_activateSandbox: sandbox]; #endif #ifndef OF_AMIGAOS [OFLocale addLanguageDirectory: @LANGUAGE_DIR]; #else @@ -236,34 +236,34 @@ 'x', @"extract"); mode = option; break; case 'h': - help(of_stdout, true, 0); + help(OFStdOut, true, 0); break; case '=': - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeLine: OF_LOCALIZED( @"option_takes_no_argument", @"%[prog]: Option --%[opt] takes no argument", @"prog", [OFApplication programName], @"opt", optionsParser.lastLongOption)]; [OFApplication terminateWithStatus: 1]; break; case ':': if (optionsParser.lastLongOption != nil) - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeLine: OF_LOCALIZED( @"long_option_requires_argument", @"%[prog]: Option --%[opt] requires an " @"argument", @"prog", [OFApplication programName], @"opt", optionsParser.lastLongOption)]; else { OFString *optStr = [OFString stringWithFormat: @"%C", optionsParser.lastOption]; - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeLine: OF_LOCALIZED( @"option_requires_argument", @"%[prog]: Option -%[opt] requires an " @"argument", @"prog", [OFApplication programName], @"opt", optStr)]; @@ -271,20 +271,20 @@ [OFApplication terminateWithStatus: 1]; break; case '?': if (optionsParser.lastLongOption != nil) - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeLine: OF_LOCALIZED( @"unknown_long_option", @"%[prog]: Unknown option: --%[opt]", @"prog", [OFApplication programName], @"opt", optionsParser.lastLongOption)]; else { OFString *optStr = [OFString stringWithFormat: @"%C", optionsParser.lastOption]; - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeLine: OF_LOCALIZED( @"unknown_option", @"%[prog]: Unknown option: -%[opt]", @"prog", [OFApplication programName], @"opt", optStr)]; } @@ -294,13 +294,13 @@ } } @try { if (encodingString != nil) - encoding = of_string_parse_encoding(encodingString); + encoding = OFStringEncodingParseName(encodingString); } @catch (OFInvalidArgumentException *e) { - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeLine: OF_LOCALIZED( @"invalid_encoding", @"%[prog]: Invalid encoding: %[encoding]", @"prog", [OFApplication programName], @"encoding", encodingString)]; @@ -311,14 +311,14 @@ switch (mode) { case 'a': case 'c': if (remainingArguments.count < 1) - help(of_stderr, false, 1); + help(OFStdErr, false, 1); files = [remainingArguments objectsInRange: - of_range(1, remainingArguments.count - 1)]; + OFRangeMake(1, remainingArguments.count - 1)]; #ifdef OF_HAVE_SANDBOX if (![remainingArguments.firstObject isEqual: @"-"]) [sandbox unveilPath: remainingArguments.firstObject permissions: (mode == 'a' ? @"rwc" : @"wc")]; @@ -325,11 +325,11 @@ for (OFString *path in files) [sandbox unveilPath: path permissions: @"r"]; sandbox.allowsUnveil = false; - [OFApplication activateSandbox: sandbox]; + [OFApplication of_activateSandbox: sandbox]; #endif archive = [self openArchiveWithPath: remainingArguments.firstObject type: type @@ -338,19 +338,19 @@ [archive addFiles: files]; break; case 'l': if (remainingArguments.count != 1) - help(of_stderr, false, 1); + help(OFStdErr, false, 1); #ifdef OF_HAVE_SANDBOX if (![remainingArguments.firstObject isEqual: @"-"]) [sandbox unveilPath: remainingArguments.firstObject permissions: @"r"]; sandbox.allowsUnveil = false; - [OFApplication activateSandbox: sandbox]; + [OFApplication of_activateSandbox: sandbox]; #endif archive = [self openArchiveWithPath: remainingArguments.firstObject type: type @@ -359,23 +359,23 @@ [archive listFiles]; break; case 'p': if (remainingArguments.count < 1) - help(of_stderr, false, 1); + help(OFStdErr, false, 1); #ifdef OF_HAVE_SANDBOX if (![remainingArguments.firstObject isEqual: @"-"]) [sandbox unveilPath: remainingArguments.firstObject permissions: @"r"]; sandbox.allowsUnveil = false; - [OFApplication activateSandbox: sandbox]; + [OFApplication of_activateSandbox: sandbox]; #endif files = [remainingArguments objectsInRange: - of_range(1, remainingArguments.count - 1)]; + OFRangeMake(1, remainingArguments.count - 1)]; archive = [self openArchiveWithPath: remainingArguments.firstObject type: type mode: mode @@ -383,14 +383,14 @@ [archive printFiles: files]; break; case 'x': if (remainingArguments.count < 1) - help(of_stderr, false, 1); + help(OFStdErr, false, 1); files = [remainingArguments objectsInRange: - of_range(1, remainingArguments.count - 1)]; + OFRangeMake(1, remainingArguments.count - 1)]; #ifdef OF_HAVE_SANDBOX if (![remainingArguments.firstObject isEqual: @"-"]) [sandbox unveilPath: remainingArguments.firstObject permissions: @"r"]; @@ -397,18 +397,22 @@ if (files.count > 0) for (OFString *path in files) [sandbox unveilPath: path permissions: @"wc"]; else { - OFString *path = (outputDir != nil - ? outputDir : OF_PATH_CURRENT_DIRECTORY); + OFString *path = outputDir; + + if (path == nil) + path = [[OFFileManager defaultManager] + currentDirectoryPath]; + /* We need 'r' to change the directory to it. */ [sandbox unveilPath: path permissions: @"rwc"]; } sandbox.allowsUnveil = false; - [OFApplication activateSandbox: sandbox]; + [OFApplication of_activateSandbox: sandbox]; #endif archive = [self openArchiveWithPath: remainingArguments.firstObject type: type @@ -430,43 +434,43 @@ [archive extractFiles: files]; } @catch (OFCreateDirectoryFailedException *e) { OFString *error = [OFString stringWithCString: strerror(e.errNo) encoding: [OFLocale encoding]]; - [of_stderr writeString: @"\r"]; - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeString: @"\r"]; + [OFStdErr writeLine: OF_LOCALIZED( @"failed_to_create_directory", @"Failed to create directory %[dir]: %[error]", @"dir", e.URL.fileSystemRepresentation, @"error", error)]; _exitStatus = 1; } @catch (OFOpenItemFailedException *e) { OFString *error = [OFString stringWithCString: strerror(e.errNo) encoding: [OFLocale encoding]]; - [of_stderr writeString: @"\r"]; - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeString: @"\r"]; + [OFStdErr writeLine: OF_LOCALIZED( @"failed_to_open_file", @"Failed to open file %[file]: %[error]", @"file", e.path, @"error", error)]; _exitStatus = 1; } break; default: - help(of_stderr, true, 1); + help(OFStdErr, true, 1); break; } [OFApplication terminateWithStatus: _exitStatus]; } - (id )openArchiveWithPath: (OFString *)path type: (OFString *)type mode: (char)mode - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { OFString *modeString, *fileModeString; OFStream *file = nil; id archive = nil; @@ -495,16 +499,16 @@ if ([path isEqual: @"-"]) { switch (mode) { case 'a': case 'c': - file = of_stdout; + file = OFStdOut; break; case 'l': case 'p': case 'x': - file = of_stdin; + file = OFStdIn; break; default: @throw [OFInvalidArgumentException exception]; } } else { @@ -512,12 +516,12 @@ file = [OFFile fileWithPath: path mode: fileModeString]; } @catch (OFOpenItemFailedException *e) { OFString *error = [OFString stringWithCString: strerror(e.errNo) encoding: [OFLocale encoding]]; - [of_stderr writeString: @"\r"]; - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeString: @"\r"]; + [OFStdErr writeLine: OF_LOCALIZED( @"failed_to_open_file", @"Failed to open file %[file]: %[error]", @"file", e.path, @"error", error)]; [OFApplication terminateWithStatus: 1]; @@ -562,11 +566,11 @@ } else if ([type isEqual: @"zip"]) archive = [ZIPArchive archiveWithStream: file mode: modeString encoding: encoding]; else { - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeLine: OF_LOCALIZED( @"unknown_archive_type", @"Unknown archive type: %[type]", @"type", type)]; goto error; } @@ -580,26 +584,26 @@ @throw e; } @catch (OFReadFailedException *e) { OFString *error = [OFString stringWithCString: strerror(e.errNo) encoding: [OFLocale encoding]]; - [of_stderr writeLine: OF_LOCALIZED(@"failed_to_read_file", + [OFStdErr writeLine: OF_LOCALIZED(@"failed_to_read_file", @"Failed to read file %[file]: %[error]", @"file", path, @"error", error)]; goto error; } @catch (OFSeekFailedException *e) { OFString *error = [OFString stringWithCString: strerror(e.errNo) encoding: [OFLocale encoding]]; - [of_stderr writeLine: OF_LOCALIZED(@"failed_to_seek_in_file", + [OFStdErr writeLine: OF_LOCALIZED(@"failed_to_seek_in_file", @"Failed to seek in file %[file]: %[error]", @"file", path, @"error", error)]; goto error; } @catch (OFInvalidFormatException *e) { - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeLine: OF_LOCALIZED( @"file_is_not_a_valid_archive", @"File %[file] is not a valid archive!", @"file", path)]; goto error; } @@ -629,28 +633,28 @@ ![[OFFileManager defaultManager] fileExistsAtPath: outFileName]) return true; if (_overwrite == -1) { if (_outputLevel >= 0) { - [of_stdout writeString: @" "]; - [of_stdout writeLine: + [OFStdOut writeString: @" "]; + [OFStdOut writeLine: OF_LOCALIZED(@"file_skipped", @"skipped")]; } return false; } do { - [of_stderr writeString: @"\r"]; - [of_stderr writeString: OF_LOCALIZED(@"ask_overwrite", + [OFStdErr writeString: @"\r"]; + [OFStdErr writeString: OF_LOCALIZED(@"ask_overwrite", @"Overwrite %[file]? [ynAN?]", @"file", fileName)]; - [of_stderr writeString: @" "]; + [OFStdErr writeString: @" "]; - line = [of_stdin readLine]; + line = [OFStdIn readLine]; if ([line isEqual: @"?"]) - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeLine: OF_LOCALIZED( @"ask_overwrite_help", @" y: yes\n" @" n: no\n" @" A: always\n" @" N: never")]; @@ -662,19 +666,19 @@ else if ([line isEqual: @"N"]) _overwrite = -1; if ([line isEqual: @"n"] || [line isEqual: @"N"]) { if (_outputLevel >= 0) - [of_stdout writeLine: OF_LOCALIZED(@"skipping_file", + [OFStdOut writeLine: OF_LOCALIZED(@"skipping_file", @"Skipping %[file]...", @"file", fileName)]; return false; } if (_outputLevel >= 0) - [of_stdout writeString: OF_LOCALIZED(@"extracting_file", + [OFStdOut writeString: OF_LOCALIZED(@"extracting_file", @"Extracting %[file]...", @"file", fileName)]; return true; } @@ -681,21 +685,21 @@ - (ssize_t)copyBlockFromStream: (OFStream *)input toStream: (OFStream *)output fileName: (OFString *)fileName { - char buffer[BUFFER_SIZE]; + char buffer[bufferSize]; size_t length; @try { - length = [input readIntoBuffer: buffer length: BUFFER_SIZE]; + length = [input readIntoBuffer: buffer length: bufferSize]; } @catch (OFReadFailedException *e) { OFString *error = [OFString stringWithCString: strerror(e.errNo) encoding: [OFLocale encoding]]; - [of_stdout writeString: @"\r"]; - [of_stderr writeLine: OF_LOCALIZED(@"failed_to_read_file", + [OFStdOut writeString: @"\r"]; + [OFStdErr writeLine: OF_LOCALIZED(@"failed_to_read_file", @"Failed to read file %[file]: %[error]", @"file", fileName, @"error", error)]; return -1; } @@ -704,12 +708,12 @@ [output writeBuffer: buffer length: length]; } @catch (OFWriteFailedException *e) { OFString *error = [OFString stringWithCString: strerror(e.errNo) encoding: [OFLocale encoding]]; - [of_stdout writeString: @"\r"]; - [of_stderr writeLine: OF_LOCALIZED(@"failed_to_write_file", + [OFStdOut writeString: @"\r"]; + [OFStdErr writeLine: OF_LOCALIZED(@"failed_to_write_file", @"Failed to write file %[file]: %[error]", @"file", fileName, @"error", error)]; return -1; } Index: utils/ofarc/TarArchive.m ================================================================== --- utils/ofarc/TarArchive.m +++ utils/ofarc/TarArchive.m @@ -32,13 +32,13 @@ static void setPermissions(OFString *path, OFTarArchiveEntry *entry) { #ifdef OF_FILE_MANAGER_SUPPORTS_PERMISSIONS OFNumber *mode = [OFNumber numberWithUnsignedShort: entry.mode & 0777]; - of_file_attributes_t attributes = [OFDictionary + OFFileAttributes attributes = [OFDictionary dictionaryWithObject: mode - forKey: of_file_attribute_key_posix_permissions]; + forKey: OFFilePOSIXPermissions]; [[OFFileManager defaultManager] setAttributes: attributes ofItemAtPath: path]; #endif } @@ -45,18 +45,18 @@ static void setModificationDate(OFString *path, OFTarArchiveEntry *entry) { OFDate *modificationDate = entry.modificationDate; - of_file_attributes_t attributes; + OFFileAttributes attributes; if (modificationDate == nil) return; attributes = [OFDictionary dictionaryWithObject: modificationDate - forKey: of_file_attribute_key_modification_date]; + forKey: OFFileModificationDate]; [[OFFileManager defaultManager] setAttributes: attributes ofItemAtPath: path]; } @implementation TarArchive @@ -66,28 +66,28 @@ app = (OFArc *)[OFApplication sharedApplication].delegate; } + (instancetype)archiveWithStream: (OF_KINDOF(OFStream *))stream mode: (OFString *)mode - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { return [[[self alloc] initWithStream: stream mode: mode encoding: encoding] autorelease]; } - (instancetype)initWithStream: (OF_KINDOF(OFStream *))stream mode: (OFString *)mode - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { self = [super init]; @try { _archive = [[OFTarArchive alloc] initWithStream: stream mode: mode]; - if (encoding != OF_STRING_ENCODING_AUTODETECT) + if (encoding != OFStringEncodingAutodetect) _archive.encoding = encoding; } @catch (id e) { [self release]; @throw e; } @@ -107,11 +107,11 @@ OFTarArchiveEntry *entry; while ((entry = [_archive nextEntry]) != nil) { void *pool = objc_autoreleasePoolPush(); - [of_stdout writeLine: entry.fileName]; + [OFStdOut writeLine: entry.fileName]; if (app->_outputLevel >= 1) { OFString *date = [entry.modificationDate localDateStringWithFormat: @"%Y-%m-%d %H:%M:%S"]; OFString *size = [OFString stringWithFormat: @@ -121,143 +121,143 @@ OFString *UID = [OFString stringWithFormat: @"%u", entry.UID]; OFString *GID = [OFString stringWithFormat: @"%u", entry.GID]; - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED(@"list_size", + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED(@"list_size", @"[" @" 'Size: '," @" [" @" {'size == 1': '1 byte'}," @" {'': '%[size] bytes'}" @" ]" @"]".objectByParsingJSON, @"size", size)]; - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED(@"list_mode", + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED(@"list_mode", @"Mode: %[mode]", @"mode", mode)]; - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED(@"list_uid", + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED(@"list_uid", @"UID: %[uid]", @"uid", UID)]; - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED(@"list_gid", + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED(@"list_gid", @"GID: %[gid]", @"gid", GID)]; if (entry.owner != nil) { - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED( @"list_owner", @"Owner: %[owner]", @"owner", entry.owner)]; } if (entry.group != nil) { - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED( @"list_group", @"Group: %[group]", @"group", entry.group)]; } - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED( @"list_modification_date", @"Modification date: %[date]", @"date", date)]; } if (app->_outputLevel >= 2) { - [of_stdout writeString: @"\t"]; - - switch (entry.type) { - case OF_TAR_ARCHIVE_ENTRY_TYPE_FILE: - [of_stdout writeLine: OF_LOCALIZED( - @"list_type_normal", - @"Type: Normal file")]; - break; - case OF_TAR_ARCHIVE_ENTRY_TYPE_LINK: - [of_stdout writeLine: OF_LOCALIZED( - @"list_type_hardlink", - @"Type: Hard link")]; - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED( - @"list_link_target", - @"Target file name: %[target]", - @"target", entry.targetFileName)]; - break; - case OF_TAR_ARCHIVE_ENTRY_TYPE_SYMLINK: - [of_stdout writeLine: OF_LOCALIZED( - @"list_type_symlink", - @"Type: Symbolic link")]; - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED( - @"list_link_target", - @"Target file name: %[target]", - @"target", entry.targetFileName)]; - break; - case OF_TAR_ARCHIVE_ENTRY_TYPE_CHARACTER_DEVICE: { - OFString *majorString = [OFString - stringWithFormat: @"%d", entry.deviceMajor]; - OFString *minorString = [OFString - stringWithFormat: @"%d", entry.deviceMinor]; - - [of_stdout writeLine: OF_LOCALIZED( - @"list_type_character_device", - @"Type: Character device")]; - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED( - @"list_device_major", - @"Device major: %[major]", - @"major", majorString)]; - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED( - @"list_device_minor", - @"Device minor: %[minor]", - @"minor", minorString)]; - break; - } - case OF_TAR_ARCHIVE_ENTRY_TYPE_BLOCK_DEVICE: { - OFString *majorString = [OFString - stringWithFormat: @"%d", entry.deviceMajor]; - OFString *minorString = [OFString - stringWithFormat: @"%d", entry.deviceMinor]; - - [of_stdout writeLine: OF_LOCALIZED( - @"list_type_block_device", - @"Type: Block device")]; - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED( - @"list_device_major", - @"Device major: %[major]", - @"major", majorString)]; - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED( - @"list_device_minor", - @"Device minor: %[minor]", - @"minor", minorString)]; - break; - } - case OF_TAR_ARCHIVE_ENTRY_TYPE_DIRECTORY: - [of_stdout writeLine: OF_LOCALIZED( - @"list_type_directory", - @"Type: Directory")]; - break; - case OF_TAR_ARCHIVE_ENTRY_TYPE_FIFO: - [of_stdout writeLine: OF_LOCALIZED( - @"list_type_fifo", - @"Type: FIFO")]; - break; - case OF_TAR_ARCHIVE_ENTRY_TYPE_CONTIGUOUS_FILE: - [of_stdout writeLine: OF_LOCALIZED( - @"list_type_contiguous_file", - @"Type: Contiguous file")]; - break; - default: - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\t"]; + + switch (entry.type) { + case OFTarArchiveEntryTypeFile: + [OFStdOut writeLine: OF_LOCALIZED( + @"list_type_normal", + @"Type: Normal file")]; + break; + case OFTarArchiveEntryTypeLink: + [OFStdOut writeLine: OF_LOCALIZED( + @"list_type_hardlink", + @"Type: Hard link")]; + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED( + @"list_link_target", + @"Target file name: %[target]", + @"target", entry.targetFileName)]; + break; + case OFTarArchiveEntryTypeSymlink: + [OFStdOut writeLine: OF_LOCALIZED( + @"list_type_symlink", + @"Type: Symbolic link")]; + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED( + @"list_link_target", + @"Target file name: %[target]", + @"target", entry.targetFileName)]; + break; + case OFTarArchiveEntryTypeCharacterDevice: { + OFString *majorString = [OFString + stringWithFormat: @"%d", entry.deviceMajor]; + OFString *minorString = [OFString + stringWithFormat: @"%d", entry.deviceMinor]; + + [OFStdOut writeLine: OF_LOCALIZED( + @"list_type_character_device", + @"Type: Character device")]; + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED( + @"list_device_major", + @"Device major: %[major]", + @"major", majorString)]; + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED( + @"list_device_minor", + @"Device minor: %[minor]", + @"minor", minorString)]; + break; + } + case OFTarArchiveEntryTypeBlockDevice: { + OFString *majorString = [OFString + stringWithFormat: @"%d", entry.deviceMajor]; + OFString *minorString = [OFString + stringWithFormat: @"%d", entry.deviceMinor]; + + [OFStdOut writeLine: OF_LOCALIZED( + @"list_type_block_device", + @"Type: Block device")]; + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED( + @"list_device_major", + @"Device major: %[major]", + @"major", majorString)]; + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED( + @"list_device_minor", + @"Device minor: %[minor]", + @"minor", minorString)]; + break; + } + case OFTarArchiveEntryTypeDirectory: + [OFStdOut writeLine: OF_LOCALIZED( + @"list_type_directory", + @"Type: Directory")]; + break; + case OFTarArchiveEntryTypeFIFO: + [OFStdOut writeLine: OF_LOCALIZED( + @"list_type_fifo", + @"Type: FIFO")]; + break; + case OFTarArchiveEntryTypeContiguousFile: + [OFStdOut writeLine: OF_LOCALIZED( + @"list_type_contiguous_file", + @"Type: Contiguous file")]; + break; + default: + [OFStdOut writeLine: OF_LOCALIZED( @"list_type_unknown", @"Type: Unknown")]; break; } } @@ -275,24 +275,24 @@ OFTarArchiveEntry *entry; while ((entry = [_archive nextEntry]) != nil) { void *pool = objc_autoreleasePoolPush(); OFString *fileName = entry.fileName; - of_tar_archive_entry_type_t type = entry.type; + OFTarArchiveEntryType type = entry.type; OFString *outFileName, *directory; OFFile *output; OFStream *stream; uint64_t written = 0, size = entry.size; int8_t percent = -1, newPercent; if (!all && ![files containsObject: fileName]) continue; - if (type != OF_TAR_ARCHIVE_ENTRY_TYPE_FILE && - type != OF_TAR_ARCHIVE_ENTRY_TYPE_DIRECTORY) { + if (type != OFTarArchiveEntryTypeFile && + type != OFTarArchiveEntryTypeDirectory) { if (app->_outputLevel >= 0) - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeLine: OF_LOCALIZED( @"skipping_file", @"Skipping %[file]...", @"file", fileName)]; continue; } @@ -299,35 +299,35 @@ [missing removeObject: fileName]; outFileName = [app safeLocalPathForPath: fileName]; if (outFileName == nil) { - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeLine: OF_LOCALIZED( @"refusing_to_extract_file", @"Refusing to extract %[file]!", @"file", fileName)]; app->_exitStatus = 1; goto outer_loop_end; } if (app->_outputLevel >= 0) - [of_stdout writeString: OF_LOCALIZED(@"extracting_file", + [OFStdOut writeString: OF_LOCALIZED(@"extracting_file", @"Extracting %[file]...", @"file", fileName)]; - if (type == OF_TAR_ARCHIVE_ENTRY_TYPE_DIRECTORY || - (type == OF_TAR_ARCHIVE_ENTRY_TYPE_FILE && + if (type == OFTarArchiveEntryTypeDirectory || + (type == OFTarArchiveEntryTypeFile && [fileName hasSuffix: @"/"])) { [fileManager createDirectoryAtPath: outFileName createParents: true]; setPermissions(outFileName, entry); setModificationDate(outFileName, entry); if (app->_outputLevel >= 0) { - [of_stdout writeString: @"\r"]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\r"]; + [OFStdOut writeLine: OF_LOCALIZED( @"extracting_file_done", @"Extracting %[file]... done", @"file", fileName)]; } @@ -365,12 +365,12 @@ percent = newPercent; percentString = [OFString stringWithFormat: @"%3u", percent]; - [of_stdout writeString: @"\r"]; - [of_stdout writeString: OF_LOCALIZED( + [OFStdOut writeString: @"\r"]; + [OFStdOut writeString: OF_LOCALIZED( @"extracting_file_percent", @"Extracting %[file]... %[percent]%", @"file", fileName, @"percent", percentString)]; } @@ -378,12 +378,12 @@ [output close]; setModificationDate(outFileName, entry); if (app->_outputLevel >= 0) { - [of_stdout writeString: @"\r"]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\r"]; + [OFStdOut writeLine: OF_LOCALIZED( @"extracting_file_done", @"Extracting %[file]... done", @"file", fileName)]; } @@ -391,11 +391,11 @@ objc_autoreleasePoolPop(pool); } if (missing.count > 0) { for (OFString *file in missing) - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeLine: OF_LOCALIZED( @"file_not_in_archive", @"File %[file] is not in the archive!", @"file", file)]; app->_exitStatus = 1; @@ -406,11 +406,11 @@ { OFMutableSet *files; OFTarArchiveEntry *entry; if (files_.count < 1) { - [of_stderr writeLine: OF_LOCALIZED(@"print_no_file_specified", + [OFStdErr writeLine: OF_LOCALIZED(@"print_no_file_specified", @"Need one or more files to print!")]; app->_exitStatus = 1; return; } @@ -425,11 +425,11 @@ stream = [_archive streamForReadingCurrentEntry]; while (!stream.atEndOfStream) { ssize_t length = [app copyBlockFromStream: stream - toStream: of_stdout + toStream: OFStdOut fileName: fileName]; if (length < 0) { app->_exitStatus = 1; return; @@ -442,11 +442,11 @@ if (files.count == 0) break; } for (OFString *file in files) { - [of_stderr writeLine: OF_LOCALIZED(@"file_not_in_archive", + [OFStdErr writeLine: OF_LOCALIZED(@"file_not_in_archive", @"File %[file] is not in the archive!", @"file", file)]; app->_exitStatus = 1; } } @@ -454,25 +454,25 @@ - (void)addFiles: (OFArray OF_GENERIC(OFString *) *)files { OFFileManager *fileManager = [OFFileManager defaultManager]; if (files.count < 1) { - [of_stderr writeLine: OF_LOCALIZED(@"add_no_file_specified", + [OFStdErr writeLine: OF_LOCALIZED(@"add_no_file_specified", @"Need one or more files to add!")]; app->_exitStatus = 1; return; } for (OFString *fileName in files) { void *pool = objc_autoreleasePoolPush(); - of_file_attributes_t attributes; - of_file_type_t type; + OFFileAttributes attributes; + OFFileAttributeType type; OFMutableTarArchiveEntry *entry; OFStream *output; if (app->_outputLevel >= 0) - [of_stdout writeString: OF_LOCALIZED(@"adding_file", + [OFStdOut writeString: OF_LOCALIZED(@"adding_file", @"Adding %[file]...", @"file", fileName)]; attributes = [fileManager attributesOfItemAtPath: fileName]; type = attributes.fileType; @@ -483,33 +483,33 @@ #endif entry.size = attributes.fileSize; entry.modificationDate = attributes.fileModificationDate; #ifdef OF_FILE_MANAGER_SUPPORTS_OWNER - entry.UID = attributes.filePOSIXUID; - entry.GID = attributes.filePOSIXGID; - entry.owner = attributes.fileOwner; - entry.group = attributes.fileGroup; + entry.UID = attributes.fileOwnerAccountID; + entry.GID = attributes.fileGroupOwnerAccountID; + entry.owner = attributes.fileOwnerAccountName; + entry.group = attributes.fileGroupOwnerAccountName; #endif - if ([type isEqual: of_file_type_regular]) - entry.type = OF_TAR_ARCHIVE_ENTRY_TYPE_FILE; - else if ([type isEqual: of_file_type_directory]) { - entry.type = OF_TAR_ARCHIVE_ENTRY_TYPE_DIRECTORY; + if ([type isEqual: OFFileTypeRegular]) + entry.type = OFTarArchiveEntryTypeFile; + else if ([type isEqual: OFFileTypeDirectory]) { + entry.type = OFTarArchiveEntryTypeDirectory; entry.size = 0; - } else if ([type isEqual: of_file_type_symbolic_link]) { - entry.type = OF_TAR_ARCHIVE_ENTRY_TYPE_SYMLINK; + } else if ([type isEqual: OFFileTypeSymbolicLink]) { + entry.type = OFTarArchiveEntryTypeSymlink; entry.targetFileName = attributes.fileSymbolicLinkDestination; entry.size = 0; } [entry makeImmutable]; output = [_archive streamForWritingEntry: entry]; - if (entry.type == OF_TAR_ARCHIVE_ENTRY_TYPE_FILE) { + if (entry.type == OFTarArchiveEntryTypeFile) { uint64_t written = 0, size = entry.size; int8_t percent = -1, newPercent; OFFile *input = [OFFile fileWithPath: fileName mode: @"r"]; @@ -535,23 +535,23 @@ percent = newPercent; percentString = [OFString stringWithFormat: @"%3u", percent]; - [of_stdout writeString: @"\r"]; - [of_stdout writeString: OF_LOCALIZED( + [OFStdOut writeString: @"\r"]; + [OFStdOut writeString: OF_LOCALIZED( @"adding_file_percent", @"Adding %[file]... %[percent]%", @"file", fileName, @"percent", percentString)]; } } } if (app->_outputLevel >= 0) { - [of_stdout writeString: @"\r"]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\r"]; + [OFStdOut writeLine: OF_LOCALIZED( @"adding_file_done", @"Adding %[file]... done", @"file", fileName)]; } Index: utils/ofarc/ZIPArchive.m ================================================================== --- utils/ofarc/ZIPArchive.m +++ utils/ofarc/ZIPArchive.m @@ -39,17 +39,16 @@ static void setPermissions(OFString *path, OFZIPArchiveEntry *entry) { #ifdef OF_FILE_MANAGER_SUPPORTS_PERMISSIONS if ((entry.versionMadeBy >> 8) == - OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_UNIX) { + OFZIPArchiveEntryAttributeCompatibilityUNIX) { OFNumber *mode = [OFNumber numberWithUnsignedShort: (entry.versionSpecificAttributes >> 16) & 0777]; - of_file_attribute_key_t key = - of_file_attribute_key_posix_permissions; - of_file_attributes_t attributes = - [OFDictionary dictionaryWithObject: mode forKey: key]; + OFFileAttributes attributes = [OFDictionary + dictionaryWithObject: mode + forKey: OFFilePOSIXPermissions]; [[OFFileManager defaultManager] setAttributes: attributes ofItemAtPath: path]; } #endif @@ -57,18 +56,18 @@ static void setModificationDate(OFString *path, OFZIPArchiveEntry *entry) { OFDate *modificationDate = entry.modificationDate; - of_file_attributes_t attributes; + OFFileAttributes attributes; if (modificationDate == nil) return; attributes = [OFDictionary dictionaryWithObject: modificationDate - forKey: of_file_attribute_key_modification_date]; + forKey: OFFileModificationDate]; [[OFFileManager defaultManager] setAttributes: attributes ofItemAtPath: path]; } @implementation ZIPArchive @@ -78,20 +77,20 @@ app = (OFArc *)[OFApplication sharedApplication].delegate; } + (instancetype)archiveWithStream: (OF_KINDOF(OFStream *))stream mode: (OFString *)mode - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { return [[[self alloc] initWithStream: stream mode: mode encoding: encoding] autorelease]; } - (instancetype)initWithStream: (OF_KINDOF(OFStream *))stream mode: (OFString *)mode - encoding: (of_string_encoding_t)encoding + encoding: (OFStringEncoding)encoding { self = [super init]; @try { _archive = [[OFZIPArchive alloc] initWithStream: stream @@ -114,90 +113,91 @@ - (void)listFiles { for (OFZIPArchiveEntry *entry in _archive.entries) { void *pool = objc_autoreleasePoolPush(); - [of_stdout writeLine: entry.fileName]; + [OFStdOut writeLine: entry.fileName]; if (app->_outputLevel >= 1) { OFString *compressedSize = [OFString stringWithFormat: @"%" PRIu64, entry.compressedSize]; OFString *uncompressedSize = [OFString stringWithFormat: @"%" PRIu64, entry.uncompressedSize]; OFString *compressionMethod = - of_zip_archive_entry_compression_method_to_string( + OFZIPArchiveEntryCompressionMethodName( entry.compressionMethod); OFString *CRC32 = [OFString stringWithFormat: @"%08" PRIX32, entry.CRC32]; OFString *modificationDate = [entry.modificationDate localDateStringWithFormat: @"%Y-%m-%d %H:%M:%S"]; - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED( @"list_compressed_size", @"[" @" 'Compressed: '," @" [" @" {'size == 1': '1 byte'}," @" {'': '%[size] bytes'}" @" ]" @"]".objectByParsingJSON, @"size", compressedSize)]; - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED( @"list_uncompressed_size", @"[" @" 'Uncompressed: '," @" [" @" {'size == 1': '1 byte'}," @" {'': '%[size] bytes'}" @" ]" @"]".objectByParsingJSON, @"size", uncompressedSize)]; - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED( @"list_compression_method", @"Compression method: %[method]", @"method", compressionMethod)]; - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED(@"list_crc32", + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED(@"list_crc32", @"CRC32: %[crc32]", @"crc32", CRC32)]; - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED( @"list_modification_date", @"Modification date: %[date]", @"date", modificationDate)]; if (app->_outputLevel >= 2) { uint16_t versionMadeBy = entry.versionMadeBy; + OFZIPArchiveEntryAttributeCompatibility UNIX = + OFZIPArchiveEntryAttributeCompatibilityUNIX; - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED( @"list_version_made_by", @"Version made by: %[version]", @"version", - of_zip_archive_entry_version_to_string( + OFZIPArchiveEntryVersionToString( versionMadeBy))]; - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED( @"list_min_version_needed", @"Minimum version needed: %[version]", @"version", - of_zip_archive_entry_version_to_string( + OFZIPArchiveEntryVersionToString( entry.minVersionNeeded))]; - if ((versionMadeBy >> 8) == - OF_ZIP_ARCHIVE_ENTRY_ATTR_COMPAT_UNIX) { + if ((versionMadeBy >> 8) == UNIX) { uint32_t mode = entry .versionSpecificAttributes >> 16; OFString *modeString = [OFString stringWithFormat: @"%06o", mode]; - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED( @"list_mode", @"Mode: %[mode]", @"mode", modeString)]; } } @@ -204,29 +204,29 @@ if (app->_outputLevel >= 3) { OFString *GPBF = [OFString stringWithFormat: @"%04" PRIx16, entry.generalPurposeBitFlag]; - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED( @"list_general_purpose_bit_flag", @"General purpose bit flag: %[gpbf]", @"gpbf", GPBF)]; if (entry.extraField != nil) { - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED( @"list_extra_field", @"Extra field: %[extra]", @"extra", entry.extraField.description)]; } } if (entry.fileComment.length > 0) { - [of_stdout writeString: @"\t"]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\t"]; + [OFStdOut writeLine: OF_LOCALIZED( @"list_comment", @"Comment: %[comment]", @"comment", entry.fileComment)]; } } @@ -256,21 +256,21 @@ [missing removeObject: fileName]; outFileName = [app safeLocalPathForPath: fileName]; if (outFileName == nil) { - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeLine: OF_LOCALIZED( @"refusing_to_extract_file", @"Refusing to extract %[file]!", @"file", fileName)]; app->_exitStatus = 1; goto outer_loop_end; } if (app->_outputLevel >= 0) - [of_stdout writeString: OF_LOCALIZED(@"extracting_file", + [OFStdOut writeString: OF_LOCALIZED(@"extracting_file", @"Extracting %[file]...", @"file", fileName)]; if ([fileName hasSuffix: @"/"]) { [fileManager createDirectoryAtPath: outFileName @@ -277,12 +277,12 @@ createParents: true]; setPermissions(outFileName, entry); setModificationDate(outFileName, entry); if (app->_outputLevel >= 0) { - [of_stdout writeString: @"\r"]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\r"]; + [OFStdOut writeLine: OF_LOCALIZED( @"extracting_file_done", @"Extracting %[file]... done", @"file", fileName)]; } @@ -320,12 +320,12 @@ percent = newPercent; percentString = [OFString stringWithFormat: @"%3u", percent]; - [of_stdout writeString: @"\r"]; - [of_stdout writeString: OF_LOCALIZED( + [OFStdOut writeString: @"\r"]; + [OFStdOut writeString: OF_LOCALIZED( @"extracting_file_percent", @"Extracting %[file]... %[percent]%", @"file", fileName, @"percent", percentString)]; } @@ -333,12 +333,12 @@ [output close]; setModificationDate(outFileName, entry); if (app->_outputLevel >= 0) { - [of_stdout writeString: @"\r"]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\r"]; + [OFStdOut writeLine: OF_LOCALIZED( @"extracting_file_done", @"Extracting %[file]... done", @"file", fileName)]; } @@ -346,11 +346,11 @@ objc_autoreleasePoolPop(pool); } if (missing.count > 0) { for (OFString *file in missing) - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeLine: OF_LOCALIZED( @"file_not_in_archive", @"File %[file] is not in the archive!", @"file", file)]; app->_exitStatus = 1; @@ -360,11 +360,11 @@ - (void)printFiles: (OFArray OF_GENERIC(OFString *) *)files { OFStream *stream; if (files.count < 1) { - [of_stderr writeLine: OF_LOCALIZED(@"print_no_file_specified", + [OFStdErr writeLine: OF_LOCALIZED(@"print_no_file_specified", @"Need one or more files to print!")]; app->_exitStatus = 1; return; } @@ -371,11 +371,11 @@ for (OFString *path in files) { @try { stream = [_archive streamForReadingFile: path]; } @catch (OFOpenItemFailedException *e) { if (e.errNo == ENOENT) { - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeLine: OF_LOCALIZED( @"file_not_in_archive", @"File %[file] is not in the archive!", @"file", e.path)]; app->_exitStatus = 1; continue; @@ -384,11 +384,11 @@ @throw e; } while (!stream.atEndOfStream) { ssize_t length = [app copyBlockFromStream: stream - toStream: of_stdout + toStream: OFStdOut fileName: path]; if (length < 0) { app->_exitStatus = 1; return; @@ -402,21 +402,21 @@ - (void)addFiles: (OFArray OF_GENERIC(OFString *) *)files { OFFileManager *fileManager = [OFFileManager defaultManager]; if (files.count < 1) { - [of_stderr writeLine: OF_LOCALIZED(@"add_no_file_specified", + [OFStdErr writeLine: OF_LOCALIZED(@"add_no_file_specified", @"Need one or more files to add!")]; app->_exitStatus = 1; return; } for (OFString *localFileName in files) { void *pool = objc_autoreleasePoolPush(); OFArray OF_GENERIC (OFString *) *components; OFString *fileName; - of_file_attributes_t attributes; + OFFileAttributes attributes; bool isDirectory = false; OFMutableZIPArchiveEntry *entry; unsigned long long size; OFStream *output; @@ -424,17 +424,17 @@ fileName = [components componentsJoinedByString: @"/"]; attributes = [fileManager attributesOfItemAtPath: localFileName]; - if ([attributes.fileType isEqual: of_file_type_directory]) { + if ([attributes.fileType isEqual: OFFileTypeDirectory]) { isDirectory = true; fileName = [fileName stringByAppendingString: @"/"]; } if (app->_outputLevel >= 0) - [of_stdout writeString: OF_LOCALIZED(@"adding_file", + [OFStdOut writeString: OF_LOCALIZED(@"adding_file", @"Adding %[file]...", @"file", fileName)]; entry = [OFMutableZIPArchiveEntry entryWithFileName: fileName]; @@ -444,11 +444,11 @@ entry.compressedSize = (int64_t)size; entry.uncompressedSize = (int64_t)size; entry.compressionMethod = - OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_NONE; + OFZIPArchiveEntryCompressionMethodNone; entry.modificationDate = attributes.fileModificationDate; [entry makeImmutable]; output = [_archive streamForWritingEntry: entry]; @@ -481,23 +481,23 @@ percent = newPercent; percentString = [OFString stringWithFormat: @"%3u", percent]; - [of_stdout writeString: @"\r"]; - [of_stdout writeString: OF_LOCALIZED( + [OFStdOut writeString: @"\r"]; + [OFStdOut writeString: OF_LOCALIZED( @"adding_file_percent", @"Adding %[file]... %[percent]%", @"file", fileName, @"percent", percentString)]; } } } if (app->_outputLevel >= 0) { - [of_stdout writeString: @"\r"]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @"\r"]; + [OFStdOut writeLine: OF_LOCALIZED( @"adding_file_done", @"Adding %[file]... done", @"file", fileName)]; } Index: utils/ofdns/OFDNS.m ================================================================== --- utils/ofdns/OFDNS.m +++ utils/ofdns/OFDNS.m @@ -33,11 +33,11 @@ OF_APPLICATION_DELEGATE(OFDNS) static void help(OFStream *stream, bool full, int status) { - [of_stderr writeLine: + [OFStdErr writeLine: OF_LOCALIZED(@"usage", @"Usage: %[prog] -[chst] domain1 [domain2 ...]", @"prog", [OFApplication programName])]; if (full) { @@ -65,13 +65,13 @@ exception: (id)exception { _inFlight--; if (exception == nil) - [of_stdout writeFormat: @"%@\n", response]; + [OFStdOut writeFormat: @"%@\n", response]; else { - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeLine: OF_LOCALIZED( @"failed_to_resolve", @"Failed to resolve: %[exception]", @"exception", exception)]; _errors++; } @@ -81,23 +81,23 @@ } - (void)applicationDidFinishLaunching { OFString *DNSClassString, *server; - const of_options_parser_option_t options[] = { + const OFOptionsParserOption options[] = { { 'c', @"class", 1, NULL, &DNSClassString }, { 'h', @"help", 0, NULL, NULL }, { 's', @"server", 1, NULL, &server }, { 't', @"type", 1, NULL, NULL }, { '\0', nil, 0, NULL, NULL } }; OFMutableArray OF_GENERIC(OFString *) *recordTypes; OFOptionsParser *optionsParser; - of_unichar_t option; + OFUnichar option; OFArray OF_GENERIC(OFString *) *remainingArguments; OFDNSResolver *resolver; - of_dns_class_t DNSClass; + OFDNSClass DNSClass; #ifdef OF_HAVE_FILES # ifndef OF_AMIGAOS [OFLocale addLanguageDirectory: @LANGUAGE_DIR]; # else @@ -109,11 +109,11 @@ OFSandbox *sandbox = [[OFSandbox alloc] init]; @try { sandbox.allowsStdIO = true; sandbox.allowsDNS = true; - [OFApplication activateSandbox: sandbox]; + [OFApplication of_activateSandbox: sandbox]; } @finally { [sandbox release]; } #endif @@ -124,25 +124,25 @@ switch (option) { case 't': [recordTypes addObject: optionsParser.argument]; break; case 'h': - help(of_stdout, true, 0); + help(OFStdOut, true, 0); break; case ':': if (optionsParser.lastLongOption != nil) - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeLine: OF_LOCALIZED( @"long_option_required_argument", @"%[prog]: Option --%[opt] requires an " @"argument", @"prog", [OFApplication programName], @"opt", optionsParser.lastLongOption)]; else { OFString *optStr = [OFString stringWithFormat: @"%C", optionsParser.lastOption]; - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeLine: OF_LOCALIZED( @"option_requires_argument", @"%[prog]: Option -%[opt] requires an " @"argument", @"prog", [OFApplication programName], @"opt", optStr)]; @@ -150,20 +150,20 @@ [OFApplication terminateWithStatus: 1]; break; case '?': if (optionsParser.lastLongOption != nil) - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeLine: OF_LOCALIZED( @"unknown_long_option", @"%[prog]: Unknown option: --%[opt]", @"prog", [OFApplication programName], @"opt", optionsParser.lastLongOption)]; else { OFString *optStr = [OFString stringWithFormat: @"%C", optionsParser.lastOption]; - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeLine: OF_LOCALIZED( @"Unknown_option", @"%[prog]: Unknown option: -%[opt]", @"prog", [OFApplication programName], @"opt", optStr)]; } @@ -174,16 +174,15 @@ } remainingArguments = optionsParser.remainingArguments; if (remainingArguments.count < 1) - help(of_stderr, false, 1); + help(OFStdErr, false, 1); resolver = [OFDNSResolver resolver]; DNSClass = (DNSClassString != nil - ? of_dns_class_parse(DNSClassString) - : OF_DNS_CLASS_IN); + ? OFDNSClassParseName(DNSClassString) : OFDNSClassIN); if (recordTypes.count == 0) [recordTypes addObject: @"ALL"]; if (server != nil) { @@ -191,12 +190,12 @@ resolver.nameServers = [OFArray arrayWithObject: server]; } for (OFString *domainName in remainingArguments) { for (OFString *recordTypeString in recordTypes) { - of_dns_record_type_t recordType = - of_dns_record_type_parse(recordTypeString); + OFDNSRecordType recordType = + OFDNSRecordTypeParseName(recordTypeString); OFDNSQuery *query = [OFDNSQuery queryWithDomainName: domainName DNSClass: DNSClass recordType: recordType]; Index: utils/ofhash/OFHash.m ================================================================== --- utils/ofhash/OFHash.m +++ utils/ofhash/OFHash.m @@ -40,11 +40,11 @@ OF_APPLICATION_DELEGATE(OFHash) static void help(void) { - [of_stderr writeLine: OF_LOCALIZED(@"usage", + [OFStdErr writeLine: OF_LOCALIZED(@"usage", @"Usage: %[prog] [--md5|--ripemd160|--sha1|--sha224|--sha256|" @"--sha384|--sha512] file1 [file2 ...]", @"prog", [OFApplication programName])]; [OFApplication terminateWithStatus: 1]; @@ -54,25 +54,25 @@ printHash(OFString *algo, OFString *path, id hash) { const unsigned char *digest = hash.digest; size_t digestSize = hash.digestSize; - [of_stdout writeFormat: @"%@ ", algo]; + [OFStdOut writeFormat: @"%@ ", algo]; for (size_t i = 0; i < digestSize; i++) - [of_stdout writeFormat: @"%02x", digest[i]]; + [OFStdOut writeFormat: @"%02x", digest[i]]; - [of_stdout writeFormat: @" %@\n", path]; + [OFStdOut writeFormat: @" %@\n", path]; } @implementation OFHash - (void)applicationDidFinishLaunching { int exitStatus = 0; bool calculateMD5, calculateRIPEMD160, calculateSHA1, calculateSHA224; bool calculateSHA256, calculateSHA384, calculateSHA512; - const of_options_parser_option_t options[] = { + const OFOptionsParserOption options[] = { { '\0', @"md5", 0, &calculateMD5, NULL }, { '\0', @"ripemd160", 0, &calculateRIPEMD160, NULL }, { '\0', @"sha1", 0, &calculateSHA1, NULL }, { '\0', @"sha224", 0, &calculateSHA224, NULL }, { '\0', @"sha256", 0, &calculateSHA256, NULL }, @@ -80,11 +80,11 @@ { '\0', @"sha512", 0, &calculateSHA512, NULL }, { '\0', nil, 0, NULL, NULL } }; OFOptionsParser *optionsParser = [OFOptionsParser parserWithOptions: options]; - of_unichar_t option; + OFUnichar option; OFMD5Hash *MD5Hash = nil; OFRIPEMD160Hash *RIPEMD160Hash = nil; OFSHA1Hash *SHA1Hash = nil; OFSHA224Hash *SHA224Hash = nil; OFSHA256Hash *SHA256Hash = nil; @@ -99,19 +99,19 @@ while ((option = [optionsParser nextOption]) != '\0') { switch (option) { case '?': if (optionsParser.lastLongOption != nil) - [of_stderr writeLine: + [OFStdErr writeLine: OF_LOCALIZED(@"unknown_long_option", @"%[prog]: Unknown option: --%[opt]", @"prog", [OFApplication programName], @"opt", optionsParser.lastLongOption)]; else { OFString *optStr = [OFString stringWithFormat: @"%c", optionsParser.lastOption]; - [of_stderr writeLine: + [OFStdErr writeLine: OF_LOCALIZED(@"unknown_option", @"%[prog]: Unknown option: -%[opt]", @"prog", [OFApplication programName], @"opt", optStr)]; } @@ -131,11 +131,11 @@ for (OFString *path in optionsParser.remainingArguments) [sandbox unveilPath: path permissions: @"r"]; [sandbox unveilPath: @LANGUAGE_DIR permissions: @"r"]; - [OFApplication activateSandbox: sandbox]; + [OFApplication of_activateSandbox: sandbox]; } @finally { [sandbox release]; } #endif @@ -166,20 +166,20 @@ for (OFString *path in optionsParser.remainingArguments) { void *pool = objc_autoreleasePoolPush(); OFStream *file; if ([path isEqual: @"-"]) - file = of_stdin; + file = OFStdIn; else { @try { file = [OFFile fileWithPath: path mode: @"r"]; } @catch (OFOpenItemFailedException *e) { OFString *error = [OFString stringWithCString: strerror(e.errNo) encoding: [OFLocale encoding]]; - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeLine: OF_LOCALIZED( @"failed_to_open_file", @"Failed to open file %[file]: %[error]", @"file", e.path, @"error", error)]; @@ -206,11 +206,11 @@ } @catch (OFReadFailedException *e) { OFString *error = [OFString stringWithCString: strerror(e.errNo) encoding: [OFLocale encoding]]; - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeLine: OF_LOCALIZED( @"failed_to_read_file", @"Failed to read %[file]: %[error]", @"file", path, @"error", error)]; Index: utils/ofhttp/OFHTTP.m ================================================================== --- utils/ofhttp/OFHTTP.m +++ utils/ofhttp/OFHTTP.m @@ -64,11 +64,11 @@ OFString *_outputPath, *_currentFileName; bool _continue, _force, _detectFileName, _detectFileNameRequest; bool _detectedFileName, _quiet, _verbose, _insecure, _ignoreStatus; bool _useUnicode; OFStream *_body; - of_http_request_method_t _method; + OFHTTPRequestMethod _method; OFMutableDictionary *_clientHeaders; OFHTTPClient *_HTTPClient; char *_buffer; OFStream *_output; unsigned long long _received, _length, _resumedFrom; @@ -81,11 +81,11 @@ OF_APPLICATION_DELEGATE(OFHTTP) static void help(OFStream *stream, bool full, int status) { - [of_stderr writeLine: + [OFStdErr writeLine: OF_LOCALIZED(@"usage", @"Usage: %[prog] -[cehHmoOPqv] url1 [url2 ...]", @"prog", [OFApplication programName])]; if (full) { @@ -130,18 +130,18 @@ { void *pool; const char *UTF8String; size_t UTF8StringLength; enum { - DISPOSITION_TYPE, - DISPOSITION_TYPE_SEMICOLON, - DISPOSITION_PARAM_NAME_SKIP_SPACE, - DISPOSITION_PARAM_NAME, - DISPOSITION_PARAM_VALUE, - DISPOSITION_PARAM_QUOTED, - DISPOSITION_PARAM_UNQUOTED, - DISPOSITION_EXPECT_SEMICOLON + stateDispositionType, + stateDispositionTypeSemicolon, + stateDispositionParamNameSkipSpace, + stateDispositionParamName, + stateDispositionParamValue, + stateDispositionParamQuoted, + stateDispositionParamUnquoted, + stateDispositionExpectSemicolon } state; size_t last; OFString *type = nil, *paramName = nil, *paramValue; OFMutableDictionary *params; OFString *fileName; @@ -151,76 +151,76 @@ pool = objc_autoreleasePoolPush(); UTF8String = contentDisposition.UTF8String; UTF8StringLength = contentDisposition.UTF8StringLength; - state = DISPOSITION_TYPE; + state = stateDispositionType; params = [OFMutableDictionary dictionary]; last = 0; for (size_t i = 0; i < UTF8StringLength; i++) { switch (state) { - case DISPOSITION_TYPE: + case stateDispositionType: if (UTF8String[i] == ';' || UTF8String[i] == ' ') { type = [OFString stringWithUTF8String: UTF8String length: i]; state = (UTF8String[i] == ';' - ? DISPOSITION_PARAM_NAME_SKIP_SPACE - : DISPOSITION_TYPE_SEMICOLON); + ? stateDispositionParamNameSkipSpace + : stateDispositionTypeSemicolon); last = i + 1; } break; - case DISPOSITION_TYPE_SEMICOLON: + case stateDispositionTypeSemicolon: if (UTF8String[i] == ';') { - state = DISPOSITION_PARAM_NAME_SKIP_SPACE; + state = stateDispositionParamNameSkipSpace; last = i + 1; } else if (UTF8String[i] != ' ') { objc_autoreleasePoolPop(pool); return nil; } break; - case DISPOSITION_PARAM_NAME_SKIP_SPACE: + case stateDispositionParamNameSkipSpace: if (UTF8String[i] != ' ') { - state = DISPOSITION_PARAM_NAME; + state = stateDispositionParamName; last = i; i--; } break; - case DISPOSITION_PARAM_NAME: + case stateDispositionParamName: if (UTF8String[i] == '=') { paramName = [OFString stringWithUTF8String: UTF8String + last length: i - last]; - state = DISPOSITION_PARAM_VALUE; + state = stateDispositionParamValue; } break; - case DISPOSITION_PARAM_VALUE: + case stateDispositionParamValue: if (UTF8String[i] == '"') { - state = DISPOSITION_PARAM_QUOTED; + state = stateDispositionParamQuoted; last = i + 1; } else { - state = DISPOSITION_PARAM_UNQUOTED; + state = stateDispositionParamUnquoted; last = i; i--; } break; - case DISPOSITION_PARAM_QUOTED: + case stateDispositionParamQuoted: if (UTF8String[i] == '"') { paramValue = [OFString stringWithUTF8String: UTF8String + last length: i - last]; [params setObject: paramValue forKey: paramName.lowercaseString]; - state = DISPOSITION_EXPECT_SEMICOLON; + state = stateDispositionExpectSemicolon; } break; - case DISPOSITION_PARAM_UNQUOTED: + case stateDispositionParamUnquoted: if (UTF8String[i] <= 31 || UTF8String[i] >= 127) return nil; switch (UTF8String[i]) { case ' ': case '"': case '(': case ')': case ',': @@ -234,34 +234,34 @@ length: i - last]; [params setObject: paramValue forKey: paramName.lowercaseString]; - state = DISPOSITION_PARAM_NAME_SKIP_SPACE; + state = stateDispositionParamNameSkipSpace; break; } break; - case DISPOSITION_EXPECT_SEMICOLON: + case stateDispositionExpectSemicolon: if (UTF8String[i] == ';') { - state = DISPOSITION_PARAM_NAME_SKIP_SPACE; + state = stateDispositionParamNameSkipSpace; last = i + 1; } else if (UTF8String[i] != ' ') { objc_autoreleasePoolPop(pool); return nil; } break; } } - if (state == DISPOSITION_PARAM_UNQUOTED) { + if (state == stateDispositionParamUnquoted) { paramValue = [OFString stringWithUTF8String: UTF8String + last length: UTF8StringLength - last]; [params setObject: paramValue forKey: paramName.lowercaseString]; - } else if (state != DISPOSITION_EXPECT_SEMICOLON) { + } else if (state != stateDispositionExpectSemicolon) { objc_autoreleasePoolPop(pool); return nil; } if (![type isEqual: @"attachment"] || @@ -283,29 +283,29 @@ { if (self != [OFHTTP class]) return; /* Opportunistically try loading ObjOpenSSL and ignore any errors. */ - of_dlopen(@LIB_PREFIX @"objopenssl" @LIB_SUFFIX, OF_RTLD_LAZY); + OFDLOpen(@LIB_PREFIX @"objopenssl" @LIB_SUFFIX, OFDLOpenFlagLazy); } #endif - (instancetype)init { self = [super init]; @try { - _method = OF_HTTP_REQUEST_METHOD_GET; + _method = OFHTTPRequestMethodGet; _clientHeaders = [[OFMutableDictionary alloc] initWithObject: @"OFHTTP" forKey: @"User-Agent"]; _HTTPClient = [[OFHTTPClient alloc] init]; _HTTPClient.delegate = self; - _buffer = of_alloc(1, [OFSystemInfo pageSize]); + _buffer = OFAllocMemory(1, [OFSystemInfo pageSize]); } @catch (id e) { [self release]; @throw e; } @@ -315,12 +315,12 @@ - (void)addHeader: (OFString *)header { size_t pos = [header rangeOfString: @":"].location; OFString *name, *value; - if (pos == OF_NOT_FOUND) { - [of_stderr writeLine: OF_LOCALIZED(@"invalid_input_header", + if (pos == OFNotFound) { + [OFStdErr writeLine: OF_LOCALIZED(@"invalid_input_header", @"%[prog]: Headers must to be in format name:value!", @"prog", [OFApplication programName])]; [OFApplication terminateWithStatus: 1]; } @@ -339,11 +339,11 @@ [_body release]; _body = nil; if ([path isEqual: @"-"]) - _body = [of_stdin copy]; + _body = [OFStdIn copy]; else { _body = [[OFFile alloc] initWithPath: path mode: @"r"]; @try { unsigned long long fileSize = @@ -368,13 +368,13 @@ void *pool = objc_autoreleasePoolPush(); method = method.uppercaseString; @try { - _method = of_http_request_method_from_string(method); + _method = OFHTTPRequestMethodParseName(method); } @catch (OFInvalidArgumentException *e) { - [of_stderr writeLine: OF_LOCALIZED(@"invalid_input_method", + [OFStdErr writeLine: OF_LOCALIZED(@"invalid_input_method", @"%[prog]: Invalid request method %[method]!", @"prog", [OFApplication programName], @"method", method)]; [OFApplication terminateWithStatus: 1]; } @@ -385,15 +385,15 @@ - (void)setProxy: (OFString *)proxy { @try { size_t pos = [proxy rangeOfString: @":" - options: OF_STRING_SEARCH_BACKWARDS].location; + options: OFStringSearchBackwards].location; OFString *host; unsigned long long port; - if (pos == OF_NOT_FOUND) + if (pos == OFNotFound) @throw [OFInvalidFormatException exception]; host = [proxy substringToIndex: pos]; port = [proxy substringFromIndex: pos + 1] .unsignedLongLongValue; @@ -402,21 +402,21 @@ @throw [OFOutOfRangeException exception]; [OFTCPSocket setSOCKS5Host: host]; [OFTCPSocket setSOCKS5Port: (uint16_t)port]; } @catch (OFInvalidFormatException *e) { - [of_stderr writeLine: OF_LOCALIZED(@"invalid_input_proxy", + [OFStdErr writeLine: OF_LOCALIZED(@"invalid_input_proxy", @"%[prog]: Proxy must to be in format host:port!", @"prog", [OFApplication programName])]; [OFApplication terminateWithStatus: 1]; } } - (void)applicationDidFinishLaunching { OFString *outputPath; - const of_options_parser_option_t options[] = { + const OFOptionsParserOption options[] = { { 'b', @"body", 1, NULL, NULL }, { 'c', @"continue", 0, &_continue, NULL }, { 'f', @"force", 0, &_force, NULL }, { 'h', @"help", 0, NULL, NULL }, { 'H', @"header", 1, NULL, NULL }, @@ -429,11 +429,11 @@ { '\0', @"insecure", 0, &_insecure, NULL }, { '\0', @"ignore-status", 0, &_ignoreStatus, NULL }, { '\0', nil, 0, NULL, NULL } }; OFOptionsParser *optionsParser; - of_unichar_t option; + OFUnichar option; #ifdef OF_HAVE_SANDBOX OFSandbox *sandbox = [OFSandbox sandbox]; sandbox.allowsStdIO = true; sandbox.allowsReadingFiles = true; @@ -444,11 +444,11 @@ sandbox.allowsUserDatabaseReading = true; sandbox.allowsTTY = true; /* Dropped after parsing options */ sandbox.allowsUnveil = true; - [OFApplication activateSandbox: sandbox]; + [OFApplication of_activateSandbox: sandbox]; #endif #ifndef OF_AMIGAOS [OFLocale addLanguageDirectory: @LANGUAGE_DIR]; #else @@ -460,11 +460,11 @@ switch (option) { case 'b': [self setBody: optionsParser.argument]; break; case 'h': - help(of_stdout, true, 0); + help(OFStdOut, true, 0); break; case 'H': [self addHeader: optionsParser.argument]; break; case 'm': @@ -473,21 +473,21 @@ case 'P': [self setProxy: optionsParser.argument]; break; case ':': if (optionsParser.lastLongOption != nil) - [of_stderr writeLine: + [OFStdErr writeLine: OF_LOCALIZED(@"long_argument_missing", @"%[prog]: Argument for option --%[opt] " @"missing" @"prog", [OFApplication programName], @"opt", optionsParser.lastLongOption)]; else { OFString *optStr = [OFString stringWithFormat: @"%c", optionsParser.lastOption]; - [of_stderr writeLine: + [OFStdErr writeLine: OF_LOCALIZED(@"argument_missing", @"%[prog]: Argument for option -%[opt] " @"missing", @"prog", [OFApplication programName], @"opt", optStr)]; @@ -494,30 +494,30 @@ } [OFApplication terminateWithStatus: 1]; break; case '=': - [of_stderr writeLine: + [OFStdErr writeLine: OF_LOCALIZED(@"option_takes_no_argument", @"%[prog]: Option --%[opt] takes no argument", @"prog", [OFApplication programName], @"opt", optionsParser.lastLongOption)]; [OFApplication terminateWithStatus: 1]; break; case '?': if (optionsParser.lastLongOption != nil) - [of_stderr writeLine: + [OFStdErr writeLine: OF_LOCALIZED(@"unknown_long_option", @"%[prog]: Unknown option: --%[opt]", @"prog", [OFApplication programName], @"opt", optionsParser.lastLongOption)]; else { OFString *optStr = [OFString stringWithFormat: @"%c", optionsParser.lastOption]; - [of_stderr writeLine: + [OFStdErr writeLine: OF_LOCALIZED(@"unknown_option", @"%[prog]: Unknown option: -%[opt]", @"prog", [OFApplication programName], @"opt", optStr)]; } @@ -526,45 +526,50 @@ break; } } #ifdef OF_HAVE_SANDBOX - [sandbox unveilPath: (outputPath != nil - ? outputPath : OF_PATH_CURRENT_DIRECTORY) - permissions: (_continue ? @"rwc" : @"wc")]; + if (outputPath != nil) + [sandbox unveilPath: outputPath + permissions: (_continue ? @"rwc" : @"wc")]; + else + [sandbox unveilPath: [[OFFileManger defaultManager] + currentDirectoryPath] + permissions: (_continue ? @"rwc" : @"wc")]; + /* In case we use ObjOpenSSL for https later */ [sandbox unveilPath: @"/etc/ssl" permissions: @"r"]; sandbox.allowsUnveil = false; - [OFApplication activateSandbox: sandbox]; + [OFApplication of_activateSandbox: sandbox]; #endif _outputPath = [outputPath copy]; _URLs = [optionsParser.remainingArguments copy]; if (_URLs.count < 1) - help(of_stderr, false, 1); + help(OFStdErr, false, 1); if (_quiet && _verbose) { - [of_stderr writeLine: OF_LOCALIZED(@"quiet_xor_verbose", + [OFStdErr writeLine: OF_LOCALIZED(@"quiet_xor_verbose", @"%[prog]: -q / --quiet and -v / --verbose are mutually " @"exclusive!", @"prog", [OFApplication programName])]; [OFApplication terminateWithStatus: 1]; } if (_outputPath != nil && _detectFileName) { - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeLine: OF_LOCALIZED( @"output_xor_detect_filename", @"%[prog]: -o / --output and -O / --detect-filename are " @"mutually exclusive!", @"prog", [OFApplication programName])]; [OFApplication terminateWithStatus: 1]; } if (_outputPath != nil && _URLs.count > 1) { - [of_stderr writeLine: + [OFStdErr writeLine: OF_LOCALIZED(@"output_only_with_one_url", @"%[prog]: Cannot use -o / --output when more than one URL " @"has been specified!", @"prog", [OFApplication programName])]; [OFApplication terminateWithStatus: 1]; @@ -571,11 +576,11 @@ } if (_insecure) _HTTPClient.allowsInsecureRedirects = true; - _useUnicode = ([OFLocale encoding] == OF_STRING_ENCODING_UTF_8); + _useUnicode = ([OFLocale encoding] == OFStringEncodingUTF8); [self performSelector: @selector(downloadNextURL) afterDelay: 0]; } - (void)client: (OFHTTPClient *)client @@ -613,20 +618,20 @@ OFEnumerator *objectEnumerator = [headers objectEnumerator]; OFString *key, *object; while ((key = [keyEnumerator nextObject]) != nil && (object = [objectEnumerator nextObject]) != nil) - [of_stdout writeFormat: @" %@: %@\n", key, object]; + [OFStdOut writeFormat: @" %@: %@\n", key, object]; objc_autoreleasePoolPop(pool); } if (!_quiet) { if (_useUnicode) - [of_stdout writeFormat: @"☇ %@", URL.string]; + [OFStdOut writeFormat: @"☇ %@", URL.string]; else - [of_stdout writeFormat: @"< %@", URL.string]; + [OFStdOut writeFormat: @"< %@", URL.string]; } _length = 0; return true; @@ -644,17 +649,17 @@ [_progressBar draw]; [_progressBar release]; _progressBar = nil; if (!_quiet) { - [of_stdout writeString: @"\n "]; - [of_stdout writeLine: OF_LOCALIZED(@"download_error", + [OFStdOut writeString: @"\n "]; + [OFStdOut writeLine: OF_LOCALIZED(@"download_error", @"Error!")]; } URL = [_URLs objectAtIndex: _URLIndex - 1]; - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeLine: OF_LOCALIZED( @"download_failed_exception", @"%[prog]: Failed to download <%[url]>!\n" @" %[exception]", @"prog", [OFApplication programName], @"url", URL, @@ -676,12 +681,12 @@ [_progressBar draw]; [_progressBar release]; _progressBar = nil; if (!_quiet) { - [of_stdout writeString: @"\n "]; - [of_stdout writeLine: + [OFStdOut writeString: @"\n "]; + [OFStdOut writeLine: OF_LOCALIZED(@"download_done", @"Done!")]; } [self performSelector: @selector(downloadNextURL) afterDelay: 0]; @@ -703,13 +708,13 @@ OFString *lengthString = [headers objectForKey: @"Content-Length"]; OFString *type = [headers objectForKey: @"Content-Type"]; if (_useUnicode) - [of_stdout writeFormat: @" ➜ %hd\n", statusCode]; + [OFStdOut writeFormat: @" ➜ %hd\n", statusCode]; else - [of_stdout writeFormat: @" -> %hd\n", statusCode]; + [OFStdOut writeFormat: @" -> %hd\n", statusCode]; if (type == nil) type = OF_LOCALIZED(@"type_unknown", @"unknown"); if (lengthString != nil) { @@ -759,37 +764,37 @@ OFEnumerator OF_GENERIC(OFString *) *objectEnumerator = [headers objectEnumerator]; OFString *key, *object; if (statusCode / 100 == 2 && _currentFileName != nil) { - [of_stdout writeString: @" "]; - [of_stdout writeLine: OF_LOCALIZED( + [OFStdOut writeString: @" "]; + [OFStdOut writeLine: OF_LOCALIZED( @"info_name_unaligned", @"Name: %[name]", @"name", _currentFileName)]; } while ((key = [keyEnumerator nextObject]) != nil && (object = [objectEnumerator nextObject]) != nil) - [of_stdout writeFormat: @" %@: %@\n", - key, object]; + [OFStdOut writeFormat: @" %@: %@\n", + key, object]; objc_autoreleasePoolPop(pool); } else if (statusCode / 100 == 2 && !_detectFileNameRequest) { - [of_stdout writeString: @" "]; + [OFStdOut writeString: @" "]; if (_currentFileName != nil) - [of_stdout writeLine: OF_LOCALIZED(@"info_name", + [OFStdOut writeLine: OF_LOCALIZED(@"info_name", @"Name: %[name]", @"name", _currentFileName)]; - [of_stdout writeString: @" "]; - [of_stdout writeLine: OF_LOCALIZED(@"info_type", + [OFStdOut writeString: @" "]; + [OFStdOut writeLine: OF_LOCALIZED(@"info_type", @"Type: %[type]", @"type", type)]; - [of_stdout writeString: @" "]; - [of_stdout writeLine: OF_LOCALIZED(@"info_size", + [OFStdOut writeString: @" "]; + [OFStdOut writeLine: OF_LOCALIZED(@"info_size", @"Size: %[size]", @"size", lengthString)]; } } } @@ -801,48 +806,48 @@ { if (exception != nil) { if ([exception isKindOfClass: [OFResolveHostFailedException class]]) { if (!_quiet) - [of_stdout writeString: @"\n"]; + [OFStdOut writeString: @"\n"]; - [of_stderr writeLine: + [OFStdErr writeLine: OF_LOCALIZED(@"download_resolve_host_failed", @"%[prog]: Failed to download <%[url]>!\n" @" Failed to resolve host: %[exception]", @"prog", [OFApplication programName], @"url", request.URL.string, @"exception", exception)]; } else if ([exception isKindOfClass: [OFConnectionFailedException class]]) { if (!_quiet) - [of_stdout writeString: @"\n"]; + [OFStdOut writeString: @"\n"]; - [of_stderr writeLine: + [OFStdErr writeLine: OF_LOCALIZED(@"download_failed_connection_failed", @"%[prog]: Failed to download <%[url]>!\n" @" Connection failed: %[exception]", @"prog", [OFApplication programName], @"url", request.URL.string, @"exception", exception)]; } else if ([exception isKindOfClass: [OFInvalidServerReplyException class]]) { if (!_quiet) - [of_stdout writeString: @"\n"]; + [OFStdOut writeString: @"\n"]; - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeLine: OF_LOCALIZED( @"download_failed_invalid_server_reply", @"%[prog]: Failed to download <%[url]>!\n" @" Invalid server reply!", @"prog", [OFApplication programName], @"url", request.URL.string)]; } else if ([exception isKindOfClass: [OFUnsupportedProtocolException class]]) { if (!_quiet) - [of_stdout writeString: @"\n"]; + [OFStdOut writeString: @"\n"]; - [of_stderr writeLine: OF_LOCALIZED(@"no_ssl_library", + [OFStdErr writeLine: OF_LOCALIZED(@"no_ssl_library", @"%[prog]: No TLS library loaded!\n" @" In order to download via https, you need to " @"preload an TLS library for ObjFW\n" @" such as ObjOpenSSL!", @"prog", [OFApplication programName])]; @@ -851,11 +856,11 @@ OFString *error = OF_LOCALIZED( @"download_failed_read_or_write_failed_any", @"Read or write failed"); if (!_quiet) - [of_stdout writeString: @"\n"]; + [OFStdOut writeString: @"\n"]; if ([exception isKindOfClass: [OFReadFailedException class]]) error = OF_LOCALIZED( @"download_failed_read_or_write_failed_" @@ -866,11 +871,11 @@ error = OF_LOCALIZED( @"download_failed_read_or_write_failed_" @"write", @"Write failed"); - [of_stderr writeLine: OF_LOCALIZED( + [OFStdErr writeLine: OF_LOCALIZED( @"download_failed_read_or_write_failed", @"%[prog]: Failed to download <%[url]>!\n" @" %[error]: %[exception]", @"prog", [OFApplication programName], @"url", request.URL.string, @@ -886,13 +891,12 @@ goto after_exception_handling; } statusCode = response.statusCode; codeString = [OFString stringWithFormat: @"%hd %@", - statusCode, - of_http_status_code_to_string(statusCode)]; - [of_stderr writeLine: OF_LOCALIZED(@"download_failed", + statusCode, OFHTTPStatusCodeString(statusCode)]; + [OFStdErr writeLine: OF_LOCALIZED(@"download_failed", @"%[prog]: Failed to download <%[url]>!\n" @" HTTP status code: %[code]", @"prog", [OFApplication programName], @"url", request.URL.string, @"code", codeString)]; @@ -904,11 +908,11 @@ afterDelay: 0]; return; } after_exception_handling: - if (_method == OF_HTTP_REQUEST_METHOD_HEAD) + if (_method == OFHTTPRequestMethodHead) goto next; if (_detectFileNameRequest) { _currentFileName = [fileNameFromContentDisposition( [response.headers objectForKey: @"Content-Disposition"]) @@ -922,15 +926,15 @@ afterDelay: 0]; return; } if ([_outputPath isEqual: @"-"]) - _output = of_stdout; + _output = [OFStdOut copy]; else { if (!_continue && !_force && [[OFFileManager defaultManager] fileExistsAtPath: _currentFileName]) { - [of_stderr writeLine: + [OFStdErr writeLine: OF_LOCALIZED(@"output_already_exists", @"%[prog]: File %[filename] already exists!", @"prog", [OFApplication programName], @"filename", _currentFileName)]; @@ -942,11 +946,11 @@ OFString *mode = (response.statusCode == 206 ? @"a" : @"w"); _output = [[OFFile alloc] initWithPath: _currentFileName mode: mode]; } @catch (OFOpenItemFailedException *e) { - [of_stderr writeLine: + [OFStdErr writeLine: OF_LOCALIZED(@"failed_to_open_output", @"%[prog]: Failed to open file %[filename]: " @"%[exception]", @"prog", [OFApplication programName], @"filename", _currentFileName, @@ -987,11 +991,11 @@ OFMutableDictionary *clientHeaders; OFHTTPRequest *request; _received = _length = _resumedFrom = 0; - if (_output != of_stdout) + if (_output != OFStdOut) [_output release]; _output = nil; if (_URLIndex >= _URLs.count) [OFApplication terminateWithStatus: _errorCode]; @@ -998,21 +1002,21 @@ @try { URLString = [_URLs objectAtIndex: _URLIndex++]; URL = [OFURL URLWithString: URLString]; } @catch (OFInvalidFormatException *e) { - [of_stderr writeLine: OF_LOCALIZED(@"invalid_url", + [OFStdErr writeLine: OF_LOCALIZED(@"invalid_url", @"%[prog]: Invalid URL: <%[url]>!", @"prog", [OFApplication programName], @"url", URLString)]; _errorCode = 1; goto next; } if (![URL.scheme isEqual: @"http"] && ![URL.scheme isEqual: @"https"]) { - [of_stderr writeLine: OF_LOCALIZED(@"invalid_scheme", + [OFStdErr writeLine: OF_LOCALIZED(@"invalid_scheme", @"%[prog]: Invalid scheme: <%[url]>!", @"prog", [OFApplication programName], @"url", URLString)]; _errorCode = 1; @@ -1022,18 +1026,18 @@ clientHeaders = [[_clientHeaders mutableCopy] autorelease]; if (_detectFileName && !_detectedFileName) { if (!_quiet) { if (_useUnicode) - [of_stdout writeFormat: @"⠒ %@", URL.string]; + [OFStdOut writeFormat: @"⠒ %@", URL.string]; else - [of_stdout writeFormat: @"? %@", URL.string]; + [OFStdOut writeFormat: @"? %@", URL.string]; } request = [OFHTTPRequest requestWithURL: URL]; request.headers = clientHeaders; - request.method = OF_HTTP_REQUEST_METHOD_HEAD; + request.method = OFHTTPRequestMethodHead; _detectFileNameRequest = true; [_HTTPClient asyncPerformRequest: request]; return; } @@ -1077,13 +1081,13 @@ } } if (!_quiet) { if (_useUnicode) - [of_stdout writeFormat: @"⇣ %@", URL.string]; + [OFStdOut writeFormat: @"⇣ %@", URL.string]; else - [of_stdout writeFormat: @"< %@", URL.string]; + [OFStdOut writeFormat: @"< %@", URL.string]; } request = [OFHTTPRequest requestWithURL: URL]; request.headers = clientHeaders; request.method = _method; Index: utils/ofhttp/ProgressBar.m ================================================================== --- utils/ofhttp/ProgressBar.m +++ utils/ofhttp/ProgressBar.m @@ -22,15 +22,15 @@ #import "OFTimer.h" #import "OFLocale.h" #import "ProgressBar.h" -#define GIBIBYTE (1024 * 1024 * 1024) -#define MEBIBYTE (1024 * 1024) -#define KIBIBYTE (1024) +static const float oneKibibyte = 1024; +static const float oneMebibyte = 1024 * 1024; +static const float oneGibibyte = 1024 * 1024 * 1024; -#define UPDATE_INTERVAL 0.1 +static const OFTimeInterval updateInterval = 0.1; #ifndef HAVE_TRUNCF # define truncf(x) trunc(x) #endif @@ -48,11 +48,11 @@ _length = length; _resumedFrom = resumedFrom; _startDate = [[OFDate alloc] init]; _lastReceivedDate = [[OFDate alloc] init]; _drawTimer = [[OFTimer - scheduledTimerWithTimeInterval: UPDATE_INTERVAL + scheduledTimerWithTimeInterval: updateInterval target: self selector: @selector(draw) repeats: true] retain]; _BPSTimer = [[OFTimer scheduledTimerWithTimeInterval: 1.0 @@ -90,11 +90,11 @@ - (void)_drawProgress { float bars, percent; int columns, barWidth; - if ((columns = of_stdout.columns) >= 0) { + if ((columns = OFStdOut.columns) >= 0) { if (columns > 37) barWidth = columns - 37; else barWidth = 0; } else @@ -104,61 +104,61 @@ (float)(_resumedFrom + _length) * barWidth; percent = (float)(_resumedFrom + _received) / (float)(_resumedFrom + _length) * 100; if (_useUnicode) { - [of_stdout writeString: @"\r ▕"]; + [OFStdOut writeString: @"\r ▕"]; for (size_t i = 0; i < (size_t)bars; i++) - [of_stdout writeString: @"█"]; + [OFStdOut writeString: @"█"]; if (bars < barWidth) { float rem = bars - truncf(bars); if (rem >= 0.875) - [of_stdout writeString: @"▉"]; + [OFStdOut writeString: @"▉"]; else if (rem >= 0.75) - [of_stdout writeString: @"▊"]; + [OFStdOut writeString: @"▊"]; else if (rem >= 0.625) - [of_stdout writeString: @"▋"]; + [OFStdOut writeString: @"▋"]; else if (rem >= 0.5) - [of_stdout writeString: @"▌"]; + [OFStdOut writeString: @"▌"]; else if (rem >= 0.375) - [of_stdout writeString: @"▍"]; + [OFStdOut writeString: @"▍"]; else if (rem >= 0.25) - [of_stdout writeString: @"▎"]; + [OFStdOut writeString: @"▎"]; else if (rem >= 0.125) - [of_stdout writeString: @"▏"]; + [OFStdOut writeString: @"▏"]; else - [of_stdout writeString: @" "]; + [OFStdOut writeString: @" "]; for (size_t i = 0; i < barWidth - (size_t)bars - 1; i++) - [of_stdout writeString: @" "]; + [OFStdOut writeString: @" "]; } - [of_stdout writeFormat: @"▏ %,6.2f%% ", percent]; + [OFStdOut writeFormat: @"▏ %,6.2f%% ", percent]; } else { - [of_stdout writeString: @"\r ["]; + [OFStdOut writeString: @"\r ["]; for (size_t i = 0; i < (size_t)bars; i++) - [of_stdout writeString: @"#"]; + [OFStdOut writeString: @"#"]; if (bars < barWidth) { float rem = bars - truncf(bars); if (rem >= 0.75) - [of_stdout writeString: @"O"]; + [OFStdOut writeString: @"O"]; else if (rem >= 0.5) - [of_stdout writeString: @"o"]; + [OFStdOut writeString: @"o"]; else if (rem >= 0.25) - [of_stdout writeString: @"."]; + [OFStdOut writeString: @"."]; else - [of_stdout writeString: @" "]; + [OFStdOut writeString: @" "]; for (size_t i = 0; i < barWidth - (size_t)bars - 1; i++) - [of_stdout writeString: @" "]; + [OFStdOut writeString: @" "]; } - [of_stdout writeFormat: @"] %,6.2f%% ", percent]; + [OFStdOut writeFormat: @"] %,6.2f%% ", percent]; } if (percent == 100) { double timeInterval = -_startDate.timeIntervalSinceNow; @@ -165,112 +165,112 @@ _BPS = (float)_received / (float)timeInterval; _ETA = timeInterval; } if (isinf(_ETA)) - [of_stdout writeString: @"--:--:-- "]; + [OFStdOut writeString: @"--:--:-- "]; else if (_ETA >= 99 * 3600) { OFString *num = [OFString stringWithFormat: @"%,4.2f", _ETA / (24 * 3600)]; - [of_stdout writeString: OF_LOCALIZED(@"eta_days", + [OFStdOut writeString: OF_LOCALIZED(@"eta_days", @"%[num] d ", @"num", num)]; } else - [of_stdout writeFormat: @"%2u:%02u:%02u ", + [OFStdOut writeFormat: @"%2u:%02u:%02u ", (uint8_t)(_ETA / 3600), (uint8_t)(_ETA / 60) % 60, (uint8_t)_ETA % 60]; - if (_BPS >= GIBIBYTE) { + if (_BPS >= oneGibibyte) { OFString *num = [OFString stringWithFormat: - @"%,7.2f", _BPS / GIBIBYTE]; - [of_stdout writeString: OF_LOCALIZED(@"progress_gibs", + @"%,7.2f", _BPS / oneGibibyte]; + [OFStdOut writeString: OF_LOCALIZED(@"progress_gibs", @"%[num] GiB/s", @"num", num)]; - } else if (_BPS >= MEBIBYTE) { + } else if (_BPS >= oneMebibyte) { OFString *num = [OFString stringWithFormat: - @"%,7.2f", _BPS / MEBIBYTE]; - [of_stdout writeString: OF_LOCALIZED(@"progress_mibs", + @"%,7.2f", _BPS / oneMebibyte]; + [OFStdOut writeString: OF_LOCALIZED(@"progress_mibs", @"%[num] MiB/s", @"num", num)]; - } else if (_BPS >= KIBIBYTE) { + } else if (_BPS >= oneKibibyte) { OFString *num = [OFString stringWithFormat: - @"%,7.2f", _BPS / KIBIBYTE]; - [of_stdout writeString: OF_LOCALIZED(@"progress_kibs", + @"%,7.2f", _BPS / oneKibibyte]; + [OFStdOut writeString: OF_LOCALIZED(@"progress_kibs", @"%[num] KiB/s", @"num", num)]; } else { OFString *num = [OFString stringWithFormat: @"%,7.2f", _BPS]; - [of_stdout writeString: OF_LOCALIZED(@"progress_bps", + [OFStdOut writeString: OF_LOCALIZED(@"progress_bps", @"%[num] B/s ", @"num", num)]; } } - (void)_drawReceived { - [of_stdout writeString: @"\r "]; + [OFStdOut writeString: @"\r "]; - if (_resumedFrom + _received >= GIBIBYTE) { + if (_resumedFrom + _received >= oneGibibyte) { OFString *num = [OFString stringWithFormat: - @"%,7.2f", (float)(_resumedFrom + _received) / GIBIBYTE]; - [of_stdout writeString: OF_LOCALIZED(@"progress_gib", + @"%,7.2f", (float)(_resumedFrom + _received) / oneGibibyte]; + [OFStdOut writeString: OF_LOCALIZED(@"progress_gib", @"%[num] GiB", @"num", num)]; - } else if (_resumedFrom + _received >= MEBIBYTE) { + } else if (_resumedFrom + _received >= oneMebibyte) { OFString *num = [OFString stringWithFormat: - @"%,7.2f", (float)(_resumedFrom + _received) / MEBIBYTE]; - [of_stdout writeString: OF_LOCALIZED(@"progress_mib", + @"%,7.2f", (float)(_resumedFrom + _received) / oneMebibyte]; + [OFStdOut writeString: OF_LOCALIZED(@"progress_mib", @"%[num] MiB", @"num", num)]; - } else if (_resumedFrom + _received >= KIBIBYTE) { + } else if (_resumedFrom + _received >= oneKibibyte) { OFString *num = [OFString stringWithFormat: - @"%,7.2f", (float)(_resumedFrom + _received) / KIBIBYTE]; - [of_stdout writeString: OF_LOCALIZED(@"progress_kib", + @"%,7.2f", (float)(_resumedFrom + _received) / oneKibibyte]; + [OFStdOut writeString: OF_LOCALIZED(@"progress_kib", @"%[num] KiB", @"num", num)]; } else { OFString *num = [OFString stringWithFormat: @"%jd", _resumedFrom + _received]; - [of_stdout writeString: OF_LOCALIZED(@"progress_bytes", + [OFStdOut writeString: OF_LOCALIZED(@"progress_bytes", @"[" @" [" @" {'num == 1': '1 byte '}," @" {'': '%[num] bytes'}" @" ]" @"]".objectByParsingJSON, @"num", num)]; } - [of_stdout writeString: @" "]; + [OFStdOut writeString: @" "]; if (_stopped) _BPS = (float)_received / -(float)_startDate.timeIntervalSinceNow; - if (_BPS >= GIBIBYTE) { + if (_BPS >= oneGibibyte) { OFString *num = [OFString stringWithFormat: - @"%,7.2f", _BPS / GIBIBYTE]; - [of_stdout writeString: OF_LOCALIZED(@"progress_gibs", + @"%,7.2f", _BPS / oneGibibyte]; + [OFStdOut writeString: OF_LOCALIZED(@"progress_gibs", @"%[num] GiB/s", @"num", num)]; - } else if (_BPS >= MEBIBYTE) { + } else if (_BPS >= oneMebibyte) { OFString *num = [OFString stringWithFormat: - @"%,7.2f", _BPS / MEBIBYTE]; - [of_stdout writeString: OF_LOCALIZED(@"progress_mibs", + @"%,7.2f", _BPS / oneMebibyte]; + [OFStdOut writeString: OF_LOCALIZED(@"progress_mibs", @"%[num] MiB/s", @"num", num)]; - } else if (_BPS >= KIBIBYTE) { + } else if (_BPS >= oneKibibyte) { OFString *num = [OFString stringWithFormat: - @"%,7.2f", _BPS / KIBIBYTE]; - [of_stdout writeString: OF_LOCALIZED(@"progress_kibs", + @"%,7.2f", _BPS / oneKibibyte]; + [OFStdOut writeString: OF_LOCALIZED(@"progress_kibs", @"%[num] KiB/s", @"num", num)]; } else { OFString *num = [OFString stringWithFormat: @"%,7.2f", _BPS]; - [of_stdout writeString: OF_LOCALIZED(@"progress_bps", + [OFStdOut writeString: OF_LOCALIZED(@"progress_bps", @"%[num] B/s ", @"num", num)]; } }