Index: ChangeLog ================================================================== --- ChangeLog +++ ChangeLog @@ -1,8 +1,66 @@ Legend: * Changes of existing features or bugfixes + New features + +This file only contains the most significant changes. + +ObjFW 0.90.1 -> ObjFW 0.90.2, 23.10.2017 + * Fix shadowed variables which caused many bugs (e.g. using the wrong object) + * Many, many nullability fixes + * OFTCPSocket: Fix exception not being retained for async connect + * OFThread: Fix setting the name on the wrong thread + * OFMutableSet: Fix missing override for -[copy] + * configure: Fix posix_spawnp check + * Xcode project: Set the correct version for the bridge + * Better check for iOS + * tests: Fix testing the wrong OFKernelEventObserver + +ObjFW 0.90 -> ObjFW 0.90.1, 20.08.2017 + * OFData: Fix -[description] + * OFFileManager: Set errno to 0 before readdir() + * OFDate: Add -[localMinute] + * OFTarArchiveEntry: Fix prefix handling for ustar + * OFZIPArchive: Fix uncompressed + data descriptor + * OFArray: Fix MessagePack encoding + * of_asprintf: Don't require set up OFLocalization + * OFGZIPStream: Add missing documentation + * Fix a linker warning on OpenBSD/SPARC64 + * Remove the OFFile b modes from MorphOS + (they were already removed for all other OSes) + +ObjFW 0.8.1 -> ObjFW 0.90, 01.08.2017 + + New classes: OFFileManager, OFGZIPStream, OFTarArchive, OFTarArchiveEntry + OFHMAC, OFSandbox, OFHTTPCookie, OFHTTPCookieManager, + OFLocalization + + New platforms: Nintendo 3DS, MorphOS + + New lookup assembly for platforms: SPARC64/ELF, ARM64/ELF + + New forwarding for: ARM64/ELF + + New tools: objfw-new (to create boilerplate code) + + New options: --disable-unicode-tables + * Required GCC version increased to 4.6 + * OFDataArray was split into OFData and OFMutableData + * OFURL was split into OFURL and OFMutableURL + * Most properties are now nonatomic + (this changes from returned retained + autoreleased to +0 retained) + * Correct handling of encoding on Win32 console + (stream is read and written in UTF-8 and translated to UTF-16 on the fly) + * Runtime is now built as a separate library + + More encodings for strings + * Reworked OFOptionsParser API + * Refactored OFKernelEventObserver + * Better randomization of HTTP header order + * Allow overriding all HTTP headers + * Definition of thread priorities changed + + Key Value Coding + + Exceptions in ObjC++ + * OFHash was renamed to OFCryptoHash + + PBKDF2 + + scrypt + + Xcode project to build for iOS + + String decomposition to NFD + * OFFile modes simplified ('b' removed) ObjFW 0.8 -> ObjFW 0.8.1, 04.10.2015 * Adjust to __nullable / __nonnull being changed to _Nullable / _Nonnull in Clang 3.7 (this fixes compilation with Clang 3.7) * Blocks: Proper handling when called from a byref handler Index: Doxyfile ================================================================== --- Doxyfile +++ Doxyfile @@ -15,12 +15,12 @@ OF_HAVE_SANDBOX \ OF_HAVE_SOCKETS \ OF_HAVE_THREADS \ OF_NO_RETURN \ OF_NO_RETURN_FUNC \ - OF_NULLABLE_PROPERTY \ - OF_NULL_RESETTABLE_PROPERTY \ + OF_NULLABLE_PROPERTY(...)= \ + OF_NULL_RESETTABLE_PROPERTY(...)= \ OF_REQUIRES_SUPER \ OF_RETURNS_INNER_POINTER \ OF_RETURNS_NOT_RETAINED \ OF_RETURNS_RETAINED \ OF_ROOT_CLASS \ Index: ObjFW.xcodeproj/project.pbxproj ================================================================== --- ObjFW.xcodeproj/project.pbxproj +++ ObjFW.xcodeproj/project.pbxproj @@ -3801,10 +3801,11 @@ GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 2; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_PEDANTIC = YES; + GCC_WARN_SHADOW = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; ONLY_ACTIVE_ARCH = YES; @@ -3854,10 +3855,11 @@ GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 2; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_PEDANTIC = YES; + GCC_WARN_SHADOW = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; OTHER_CFLAGS = ( @@ -3891,12 +3893,12 @@ CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = MXKNFCKFL6; - DYLIB_COMPATIBILITY_VERSION = 7; - DYLIB_CURRENT_VERSION = 7; + DYLIB_COMPATIBILITY_VERSION = 8; + DYLIB_CURRENT_VERSION = 8; ENABLE_BITCODE = NO; FRAMEWORK_VERSION = A; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_OPTIMIZATION_LEVEL = 0; @@ -3930,12 +3932,12 @@ CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = MXKNFCKFL6; - DYLIB_COMPATIBILITY_VERSION = 7; - DYLIB_CURRENT_VERSION = 7; + DYLIB_COMPATIBILITY_VERSION = 8; + DYLIB_CURRENT_VERSION = 8; ENABLE_BITCODE = NO; FRAMEWORK_VERSION = A; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREPROCESSOR_DEFINITIONS = OF_BRIDGE_LOCAL_INCLUDES; @@ -3960,12 +3962,12 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 7; - DYLIB_CURRENT_VERSION = 7; + DYLIB_COMPATIBILITY_VERSION = 8; + DYLIB_CURRENT_VERSION = 8; FRAMEWORK_VERSION = A; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; @@ -3995,12 +3997,12 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 7; - DYLIB_CURRENT_VERSION = 7; + DYLIB_COMPATIBILITY_VERSION = 8; + DYLIB_CURRENT_VERSION = 8; FRAMEWORK_VERSION = A; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREPROCESSOR_DEFINITIONS = OF_BRIDGE_LOCAL_INCLUDES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; Index: configure.ac ================================================================== --- configure.ac +++ configure.ac @@ -1,6 +1,6 @@ -AC_INIT(ObjFW, 0.9-dev, js@heap.zone) +AC_INIT(ObjFW, 0.90.2, js@heap.zone) BUILDSYS_INIT AS_IF([test configure.ac -nt configure], [ AC_MSG_ERROR([configure.ac is newer than configure! Run autoreconf!]) ]) @@ -23,11 +23,10 @@ OBJCFLAGS="$OBJCFLAGS -noixemul" LDFLAGS="$LDFLAGS -noixemul" enable_files="yes" # Required for reading ENV: AC_SUBST(NOIXEMUL, -noixemul) - AC_SUBST(OBJFW_RT_MORPHOS_LIB, objfw-rt.library) ]) enable_shared="no" enable_threads="no" ;; @@ -175,10 +174,12 @@ OBJCFLAGS="$OBJCFLAGS -fno-constant-cfstrings" AC_SUBST(NO_CONST_CFSTRINGS, "-fno-constant-cfstrings") ]) AX_CHECK_COMPILER_FLAGS(-Wsign-compare -Werror, [OBJCFLAGS="$OBJCFLAGS -Wsign-compare"]) +AX_CHECK_COMPILER_FLAGS(-Wshadow -Werror, + [OBJCFLAGS="$OBJCFLAGS -Wshadow"]) AX_CHECK_COMPILER_FLAGS(-Wshorten-64-to-32 -Werror, [OBJCFLAGS="$OBJCFLAGS -Wshorten-64-to-32"]) AX_CHECK_COMPILER_FLAGS(-Wsemicolon-before-method-body -Werror, [OBJCFLAGS="$OBJCFLAGS -Wsemicolon-before-method-body"]) AX_CHECK_COMPILER_FLAGS(-Wobjc-missing-property-synthesis -Werror, @@ -655,12 +656,10 @@ AC_SUBST(ENCODINGS_A, "encodings.a") AC_SUBST(ENCODINGS_ENCODINGS_A, "encodings/encodings.a") ]) ]) -AC_CHECK_FUNCS(sigaction) - AC_CHECK_FUNCS(arc4random random, break) AC_CHECK_LIB(dl, dlopen, LIBS="$LIBS -ldl") AC_CHECK_HEADERS_ONCE(dlfcn.h) case "$host_os" in @@ -1040,10 +1039,11 @@ "OFKernelEventObserver_epoll.m") break ]) AS_IF([test x"$with_wii" = x"yes"], [ + AC_DEFINE(HAVE_POLL, 1, [Whether we have poll()]) AC_SUBST(OFKERNELEVENTOBSERVER_POLL_M, "OFKernelEventObserver_poll.m") ], [ AC_CHECK_HEADERS(poll.h) AC_CHECK_FUNC(poll, [ @@ -1202,11 +1202,11 @@ ;; *) AC_HEADER_SYS_WAIT AC_CHECK_FUNCS(kill) - AC_CHECK_FUNC(posix_spawnp, [ + AC_CHECK_FUNCS(posix_spawnp, [ AS_IF([test x"$ac_cv_func_kill" = x"yes"], [ have_processes="yes" AC_CHECK_HEADERS(spawn.h) ]) Index: extra.mk.in ================================================================== --- extra.mk.in +++ extra.mk.in @@ -1,15 +1,14 @@ OBJFW_SHARED_LIB = @OBJFW_SHARED_LIB@ OBJFW_STATIC_LIB = @OBJFW_STATIC_LIB@ # When changing: Be sure to also change these in the Xcode project! OBJFW_LIB_MAJOR = 8 -OBJFW_LIB_MINOR = 0 +OBJFW_LIB_MINOR = 1 OBJFW_LIB_MAJOR_MINOR = ${OBJFW_LIB_MAJOR}.${OBJFW_LIB_MINOR} OBJFW_RT_SHARED_LIB = @OBJFW_RT_SHARED_LIB@ OBJFW_RT_STATIC_LIB = @OBJFW_RT_STATIC_LIB@ -OBJFW_RT_MORPHOS_LIB = @OBJFW_RT_MORPHOS_LIB@ OBJFW_RT_LIB_MAJOR = 0 OBJFW_RT_LIB_MINOR = 0 OBJFW_RT_LIB_MAJOR_MINOR = ${OBJFW_RT_LIB_MAJOR}.${OBJFW_RT_LIB_MINOR} OBJFW_BRIDGE_SHARED_LIB = @OBJFW_BRIDGE_SHARED_LIB@ Index: src/OFApplication.h ================================================================== --- src/OFApplication.h +++ src/OFApplication.h @@ -126,16 +126,16 @@ OFArray OF_GENERIC(OFString *) *_arguments; OFMutableDictionary OF_GENERIC(OFString *, OFString *) *_environment; int *_argc; char ***_argv; @public - id _delegate; - void (*_SIGINTHandler)(id, SEL); + id _Nullable _delegate; + void (*_Nullable _SIGINTHandler)(id, SEL); #ifndef OF_WINDOWS - void (*_SIGHUPHandler)(id, SEL); - void (*_SIGUSR1Handler)(id, SEL); - void (*_SIGUSR2Handler)(id, SEL); + void (*_Nullable _SIGHUPHandler)(id, SEL); + void (*_Nullable _SIGUSR1Handler)(id, SEL); + void (*_Nullable _SIGUSR2Handler)(id, SEL); #endif } /*! * The name of the program (argv[0]). @@ -156,32 +156,32 @@ /*! * @brief Returns the only OFApplication instance in the application. * * @return The only OFApplication instance in the application */ -+ (OFApplication *)sharedApplication; ++ (nullable OFApplication *)sharedApplication; /*! * @brief Returns the name of the program (argv[0]). * * @return The name of the program (argv[0]) */ -+ (OFString *)programName; ++ (nullable OFString *)programName; /*! * @brief Returns the arguments passed to the application. * * @return The arguments passed to the application */ -+ (OFArray OF_GENERIC(OFString *) *)arguments; ++ (nullable OFArray OF_GENERIC(OFString *) *)arguments; /*! * @brief Returns the environment of the application. * * @return The environment of the application */ -+ (OFDictionary OF_GENERIC(OFString *, OFString *) *)environment; ++ (nullable OFDictionary OF_GENERIC(OFString *, OFString *) *)environment; /*! * @brief Terminates the application with the EXIT_SUCCESS status. */ + (void)terminate OF_NO_RETURN; Index: src/OFApplication.m ================================================================== --- src/OFApplication.m +++ src/OFApplication.m @@ -69,16 +69,10 @@ # define asm __asm__ # include # undef asm #endif -#ifdef HAVE_SIGACTION -# ifndef SA_RESTART -# define SA_RESTART 0 -# endif -#endif - @interface OFApplication () - (instancetype)of_init OF_METHOD_FAMILY(init); - (void)of_setArgumentCount: (int *)argc andArgumentValues: (char **[])argv; #ifdef OF_WINDOWS @@ -99,16 +93,16 @@ [delegate applicationWillTerminate]; [delegate release]; } -#define SIGNAL_HANDLER(sig) \ +#define SIGNAL_HANDLER(signal) \ static void \ - handle##sig(int signal) \ + handle##signal(int sig) \ { \ - app->_##sig##Handler(app->_delegate, \ - @selector(applicationDidReceive##sig)); \ + app->_##signal##Handler(app->_delegate, \ + @selector(applicationDidReceive##signal)); \ } SIGNAL_HANDLER(SIGINT) #ifdef SIGHUP SIGNAL_HANDLER(SIGHUP) #endif @@ -507,37 +501,21 @@ return _delegate; } - (void)setDelegate: (id )delegate { -#ifdef HAVE_SIGACTION - struct sigaction sa = { .sa_flags = SA_RESTART }; - sigemptyset(&sa.sa_mask); - -# define REGISTER_SIGNAL(sig) \ - if ([delegate respondsToSelector: \ - @selector(applicationDidReceive##sig)]) { \ - _##sig##Handler = (void (*)(id, SEL))[(id)delegate \ - methodForSelector: \ - @selector(applicationDidReceive##sig)]; \ - \ - sa.sa_handler = handle##sig; \ - } else \ - sa.sa_handler = SIG_DFL; \ - \ - OF_ENSURE(sigaction(sig, &sa, NULL) == 0); -#else -# define REGISTER_SIGNAL(sig) \ +#define REGISTER_SIGNAL(sig) \ if ([delegate respondsToSelector: \ @selector(applicationDidReceive##sig)]) { \ _##sig##Handler = (void (*)(id, SEL))[(id)delegate \ methodForSelector: \ @selector(applicationDidReceive##sig)]; \ signal(sig, handle##sig); \ - } else \ - signal(sig, (void (*)(int))SIG_DFL); -#endif + } else { \ + _##sig##Handler = NULL; \ + signal(sig, (void (*)(int))SIG_DFL); \ + } _delegate = delegate; REGISTER_SIGNAL(SIGINT) #ifdef SIGHUP Index: src/OFArray.h ================================================================== --- src/OFArray.h +++ src/OFArray.h @@ -218,11 +218,11 @@ * @note A @ref OFNull value is translated to nil! * * @param value The value for the specified key * @param key The key of the value to set */ -- (void)setValue: (nullable id)value +- (void)setValue: (id)value forKey: (OFString *)key; /*! * @brief Copies the objects at the specified range to the specified buffer. * @@ -264,21 +264,21 @@ * object. * * @param object The object which is checked for being in the array * @return A boolean whether the array contains the specified object */ -- (bool)containsObject: (nullable ObjectType)object; +- (bool)containsObject: (ObjectType)object; /*! * @brief Checks whether the array contains an object with the specified * address. * * @param object The object which is checked for being in the array * @return A boolean whether the array contains an object with the specified * address */ -- (bool)containsObjectIdenticalTo: (nullable ObjectType)object; +- (bool)containsObjectIdenticalTo: (ObjectType)object; /*! * @brief Returns the first object of the array or `nil`. * * @warning The returned object is *not* retained and autoreleased for @@ -483,19 +483,19 @@ #endif @end @interface OFArrayEnumerator: OFEnumerator { - OFArray *_array; - size_t _count; + OFArray *_array; + size_t _count; unsigned long _mutations; - unsigned long *_mutationsPtr; - size_t _position; + unsigned long *_Nullable _mutationsPtr; + size_t _position; } - initWithArray: (OFArray *)data - mutationsPtr: (unsigned long *_Nullable)mutationsPtr; + mutationsPtr: (nullable unsigned long *)mutationsPtr; @end OF_ASSUME_NONNULL_END #import "OFMutableArray.h" Index: src/OFArray.m ================================================================== --- src/OFArray.m +++ src/OFArray.m @@ -261,27 +261,26 @@ - mutableCopy { return [[OFMutableArray alloc] initWithArray: self]; } -- (id)objectAtIndex: (size_t)index +- (id)objectAtIndex: (size_t)idx { OF_UNRECOGNIZED_SELECTOR } -- (id)objectAtIndexedSubscript: (size_t)index +- (id)objectAtIndexedSubscript: (size_t)idx { - return [self objectAtIndex: index]; + return [self objectAtIndex: idx]; } - (id)valueForKey: (OFString *)key { - OFMutableArray *ret; + id ret; if ([key hasPrefix: @"@"]) { void *pool = objc_autoreleasePoolPush(); - id ret; key = [key substringWithRange: of_range(1, [key length] - 1)]; ret = [[super valueForKey: key] retain]; objc_autoreleasePoolPop(pool); @@ -317,13 +316,10 @@ objc_autoreleasePoolPop(pool); return; } - if (value == [OFNull null]) - value = nil; - for (id object in self) [object setValue: value forKey: key]; } @@ -450,21 +446,32 @@ if (separator == nil) @throw [OFInvalidArgumentException exception]; if ([self count] == 0) return @""; - if ([self count] == 1) - return [[self firstObject] performSelector: selector]; + + if ([self count] == 1) { + OFString *component = + [[self firstObject] performSelector: selector]; + + if (component == nil) + @throw [OFInvalidArgumentException exception]; + + return component; + } ret = [OFMutableString string]; if (options & OF_ARRAY_SKIP_EMPTY) { for (id object in self) { void *pool = objc_autoreleasePoolPush(); OFString *component = [object performSelector: selector]; + if (component == nil) + @throw [OFInvalidArgumentException exception]; + if ([component length] > 0) { if ([ret length] > 0) [ret appendString: separator]; [ret appendString: component]; } @@ -474,17 +481,22 @@ } else { bool first = true; for (id object in self) { void *pool = objc_autoreleasePoolPush(); + OFString *component = + [object performSelector: selector]; + + if (component == nil) + @throw [OFInvalidArgumentException exception]; if OF_UNLIKELY (first) first = false; else [ret appendString: separator]; - [ret appendString: [object performSelector: selector]]; + [ret appendString: component]; objc_autoreleasePoolPop(pool); } } @@ -674,11 +686,11 @@ [data addItem: &type]; [data addItems: &tmp count: sizeof(tmp)]; } else if (count <= UINT32_MAX) { - uint8_t type = 0xDC; + uint8_t type = 0xDD; uint32_t tmp = OF_BSWAP32_IF_LE((uint32_t)count); [data addItem: &type]; [data addItems: &tmp count: sizeof(tmp)]; @@ -717,13 +729,13 @@ } - (void)makeObjectsPerformSelector: (SEL)selector withObject: (id)object { - for (id object in self) - [object performSelector: selector - withObject: object]; + for (id objectIter in self) + [objectIter performSelector: selector + withObject: object]; } - (OFArray *)sortedArray { OFMutableArray *new = [[self mutableCopy] autorelease]; @@ -845,13 +857,13 @@ size_t count = [self count]; id *tmp = [self allocMemoryWithSize: sizeof(id) count: count]; @try { - [self enumerateObjectsUsingBlock: ^ (id object, size_t index, + [self enumerateObjectsUsingBlock: ^ (id object, size_t idx, bool *stop) { - tmp[index] = block(object, index); + tmp[idx] = block(object, idx); }]; ret = [OFArray arrayWithObjects: tmp count: count]; } @finally { @@ -869,13 +881,13 @@ count: count]; @try { __block size_t i = 0; - [self enumerateObjectsUsingBlock: ^ (id object, size_t index, + [self enumerateObjectsUsingBlock: ^ (id object, size_t idx, bool *stop) { - if (block(object, index)) + if (block(object, idx)) tmp[i++] = object; }]; ret = [OFArray arrayWithObjects: tmp count: i]; @@ -894,15 +906,15 @@ if (count == 0) return nil; if (count == 1) return [[[self firstObject] retain] autorelease]; - [self enumerateObjectsUsingBlock: ^ (id object, size_t index, + [self enumerateObjectsUsingBlock: ^ (id object, size_t idx, bool *stop) { id new; - if (index == 0) { + if (idx == 0) { current = [object retain]; return; } @try { Index: src/OFArray_adjacent.m ================================================================== --- src/OFArray_adjacent.m +++ src/OFArray_adjacent.m @@ -199,18 +199,18 @@ - (id const *)objects { return [_array items]; } -- (id)objectAtIndex: (size_t)index +- (id)objectAtIndex: (size_t)idx { - return *((id *)[_array itemAtIndex: index]); + return *((id *)[_array itemAtIndex: idx]); } -- (id)objectAtIndexedSubscript: (size_t)index +- (id)objectAtIndexedSubscript: (size_t)idx { - return *((id *)[_array itemAtIndex: index]); + return *((id *)[_array itemAtIndex: idx]); } - (void)getObjects: (id *)buffer inRange: (of_range_t)range { Index: src/OFArray_subarray.m ================================================================== --- src/OFArray_subarray.m +++ src/OFArray_subarray.m @@ -55,16 +55,16 @@ - (size_t)count { return _range.length; } -- (id)objectAtIndex: (size_t)index +- (id)objectAtIndex: (size_t)idx { - if (index >= _range.length) + if (idx >= _range.length) @throw [OFOutOfRangeException exception]; - return [_array objectAtIndex: index + _range.location]; + return [_array objectAtIndex: idx + _range.location]; } - (void)getObjects: (id *)buffer inRange: (of_range_t)range { @@ -78,36 +78,36 @@ inRange: range]; } - (size_t)indexOfObject: (id)object { - size_t index = [_array indexOfObject: object]; + size_t idx = [_array indexOfObject: object]; - if (index < _range.location) + if (idx < _range.location) return OF_NOT_FOUND; - index -= _range.location; + idx -= _range.location; - if (index >= _range.length) + if (idx >= _range.length) return OF_NOT_FOUND; - return index; + return idx; } - (size_t)indexOfObjectIdenticalTo: (id)object { - size_t index = [_array indexOfObjectIdenticalTo: object]; + size_t idx = [_array indexOfObjectIdenticalTo: object]; - if (index < _range.location) + if (idx < _range.location) return OF_NOT_FOUND; - index -= _range.location; + idx -= _range.location; - if (index >= _range.length) + if (idx >= _range.length) return OF_NOT_FOUND; - return index; + return idx; } - (OFArray *)objectsInRange: (of_range_t)range { if (range.length > SIZE_MAX - range.location || Index: src/OFCollection.h ================================================================== --- src/OFCollection.h +++ src/OFCollection.h @@ -36,9 +36,9 @@ * specified object. * * @param object The object which is checked for being in the collection * @return A boolean whether the collection contains the specified object */ -- (bool)containsObject: (nullable id)object; +- (bool)containsObject: (id)object; @end OF_ASSUME_NONNULL_END Index: src/OFConstantString.m ================================================================== --- src/OFConstantString.m +++ src/OFConstantString.m @@ -113,11 +113,11 @@ { #if defined(OF_APPLE_RUNTIME) && !defined(__OBJC2__) /* * objc_setFutureClass suddenly stopped working as OFConstantString * became more complex. So the only solution is to make - * _OFConstantStringClassRerence the actual class, but there is no + * _OFConstantStringClassReference the actual class, but there is no * objc_initializeClassPair in 10.5. However, objc_allocateClassPair * does not register the new class with the subclass in the ObjC1 * runtime like the ObjC2 runtime does, so this workaround should be * fine. */ @@ -326,15 +326,15 @@ [self finishInitialization]; return [self caseInsensitiveCompare: otherString]; } -- (of_unichar_t)characterAtIndex: (size_t)index +- (of_unichar_t)characterAtIndex: (size_t)idx { [self finishInitialization]; - return [self characterAtIndex: index]; + return [self characterAtIndex: idx]; } - (void)getCharacters: (of_unichar_t *)buffer inRange: (of_range_t)range { Index: src/OFData.h ================================================================== --- src/OFData.h +++ src/OFData.h @@ -32,11 +32,11 @@ * for OFData with item size 1. */ @interface OFData: OFObject { - char *_items; + unsigned char *_items; size_t _count, _itemSize; bool _freeWhenDone; } /*! Index: src/OFData.m ================================================================== --- src/OFData.m +++ src/OFData.m @@ -183,11 +183,11 @@ @try { if (itemSize == 0) @throw [OFInvalidArgumentException exception]; - _items = (char *)items; + _items = (unsigned char *)items; _itemSize = itemSize; _count = count; _freeWhenDone = freeWhenDone; } @catch (id e) { [self release]; @@ -453,16 +453,16 @@ - (const void *)items { return _items; } -- (const void *)itemAtIndex: (size_t)index +- (const void *)itemAtIndex: (size_t)idx { - if (index >= _count) + if (idx >= _count) @throw [OFOutOfRangeException exception]; - return _items + index * _itemSize; + return _items + idx * _itemSize; } - (const void *)firstItem { if (_items == NULL || _count == 0) Index: src/OFDate.h ================================================================== --- src/OFDate.h +++ src/OFDate.h @@ -186,10 +186,17 @@ * * @return The minute of the date */ - (uint8_t)minute; +/*! + * @brief Returns the minute of the date in local time. + * + * @return The minute of the date in local time + */ +- (uint8_t)localMinute; + /*! * @brief Returns the hour of the date. * * @return The hour of the date */ @@ -298,21 +305,21 @@ * If the argument is `nil`, it returns the receiver. * * @param otherDate Another date * @return The earlier date of the two dates */ -- (OFDate *)earlierDate: (OFDate *)otherDate; +- (OFDate *)earlierDate: (nullable OFDate *)otherDate; /*! * @brief Returns the later of the two dates. * * If the argument is `nil`, it returns the receiver. * * @param otherDate Another date * @return The later date of the two dates */ -- (OFDate *)laterDate: (OFDate *)otherDate; +- (OFDate *)laterDate: (nullable OFDate *)otherDate; /*! * @brief Returns the seconds since 1970-01-01T00:00:00Z. * * @return The seconds since 1970-01-01T00:00:00Z Index: src/OFDate.m ================================================================== --- src/OFDate.m +++ src/OFDate.m @@ -451,10 +451,15 @@ - (uint8_t)minute { GMTIME_RET(tm_min) } + +- (uint8_t)localMinute +{ + LOCALTIME_RET(tm_min) +} - (uint8_t)hour { GMTIME_RET(tm_hour) } Index: src/OFDictionary.h ================================================================== --- src/OFDictionary.h +++ src/OFDictionary.h @@ -219,31 +219,31 @@ * @ref OFUndefinedKeyException is thrown. * * @param key The key to set * @param value The value to set the key to */ -- (void)setValue: (nullable id)value +- (void)setValue: (id)value forKey: (OFString *)key; /*! * @brief Checks whether the dictionary contains an object equal to the * specified object. * * @param object The object which is checked for being in the dictionary * @return A boolean whether the dictionary contains the specified object */ -- (bool)containsObject: (nullable ObjectType)object; +- (bool)containsObject: (ObjectType)object; /*! * @brief Checks whether the dictionary contains an object with the specified * address. * * @param object The object which is checked for being in the dictionary * @return A boolean whether the dictionary contains an object with the * specified address */ -- (bool)containsObjectIdenticalTo: (nullable ObjectType)object; +- (bool)containsObjectIdenticalTo: (ObjectType)object; /*! * @brief Returns an array of all keys. * * @return An array of all keys Index: src/OFFile.m ================================================================== --- src/OFFile.m +++ src/OFFile.m @@ -132,44 +132,26 @@ { *append = false; if (strcmp(mode, "r") == 0) return MODE_OLDFILE; + if (strcmp(mode, "r+") == 0) + return MODE_OLDFILE; if (strcmp(mode, "w") == 0) return MODE_NEWFILE; if (strcmp(mode, "wx") == 0) return MODE_NEWFILE; + if (strcmp(mode, "w+") == 0) + return MODE_NEWFILE; + if (strcmp(mode, "w+x") == 0) + return MODE_NEWFILE; if (strcmp(mode, "a") == 0) { *append = true; return MODE_READWRITE; } - if (strcmp(mode, "rb") == 0) - return MODE_OLDFILE; - if (strcmp(mode, "wb") == 0) - return MODE_NEWFILE; - if (strcmp(mode, "wbx") == 0) - return MODE_NEWFILE; - if (strcmp(mode, "ab") == 0) { - *append = true; - return MODE_READWRITE; - } - if (strcmp(mode, "r+") == 0) - return MODE_OLDFILE; - if (strcmp(mode, "w+") == 0) - return MODE_NEWFILE; if (strcmp(mode, "a+") == 0) { *append = true; - return MODE_READWRITE; - } - if (strcmp(mode, "r+b") == 0 || strcmp(mode, "rb+") == 0) - return MODE_OLDFILE; - if (strcmp(mode, "w+b") == 0 || strcmp(mode, "wb+") == 0) - return MODE_NEWFILE; - if (strcmp(mode, "w+bx") == 0 || strcmp(mode, "wb+x") == 0) - return MODE_NEWFILE; - if (strcmp(mode, "ab+") == 0 || strcmp(mode, "a+b") == 0) { - *append = true; return MODE_READWRITE; } return -1; } Index: src/OFFileManager.m ================================================================== --- src/OFFileManager.m +++ src/OFFileManager.m @@ -571,10 +571,11 @@ errNo: errno]; if (dirent == NULL) break; # else + errno = 0; if ((dirent = readdir(dir)) == NULL) { if (errno == 0) break; else @throw [OFReadFailedException Index: src/OFGZIPStream.h ================================================================== --- src/OFGZIPStream.h +++ src/OFGZIPStream.h @@ -19,14 +19,20 @@ @class OFInflateStream; OF_ASSUME_NONNULL_BEGIN +/*! + * @class OFGZIPStream OFGZIPStream.h ObjFW/OFGZIPStream.h + * + * @brief A class that handles GZIP compression and decompression transparently + * for an underlying stream. + */ @interface OFGZIPStream: OFStream { OFStream *_stream; - OFInflateStream *_inflateStream; + 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, @@ -67,16 +73,31 @@ OF_GZIP_STREAM_OS_ACORN_RISCOS = 13, OF_GZIP_STREAM_OS_UNKNOWN = 255 } _OS; size_t _bytesRead; uint8_t _buffer[4]; - OFDate *_modificationDate; + OFDate *_Nullable _modificationDate; uint16_t _extraLength; uint32_t _CRC32, _uncompressedSize; } +/*! + * @brief Creates a new OFGZIPStream with the specified underlying stream. + * + * @param stream The underlying stream for the OFGZIPStream + * @return A new, autoreleased OFGZIPStream + */ + (instancetype)streamWithStream: (OFStream *)stream; + - init OF_UNAVAILABLE; + +/*! + * @brief Initializes an already allocated OFGZIPStream with the specified + * underlying stream. + * + * @param stream The underlying stream for the OFGZIPStream + * @return An initialized OFGZIPStream + */ - initWithStream: (OFStream *)stream OF_DESIGNATED_INITIALIZER; @end OF_ASSUME_NONNULL_END Index: src/OFHMAC.h ================================================================== --- src/OFHMAC.h +++ src/OFHMAC.h @@ -25,12 +25,12 @@ * @brief A class which provides methods to calculate an HMAC. */ @interface OFHMAC: OFObject { Class _hashClass; - id _outerHash, _innerHash; - id _outerHashCopy, _innerHashCopy; + id _Nullable _outerHash, _innerHash; + id _Nullable _outerHashCopy, _innerHashCopy; bool _calculated; } /*! The class for the cryptographic hash used by the HMAC. */ @property (readonly, nonatomic) Class hashClass; Index: src/OFHTTPClient.h ================================================================== --- src/OFHTTPClient.h +++ src/OFHTTPClient.h @@ -102,16 +102,16 @@ * * @brief A class for performing HTTP requests. */ @interface OFHTTPClient: OFObject { - id _delegate; + id _Nullable _delegate; bool _insecureRedirectsAllowed; - OFTCPSocket *_socket; - OFURL *_lastURL; + OFTCPSocket *_Nullable _socket; + OFURL *_Nullable _lastURL; bool _lastWasHEAD; - OFHTTPResponse *_lastResponse; + OFHTTPResponse *_Nullable _lastResponse; } /*! * The delegate of the HTTP request. */ Index: src/OFHTTPClient.m ================================================================== --- src/OFHTTPClient.m +++ src/OFHTTPClient.m @@ -70,21 +70,21 @@ size_t _toRead; } @property (nonatomic, setter=of_setKeepAlive:) bool of_keepAlive; -- initWithSocket: (OFTCPSocket *)socket; +- initWithSocket: (OFTCPSocket *)sock; @end @implementation OFHTTPClientResponse @synthesize of_keepAlive = _keepAlive; -- initWithSocket: (OFTCPSocket *)socket +- initWithSocket: (OFTCPSocket *)sock { self = [super init]; - _socket = [socket retain]; + _socket = [sock retain]; return self; } - (void)dealloc @@ -286,34 +286,33 @@ } - (OFTCPSocket *)of_closeAndCreateSocketForRequest: (OFHTTPRequest *)request { OFURL *URL = [request URL]; - OFTCPSocket *socket; + OFTCPSocket *sock; [self close]; if ([[URL scheme] isEqual: @"https"]) { if (of_tls_socket_class == Nil) @throw [OFUnsupportedProtocolException exceptionWithURL: URL]; - socket = [[[of_tls_socket_class alloc] init] - autorelease]; + sock = [[[of_tls_socket_class alloc] init] autorelease]; } else - socket = [OFTCPSocket socket]; + sock = [OFTCPSocket socket]; if ([_delegate respondsToSelector: @selector(client:didCreateSocket:request:)]) [_delegate client: self - didCreateSocket: socket + didCreateSocket: sock request: request]; - [socket connectToHost: [URL host] - port: [URL port]]; + [sock connectToHost: [URL host] + port: [URL port]]; - return socket; + return sock; } - (OFHTTPResponse *)performRequest: (OFHTTPRequest *)request redirects: (size_t)redirects { @@ -324,11 +323,11 @@ OFString *path; OFMutableString *requestString; OFString *user, *password; OFMutableDictionary OF_GENERIC(OFString *, OFString *) *headers; OFData *body = [request body]; - OFTCPSocket *socket; + OFTCPSocket *sock; OFHTTPClientResponse *response; OFString *line, *version, *redirect, *connectionHeader; bool keepAlive; OFMutableDictionary OF_GENERIC(OFString *, OFString *) *serverHeaders; OFEnumerator *keyEnumerator, *objectEnumerator; @@ -345,11 +344,11 @@ /* * Set _socket to nil, so that in case of an error it won't be * reused. If everything is successful, we set _socket again * at the end. */ - socket = [_socket autorelease]; + sock = [_socket autorelease]; _socket = nil; [_lastURL release]; _lastURL = nil; @@ -369,11 +368,11 @@ } @finally { [_lastResponse release]; _lastResponse = nil; } } else - socket = [self of_closeAndCreateSocketForRequest: request]; + sock = [self of_closeAndCreateSocketForRequest: request]; /* * As a work around for a bug with split packets in lighttpd when using * HTTPS, we construct the complete request in a buffer string and then * send it all at once. @@ -470,26 +469,26 @@ [requestString appendFormat: @"%@: %@\r\n", key, object]; [requestString appendString: @"\r\n"]; @try { - [socket writeString: requestString]; + [sock writeString: requestString]; } @catch (OFWriteFailedException *e) { if ([e errNo] != ECONNRESET && [e errNo] != EPIPE) @throw e; /* Reconnect in case a keep-alive connection timed out */ - socket = [self of_closeAndCreateSocketForRequest: request]; - [socket writeString: requestString]; + sock = [self of_closeAndCreateSocketForRequest: request]; + [sock writeString: requestString]; } if (body != nil) - [socket writeBuffer: [body items] - length: [body count] * [body itemSize]]; + [sock writeBuffer: [body items] + length: [body count] * [body itemSize]]; @try { - line = [socket readLine]; + line = [sock readLine]; } @catch (OFInvalidEncodingException *e) { @throw [OFInvalidServerReplyException exception]; } /* @@ -496,20 +495,19 @@ * It's possible that the write succeeds on a connection that is * keep-alive, but the connection has already been closed by the remote * end due to a timeout. In this case, we need to reconnect. */ if (line == nil) { - socket = [self of_closeAndCreateSocketForRequest: request]; - [socket writeString: requestString]; + sock = [self of_closeAndCreateSocketForRequest: request]; + [sock writeString: requestString]; if (body != nil) - [socket writeBuffer: [body items] - length: [body count] * - [body itemSize]]; + [sock writeBuffer: [body items] + length: [body count] * [body itemSize]]; @try { - line = [socket readLine]; + line = [sock readLine]; } @catch (OFInvalidEncodingException *e) { @throw [OFInvalidServerReplyException exception]; } } @@ -525,16 +523,16 @@ status = (int)[[line substringWithRange: of_range(9, 3)] decimalValue]; serverHeaders = [OFMutableDictionary dictionary]; for (;;) { - OFString *key, *value, *old; + OFString *value, *old; const char *lineC, *tmp; char *keyC; @try { - line = [socket readLine]; + line = [sock readLine]; } @catch (OFInvalidEncodingException *e) { @throw [OFInvalidServerReplyException exception]; } if (line == nil) @@ -585,11 +583,11 @@ [_delegate client: self didReceiveHeaders: serverHeaders statusCode: status request: request]; - response = [[[OFHTTPClientResponse alloc] initWithSocket: socket] + response = [[[OFHTTPClientResponse alloc] initWithSocket: sock] autorelease]; [response setProtocolVersionFromString: version]; [response setStatusCode: status]; [response setHeaders: serverHeaders]; @@ -609,11 +607,11 @@ } if (keepAlive) { [response of_setKeepAlive: true]; - _socket = [socket retain]; + _socket = [sock retain]; _lastURL = [URL copy]; _lastWasHEAD = (method == OF_HTTP_REQUEST_METHOD_HEAD); _lastResponse = [response retain]; } @@ -669,13 +667,10 @@ * 303 means the request should be converted to a GET * request before redirection. This also means stripping * the entity of the request. */ if (status == 303) { - OFEnumerator *keyEnumerator, *objectEnumerator; - id key, object; - keyEnumerator = [headers keyEnumerator]; objectEnumerator = [headers objectEnumerator]; while ((key = [keyEnumerator nextObject]) != nil && (object = [objectEnumerator nextObject]) != Index: src/OFHTTPCookie.h ================================================================== --- src/OFHTTPCookie.h +++ src/OFHTTPCookie.h @@ -31,11 +31,11 @@ * @brief A class for storing and manipulating HTTP cookies. */ @interface OFHTTPCookie: OFObject { OFString *_name, *_value, *_domain, *_path; - OFDate *_expires; + OFDate *_Nullable _expires; bool _secure, _HTTPOnly; OFMutableArray OF_GENERIC(OFString *) *_extensions; } /*! Index: src/OFHTTPRequest.h ================================================================== --- src/OFHTTPRequest.h +++ src/OFHTTPRequest.h @@ -69,13 +69,13 @@ @interface OFHTTPRequest: OFObject { OFURL *_URL; of_http_request_method_t _method; of_http_request_protocol_version_t _protocolVersion; - OFDictionary OF_GENERIC(OFString *, OFString *) *_headers; - OFData *_body; - OFString *_remoteAddress; + OFDictionary OF_GENERIC(OFString *, OFString *) *_Nullable _headers; + OFData *_Nullable _body; + OFString *_Nullable _remoteAddress; } /*! * The URL of the HTTP request. */ Index: src/OFHTTPResponse.h ================================================================== --- src/OFHTTPResponse.h +++ src/OFHTTPResponse.h @@ -40,12 +40,12 @@ @property (nonatomic) short statusCode; /*! * The headers of the reply to the HTTP request. */ -@property OF_NULLABLE_PROPERTY (nonatomic, copy) - OFDictionary OF_GENERIC(OFString *, OFString *) *headers; +@property (copy, nonatomic) OFDictionary OF_GENERIC(OFString *, OFString *) + *headers; /*! * @brief Sets the protocol version of the HTTP request reply. * * @param protocolVersion The protocol version of the HTTP request reply Index: src/OFHTTPResponse.m ================================================================== --- src/OFHTTPResponse.m +++ src/OFHTTPResponse.m @@ -140,12 +140,18 @@ - init { self = [super init]; - _protocolVersion.major = 1; - _protocolVersion.minor = 1; + @try { + _protocolVersion.major = 1; + _protocolVersion.minor = 1; + _headers = [[OFDictionary alloc] init]; + } @catch (id e) { + [self release]; + @throw e; + } return self; } - (void)dealloc Index: src/OFHTTPServer.h ================================================================== --- src/OFHTTPServer.h +++ src/OFHTTPServer.h @@ -86,15 +86,15 @@ * * @brief A class for creating a simple HTTP server inside of applications. */ @interface OFHTTPServer: OFObject { - OFString *_host; + OFString *_Nullable _host; uint16_t _port; - id _delegate; - OFString *_name; - OFTCPSocket *_listeningSocket; + id _Nullable _delegate; + OFString *_Nullable _name; + OFTCPSocket *_Nullable _listeningSocket; } /*! * The host on which the HTTP server will listen. */ Index: src/OFHTTPServer.m ================================================================== --- src/OFHTTPServer.m +++ src/OFHTTPServer.m @@ -45,11 +45,11 @@ * FIXME: Key normalization replaces headers like "DNT" with "Dnt". * FIXME: Errors are not reported to the user. */ @interface OFHTTPServer () -- (bool)of_socket: (OFTCPSocket *)socket +- (bool)of_socket: (OFTCPSocket *)sock didAcceptSocket: (OFTCPSocket *)clientSocket exception: (OFException *)exception; @end static const char * @@ -177,24 +177,24 @@ OFHTTPServer *_server; OFHTTPRequest *_request; bool _chunked, _headersSent; } -- initWithSocket: (OFTCPSocket *)socket +- initWithSocket: (OFTCPSocket *)sock server: (OFHTTPServer *)server request: (OFHTTPRequest *)request; @end @implementation OFHTTPServerResponse -- initWithSocket: (OFTCPSocket *)socket +- initWithSocket: (OFTCPSocket *)sock server: (OFHTTPServer *)server request: (OFHTTPRequest *)request { self = [super init]; _statusCode = 500; - _socket = [socket retain]; + _socket = [sock retain]; _server = [server retain]; _request = [request retain]; return self; } @@ -336,37 +336,37 @@ OFMutableDictionary *_headers; size_t _contentLength; OFMutableData *_body; } -- initWithSocket: (OFTCPSocket *)socket +- initWithSocket: (OFTCPSocket *)sock server: (OFHTTPServer *)server; -- (bool)socket: (OFTCPSocket *)socket +- (bool)socket: (OFTCPSocket *)sock didReadLine: (OFString *)line exception: (OFException *)exception; - (bool)parseProlog: (OFString *)line; - (bool)parseHeaders: (OFString *)line; -- (bool)socket: (OFTCPSocket *)socket +- (bool)socket: (OFTCPSocket *)sock didReadIntoBuffer: (char *)buffer length: (size_t)length exception: (OFException *)exception; - (bool)sendErrorAndClose: (short)statusCode; - (void)createResponse; @end @implementation OFHTTPServer_Connection -- initWithSocket: (OFTCPSocket *)socket +- initWithSocket: (OFTCPSocket *)sock server: (OFHTTPServer *)server { self = [super init]; @try { - _socket = [socket retain]; + _socket = [sock retain]; _server = [server retain]; _timer = [[OFTimer scheduledTimerWithTimeInterval: 10 - target: socket + target: _socket selector: @selector( cancelAsyncRequests) repeats: false] retain]; _state = AWAITING_PROLOG; } @catch (id e) { @@ -391,11 +391,11 @@ [_body release]; [super dealloc]; } -- (bool)socket: (OFTCPSocket *)socket +- (bool)socket: (OFTCPSocket *)sock didReadLine: (OFString *)line exception: (OFException *)exception { if (line == nil || exception != nil) return false; @@ -567,16 +567,16 @@ } return true; } -- (bool)socket: (OFTCPSocket *)socket +- (bool)socket: (OFTCPSocket *)sock didReadIntoBuffer: (char *)buffer length: (size_t)length exception: (OFException *)exception { - if ([socket isAtEndOfStream] || exception != nil) + if ([sock isAtEndOfStream] || exception != nil) return false; [_body addItems: buffer count: length]; @@ -731,11 +731,11 @@ [_listeningSocket cancelAsyncRequests]; [_listeningSocket release]; _listeningSocket = nil; } -- (bool)of_socket: (OFTCPSocket *)socket +- (bool)of_socket: (OFTCPSocket *)sock didAcceptSocket: (OFTCPSocket *)clientSocket exception: (OFException *)exception { OFHTTPServer_Connection *connection; Index: src/OFINICategory+Private.h ================================================================== --- src/OFINICategory+Private.h +++ src/OFINICategory+Private.h @@ -20,13 +20,13 @@ OF_ASSUME_NONNULL_BEGIN @class OFStream; @interface OFINICategory () -- (instancetype)of_init OF_METHOD_FAMILY(init); +- (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 first: (bool)first; @end OF_ASSUME_NONNULL_END Index: src/OFINICategory.m ================================================================== --- src/OFINICategory.m +++ src/OFINICategory.m @@ -119,15 +119,16 @@ @end @implementation OFINICategory @synthesize name = _name; -- (instancetype)of_init +- (instancetype)of_initWithName: (OFString *)name { self = [super init]; @try { + _name = [name copy]; _lines = [[OFMutableArray alloc] init]; } @catch (id e) { [self release]; @throw e; } @@ -507,17 +508,17 @@ [stream writeFormat: @"%@\r\n", comment->_comment]; } else if ([line isKindOfClass: [OFINICategory_Pair class]]) { OFINICategory_Pair *pair = line; OFString *key = escapeString(pair->_key); OFString *value = escapeString(pair->_value); - OFString *line = [OFString + OFString *tmp = [OFString stringWithFormat: @"%@=%@\r\n", key, value]; - [stream writeString: line + [stream writeString: tmp encoding: encoding]; } else @throw [OFInvalidArgumentException exception]; } return true; } @end Index: src/OFINIFile.m ================================================================== --- src/OFINIFile.m +++ src/OFINIFile.m @@ -102,12 +102,11 @@ for (category in _categories) if ([[category name] isEqual: name]) return category; - category = [[[OFINICategory alloc] of_init] autorelease]; - [category setName: name]; + category = [[[OFINICategory alloc] of_initWithName: name] autorelease]; [_categories addObject: category]; objc_autoreleasePoolPop(pool); return category; @@ -144,12 +143,11 @@ categoryName = [line substringWithRange: of_range(1, [line length] - 2)]; category = [[[OFINICategory alloc] - of_init] autorelease]; - [category setName: categoryName]; + of_initWithName: categoryName] autorelease]; [_categories addObject: category]; } else { if (category == nil) @throw [OFInvalidFormatException exception]; Index: src/OFInflateStream.h ================================================================== --- src/OFInflateStream.h +++ src/OFInflateStream.h @@ -35,11 +35,11 @@ uint8_t _buffer[OF_INFLATE_STREAM_BUFFER_SIZE]; uint16_t _bufferIndex, _bufferLength; uint8_t _byte; uint8_t _bitIndex, _savedBitsLength; uint16_t _savedBits; - uint8_t *_slidingWindow; + uint8_t *_Nullable _slidingWindow; uint16_t _slidingWindowIndex, _slidingWindowMask; int _state; union { struct { uint8_t position; @@ -47,20 +47,23 @@ } uncompressedHeader; struct { uint16_t position, length; } uncompressed; struct { - struct huffman_tree *litLenTree, *distTree; - struct huffman_tree *codeLenTree, *treeIter; - uint8_t *lengths; + struct huffman_tree *_Nullable litLenTree; + struct huffman_tree *_Nullable distTree; + struct huffman_tree *_Nullable codeLenTree; + struct huffman_tree *_Nullable treeIter; + uint8_t *_Nullable lengths; uint16_t receivedCount; uint8_t value, litLenCodesCount, distCodesCount; uint8_t codeLenCodesCount; } huffmanTree; struct { - struct huffman_tree *litLenTree, *distTree; - struct huffman_tree *treeIter; + struct huffman_tree *_Nullable litLenTree; + struct huffman_tree *_Nullable distTree; + struct huffman_tree *_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 @@ -684,20 +684,20 @@ if OF_UNLIKELY (_slidingWindow == NULL) @throw [OFInvalidFormatException exception]; for (j = 0; j < CTX.length; j++) { - uint16_t index; + uint16_t idx; if OF_UNLIKELY (length == 0) { CTX.length -= j; return bytesWritten; } - index = (_slidingWindowIndex - + idx = (_slidingWindowIndex - CTX.distance) & _slidingWindowMask; - value = _slidingWindow[index]; + value = _slidingWindow[idx]; buffer[bytesWritten++] = value; length--; _slidingWindow[_slidingWindowIndex] = Index: src/OFIntrospection.h ================================================================== --- src/OFIntrospection.h +++ src/OFIntrospection.h @@ -72,11 +72,11 @@ */ @interface OFProperty: OFObject { OFString *_name; unsigned _attributes; - OFString *_getter, *_setter; + OFString *_Nullable _getter, *_Nullable _setter; } /*! * The name of the property. */ Index: src/OFIntrospection.m ================================================================== --- src/OFIntrospection.m +++ src/OFIntrospection.m @@ -385,12 +385,15 @@ - (instancetype)of_initWithIvar: (Ivar)ivar { self = [super init]; @try { - _name = [[OFString alloc] - initWithUTF8String: ivar_getName(ivar)]; + const char *name = ivar_getName(ivar); + + if (name != NULL) + _name = [[OFString alloc] initWithUTF8String: name]; + _typeEncoding = ivar_getTypeEncoding(ivar); _offset = ivar_getOffset(ivar); } @catch (id e) { [self release]; @throw e; Index: src/OFKernelEventObserver.h ================================================================== --- src/OFKernelEventObserver.h +++ src/OFKernelEventObserver.h @@ -109,11 +109,11 @@ { OFMutableArray OF_GENERIC(id ) *_readObjects; OFMutableArray OF_GENERIC(id ) *_writeObjects; - id _delegate; + id _Nullable _delegate; #ifdef OF_HAVE_PIPE int _cancelFD[2]; #else of_socket_t _cancelFD[2]; struct sockaddr_in _cancelAddr; Index: src/OFKeyValueCoding.h ================================================================== --- src/OFKeyValueCoding.h +++ src/OFKeyValueCoding.h @@ -52,11 +52,11 @@ * @brief Set the value for the specified key * * @param value The value for the specified key * @param key The key of the value to set */ -- (void)setValue: (nullable id)value +- (void)setValue: (id)value forKey: (OFString *)key; /*! * @brief This is called by @ref setValue:forKey: if the specified key does not * exist. Index: src/OFList.h ================================================================== --- src/OFList.h +++ src/OFList.h @@ -29,15 +29,15 @@ * * A struct that contains a pointer to the next list object, the previous list * object and the object. */ struct of_list_object_t { - /// A pointer to the next list object in the list - of_list_object_t *next; - /// A pointer to the previous list object in the list - of_list_object_t *previous; - /// The object for the list object + /*! 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; }; /*! * @class OFList OFList.h ObjFW/OFList.h @@ -48,14 +48,14 @@ OFSerialization> #if !defined(OF_HAVE_GENERICS) && !defined(DOXYGEN) # define ObjectType id #endif { - of_list_object_t *_firstListObject; - of_list_object_t *_lastListObject; - size_t _count; - unsigned long _mutations; + of_list_object_t *_Nullable _firstListObject; + of_list_object_t *_Nullable _lastListObject; + size_t _count; + unsigned long _mutations; } /*! * The first list object of the list. */ @@ -133,20 +133,20 @@ * object. * * @param object The object which is checked for being in the list * @return A boolean whether the list contains the specified object */ -- (bool)containsObject: (nullable ObjectType)object; +- (bool)containsObject: (ObjectType)object; /*! * @brief Checks whether the list contains an object with the specified address. * * @param object The object which is checked for being in the list * @return A boolean whether the list contains an object with the specified * address */ -- (bool)containsObjectIdenticalTo: (nullable ObjectType)object; +- (bool)containsObjectIdenticalTo: (ObjectType)object; /*! * @brief Returns an OFEnumerator to enumerate through all objects of the list. * * @returns An OFEnumerator to enumerate through all objects of the list @@ -182,16 +182,16 @@ #endif @end @interface OFListEnumerator: OFEnumerator { - OFList *_list; - of_list_object_t *_current; - unsigned long _mutations; - unsigned long *_mutationsPtr; + OFList *_list; + of_list_object_t *_Nullable _current; + unsigned long _mutations; + unsigned long *_Nullable _mutationsPtr; } - initWithList: (OFList *)list mutationsPointer: (unsigned long *)mutationsPtr; @end OF_ASSUME_NONNULL_END Index: src/OFLocalization.h ================================================================== --- src/OFLocalization.h +++ src/OFLocalization.h @@ -34,12 +34,11 @@ * * @brief A class for querying the locale and retrieving localized strings. */ @interface OFLocalization: OFObject { - OFString *_language; - OFString *_territory; + OFString *_Nullable _language, *_Nullable _territory; of_string_encoding_t _encoding; OFString *_decimalPoint; OFMutableArray OF_GENERIC(OFDictionary OF_GENERIC(OFString *, id) *) *_localizedStrings; } @@ -80,11 +79,11 @@ * case, you need to manually allocate an instance and call * @ref init once. * * @return The shared OFLocalization instance */ -+ (instancetype)sharedLocalization; ++ (nullable instancetype)sharedLocalization; /** * @brief Returns the language of the locale. * * If the language is unknown, `nil` is returned. @@ -117,11 +116,11 @@ /*! * @brief Returns the decimal point of the system's locale. * * @return The decimal point of the system's locale */ -+ (OFString *)decimalPoint; ++ (nullable OFString *)decimalPoint; #ifdef OF_HAVE_FILES /*! * @brief Adds a directory to scan for language files. * Index: src/OFLocalization.m ================================================================== --- src/OFLocalization.m +++ src/OFLocalization.m @@ -143,11 +143,11 @@ if (messagesLocale != NULL) { void *pool = objc_autoreleasePoolPush(); parseLocale(messagesLocale, &_encoding, - &_language, &_language); + &_language, &_territory); [_language retain]; [_territory retain]; objc_autoreleasePoolPop(pool); Index: src/OFMapTable.h ================================================================== --- src/OFMapTable.h +++ src/OFMapTable.h @@ -25,18 +25,19 @@ * @struct of_map_table_functions_t OFMapTable.h ObjFW/OFMapTable.h * * @brief A struct describing the functions to be used by the map table. */ typedef struct { - /// The function to retain keys / objects - void *_Nonnull (*_Nullable retain)(void *object); - /// The function to release keys / objects - void (*_Nullable release)(void *object); - /// The function to hash keys - uint32_t (*_Nullable hash)(void *object); - /// The function to compare keys / objects - bool (*_Nullable equal)(void *object1, void *object2); + /*! 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 */ + uint32_t (*_Nullable hash)(void *_Nullable object); + /*! The function to compare keys / objects */ + bool (*_Nullable equal)(void *_Nullable object1, + void *_Nullable object2); } of_map_table_functions_t; #ifdef OF_HAVE_BLOCKS /*! * @brief A block for enumerating an OFMapTable. @@ -68,11 +69,11 @@ * and objects should be retained, released, compared and hashed. */ @interface OFMapTable: OFObject { of_map_table_functions_t _keyFunctions, _objectFunctions; - struct of_map_table_bucket **_buckets; + struct of_map_table_bucket *_Nonnull *_Nullable _buckets; uint32_t _count, _capacity; uint8_t _rotate; unsigned long _mutations; } @@ -235,14 +236,14 @@ * keys or objects. */ @interface OFMapTableEnumerator: OFObject { OFMapTable *_mapTable; - struct of_map_table_bucket **_buckets; + struct of_map_table_bucket *_Nonnull *_Nullable _buckets; uint32_t _capacity; unsigned long _mutations; - unsigned long *_mutationsPtr; + unsigned long *_Nullable _mutationsPtr; uint32_t _position; } - init OF_UNAVAILABLE; @@ -249,15 +250,15 @@ /*! * @brief Returns the next object. * * @return The next object */ -- (void *)nextObject; +- (nullable void *)nextObject; /*! * @brief Resets the enumerator, so the next call to @ref nextKey returns the * first key again. */ - (void)reset; @end OF_ASSUME_NONNULL_END Index: src/OFMapTable.m ================================================================== --- src/OFMapTable.m +++ src/OFMapTable.m @@ -207,14 +207,14 @@ mapTable->_objectFunctions.equal != _objectFunctions.equal) return false; for (uint32_t i = 0; i < _capacity; i++) { if (_buckets[i] != NULL && _buckets[i] != &deleted) { - void *object = + void *objectIter = [mapTable objectForKey: _buckets[i]->key]; - if (!_objectFunctions.equal(object, + if (!_objectFunctions.equal(objectIter, _buckets[i]->object)) return false; } } Index: src/OFMutableArray.m ================================================================== --- src/OFMutableArray.m +++ src/OFMutableArray.m @@ -208,35 +208,35 @@ [self insertObjectsFromArray: array atIndex: [self count]]; } - (void)insertObject: (id)object - atIndex: (size_t)index + atIndex: (size_t)idx { OF_UNRECOGNIZED_SELECTOR } - (void)insertObjectsFromArray: (OFArray *)array - atIndex: (size_t)index + atIndex: (size_t)idx { size_t i = 0; for (id object in array) [self insertObject: object - atIndex: index + i++]; + atIndex: idx + i++]; } -- (void)replaceObjectAtIndex: (size_t)index +- (void)replaceObjectAtIndex: (size_t)idx withObject: (id)object { OF_UNRECOGNIZED_SELECTOR } - (void)setObject: (id)object - atIndexedSubscript: (size_t)index + atIndexedSubscript: (size_t)idx { - [self replaceObjectAtIndex: index + [self replaceObjectAtIndex: idx withObject: object]; } - (void)replaceObject: (id)oldObject withObject: (id)newObject @@ -275,11 +275,11 @@ return; } } } -- (void)removeObjectAtIndex: (size_t)index +- (void)removeObjectAtIndex: (size_t)idx { OF_UNRECOGNIZED_SELECTOR } - (void)removeObject: (id)object @@ -340,32 +340,32 @@ } #ifdef OF_HAVE_BLOCKS - (void)replaceObjectsUsingBlock: (of_array_replace_block_t)block { - [self enumerateObjectsUsingBlock: ^ (id object, size_t index, + [self enumerateObjectsUsingBlock: ^ (id object, size_t idx, bool *stop) { - id new = block(object, index); + id new = block(object, idx); if (new != object) - [self replaceObjectAtIndex: index + [self replaceObjectAtIndex: idx withObject: new]; }]; } #endif -- (void)exchangeObjectAtIndex: (size_t)index1 - withObjectAtIndex: (size_t)index2 +- (void)exchangeObjectAtIndex: (size_t)idx1 + withObjectAtIndex: (size_t)idx2 { - id object1 = [self objectAtIndex: index1]; - id object2 = [self objectAtIndex: index2]; + id object1 = [self objectAtIndex: idx1]; + id object2 = [self objectAtIndex: idx2]; [object1 retain]; @try { - [self replaceObjectAtIndex: index1 + [self replaceObjectAtIndex: idx1 withObject: object2]; - [self replaceObjectAtIndex: index2 + [self replaceObjectAtIndex: idx2 withObject: object1]; } @finally { [object1 release]; } } Index: src/OFMutableArray_adjacent.m ================================================================== --- src/OFMutableArray_adjacent.m +++ src/OFMutableArray_adjacent.m @@ -58,35 +58,35 @@ _mutations++; } - (void)insertObject: (id)object - atIndex: (size_t)index + atIndex: (size_t)idx { if (object == nil) @throw [OFInvalidArgumentException exception]; @try { [_array insertItem: &object - atIndex: index]; + atIndex: idx]; } @catch (OFOutOfRangeException *e) { @throw [OFOutOfRangeException exception]; } [object retain]; _mutations++; } - (void)insertObjectsFromArray: (OFArray *)array - atIndex: (size_t)index + atIndex: (size_t)idx { id const *objects = [array objects]; size_t count = [array count]; @try { [_array insertItems: objects - atIndex: index + atIndex: idx count: count]; } @catch (OFOutOfRangeException *e) { @throw [OFOutOfRangeException exception]; } @@ -117,11 +117,11 @@ return; } } } -- (void)replaceObjectAtIndex: (size_t)index +- (void)replaceObjectAtIndex: (size_t)idx withObject: (id)object { id *objects; id oldObject; @@ -128,15 +128,15 @@ if (object == nil) @throw [OFInvalidArgumentException exception]; objects = [_array items]; - if (index >= [_array count]) + if (idx >= [_array count]) @throw [OFOutOfRangeException exception]; - oldObject = objects[index]; - objects[index] = [object retain]; + oldObject = objects[idx]; + objects[idx] = [object retain]; [oldObject release]; } - (void)replaceObjectIdenticalTo: (id)oldObject withObject: (id)newObject @@ -207,14 +207,14 @@ return; } } } -- (void)removeObjectAtIndex: (size_t)index +- (void)removeObjectAtIndex: (size_t)idx { - id object = [self objectAtIndex: index]; - [_array removeItemAtIndex: index]; + id object = [self objectAtIndex: idx]; + [_array removeItemAtIndex: idx]; [object release]; _mutations++; } @@ -266,23 +266,23 @@ [object release]; _mutations++; } -- (void)exchangeObjectAtIndex: (size_t)index1 - withObjectAtIndex: (size_t)index2 +- (void)exchangeObjectAtIndex: (size_t)idx1 + withObjectAtIndex: (size_t)idx2 { id *objects = [_array items]; size_t count = [_array count]; id tmp; - if (index1 >= count || index2 >= count) + if (idx1 >= count || idx2 >= count) @throw [OFOutOfRangeException exception]; - tmp = objects[index1]; - objects[index1] = objects[index2]; - objects[index2] = tmp; + tmp = objects[idx1]; + objects[idx1] = objects[idx2]; + objects[idx2] = tmp; } - (void)reverse { id *objects = [_array items]; Index: src/OFMutableData.m ================================================================== --- src/OFMutableData.m +++ src/OFMutableData.m @@ -173,14 +173,14 @@ _count++; } - (void)insertItem: (const void *)item - atIndex: (size_t)index + atIndex: (size_t)idx { [self insertItems: item - atIndex: index + atIndex: idx count: 1]; } - (void)addItems: (const void *)items count: (size_t)count @@ -198,33 +198,33 @@ memcpy(_items + _count * _itemSize, items, count * _itemSize); _count += count; } - (void)insertItems: (const void *)items - atIndex: (size_t)index + atIndex: (size_t)idx count: (size_t)count { - if (count > SIZE_MAX - _count || index > _count) + if (count > SIZE_MAX - _count || idx > _count) @throw [OFOutOfRangeException exception]; if (_count + count > _capacity) { _items = [self resizeMemory: _items size: _itemSize count: _count + count]; _capacity = _count + count; } - memmove(_items + (index + count) * _itemSize, - _items + index * _itemSize, (_count - index) * _itemSize); - memcpy(_items + index * _itemSize, items, count * _itemSize); + memmove(_items + (idx + count) * _itemSize, _items + idx * _itemSize, + (_count - idx) * _itemSize); + memcpy(_items + idx * _itemSize, items, count * _itemSize); _count += count; } -- (void)removeItemAtIndex: (size_t)index +- (void)removeItemAtIndex: (size_t)idx { - [self removeItemsInRange: of_range(index, 1)]; + [self removeItemsInRange: of_range(idx, 1)]; } - (void)removeItemsInRange: (of_range_t)range { if (range.length > SIZE_MAX - range.location || Index: src/OFMutableSet.m ================================================================== --- src/OFMutableSet.m +++ src/OFMutableSet.m @@ -141,10 +141,15 @@ - initWithCapacity: (size_t)capacity { OF_INVALID_INIT_METHOD } + +- copy +{ + return [[OFSet alloc] initWithSet: self]; +} - (void)addObject: (id)object { OF_UNRECOGNIZED_SELECTOR } Index: src/OFMutableString.m ================================================================== --- src/OFMutableString.m +++ src/OFMutableString.m @@ -294,19 +294,19 @@ objc_autoreleasePoolPop(pool); } #endif - (void)setCharacter: (of_unichar_t)character - atIndex: (size_t)index + atIndex: (size_t)idx { void *pool = objc_autoreleasePoolPush(); OFString *string; string = [OFString stringWithCharacters: &character length: 1]; - [self replaceCharactersInRange: of_range(index, 1) + [self replaceCharactersInRange: of_range(idx, 1) withString: string]; objc_autoreleasePoolPop(pool); } @@ -464,13 +464,13 @@ wordMiddleFunction: of_ascii_tolower]; } #endif - (void)insertString: (OFString *)string - atIndex: (size_t)index + atIndex: (size_t)idx { - [self replaceCharactersInRange: of_range(index, 0) + [self replaceCharactersInRange: of_range(idx, 0) withString: string]; } - (void)deleteCharactersInRange: (of_range_t)range { Index: src/OFMutableString_UTF8.m ================================================================== --- src/OFMutableString_UTF8.m +++ src/OFMutableString_UTF8.m @@ -178,63 +178,61 @@ * need to change it. */ } - (void)setCharacter: (of_unichar_t)character - atIndex: (size_t)index + atIndex: (size_t)idx { char buffer[4]; of_unichar_t c; size_t lenNew; ssize_t lenOld; if (_s->isUTF8) - index = of_string_utf8_get_position(_s->cString, index, + idx = of_string_utf8_get_position(_s->cString, idx, _s->cStringLength); - if (index > _s->cStringLength) + if (idx > _s->cStringLength) @throw [OFOutOfRangeException exception]; /* Shortcut if old and new character both are ASCII */ - if (character < 0x80 && !(_s->cString[index] & 0x80)) { + if (character < 0x80 && !(_s->cString[idx] & 0x80)) { _s->hashed = false; - _s->cString[index] = character; + _s->cString[idx] = character; return; } if ((lenNew = of_string_utf8_encode(character, buffer)) == 0) @throw [OFInvalidEncodingException exception]; - if ((lenOld = of_string_utf8_decode(_s->cString + index, - _s->cStringLength - index, &c)) <= 0) + if ((lenOld = of_string_utf8_decode(_s->cString + idx, + _s->cStringLength - idx, &c)) <= 0) @throw [OFInvalidEncodingException exception]; _s->hashed = false; if (lenNew == (size_t)lenOld) - memcpy(_s->cString + index, buffer, lenNew); + memcpy(_s->cString + idx, buffer, lenNew); else if (lenNew > (size_t)lenOld) { _s->cString = [self resizeMemory: _s->cString size: _s->cStringLength - lenOld + lenNew + 1]; - memmove(_s->cString + index + lenNew, - _s->cString + index + lenOld, - _s->cStringLength - index - lenOld); - memcpy(_s->cString + index, buffer, lenNew); + memmove(_s->cString + idx + lenNew, _s->cString + idx + lenOld, + _s->cStringLength - idx - lenOld); + memcpy(_s->cString + idx, buffer, lenNew); _s->cStringLength -= lenOld; _s->cStringLength += lenNew; _s->cString[_s->cStringLength] = '\0'; if (character >= 0x80) _s->isUTF8 = true; } else if (lenNew < (size_t)lenOld) { - memmove(_s->cString + index + lenNew, - _s->cString + index + lenOld, - _s->cStringLength - index - lenOld); - memcpy(_s->cString + index, buffer, lenNew); + memmove(_s->cString + idx + lenNew, _s->cString + idx + lenOld, + _s->cStringLength - idx - lenOld); + memcpy(_s->cString + idx, buffer, lenNew); _s->cStringLength -= lenOld; _s->cStringLength += lenNew; _s->cString[_s->cStringLength] = '\0'; @@ -508,29 +506,29 @@ @throw [OFInvalidEncodingException exception]; } } - (void)insertString: (OFString *)string - atIndex: (size_t)index + atIndex: (size_t)idx { size_t newCStringLength; - if (index > _s->length) + if (idx > _s->length) @throw [OFOutOfRangeException exception]; if (_s->isUTF8) - index = of_string_utf8_get_position(_s->cString, index, + idx = of_string_utf8_get_position(_s->cString, idx, _s->cStringLength); newCStringLength = _s->cStringLength + [string UTF8StringLength]; _s->hashed = false; _s->cString = [self resizeMemory: _s->cString size: newCStringLength + 1]; - memmove(_s->cString + index + [string UTF8StringLength], - _s->cString + index, _s->cStringLength - index); - memcpy(_s->cString + index, [string UTF8String], + memmove(_s->cString + idx + [string UTF8StringLength], + _s->cString + idx, _s->cStringLength - idx); + memcpy(_s->cString + idx, [string UTF8String], [string UTF8StringLength]); _s->cString[newCStringLength] = '\0'; _s->cStringLength = newCStringLength; _s->length += [string length]; Index: src/OFMutableURL.m ================================================================== --- src/OFMutableURL.m +++ src/OFMutableURL.m @@ -16,10 +16,11 @@ #include "config.h" #import "OFMutableURL.h" #import "OFURL+Private.h" +#import "OFString.h" @implementation OFMutableURL @dynamic scheme, host, port, user, password, path, parameters, query, fragment; + (instancetype)URL Index: src/OFMutex.h ================================================================== --- src/OFMutex.h +++ src/OFMutex.h @@ -28,11 +28,11 @@ */ @interface OFMutex: OFObject { of_mutex_t _mutex; bool _initialized; - OFString *_name; + OFString *_Nullable _name; } /*! * @brief Creates a new mutex. * Index: src/OFNumber.h ================================================================== --- src/OFNumber.h +++ src/OFNumber.h @@ -118,35 +118,35 @@ @interface OFNumber: OFObject { union of_number_value { bool bool_; - signed char schar; - signed short sshort; - signed int sint; - signed long slong; - signed long long slonglong; - unsigned char uchar; - unsigned short ushort; - unsigned int uint; - unsigned long ulong; - unsigned long long ulonglong; + signed char sChar; + signed short sShort; + signed int sInt; + signed long sLong; + signed long long sLongLong; + unsigned char uChar; + unsigned short uShort; + unsigned int uInt; + unsigned long uLong; + unsigned long long uLongLong; int8_t int8; int16_t int16; int32_t int32; int64_t int64; - uint8_t uint8; - uint16_t uint16; - uint32_t uint32; - uint64_t uint64; + uint8_t uInt8; + uint16_t uInt16; + uint32_t uInt32; + uint64_t uInt64; size_t size; - ssize_t ssize; - intmax_t intmax; - uintmax_t uintmax; - ptrdiff_t ptrdiff; - intptr_t intptr; - uintptr_t uintptr; + ssize_t sSize; + intmax_t intMax; + uintmax_t uIntMax; + ptrdiff_t ptrDiff; + intptr_t intPtr; + uintptr_t uIntPtr; float float_; double double_; } _value; of_number_type_t _type; } Index: src/OFNumber.m ================================================================== --- src/OFNumber.m +++ src/OFNumber.m @@ -32,59 +32,59 @@ #define RETURN_AS(t) \ switch (_type) { \ case OF_NUMBER_TYPE_BOOL: \ return (t)_value.bool_; \ case OF_NUMBER_TYPE_CHAR: \ - return (t)_value.schar; \ + return (t)_value.sChar; \ case OF_NUMBER_TYPE_SHORT: \ - return (t)_value.sshort; \ + return (t)_value.sShort; \ case OF_NUMBER_TYPE_INT: \ - return (t)_value.sint; \ + return (t)_value.sInt; \ case OF_NUMBER_TYPE_LONG: \ - return (t)_value.slong; \ + return (t)_value.sLong; \ case OF_NUMBER_TYPE_LONGLONG: \ - return (t)_value.slonglong; \ + return (t)_value.sLongLong; \ case OF_NUMBER_TYPE_UCHAR: \ - return (t)_value.uchar; \ + return (t)_value.uChar; \ case OF_NUMBER_TYPE_USHORT: \ - return (t)_value.ushort; \ + return (t)_value.uShort; \ case OF_NUMBER_TYPE_UINT: \ - return (t)_value.uint; \ + return (t)_value.uInt; \ case OF_NUMBER_TYPE_ULONG: \ - return (t)_value.ulong; \ + return (t)_value.uLong; \ case OF_NUMBER_TYPE_ULONGLONG: \ - return (t)_value.ulonglong; \ + return (t)_value.uLongLong; \ case OF_NUMBER_TYPE_INT8: \ return (t)_value.int8; \ case OF_NUMBER_TYPE_INT16: \ return (t)_value.int16; \ case OF_NUMBER_TYPE_INT32: \ return (t)_value.int32; \ case OF_NUMBER_TYPE_INT64: \ return (t)_value.int64; \ case OF_NUMBER_TYPE_UINT8: \ - return (t)_value.uint8; \ + return (t)_value.uInt8; \ case OF_NUMBER_TYPE_UINT16: \ - return (t)_value.uint16; \ + return (t)_value.uInt16; \ case OF_NUMBER_TYPE_UINT32: \ - return (t)_value.uint32; \ + return (t)_value.uInt32; \ case OF_NUMBER_TYPE_UINT64: \ - return (t)_value.uint64; \ + return (t)_value.uInt64; \ case OF_NUMBER_TYPE_SIZE: \ return (t)_value.size; \ case OF_NUMBER_TYPE_SSIZE: \ - return (t)_value.ssize; \ + return (t)_value.sSize; \ case OF_NUMBER_TYPE_INTMAX: \ - return (t)_value.intmax; \ + return (t)_value.intMax; \ case OF_NUMBER_TYPE_UINTMAX: \ - return (t)_value.uintmax; \ + return (t)_value.uIntMax; \ case OF_NUMBER_TYPE_PTRDIFF: \ - return (t)_value.ptrdiff; \ + return (t)_value.ptrDiff; \ case OF_NUMBER_TYPE_INTPTR: \ - return (t)_value.intptr; \ + return (t)_value.intPtr; \ case OF_NUMBER_TYPE_UINTPTR: \ - return (t)_value.uintptr; \ + return (t)_value.uIntPtr; \ case OF_NUMBER_TYPE_FLOAT: \ return (t)_value.float_; \ case OF_NUMBER_TYPE_DOUBLE: \ return (t)_value.double_; \ default: \ @@ -102,58 +102,58 @@ + (instancetype)numberWithBool: (bool)bool_ { return [[[self alloc] initWithBool: bool_] autorelease]; } -+ (instancetype)numberWithChar: (signed char)schar -{ - return [[[self alloc] initWithChar: schar] autorelease]; -} - -+ (instancetype)numberWithShort: (signed short)sshort -{ - return [[[self alloc] initWithShort: sshort] autorelease]; -} - -+ (instancetype)numberWithInt: (signed int)sint -{ - return [[[self alloc] initWithInt: sint] autorelease]; -} - -+ (instancetype)numberWithLong: (signed long)slong -{ - return [[[self alloc] initWithLong: slong] autorelease]; -} - -+ (instancetype)numberWithLongLong: (signed long long)slonglong -{ - return [[[self alloc] initWithLongLong: slonglong] autorelease]; -} - -+ (instancetype)numberWithUnsignedChar: (unsigned char)uchar -{ - return [[[self alloc] initWithUnsignedChar: uchar] autorelease]; -} - -+ (instancetype)numberWithUnsignedShort: (unsigned short)ushort -{ - return [[[self alloc] initWithUnsignedShort: ushort] autorelease]; -} - -+ (instancetype)numberWithUnsignedInt: (unsigned int)uint -{ - return [[[self alloc] initWithUnsignedInt: uint] autorelease]; -} - -+ (instancetype)numberWithUnsignedLong: (unsigned long)ulong -{ - return [[[self alloc] initWithUnsignedLong: ulong] autorelease]; -} - -+ (instancetype)numberWithUnsignedLongLong: (unsigned long long)ulonglong -{ - return [[[self alloc] initWithUnsignedLongLong: ulonglong] autorelease]; ++ (instancetype)numberWithChar: (signed char)sChar +{ + return [[[self alloc] initWithChar: sChar] autorelease]; +} + ++ (instancetype)numberWithShort: (signed short)sShort +{ + return [[[self alloc] initWithShort: sShort] autorelease]; +} + ++ (instancetype)numberWithInt: (signed int)sInt +{ + return [[[self alloc] initWithInt: sInt] autorelease]; +} + ++ (instancetype)numberWithLong: (signed long)sLong +{ + return [[[self alloc] initWithLong: sLong] autorelease]; +} + ++ (instancetype)numberWithLongLong: (signed long long)sLongLong +{ + return [[[self alloc] initWithLongLong: sLongLong] autorelease]; +} + ++ (instancetype)numberWithUnsignedChar: (unsigned char)uChar +{ + return [[[self alloc] initWithUnsignedChar: uChar] autorelease]; +} + ++ (instancetype)numberWithUnsignedShort: (unsigned short)uShort +{ + return [[[self alloc] initWithUnsignedShort: uShort] autorelease]; +} + ++ (instancetype)numberWithUnsignedInt: (unsigned int)uInt +{ + return [[[self alloc] initWithUnsignedInt: uInt] autorelease]; +} + ++ (instancetype)numberWithUnsignedLong: (unsigned long)uLong +{ + return [[[self alloc] initWithUnsignedLong: uLong] autorelease]; +} + ++ (instancetype)numberWithUnsignedLongLong: (unsigned long long)uLongLong +{ + return [[[self alloc] initWithUnsignedLongLong: uLongLong] autorelease]; } + (instancetype)numberWithInt8: (int8_t)int8 { return [[[self alloc] initWithInt8: int8] autorelease]; @@ -177,58 +177,58 @@ + (instancetype)numberWithUInt8: (uint8_t)uint8 { return [[[self alloc] initWithUInt8: uint8] autorelease]; } -+ (instancetype)numberWithUInt16: (uint16_t)uint16 ++ (instancetype)numberWithUInt16: (uint16_t)uInt16 { - return [[[self alloc] initWithUInt16: uint16] autorelease]; + return [[[self alloc] initWithUInt16: uInt16] autorelease]; } -+ (instancetype)numberWithUInt32: (uint32_t)uint32 ++ (instancetype)numberWithUInt32: (uint32_t)uInt32 { - return [[[self alloc] initWithUInt32: uint32] autorelease]; + return [[[self alloc] initWithUInt32: uInt32] autorelease]; } -+ (instancetype)numberWithUInt64: (uint64_t)uint64 ++ (instancetype)numberWithUInt64: (uint64_t)uInt64 { - return [[[self alloc] initWithUInt64: uint64] autorelease]; + return [[[self alloc] initWithUInt64: uInt64] autorelease]; } + (instancetype)numberWithSize: (size_t)size { return [[[self alloc] initWithSize: size] autorelease]; } -+ (instancetype)numberWithSSize: (ssize_t)ssize -{ - return [[[self alloc] initWithSSize: ssize] autorelease]; -} - -+ (instancetype)numberWithIntMax: (intmax_t)intmax -{ - return [[[self alloc] initWithIntMax: intmax] autorelease]; -} - -+ (instancetype)numberWithUIntMax: (uintmax_t)uintmax -{ - return [[[self alloc] initWithUIntMax: uintmax] autorelease]; -} - -+ (instancetype)numberWithPtrDiff: (ptrdiff_t)ptrdiff -{ - return [[[self alloc] initWithPtrDiff: ptrdiff] autorelease]; -} - -+ (instancetype)numberWithIntPtr: (intptr_t)intptr -{ - return [[[self alloc] initWithIntPtr: intptr] autorelease]; -} - -+ (instancetype)numberWithUIntPtr: (uintptr_t)uintptr -{ - return [[[self alloc] initWithUIntPtr: uintptr] autorelease]; ++ (instancetype)numberWithSSize: (ssize_t)sSize +{ + return [[[self alloc] initWithSSize: sSize] autorelease]; +} + ++ (instancetype)numberWithIntMax: (intmax_t)intMax +{ + return [[[self alloc] initWithIntMax: intMax] autorelease]; +} + ++ (instancetype)numberWithUIntMax: (uintmax_t)uIntMax +{ + return [[[self alloc] initWithUIntMax: uIntMax] autorelease]; +} + ++ (instancetype)numberWithPtrDiff: (ptrdiff_t)ptrDiff +{ + return [[[self alloc] initWithPtrDiff: ptrDiff] autorelease]; +} + ++ (instancetype)numberWithIntPtr: (intptr_t)intPtr +{ + return [[[self alloc] initWithIntPtr: intPtr] autorelease]; +} + ++ (instancetype)numberWithUIntPtr: (uintptr_t)uIntPtr +{ + return [[[self alloc] initWithUIntPtr: uIntPtr] autorelease]; } + (instancetype)numberWithFloat: (float)float_ { return [[[self alloc] initWithFloat: float_] autorelease]; @@ -252,105 +252,105 @@ _type = OF_NUMBER_TYPE_BOOL; return self; } -- initWithChar: (signed char)schar +- initWithChar: (signed char)sChar { self = [super init]; - _value.schar = schar; + _value.sChar = sChar; _type = OF_NUMBER_TYPE_CHAR; return self; } -- initWithShort: (signed short)sshort +- initWithShort: (signed short)sShort { self = [super init]; - _value.sshort = sshort; + _value.sShort = sShort; _type = OF_NUMBER_TYPE_SHORT; return self; } -- initWithInt: (signed int)sint +- initWithInt: (signed int)sInt { self = [super init]; - _value.sint = sint; + _value.sInt = sInt; _type = OF_NUMBER_TYPE_INT; return self; } -- initWithLong: (signed long)slong +- initWithLong: (signed long)sLong { self = [super init]; - _value.slong = slong; + _value.sLong = sLong; _type = OF_NUMBER_TYPE_LONG; return self; } -- initWithLongLong: (signed long long)slonglong +- initWithLongLong: (signed long long)sLongLong { self = [super init]; - _value.slonglong = slonglong; + _value.sLongLong = sLongLong; _type = OF_NUMBER_TYPE_LONGLONG; return self; } -- initWithUnsignedChar: (unsigned char)uchar +- initWithUnsignedChar: (unsigned char)uChar { self = [super init]; - _value.uchar = uchar; + _value.uChar = uChar; _type = OF_NUMBER_TYPE_UCHAR; return self; } -- initWithUnsignedShort: (unsigned short)ushort +- initWithUnsignedShort: (unsigned short)uShort { self = [super init]; - _value.ushort = ushort; + _value.uShort = uShort; _type = OF_NUMBER_TYPE_USHORT; return self; } -- initWithUnsignedInt: (unsigned int)uint +- initWithUnsignedInt: (unsigned int)uInt { self = [super init]; - _value.uint = uint; + _value.uInt = uInt; _type = OF_NUMBER_TYPE_UINT; return self; } -- initWithUnsignedLong: (unsigned long)ulong +- initWithUnsignedLong: (unsigned long)uLong { self = [super init]; - _value.ulong = ulong; + _value.uLong = uLong; _type = OF_NUMBER_TYPE_ULONG; return self; } -- initWithUnsignedLongLong: (unsigned long long)ulonglong +- initWithUnsignedLongLong: (unsigned long long)uLongLong { self = [super init]; - _value.ulonglong = ulonglong; + _value.uLongLong = uLongLong; _type = OF_NUMBER_TYPE_ULONGLONG; return self; } @@ -392,45 +392,45 @@ _type = OF_NUMBER_TYPE_INT64; return self; } -- initWithUInt8: (uint8_t)uint8 +- initWithUInt8: (uint8_t)uInt8 { self = [super init]; - _value.uint8 = uint8; + _value.uInt8 = uInt8; _type = OF_NUMBER_TYPE_UINT8; return self; } -- initWithUInt16: (uint16_t)uint16 +- initWithUInt16: (uint16_t)uInt16 { self = [super init]; - _value.uint16 = uint16; + _value.uInt16 = uInt16; _type = OF_NUMBER_TYPE_UINT16; return self; } -- initWithUInt32: (uint32_t)uint32 +- initWithUInt32: (uint32_t)uInt32 { self = [super init]; - _value.uint32 = uint32; + _value.uInt32 = uInt32; _type = OF_NUMBER_TYPE_UINT32; return self; } -- initWithUInt64: (uint64_t)uint64 +- initWithUInt64: (uint64_t)uInt64 { self = [super init]; - _value.uint64 = uint64; + _value.uInt64 = uInt64; _type = OF_NUMBER_TYPE_UINT64; return self; } @@ -442,65 +442,65 @@ _type = OF_NUMBER_TYPE_SIZE; return self; } -- initWithSSize: (ssize_t)ssize +- initWithSSize: (ssize_t)sSize { self = [super init]; - _value.ssize = ssize; + _value.sSize = sSize; _type = OF_NUMBER_TYPE_SSIZE; return self; } -- initWithIntMax: (intmax_t)intmax +- initWithIntMax: (intmax_t)intMax { self = [super init]; - _value.intmax = intmax; + _value.intMax = intMax; _type = OF_NUMBER_TYPE_INTMAX; return self; } -- initWithUIntMax: (uintmax_t)uintmax +- initWithUIntMax: (uintmax_t)uIntMax { self = [super init]; - _value.uintmax = uintmax; + _value.uIntMax = uIntMax; _type = OF_NUMBER_TYPE_UINTMAX; return self; } -- initWithPtrDiff: (ptrdiff_t)ptrdiff +- initWithPtrDiff: (ptrdiff_t)ptrDiff { self = [super init]; - _value.ptrdiff = ptrdiff; + _value.ptrDiff = ptrDiff; _type = OF_NUMBER_TYPE_PTRDIFF; return self; } -- initWithIntPtr: (intptr_t)intptr +- initWithIntPtr: (intptr_t)intPtr { self = [super init]; - _value.intptr = intptr; + _value.intPtr = intPtr; _type = OF_NUMBER_TYPE_INTPTR; return self; } -- initWithUIntPtr: (uintptr_t)uintptr +- initWithUIntPtr: (uintptr_t)uIntPtr { self = [super init]; - _value.uintptr = uintptr; + _value.uIntPtr = uIntPtr; _type = OF_NUMBER_TYPE_UINTPTR; return self; } @@ -551,14 +551,14 @@ /* * FIXME: This will fail if the value is bigger than * INTMAX_MAX! */ _type = OF_NUMBER_TYPE_UINTMAX; - _value.uintmax = [element decimalValue]; + _value.uIntMax = [element decimalValue]; } else if ([typeString isEqual: @"signed"]) { _type = OF_NUMBER_TYPE_INTMAX; - _value.intmax = [element decimalValue]; + _value.intMax = [element decimalValue]; } else if ([typeString isEqual: @"float"]) { union { float f; uint32_t u; } f; Index: src/OFObject.h ================================================================== --- src/OFObject.h +++ src/OFObject.h @@ -195,11 +195,11 @@ /*! * @brief Returns the superclass of the object. * * @return The superclass of the object */ -- (Class)superclass; +- (nullable Class)superclass; /*! * @brief Returns a boolean whether the object of the specified kind. * * @param class_ The class whose kind is checked @@ -459,11 +459,11 @@ /*! * @brief Returns the superclass of the class. * * @return The superclass of the class */ -+ (Class)superclass; ++ (nullable Class)superclass; /*! * @brief Checks whether instances of the class respond to a given selector. * * @param selector The selector which should be checked for respondence @@ -646,26 +646,28 @@ * @brief Allocates memory and stores it in the object's memory pool. * * It will be freed automatically when the object is deallocated. * * @param size The size of the memory to allocate - * @return A pointer to the allocated memory + * @return A pointer to the allocated memory. May return NULL if the specified + * size is 0. */ -- (void *)allocMemoryWithSize: (size_t)size; +- (nullable void *)allocMemoryWithSize: (size_t)size; /*! * @brief Allocates memory for the specified number of items and stores it in * the object's memory pool. * * It will be freed automatically when the object is deallocated. * * @param size The size of each item to allocate * @param count The number of items to allocate - * @return A pointer to the allocated memory + * @return A pointer to the allocated memory. May return NULL if the specified + * size or count is 0. */ -- (void *)allocMemoryWithSize: (size_t)size - count: (size_t)count; +- (nullable void *)allocMemoryWithSize: (size_t)size + count: (size_t)count; /*! * @brief Resizes memory in the object's memory pool to the specified size. * * If the pointer is NULL, this is equivalent to allocating memory. Index: src/OFObject.m ================================================================== --- src/OFObject.m +++ src/OFObject.m @@ -470,11 +470,11 @@ } @finally { free(methodList); } #endif - [self inheritMethodsFromClass: [class superclass]]; + [self inheritMethodsFromClass: superclass]; } + (BOOL)resolveClassMethod: (SEL)selector { return NO; Index: src/OFOptionsParser.h ================================================================== --- src/OFOptionsParser.h +++ src/OFOptionsParser.h @@ -70,11 +70,11 @@ of_options_parser_option_t *_options; OFMapTable *_longOptions; OFArray OF_GENERIC(OFString *) *_arguments; size_t _index, _subIndex; of_unichar_t _lastOption; - OFString *_lastLongOption, *_argument; + OFString *_Nullable _lastLongOption, *_Nullable _argument; bool _done; } /*! * The last parsed option. Index: src/OFRecursiveMutex.h ================================================================== --- src/OFRecursiveMutex.h +++ src/OFRecursiveMutex.h @@ -29,11 +29,11 @@ */ @interface OFRecursiveMutex: OFObject { of_rmutex_t _rmutex; bool _initialized; - OFString *_name; + OFString *_Nullable _name; } /*! * @brief Creates a new recursive mutex. * Index: src/OFRunLoop.h ================================================================== --- src/OFRunLoop.h +++ src/OFRunLoop.h @@ -59,18 +59,18 @@ /*! * @brief Returns the run loop for the main thread. * * @return The run loop for the main thread */ -+ (OFRunLoop *)mainRunLoop; ++ (nullable OFRunLoop *)mainRunLoop; /*! * @brief Returns the run loop for the current thread. * * @return The run loop for the current thread */ -+ (OFRunLoop *)currentRunLoop; ++ (nullable OFRunLoop *)currentRunLoop; /*! * @brief Adds an OFTimer to the run loop. * * @param timer The timer to add Index: src/OFRunLoop.m ================================================================== --- src/OFRunLoop.m +++ src/OFRunLoop.m @@ -15,10 +15,11 @@ */ #include "config.h" #include +#include #import "OFRunLoop.h" #import "OFRunLoop+Private.h" #import "OFDictionary.h" #ifdef OF_HAVE_SOCKETS @@ -31,10 +32,12 @@ #endif #import "OFSortedList.h" #import "OFTimer.h" #import "OFTimer+Private.h" #import "OFDate.h" + +#import "OFObserveFailedException.h" static OFRunLoop *mainRunLoop = nil; #ifdef OF_HAVE_SOCKETS @interface OFRunLoop_QueueItem: OFObject @@ -309,11 +312,11 @@ if (_block != NULL) return _block(object, _buffer, length, address, exception); else { # endif bool (*func)(id, SEL, OFUDPSocket *, void *, size_t, - of_udp_socket_address_t address, OFException *) = + of_udp_socket_address_t, OFException *) = (bool (*)(id, SEL, OFUDPSocket *, void *, size_t, of_udp_socket_address_t, OFException *)) [_target methodForSelector: _selector]; return func(_target, _selector, object, _buffer, length, @@ -425,17 +428,17 @@ queueItem->_target = [target retain]; queueItem->_selector = selector; }) } -+ (void)of_addAsyncReceiveForUDPSocket: (OFUDPSocket *)socket ++ (void)of_addAsyncReceiveForUDPSocket: (OFUDPSocket *)sock buffer: (void *)buffer length: (size_t)length target: (id)target selector: (SEL)selector { - ADD_READ(OFRunLoop_UDPReceiveQueueItem, socket, { + ADD_READ(OFRunLoop_UDPReceiveQueueItem, sock, { queueItem->_buffer = buffer; queueItem->_length = length; queueItem->_target = [target retain]; queueItem->_selector = selector; }) @@ -482,17 +485,17 @@ ADD_READ(OFRunLoop_AcceptQueueItem, stream, { queueItem->_block = [block copy]; }) } -+ (void)of_addAsyncReceiveForUDPSocket: (OFUDPSocket *)socket ++ (void)of_addAsyncReceiveForUDPSocket: (OFUDPSocket *)sock buffer: (void *)buffer length: (size_t)length block: (of_udp_socket_async_receive_block_t) block { - ADD_READ(OFRunLoop_UDPReceiveQueueItem, socket, { + ADD_READ(OFRunLoop_UDPReceiveQueueItem, sock, { queueItem->_buffer = buffer; queueItem->_length = length; queueItem->_block = [block copy]; }) } @@ -717,12 +720,17 @@ if (timeout < 0) timeout = 0; #if defined(OF_HAVE_SOCKETS) - [_kernelEventObserver - observeForTimeInterval: timeout]; + @try { + [_kernelEventObserver + observeForTimeInterval: timeout]; + } @catch (OFObserveFailedException *e) { + if ([e errNo] != EINTR) + @throw e; + } #elif defined(OF_HAVE_THREADS) [_condition lock]; [_condition waitForTimeInterval: timeout]; [_condition unlock]; #else @@ -733,11 +741,16 @@ * No more timers and no deadline: Just watch for I/O * until we get an event. If a timer is added by * another thread, it cancels the observe. */ #if defined(OF_HAVE_SOCKETS) - [_kernelEventObserver observe]; + @try { + [_kernelEventObserver observe]; + } @catch (OFObserveFailedException *e) { + if ([e errNo] != EINTR) + @throw e; + } #elif defined(OF_HAVE_THREADS) [_condition lock]; [_condition wait]; [_condition unlock]; #else Index: src/OFSet.h ================================================================== --- src/OFSet.h +++ src/OFSet.h @@ -204,20 +204,20 @@ /*! * @brief Returns an arbitrary object in the set. * * @return An arbitrary object in the set */ -- (ObjectType)anyObject; +- (nullable ObjectType)anyObject; /*! * @brief Checks whether the set contains an object equal to the specified * object. * * @param object The object which is checked for being in the set * @return A boolean whether the set contains the specified object */ -- (bool)containsObject: (nullable ObjectType)object; +- (bool)containsObject: (ObjectType)object; /*! * @brief Returns the value for the specified key * * If the key starts with an `@`, the `@` is stripped and @@ -243,11 +243,11 @@ * @note A @ref OFNull value is translated to nil! * * @param value The value for the specified key * @param key The key of the value to set */ -- (void)setValue: (nullable id)value +- (void)setValue: (id)value forKey: (OFString *)key; /*! * @brief Returns an OFEnumerator to enumerate through all objects of the set. * Index: src/OFSet.m ================================================================== --- src/OFSet.m +++ src/OFSet.m @@ -211,15 +211,14 @@ OF_UNRECOGNIZED_SELECTOR } - (id)valueForKey: (OFString *)key { - OFMutableSet *ret; + id ret; if ([key hasPrefix: @"@"]) { void *pool = objc_autoreleasePoolPush(); - id ret; key = [key substringWithRange: of_range(1, [key length] - 1)]; ret = [[super valueForKey: key] retain]; objc_autoreleasePoolPop(pool); @@ -253,13 +252,10 @@ objc_autoreleasePoolPop(pool); return; } - if (value == [OFNull null]) - value = nil; - for (id object in self) [object setValue: value forKey: key]; } Index: src/OFStream.h ================================================================== --- src/OFStream.h +++ src/OFStream.h @@ -92,11 +92,12 @@ OFCopying> { #if !defined(OF_SEEKABLE_STREAM_M) && !defined(OF_TCP_SOCKET_M) @private #endif - char *_readBuffer, *_readBufferMemory, *_writeBuffer; + char *_Nullable _readBuffer, *_Nullable _readBufferMemory; + char *_Nullable _writeBuffer; size_t _readBufferLength, _writeBufferLength; bool _writeBuffered, _waitingForDelimiter; @protected bool _blocking; } Index: src/OFStream.m ================================================================== --- src/OFStream.m +++ src/OFStream.m @@ -56,11 +56,11 @@ #define MIN_READ_SIZE 512 @implementation OFStream @synthesize of_waitingForDelimiter = _waitingForDelimiter; -#if !defined(OF_WINDOWS) && !defined(OF_MORPHOS) +#if defined(SIGPIPE) && defined(SIG_IGN) + (void)initialize { if (self == [OFStream class]) signal(SIGPIPE, SIG_IGN); } Index: src/OFString+XMLUnescaping.h ================================================================== --- src/OFString+XMLUnescaping.h +++ src/OFString+XMLUnescaping.h @@ -58,12 +58,12 @@ * * @param string The string which contains the unknown entity * @param entity The name of the entity that is unknown * @return A substitution for the entity or `nil` */ -- (OFString *)string: (OFString *)string - containsUnknownEntityNamed: (OFString *)entity; +- (nullable OFString *)string: (OFString *)string + containsUnknownEntityNamed: (OFString *)entity; @end @interface OFString (XMLUnescaping) /*! * @brief Unescapes XML in the string. Index: src/OFString+XMLUnescaping.m ================================================================== --- src/OFString+XMLUnescaping.m +++ src/OFString+XMLUnescaping.m @@ -127,28 +127,29 @@ memcmp(entity, "amp", 3) == 0) [ret appendCString: "&" encoding: OF_STRING_ENCODING_ASCII length: 1]; else if (entity[0] == '#') { - void *pool; + void *pool2; OFString *tmp; - pool = objc_autoreleasePoolPush(); + pool2 = objc_autoreleasePoolPush(); tmp = parseNumericEntity(entity, entityLength); if (tmp == nil) @throw [OFInvalidFormatException exception]; [ret appendString: tmp]; - objc_autoreleasePoolPop(pool); + + objc_autoreleasePoolPop(pool2); } else { - void *pool; + void *pool2; OFString *name, *tmp; - pool = objc_autoreleasePoolPush(); + pool2 = objc_autoreleasePoolPush(); name = [OFString stringWithUTF8String: entity length: entityLength]; tmp = lookup(context, self, name); @@ -156,11 +157,12 @@ if (tmp == nil) @throw [OFUnknownXMLEntityException exceptionWithEntityName: name]; [ret appendString: tmp]; - objc_autoreleasePoolPop(pool); + + objc_autoreleasePoolPop(pool2); } last = i + 1; inEntity = false; } Index: src/OFString.h ================================================================== --- src/OFString.h +++ src/OFString.h @@ -18,10 +18,16 @@ # define __STDC_LIMIT_MACROS #endif #ifndef __STDC_CONSTANT_MACROS # define __STDC_CONSTANT_MACROS #endif + +#import "objfw-defs.h" + +#ifdef OF_HAVE_SYS_TYPES_H +# include +#endif #include #include #import "OFObject.h" @@ -133,11 +139,16 @@ + (instancetype)stringWithUTF8String: (const char *)UTF8String length: (size_t)UTF8StringLength; /*! * @brief Creates a new OFString from a UTF-8 encoded C string without copying - * the string. + * the string, if possible. + * + * If initialization fails for whatever reason, the passed C string is free'd + * if `freeWhenDone` is true. + * + * @note OFMutableString always creates a copy! * * @param UTF8String A UTF-8 encoded C string to initialize the OFString with * @param freeWhenDone Whether to free the C string when the OFString gets * deallocated * @return A new autoreleased OFString @@ -374,13 +385,16 @@ - initWithUTF8String: (const char *)UTF8String length: (size_t)UTF8StringLength; /*! * @brief Initializes an already allocated OFString from an UTF-8 encoded C - * string without copying it, if possible. + * string without copying the string, if possible. * - * @note Mutable versions always create a copy! + * If initialization fails for whatever reason, the passed C string is free'd + * if `freeWhenDone` is true. + * + * @note OFMutableString always creates a copy! * * @param UTF8String A UTF-8 encoded C string to initialize the OFString with * @param freeWhenDone Whether to free the C string when it is not needed * anymore * @return An initialized OFString Index: src/OFString.m ================================================================== --- src/OFString.m +++ src/OFString.m @@ -848,11 +848,16 @@ } - initWithUTF8StringNoCopy: (char *)UTF8String freeWhenDone: (bool)freeWhenDone { - return [self initWithUTF8String: UTF8String]; + @try { + return [self initWithUTF8String: UTF8String]; + } @finally { + if (freeWhenDone) + free(UTF8String); + } } - initWithCString: (const char *)cString encoding: (of_string_encoding_t)encoding { @@ -1479,11 +1484,11 @@ - (size_t)UTF8StringLength { return [self cStringLengthWithEncoding: OF_STRING_ENCODING_UTF_8]; } -- (of_unichar_t)characterAtIndex: (size_t)index +- (of_unichar_t)characterAtIndex: (size_t)idx { OF_UNRECOGNIZED_SELECTOR } - (void)getCharacters: (of_unichar_t *)buffer Index: src/OFString_UTF8.h ================================================================== --- src/OFString_UTF8.h +++ src/OFString_UTF8.h @@ -33,11 +33,11 @@ size_t cStringLength; bool isUTF8; size_t length; bool hashed; uint32_t hash; - char *freeWhenDone; + char *_Nullable freeWhenDone; } *restrict _s; struct of_string_utf8_ivars _storage; } @end Index: src/OFString_UTF8.m ================================================================== --- src/OFString_UTF8.m +++ src/OFString_UTF8.m @@ -149,28 +149,28 @@ } size_t of_string_utf8_get_index(const char *string, size_t position) { - size_t index = position; + size_t idx = position; for (size_t i = 0; i < position; i++) if OF_UNLIKELY ((string[i] & 0xC0) == 0x80) - index--; + idx--; - return index; + return idx; } size_t -of_string_utf8_get_position(const char *string, size_t index, size_t length) +of_string_utf8_get_position(const char *string, size_t idx, size_t length) { - for (size_t i = 0; i <= index; i++) + for (size_t i = 0; i <= idx; i++) if OF_UNLIKELY ((string[i] & 0xC0) == 0x80) - if (++index > length) + if (++idx > length) return OF_NOT_FOUND; - return index; + return idx; } @implementation OFString_UTF8 - init { @@ -391,29 +391,35 @@ } - initWithUTF8StringNoCopy: (char *)UTF8String freeWhenDone: (bool)freeWhenDone { - self = [super init]; + @try { + self = [super init]; + } @catch (id e) { + if (freeWhenDone) + free(UTF8String); + @throw e; + } @try { size_t UTF8StringLength = strlen(UTF8String); + _s = &_storage; + + if (freeWhenDone) + _s->freeWhenDone = UTF8String; + if (UTF8StringLength >= 3 && memcmp(UTF8String, "\xEF\xBB\xBF", 3) == 0) { UTF8String += 3; UTF8StringLength -= 3; } - _s = &_storage; - _s->cString = (char *)UTF8String; _s->cStringLength = UTF8StringLength; - if (freeWhenDone) - _s->freeWhenDone = UTF8String; - switch (of_string_utf8_check(UTF8String, UTF8StringLength, &_s->length)) { case 1: _s->isUTF8 = true; break; @@ -944,25 +950,24 @@ _s->hashed = true; return hash; } -- (of_unichar_t)characterAtIndex: (size_t)index +- (of_unichar_t)characterAtIndex: (size_t)idx { of_unichar_t character; - if (index >= _s->length) + if (idx >= _s->length) @throw [OFOutOfRangeException exception]; if (!_s->isUTF8) - return _s->cString[index]; + return _s->cString[idx]; - index = of_string_utf8_get_position(_s->cString, index, - _s->cStringLength); + idx = of_string_utf8_get_position(_s->cString, idx, _s->cStringLength); - if (of_string_utf8_decode(_s->cString + index, - _s->cStringLength - index, &character) <= 0) + if (of_string_utf8_decode(_s->cString + idx, + _s->cStringLength - idx, &character) <= 0) @throw [OFInvalidEncodingException exception]; return character; } Index: src/OFSystemInfo.h ================================================================== --- src/OFSystemInfo.h +++ src/OFSystemInfo.h @@ -49,11 +49,11 @@ * On Windows, it uses the `APPDATA` environment variable.@n * On Haiku, it uses the `B_USER_SETTINGS_DIRECTORY` directory. * * @return The path where user data for the application can be stored */ -+ (OFString *)userDataPath; ++ (nullable OFString *)userDataPath; /*! * @brief Returns the path where user configuration for the application can be * stored. * @@ -63,11 +63,11 @@ * On Windows, it uses the `APPDATA` environment variable.@n * On Haiku, it uses the `B_USER_SETTINGS_DIRECTORY` directory. * * @return The path where user configuration for the application can be stored */ -+ (OFString *)userConfigPath; ++ (nullable OFString *)userConfigPath; /*! * @brief Returns the vendor of the CPU. * * If the vendor could not be determined, `nil` is returned instead. Index: src/OFTCPSocket+SOCKS5.m ================================================================== --- src/OFTCPSocket+SOCKS5.m +++ src/OFTCPSocket+SOCKS5.m @@ -30,20 +30,20 @@ /* Reference for static linking */ int _OFTCPSocket_SOCKS5_reference; static void -send_or_exception(OFTCPSocket *self, of_socket_t socket, char *buffer, +send_or_exception(OFTCPSocket *self, of_socket_t sock, char *buffer, int length) { #ifndef OF_WINDOWS ssize_t bytesWritten; #else int bytesWritten; #endif - if ((bytesWritten = send(socket, (const void *)buffer, length, 0)) < 0) + if ((bytesWritten = send(sock, (const void *)buffer, length, 0)) < 0) @throw [OFWriteFailedException exceptionWithObject: self requestedLength: length bytesWritten: 0 errNo: of_socket_errno()]; @@ -54,14 +54,14 @@ bytesWritten: bytesWritten errNo: 0]; } static void -recv_exact(OFTCPSocket *self, of_socket_t socket, char *buffer, int length) +recv_exact(OFTCPSocket *self, of_socket_t sock, char *buffer, int length) { while (length > 0) { - ssize_t ret = recv(socket, (void *)buffer, length, 0); + ssize_t ret = recv(sock, (void *)buffer, length, 0); if (ret < 0) @throw [OFReadFailedException exceptionWithObject: self requestedLength: length Index: src/OFTCPSocket.h ================================================================== --- src/OFTCPSocket.h +++ src/OFTCPSocket.h @@ -59,13 +59,13 @@ * To create a server, create a socket, bind it and listen on it. */ @interface OFTCPSocket: OFStreamSocket { bool _listening; - struct sockaddr *_address; + struct sockaddr *_Nullable _address; socklen_t _addressLength; - OFString *_SOCKS5Host; + OFString *_Nullable _SOCKS5Host; uint16_t _SOCKS5Port; #ifdef OF_WII uint16_t _port; #endif } Index: src/OFTCPSocket.m ================================================================== --- src/OFTCPSocket.m +++ src/OFTCPSocket.m @@ -95,21 +95,21 @@ # endif @end @implementation OFTCPSocket_ConnectThread - initWithSourceThread: (OFThread *)sourceThread - socket: (OFTCPSocket *)socket + socket: (OFTCPSocket *)sock host: (OFString *)host port: (uint16_t)port target: (id)target selector: (SEL)selector { self = [super init]; @try { _sourceThread = [sourceThread retain]; - _socket = [socket retain]; + _socket = [sock retain]; _host = [host copy]; _port = port; _target = [target retain]; _selector = selector; } @catch (id e) { @@ -120,20 +120,20 @@ return self; } # ifdef OF_HAVE_BLOCKS - initWithSourceThread: (OFThread *)sourceThread - socket: (OFTCPSocket *)socket + socket: (OFTCPSocket *)sock host: (OFString *)host port: (uint16_t)port block: (of_tcp_socket_async_connect_block_t)block { self = [super init]; @try { _sourceThread = [sourceThread retain]; - _socket = [socket retain]; + _socket = [sock retain]; _host = [host copy]; _port = port; _block = [block copy]; } @catch (id e) { [self release]; @@ -183,11 +183,11 @@ @try { [_socket connectToHost: _host port: _port]; } @catch (OFException *e) { - _exception = e; + _exception = [e retain]; } [self performSelector: @selector(didConnect) onThread: _sourceThread waitUntilDone: false]; Index: src/OFTarArchive.h ================================================================== --- src/OFTarArchive.h +++ src/OFTarArchive.h @@ -32,11 +32,11 @@ #ifdef OF_TAR_ARCHIVE_ENTRY_M @public #endif OFStream *_stream; @protected - OFTarArchiveEntry *_lastReturnedEntry; + OFTarArchiveEntry *_Nullable _lastReturnedEntry; } /*! * @brief Creates a new OFTarArchive object with the specified stream. * @@ -84,9 +84,9 @@ * @ref OFReadFailedException! * * @return The next entry from the tar archive or `nil` if all entries have * been read */ -- (OFTarArchiveEntry *)nextEntry; +- (nullable OFTarArchiveEntry *)nextEntry; @end OF_ASSUME_NONNULL_END Index: src/OFTarArchiveEntry.h ================================================================== --- src/OFTarArchiveEntry.h +++ src/OFTarArchiveEntry.h @@ -55,12 +55,12 @@ OFString *_fileName; uint32_t _mode; uint64_t _size, _toRead; OFDate *_modificationDate; of_tar_archive_entry_type_t _type; - OFString *_targetFileName; - OFString *_owner, *_group; + OFString *_Nullable _targetFileName; + OFString *_Nullable _owner, *_Nullable _group; uint32_t _deviceMajor, _deviceMinor; } /*! * The file name of the entry. Index: src/OFTarArchiveEntry.m ================================================================== --- src/OFTarArchiveEntry.m +++ src/OFTarArchiveEntry.m @@ -86,24 +86,28 @@ if (_type == '\0') _type = OF_TAR_ARCHIVE_ENTRY_TYPE_FILE; if (memcmp(header + 257, "ustar\0" "00", 8) == 0) { - OFString *fileName; + OFString *prefix; _owner = [stringFromBuffer(header + 265, 32) copy]; _group = [stringFromBuffer(header + 297, 32) copy]; _deviceMajor = (uint32_t)octalValueFromBuffer( header + 329, 8, UINT32_MAX); _deviceMinor = (uint32_t)octalValueFromBuffer( header + 337, 8, UINT32_MAX); - fileName = [OFString stringWithFormat: @"%@/%@", - stringFromBuffer(header + 345, 155), _fileName]; - [_fileName release]; - _fileName = [fileName copy]; + prefix = stringFromBuffer(header + 345, 155); + if ([prefix length] > 0) { + OFString *fileName = [OFString + stringWithFormat: @"%@/%@", + prefix, _fileName]; + [_fileName release]; + _fileName = [fileName copy]; + } } objc_autoreleasePoolPop(pool); } @catch (id e) { [self release]; Index: src/OFThread.h ================================================================== --- src/OFThread.h +++ src/OFThread.h @@ -66,25 +66,31 @@ OF_THREAD_RUNNING, OF_THREAD_WAITING_FOR_JOIN } _running; void *_pool; # ifdef OF_HAVE_BLOCKS - of_thread_block_t _threadBlock; + of_thread_block_t _Nullable _threadBlock; # endif id _returnValue; - OFRunLoop *_runLoop; + OFRunLoop *_Nullable _runLoop; OFMutableDictionary *_threadDictionary; @private - OFString *_name; + OFString *_Nullable _name; } -#ifdef OF_HAVE_BLOCKS +/*! + * The name for the thread to use when starting it. + */ +@property OF_NULLABLE_PROPERTY (copy, nonatomic) OFString *name; + +# ifdef OF_HAVE_BLOCKS /*! * The block to execute in the thread. */ -@property (readonly, nonatomic) of_thread_block_t threadBlock; -#endif +@property OF_NULLABLE_PROPERTY (readonly, nonatomic) + of_thread_block_t threadBlock; +# endif /*! * @brief Creates a new thread. * * @return A new, autoreleased thread @@ -104,26 +110,26 @@ /*! * @brief Returns the current thread. * * @return The current thread */ -+ (OFThread *)currentThread; ++ (nullable OFThread *)currentThread; /*! * @brief Returns the main thread. * * @return The main thread */ -+ (OFThread *)mainThread; ++ (nullable OFThread *)mainThread; /*! * @brief Returns a dictionary to store thread-specific data, meaning it * returns a different dictionary for every thread. * * @return A dictionary to store thread-specific data. */ -+ (OFMutableDictionary *)threadDictionary; ++ (nullable OFMutableDictionary *)threadDictionary; #endif /*! * @brief Suspends execution of the current thread for the specified time * interval. @@ -200,24 +206,10 @@ * * @return The run loop for the thread */ - (OFRunLoop *)runLoop; -/*! - * @brief Returns the name of the thread or `nil` if none has been set. - * - * @return The name of the thread or nil if none has been set - */ -- (nullable OFString *)name; - -/*! - * @brief Sets the name for the thread. - * - * @param name The name for the thread - */ -- (void)setName: (nullable OFString *)name; - /*! * @brief Returns the priority of the thread. * * This is a value between -1.0 (meaning lowest priority that still schedules) * and +1.0 (meaning highest priority that still allows getting preempted) Index: src/OFThread.m ================================================================== --- src/OFThread.m +++ src/OFThread.m @@ -95,17 +95,24 @@ static void callMain(id object) { OFThread *thread = (OFThread *)object; + OFString *name; if (!of_tlskey_set(threadSelfKey, thread)) @throw [OFInitializationFailedException exceptionWithClass: [thread class]]; thread->_pool = objc_autoreleasePoolPush(); + name = [thread name]; + if (name != nil) + of_thread_set_name([name UTF8String]); + else + of_thread_set_name(object_getClassName(thread)); + /* * Nasty workaround for thread implementations which can't return a * pointer on join. */ # ifdef OF_HAVE_BLOCKS @@ -126,10 +133,11 @@ } #endif @implementation OFThread #ifdef OF_HAVE_THREADS +@synthesize name = _name; # ifdef OF_HAVE_BLOCKS @synthesize threadBlock = _threadBlock; # endif + (void)initialize @@ -165,10 +173,13 @@ } + (OFMutableDictionary *)threadDictionary { OFThread *thread = of_tlskey_get(threadSelfKey); + + if (thread == nil) + return nil; if (thread->_threadDictionary == nil) thread->_threadDictionary = [[OFMutableDictionary alloc] init]; return thread->_threadDictionary; @@ -347,15 +358,10 @@ if (!of_thread_new(&_thread, callMain, self, &_attr)) { [self release]; @throw [OFThreadStartFailedException exceptionWithThread: self]; } - - if (_name != nil) - of_thread_set_name(_thread, [_name UTF8String]); - else - of_thread_set_name(_thread, class_getName([self class])); } - (id)join { if (_running == OF_THREAD_NOT_RUNNING || !of_thread_join(_thread)) @@ -388,26 +394,10 @@ # endif return _runLoop; } -- (OFString *)name -{ - return [[_name copy] autorelease]; -} - -- (void)setName: (OFString *)name -{ - OFString *old = name; - _name = [name copy]; - [old release]; - - if (_running == OF_THREAD_RUNNING) - of_thread_set_name(_thread, (_name != nil - ? [_name UTF8String] : class_getName([self class]))); -} - - (float)priority { return _attr.priority; } Index: src/OFTimer.h ================================================================== --- src/OFTimer.h +++ src/OFTimer.h @@ -43,11 +43,12 @@ */ @interface OFTimer: OFObject { OFDate *_fireDate; of_time_interval_t _interval; - id _target, _object1, _object2; + id _target; + id _Nullable _object1, _object2; SEL _selector; uint8_t _arguments; bool _repeats; #ifdef OF_HAVE_BLOCKS of_timer_block_t _block; @@ -55,11 +56,11 @@ bool _valid; #ifdef OF_HAVE_THREADS OFCondition *_condition; bool _done; #endif - OFRunLoop *_inRunLoop; + OFRunLoop *_Nullable _inRunLoop; } /*! * The time interval in which the timer will repeat, if it is a repeating * timer. Index: src/OFUDPSocket.h ================================================================== --- src/OFUDPSocket.h +++ src/OFUDPSocket.h @@ -157,11 +157,11 @@ * @param port A pointer to an uint16_t. If it is not NULL, the port of the * host / port pair will be written to it. * @param address The address for which the host and port should be retrieved */ + (void)getHost: (OFString *__autoreleasing _Nonnull *_Nullable)host - andPort: (uint16_t *_Nullable)port + andPort: (nullable uint16_t *)port forAddress: (of_udp_socket_address_t *)address; /*! * @brief Binds the socket to the specified host and port. * Index: src/OFUDPSocket.m ================================================================== --- src/OFUDPSocket.m +++ src/OFUDPSocket.m @@ -175,13 +175,13 @@ bool of_udp_socket_address_equal(of_udp_socket_address_t *address1, of_udp_socket_address_t *address2) { - struct sockaddr_in *sin_1, *sin_2; + struct sockaddr_in *addrIn1, *addrIn2; #ifdef HAVE_IPV6 - struct sockaddr_in6 *sin6_1, *sin6_2; + struct sockaddr_in6 *addrIn6_1, *addrIn6_2; #endif if (address1->address.ss_family != address2->address.ss_family) return false; @@ -194,33 +194,33 @@ #else if (address1->length < 8 || address2->length < 8) @throw [OFInvalidArgumentException exception]; #endif - sin_1 = (struct sockaddr_in *)&address1->address; - sin_2 = (struct sockaddr_in *)&address2->address; + addrIn1 = (struct sockaddr_in *)&address1->address; + addrIn2 = (struct sockaddr_in *)&address2->address; - if (sin_1->sin_port != sin_2->sin_port) + if (addrIn1->sin_port != addrIn2->sin_port) return false; - if (sin_1->sin_addr.s_addr != sin_2->sin_addr.s_addr) + if (addrIn1->sin_addr.s_addr != addrIn2->sin_addr.s_addr) return false; break; #ifdef HAVE_IPV6 case AF_INET6: if (address1->length < sizeof(struct sockaddr_in6) || address2->length < sizeof(struct sockaddr_in6)) @throw [OFInvalidArgumentException exception]; - sin6_1 = (struct sockaddr_in6 *)&address1->address; - sin6_2 = (struct sockaddr_in6 *)&address2->address; + addrIn6_1 = (struct sockaddr_in6 *)&address1->address; + addrIn6_2 = (struct sockaddr_in6 *)&address2->address; - if (sin6_1->sin6_port != sin6_2->sin6_port) + if (addrIn6_1->sin6_port != addrIn6_2->sin6_port) return false; - if (memcmp(sin6_1->sin6_addr.s6_addr, - sin6_2->sin6_addr.s6_addr, - sizeof(sin6_1->sin6_addr.s6_addr)) != 0) + 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; #endif default: @@ -232,13 +232,13 @@ uint32_t of_udp_socket_address_hash(of_udp_socket_address_t *address) { uint32_t hash = of_hash_seed; - struct sockaddr_in *sin; + struct sockaddr_in *addrIn; #ifdef HAVE_IPV6 - struct sockaddr_in6 *sin6; + struct sockaddr_in6 *addrIn6; uint32_t subhash; #endif hash += address->address.ss_family; @@ -250,29 +250,29 @@ #else if (address->length < 8) @throw [OFInvalidArgumentException exception]; #endif - sin = (struct sockaddr_in *)&address->address; + addrIn = (struct sockaddr_in *)&address->address; - hash += (sin->sin_port << 1); - hash ^= sin->sin_addr.s_addr; + hash += (addrIn->sin_port << 1); + hash ^= addrIn->sin_addr.s_addr; break; #ifdef HAVE_IPV6 case AF_INET6: if (address->length < sizeof(struct sockaddr_in6)) @throw [OFInvalidArgumentException exception]; - sin6 = (struct sockaddr_in6 *)&address->address; + addrIn6 = (struct sockaddr_in6 *)&address->address; - hash += (sin6->sin6_port << 1); + hash += (addrIn6->sin6_port << 1); OF_HASH_INIT(subhash); - for (size_t i = 0; i < sizeof(sin6->sin6_addr.s6_addr); i++) - OF_HASH_ADD(subhash, sin6->sin6_addr.s6_addr[i]); + for (size_t i = 0; i < sizeof(addrIn6->sin6_addr.s6_addr); i++) + OF_HASH_ADD(subhash, adrIn6->sin6_addr.s6_addr[i]); OF_HASH_FINALIZE(subhash); hash ^= subhash; Index: src/OFURL.h ================================================================== --- src/OFURL.h +++ src/OFURL.h @@ -28,11 +28,13 @@ */ @interface OFURL: OFObject { OFString *_scheme, *_host; uint16_t _port; - OFString *_user, *_password, *_path, *_parameters, *_query, *_fragment; + OFString *_Nullable _user, *_Nullable _password, *_path; + OFString *_Nullable _parameters, *_Nullable _query; + OFString *_Nullable _fragment; } /*! * The scheme part of the URL. */ Index: src/OFURL.m ================================================================== --- src/OFURL.m +++ src/OFURL.m @@ -134,28 +134,28 @@ UTF8String = tmp2; } if ((tmp2 = strchr(UTF8String, ':')) != NULL) { - void *pool; + void *pool2; OFString *portString; *tmp2 = '\0'; tmp2++; _host = [[OFString alloc] initWithUTF8String: UTF8String]; - pool = objc_autoreleasePoolPush(); + pool2 = objc_autoreleasePoolPush(); portString = [OFString stringWithUTF8String: tmp2]; if ([portString decimalValue] > 65535) @throw [OFInvalidFormatException exception]; _port = [portString decimalValue]; - objc_autoreleasePoolPop(pool); + objc_autoreleasePoolPop(pool2); } else { _host = [[OFString alloc] initWithUTF8String: UTF8String]; if ([_scheme isEqual: @"http"]) Index: src/OFXMLAttribute.h ================================================================== --- src/OFXMLAttribute.h +++ src/OFXMLAttribute.h @@ -26,11 +26,11 @@ * @brief A representation of an attribute of an XML element as an object. */ @interface OFXMLAttribute: OFXMLNode { @public - OFString *_name, *_namespace, *_stringValue; + OFString *_name, *_Nullable _namespace, *_stringValue; } /*! * The name of the attribute. */ Index: src/OFXMLElement.h ================================================================== --- src/OFXMLElement.h +++ src/OFXMLElement.h @@ -30,14 +30,15 @@ * * @brief A class which stores an XML element. */ @interface OFXMLElement: OFXMLNode { - OFString *_name, *_namespace, *_defaultNamespace; - OFMutableArray OF_GENERIC(OFXMLAttribute *) *_attributes; - OFMutableDictionary OF_GENERIC(OFString *, OFString *) *_namespaces; - OFMutableArray OF_GENERIC(OFXMLNode *) *_children; + OFString *_name, *_Nullable _namespace, *_Nullable _defaultNamespace; + OFMutableArray OF_GENERIC(OFXMLAttribute *) *_Nullable _attributes; + OFMutableDictionary OF_GENERIC(OFString *, OFString *) *_Nullable + _namespaces; + OFMutableArray OF_GENERIC(OFXMLNode *) *_Nullable _children; } /*! * The name of the element. */ @@ -276,21 +277,21 @@ * @brief Returns the attribute with the specified name. * * @param attributeName The name of the attribute * @return The attribute with the specified name */ -- (OFXMLAttribute *)attributeForName: (OFString *)attributeName; +- (nullable OFXMLAttribute *)attributeForName: (OFString *)attributeName; /*! * @brief Returns the attribute with the specified name and namespace. * * @param attributeName The name of the attribute * @param attributeNS The namespace of the attribute * @return The attribute with the specified name and namespace */ -- (OFXMLAttribute *)attributeForName: (OFString *)attributeName - namespace: (nullable OFString *)attributeNS; +- (nullable OFXMLAttribute *)attributeForName: (OFString *)attributeName + namespace: (nullable OFString *)attributeNS; /*! * @brief Removes the attribute with the specified name. * * @param attributeName The name of the attribute @@ -397,11 +398,11 @@ * @brief Returns the first child element with the specified name. * * @param elementName The name of the element * @return The first child element with the specified name */ -- (OFXMLElement *)elementForName: (OFString *)elementName; +- (nullable OFXMLElement *)elementForName: (OFString *)elementName; /*! * @brief Returns the child elements with the specified name. * * @param elementName The name of the elements @@ -415,12 +416,12 @@ * * @param elementName The name of the element * @param elementNS The namespace of the element * @return The first child element with the specified name and namespace */ -- (OFXMLElement *)elementForName: (OFString *)elementName - namespace: (nullable OFString *)elementNS; +- (nullable OFXMLElement *)elementForName: (OFString *)elementName + namespace: (nullable OFString *)elementNS; /*! * @brief Returns the child elements with the specified name and namespace. * * @param elementName The name of the elements Index: src/OFXMLElement.m ================================================================== --- src/OFXMLElement.m +++ src/OFXMLElement.m @@ -379,11 +379,11 @@ } - (void)setChildren: (OFArray *)children { OFArray *old = _children; - _children = [children copy]; + _children = [children mutableCopy]; [old release]; } - (OFArray *)children { @@ -882,31 +882,31 @@ [_children addObject: child]; } - (void)insertChild: (OFXMLNode *)child - atIndex: (size_t)index + atIndex: (size_t)idx { if ([child isKindOfClass: [OFXMLAttribute class]]) @throw [OFInvalidArgumentException exception]; if (_children == nil) _children = [[OFMutableArray alloc] init]; [_children insertObject: child - atIndex: index]; + atIndex: idx]; } - (void)insertChildren: (OFArray *)children - atIndex: (size_t)index + atIndex: (size_t)idx { for (OFXMLNode *node in children) if ([node isKindOfClass: [OFXMLAttribute class]]) @throw [OFInvalidArgumentException exception]; [_children insertObjectsFromArray: children - atIndex: index]; + atIndex: idx]; } - (void)removeChild: (OFXMLNode *)child { if ([child isKindOfClass: [OFXMLAttribute class]]) @@ -913,13 +913,13 @@ @throw [OFInvalidArgumentException exception]; [_children removeObject: child]; } -- (void)removeChildAtIndex: (size_t)index +- (void)removeChildAtIndex: (size_t)idx { - [_children removeObjectAtIndex: index]; + [_children removeObjectAtIndex: idx]; } - (void)replaceChild: (OFXMLNode *)child withNode: (OFXMLNode *)node { @@ -929,17 +929,17 @@ [_children replaceObject: child withObject: node]; } -- (void)replaceChildAtIndex: (size_t)index +- (void)replaceChildAtIndex: (size_t)idx withNode: (OFXMLNode *)node { if ([node isKindOfClass: [OFXMLAttribute class]]) @throw [OFInvalidArgumentException exception]; - [_children replaceObjectAtIndex: index + [_children replaceObjectAtIndex: idx withObject: node]; } - (OFXMLElement *)elementForName: (OFString *)elementName { Index: src/OFXMLElementBuilder.h ================================================================== --- src/OFXMLElementBuilder.h +++ src/OFXMLElementBuilder.h @@ -104,11 +104,11 @@ * setting the OFXMLElementBuilder as delegate for the parser. */ @interface OFXMLElementBuilder: OFObject { OFMutableArray OF_GENERIC(OFXMLElement *) *_stack; - id _delegate; + id _Nullable _delegate; } /*! * The delegate for the OFXMLElementBuilder. */ Index: src/OFXMLParser.h ================================================================== --- src/OFXMLParser.h +++ src/OFXMLParser.h @@ -114,12 +114,12 @@ * * @param parser The parser which found an unknown entity * @param entity The name of the entity the XML parser didn't know * @return A substitution for the entity or `nil` */ -- (OFString *)parser: (OFXMLParser *)parser - foundUnknownEntityNamed: (OFString *)entity; +- (nullable OFString *)parser: (OFXMLParser *)parser + foundUnknownEntityNamed: (OFString *)entity; @end /*! * @class OFXMLParser OFXMLParser.h ObjFW/OFXMLParser.h * @@ -128,11 +128,11 @@ * OFXMLParser is an event-based XML parser which calls the delegate's callbacks * as soon as it finds something, thus suitable for streams as well. */ @interface OFXMLParser: OFObject { - id _delegate; + 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, @@ -153,18 +153,18 @@ OF_XMLPARSER_IN_COMMENT_2, OF_XMLPARSER_IN_DOCTYPE, OF_XMLPARSER_NUM_STATES } _state; size_t _i, _last; - const char *_data; + const char *_Nullable _data; OFMutableData *_buffer; - OFString *_name, *_prefix; + OFString *_Nullable _name, *_Nullable _prefix; OFMutableArray OF_GENERIC(OFMutableDictionary OF_GENERIC(OFString *, OFString *) *) *_namespaces; OFMutableArray OF_GENERIC(OFXMLAttribute *) *_attributes; - OFString *_attributeName, *_attributePrefix; + OFString *_Nullable _attributeName, *_Nullable _attributePrefix; char _delimiter; OFMutableArray OF_GENERIC(OFString *) *_previous; size_t _level; bool _acceptProlog; size_t _lineNumber; Index: src/OFZIPArchive.h ================================================================== --- src/OFZIPArchive.h +++ src/OFZIPArchive.h @@ -36,15 +36,15 @@ OFSeekableStream *_stream; uint32_t _diskNumber, _centralDirectoryDisk; uint64_t _centralDirectoryEntriesInDisk, _centralDirectoryEntries; uint64_t _centralDirectorySize; int64_t _centralDirectoryOffset; - OFString *_archiveComment; + OFString *_Nullable _archiveComment; OFMutableArray OF_GENERIC(OFZIPArchiveEntry *) *_entries; OFMutableDictionary OF_GENERIC(OFString *, OFZIPArchiveEntry *) *_pathToEntryMap; - OFStream *_lastReturnedStream; + OFStream *_Nullable _lastReturnedStream; } /*! * The archive comment. */ Index: src/OFZIPArchive.m ================================================================== --- src/OFZIPArchive.m +++ src/OFZIPArchive.m @@ -71,19 +71,18 @@ @end @interface OFZIPArchive_FileStream: OFStream { OFStream *_stream, *_decompressedStream; - OFZIPArchive_LocalFileHeader *_localFileHeader; - bool _hasDataDescriptor; - uint64_t _size; + OFZIPArchiveEntry *_entry; + uint64_t _toRead; uint32_t _CRC32; bool _atEndOfStream; } - initWithStream: (OFStream *)path - localFileHeader: (OFZIPArchive_LocalFileHeader *)localFileHeader; + entry: (OFZIPArchiveEntry *)localFileHeader; @end uint32_t of_zip_archive_read_field32(const uint8_t **data, uint16_t *size) { @@ -358,11 +357,11 @@ exceptionWithVersion: version]; } _lastReturnedStream = [[OFZIPArchive_FileStream alloc] initWithStream: _stream - localFileHeader: localFileHeader]; + entry: entry]; objc_autoreleasePoolPop(pool); return _lastReturnedStream; } @@ -451,18 +450,18 @@ } @end @implementation OFZIPArchive_FileStream - initWithStream: (OFStream *)stream - localFileHeader: (OFZIPArchive_LocalFileHeader *)localFileHeader + entry: (OFZIPArchiveEntry *)entry { self = [super init]; @try { _stream = [stream retain]; - switch (localFileHeader->_compressionMethod) { + switch ([entry compressionMethod]) { case OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_NONE: _decompressedStream = [stream retain]; break; case OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_DEFLATE: _decompressedStream = [[OFInflateStream alloc] @@ -476,14 +475,12 @@ @throw [OFNotImplementedException exceptionWithSelector: _cmd object: self]; } - _localFileHeader = [localFileHeader retain]; - _hasDataDescriptor = (localFileHeader->_generalPurposeBitFlag & - (1 << 3)); - _size = localFileHeader->_uncompressedSize; + _entry = [entry retain]; + _toRead = [entry uncompressedSize]; _CRC32 = ~0; } @catch (id e) { [self release]; @throw e; } @@ -493,12 +490,13 @@ - (void)dealloc { [self close]; + [_stream release]; [_decompressedStream release]; - [_localFileHeader release]; + [_entry release]; [super dealloc]; } - (bool)lowlevelIsAtEndOfStream @@ -507,58 +505,38 @@ } - (size_t)lowlevelReadIntoBuffer: (void *)buffer length: (size_t)length { - size_t min, ret; + size_t ret; if (_stream == nil) @throw [OFNotOpenException exceptionWithObject: self]; if (_atEndOfStream) return 0; - if (_hasDataDescriptor) { - if ([_decompressedStream isAtEndOfStream]) { - uint32_t CRC32; - - _atEndOfStream = true; - - CRC32 = [_stream readLittleEndianInt32]; - if (CRC32 == 0x08074B50) - CRC32 = [_stream readLittleEndianInt32]; - - if (~_CRC32 != CRC32) - @throw [OFChecksumFailedException exception]; - - /* - * FIXME: Check (un)compressed length! - * (Note: Both are 64 bit if the entry uses ZIP64!) - */ - - return 0; - } - - ret = [_decompressedStream readIntoBuffer: buffer - length: length]; - } else { - if (_size == 0) { - _atEndOfStream = true; - - if (~_CRC32 != _localFileHeader->_CRC32) - @throw [OFChecksumFailedException exception]; - - return 0; - } - - min = (length < _size ? length : (size_t)_size); - ret = [_decompressedStream readIntoBuffer: buffer - length: min]; - _size -= ret; - } - - _CRC32 = of_crc32(_CRC32, buffer, ret); +#if SIZE_MAX >= UINT64_MAX + if (length > UINT64_MAX) + @throw [OFOutOfRangeException exception]; +#endif + + if ((uint64_t)length > _toRead) + length = (size_t)_toRead; + + ret = [_decompressedStream readIntoBuffer: buffer + length: length]; + + if (ret == 0) + _atEndOfStream = true; + + _toRead -= ret; + _CRC32 = of_crc32(_CRC32, buffer, ret); + + if (_toRead == 0) + if (~_CRC32 != [_entry CRC32]) + @throw [OFChecksumFailedException exception]; return ret; } - (void)close Index: src/OFZIPArchiveEntry.h ================================================================== --- src/OFZIPArchiveEntry.h +++ src/OFZIPArchiveEntry.h @@ -93,12 +93,12 @@ uint16_t _compressionMethod; uint16_t _lastModifiedFileTime, _lastModifiedFileDate; uint32_t _CRC32; uint64_t _compressedSize, _uncompressedSize; OFString *_fileName; - OFData *_extraField; - OFString *_fileComment; + OFData *_Nullable _extraField; + OFString *_Nullable _fileComment; uint32_t _startDiskNumber; uint16_t _internalAttributes; uint32_t _versionSpecificAttributes; int64_t _localFileHeaderOffset; } Index: src/block.h ================================================================== --- src/block.h +++ src/block.h @@ -28,12 +28,12 @@ int reserved; void (*invoke)(void *block, ...); struct of_block_descriptor_t { unsigned long reserved; unsigned long size; - void (*copy_helper)(void *dest, void *src); - void (*dispose_helper)(void *src); + void (*_Nullable copy_helper)(void *dest, void *src); + void (*_Nullable dispose_helper)(void *src); const char *signature; } *descriptor; } of_block_literal_t; #ifdef __cplusplus Index: src/bridge/NSArray+OFObject.h ================================================================== --- src/bridge/NSArray+OFObject.h +++ src/bridge/NSArray+OFObject.h @@ -16,11 +16,13 @@ #import #import "NSBridging.h" +#ifdef NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN +#endif /*! * @category NSArray (OFObject) \ * NSArray+OFObject.h ObjFW-Bridge/NSArray+OFObject.h * @@ -27,6 +29,8 @@ * @brief Support for bridging NSArrays to OFArrays. */ @interface NSArray (OFObject) @end +#ifdef NS_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END +#endif Index: src/bridge/NSArray_OFArray.h ================================================================== --- src/bridge/NSArray_OFArray.h +++ src/bridge/NSArray_OFArray.h @@ -16,16 +16,20 @@ #import @class OFArray; +#ifdef NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN +#endif @interface NSArray_OFArray: NSArray { OFArray *_array; } - initWithOFArray: (OFArray *)array; @end +#ifdef NS_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END +#endif Index: src/bridge/NSArray_OFArray.m ================================================================== --- src/bridge/NSArray_OFArray.m +++ src/bridge/NSArray_OFArray.m @@ -32,13 +32,13 @@ } return self; } -- (id)objectAtIndex: (NSUInteger)index +- (id)objectAtIndex: (NSUInteger)idx { - id object = [_array objectAtIndex: index]; + id object = [_array objectAtIndex: idx]; if ([(OFObject *)object conformsToProtocol: @protocol(OFBridging)]) return [object NSObject]; return object; Index: src/bridge/NSDictionary+OFObject.h ================================================================== --- src/bridge/NSDictionary+OFObject.h +++ src/bridge/NSDictionary+OFObject.h @@ -16,11 +16,13 @@ #import #import "NSBridging.h" +#ifdef NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN +#endif /*! * @category NSDictionary (OFObject) \ * NSDictionary+OFObject.h ObjFW-Bridge/NSDictionary+OFObject.h * @@ -27,6 +29,8 @@ * @brief Support for bridging NSDictionaries to OFDictionaries. */ @interface NSDictionary (OFObject) @end +#ifdef NS_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END +#endif Index: src/bridge/NSDictionary_OFDictionary.h ================================================================== --- src/bridge/NSDictionary_OFDictionary.h +++ src/bridge/NSDictionary_OFDictionary.h @@ -16,16 +16,20 @@ #import @class OFDictionary; +#ifdef NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN +#endif @interface NSDictionary_OFDictionary: NSDictionary { OFDictionary *_dictionary; } - initWithOFDictionary: (OFDictionary *)dictionary; @end +#ifdef NS_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END +#endif Index: src/bridge/NSString+OFObject.h ================================================================== --- src/bridge/NSString+OFObject.h +++ src/bridge/NSString+OFObject.h @@ -16,11 +16,13 @@ #import #import "NSBridging.h" +#ifdef NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN +#endif /*! * @category NSString (OFObject) * NSString+OFObject.h ObjFW-Bridge/NSString+OFObject.h * @@ -31,6 +33,8 @@ * character of OFString is 4). */ @interface NSString (OFObject) @end +#ifdef NS_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END +#endif Index: src/bridge/OFArray_NSArray.m ================================================================== --- src/bridge/OFArray_NSArray.m +++ src/bridge/OFArray_NSArray.m @@ -39,18 +39,18 @@ } return self; } -- (id)objectAtIndex: (size_t)index +- (id)objectAtIndex: (size_t)idx { id object; - if (index > NSUIntegerMax) + if (idx > NSUIntegerMax) @throw [OFOutOfRangeException exception]; - object = [_array objectAtIndex: index]; + object = [_array objectAtIndex: idx]; if ([(NSObject *)object conformsToProtocol: @protocol(NSBridging)]) return [object OFObject]; return object; Index: src/bridge/OFString+NSObject.m ================================================================== --- src/bridge/OFString+NSObject.m +++ src/bridge/OFString+NSObject.m @@ -16,11 +16,19 @@ #import #import "OFString+NSObject.h" +#import "OFInitializationFailedException.h" + @implementation OFString (NSObject) - (id)NSObject { - return [NSString stringWithUTF8String: [self UTF8String]]; + NSString *string = [NSString stringWithUTF8String: [self UTF8String]]; + + if (string == nil) + @throw [OFInitializationFailedException + exceptionWithClass: [NSString class]]; + + return string; } @end Index: src/encodings/codepage_437.m ================================================================== --- src/encodings/codepage_437.m +++ src/encodings/codepage_437.m @@ -135,11 +135,11 @@ { for (size_t i = 0; i < length; i++) { of_unichar_t c = input[i]; if OF_UNLIKELY (c > 0x7F) { - uint8_t index; + uint8_t idx; if OF_UNLIKELY (c > 0xFFFF) { if (lossy) { output[i] = '?'; continue; Index: src/encodings/codepage_850.m ================================================================== --- src/encodings/codepage_850.m +++ src/encodings/codepage_850.m @@ -111,11 +111,11 @@ { for (size_t i = 0; i < length; i++) { of_unichar_t c = input[i]; if OF_UNLIKELY (c > 0x7F) { - uint8_t index; + uint8_t idx; if OF_UNLIKELY (c > 0xFFFF) { if (lossy) { output[i] = '?'; continue; Index: src/encodings/codepage_858.m ================================================================== --- src/encodings/codepage_858.m +++ src/encodings/codepage_858.m @@ -117,11 +117,11 @@ { for (size_t i = 0; i < length; i++) { of_unichar_t c = input[i]; if OF_UNLIKELY (c > 0x7F) { - uint8_t index; + uint8_t idx; if OF_UNLIKELY (c > 0xFFFF) { if (lossy) { output[i] = '?'; continue; Index: src/encodings/common.h ================================================================== --- src/encodings/common.h +++ src/encodings/common.h @@ -19,26 +19,26 @@ if OF_UNLIKELY ((c & 0xFF) < page##nr##Start) { \ output[i] = (unsigned char)c; \ continue; \ } \ \ - index = (c & 0xFF) - page##nr##Start; \ + idx = (c & 0xFF) - page##nr##Start; \ \ - if (index >= sizeof(page##nr)) { \ + if (idx >= sizeof(page##nr)) { \ output[i] = (unsigned char)c; \ continue; \ } \ \ - if (page##nr[index] == 0x00) { \ + if (page##nr[idx] == 0x00) { \ if (lossy) { \ output[i] = '?'; \ continue; \ } else \ return false; \ } \ \ - output[i] = page##nr[index]; \ + output[i] = page##nr[idx]; \ break; #define CASE_MISSING_IS_ERROR(nr) \ case 0x##nr: \ if OF_UNLIKELY ((c & 0xFF) < page##nr##Start) { \ if (lossy) { \ @@ -46,17 +46,17 @@ continue; \ } else \ return false; \ } \ \ - index = (c & 0xFF) - page##nr##Start; \ + idx = (c & 0xFF) - page##nr##Start; \ \ - if (index >= sizeof(page##nr) || page##nr[index] == 0) { \ + if (idx >= sizeof(page##nr) || page##nr[idx] == 0) { \ if (lossy) { \ output[i] = '?'; \ continue; \ } else \ return false; \ } \ \ - output[i] = page##nr[index]; \ + output[i] = page##nr[idx]; \ break; Index: src/encodings/iso_8859_15.m ================================================================== --- src/encodings/iso_8859_15.m +++ src/encodings/iso_8859_15.m @@ -66,11 +66,11 @@ { for (size_t i = 0; i < length; i++) { of_unichar_t c = input[i]; if OF_UNLIKELY (c > 0x7F) { - uint8_t index; + uint8_t idx; if OF_UNLIKELY (c > 0xFFFF) { if (lossy) { output[i] = '?'; continue; Index: src/encodings/iso_8859_2.m ================================================================== --- src/encodings/iso_8859_2.m +++ src/encodings/iso_8859_2.m @@ -86,11 +86,11 @@ { for (size_t i = 0; i < length; i++) { of_unichar_t c = input[i]; if OF_UNLIKELY (c > 0x7F) { - uint8_t index; + uint8_t idx; if OF_UNLIKELY (c > 0xFFFF) { if (lossy) { output[i] = '?'; continue; Index: src/encodings/iso_8859_3.m ================================================================== --- src/encodings/iso_8859_3.m +++ src/encodings/iso_8859_3.m @@ -83,11 +83,11 @@ { for (size_t i = 0; i < length; i++) { of_unichar_t c = input[i]; if OF_UNLIKELY (c > 0x7F) { - uint8_t index; + uint8_t idx; if OF_UNLIKELY (c > 0xFFFF) { if (lossy) { output[i] = '?'; continue; Index: src/encodings/koi8_r.m ================================================================== --- src/encodings/koi8_r.m +++ src/encodings/koi8_r.m @@ -121,11 +121,11 @@ { for (size_t i = 0; i < length; i++) { of_unichar_t c = input[i]; if OF_UNLIKELY (c > 0x7F) { - uint8_t index; + uint8_t idx; if OF_UNLIKELY (c > 0xFFFF) { if (lossy) { output[i] = '?'; continue; Index: src/encodings/koi8_u.m ================================================================== --- src/encodings/koi8_u.m +++ src/encodings/koi8_u.m @@ -129,11 +129,11 @@ { for (size_t i = 0; i < length; i++) { of_unichar_t c = input[i]; if OF_UNLIKELY (c > 0x7F) { - uint8_t index; + uint8_t idx; if OF_UNLIKELY (c > 0xFFFF) { if (lossy) { output[i] = '?'; continue; Index: src/encodings/mac_roman.m ================================================================== --- src/encodings/mac_roman.m +++ src/encodings/mac_roman.m @@ -155,11 +155,11 @@ { for (size_t i = 0; i < length; i++) { of_unichar_t c = input[i]; if OF_UNLIKELY (c > 0x7F) { - uint8_t index; + uint8_t idx; if OF_UNLIKELY (c > 0xFFFF) { if (lossy) { output[i] = '?'; continue; Index: src/encodings/windows_1251.m ================================================================== --- src/encodings/windows_1251.m +++ src/encodings/windows_1251.m @@ -108,11 +108,11 @@ { for (size_t i = 0; i < length; i++) { of_unichar_t c = input[i]; if OF_UNLIKELY (c > 0x7F) { - uint8_t index; + uint8_t idx; if OF_UNLIKELY (c > 0xFFFF) { if (lossy) { output[i] = '?'; continue; Index: src/encodings/windows_1252.m ================================================================== --- src/encodings/windows_1252.m +++ src/encodings/windows_1252.m @@ -104,11 +104,11 @@ { for (size_t i = 0; i < length; i++) { of_unichar_t c = input[i]; if OF_UNLIKELY (c > 0x7F) { - uint8_t index; + uint8_t idx; if OF_UNLIKELY (c > 0xFFFF) { if (lossy) { output[i] = '?'; continue; Index: src/exceptions/OFMemoryNotPartOfObjectException.h ================================================================== --- src/exceptions/OFMemoryNotPartOfObjectException.h +++ src/exceptions/OFMemoryNotPartOfObjectException.h @@ -25,18 +25,18 @@ * * @brief An exception indicating the given memory is not part of the object. */ @interface OFMemoryNotPartOfObjectException: OFException { - void *_pointer; + void *_Nullable _pointer; id _object; } /*! * A pointer to the memory which is not part of the object. */ -@property (readonly, nonatomic) void *pointer; +@property OF_NULLABLE_PROPERTY (readonly, nonatomic) void *pointer; /*! * The object which the memory is not part of. */ @property (readonly, nonatomic) id object; @@ -48,11 +48,11 @@ * * @param pointer A pointer to the memory that is not part of the object * @param object The object which the memory is not part of * @return A new, autoreleased memory not part of object exception */ -+ (instancetype)exceptionWithPointer: (void *)pointer ++ (instancetype)exceptionWithPointer: (nullable void *)pointer object: (id)object; - init OF_UNAVAILABLE; /*! @@ -60,10 +60,10 @@ * * @param pointer A pointer to the memory that is not part of the object * @param object The object which the memory is not part of * @return An initialized memory not part of object exception */ -- initWithPointer: (void *)pointer +- initWithPointer: (nullable void *)pointer object: (id)object OF_DESIGNATED_INITIALIZER; @end OF_ASSUME_NONNULL_END Index: src/macros.h ================================================================== --- src/macros.h +++ src/macros.h @@ -106,13 +106,13 @@ # define OF_BIGGEST_ALIGNMENT 16 # endif #endif #ifdef __GNUC__ -# define __GCC_VERSION__ (__GNUC__ * 100 + __GNUC_MINOR__) +# define OF_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) #else -# define __GCC_VERSION__ 0 +# define OF_GCC_VERSION 0 #endif #ifndef __has_feature # define __has_feature(x) 0 #endif @@ -196,17 +196,17 @@ # define OF_KINDOF(cls) __kindof cls #else # define OF_KINDOF(cls) id #endif -#if defined(__clang__) || __GCC_VERSION__ >= 405 +#if defined(__clang__) || OF_GCC_VERSION >= 405 # define OF_UNREACHABLE __builtin_unreachable(); #else # define OF_UNREACHABLE abort(); #endif -#if defined(__clang__) || __GCC_VERSION__ >= 406 +#if defined(__clang__) || OF_GCC_VERSION >= 406 # define OF_SENTINEL __attribute__((__sentinel__)) # define OF_NO_RETURN __attribute__((__noreturn__)) #else # define OF_SENTINEL # define OF_NO_RETURN @@ -602,29 +602,29 @@ OF_HASH_ADD(hash, (otherCopy >> 8) & 0xFF); \ OF_HASH_ADD(hash, otherCopy & 0xFF); \ } static OF_INLINE bool -of_bitset_isset(uint8_t *storage, size_t index) +of_bitset_isset(uint8_t *_Nonnull storage, size_t idx) { - return storage[index / 8] & (1 << (index % 8)); + return storage[idx / 8] & (1 << (idx % 8)); } static OF_INLINE void -of_bitset_set(uint8_t *storage, size_t index) +of_bitset_set(uint8_t *_Nonnull storage, size_t idx) { - storage[index / 8] |= (1 << (index % 8)); + storage[idx / 8] |= (1 << (idx % 8)); } static OF_INLINE void -of_bitset_clear(uint8_t *storage, size_t index) +of_bitset_clear(uint8_t *_Nonnull storage, size_t idx) { - storage[index / 8] &= ~(1 << (index % 8)); + storage[idx / 8] &= ~(1 << (idx % 8)); } -static OF_INLINE char * -of_strdup(const char *string) +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) @@ -634,11 +634,11 @@ return copy; } static OF_INLINE void -of_explicit_memset(void *buffer_, int character, size_t length) +of_explicit_memset(void *_Nonnull buffer_, int character, size_t length) { volatile unsigned char *buffer = (volatile unsigned char *)buffer_; while (buffer < (unsigned char *)buffer_ + length) *buffer++ = character; Index: src/of_asprintf.m ================================================================== --- src/of_asprintf.m +++ src/of_asprintf.m @@ -558,14 +558,16 @@ @try { OFMutableString *tmpStr = [OFMutableString stringWithUTF8String: tmp length: tmpLen]; - OFString *decimalPoint = + OFString *point = [OFLocalization decimalPoint]; - [tmpStr replaceOccurrencesOfString: decimalPoint - withString: @"."]; + if (point != nil) + [tmpStr + replaceOccurrencesOfString: point + withString: @"."]; if ([tmpStr UTF8StringLength] > INT_MAX) return false; tmpLen = (int)[tmpStr UTF8StringLength]; tmp2 = malloc(tmpLen); memcpy(tmp2, [tmpStr UTF8String], tmpLen); Index: src/platform.h ================================================================== --- src/platform.h +++ src/platform.h @@ -69,11 +69,12 @@ # define OF_SPARC #endif #if defined(__APPLE__) # include -# if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE +# if (defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE) || \ + (defined(TARGET_OS_SIMULATOR) && TARGET_OS_SIMULATOR) # define OF_IOS # else # define OF_MACOS # endif #elif defined(__linux__) Index: src/runtime/Makefile ================================================================== --- src/runtime/Makefile +++ src/runtime/Makefile @@ -2,11 +2,10 @@ SUBDIRS = lookup-asm SHARED_LIB = ${OBJFW_RT_SHARED_LIB} STATIC_LIB = ${OBJFW_RT_STATIC_LIB} -MORPHOS_LIB = ${OBJFW_RT_MORPHOS_LIB} LIB_MAJOR = ${OBJFW_RT_LIB_MAJOR} LIB_MINOR = ${OBJFW_RT_LIB_MINOR} SRCS = arc.m \ category.m \ @@ -29,22 +28,13 @@ INCLUDES = ObjFW-RT.h includesubdir = ObjFW-RT OBJS_EXTRA = ${LOOKUP_ASM_LOOKUP_ASM_A} LIB_OBJS_EXTRA = ${LOOKUP_ASM_LOOKUP_ASM_LIB_A} -MORPHOS_LIB_OBJS_EXTRA = morphos-library.o ${LOOKUP_ASM_LOOKUP_ASM_A} include ../../buildsys.mk -${MORPHOS_LIB}: ppcinline.h -ppcinline.h: ObjFW-RT.fd protos.h - cvinclude.pl \ - --root ObjFW_RT \ - --fd ObjFW-RT.fd \ - --clib protos.h \ - --inline $@ - CPPFLAGS += -I. -I.. -I../.. \ -DOF_COMPILING_OBJFW_RT \ -DOBJFW_RT_LIB_MAJOR=${OBJFW_RT_LIB_MAJOR} \ -DOBJFW_RT_LIB_MINOR=${OBJFW_RT_LIB_MINOR} LD = ${OBJC} Index: src/runtime/ObjFW-RT.h ================================================================== --- src/runtime/ObjFW-RT.h +++ src/runtime/ObjFW-RT.h @@ -41,18 +41,21 @@ # define _Nonnull # endif # ifndef _Nullable # define _Nullable # endif +# ifndef _Null_unspecified +# define _Null_unspecified +# endif #endif #if !__has_feature(objc_arc) && !defined(__unsafe_unretained) # define __unsafe_unretained #endif -#define Nil (Class)0 -#define nil (id)0 +#define Nil (Class _Null_unspecified)0 +#define nil (id _Null_unspecified)0 #define YES (BOOL)1 #define NO (BOOL)0 typedef struct objc_class *Class; typedef struct objc_object *id; @@ -69,12 +72,12 @@ unsigned long version; unsigned long info; long instance_size; struct objc_ivar_list *_Nullable ivars; struct objc_method_list *_Nullable methodlist; - struct objc_dtable *_Nullable dtable; - Class _Nonnull *_Nullable subclass_list; + struct objc_dtable *_Nonnull dtable; + Class _Nullable *_Nullable subclass_list; void *_Nullable sibling_class; struct objc_protocol_list *_Nullable protocols; void *_Nullable gc_object_type; unsigned long abi_version; int32_t *_Nonnull *_Nullable ivar_offsets; @@ -197,14 +200,13 @@ struct objc_protocol_list *_Nullable next; long count; Protocol *__unsafe_unretained _Nonnull list[1]; }; -#if 1 /* !defined(__MORPHOS__) || defined(OF_COMPILING_OBJFW_RT) */ -# ifdef __cplusplus +#ifdef __cplusplus extern "C" { -# endif +#endif extern SEL _Nonnull sel_registerName(const char *_Nonnull); extern const char *_Nonnull sel_getName(SEL _Nonnull); extern bool sel_isEqual(SEL _Nonnull, SEL _Nonnull); extern Class _Nonnull objc_allocateClassPair(Class _Nullable, const char *_Nonnull, size_t); @@ -227,11 +229,11 @@ const char *_Nullable); extern IMP _Nullable class_replaceMethod(Class _Nonnull, SEL _Nonnull, IMP _Nonnull, const char *_Nullable); extern Class _Nullable object_getClass(id _Nullable); extern Class _Nullable object_setClass(id _Nullable, Class _Nonnull); -extern const char *_Nonnull object_getClassName(id _Nullable); +extern const char *_Nullable object_getClassName(id _Nullable); extern const char *_Nonnull protocol_getName(Protocol *_Nonnull); extern bool protocol_isEqual(Protocol *_Nonnull, Protocol *_Nonnull); extern bool protocol_conformsToProtocol(Protocol *_Nonnull, Protocol *_Nonnull); extern void objc_exit(void); extern _Nullable objc_uncaught_exception_handler @@ -239,30 +241,11 @@ objc_uncaught_exception_handler _Nullable); extern void objc_setForwardHandler(IMP _Nullable, IMP _Nullable); extern void objc_setEnumerationMutationHandler( objc_enumeration_mutation_handler _Nullable); extern void objc_zero_weak_references(id _Nonnull); -# ifdef __cplusplus -} -# endif -#else -# define BOOL EXEC_BOOL -# include -# undef BOOL -# ifdef __cplusplus -extern "C" { -# endif -extern struct Library *ObjFWRTBase; -# ifdef __cplusplus -} -# endif -# include "ppcinline.h" -#endif - -#ifdef __cplusplus -extern "C" { -#endif + /* * Used by the compiler, but can also be called manually. * * They need to be in the glue code for the MorphOS library. * Index: src/runtime/hashtable.m ================================================================== --- src/runtime/hashtable.m +++ src/runtime/hashtable.m @@ -129,11 +129,11 @@ table->data = ndata; table->size = nsize; } static inline bool -index_for_key(struct objc_hashtable *table, const void *key, uint32_t *index) +index_for_key(struct objc_hashtable *table, const void *key, uint32_t *idx) { uint32_t i, hash; hash = table->hash(key) & (table->size - 1); @@ -140,11 +140,11 @@ for (i = hash; i < table->size && table->data[i] != NULL; i++) { if (table->data[i] == &objc_deleted_bucket) continue; if (table->equal(table->data[i]->key, key)) { - *index = i; + *idx = i; return true; } } if (i < table->size) @@ -153,11 +153,11 @@ for (i = 0; i < hash && table->data[i] != NULL; i++) { if (table->data[i] == &objc_deleted_bucket) continue; if (table->equal(table->data[i]->key, key)) { - *index = i; + *idx = i; return true; } } return false; Index: src/runtime/lookup-asm/lookup-asm-sparc64-elf.S ================================================================== --- src/runtime/lookup-asm/lookup-asm-sparc64-elf.S +++ src/runtime/lookup-asm/lookup-asm-sparc64-elf.S @@ -50,15 +50,20 @@ #endif ldx [%o2 + %o4], %o2 ldx [%o2 + %o5], %o2 cmp %o2, 0 - be,pn %xcc, \not_found + be,pn %xcc, 0f nop retl mov %o2, %o0 + +0: + mov %o7, %g1 + call \not_found + mov %g1, %o7 .type \name, %function .size \name, .-\name .endm .macro generate_lookup_super name lookup DELETED src/runtime/morphos-library.m Index: src/runtime/morphos-library.m ================================================================== --- src/runtime/morphos-library.m +++ src/runtime/morphos-library.m @@ -1,221 +0,0 @@ -/* - * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 - * 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 "ObjFW-RT.h" -#import "macros.h" - -#define BOOL EXEC_BOOL -#include -#include -#include -#include -#include -#include -#include -#undef BOOL - -struct ObjFWRTBase { - struct Library library; - BPTR seg_list; -}; - -/* Forward declarations for all functions in the func_table */ -static struct Library *lib_init(struct ObjFWRTBase *base, BPTR seg_list, - struct ExecBase *exec_base); -static struct Library *lib_open(void); -static BPTR lib_close(void); -static BPTR lib_expunge(void); -static void lib_null(void); -void objc_set_exit(void OF_NO_RETURN_FUNC (*exit_fn_)(int status)); - -static ULONG func_table[] = { - FUNCARRAY_BEGIN, - FUNCARRAY_32BIT_NATIVE, - (ULONG)lib_open, - (ULONG)lib_close, - (ULONG)lib_expunge, - (ULONG)lib_null, - -1, - FUNCARRAY_32BIT_SYSTEMV, - /* Functions for the glue code */ - (ULONG)objc_set_exit, - /* Used by the compiler - these need glue code */ - (ULONG)__objc_exec_class, - (ULONG)objc_msg_lookup, - (ULONG)objc_msg_lookup_stret, - (ULONG)objc_msg_lookup_super, - (ULONG)objc_msg_lookup_super_stret, - (ULONG)objc_lookUpClass, - (ULONG)objc_getClass, - (ULONG)objc_getRequiredClass, - (ULONG)objc_exception_throw, - (ULONG)objc_sync_enter, - (ULONG)objc_sync_exit, - (ULONG)objc_getProperty, - (ULONG)objc_setProperty, - (ULONG)objc_getPropertyStruct, - (ULONG)objc_setPropertyStruct, - (ULONG)objc_enumerationMutation, - /* Functions declared in ObjFW-RT.h */ - (ULONG)sel_registerName, - (ULONG)sel_getName, - (ULONG)sel_isEqual, - (ULONG)objc_allocateClassPair, - (ULONG)objc_registerClassPair, - (ULONG)objc_getClassList, - (ULONG)objc_copyClassList, - (ULONG)class_isMetaClass, - (ULONG)class_getName, - (ULONG)class_getSuperclass, - (ULONG)class_getInstanceSize, - (ULONG)class_respondsToSelector, - (ULONG)class_conformsToProtocol, - (ULONG)class_getMethodImplementation, - (ULONG)class_getMethodImplementation_stret, - (ULONG)class_getMethodTypeEncoding, - (ULONG)class_addMethod, - (ULONG)class_replaceMethod, - (ULONG)object_getClass, - (ULONG)object_setClass, - (ULONG)object_getClassName, - (ULONG)protocol_getName, - (ULONG)protocol_isEqual, - (ULONG)protocol_conformsToProtocol, - (ULONG)objc_exit, - (ULONG)objc_setUncaughtExceptionHandler, - (ULONG)objc_setForwardHandler, - (ULONG)objc_setEnumerationMutationHandler, - (ULONG)objc_zero_weak_references, - -1, - FUNCARRAY_END -}; - -static struct Library *lib_init(struct ObjFWRTBase *base, BPTR seg_list, - struct ExecBase *exec_base); - -static struct { - LONG struct_size; - ULONG *func_table; - void *data_table; - struct Library *(*init_func)(struct ObjFWRTBase *base, BPTR seg_list, - struct ExecBase *exec_base); -} init_table = { - .struct_size = sizeof(struct ObjFWRTBase), - func_table, - NULL, - lib_init -}; - -static struct Resident resident = { - .rt_MatchWord = RTC_MATCHWORD, - .rt_MatchTag = &resident, - .rt_EndSkip = &resident + 1, - .rt_Flags = RTF_AUTOINIT | RTF_PPC, - .rt_Version = OBJFW_RT_LIB_MAJOR * 10 + OBJFW_RT_LIB_MINOR, - .rt_Type = NT_LIBRARY, - .rt_Pri = 0, - .rt_Name = (char *)"objfw-rt.library", - .rt_IdString = (char *)"ObjFW-RT " PACKAGE_VERSION - " \xA9 2008-2017 Jonathan Schleifer", - .rt_Init = &init_table -}; - -/* Magic required to make this a MorphOS binary */ -const ULONG __abox__ = 1; - -/* Global variables needed by libnix */ -int ThisRequiresConstructorHandling; -struct ExecBase *SysBase; -void *libnix_mempool; - -/* Functions passed in from the glue linklib */ -static void OF_NO_RETURN_FUNC (*exit_fn)(int status); - -void OF_NO_RETURN_FUNC -exit(int status) -{ - exit_fn(status); -} - -void -objc_set_exit(void OF_NO_RETURN_FUNC (*exit_fn_)(int status)) -{ - exit_fn = exit_fn_; -} - -/* Standard library functions */ -static struct Library *lib_init(struct ObjFWRTBase *base, BPTR seg_list, - struct ExecBase *exec_base) -{ - SysBase = exec_base; - - base->seg_list = seg_list; - - return &base->library; -} - -static struct Library * -lib_open(void) -{ - struct ObjFWRTBase *base = (struct ObjFWRTBase *)REG_A6; - - base->library.lib_OpenCnt++; - base->library.lib_Flags &= ~LIBF_DELEXP; - - return &base->library; -} - -static BPTR -expunge(struct ObjFWRTBase *base) -{ - /* Still in use - set delayed expunge flag and refuse to expunge */ - if (base->library.lib_OpenCnt > 0) { - base->library.lib_Flags |= LIBF_DELEXP; - return 0; - } - - Remove(&base->library.lib_Node); - FreeMem((char *)base - base->library.lib_NegSize, - base->library.lib_NegSize + base->library.lib_PosSize); - - return base->seg_list; -} - -static BPTR -lib_close(void) -{ - struct ObjFWRTBase *base = (struct ObjFWRTBase *)REG_A6; - - /* Not used anymore and delayed expunge flag set -> expunge */ - if (--base->library.lib_OpenCnt == 0 && - (base->library.lib_Flags & LIBF_DELEXP)) - return expunge(base); - - return 0; -} - -static BPTR -lib_expunge(void) -{ - return expunge((struct ObjFWRTBase *)REG_A6); -} - -static void -lib_null(void) -{ -} Index: src/socket.h ================================================================== --- src/socket.h +++ src/socket.h @@ -111,13 +111,13 @@ extern "C" { #endif extern bool of_socket_init(void); extern int of_socket_errno(void); # ifndef OF_WII -extern int of_getsockname(of_socket_t socket, struct sockaddr *restrict address, - socklen_t *restrict address_len); +extern int of_getsockname(of_socket_t sock, struct sockaddr *restrict addr, + socklen_t *restrict addrLen); # endif #ifdef __cplusplus } #endif OF_ASSUME_NONNULL_END Index: src/socket.m ================================================================== --- src/socket.m +++ src/socket.m @@ -191,26 +191,26 @@ #endif } #ifndef OF_WII int -of_getsockname(of_socket_t socket, struct sockaddr *restrict address, - socklen_t *restrict address_len) +of_getsockname(of_socket_t sock, struct sockaddr *restrict addr, + socklen_t *restrict addrLen) { int ret; # ifdef OF_HAVE_THREADS if (!of_mutex_lock(&mutex)) @throw [OFLockFailedException exception]; # endif - ret = getsockname(socket, address, address_len); + ret = getsockname(sock, addr, addrLen); # ifdef OF_HAVE_THREADS if (!of_mutex_unlock(&mutex)) @throw [OFUnlockFailedException exception]; # endif return ret; } #endif Index: src/threading.h ================================================================== --- src/threading.h +++ src/threading.h @@ -98,11 +98,11 @@ #endif extern bool of_thread_attr_init(of_thread_attr_t *attr); extern bool of_thread_new(of_thread_t *thread, void (*function)(id), id object, const of_thread_attr_t *attr); -extern void of_thread_set_name(of_thread_t thread, const char *name); +extern void of_thread_set_name(const char *name); extern bool of_thread_join(of_thread_t thread); extern bool of_thread_detach(of_thread_t thread); extern void OF_NO_RETURN_FUNC of_thread_exit(void); extern void of_once(of_once_t *control, void (*func)(void)); extern bool of_tlskey_new(of_tlskey_t *key); Index: src/threading_pthread.m ================================================================== --- src/threading_pthread.m +++ src/threading_pthread.m @@ -173,14 +173,14 @@ OF_UNREACHABLE } void -of_thread_set_name(of_thread_t thread, const char *name) +of_thread_set_name(const char *name) { #if defined(OF_HAIKU) - rename_thread(get_pthread_thread_id(thread), name); + 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); Index: src/threading_winapi.m ================================================================== --- src/threading_winapi.m +++ src/threading_winapi.m @@ -84,11 +84,11 @@ OF_UNREACHABLE } void -of_thread_set_name(of_thread_t thread, const char *name) +of_thread_set_name(const char *name) { } bool of_tlskey_new(of_tlskey_t *key) Index: tests/OFArrayTests.m ================================================================== --- tests/OFArrayTests.m +++ tests/OFArrayTests.m @@ -98,13 +98,13 @@ [_array release]; [super dealloc]; } -- (id)objectAtIndex: (size_t)index +- (id)objectAtIndex: (size_t)idx { - return [_array objectAtIndex: index]; + return [_array objectAtIndex: idx]; } - (size_t)count { return [_array count]; @@ -117,26 +117,26 @@ if (self == [SimpleMutableArray class]) [self inheritMethodsFromClass: [SimpleArray class]]; } - (void)insertObject: (id)object - atIndex: (size_t)index + atIndex: (size_t)idx { [_array insertObject: object - atIndex: index]; + atIndex: idx]; } -- (void)replaceObjectAtIndex: (size_t)index +- (void)replaceObjectAtIndex: (size_t)idx withObject: (id)object { - [_array replaceObjectAtIndex: index + [_array replaceObjectAtIndex: idx withObject: object]; } -- (void)removeObjectAtIndex: (size_t)index +- (void)removeObjectAtIndex: (size_t)idx { - [_array removeObjectAtIndex: index]; + [_array removeObjectAtIndex: idx]; } @end @implementation TestsAppDelegate (OFArrayTests) - (void)arrayTestsWithClass: (Class)arrayClass @@ -351,50 +351,50 @@ [m[0] removeLastObject]; #ifdef OF_HAVE_BLOCKS { - __block bool ok = true; + __block bool blockOk = true; __block size_t count = 0; OFArray *cmp = a[0]; OFMutableArray *a2; m[0] = [[a[0] mutableCopy] autorelease]; [m[0] enumerateObjectsUsingBlock: - ^ (id obj, size_t idx, bool *stop) { + ^ (id object, size_t idx, bool *stop) { count++; - if (![obj isEqual: [cmp objectAtIndex: idx]]) - ok = false; + if (![object isEqual: [cmp objectAtIndex: idx]]) + blockOk = false; }]; if (count != [cmp count]) - ok = false; + blockOk = false; - TEST(@"Enumeration using blocks", ok) + TEST(@"Enumeration using blocks", blockOk) - ok = false; + blockOk = false; a2 = m[0]; @try { [a2 enumerateObjectsUsingBlock: - ^ (id obj, size_t idx, bool *stop) { + ^ (id object, size_t idx, bool *stop) { [a2 removeObjectAtIndex: idx]; }]; } @catch (OFEnumerationMutationException *e) { - ok = true; + blockOk = true; } @catch (OFOutOfRangeException *e) { /* * Out of bounds access due to enumeration not being * detected. */ } TEST(@"Detection of mutation during enumeration using blocks", - ok) + blockOk) } TEST(@"-[replaceObjectsUsingBlock:]", - R([m[0] replaceObjectsUsingBlock: ^ id (id obj, size_t idx) { + R([m[0] replaceObjectsUsingBlock: ^ id (id object, size_t idx) { switch (idx) { case 0: return @"foo"; case 1: return @"bar"; @@ -402,11 +402,11 @@ return nil; }]) && [[m[0] description] isEqual: @"(\n\tfoo,\n\tbar\n)"]) TEST(@"-[mappedArrayUsingBlock:]", - [[[m[0] mappedArrayUsingBlock: ^ id (id obj, size_t idx) { + [[[m[0] mappedArrayUsingBlock: ^ id (id object, size_t idx) { switch (idx) { case 0: return @"foobar"; case 1: return @"qux"; @@ -414,12 +414,12 @@ return nil; }] description] isEqual: @"(\n\tfoobar,\n\tqux\n)"]) TEST(@"-[filteredArrayUsingBlock:]", - [[[m[0] filteredArrayUsingBlock: ^ bool (id obj, size_t idx) { - return [obj isEqual: @"foo"]; + [[[m[0] filteredArrayUsingBlock: ^ bool (id object, size_t idx) { + return [object isEqual: @"foo"]; }] description] isEqual: @"(\n\tfoo\n)"]) TEST(@"-[foldUsingBlock:]", [[arrayClass arrayWithObjects: [OFMutableString string], @"foo", @"bar", @"baz", nil] foldUsingBlock: ^ id (id left, id right) { Index: tests/OFBlockTests.m ================================================================== --- tests/OFBlockTests.m +++ tests/OFBlockTests.m @@ -69,13 +69,19 @@ TEST(@"Class of stack block", (Class)&_NSConcreteStackBlock == objc_getClass("OFStackBlock") && [s isKindOfClass: [OFBlock class]]) +#if !defined(OF_WINDOWS) || !defined(__clang__) + /* + * Causes a linker error on Windows with Clang when compiling as a + * static library. This is a bug in Clang. + */ TEST(@"Class of global block", (Class)&_NSConcreteGlobalBlock == objc_getClass("OFGlobalBlock") && [g isKindOfClass: [OFBlock class]]) +#endif TEST(@"Class of a malloc block", (Class)&_NSConcreteMallocBlock == objc_getClass("OFMallocBlock")) TEST(@"Copying a stack block", Index: tests/OFDictionaryTests.m ================================================================== --- tests/OFDictionaryTests.m +++ tests/OFDictionaryTests.m @@ -80,19 +80,19 @@ return self; } - initWithObjects: (const id *)objects - forKeys: (const id *)keys + forKeys: (const id *)keys_ count: (size_t)count { self = [super init]; @try { _dictionary = [[OFMutableDictionary alloc] initWithObjects: objects - forKeys: keys + forKeys: keys_ count: count]; } @catch (id e) { [self release]; @throw e; } @@ -266,47 +266,47 @@ @"q&x", @"q=x", nil] stringByURLEncoding] isEqual: @"q%26x=q%3Dx&foo=bar"]) #ifdef OF_HAVE_BLOCKS { - __block size_t i = 0; - __block bool ok = true; + __block size_t j = 0; + __block bool blockOk = true; [mutDict enumerateKeysAndObjectsUsingBlock: - ^ (id key, id obj, bool *stop) { - if (i > 1 || ![key isEqual: keys[i]]) { - ok = false; + ^ (id key, id object, bool *stop) { + if (j > 1 || ![key isEqual: keys[j]]) { + blockOk = false; *stop = true; return; } [mutDict setObject: [mutDict objectForKey: key] forKey: key]; - i++; + j++; }]; - TEST(@"Enumeration using blocks", ok) + TEST(@"Enumeration using blocks", blockOk) - ok = false; + blockOk = false; @try { [mutDict enumerateKeysAndObjectsUsingBlock: - ^ (id key, id obj, bool *stop) { + ^ (id key, id object, bool *stop) { [mutDict setObject: @"" forKey: @""]; }]; } @catch (OFEnumerationMutationException *e) { - ok = true; + blockOk = true; } TEST(@"Detection of mutation during enumeration using blocks", - ok) + blockOk) [mutDict removeObjectForKey: @""]; } TEST(@"-[replaceObjectsUsingBlock:]", - R([mutDict replaceObjectsUsingBlock: ^ id (id key, id obj) { + R([mutDict replaceObjectsUsingBlock: ^ id (id key, id object) { if ([key isEqual: keys[0]]) return @"value_1"; if ([key isEqual: keys[1]]) return @"value_2"; @@ -313,21 +313,22 @@ return nil; }]) && [[mutDict objectForKey: keys[0]] isEqual: @"value_1"] && [[mutDict objectForKey: keys[1]] isEqual: @"value_2"]) TEST(@"-[mappedDictionaryUsingBlock:]", - [[[mutDict mappedDictionaryUsingBlock: ^ id (id key, id obj) { + [[[mutDict mappedDictionaryUsingBlock: ^ id (id key, id object) { if ([key isEqual: keys[0]]) return @"val1"; if ([key isEqual: keys[1]]) return @"val2"; return nil; }] description] isEqual: @"{\n\tkey1 = val1;\n\tkey2 = val2;\n}"]) TEST(@"-[filteredDictionaryUsingBlock:]", - [[[mutDict filteredDictionaryUsingBlock: ^ bool (id key, id obj) { + [[[mutDict filteredDictionaryUsingBlock: + ^ bool (id key, id object) { return [key isEqual: keys[0]]; }] description] isEqual: @"{\n\tkey1 = value_1;\n}"]) #endif TEST(@"-[count]", [mutDict count] == 2) Index: tests/OFKernelEventObserverTests.m ================================================================== --- tests/OFKernelEventObserverTests.m +++ tests/OFKernelEventObserverTests.m @@ -20,21 +20,21 @@ #import "OFString.h" #import "OFDate.h" #import "OFTCPSocket.h" #import "OFAutoreleasePool.h" -#if defined(HAVE_SYS_SELECT_H) || defined(OF_WINDOWS) -# import "OFKernelEventObserver_select.h" -#endif -#if defined(HAVE_POLL_H) || defined(OF_WII) -# import "OFKernelEventObserver_poll.h" +#ifdef HAVE_KQUEUE +# import "OFKernelEventObserver_kqueue.h" #endif #ifdef HAVE_EPOLL # import "OFKernelEventObserver_epoll.h" #endif -#ifdef HAVE_KQUEUE -# import "OFKernelEventObserver_kqueue.h" +#ifdef HAVE_POLL +# import "OFKernelEventObserver_poll.h" +#endif +#ifdef HAVE_SELECT +# import "OFKernelEventObserver_select.h" #endif #import "TestsAppDelegate.h" #define EXPECTED_EVENTS 3 @@ -201,37 +201,37 @@ @end @implementation TestsAppDelegate (OFKernelEventObserverTests) - (void)kernelEventObserverTestsWithClass: (Class)class { + OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; ObserverTest *test; module = [class className]; test = [[[ObserverTest alloc] initWithTestsAppDelegate: self] autorelease]; - TEST(@"+[observer]", - (test->_observer = [OFKernelEventObserver observer])) + TEST(@"+[observer]", (test->_observer = [class observer])) [test->_observer setDelegate: test]; TEST(@"-[addObjectForReading:]", R([test->_observer addObjectForReading: test->_server])) [test run]; _fails += test->_fails; + + [pool drain]; } - (void)kernelEventObserverTests { - OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; - -#if defined(HAVE_SYS_SELECT_H) || defined(OF_WINDOWS) +#ifdef HAVE_SELECT [self kernelEventObserverTestsWithClass: [OFKernelEventObserver_select class]]; #endif -#if defined(HAVE_POLL_H) || defined(OF_WII) +#ifdef HAVE_POLL [self kernelEventObserverTestsWithClass: [OFKernelEventObserver_poll class]]; #endif #ifdef HAVE_EPOLL @@ -241,9 +241,7 @@ #ifdef HAVE_KQUEUE [self kernelEventObserverTestsWithClass: [OFKernelEventObserver_kqueue class]]; #endif - - [pool drain]; } @end Index: tests/OFListTests.m ================================================================== --- tests/OFListTests.m +++ tests/OFListTests.m @@ -125,12 +125,12 @@ loe = [list firstListObject]; i = 0; ok = true; - for (OFString *obj in list) { - if (![obj isEqual: loe->object]) + for (OFString *object in list) { + if (![object isEqual: loe->object]) ok = false; loe = loe->next; i++; } @@ -140,12 +140,12 @@ TEST(@"Fast Enumeration", ok) ok = false; @try { - for (OFString *obj in list) { - (void)obj; + for (OFString *object in list) { + (void)object; [list removeListObject: [list lastListObject]]; } } @catch (OFEnumerationMutationException *e) { ok = true; Index: tests/OFObjectTests.m ================================================================== --- tests/OFObjectTests.m +++ tests/OFObjectTests.m @@ -253,11 +253,11 @@ [m unsignedLongLongValue] == 100 && [m floatValue] == 110 && [m doubleValue] == 120) EXPECT_EXCEPTION(@"Catch -[setValue:forKey:] with nil key for scalar", - OFInvalidArgumentException, [m setValue: nil + OFInvalidArgumentException, [m setValue: (id _Nonnull)nil forKey: @"intValue"]) [pool drain]; } @end Index: tests/OFStringTests.m ================================================================== --- tests/OFStringTests.m +++ tests/OFStringTests.m @@ -172,13 +172,13 @@ [_string release]; [super dealloc]; } -- (of_unichar_t)characterAtIndex: (size_t)index +- (of_unichar_t)characterAtIndex: (size_t)idx { - return [_string characterAtIndex: index]; + return [_string characterAtIndex: idx]; } - (size_t)length { return [_string length]; Index: tests/OFXMLParserTests.m ================================================================== --- tests/OFXMLParserTests.m +++ tests/OFXMLParserTests.m @@ -28,11 +28,10 @@ #import "OFMalformedXMLException.h" #import "TestsAppDelegate.h" static OFString *module = @"OFXMLParser"; -static OFXMLParser *parser; static int i = 0; enum event_type { PROCESSING_INSTRUCTIONS, TAG_START, @@ -41,68 +40,69 @@ CDATA, COMMENT }; @implementation TestsAppDelegate (OFXMLParser) -- (void)parserCallbackWithEventType: (enum event_type)et - name: (OFString *)name - prefix: (OFString *)prefix - namespace: (OFString *)ns - attributes: (OFArray *)attrs - string: (OFString *)string +- (void)parser: (OFXMLParser *)parser + didCreateEvent: (enum event_type)type + name: (OFString *)name + prefix: (OFString *)prefix + namespace: (OFString *)ns + attributes: (OFArray *)attrs + string: (OFString *)string { OFString *msg; i++; msg = [OFString stringWithFormat: @"Parsing part #%d", i]; switch (i) { case 1: - TEST(msg, et == PROCESSING_INSTRUCTIONS && + TEST(msg, type == PROCESSING_INSTRUCTIONS && [string isEqual: @"xml version='1.0'"]) break; case 2: - TEST(msg, et == PROCESSING_INSTRUCTIONS && + TEST(msg, type == PROCESSING_INSTRUCTIONS && [string isEqual: @"p?i"]) break; case 3: - TEST(msg, et == TAG_START && [name isEqual: @"root"] && + TEST(msg, type == TAG_START && [name isEqual: @"root"] && prefix == nil && ns == nil && [attrs count] == 0) break; case 4: - TEST(msg, et == STRING && [string isEqual: @"\n\n "]) + TEST(msg, type == STRING && [string isEqual: @"\n\n "]) break; case 5: - TEST(msg, et == CDATA && [string isEqual: @"f<]]]oo]"] && + TEST(msg, type == CDATA && [string isEqual: @"f<]]]oo]"] && [parser lineNumber] == 3) break; case 6: - TEST(msg, et == TAG_START && [name isEqual: @"bar"] && + TEST(msg, type == TAG_START && [name isEqual: @"bar"] && prefix == nil && ns == nil && attrs == nil) break; case 7: - TEST(msg, et == TAG_END && [name isEqual: @"bar"] && + TEST(msg, type == TAG_END && [name isEqual: @"bar"] && prefix == nil && ns == nil && attrs == nil) break; case 8: - TEST(msg, et == STRING && [string isEqual: @"\n "]) + TEST(msg, type == STRING && [string isEqual: @"\n "]) break; case 9: - TEST(msg, et == TAG_START && [name isEqual: @"foobar"] && + TEST(msg, type == TAG_START && [name isEqual: @"foobar"] && prefix == nil && [ns isEqual: @"urn:objfw:test:foobar"] && [attrs count] == 1 && /* xmlns attr */ [[[attrs objectAtIndex: 0] name] isEqual: @"xmlns"] && [[attrs objectAtIndex: 0] namespace] == nil && [[[attrs objectAtIndex: 0] stringValue] isEqual: @"urn:objfw:test:foobar"]) break; case 10: - TEST(msg, et == STRING && [string isEqual: @"\n "]) + TEST(msg, type == STRING && [string isEqual: @"\n "]) break; case 11: - TEST(msg, et == TAG_START && [name isEqual: @"qux"] && + TEST(msg, type == TAG_START && [name isEqual: @"qux"] && prefix == nil && [ns isEqual: @"urn:objfw:test:foobar"] && [attrs count] == 1 && /* xmlns:foo attr */ [[[attrs objectAtIndex: 0] name] isEqual: @"foo"] && [[[attrs objectAtIndex: 0] namespace] isEqual: @@ -109,14 +109,14 @@ @"http://www.w3.org/2000/xmlns/"] && [[[attrs objectAtIndex: 0] stringValue] isEqual: @"urn:objfw:test:foo"]) break; case 12: - TEST(msg, et == STRING && [string isEqual: @"\n "]) + TEST(msg, type == STRING && [string isEqual: @"\n "]) break; case 13: - TEST(msg, et == TAG_START && [name isEqual: @"bla"] && + TEST(msg, type == TAG_START && [name isEqual: @"bla"] && [prefix isEqual: @"foo"] && [ns isEqual: @"urn:objfw:test:foo"] && [attrs count] == 2 && /* foo:bla attr */ [[[attrs objectAtIndex: 0] name] isEqual: @"bla"] && @@ -127,14 +127,14 @@ [[[attrs objectAtIndex: 1] name] isEqual: @"blafoo"] && [[attrs objectAtIndex: 1] namespace] == nil && [[[attrs objectAtIndex: 1] stringValue] isEqual: @"foo"]) break; case 14: - TEST(msg, et == STRING && [string isEqual: @"\n "]) + TEST(msg, type == STRING && [string isEqual: @"\n "]) break; case 15: - TEST(msg, et == TAG_START && [name isEqual: @"blup"] && + TEST(msg, type == TAG_START && [name isEqual: @"blup"] && prefix == nil && [ns isEqual: @"urn:objfw:test:foobar"] && [attrs count] == 2 && /* foo:qux attr */ [[[attrs objectAtIndex: 0] name] isEqual: @"qux"] && [[[attrs objectAtIndex: 0] namespace] isEqual: @@ -144,18 +144,18 @@ [[[attrs objectAtIndex: 1] name] isEqual: @"quxqux"] && [[attrs objectAtIndex: 1] namespace] == nil && [[[attrs objectAtIndex: 1] stringValue] isEqual: @"test"]) break; case 16: - TEST(msg, et == TAG_END && [name isEqual: @"blup"] && + TEST(msg, type == TAG_END && [name isEqual: @"blup"] && prefix == nil && [ns isEqual: @"urn:objfw:test:foobar"]) break; case 17: - TEST(msg, et == STRING && [string isEqual: @"\n "]) + TEST(msg, type == STRING && [string isEqual: @"\n "]) break; case 18: - TEST(msg, et == TAG_START && [name isEqual: @"bla"] && + TEST(msg, type == TAG_START && [name isEqual: @"bla"] && [prefix isEqual: @"bla"] && [ns isEqual: @"urn:objfw:test:bla"] && [attrs count] == 3 && /* xmlns:bla attr */ [[[attrs objectAtIndex: 0] name] isEqual: @"bla"] && [[[attrs objectAtIndex: 0] namespace] isEqual: @@ -171,19 +171,19 @@ [[[attrs objectAtIndex: 2] namespace] isEqual: @"urn:objfw:test:bla"] && [[[attrs objectAtIndex: 2] stringValue] isEqual: @"blafoo"]) break; case 19: - TEST(msg, et == TAG_END && [name isEqual: @"bla"] && + TEST(msg, type == TAG_END && [name isEqual: @"bla"] && [prefix isEqual: @"bla"] && [ns isEqual: @"urn:objfw:test:bla"]) break; case 20: - TEST(msg, et == STRING && [string isEqual: @"\n "]) + TEST(msg, type == STRING && [string isEqual: @"\n "]) break; case 21: - TEST(msg, et == TAG_START && [name isEqual: @"abc"] && + TEST(msg, type == TAG_START && [name isEqual: @"abc"] && prefix == nil && [ns isEqual: @"urn:objfw:test:abc"] && [attrs count] == 3 && /* xmlns attr */ [[[attrs objectAtIndex: 0] name] isEqual: @"xmlns"] && [[attrs objectAtIndex: 0] namespace] == nil && @@ -198,120 +198,126 @@ [[[attrs objectAtIndex: 2] namespace] isEqual: @"urn:objfw:test:foo"] && [[[attrs objectAtIndex: 2] stringValue] isEqual: @"abc"]) break; case 22: - TEST(msg, et == TAG_END && [name isEqual: @"abc"] && + TEST(msg, type == TAG_END && [name isEqual: @"abc"] && prefix == nil && [ns isEqual: @"urn:objfw:test:abc"]) break; case 23: - TEST(msg, et == STRING && [string isEqual: @"\n "]) + TEST(msg, type == STRING && [string isEqual: @"\n "]) break; case 24: - TEST(msg, et == TAG_END && [name isEqual: @"bla"] && + TEST(msg, type == TAG_END && [name isEqual: @"bla"] && [prefix isEqual: @"foo"] && [ns isEqual: @"urn:objfw:test:foo"]) break; case 25: - TEST(msg, et == STRING && [string isEqual: @"\n "]) + TEST(msg, type == STRING && [string isEqual: @"\n "]) break; case 26: - TEST(msg, et == COMMENT && [string isEqual: @" commänt "]) + TEST(msg, type == COMMENT && [string isEqual: @" commänt "]) break; case 27: - TEST(msg, et == STRING && [string isEqual: @"\n "]) + TEST(msg, type == STRING && [string isEqual: @"\n "]) break; case 28: - TEST(msg, et == TAG_END && [name isEqual: @"qux"] && + TEST(msg, type == TAG_END && [name isEqual: @"qux"] && prefix == nil && [ns isEqual: @"urn:objfw:test:foobar"]) break; case 29: - TEST(msg, et == STRING && [string isEqual: @"\n "]) + TEST(msg, type == STRING && [string isEqual: @"\n "]) break; case 30: - TEST(msg, et == TAG_END && [name isEqual: @"foobar"] && + TEST(msg, type == TAG_END && [name isEqual: @"foobar"] && prefix == nil && [ns isEqual: @"urn:objfw:test:foobar"]) break; case 31: - TEST(msg, et == STRING && [string isEqual: @"\n"]) + TEST(msg, type == STRING && [string isEqual: @"\n"]) break; case 32: - TEST(msg, et == TAG_END && [name isEqual: @"root"] && + TEST(msg, type == TAG_END && [name isEqual: @"root"] && prefix == nil && ns == nil); break; } } - (void)parser: (OFXMLParser *)parser foundProcessingInstructions: (OFString *)pi { - [self parserCallbackWithEventType: PROCESSING_INSTRUCTIONS - name: nil - prefix: nil - namespace: nil - attributes: nil - string: pi]; + [self parser: parser + didCreateEvent: PROCESSING_INSTRUCTIONS + name: nil + prefix: nil + namespace: nil + attributes: nil + string: pi]; } - (void)parser: (OFXMLParser *)parser didStartElement: (OFString *)name prefix: (OFString *)prefix namespace: (OFString *)ns attributes: (OFArray *)attrs { - [self parserCallbackWithEventType: TAG_START - name: name - prefix: prefix - namespace: ns - attributes: attrs - string: nil]; + [self parser: parser + didCreateEvent: TAG_START + name: name + prefix: prefix + namespace: ns + attributes: attrs + string: nil]; } - (void)parser: (OFXMLParser *)parser didEndElement: (OFString *)name prefix: (OFString *)prefix namespace: (OFString *)ns { - [self parserCallbackWithEventType: TAG_END - name: name - prefix: prefix - namespace: ns - attributes: nil - string: nil]; + [self parser: parser + didCreateEvent: TAG_END + name: name + prefix: prefix + namespace: ns + attributes: nil + string: nil]; } - (void)parser: (OFXMLParser *)parser foundCharacters: (OFString *)string { - [self parserCallbackWithEventType: STRING - name: nil - prefix: nil - namespace: nil - attributes: nil - string: string]; + [self parser: parser + didCreateEvent: STRING + name: nil + prefix: nil + namespace: nil + attributes: nil + string: string]; } - (void)parser: (OFXMLParser *)parser foundCDATA: (OFString *)cdata { - [self parserCallbackWithEventType: CDATA - name: nil - prefix: nil - namespace: nil - attributes: nil - string: cdata]; + [self parser: parser + didCreateEvent: CDATA + name: nil + prefix: nil + namespace: nil + attributes: nil + string: cdata]; } - (void)parser: (OFXMLParser *)parser foundComment: (OFString *)comment { - [self parserCallbackWithEventType: COMMENT - name: nil - prefix: nil - namespace: nil - attributes: nil - string: comment]; + [self parser: parser + didCreateEvent: COMMENT + name: nil + prefix: nil + namespace: nil + attributes: nil + string: comment]; } - (OFString *)parser: (OFXMLParser *)parser foundUnknownEntityNamed: (OFString *)entity { @@ -337,10 +343,11 @@ " \n" " \n" " \n" " \n" ""; + OFXMLParser *parser; size_t j, len; TEST(@"+[parser]", (parser = [OFXMLParser parser])) TEST(@"-[setDelegate:]", R([parser setDelegate: self])) Index: utils/ofhttp/OFHTTP.m ================================================================== --- utils/ofhttp/OFHTTP.m +++ utils/ofhttp/OFHTTP.m @@ -374,16 +374,16 @@ [self performSelector: @selector(downloadNextURL) afterDelay: 0]; } - (void)client: (OFHTTPClient *)client - didCreateSocket: (OF_KINDOF(OFTCPSocket *))socket + didCreateSocket: (OF_KINDOF(OFTCPSocket *))sock request: (OFHTTPRequest *)request { - if (_insecure && [socket respondsToSelector: + if (_insecure && [sock respondsToSelector: @selector(setCertificateVerificationEnabled:)]) - [socket setCertificateVerificationEnabled: false]; + [sock setCertificateVerificationEnabled: false]; } - (bool)client: (OFHTTPClient *)client shouldFollowRedirect: (OFURL *)URL statusCode: (int)statusCode @@ -832,14 +832,15 @@ OF_LOCALIZED(@"size_unknown", @"unknown"); if (_verbose) { void *pool = objc_autoreleasePoolPush(); OFDictionary OF_GENERIC(OFString *, OFString *) - *headers = [response headers]; - OFEnumerator *keyEnumerator = [headers keyEnumerator]; + *responseHeaders = [response headers]; + OFEnumerator *keyEnumerator = + [responseHeaders keyEnumerator]; OFEnumerator *objectEnumerator = - [headers objectEnumerator]; + [responseHeaders objectEnumerator]; OFString *key, *object; [of_stdout writeString: @" "]; [of_stdout writeLine: OF_LOCALIZED( @"info_name_unaligned", Index: utils/ofhttp/ProgressBar.m ================================================================== --- utils/ofhttp/ProgressBar.m +++ utils/ofhttp/ProgressBar.m @@ -103,25 +103,25 @@ [of_stdout writeString: @"\r ▕"]; for (size_t i = 0; i < (size_t)bars; i++) [of_stdout writeString: @"█"]; if (bars < barWidth) { - float remainder = bars - floorf(bars); + float rem = bars - floorf(bars); - if (remainder >= 0.875) + if (rem >= 0.875) [of_stdout writeString: @"▉"]; - else if (remainder >= 0.75) + else if (rem >= 0.75) [of_stdout writeString: @"▊"]; - else if (remainder >= 0.625) + else if (rem >= 0.625) [of_stdout writeString: @"▋"]; - else if (remainder >= 0.5) + else if (rem >= 0.5) [of_stdout writeString: @"▌"]; - else if (remainder >= 0.375) + else if (rem >= 0.375) [of_stdout writeString: @"▍"]; - else if (remainder >= 0.25) + else if (rem >= 0.25) [of_stdout writeString: @"▎"]; - else if (remainder >= 0.125) + else if (rem >= 0.125) [of_stdout writeString: @"▏"]; else [of_stdout writeString: @" "]; for (size_t i = 0; i < barWidth - (size_t)bars - 1; i++)