Index: Doxyfile ================================================================== --- Doxyfile +++ Doxyfile @@ -1,14 +1,15 @@ PROJECT_NAME = "ObjFW" OUTPUT_DIRECTORY = docs/ -INPUT = src src/exceptions +INPUT = src src/exceptions src/runtime FILE_PATTERNS = *.h *.m HTML_OUTPUT = . GENERATE_LATEX = NO HIDE_UNDOC_CLASSES = YES HIDE_UNDOC_MEMBERS = YES -PREDEFINED = DOXYGEN \ +PREDEFINED = __OBJC__ \ + DOXYGEN \ OF_BOXABLE \ OF_CONSUMED \ OF_DESIGNATED_INITIALIZER \ OF_GENERIC(...)= \ OF_HAVE_BLOCKS \ Index: README.md ================================================================== --- README.md +++ README.md @@ -5,51 +5,48 @@ want to be portable. See https://objfw.nil.im/ for more information. -Table of Contents -================= +

Table of Contents

* [Installation](#installation) * [macOS and iOS](#macos-and-ios) - * [Building as a framework](#building-as-a-framework) - * [Using the macOS or iOS framework in Xcode](#using-the-macos-or-ios-framework-in-xcode) + * [Building as a framework](#building-framework) + * [Using the macOS or iOS framework in Xcode](#framework-in-xcode) * [Broken Xcode versions](#broken-xcode-versions) * [Windows](#windows) * [Getting MSYS2](#getting-msys2) * [Updating MSYS2](#updating-msys2) - * [Installing MinGW-w64 using MSYS2](#installing-mingw-w64-using-msys2) - * [Getting, building and installing ObjFW](#getting-building-and-installing-objfw) - * [Nintendo DS, Nintendo 3DS and Wii](#nintendo-ds-nintendo-3ds-and-wii) + * [Installing MinGW-w64 using MSYS2](#installing-mingw-w64) + * [Getting, building and installing ObjFW](#steps-windows) + * [Nintendo DS, Nintendo 3DS and Wii](#nintendo) * [Nintendo DS](#nintendo-ds) * [Nintendo 3DS](#nintendo-3ds) * [Wii](#wii) * [Amiga](#amiga) - * [Writing your first application with ObjFW](#writing-your-first-application-with-objfw) - * [Bugs and feature requests](#bugs-and-feature-requests) + * [Writing your first application with ObjFW](#first-app) + * [Bugs and feature requests](#bugs) * [Commercial use](#commercial-use) -Installation -============ +

Installation

To install ObjFW, just run the following commands: $ ./configure $ make $ make install - In case you checked out ObjFW from the Git repository, you need to run the - following command first: + In case you checked out ObjFW from the Fossil or Git repository, you need to + run the following command first: $ ./autogen.sh -macOS and iOS -------------- +

macOS and iOS

-### Building as a framework +

Building as a framework

When building for macOS or iOS, everything is built as a `.framework` by default if `--disable-shared` has not been specified to `configure`. To build for iOS, use something like this: @@ -66,18 +63,18 @@ $ export OBJC="$clang -arch i386 -arch x86_64" $ export OBJCPP="$clang -arch i386 -E" $ export IPHONEOS_DEPLOYMENT_TARGET="9.0" $ ./configure --prefix=/usr/local/iossim --host=i386-apple-darwin -### Using the macOS or iOS framework in Xcode +

Using the macOS or iOS framework in Xcode

To use the macOS framework in Xcode, you need to add the `.framework`s to your project and add the following flags to `Other C Flags`: -fconstant-string-class=OFConstantString -fno-constant-cfstrings -### Broken Xcode versions +

Broken Xcode versions

Some versions of Xcode shipped with a version of Clang that ignores `-fconstant-string-class=OFConstantString`. This will manifest in an error like this: @@ -96,30 +93,30 @@ You can get older versions of Xcode [here](https://developer.apple.com/download) by clicking on "More" in the top-right corner. -Windows -------- +

Windows

Windows is only officially supported when following these instructions, as there are many MinGW versions that behave slightly differently and often cause problems. -### Getting MSYS2 +

Getting MSYS2

The first thing to install is [MSYS2](https://www.msys2.org) to provide a basic UNIX-like environment for Windows. Unfortunately, the binaries are not signed and there is no way to verify their integrity, so only download this from a trusted connection. Everything else you will download using MSYS2 later will be cryptographically signed. -### Updating MSYS2 +

Updating MSYS2

The first thing to do is updating MSYS2. It is important to update things in a certain order, as `pacman` (the package manager MSYS2 uses, which comes - from ArchLinux) does not know about a few things that are special on Windows. + from Arch Linux) does not know about a few things that are special on + Windows. First, update the mirror list: $ pacman -Sy pacman-mirrors @@ -134,11 +131,11 @@ Now you have a fully updated MSYS2. Whenever you want to update MSYS2, proceed in this order. Notice that the first `pacman` invocation includes `-y` to actually fetch a new list of packages. -### Installing MinGW-w64 using MSYS2 +

Installing MinGW-w64 using MSYS2

Now it's time to install MinGW-w64. If you want to build 32 bit binaries: $ pacman -S mingw-w64-i686-clang mingw-w64-i686-gcc-objc @@ -151,62 +148,61 @@ Shell`. So if you want to build for 32 or 64 bit, you just start the correct shell. Finally, install a few more things needed to build ObjFW: - $ pacman -S autoconf automake git make + $ pacman -S autoconf automake fossil make -### Getting, building and installing ObjFW +

Getting, building and installing ObjFW

Start the MinGW-w64 Win32 or Win64 Shell (depening on what version you want to build - do *not* use the MSYS2 Shell shortcut, but use the MinGW-w64 Win32 or Win64 Shell shortcut instead!) and check out ObjFW: - $ git clone https://git.nil.im/objfw.git + $ fossil clone https://objfw.nil.im objfw.fossil + $ mkdir objfw && cd objfw + $ fossil open ../objfw.fossil You can also download a release tarball if you want. Now go to the newly checked out repository and build and install it: $ ./autogen.sh && ./configure && make -j16 install If everything was successfully, you can now build projects using ObjFW for Windows using the normal `objfw-compile` and friends. -Nintendo DS, Nintendo 3DS and Wii ---------------------------------- +

Nintendo DS, Nintendo 3DS and Wii

Download and install [devkitPro](https://devkitpro.org/wiki/Getting_Started). -### Nintendo DS +

Nintendo DS

Follow the normal process, but instead of `./configure` run: $ ./configure --host=arm-none-eabi --with-nds -### Nintendo 3DS +

Nintendo 3DS

Follow the normal process, but instead of `./configure` run: $ ./configure --host=arm-none-eabi --with-3ds -### Wii +

Wii

Follow the normal process, but instead of `./configure` run: $ ./configure --host=powerpc-eabi --with-wii -Amiga ------ +

Amiga

Install [amiga-gcc](https://github.com/bebbo/amiga-gcc). Then follow the normal process, but instead of `./configure` run: $ ./configure --host=m68k-amigaos -Writing your first application with ObjFW -========================================= +

Writing your first application with ObjFW

To create your first, empty application, you can use `objfw-new`: $ objfw-new app MyFirstApp @@ -224,19 +220,17 @@ `objfw-compile` is a tool that allows building applications and libraries using ObjFW without needing a full-blown build system. If you want to use your own build system, you can get the necessary flags from `objfw-config`. -Bugs and feature requests -========================= +

Bugs and feature requests

If you find any bugs or have feature requests, feel free to send a mail to js@nil.im! -Commercial use -============== +

Commercial use

If for whatever reason neither the terms of the QPL nor those of the GPL work for you, a proprietary license for ObjFW including support is available upon request. Just write a mail to js@nil.im and we can find a reasonable solution for both parties. Index: src/OFSPXSocket.h ================================================================== --- src/OFSPXSocket.h +++ src/OFSPXSocket.h @@ -16,12 +16,10 @@ */ #import "OFSequencedPacketSocket.h" #import "OFRunLoop.h" -#import "socket.h" - OF_ASSUME_NONNULL_BEGIN /*! @file */ @class OFSPXSocket; Index: src/OFSPXStreamSocket.h ================================================================== --- src/OFSPXStreamSocket.h +++ src/OFSPXStreamSocket.h @@ -16,12 +16,10 @@ */ #import "OFStreamSocket.h" #import "OFRunLoop.h" -#import "socket.h" - OF_ASSUME_NONNULL_BEGIN /*! @file */ @class OFSPXStreamSocket; Index: src/OFTCPSocket.h ================================================================== --- src/OFTCPSocket.h +++ src/OFTCPSocket.h @@ -16,12 +16,10 @@ */ #import "OFStreamSocket.h" #import "OFRunLoop.h" -#import "socket.h" - OF_ASSUME_NONNULL_BEGIN /*! @file */ @class OFTCPSocket; Index: src/runtime/ObjFWRT.h ================================================================== --- src/runtime/ObjFWRT.h +++ src/runtime/ObjFWRT.h @@ -51,35 +51,125 @@ #if !__has_feature(objc_arc) && !defined(__unsafe_unretained) # define __unsafe_unretained #endif +/*! + * @brief A value representing no class. + */ #define Nil (Class _Null_unspecified)0 + +/*! + * @brief A value representing no object. + */ #define nil (id _Null_unspecified)0 + +/*! + * @brief An Objective-C boolean representing true. + * + * @note This is a legacy from before C had a boolean type. Prefer the standard + * C99 true instead! + */ #define YES true -#define NO false + +/*! + * @brief An Objective-C boolean representing false. + * + * @note This is a legacy from before C had a boolean type. Prefer the standard + * C99 false instead! + */ +#define NO false + +/*! @file */ +/*! + * @brief A pointer to a class. + */ typedef struct objc_class *Class; + +/*! + * @brief A pointer to any object. + */ typedef struct objc_object *id; + +/*! + * @brief A selector. + * + * A selector is the name of a method including the colons and an optional type + * encoding. + */ typedef const struct objc_selector *SEL; + +/*! + * @brief A method. + * + * A method consists of a selector with a type encoding and an implementation. + */ typedef const struct objc_method *Method; -#ifdef __OBJC__ + +/*! + * @brief A protocol. + */ +#if defined(__OBJC__) && !defined(DOXYGEN) @class Protocol; #else typedef const struct objc_protocol *Protocol; #endif + +/*! + * @brief An instance variable. + */ typedef const struct objc_ivar *Ivar; + +/*! + * @brief A property. + */ typedef const struct objc_property *objc_property_t; + #if !defined(__wii__) && !defined(__amigaos__) +/*! + * @brief An Objective-C boolean. Either @ref YES or @ref NO. + * + * @note This is a legacy from before C had a boolean type. Prefer the standard + * C99 bool instead! + */ typedef bool BOOL; #endif -typedef id _Nullable (*IMP)(id _Nonnull, SEL _Nonnull, ...); -typedef void (*objc_uncaught_exception_handler_t)(id _Nullable); -typedef void (*objc_enumeration_mutation_handler_t)(id _Nonnull); + +/*! + * @brief A method implemenation. + * + * @param object The messaged object + * @param selector The selector sent + */ +typedef id _Nullable (*IMP)(id _Nonnull object, SEL _Nonnull selector, ...); + +/*! + * @brief A handler for uncaught exceptions. + * + * @param exception The exception which was not caught. + */ +typedef void (*objc_uncaught_exception_handler_t)(id _Nullable exception); + +/*! + * @brief A handler for mutation during enumeration. + * + * @param object The object that was mutated during enumeration + */ +typedef void (*objc_enumeration_mutation_handler_t)(id _Nonnull object); +/*! + * @brief A struct representing a call to super. + */ struct objc_super { + /*! + * @brief The object on which to perform the super call. + */ id __unsafe_unretained _Nullable self; + /*! + * @brief The class from which to take the method. + */ #ifdef __cplusplus Class _Nonnull class_; #else Class _Nonnull class; #endif Index: tests/TestsAppDelegate.m ================================================================== --- tests/TestsAppDelegate.m +++ tests/TestsAppDelegate.m @@ -45,11 +45,14 @@ # include # undef asm #endif #ifdef OF_NINTENDO_3DS +/* Newer versions of libctru started using id as a parameter name. */ +# define id id_3ds # include <3ds.h> +# undef id #endif #ifdef OF_PSP static int exit_cb(int arg1, int arg2, void *arg)