summary refs log tree commit diff stats
path: root/examples
diff options
context:
space:
mode:
Diffstat (limited to 'examples')
-rw-r--r--examples/cross_calculator/android/AndroidManifest.xml18
-rw-r--r--examples/cross_calculator/android/build.xml92
-rw-r--r--examples/cross_calculator/android/custom_rules.xml17
-rw-r--r--examples/cross_calculator/android/jni/Android.mk32
-rw-r--r--examples/cross_calculator/android/jni/backend-jni.c42
-rw-r--r--examples/cross_calculator/android/project.properties14
-rw-r--r--examples/cross_calculator/android/readme.txt30
-rw-r--r--examples/cross_calculator/android/res/layout/cross_calculator.xml72
-rw-r--r--examples/cross_calculator/android/res/values/strings.xml4
-rwxr-xr-xexamples/cross_calculator/android/scripts/jnibuild.sh22
-rwxr-xr-xexamples/cross_calculator/android/scripts/nimbuild.sh34
-rwxr-xr-xexamples/cross_calculator/android/scripts/tags.sh13
-rw-r--r--examples/cross_calculator/android/src/com/github/nimrod/crosscalculator/CrossCalculator.java80
-rw-r--r--examples/cross_calculator/ios/cross-calculator.xcodeproj/project.pbxproj345
-rw-r--r--examples/cross_calculator/ios/readme.txt17
-rw-r--r--examples/cross_calculator/ios/resources/plist/cross-calculator-Info.plist30
-rw-r--r--examples/cross_calculator/ios/resources/ui/NRViewController.xib479
-rwxr-xr-xexamples/cross_calculator/ios/scripts/tags.sh13
-rwxr-xr-xexamples/cross_calculator/ios/scripts/xcode_prebuild.sh36
-rw-r--r--examples/cross_calculator/ios/src/AppDelegate.h7
-rw-r--r--examples/cross_calculator/ios/src/AppDelegate.m39
-rw-r--r--examples/cross_calculator/ios/src/NRViewController.h11
-rw-r--r--examples/cross_calculator/ios/src/NRViewController.m210
-rw-r--r--examples/cross_calculator/ios/src/cross-calculator-Prefix.pch10
-rw-r--r--examples/cross_calculator/ios/src/main.m13
-rwxr-xr-xexamples/cross_calculator/lazarus/nimlaz.lpi (renamed from examples/lazarus/nimlaz.lpi)0
-rwxr-xr-xexamples/cross_calculator/lazarus/nimlaz.lpr (renamed from examples/lazarus/nimlaz.lpr)0
-rwxr-xr-xexamples/cross_calculator/lazarus/nimlaz.lrs (renamed from examples/lazarus/nimlaz.lrs)0
-rw-r--r--examples/cross_calculator/lazarus/nimlaz.rc (renamed from examples/lazarus/nimlaz.rc)0
-rwxr-xr-xexamples/cross_calculator/lazarus/readme.txt (renamed from examples/lazarus/readme.txt)0
-rwxr-xr-xexamples/cross_calculator/lazarus/unit1.lfm (renamed from examples/lazarus/unit1.lfm)0
-rwxr-xr-xexamples/cross_calculator/lazarus/unit1.pas (renamed from examples/lazarus/unit1.pas)0
-rwxr-xr-xexamples/cross_calculator/nimrod_backend/backend.nim (renamed from examples/lazarus/backend.nim)2
-rw-r--r--examples/cross_calculator/readme.txt11
34 files changed, 1692 insertions, 1 deletions
diff --git a/examples/cross_calculator/android/AndroidManifest.xml b/examples/cross_calculator/android/AndroidManifest.xml
new file mode 100644
index 000000000..05b96fb50
--- /dev/null
+++ b/examples/cross_calculator/android/AndroidManifest.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+		package="com.github.nimrod.crosscalculator"
+		android:versionCode="1"
+		android:versionName="1.0">
+
+	<uses-sdk android:minSdkVersion="3" />
+
+	<application android:label="@string/app_name" android:debuggable="true">
+		<activity android:name=".CrossCalculator"
+			android:label="@string/app_name">
+			<intent-filter>
+				<action android:name="android.intent.action.MAIN" />
+				<category android:name="android.intent.category.LAUNCHER" />
+			</intent-filter>
+		</activity>
+	</application>
+</manifest>
diff --git a/examples/cross_calculator/android/build.xml b/examples/cross_calculator/android/build.xml
new file mode 100644
index 000000000..d7c88432a
--- /dev/null
+++ b/examples/cross_calculator/android/build.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="CrossCalculator" default="help">
+
+    <!-- The local.properties file is created and updated by the 'android' tool.
+         It contains the path to the SDK. It should *NOT* be checked into
+         Version Control Systems. -->
+    <property file="local.properties" />
+
+    <!-- The ant.properties file can be created by you. It is only edited by the
+         'android' tool to add properties to it.
+         This is the place to change some Ant specific build properties.
+         Here are some properties you may want to change/update:
+
+         source.dir
+             The name of the source directory. Default is 'src'.
+         out.dir
+             The name of the output directory. Default is 'bin'.
+
+         For other overridable properties, look at the beginning of the rules
+         files in the SDK, at tools/ant/build.xml
+
+         Properties related to the SDK location or the project target should
+         be updated using the 'android' tool with the 'update' action.
+
+         This file is an integral part of the build system for your
+         application and should be checked into Version Control Systems.
+
+         -->
+    <property file="ant.properties" />
+
+    <!-- if sdk.dir was not set from one of the property file, then
+         get it from the ANDROID_HOME env var.
+         This must be done before we load project.properties since
+         the proguard config can use sdk.dir -->
+    <property environment="env" />
+    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
+        <isset property="env.ANDROID_HOME" />
+    </condition>
+
+    <!-- The project.properties file is created and updated by the 'android'
+         tool, as well as ADT.
+
+         This contains project specific properties such as project target, and library
+         dependencies. Lower level build properties are stored in ant.properties
+         (or in .classpath for Eclipse projects).
+
+         This file is an integral part of the build system for your
+         application and should be checked into Version Control Systems. -->
+    <loadproperties srcFile="project.properties" />
+
+    <!-- quick check on sdk.dir -->
+    <fail
+            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
+            unless="sdk.dir"
+    />
+
+    <!--
+        Import per project custom build rules if present at the root of the project.
+        This is the place to put custom intermediary targets such as:
+            -pre-build
+            -pre-compile
+            -post-compile (This is typically used for code obfuscation.
+                           Compiled code location: ${out.classes.absolute.dir}
+                           If this is not done in place, override ${out.dex.input.absolute.dir})
+            -post-package
+            -post-build
+            -pre-clean
+    -->
+    <import file="custom_rules.xml" optional="true" />
+
+    <!-- Import the actual build file.
+
+         To customize existing targets, there are two options:
+         - Customize only one target:
+             - copy/paste the target into this file, *before* the
+               <import> task.
+             - customize it to your needs.
+         - Customize the whole content of build.xml
+             - copy/paste the content of the rules files (minus the top node)
+               into this file, replacing the <import> task.
+             - customize to your needs.
+
+         ***********************
+         ****** IMPORTANT ******
+         ***********************
+         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
+         in order to avoid having your file be overridden by tools such as "android update project"
+    -->
+    <!-- version-tag: 1 -->
+    <import file="${sdk.dir}/tools/ant/build.xml" />
+
+</project>
diff --git a/examples/cross_calculator/android/custom_rules.xml b/examples/cross_calculator/android/custom_rules.xml
new file mode 100644
index 000000000..91783a50e
--- /dev/null
+++ b/examples/cross_calculator/android/custom_rules.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="custom_rules" default="debug">
+	<target name="nim">
+		<exec executable="scripts/nimbuild.sh" failonerror="true">
+		</exec>
+	</target>
+	<target name="jni">
+		<exec executable="scripts/jnibuild.sh" failonerror="true">
+		</exec>
+	</target>
+	<target name="ndk">
+		<exec executable="ndk-build" failonerror="true">
+		</exec>
+	</target>
+	<target name="-post-compile" depends="nim, jni, ndk">
+	</target>
+</project>
diff --git a/examples/cross_calculator/android/jni/Android.mk b/examples/cross_calculator/android/jni/Android.mk
new file mode 100644
index 000000000..c1a0feac3
--- /dev/null
+++ b/examples/cross_calculator/android/jni/Android.mk
@@ -0,0 +1,32 @@
+# Copyright (C) 2009 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := nimrod
+LOCAL_SRC_FILES := nimcache/backend.c nimcache/system.c
+LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/nimcache
+
+include $(BUILD_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE    := backend-jni
+LOCAL_SRC_FILES := backend-jni.c
+LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
+LOCAL_STATIC_LIBRARIES := nimrod
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/examples/cross_calculator/android/jni/backend-jni.c b/examples/cross_calculator/android/jni/backend-jni.c
new file mode 100644
index 000000000..3d65458ec
--- /dev/null
+++ b/examples/cross_calculator/android/jni/backend-jni.c
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+#include <android/log.h>
+#include <string.h>
+#include "backend-jni.h"
+#include "backend.h"
+
+#define TAG		"backend-jni.c"
+
+jint JNICALL Java_com_github_nimrod_crosscalculator_CrossCalculator_myAdd
+	(JNIEnv *env, jobject thiz, jint a, jint b)
+{
+	char buf[256];
+	const jint ret = myAdd(a, b);
+	// Using logging from inside the native bridge to log-debug.
+	sprintf(buf, "a %d + b %d = ret %d", a, b, ret);
+	__android_log_write(ANDROID_LOG_DEBUG, TAG, buf);
+	return ret;
+}
+
+void JNICALL Java_com_github_nimrod_crosscalculator_CrossCalculator_initNimMain
+	(JNIEnv *env, jclass thiz)
+{
+	NimMain();
+	__android_log_write(ANDROID_LOG_DEBUG, TAG, "Nimrod initialised");
+}
+
+// vim:tabstop=2 shiftwidth=2 syntax=c
diff --git a/examples/cross_calculator/android/project.properties b/examples/cross_calculator/android/project.properties
new file mode 100644
index 000000000..9fb894d9b
--- /dev/null
+++ b/examples/cross_calculator/android/project.properties
@@ -0,0 +1,14 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system edit
+# "ant.properties", and override values to adapt the script to your
+# project structure.
+#
+# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
+#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
+
+# Project target.
+target=android-3
diff --git a/examples/cross_calculator/android/readme.txt b/examples/cross_calculator/android/readme.txt
new file mode 100644
index 000000000..f8b16d4fc
--- /dev/null
+++ b/examples/cross_calculator/android/readme.txt
@@ -0,0 +1,30 @@
+In this directory you will find the Android platform cross-calculator sample.
+
+Due to the nature of Android being java and nimrod generating C code, the build
+process is slightly more complex because jni code has to be written to bridge
+both languages. In a distant future it may be possible for nimrod to generate
+the whole jni bridge, but for the moment this is manual work.
+
+For the jni bridge to work first the java code is compiled with the nimrod code
+just declared as a native method which will be resolved at runtime. The scripts
+nimbuild.sh and jnibuild.sh are in charge of building the nimrod code and
+generating the jni bridge from the java code respectively. Finally, the
+ndk-build command from the android ndk tools has to be run to build the binary
+libary which will be installed along the final apk.
+
+All these steps are wrapped in the ant build script through the customization
+of the -post-compile rule. If you have the android ndk tools installed and you
+modify scripts/nimbuild.sh to point to the directory where you have nimrod
+installed on your system, you can simply run "ant debug" to build everything.
+
+Once the apk is built you can install it on your device or emulator with the
+command "adb install bin/CrossCalculator-debug.apk".
+
+You can use this example as a starting point for your project or look at the
+history of the github project at https://github.com/gradha/nimrod-on-android.
+That repository documents the individual integration steps you would take for
+any Android project (note it uses Eclipse rather than ant to build and
+therefore the build process requires more manual fiddling).
+
+This example runs against the Android level 3 API, meaning devices from
+Android 1.5 and above should be able to run the generated binary.
diff --git a/examples/cross_calculator/android/res/layout/cross_calculator.xml b/examples/cross_calculator/android/res/layout/cross_calculator.xml
new file mode 100644
index 000000000..11531334c
--- /dev/null
+++ b/examples/cross_calculator/android/res/layout/cross_calculator.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/RelativeLayout1"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    android:orientation="vertical" >
+
+    <TextView
+        android:id="@+id/title"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:layout_alignParentLeft="true"
+        android:layout_alignParentTop="true"
+        android:layout_centerHorizontal="true"
+        android:text="Crossplatform Nimrod calculator"
+        android:textSize="20dip" >
+
+    </TextView>
+
+    <TextView
+        android:id="@+id/value_a"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:layout_below="@+id/title"
+        android:text="Value A: " >
+    </TextView>
+
+    <EditText
+        android:id="@+id/edit_text_a"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentRight="true"
+        android:layout_below="@+id/title"
+        android:ems="10"
+        android:inputType="number" />
+
+    <TextView
+        android:id="@+id/value_b"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:layout_below="@+id/edit_text_a"
+        android:text="Value B: " >
+    </TextView>
+
+    <EditText
+        android:id="@+id/edit_text_b"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentRight="true"
+        android:layout_below="@+id/edit_text_a"
+        android:ems="10"
+        android:inputType="number" />
+
+    <Button
+        android:id="@+id/add_button"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:layout_alignParentLeft="true"
+        android:layout_below="@+id/edit_text_b"
+        android:scrollbarAlwaysDrawVerticalTrack="false"
+        android:selectAllOnFocus="false"
+        android:text="Add!"
+        android:visibility="visible" />
+
+    <TextView
+        android:id="@+id/result_text"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:layout_alignParentLeft="true"
+        android:layout_below="@+id/add_button" />
+
+</RelativeLayout>
diff --git a/examples/cross_calculator/android/res/values/strings.xml b/examples/cross_calculator/android/res/values/strings.xml
new file mode 100644
index 000000000..05cd3ac93
--- /dev/null
+++ b/examples/cross_calculator/android/res/values/strings.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">CrossCalculator</string>
+</resources>
diff --git a/examples/cross_calculator/android/scripts/jnibuild.sh b/examples/cross_calculator/android/scripts/jnibuild.sh
new file mode 100755
index 000000000..8b61f20f7
--- /dev/null
+++ b/examples/cross_calculator/android/scripts/jnibuild.sh
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+# Force errors to fail script.
+set -e
+
+# If we are running from inside the scripts subdir, get out.
+if [ ! -d src ]
+then
+	cd ..
+fi
+
+# Ok, are we out now?
+if [ -d src ]
+then
+	javah -classpath bin/classes \
+		-o jni/backend-jni.h \
+		com.github.nimrod.crosscalculator.CrossCalculator
+else
+	echo "Uh oh, bin/classes directory not found?"
+	echo "Try compiling your java code, or opening in eclipse."
+	exit 1
+fi
diff --git a/examples/cross_calculator/android/scripts/nimbuild.sh b/examples/cross_calculator/android/scripts/nimbuild.sh
new file mode 100755
index 000000000..97130b8dd
--- /dev/null
+++ b/examples/cross_calculator/android/scripts/nimbuild.sh
@@ -0,0 +1,34 @@
+#!/bin/sh
+
+# Set this to the local or full path of your nimrod compiler
+PATH_TO_NIMROD=~/project/nimrod/bin/nimrod
+# Set this to the location of the nimbase.h file so
+# the script can update it if it changes.
+PATH_TO_NIMBASE=~/project/nimrod/lib/nimbase.h
+
+# Force errors to fail script.
+set -e
+
+# If we are running from inside the scripts subdir, get out.
+if [ ! -d src ]
+then
+	cd ..
+fi
+
+DEST_NIMBASE=jni/nimcache/nimbase.h
+
+# Ok, are we out now?
+if [ -d src ]
+then
+	$PATH_TO_NIMROD c --noMain  --app:lib \
+		--nimcache:jni/nimcache --cpu:arm --os:linux \
+		--compileOnly --header ../nimrod_backend/*.nim
+	if [ "${PATH_TO_NIMBASE}" -nt "${DEST_NIMBASE}" ]
+	then
+		echo "Updating nimbase.h"
+		cp "${PATH_TO_NIMBASE}" "${DEST_NIMBASE}"
+	fi
+else
+	echo "Uh oh, src directory not found?"
+	exit 1
+fi
diff --git a/examples/cross_calculator/android/scripts/tags.sh b/examples/cross_calculator/android/scripts/tags.sh
new file mode 100755
index 000000000..95507064f
--- /dev/null
+++ b/examples/cross_calculator/android/scripts/tags.sh
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+if [ ! -d src ]
+then
+	cd ..
+fi
+
+if [ -d src ]
+then
+	~/bin/objctags -R \
+		jni \
+		src
+fi
diff --git a/examples/cross_calculator/android/src/com/github/nimrod/crosscalculator/CrossCalculator.java b/examples/cross_calculator/android/src/com/github/nimrod/crosscalculator/CrossCalculator.java
new file mode 100644
index 000000000..df2eed5ea
--- /dev/null
+++ b/examples/cross_calculator/android/src/com/github/nimrod/crosscalculator/CrossCalculator.java
@@ -0,0 +1,80 @@
+package com.github.nimrod.crosscalculator;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.TextView;
+import android.widget.Toast;
+
+public class CrossCalculator extends Activity
+{
+	private static final String TAG = "CrossCalculator";
+	private TextView result_text;
+	private EditText edit_text_a, edit_text_b;
+	/** Called when the activity is first created. */
+	@Override
+	public void onCreate(Bundle savedInstanceState)
+	{
+		super.onCreate(savedInstanceState);
+		setContentView(R.layout.cross_calculator);
+
+		final Button button = (Button)findViewById(R.id.add_button);
+		button.setOnClickListener(new View.OnClickListener() {
+			public void onClick(View v) { addButtonClicked(); } });
+
+		result_text = (TextView)findViewById(R.id.result_text);
+		edit_text_a = (EditText)findViewById(R.id.edit_text_a);
+		edit_text_b = (EditText)findViewById(R.id.edit_text_b);
+	}
+
+	/** Handles clicks on the addition button.
+	 * Reads the values form the input fields and performs the calculation.
+	 */
+	private void addButtonClicked()
+	{
+		int a = 0, b = 0;
+		String errors = "";
+		final String a_text = edit_text_a.getText().toString();
+		final String b_text = edit_text_b.getText().toString();
+		try {
+			a = Integer.valueOf(a_text, 10);
+		} catch (NumberFormatException e) {
+			errors += "Can't parse a value '" + a_text + "'. ";
+		}
+		try {
+			b = Integer.valueOf(b_text, 10);
+		} catch (NumberFormatException e) {
+			errors += "Can't parse b value '" + b_text + "'";
+		}
+		final int c = myAdd(a, b);
+		result_text.setText("myAdd(" + a + ", " + b + ") = " + c);
+
+		if (errors.length() > 0) {
+			Log.e(TAG, errors);
+			Toast.makeText(this, errors, Toast.LENGTH_SHORT).show();
+		}
+	}
+
+	/* A native method that is implemented by the
+	 * 'backend-jni' native library, which is packaged
+	 * with this application. Adds to integers.
+	 */
+	public native int myAdd(int a, int b);
+
+	/* A native method used to initialise Nimrod.
+	 */
+	static public native void initNimMain();
+
+	/* this is used to load the 'backend-jni' library on application
+	 * startup. The library has already been unpacked into
+	 * /data/data/com.github.nimrod.backendjni/lib/libbackend-jni.so at
+	 * installation time by the package manager.
+	 */
+	static {
+		System.loadLibrary("backend-jni");
+		initNimMain();
+	}
+}
diff --git a/examples/cross_calculator/ios/cross-calculator.xcodeproj/project.pbxproj b/examples/cross_calculator/ios/cross-calculator.xcodeproj/project.pbxproj
new file mode 100644
index 000000000..36b43d31b
--- /dev/null
+++ b/examples/cross_calculator/ios/cross-calculator.xcodeproj/project.pbxproj
@@ -0,0 +1,345 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 46;
+	objects = {
+
+/* Begin PBXBuildFile section */
+		D531422A15BC8611005EFF20 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D531422915BC8611005EFF20 /* UIKit.framework */; };
+		D531422C15BC8611005EFF20 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D531422B15BC8611005EFF20 /* Foundation.framework */; };
+		D531422E15BC8611005EFF20 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D531422D15BC8611005EFF20 /* CoreGraphics.framework */; };
+		D531424D15BC87B6005EFF20 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = D531424A15BC87B6005EFF20 /* AppDelegate.m */; };
+		D531424E15BC87B6005EFF20 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D531424B15BC87B6005EFF20 /* main.m */; };
+		D531427215BC94B1005EFF20 /* backend.m in Sources */ = {isa = PBXBuildFile; fileRef = D531426F15BC94B1005EFF20 /* backend.m */; };
+		D531427415BC94B1005EFF20 /* system.m in Sources */ = {isa = PBXBuildFile; fileRef = D531427115BC94B1005EFF20 /* system.m */; };
+		D5B6F94815FA8D4C0084A85B /* NRViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D5B6F94615FA8D4C0084A85B /* NRViewController.m */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+		D531422515BC8611005EFF20 /* cross-calculator.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "cross-calculator.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+		D531422915BC8611005EFF20 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+		D531422B15BC8611005EFF20 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+		D531422D15BC8611005EFF20 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
+		D531424715BC87A5005EFF20 /* cross-calculator-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "cross-calculator-Info.plist"; path = "resources/plist/cross-calculator-Info.plist"; sourceTree = "<group>"; };
+		D531424915BC87B6005EFF20 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = src/AppDelegate.h; sourceTree = "<group>"; };
+		D531424A15BC87B6005EFF20 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = src/AppDelegate.m; sourceTree = "<group>"; };
+		D531424B15BC87B6005EFF20 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = src/main.m; sourceTree = "<group>"; };
+		D531424C15BC87B6005EFF20 /* cross-calculator-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "cross-calculator-Prefix.pch"; path = "src/cross-calculator-Prefix.pch"; sourceTree = "<group>"; };
+		D531426715BC91EF005EFF20 /* tags.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; name = tags.sh; path = scripts/tags.sh; sourceTree = "<group>"; };
+		D531426815BC91EF005EFF20 /* xcode_prebuild.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; name = xcode_prebuild.sh; path = scripts/xcode_prebuild.sh; sourceTree = "<group>"; };
+		D531426F15BC94B1005EFF20 /* backend.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = backend.m; path = build/nimcache/backend.m; sourceTree = "<group>"; };
+		D531427115BC94B1005EFF20 /* system.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = system.m; path = build/nimcache/system.m; sourceTree = "<group>"; };
+		D592E19015C7120F005258EA /* backend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = backend.h; path = build/nimcache/backend.h; sourceTree = "<group>"; };
+		D592E19115C71415005258EA /* nimbase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = nimbase.h; path = build/nimcache/nimbase.h; sourceTree = "<group>"; };
+		D5B6F94515FA8D4C0084A85B /* NRViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NRViewController.h; path = src/NRViewController.h; sourceTree = "<group>"; };
+		D5B6F94615FA8D4C0084A85B /* NRViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NRViewController.m; path = src/NRViewController.m; sourceTree = "<group>"; };
+		D5B6F96315FB448D0084A85B /* NRViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = NRViewController.xib; path = resources/ui/NRViewController.xib; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		D531422215BC8610005EFF20 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				D531422A15BC8611005EFF20 /* UIKit.framework in Frameworks */,
+				D531422C15BC8611005EFF20 /* Foundation.framework in Frameworks */,
+				D531422E15BC8611005EFF20 /* CoreGraphics.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		D531421A15BC8610005EFF20 = {
+			isa = PBXGroup;
+			children = (
+				D531426A15BC93D5005EFF20 /* build */,
+				D531424515BC874E005EFF20 /* resources */,
+				D531426615BC91E1005EFF20 /* scripts */,
+				D531424815BC87AD005EFF20 /* src */,
+				D531422815BC8611005EFF20 /* Frameworks */,
+				D531422615BC8611005EFF20 /* Products */,
+			);
+			sourceTree = "<group>";
+		};
+		D531422615BC8611005EFF20 /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				D531422515BC8611005EFF20 /* cross-calculator.app */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		D531422815BC8611005EFF20 /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				D531422915BC8611005EFF20 /* UIKit.framework */,
+				D531422B15BC8611005EFF20 /* Foundation.framework */,
+				D531422D15BC8611005EFF20 /* CoreGraphics.framework */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
+		D531424515BC874E005EFF20 /* resources */ = {
+			isa = PBXGroup;
+			children = (
+				D531424615BC8756005EFF20 /* plist */,
+				D5B6F96115FB447C0084A85B /* ui */,
+			);
+			name = resources;
+			sourceTree = "<group>";
+		};
+		D531424615BC8756005EFF20 /* plist */ = {
+			isa = PBXGroup;
+			children = (
+				D531424715BC87A5005EFF20 /* cross-calculator-Info.plist */,
+			);
+			name = plist;
+			sourceTree = "<group>";
+		};
+		D531424815BC87AD005EFF20 /* src */ = {
+			isa = PBXGroup;
+			children = (
+				D531424915BC87B6005EFF20 /* AppDelegate.h */,
+				D531424A15BC87B6005EFF20 /* AppDelegate.m */,
+				D531424C15BC87B6005EFF20 /* cross-calculator-Prefix.pch */,
+				D531424B15BC87B6005EFF20 /* main.m */,
+				D5B6F94515FA8D4C0084A85B /* NRViewController.h */,
+				D5B6F94615FA8D4C0084A85B /* NRViewController.m */,
+			);
+			name = src;
+			sourceTree = "<group>";
+		};
+		D531426615BC91E1005EFF20 /* scripts */ = {
+			isa = PBXGroup;
+			children = (
+				D531426715BC91EF005EFF20 /* tags.sh */,
+				D531426815BC91EF005EFF20 /* xcode_prebuild.sh */,
+			);
+			name = scripts;
+			sourceTree = "<group>";
+		};
+		D531426A15BC93D5005EFF20 /* build */ = {
+			isa = PBXGroup;
+			children = (
+				D531426E15BC94A6005EFF20 /* nimrod */,
+			);
+			name = build;
+			sourceTree = "<group>";
+		};
+		D531426E15BC94A6005EFF20 /* nimrod */ = {
+			isa = PBXGroup;
+			children = (
+				D592E19015C7120F005258EA /* backend.h */,
+				D531426F15BC94B1005EFF20 /* backend.m */,
+				D592E19115C71415005258EA /* nimbase.h */,
+				D531427115BC94B1005EFF20 /* system.m */,
+			);
+			name = nimrod;
+			sourceTree = "<group>";
+		};
+		D5B6F96115FB447C0084A85B /* ui */ = {
+			isa = PBXGroup;
+			children = (
+				D5B6F96315FB448D0084A85B /* NRViewController.xib */,
+			);
+			name = ui;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		D531422415BC8610005EFF20 /* cross-calculator */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = D531423D15BC8611005EFF20 /* Build configuration list for PBXNativeTarget "cross-calculator" */;
+			buildPhases = (
+				D531426915BC926C005EFF20 /* ShellScript */,
+				D531422115BC8610005EFF20 /* Sources */,
+				D531422215BC8610005EFF20 /* Frameworks */,
+				D531422315BC8610005EFF20 /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = "cross-calculator";
+			productName = "cross-calculator";
+			productReference = D531422515BC8611005EFF20 /* cross-calculator.app */;
+			productType = "com.apple.product-type.application";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		D531421C15BC8610005EFF20 /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 0420;
+				ORGANIZATIONNAME = "Electric Hands Software";
+			};
+			buildConfigurationList = D531421F15BC8610005EFF20 /* Build configuration list for PBXProject "cross-calculator" */;
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				en,
+			);
+			mainGroup = D531421A15BC8610005EFF20;
+			productRefGroup = D531422615BC8611005EFF20 /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				D531422415BC8610005EFF20 /* cross-calculator */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		D531422315BC8610005EFF20 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+		D531426915BC926C005EFF20 /* ShellScript */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = scripts/xcode_prebuild.sh;
+		};
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		D531422115BC8610005EFF20 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				D531424D15BC87B6005EFF20 /* AppDelegate.m in Sources */,
+				D531424E15BC87B6005EFF20 /* main.m in Sources */,
+				D531427215BC94B1005EFF20 /* backend.m in Sources */,
+				D531427415BC94B1005EFF20 /* system.m in Sources */,
+				D5B6F94815FA8D4C0084A85B /* NRViewController.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+		D531423B15BC8611005EFF20 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				ARCHS = (
+					armv7,
+					armv6,
+				);
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				COPY_PHASE_STRIP = NO;
+				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+				GCC_VERSION = "";
+				GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 3.0;
+				OTHER_LDFLAGS = (
+					"-weak_library",
+					/usr/lib/libSystem.B.dylib,
+				);
+				SDKROOT = iphoneos;
+				TARGETED_DEVICE_FAMILY = "1,2";
+			};
+			name = Debug;
+		};
+		D531423C15BC8611005EFF20 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				ARCHS = (
+					armv7,
+					armv6,
+				);
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				COPY_PHASE_STRIP = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_VERSION = "";
+				GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 3.0;
+				OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
+				OTHER_LDFLAGS = (
+					"-weak_library",
+					/usr/lib/libSystem.B.dylib,
+				);
+				SDKROOT = iphoneos;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VALIDATE_PRODUCT = YES;
+			};
+			name = Release;
+		};
+		D531423E15BC8611005EFF20 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "src/cross-calculator-Prefix.pch";
+				INFOPLIST_FILE = "resources/plist/cross-calculator-Info.plist";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				WRAPPER_EXTENSION = app;
+			};
+			name = Debug;
+		};
+		D531423F15BC8611005EFF20 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "src/cross-calculator-Prefix.pch";
+				INFOPLIST_FILE = "resources/plist/cross-calculator-Info.plist";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				WRAPPER_EXTENSION = app;
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		D531421F15BC8610005EFF20 /* Build configuration list for PBXProject "cross-calculator" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				D531423B15BC8611005EFF20 /* Debug */,
+				D531423C15BC8611005EFF20 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		D531423D15BC8611005EFF20 /* Build configuration list for PBXNativeTarget "cross-calculator" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				D531423E15BC8611005EFF20 /* Debug */,
+				D531423F15BC8611005EFF20 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = D531421C15BC8610005EFF20 /* Project object */;
+}
diff --git a/examples/cross_calculator/ios/readme.txt b/examples/cross_calculator/ios/readme.txt
new file mode 100644
index 000000000..e75db72bf
--- /dev/null
+++ b/examples/cross_calculator/ios/readme.txt
@@ -0,0 +1,17 @@
+In this directory you will find the iOS platform cross-calculator sample.
+
+The iOS version of the code builds a view controller in charge of displaying
+the interface to the user. The nimrod backend code is compiled into C code and
+put into build/nimrod as a pre-build phase of the project.
+
+When the calculate button is used the view controller calls the nimrod code to
+delegate the logic of the operation and puts the result in a label for display.
+All interface error checks are implemented in the view controller.
+
+You can use this as a starting point for your project or look at the history of
+the github project at https://github.com/gradha/nimrod-on-ios. That repository
+documents the individual integration steps you would take for any iOS project.
+
+This version of the iOS project is known to work with Xcode 4.2 and Xcode
+4.4.1. The final binary can be deployed on iOS 3.x to 5.x supporting all iOS
+platforms and versions available at the moment.
diff --git a/examples/cross_calculator/ios/resources/plist/cross-calculator-Info.plist b/examples/cross_calculator/ios/resources/plist/cross-calculator-Info.plist
new file mode 100644
index 000000000..758f20e38
--- /dev/null
+++ b/examples/cross_calculator/ios/resources/plist/cross-calculator-Info.plist
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>en</string>
+	<key>CFBundleDisplayName</key>
+	<string>${PRODUCT_NAME}</string>
+	<key>CFBundleExecutable</key>
+	<string>${EXECUTABLE_NAME}</string>
+	<key>CFBundleIconFiles</key>
+	<array/>
+	<key>CFBundleIdentifier</key>
+	<string>com.github.nimrod.${PRODUCT_NAME:rfc1034identifier}</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>${PRODUCT_NAME}</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>1.0</string>
+	<key>UIApplicationExitsOnSuspend</key>
+	<true/>
+</dict>
+</plist>
diff --git a/examples/cross_calculator/ios/resources/ui/NRViewController.xib b/examples/cross_calculator/ios/resources/ui/NRViewController.xib
new file mode 100644
index 000000000..b260db2af
--- /dev/null
+++ b/examples/cross_calculator/ios/resources/ui/NRViewController.xib
@@ -0,0 +1,479 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="8.00">
+	<data>
+		<int key="IBDocument.SystemTarget">0</int>
+		<string key="IBDocument.SystemVersion">11E53</string>
+		<string key="IBDocument.InterfaceBuilderVersion">2549</string>
+		<string key="IBDocument.AppKitVersion">1138.47</string>
+		<string key="IBDocument.HIToolboxVersion">569.00</string>
+		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+			<string key="NS.object.0">1498</string>
+		</object>
+		<array key="IBDocument.IntegratedClassDependencies">
+			<string>IBProxyObject</string>
+			<string>IBUIButton</string>
+			<string>IBUILabel</string>
+			<string>IBUITextField</string>
+			<string>IBUIView</string>
+		</array>
+		<array key="IBDocument.PluginDependencies">
+			<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+		</array>
+		<object class="NSMutableDictionary" key="IBDocument.Metadata">
+			<string key="NS.key.0">PluginDependencyRecalculationVersion</string>
+			<integer value="1" key="NS.object.0"/>
+		</object>
+		<array class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
+			<object class="IBProxyObject" id="372490531">
+				<string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
+				<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+			</object>
+			<object class="IBProxyObject" id="975951072">
+				<string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
+				<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+			</object>
+			<object class="IBUIView" id="191373211">
+				<reference key="NSNextResponder"/>
+				<int key="NSvFlags">274</int>
+				<array class="NSMutableArray" key="NSSubviews">
+					<object class="IBUIButton" id="467453084">
+						<reference key="NSNextResponder" ref="191373211"/>
+						<int key="NSvFlags">292</int>
+						<string key="NSFrame">{{0, -10}, {320, 480}}</string>
+						<reference key="NSSuperview" ref="191373211"/>
+						<reference key="NSWindow"/>
+						<string key="NSReuseIdentifierKey">_NS:9</string>
+						<bool key="IBUIOpaque">NO</bool>
+						<int key="IBUITag">1</int>
+						<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+						<int key="IBUIContentHorizontalAlignment">0</int>
+						<int key="IBUIContentVerticalAlignment">0</int>
+						<object class="NSColor" key="IBUIHighlightedTitleColor" id="95215378">
+							<int key="NSColorSpace">3</int>
+							<bytes key="NSWhite">MQA</bytes>
+						</object>
+						<object class="NSColor" key="IBUINormalTitleColor">
+							<int key="NSColorSpace">1</int>
+							<bytes key="NSRGB">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>
+						</object>
+						<object class="NSColor" key="IBUINormalTitleShadowColor" id="1056499111">
+							<int key="NSColorSpace">3</int>
+							<bytes key="NSWhite">MC41AA</bytes>
+						</object>
+						<object class="IBUIFontDescription" key="IBUIFontDescription" id="686052398">
+							<int key="type">2</int>
+							<double key="pointSize">15</double>
+						</object>
+						<object class="NSFont" key="IBUIFont" id="594372787">
+							<string key="NSName">Helvetica-Bold</string>
+							<double key="NSSize">15</double>
+							<int key="NSfFlags">16</int>
+						</object>
+					</object>
+					<object class="IBUILabel" id="353054360">
+						<reference key="NSNextResponder" ref="191373211"/>
+						<int key="NSvFlags">306</int>
+						<string key="NSFrameSize">{320, 34}</string>
+						<reference key="NSSuperview" ref="191373211"/>
+						<reference key="NSWindow"/>
+						<reference key="NSNextKeyView" ref="525225214"/>
+						<string key="NSReuseIdentifierKey">_NS:9</string>
+						<bool key="IBUIOpaque">NO</bool>
+						<bool key="IBUIClipsSubviews">YES</bool>
+						<int key="IBUIContentMode">7</int>
+						<int key="IBUITag">2</int>
+						<bool key="IBUIUserInteractionEnabled">NO</bool>
+						<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+						<string key="IBUIText">Nimrod Crossplatform Calculator</string>
+						<object class="NSColor" key="IBUITextColor" id="128895179">
+							<int key="NSColorSpace">1</int>
+							<bytes key="NSRGB">MCAwIDAAA</bytes>
+						</object>
+						<nil key="IBUIHighlightedColor"/>
+						<int key="IBUIBaselineAdjustment">0</int>
+						<float key="IBUIMinimumFontSize">10</float>
+						<int key="IBUITextAlignment">1</int>
+						<object class="IBUIFontDescription" key="IBUIFontDescription">
+							<int key="type">2</int>
+							<double key="pointSize">18</double>
+						</object>
+						<object class="NSFont" key="IBUIFont">
+							<string key="NSName">Helvetica-Bold</string>
+							<double key="NSSize">18</double>
+							<int key="NSfFlags">16</int>
+						</object>
+					</object>
+					<object class="IBUILabel" id="525225214">
+						<reference key="NSNextResponder" ref="191373211"/>
+						<int key="NSvFlags">294</int>
+						<string key="NSFrame">{{20, 42}, {165, 31}}</string>
+						<reference key="NSSuperview" ref="191373211"/>
+						<reference key="NSWindow"/>
+						<reference key="NSNextKeyView" ref="1040444341"/>
+						<string key="NSReuseIdentifierKey">_NS:9</string>
+						<bool key="IBUIOpaque">NO</bool>
+						<bool key="IBUIClipsSubviews">YES</bool>
+						<int key="IBUIContentMode">7</int>
+						<int key="IBUITag">3</int>
+						<bool key="IBUIUserInteractionEnabled">NO</bool>
+						<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+						<string key="IBUIText">Value A:</string>
+						<reference key="IBUITextColor" ref="128895179"/>
+						<nil key="IBUIHighlightedColor"/>
+						<int key="IBUIBaselineAdjustment">0</int>
+						<float key="IBUIMinimumFontSize">10</float>
+						<object class="IBUIFontDescription" key="IBUIFontDescription" id="768572949">
+							<int key="type">1</int>
+							<double key="pointSize">17</double>
+						</object>
+						<object class="NSFont" key="IBUIFont" id="972319481">
+							<string key="NSName">Helvetica</string>
+							<double key="NSSize">17</double>
+							<int key="NSfFlags">16</int>
+						</object>
+					</object>
+					<object class="IBUILabel" id="904781109">
+						<reference key="NSNextResponder" ref="191373211"/>
+						<int key="NSvFlags">294</int>
+						<string key="NSFrame">{{20, 81}, {165, 31}}</string>
+						<reference key="NSSuperview" ref="191373211"/>
+						<reference key="NSWindow"/>
+						<reference key="NSNextKeyView" ref="1041721572"/>
+						<string key="NSReuseIdentifierKey">_NS:9</string>
+						<bool key="IBUIOpaque">NO</bool>
+						<bool key="IBUIClipsSubviews">YES</bool>
+						<int key="IBUIContentMode">7</int>
+						<int key="IBUITag">4</int>
+						<bool key="IBUIUserInteractionEnabled">NO</bool>
+						<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+						<string key="IBUIText">Value B:</string>
+						<reference key="IBUITextColor" ref="128895179"/>
+						<nil key="IBUIHighlightedColor"/>
+						<int key="IBUIBaselineAdjustment">0</int>
+						<float key="IBUIMinimumFontSize">10</float>
+						<reference key="IBUIFontDescription" ref="768572949"/>
+						<reference key="IBUIFont" ref="972319481"/>
+					</object>
+					<object class="IBUIButton" id="557594991">
+						<reference key="NSNextResponder" ref="191373211"/>
+						<int key="NSvFlags">291</int>
+						<string key="NSFrame">{{193, 124}, {107, 37}}</string>
+						<reference key="NSSuperview" ref="191373211"/>
+						<reference key="NSWindow"/>
+						<reference key="NSNextKeyView"/>
+						<string key="NSReuseIdentifierKey">_NS:9</string>
+						<bool key="IBUIOpaque">NO</bool>
+						<int key="IBUITag">5</int>
+						<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+						<int key="IBUIContentHorizontalAlignment">0</int>
+						<int key="IBUIContentVerticalAlignment">0</int>
+						<int key="IBUIButtonType">1</int>
+						<string key="IBUINormalTitle">Add!</string>
+						<reference key="IBUIHighlightedTitleColor" ref="95215378"/>
+						<object class="NSColor" key="IBUINormalTitleColor">
+							<int key="NSColorSpace">1</int>
+							<bytes key="NSRGB">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>
+						</object>
+						<reference key="IBUINormalTitleShadowColor" ref="1056499111"/>
+						<reference key="IBUIFontDescription" ref="686052398"/>
+						<reference key="IBUIFont" ref="594372787"/>
+					</object>
+					<object class="IBUILabel" id="360864196">
+						<reference key="NSNextResponder" ref="191373211"/>
+						<int key="NSvFlags">292</int>
+						<string key="NSFrame">{{20, 124}, {60, 37}}</string>
+						<reference key="NSSuperview" ref="191373211"/>
+						<reference key="NSWindow"/>
+						<reference key="NSNextKeyView" ref="521073831"/>
+						<string key="NSReuseIdentifierKey">_NS:9</string>
+						<bool key="IBUIOpaque">NO</bool>
+						<bool key="IBUIClipsSubviews">YES</bool>
+						<int key="IBUIContentMode">7</int>
+						<int key="IBUITag">6</int>
+						<bool key="IBUIUserInteractionEnabled">NO</bool>
+						<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+						<string key="IBUIText">Result:</string>
+						<reference key="IBUITextColor" ref="128895179"/>
+						<nil key="IBUIHighlightedColor"/>
+						<int key="IBUIBaselineAdjustment">0</int>
+						<float key="IBUIMinimumFontSize">10</float>
+						<reference key="IBUIFontDescription" ref="768572949"/>
+						<reference key="IBUIFont" ref="972319481"/>
+					</object>
+					<object class="IBUILabel" id="521073831">
+						<reference key="NSNextResponder" ref="191373211"/>
+						<int key="NSvFlags">294</int>
+						<string key="NSFrame">{{88, 124}, {97, 37}}</string>
+						<reference key="NSSuperview" ref="191373211"/>
+						<reference key="NSWindow"/>
+						<reference key="NSNextKeyView" ref="557594991"/>
+						<string key="NSReuseIdentifierKey">_NS:9</string>
+						<bool key="IBUIOpaque">NO</bool>
+						<bool key="IBUIClipsSubviews">YES</bool>
+						<int key="IBUIContentMode">7</int>
+						<int key="IBUITag">7</int>
+						<bool key="IBUIUserInteractionEnabled">NO</bool>
+						<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+						<string key="IBUIText"/>
+						<reference key="IBUITextColor" ref="128895179"/>
+						<nil key="IBUIHighlightedColor"/>
+						<int key="IBUIBaselineAdjustment">0</int>
+						<float key="IBUIMinimumFontSize">10</float>
+						<reference key="IBUIFontDescription" ref="768572949"/>
+						<reference key="IBUIFont" ref="972319481"/>
+					</object>
+					<object class="IBUITextField" id="1040444341">
+						<reference key="NSNextResponder" ref="191373211"/>
+						<int key="NSvFlags">291</int>
+						<string key="NSFrame">{{193, 42}, {107, 31}}</string>
+						<reference key="NSSuperview" ref="191373211"/>
+						<reference key="NSWindow"/>
+						<reference key="NSNextKeyView" ref="904781109"/>
+						<string key="NSReuseIdentifierKey">_NS:9</string>
+						<bool key="IBUIOpaque">NO</bool>
+						<bool key="IBUIClipsSubviews">YES</bool>
+						<int key="IBUITag">8</int>
+						<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+						<int key="IBUIContentVerticalAlignment">0</int>
+						<string key="IBUIText"/>
+						<int key="IBUIBorderStyle">3</int>
+						<string key="IBUIPlaceholder">Integer</string>
+						<object class="NSColor" key="IBUITextColor">
+							<int key="NSColorSpace">3</int>
+							<bytes key="NSWhite">MAA</bytes>
+							<object class="NSColorSpace" key="NSCustomColorSpace" id="433120901">
+								<int key="NSID">2</int>
+							</object>
+						</object>
+						<int key="IBUITextAlignment">1</int>
+						<bool key="IBUIAdjustsFontSizeToFit">YES</bool>
+						<float key="IBUIMinimumFontSize">17</float>
+						<object class="IBUITextInputTraits" key="IBUITextInputTraits">
+							<int key="IBUIKeyboardType">4</int>
+							<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+						</object>
+						<int key="IBUIClearButtonMode">1</int>
+						<object class="IBUIFontDescription" key="IBUIFontDescription" id="836805198">
+							<int key="type">1</int>
+							<double key="pointSize">14</double>
+						</object>
+						<object class="NSFont" key="IBUIFont" id="700927782">
+							<string key="NSName">Helvetica</string>
+							<double key="NSSize">14</double>
+							<int key="NSfFlags">16</int>
+						</object>
+					</object>
+					<object class="IBUITextField" id="1041721572">
+						<reference key="NSNextResponder" ref="191373211"/>
+						<int key="NSvFlags">291</int>
+						<string key="NSFrame">{{193, 81}, {107, 31}}</string>
+						<reference key="NSSuperview" ref="191373211"/>
+						<reference key="NSWindow"/>
+						<reference key="NSNextKeyView" ref="360864196"/>
+						<string key="NSReuseIdentifierKey">_NS:9</string>
+						<bool key="IBUIOpaque">NO</bool>
+						<bool key="IBUIClipsSubviews">YES</bool>
+						<int key="IBUITag">9</int>
+						<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+						<int key="IBUIContentVerticalAlignment">0</int>
+						<string key="IBUIText"/>
+						<int key="IBUIBorderStyle">3</int>
+						<string key="IBUIPlaceholder">Integer</string>
+						<object class="NSColor" key="IBUITextColor">
+							<int key="NSColorSpace">3</int>
+							<bytes key="NSWhite">MAA</bytes>
+							<reference key="NSCustomColorSpace" ref="433120901"/>
+						</object>
+						<int key="IBUITextAlignment">1</int>
+						<bool key="IBUIAdjustsFontSizeToFit">YES</bool>
+						<float key="IBUIMinimumFontSize">17</float>
+						<object class="IBUITextInputTraits" key="IBUITextInputTraits">
+							<int key="IBUIKeyboardType">4</int>
+							<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+						</object>
+						<int key="IBUIClearButtonMode">1</int>
+						<reference key="IBUIFontDescription" ref="836805198"/>
+						<reference key="IBUIFont" ref="700927782"/>
+					</object>
+				</array>
+				<string key="NSFrame">{{0, 20}, {320, 460}}</string>
+				<reference key="NSSuperview"/>
+				<reference key="NSWindow"/>
+				<reference key="NSNextKeyView" ref="353054360"/>
+				<object class="NSColor" key="IBUIBackgroundColor">
+					<int key="NSColorSpace">3</int>
+					<bytes key="NSWhite">MQA</bytes>
+					<reference key="NSCustomColorSpace" ref="433120901"/>
+				</object>
+				<object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics"/>
+				<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+			</object>
+		</array>
+		<object class="IBObjectContainer" key="IBDocument.Objects">
+			<array class="NSMutableArray" key="connectionRecords"/>
+			<object class="IBMutableOrderedSet" key="objectRecords">
+				<array key="orderedObjects">
+					<object class="IBObjectRecord">
+						<int key="objectID">0</int>
+						<array key="object" id="0"/>
+						<reference key="children" ref="1000"/>
+						<nil key="parent"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">1</int>
+						<reference key="object" ref="191373211"/>
+						<array class="NSMutableArray" key="children">
+							<reference ref="353054360"/>
+							<reference ref="525225214"/>
+							<reference ref="904781109"/>
+							<reference ref="557594991"/>
+							<reference ref="360864196"/>
+							<reference ref="521073831"/>
+							<reference ref="1040444341"/>
+							<reference ref="1041721572"/>
+							<reference ref="467453084"/>
+						</array>
+						<reference key="parent" ref="0"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">-1</int>
+						<reference key="object" ref="372490531"/>
+						<reference key="parent" ref="0"/>
+						<string key="objectName">File's Owner</string>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">-2</int>
+						<reference key="object" ref="975951072"/>
+						<reference key="parent" ref="0"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">14</int>
+						<reference key="object" ref="1041721572"/>
+						<reference key="parent" ref="191373211"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">13</int>
+						<reference key="object" ref="1040444341"/>
+						<reference key="parent" ref="191373211"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">12</int>
+						<reference key="object" ref="521073831"/>
+						<reference key="parent" ref="191373211"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">11</int>
+						<reference key="object" ref="360864196"/>
+						<reference key="parent" ref="191373211"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">10</int>
+						<reference key="object" ref="557594991"/>
+						<reference key="parent" ref="191373211"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">8</int>
+						<reference key="object" ref="904781109"/>
+						<reference key="parent" ref="191373211"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">7</int>
+						<reference key="object" ref="525225214"/>
+						<reference key="parent" ref="191373211"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">4</int>
+						<reference key="object" ref="353054360"/>
+						<reference key="parent" ref="191373211"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">22</int>
+						<reference key="object" ref="467453084"/>
+						<reference key="parent" ref="191373211"/>
+					</object>
+				</array>
+			</object>
+			<dictionary class="NSMutableDictionary" key="flattenedProperties">
+				<string key="-1.CustomClassName">NRViewController</string>
+				<string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="-2.CustomClassName">UIResponder</string>
+				<string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="1.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="10.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="11.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="12.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="13.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="14.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="22.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="4.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="7.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="8.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+			</dictionary>
+			<dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
+			<nil key="activeLocalization"/>
+			<dictionary class="NSMutableDictionary" key="localizations"/>
+			<nil key="sourceID"/>
+			<int key="maxID">22</int>
+		</object>
+		<object class="IBClassDescriber" key="IBDocument.Classes">
+			<array class="NSMutableArray" key="referencedPartialClassDescriptions">
+				<object class="IBPartialClassDescription">
+					<string key="className">NRViewController</string>
+					<string key="superclassName">UIViewController</string>
+					<dictionary class="NSMutableDictionary" key="actions">
+						<string key="backgroundTouched">id</string>
+						<string key="calculateButtonTouched">id</string>
+					</dictionary>
+					<dictionary class="NSMutableDictionary" key="actionInfosByName">
+						<object class="IBActionInfo" key="backgroundTouched">
+							<string key="name">backgroundTouched</string>
+							<string key="candidateClassName">id</string>
+						</object>
+						<object class="IBActionInfo" key="calculateButtonTouched">
+							<string key="name">calculateButtonTouched</string>
+							<string key="candidateClassName">id</string>
+						</object>
+					</dictionary>
+					<dictionary class="NSMutableDictionary" key="outlets">
+						<string key="aText">UITextField</string>
+						<string key="bText">UITextField</string>
+						<string key="calculateButton">UIButton</string>
+						<string key="resultLabel">UILabel</string>
+					</dictionary>
+					<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
+						<object class="IBToOneOutletInfo" key="aText">
+							<string key="name">aText</string>
+							<string key="candidateClassName">UITextField</string>
+						</object>
+						<object class="IBToOneOutletInfo" key="bText">
+							<string key="name">bText</string>
+							<string key="candidateClassName">UITextField</string>
+						</object>
+						<object class="IBToOneOutletInfo" key="calculateButton">
+							<string key="name">calculateButton</string>
+							<string key="candidateClassName">UIButton</string>
+						</object>
+						<object class="IBToOneOutletInfo" key="resultLabel">
+							<string key="name">resultLabel</string>
+							<string key="candidateClassName">UILabel</string>
+						</object>
+					</dictionary>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBProjectSource</string>
+						<string key="minorKey">./Classes/NRViewController.h</string>
+					</object>
+				</object>
+			</array>
+		</object>
+		<int key="IBDocument.localizationMode">0</int>
+		<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaTouchFramework</string>
+		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string>
+			<real value="0.0" key="NS.object.0"/>
+		</object>
+		<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
+		<int key="IBDocument.defaultPropertyAccessControl">3</int>
+		<string key="IBCocoaTouchPluginVersion">1498</string>
+	</data>
+</archive>
diff --git a/examples/cross_calculator/ios/scripts/tags.sh b/examples/cross_calculator/ios/scripts/tags.sh
new file mode 100755
index 000000000..111e7a1c0
--- /dev/null
+++ b/examples/cross_calculator/ios/scripts/tags.sh
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+if [ ! -d src ]
+then
+	cd ..
+fi
+
+if [ -d src ]
+then
+	~/bin/objctags -R \
+		build/nimcache \
+		src
+fi
diff --git a/examples/cross_calculator/ios/scripts/xcode_prebuild.sh b/examples/cross_calculator/ios/scripts/xcode_prebuild.sh
new file mode 100755
index 000000000..7626ba0b9
--- /dev/null
+++ b/examples/cross_calculator/ios/scripts/xcode_prebuild.sh
@@ -0,0 +1,36 @@
+#!/bin/sh
+
+# Set this to the full path of your nimrod compiler
+# since Xcode doesn't inherit your user environment.
+PATH_TO_NIMROD=~/project/nimrod/bin/nimrod
+# Set this to the location of the nimbase.h file so
+# the script can update it if it changes.
+PATH_TO_NIMBASE=~/project/nimrod/lib/nimbase.h
+
+# Force errors to fail script.
+set -e
+
+# If we are running from inside the scripts subdir, get out.
+if [ ! -d src ]
+then
+	cd ..
+fi
+
+DEST_NIMBASE=build/nimcache/nimbase.h
+
+# Ok, are we out now?
+if [ -d src ]
+then
+	# You may want to use a wildcard here to compile all nimrod files.
+	$PATH_TO_NIMROD objc --noMain  --app:lib \
+		--nimcache:build/nimcache --compileOnly \
+		--header --cpu:i386 ../nimrod_backend/backend.nim
+	if [ "${PATH_TO_NIMBASE}" -nt "${DEST_NIMBASE}" ]
+	then
+		echo "Updating nimbase.h"
+		cp "${PATH_TO_NIMBASE}" "${DEST_NIMBASE}"
+	fi
+else
+	echo "Uh oh, src directory not found?"
+	exit 1
+fi
diff --git a/examples/cross_calculator/ios/src/AppDelegate.h b/examples/cross_calculator/ios/src/AppDelegate.h
new file mode 100644
index 000000000..a5a8b3852
--- /dev/null
+++ b/examples/cross_calculator/ios/src/AppDelegate.h
@@ -0,0 +1,7 @@
+#import <UIKit/UIKit.h>
+
+@interface AppDelegate : UIResponder <UIApplicationDelegate>
+
+@property (strong, nonatomic) UIWindow *window;
+
+@end
diff --git a/examples/cross_calculator/ios/src/AppDelegate.m b/examples/cross_calculator/ios/src/AppDelegate.m
new file mode 100644
index 000000000..53e7f6188
--- /dev/null
+++ b/examples/cross_calculator/ios/src/AppDelegate.m
@@ -0,0 +1,39 @@
+#import "AppDelegate.h"
+
+#import "NRViewController.h"
+
+
+@interface AppDelegate ()
+@property (nonatomic, retain) NRViewController *viewController;
+@end
+
+
+@implementation AppDelegate
+
+@synthesize viewController = _viewController;
+@synthesize window = _window;
+
+- (BOOL)application:(UIApplication *)application
+	didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
+{
+	self.window = [[[UIWindow alloc]
+		initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
+
+	self.viewController = [[NRViewController new] autorelease];
+	if ([self.window respondsToSelector:@selector(setRootViewController:)])
+		self.window.rootViewController = self.viewController;
+	else
+		[self.window addSubview:self.viewController.view];
+	[self.window makeKeyAndVisible];
+
+	return YES;
+}
+
+- (void)dealloc
+{
+	[_window release];
+	[_viewController release];
+	[super dealloc];
+}
+
+@end
diff --git a/examples/cross_calculator/ios/src/NRViewController.h b/examples/cross_calculator/ios/src/NRViewController.h
new file mode 100644
index 000000000..36ba37758
--- /dev/null
+++ b/examples/cross_calculator/ios/src/NRViewController.h
@@ -0,0 +1,11 @@
+@interface NRViewController : UIViewController
+
+@property (nonatomic, retain) IBOutlet UIButton *calculateButton;
+@property (nonatomic, retain) IBOutlet UITextField *aText;
+@property (nonatomic, retain) IBOutlet UITextField *bText;
+@property (nonatomic, retain) IBOutlet UILabel *resultLabel;
+
+- (IBAction)calculateButtonTouched;
+- (IBAction)backgroundTouched;
+
+@end
\ No newline at end of file
diff --git a/examples/cross_calculator/ios/src/NRViewController.m b/examples/cross_calculator/ios/src/NRViewController.m
new file mode 100644
index 000000000..bd0df7d6b
--- /dev/null
+++ b/examples/cross_calculator/ios/src/NRViewController.m
@@ -0,0 +1,210 @@
+#import "NRViewController.h"
+
+#import "backend.h"
+
+
+@implementation NRViewController
+
+@synthesize aText = _aText;
+@synthesize bText = _bText;
+@synthesize calculateButton = _calculateButton;
+@synthesize resultLabel = _resultLabel;
+
+- (void)dealloc
+{
+	[_aText release];
+	[_bText release];
+	[_calculateButton release];
+	[_resultLabel release];
+	[super dealloc];
+}
+
+- (void)viewDidUnload
+{
+	self.calculateButton = nil;
+	self.aText = nil;
+	self.bText = nil;
+	self.resultLabel = nil;
+	[super viewDidUnload];
+}
+
+- (BOOL)shouldAutorotateToInterfaceOrientation:
+	(UIInterfaceOrientation)interfaceOrientation
+{
+	return YES;
+}
+
+/// User wants to calculate the inputs. Well, do it!
+- (IBAction)calculateButtonTouched
+{
+	// Dismiss all keyboards.
+	[self backgroundTouched];
+
+	// Call nimrod code, store the result and display it.
+	const int a = [self.aText.text intValue];
+	const int b = [self.bText.text intValue];
+	const int c = myAdd(a, b);
+	self.resultLabel.text = [NSString stringWithFormat:@"%d + %d = %d",
+		a, b, c];
+}
+
+/// If the user touches the background, dismiss any visible keyboard.
+- (IBAction)backgroundTouched
+{
+	[self.aText resignFirstResponder];
+	[self.bText resignFirstResponder];
+}
+
+/** Custom loadView method for backwards compatiblity.
+ * Unfortunately I've been unable to coerce Xcode 4.4 to generate nib files
+ * which are compatible with my trusty iOS 3.0 ipod touch so in order to be
+ * fully compatible for all devices we have to build the interface manually in
+ * code rather than through the keyed archivers provided by the interface
+ * builder.
+ *
+ * Rather than recreating the user interface manually in code the tool nib2obj
+ * was used on the xib file and slightly modified to fit the original property
+ * names. Which means here is a lot of garbage you would never write in real
+ * life. Please ignore the following "wall of code" for the purposes of
+ * learning Nimrod, this is all just because Apple can't be bothered to
+ * maintain backwards compatibility properly.
+ */
+- (void)loadView
+{
+	[super loadView];
+
+	self.calculateButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
+	self.calculateButton.autoresizesSubviews = YES;
+	self.calculateButton.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin;
+	self.calculateButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;
+	self.calculateButton.contentStretch = CGRectFromString(@"{{0, 0}, {1, 1}}");
+	self.calculateButton.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
+	self.calculateButton.frame = CGRectMake(193.0, 124.0, 107.0, 37.0);
+	self.calculateButton.tag = 5;
+	[self.calculateButton setTitle:@"Add!" forState:UIControlStateNormal];
+	[self.calculateButton addTarget:self
+		action:@selector(calculateButtonTouched)
+		forControlEvents:UIControlEventTouchUpInside];
+
+	UILabel *label11 = [[UILabel alloc] initWithFrame:CGRectMake(20.0, 124.0, 60.0, 37.0)];
+	label11.adjustsFontSizeToFitWidth = YES;
+	label11.autoresizesSubviews = YES;
+	label11.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin;
+	label11.contentStretch = CGRectFromString(@"{{0, 0}, {1, 1}}");
+	label11.frame = CGRectMake(20.0, 124.0, 60.0, 37.0);
+	label11.tag = 6;
+	label11.text = @"Result:";
+
+	UILabel *label4 = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 34.0)];
+	label4.adjustsFontSizeToFitWidth = YES;
+	label4.autoresizesSubviews = YES;
+	label4.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleBottomMargin;
+	label4.contentStretch = CGRectFromString(@"{{0, 0}, {1, 1}}");
+	label4.frame = CGRectMake(0.0, 0.0, 320.0, 34.0);
+	label4.tag = 2;
+	label4.text = @"Nimrod Crossplatform Calculator";
+	label4.textAlignment = UITextAlignmentCenter;
+
+	UIButton *background_button = [UIButton buttonWithType:UIButtonTypeCustom];
+	background_button.autoresizesSubviews = YES;
+	background_button.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin;
+	background_button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;
+	background_button.contentStretch = CGRectFromString(@"{{0, 0}, {1, 1}}");
+	background_button.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
+	background_button.frame = CGRectMake(0.0, -10.0, 320.0, 480.0);
+	background_button.tag = 1;
+	[background_button addTarget:self action:@selector(backgroundTouched)
+		forControlEvents:UIControlEventTouchDown];
+
+	self.resultLabel = [[[UILabel alloc] initWithFrame:CGRectMake(88.0, 124.0, 97.0, 37.0)] autorelease];
+	self.resultLabel.adjustsFontSizeToFitWidth = YES;
+	self.resultLabel.autoresizesSubviews = YES;
+	self.resultLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin;
+	self.resultLabel.contentStretch = CGRectFromString(@"{{0, 0}, {1, 1}}");
+	self.resultLabel.frame = CGRectMake(88.0, 124.0, 97.0, 37.0);
+	self.resultLabel.tag = 7;
+	self.resultLabel.text = @"";
+
+	self.aText = [[[UITextField alloc] initWithFrame:CGRectMake(193.0, 42.0, 107.0, 31.0)] autorelease];
+	self.aText.adjustsFontSizeToFitWidth = YES;
+	self.aText.autocapitalizationType = UITextAutocapitalizationTypeNone;
+	self.aText.autocorrectionType = UITextAutocorrectionTypeDefault;
+	self.aText.autoresizesSubviews = YES;
+	self.aText.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin;
+	self.aText.borderStyle = UITextBorderStyleRoundedRect;
+	self.aText.clearButtonMode = UITextFieldViewModeWhileEditing;
+	self.aText.clearsOnBeginEditing = NO;
+	self.aText.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
+	self.aText.contentStretch = CGRectFromString(@"{{0, 0}, {1, 1}}");
+	self.aText.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
+	self.aText.enablesReturnKeyAutomatically = NO;
+	self.aText.frame = CGRectMake(193.0, 42.0, 107.0, 31.0);
+	self.aText.keyboardAppearance = UIKeyboardAppearanceDefault;
+	self.aText.keyboardType = UIKeyboardTypeNumberPad;
+	self.aText.placeholder = @"Integer";
+	self.aText.returnKeyType = UIReturnKeyDefault;
+	self.aText.tag = 8;
+	self.aText.text = @"";
+	self.aText.textAlignment = UITextAlignmentCenter;
+
+	UILabel *label7 = [[UILabel alloc] initWithFrame:CGRectMake(20.0, 42.0, 165.0, 31.0)];
+	label7.adjustsFontSizeToFitWidth = YES;
+	label7.autoresizesSubviews = YES;
+	label7.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin;
+	label7.contentStretch = CGRectFromString(@"{{0, 0}, {1, 1}}");
+	label7.frame = CGRectMake(20.0, 42.0, 165.0, 31.0);
+	label7.tag = 3;
+	label7.text = @"Value A:";
+
+	UILabel *label8 = [[UILabel alloc] initWithFrame:CGRectMake(20.0, 81.0, 165.0, 31.0)];
+	label8.adjustsFontSizeToFitWidth = YES;
+	label8.autoresizesSubviews = YES;
+	label8.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin;
+	label8.contentStretch = CGRectFromString(@"{{0, 0}, {1, 1}}");
+	label8.frame = CGRectMake(20.0, 81.0, 165.0, 31.0);
+	label8.tag = 4;
+	label8.text = @"Value B:";
+
+	self.bText = [[[UITextField alloc]
+		initWithFrame:CGRectMake(193.0, 81.0, 107.0, 31.0)] autorelease];
+	self.bText.adjustsFontSizeToFitWidth = YES;
+	self.bText.autocapitalizationType = UITextAutocapitalizationTypeNone;
+	self.bText.autocorrectionType = UITextAutocorrectionTypeDefault;
+	self.bText.autoresizesSubviews = YES;
+	self.bText.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin;
+	self.bText.borderStyle = UITextBorderStyleRoundedRect;
+	self.bText.clearButtonMode = UITextFieldViewModeWhileEditing;
+	self.bText.clearsOnBeginEditing = NO;
+	self.bText.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
+	self.bText.contentStretch = CGRectFromString(@"{{0, 0}, {1, 1}}");
+	self.bText.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
+	self.bText.enablesReturnKeyAutomatically = NO;
+	self.bText.frame = CGRectMake(193.0, 81.0, 107.0, 31.0);
+	self.bText.keyboardAppearance = UIKeyboardAppearanceDefault;
+	self.bText.keyboardType = UIKeyboardTypeNumberPad;
+	self.bText.placeholder = @"Integer";
+	self.bText.returnKeyType = UIReturnKeyDefault;
+	self.bText.tag = 9;
+	self.bText.text = @"";
+	self.bText.textAlignment = UITextAlignmentCenter;
+
+	self.view.frame = CGRectMake(0.0, 20.0, 320.0, 460.0);
+	self.view.autoresizesSubviews = YES;
+	self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
+	self.view.backgroundColor = [UIColor colorWithWhite:1.000 alpha:1.000];
+	self.view.contentStretch = CGRectFromString(@"{{0, 0}, {1, 1}}");
+	self.view.frame = CGRectMake(0.0, 20.0, 320.0, 460.0);
+	self.view.tag = 0;
+
+	[self.view addSubview:background_button];
+	[self.view addSubview:label4];
+	[self.view addSubview:label7];
+	[self.view addSubview:label8];
+	[self.view addSubview:self.calculateButton];
+	[self.view addSubview:label11];
+	[self.view addSubview:self.resultLabel];
+	[self.view addSubview:self.aText];
+	[self.view addSubview:self.bText];
+}
+
+@end
diff --git a/examples/cross_calculator/ios/src/cross-calculator-Prefix.pch b/examples/cross_calculator/ios/src/cross-calculator-Prefix.pch
new file mode 100644
index 000000000..2f331ed43
--- /dev/null
+++ b/examples/cross_calculator/ios/src/cross-calculator-Prefix.pch
@@ -0,0 +1,10 @@
+#import <Availability.h>
+
+#ifndef __IPHONE_3_0
+#warning "This project uses features only available in iOS SDK 3.0 and later."
+#endif
+
+#ifdef __OBJC__
+	#import <UIKit/UIKit.h>
+	#import <Foundation/Foundation.h>
+#endif
diff --git a/examples/cross_calculator/ios/src/main.m b/examples/cross_calculator/ios/src/main.m
new file mode 100644
index 000000000..7866684fe
--- /dev/null
+++ b/examples/cross_calculator/ios/src/main.m
@@ -0,0 +1,13 @@
+#import <UIKit/UIKit.h>
+
+#import "AppDelegate.h"
+#import "backend.h"
+
+int main(int argc, char *argv[])
+{
+	@autoreleasepool {
+		NimMain();
+		return UIApplicationMain(argc, argv, nil,
+			NSStringFromClass([AppDelegate class]));
+	}
+}
diff --git a/examples/lazarus/nimlaz.lpi b/examples/cross_calculator/lazarus/nimlaz.lpi
index 3b9abd129..3b9abd129 100755
--- a/examples/lazarus/nimlaz.lpi
+++ b/examples/cross_calculator/lazarus/nimlaz.lpi
diff --git a/examples/lazarus/nimlaz.lpr b/examples/cross_calculator/lazarus/nimlaz.lpr
index 4457209d1..4457209d1 100755
--- a/examples/lazarus/nimlaz.lpr
+++ b/examples/cross_calculator/lazarus/nimlaz.lpr
diff --git a/examples/lazarus/nimlaz.lrs b/examples/cross_calculator/lazarus/nimlaz.lrs
index 234df82bd..234df82bd 100755
--- a/examples/lazarus/nimlaz.lrs
+++ b/examples/cross_calculator/lazarus/nimlaz.lrs
diff --git a/examples/lazarus/nimlaz.rc b/examples/cross_calculator/lazarus/nimlaz.rc
index d66bb817c..d66bb817c 100644
--- a/examples/lazarus/nimlaz.rc
+++ b/examples/cross_calculator/lazarus/nimlaz.rc
diff --git a/examples/lazarus/readme.txt b/examples/cross_calculator/lazarus/readme.txt
index ec222a815..ec222a815 100755
--- a/examples/lazarus/readme.txt
+++ b/examples/cross_calculator/lazarus/readme.txt
diff --git a/examples/lazarus/unit1.lfm b/examples/cross_calculator/lazarus/unit1.lfm
index bf60ff715..bf60ff715 100755
--- a/examples/lazarus/unit1.lfm
+++ b/examples/cross_calculator/lazarus/unit1.lfm
diff --git a/examples/lazarus/unit1.pas b/examples/cross_calculator/lazarus/unit1.pas
index aa0ef6cf7..aa0ef6cf7 100755
--- a/examples/lazarus/unit1.pas
+++ b/examples/cross_calculator/lazarus/unit1.pas
diff --git a/examples/lazarus/backend.nim b/examples/cross_calculator/nimrod_backend/backend.nim
index 64f0c5bf7..ffa4311f9 100755
--- a/examples/lazarus/backend.nim
+++ b/examples/cross_calculator/nimrod_backend/backend.nim
@@ -1,4 +1,4 @@
-# Backend for the Lazarus GUI

+# Backend for the different user interfaces.

 

 proc myAdd*(x, y: int): int {.cdecl, exportc.} = 

   result = x + y

diff --git a/examples/cross_calculator/readme.txt b/examples/cross_calculator/readme.txt
new file mode 100644
index 000000000..e59cb7e54
--- /dev/null
+++ b/examples/cross_calculator/readme.txt
@@ -0,0 +1,11 @@
+The cross platform calculator illustrates how to use Nimrod to create a backend

+called by different native user interfaces.

+

+Since the purpose of the example is to show how the cross platform code

+interacts with Nimrod the actual backend code is just a simple addition proc.

+By keeping your program logic in Nimrod you can easily reuse it in different

+platforms.

+

+To avoid duplication of code, the backend code lies in a separate directory and

+each platform compiles it with a different custom build process, usually

+generating C code in a temporary build directory.