<pre style='margin:0'>
Mihai Moldovan (Ionic) pushed a commit to branch master
in repository macports-ports.
</pre>
<p><a href="https://github.com/macports/macports-ports/commit/3c41e9203c65aa682b0d9f51efdddba222232776">https://github.com/macports/macports-ports/commit/3c41e9203c65aa682b0d9f51efdddba222232776</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'> new 3c41e92 net/openssh: (hopefully) fix build failures on 10.7-. Round five.
</span>3c41e92 is described below
<span style='display:block; white-space:pre;color:#808000;'>commit 3c41e9203c65aa682b0d9f51efdddba222232776
</span>Author: Mihai Moldovan <ionic@ionic.de>
AuthorDate: Fri Oct 25 20:55:09 2019 +0200
<span style='display:block; white-space:pre;color:#404040;'> net/openssh: (hopefully) fix build failures on 10.7-. Round five.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> The new Keychain integration code uses Object Subscripting, a newer
</span><span style='display:block; white-space:pre;color:#404040;'> feature requiring explicit compiler and library support.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> We can provide an implementation for the affected NS types directly, but
</span><span style='display:block; white-space:pre;color:#404040;'> also need to make sure that a suitable compiler is chosen.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> That means either Apple LLVM 4.0 (>= 421) or FOSS clang/llvm 3.1. Since
</span><span style='display:block; white-space:pre;color:#404040;'> all older versions of clang/llvm were evicted from MacPorts a while ago,
</span><span style='display:block; white-space:pre;color:#404040;'> any macports-clang version will do nowadays.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> No revbump since this only fixes build failures.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> Fixes: https://trac.macports.org/ticket/59397
</span>---
net/openssh/Portfile | 18 ++++
...-Apple-keychain-integration-other-changes.patch | 119 +++++++++++++++++----
2 files changed, 119 insertions(+), 18 deletions(-)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/net/openssh/Portfile b/net/openssh/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index e5f1217..dc4cdff 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/net/openssh/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/net/openssh/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2,6 +2,8 @@
</span>
PortSystem 1.0
<span style='display:block; white-space:pre;background:#e0ffe0;'>+PortGroup compiler_blacklist_versions 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> name openssh
version 8.1p1
revision 1
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -102,6 +104,22 @@ if {${name} eq ${subport}} {
</span>
use_parallel_build yes
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ platform macosx {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {${os.major} <= 11} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # clang is required to build the new Apple Keychain integration due
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # to it using the Object Subscripting feature, c.f. #59397.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # We'll keep it simple and just blacklist any gcc version, cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # (which could be anything), system clang versions prior to those
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # shipped with Xcode 4.4.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Regarding the macports-clang versions, any version in the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # MacPorts tree should suit our needs, since the clang
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # documentation lists FOSS clang/llvm 3.1 as the first version to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # support Object Subscripting and the oldest version in our tree is
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # now 3.3.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ compiler.blacklist-append *gcc* cc {clang < 421}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> destroot.target install-nokeys
test.run yes
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/net/openssh/files/0002-Apple-keychain-integration-other-changes.patch b/net/openssh/files/0002-Apple-keychain-integration-other-changes.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index 028f201..32561ad 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/net/openssh/files/0002-Apple-keychain-integration-other-changes.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/net/openssh/files/0002-Apple-keychain-integration-other-changes.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,6 +1,6 @@
</span> --- /dev/null 1970-01-01 00:00:00.000000000 +0000
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/keychain.m 2019-10-25 03:54:31.000000000 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -0,0 +1,274 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/keychain.m 2019-10-25 20:01:20.000000000 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,290 @@
</span> +/*
+ * Copyright (c) 2007-2016 Apple Inc. All rights reserved.
+ *
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -79,6 +79,22 @@
</span> +#include "openbsd-compat/openbsd-compat.h"
+#include "log.h"
+
<span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This code uses Object Subscripting, a new ObjC feature requiring explicit
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * compiler and library support.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * OS X 10.7- don't support that out of the box, but it's possible to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * emulate the behavior on older systems by providing an implementation and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * a more recent clang compiler.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * We can provide the implementation directly and will do that, MacPorts'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * compiler selection will have to do the second part.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Yes, importing an implementation is weird, but I'd rather keep the emulation
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * layer separate.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#import "macos-object-subscripting.m"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span> +char *keychain_read_passphrase(const char *filename)
+{
+ OSStatus ret = errSecSuccess;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -276,7 +292,7 @@
</span> + return ret;
+}
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/keychain.h 2019-10-25 02:33:21.000000000 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/keychain.h 2019-10-25 19:44:43.000000000 +0200
</span> @@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2007-2016 Apple Inc. All rights reserved.
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -315,7 +331,7 @@
</span> +char *keychain_read_passphrase(const char *filename);
+int load_identities_from_keychain(int (^add_identity)(const char *identity));
--- a/Makefile.in 2019-10-09 02:31:03.000000000 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/Makefile.in 2019-10-25 02:33:21.000000000 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/Makefile.in 2019-10-25 19:44:43.000000000 +0200
</span> @@ -41,6 +41,7 @@ PATHS= -DSSHDIR=\"$(sysconfdir)\" \
CC=@CC@
LD=@LD@
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -386,7 +402,7 @@
</span> ssh-keygen$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-keygen.o sshsig.o
$(LD) -o $@ ssh-keygen.o sshsig.o $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS)
--- a/audit-bsm.c 2019-10-09 02:31:03.000000000 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/audit-bsm.c 2019-10-25 02:33:21.000000000 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/audit-bsm.c 2019-10-25 19:44:43.000000000 +0200
</span> @@ -62,6 +62,18 @@
#include <bsm/audit_record.h>
#include <locale.h>
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -427,7 +443,7 @@
</span> info.ai_auid = the_authctxt->pw->pw_uid;
else
--- a/configure.ac 2019-10-09 02:31:03.000000000 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/configure.ac 2019-10-25 02:33:21.000000000 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/configure.ac 2019-10-25 19:44:43.000000000 +0200
</span> @@ -20,6 +20,7 @@ AC_LANG([C])
AC_CONFIG_HEADER([config.h])
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -489,7 +505,7 @@
</span> dnl Add now.
CFLAGS="$CFLAGS $werror_flags"
--- a/groupaccess.c 2019-10-09 02:31:03.000000000 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/groupaccess.c 2019-10-25 02:33:21.000000000 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/groupaccess.c 2019-10-25 19:44:43.000000000 +0200
</span> @@ -39,6 +39,10 @@
#include "match.h"
#include "log.h"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -529,7 +545,7 @@
</span> for (i = 0, j = 0; i < ngroups; i++)
if ((gr = getgrgid(groups_bygid[i])) != NULL)
--- a/readconf.c 2019-10-09 02:31:03.000000000 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/readconf.c 2019-10-25 02:33:21.000000000 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/readconf.c 2019-10-25 19:44:43.000000000 +0200
</span> @@ -167,6 +167,9 @@ typedef enum {
oHashKnownHosts,
oTunnel, oTunnelDevice,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -586,7 +602,7 @@
</span>
struct fwdarg {
--- a/readconf.h 2019-10-09 02:31:03.000000000 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/readconf.h 2019-10-25 02:33:21.000000000 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/readconf.h 2019-10-25 19:44:43.000000000 +0200
</span> @@ -137,6 +137,9 @@ typedef struct {
char *local_command;
int permit_local_command;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -598,7 +614,7 @@
</span>
int request_tty;
--- a/session.c 2019-10-09 02:31:03.000000000 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/session.c 2019-10-25 02:33:21.000000000 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/session.c 2019-10-25 19:44:43.000000000 +0200
</span> @@ -1185,6 +1185,21 @@ do_setup_env(struct ssh *ssh, Session *s
child_set_env(&env, &envsize, "SSH_ORIGINAL_COMMAND",
original_command);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -622,7 +638,7 @@
</span> /* dump the environment */
fprintf(stderr, "Environment:\n");
--- a/ssh-add.0 2019-10-09 02:39:14.000000000 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/ssh-add.0 2019-10-25 02:33:21.000000000 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/ssh-add.0 2019-10-25 19:44:43.000000000 +0200
</span> @@ -4,7 +4,7 @@ NAME
ssh-add M-bM-^@M-^S adds private key identities to the authentication agent
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -654,7 +670,7 @@
</span> plain private keys only and skip certificates.
--- a/ssh-add.1 2019-10-09 02:31:03.000000000 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/ssh-add.1 2019-10-25 02:33:21.000000000 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/ssh-add.1 2019-10-25 19:44:43.000000000 +0200
</span> @@ -43,7 +43,7 @@
.Nd adds private key identities to the authentication agent
.Sh SYNOPSIS
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -686,7 +702,7 @@
</span> When loading keys into or deleting keys from the agent, process plain private
keys only and skip certificates.
--- a/ssh-add.c 2019-10-09 02:31:03.000000000 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/ssh-add.c 2019-10-25 02:33:21.000000000 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/ssh-add.c 2019-10-25 19:44:43.000000000 +0200
</span> @@ -67,6 +67,11 @@
#include "ssherr.h"
#include "digest.h"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -763,7 +779,7 @@
</span>
int
--- a/ssh-agent.c 2019-10-09 02:31:03.000000000 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/ssh-agent.c 2019-10-25 02:33:21.000000000 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/ssh-agent.c 2019-10-25 19:44:43.000000000 +0200
</span> @@ -70,6 +70,10 @@
#include <time.h>
#include <string.h>
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -915,7 +931,7 @@
</span> parent_alive_interval = 10;
idtab_init();
--- a/sshconnect2.c 2019-10-09 02:31:03.000000000 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/sshconnect2.c 2019-10-25 02:33:21.000000000 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/sshconnect2.c 2019-10-25 19:44:43.000000000 +0200
</span> @@ -73,6 +73,11 @@
#include "ssherr.h"
#include "utf8.h"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -957,7 +973,7 @@
</span> !(id->key && id->isprivate))
maybe_add_key_to_agent(id->filename, private, comment,
--- a/ssh-agent.0 2019-10-09 02:39:14.000000000 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/ssh-agent.0 2019-10-25 02:33:21.000000000 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/ssh-agent.0 2019-10-25 19:44:43.000000000 +0200
</span> @@ -7,6 +7,7 @@ SYNOPSIS
ssh-agent [-c | -s] [-Dd] [-a bind_address] [-E fingerprint_hash]
[-P pkcs11_whitelist] [-t life] [command [arg ...]]
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -977,7 +993,7 @@
</span> agent. When the command dies, so does the agent.
--- a/ssh-agent.1 2019-10-09 02:31:03.000000000 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/ssh-agent.1 2019-10-25 02:33:21.000000000 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/ssh-agent.1 2019-10-25 19:44:43.000000000 +0200
</span> @@ -52,6 +52,8 @@
.Nm ssh-agent
.Op Fl c | s
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -999,7 +1015,7 @@
</span> .Pp
If a command line is given, this is executed as a subprocess of the agent.
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/SecItemPriv-shim.h 2019-10-25 04:58:27.000000000 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/SecItemPriv-shim.h 2019-10-25 19:44:43.000000000 +0200
</span> @@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2006-2013 Apple Inc. All Rights Reserved.
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1106,3 +1122,70 @@
</span> +__END_DECLS
+
+#endif /* !_SECURITY_SECITEMPRIV_H_ */
<span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/macos-object-subscripting.m 2019-10-25 19:57:45.000000000 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,64 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2017-2019 Mihai Moldovan <ionic@ionic.de>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Redistribution and use in source and binary forms, with or without
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * modification, are permitted provided that the following conditions
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * are met:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * 1. Redistributions of source code must retain the above copyright
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * notice, this list of conditions and the following disclaimer.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * 2. Redistributions in binary form must reproduce the above copyright
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * notice, this list of conditions and the following disclaimer in the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * documentation and/or other materials provided with the distribution.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * 3. Neither the name of the authors nor the names of its
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * contributors may be used to endorse or promote products derived from
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * this software without specific prior written permission.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <AvailabilityMacros.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if ((!(defined (MAC_OS_X_VERSION_10_7))) || (MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_7))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@implementation NSArray (SubscriptingAdditions)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (id)objectAtIndexedSubscript:(NSUInteger)index
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return [self objectAtIndex:index];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@end
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@implementation NSMutableArray (SubscriptingAdditions)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)setObject:(id)object atIndexedSubscript:(NSUInteger)index
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (index == [self count])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ [self addObject:object];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ [self replaceObjectAtIndex:index withObject:object];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@end
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@implementation NSDictionary (SubscriptingAdditions)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (id)objectForKeyedSubscript:(id)key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return [self objectForKey:key];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@end
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@implementation NSMutableDictionary (SubscriptingAdditions)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)setObject:(id)object forKeyedSubscript:(id)key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ [self setObject:object forKey:key];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@end
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* ((!(defined (MAC_OS_X_VERSION_10_7))) || (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7)) */
</span></pre><pre style='margin:0'>
</pre>