From 94bd6adeb9d24bce91cca7e2e60c6dd42de952b8 Mon Sep 17 00:00:00 2001
From: CaS
Date: Thu, 23 Jan 2003 10:51:51 +0000
Subject: [PATCH] Separate out additions documentation.
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@15683 72102866-910b-0410-8b05-ffd578937521
---
ChangeLog | 9 +
Documentation/Base.gsdoc | 4 +-
Documentation/BaseAdditions.gsdoc | 31 +++
Headers/gnustep/base/GSCategories.h | 8 +
Source/Additions/GSCategories.m | 284 ++++++++++++++++++++++++++
Source/Additions/GSMime.m | 303 ++--------------------------
Source/DocMakefile | 69 +++++--
7 files changed, 410 insertions(+), 298 deletions(-)
create mode 100644 Documentation/BaseAdditions.gsdoc
diff --git a/ChangeLog b/ChangeLog
index 304f84d1f..275024308 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2003-01-23 Richard Frith-Macdonald
+
+ * Documentation/Base.gsdoc: Refer to additions.
+ * Documentation/BaseAdditions.gsdoc: New intorduction for additions
+ * Headers/gnustep/base/GSCategories.h: Added MD5Digest NSData method
+ * Source/DocMakefile: Build additions documentation separately
+ * Source/Additions/GSCategories.m: Added MD5Digest NSData method
+ * Source/Additions/GSMime.m: Use MD5Digest NSData method.
+
2003-01-22 Richard Frith-Macdonald
* Source/Additions/GSMime.m: ifdefed out my last change ...not sure
diff --git a/Documentation/Base.gsdoc b/Documentation/Base.gsdoc
index 779333d01..df9349c20 100644
--- a/Documentation/Base.gsdoc
+++ b/Documentation/Base.gsdoc
@@ -16,7 +16,9 @@
The GNUstep base library is a free software package implementing
the API of the OpenStep Foundation Kit (tm), including later
- additions.
+ additions. This documentation package describes the core of the
+ base library, for documentation on additional classes, see the
+ BaseAdditions documentation package.
diff --git a/Documentation/BaseAdditions.gsdoc b/Documentation/BaseAdditions.gsdoc
new file mode 100644
index 000000000..39fc0dca1
--- /dev/null
+++ b/Documentation/BaseAdditions.gsdoc
@@ -0,0 +1,31 @@
+
+
+
+
+ GNUstep Base Additions
+
+
+
+
+ $Revision$
+ $Date$
+
+
+
+ Base Additions
+
+ The GNUstep base additions package comes with the GNUstep base
+ package, and provides additional non-standard classes and
+ additional features for standard classes. It is also intended
+ to be built standalone for use on systems where the GNUstep
+ base is not installed, but where an alernative Foundation is
+ available.
+
+
+
+
+
+
+
+
+
diff --git a/Headers/gnustep/base/GSCategories.h b/Headers/gnustep/base/GSCategories.h
index 571fbb165..8c9f40ddd 100644
--- a/Headers/gnustep/base/GSCategories.h
+++ b/Headers/gnustep/base/GSCategories.h
@@ -34,5 +34,13 @@
@end
+
+
+@interface NSData (GSCategories)
+
+- (NSData*) MD5Digest;
+
+@end
+
#endif /* NO_GNUSTEP */
#endif /* INCLUDED_GS_CATEGORIES_H */
diff --git a/Source/Additions/GSCategories.m b/Source/Additions/GSCategories.m
index 07e2fde22..dcab37e08 100644
--- a/Source/Additions/GSCategories.m
+++ b/Source/Additions/GSCategories.m
@@ -86,3 +86,287 @@
}
@end
+
+
+
+/**
+ * Extension methods for the NSData class
+ */
+@implementation NSData (GSCategories)
+
+struct MD5Context
+{
+ unsigned long buf[4];
+ unsigned long bits[2];
+ unsigned char in[64];
+};
+static void MD5Init (struct MD5Context *context);
+static void MD5Update (struct MD5Context *context, unsigned char const *buf,
+unsigned len);
+static void MD5Final (unsigned char digest[16], struct MD5Context *context);
+static void MD5Transform (unsigned long buf[4], unsigned long const in[16]);
+
+/*
+ * This code implements the MD5 message-digest algorithm.
+ * The algorithm is due to Ron Rivest. This code was
+ * written by Colin Plumb in 1993, no copyright is claimed.
+ * This code is in the public domain; do with it what you wish.
+ *
+ * Equivalent code is available from RSA Data Security, Inc.
+ * This code has been tested against that, and is equivalent,
+ * except that you don't need to include two pages of legalese
+ * with every copy.
+ *
+ * To compute the message digest of a chunk of bytes, declare an
+ * MD5Context structure, pass it to MD5Init, call MD5Update as
+ * needed on buffers full of bytes, and then call MD5Final, which
+ * will fill a supplied 16-byte array with the digest.
+ */
+
+/*
+ * Ensure data is little-endian
+ */
+static void littleEndian (void *buf, unsigned longs)
+{
+ unsigned long *ptr = (unsigned long*)buf;
+ do
+ {
+ *ptr = NSSwapHostLongToLittle(*ptr);
+ ptr++;
+ }
+ while (--longs);
+}
+
+/*
+ * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious
+ * initialization constants.
+ */
+static void MD5Init (struct MD5Context *ctx)
+{
+ ctx->buf[0] = 0x67452301;
+ ctx->buf[1] = 0xefcdab89;
+ ctx->buf[2] = 0x98badcfe;
+ ctx->buf[3] = 0x10325476;
+
+ ctx->bits[0] = 0;
+ ctx->bits[1] = 0;
+}
+
+/*
+ * Update context to reflect the concatenation of another buffer full
+ * of bytes.
+ */
+static void MD5Update (struct MD5Context *ctx, unsigned char const *buf,
+ unsigned len)
+{
+ unsigned long t;
+
+ /* Update bitcount */
+
+ t = ctx->bits[0];
+ if ((ctx->bits[0] = t + ((unsigned long) len << 3)) < t)
+ ctx->bits[1]++; /* Carry from low to high */
+ ctx->bits[1] += len >> 29;
+
+ t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */
+
+ /* Handle any leading odd-sized chunks */
+
+ if (t)
+ {
+ unsigned char *p = (unsigned char *) ctx->in + t;
+
+ t = 64 - t;
+ if (len < t)
+ {
+ memcpy (p, buf, len);
+ return;
+ }
+ memcpy (p, buf, t);
+ littleEndian (ctx->in, 16);
+ MD5Transform (ctx->buf, (unsigned long *) ctx->in);
+ buf += t;
+ len -= t;
+ }
+ /* Process data in 64-byte chunks */
+
+ while (len >= 64)
+ {
+ memcpy (ctx->in, buf, 64);
+ littleEndian (ctx->in, 16);
+ MD5Transform (ctx->buf, (unsigned long *) ctx->in);
+ buf += 64;
+ len -= 64;
+ }
+
+ /* Handle any remaining bytes of data. */
+
+ memcpy (ctx->in, buf, len);
+}
+
+/*
+ * Final wrapup - pad to 64-byte boundary with the bit pattern
+ * 1 0* (64-bit count of bits processed, MSB-first)
+ */
+static void MD5Final (unsigned char digest[16], struct MD5Context *ctx)
+{
+ unsigned count;
+ unsigned char *p;
+
+ /* Compute number of bytes mod 64 */
+ count = (ctx->bits[0] >> 3) & 0x3F;
+
+ /* Set the first char of padding to 0x80. This is safe since there is
+ always at least one byte free */
+ p = ctx->in + count;
+ *p++ = 0x80;
+
+ /* Bytes of padding needed to make 64 bytes */
+ count = 64 - 1 - count;
+
+ /* Pad out to 56 mod 64 */
+ if (count < 8)
+ {
+ /* Two lots of padding: Pad the first block to 64 bytes */
+ memset (p, 0, count);
+ littleEndian (ctx->in, 16);
+ MD5Transform (ctx->buf, (unsigned long *) ctx->in);
+
+ /* Now fill the next block with 56 bytes */
+ memset (ctx->in, 0, 56);
+ }
+ else
+ {
+ /* Pad block to 56 bytes */
+ memset (p, 0, count - 8);
+ }
+ littleEndian (ctx->in, 14);
+
+ /* Append length in bits and transform */
+ ((unsigned long *) ctx->in)[14] = ctx->bits[0];
+ ((unsigned long *) ctx->in)[15] = ctx->bits[1];
+
+ MD5Transform (ctx->buf, (unsigned long *) ctx->in);
+ littleEndian ((unsigned char *) ctx->buf, 4);
+ memcpy (digest, ctx->buf, 16);
+ memset (ctx, 0, sizeof (ctx)); /* In case it's sensitive */
+}
+
+/* The four core functions - F1 is optimized somewhat */
+
+/* #define F1(x, y, z) (x & y | ~x & z) */
+#define F1(x, y, z) (z ^ (x & (y ^ z)))
+#define F2(x, y, z) F1(z, x, y)
+#define F3(x, y, z) (x ^ y ^ z)
+#define F4(x, y, z) (y ^ (x | ~z))
+
+/* This is the central step in the MD5 algorithm. */
+#define MD5STEP(f, w, x, y, z, data, s) \
+ ( w += f(x, y, z) + data, w = w<>(32-s), w += x )
+
+/*
+ * The core of the MD5 algorithm, this alters an existing MD5 hash to
+ * reflect the addition of 16 longwords of new data. MD5Update blocks
+ * the data and converts bytes into longwords for this routine.
+ */
+static void MD5Transform (unsigned long buf[4], unsigned long const in[16])
+{
+ register unsigned long a, b, c, d;
+
+ a = buf[0];
+ b = buf[1];
+ c = buf[2];
+ d = buf[3];
+
+ MD5STEP (F1, a, b, c, d, in[0] + 0xd76aa478, 7);
+ MD5STEP (F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
+ MD5STEP (F1, c, d, a, b, in[2] + 0x242070db, 17);
+ MD5STEP (F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
+ MD5STEP (F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
+ MD5STEP (F1, d, a, b, c, in[5] + 0x4787c62a, 12);
+ MD5STEP (F1, c, d, a, b, in[6] + 0xa8304613, 17);
+ MD5STEP (F1, b, c, d, a, in[7] + 0xfd469501, 22);
+ MD5STEP (F1, a, b, c, d, in[8] + 0x698098d8, 7);
+ MD5STEP (F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
+ MD5STEP (F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
+ MD5STEP (F1, b, c, d, a, in[11] + 0x895cd7be, 22);
+ MD5STEP (F1, a, b, c, d, in[12] + 0x6b901122, 7);
+ MD5STEP (F1, d, a, b, c, in[13] + 0xfd987193, 12);
+ MD5STEP (F1, c, d, a, b, in[14] + 0xa679438e, 17);
+ MD5STEP (F1, b, c, d, a, in[15] + 0x49b40821, 22);
+
+ MD5STEP (F2, a, b, c, d, in[1] + 0xf61e2562, 5);
+ MD5STEP (F2, d, a, b, c, in[6] + 0xc040b340, 9);
+ MD5STEP (F2, c, d, a, b, in[11] + 0x265e5a51, 14);
+ MD5STEP (F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
+ MD5STEP (F2, a, b, c, d, in[5] + 0xd62f105d, 5);
+ MD5STEP (F2, d, a, b, c, in[10] + 0x02441453, 9);
+ MD5STEP (F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
+ MD5STEP (F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
+ MD5STEP (F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
+ MD5STEP (F2, d, a, b, c, in[14] + 0xc33707d6, 9);
+ MD5STEP (F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
+ MD5STEP (F2, b, c, d, a, in[8] + 0x455a14ed, 20);
+ MD5STEP (F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
+ MD5STEP (F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
+ MD5STEP (F2, c, d, a, b, in[7] + 0x676f02d9, 14);
+ MD5STEP (F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
+
+ MD5STEP (F3, a, b, c, d, in[5] + 0xfffa3942, 4);
+ MD5STEP (F3, d, a, b, c, in[8] + 0x8771f681, 11);
+ MD5STEP (F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
+ MD5STEP (F3, b, c, d, a, in[14] + 0xfde5380c, 23);
+ MD5STEP (F3, a, b, c, d, in[1] + 0xa4beea44, 4);
+ MD5STEP (F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
+ MD5STEP (F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
+ MD5STEP (F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
+ MD5STEP (F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
+ MD5STEP (F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
+ MD5STEP (F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
+ MD5STEP (F3, b, c, d, a, in[6] + 0x04881d05, 23);
+ MD5STEP (F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
+ MD5STEP (F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
+ MD5STEP (F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
+ MD5STEP (F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
+
+ MD5STEP (F4, a, b, c, d, in[0] + 0xf4292244, 6);
+ MD5STEP (F4, d, a, b, c, in[7] + 0x432aff97, 10);
+ MD5STEP (F4, c, d, a, b, in[14] + 0xab9423a7, 15);
+ MD5STEP (F4, b, c, d, a, in[5] + 0xfc93a039, 21);
+ MD5STEP (F4, a, b, c, d, in[12] + 0x655b59c3, 6);
+ MD5STEP (F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
+ MD5STEP (F4, c, d, a, b, in[10] + 0xffeff47d, 15);
+ MD5STEP (F4, b, c, d, a, in[1] + 0x85845dd1, 21);
+ MD5STEP (F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
+ MD5STEP (F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
+ MD5STEP (F4, c, d, a, b, in[6] + 0xa3014314, 15);
+ MD5STEP (F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
+ MD5STEP (F4, a, b, c, d, in[4] + 0xf7537e82, 6);
+ MD5STEP (F4, d, a, b, c, in[11] + 0xbd3af235, 10);
+ MD5STEP (F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
+ MD5STEP (F4, b, c, d, a, in[9] + 0xeb86d391, 21);
+
+ buf[0] += a;
+ buf[1] += b;
+ buf[2] += c;
+ buf[3] += d;
+}
+
+/**
+ * Creates an MD5 digest of the information stored in the receiver and
+ * returns it as an autoreleased 16 byte NSData object.
+ */
+- (NSData*) MD5Digest
+{
+ struct MD5Context ctx;
+ unsigned char digest[16];
+
+ MD5Init(&ctx);
+ MD5Update(&ctx, [self bytes], [self length]);
+ MD5Final(digest, &ctx);
+ return [NSData dataWithBytes: digest length: 16];
+}
+
+@end
+
+
diff --git a/Source/Additions/GSMime.m b/Source/Additions/GSMime.m
index e11e29803..9f7f27292 100644
--- a/Source/Additions/GSMime.m
+++ b/Source/Additions/GSMime.m
@@ -53,6 +53,7 @@
#include
#include
#include
+#include
#include
#include
#include "GSCompatibility.h"
@@ -61,18 +62,6 @@ static NSCharacterSet *whitespace = nil;
static NSCharacterSet *rfc822Specials = nil;
static NSCharacterSet *rfc2045Specials = nil;
-struct MD5Context
-{
- unsigned long buf[4];
- unsigned long bits[2];
- unsigned char in[64];
-};
-static void MD5Init (struct MD5Context *context);
-static void MD5Update (struct MD5Context *context, unsigned char const *buf,
-unsigned len);
-static void MD5Final (unsigned char digest[16], struct MD5Context *context);
-static void MD5Transform (unsigned long buf[4], unsigned long const in[16]);
-
/*
* Name - decodebase64()
* Purpose - Convert 4 bytes in base64 encoding to 3 bytes raw data.
@@ -89,7 +78,7 @@ static char b64[]
= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static int
-encodebase64(char * dst, const unsigned char *src, int length)
+encodebase64(char *dst, const unsigned char *src, int length)
{
int dIndex = 0;
int sIndex;
@@ -3736,34 +3725,32 @@ static NSCharacterSet *tokenSet = nil;
*
* This implementation provides base64 encoded data
* consisting of an MD5 digest of some pseudo random stuff,
- * plus an incrementing counter.
+ * plus an incrementing counter. The inclusion of the counter
+ * guarantees that we won't produce two identical strings in
+ * the same run of the program.
*
*/
- (NSString*) makeBoundary
{
static int count = 0;
- struct MD5Context ctx;
- const char *bytes;
- unsigned int i;
- unsigned char digest[20];
- unsigned char *encoded;
+ unsigned char output[20];
NSMutableData *md;
NSString *result;
+ NSData *source;
+ NSData *digest;
+ int sequence = ++count;
+
+ source = [[[NSProcessInfo processInfo] globallyUniqueString]
+ dataUsingEncoding: NSUTF8StringEncoding];
+ digest = [source MD5Digest];
+ memcpy(output, [digest bytes], 16);
+ output[16] = (sequence >> 24) & 0xff;
+ output[17] = (sequence >> 16) & 0xff;
+ output[18] = (sequence >> 8) & 0xff;
+ output[19] = sequence & 0xff;
md = [[NSMutableData alloc] initWithLength: 40];
- encoded = (unsigned char*)[md mutableBytes];
- MD5Init(&ctx);
- bytes = [[[NSProcessInfo processInfo] globallyUniqueString] lossyCString];
- MD5Update(&ctx, bytes, strlen(bytes));
- count++;
- MD5Update(&ctx, (unsigned char*)&count, sizeof(count));
- MD5Final(digest, &ctx);
- digest[16] = (count >> 24) & 0xff;
- digest[17] = (count >> 16) & 0xff;
- digest[18] = (count >> 8) & 0xff;
- digest[19] = count & 0xff;
- i = encodebase64(encoded, digest, 20);
- [md setLength: i];
+ [md setLength: encodebase64([md mutableBytes], output, 20)];
result = [[NSString alloc] initWithData: md encoding: NSASCIIStringEncoding];
return AUTORELEASE(result);
}
@@ -4304,255 +4291,3 @@ static NSCharacterSet *tokenSet = nil;
@end
-
-
-
-#include
-
-/*
- * This code implements the MD5 message-digest algorithm.
- * The algorithm is due to Ron Rivest. This code was
- * written by Colin Plumb in 1993, no copyright is claimed.
- * This code is in the public domain; do with it what you wish.
- *
- * Equivalent code is available from RSA Data Security, Inc.
- * This code has been tested against that, and is equivalent,
- * except that you don't need to include two pages of legalese
- * with every copy.
- *
- * To compute the message digest of a chunk of bytes, declare an
- * MD5Context structure, pass it to MD5Init, call MD5Update as
- * needed on buffers full of bytes, and then call MD5Final, which
- * will fill a supplied 16-byte array with the digest.
- */
-#include /* for memcpy() */
-
-/*
- * Ensure data is little-endian
- */
-static void littleEndian (void *buf, unsigned longs)
-{
- unsigned long *ptr = (unsigned long*)buf;
- do
- {
- *ptr = NSSwapHostLongToLittle(*ptr);
- ptr++;
- }
- while (--longs);
-}
-
-/*
- * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious
- * initialization constants.
- */
-static void MD5Init (struct MD5Context *ctx)
-{
- ctx->buf[0] = 0x67452301;
- ctx->buf[1] = 0xefcdab89;
- ctx->buf[2] = 0x98badcfe;
- ctx->buf[3] = 0x10325476;
-
- ctx->bits[0] = 0;
- ctx->bits[1] = 0;
-}
-
-/*
- * Update context to reflect the concatenation of another buffer full
- * of bytes.
- */
-static void MD5Update (struct MD5Context *ctx, unsigned char const *buf,
- unsigned len)
-{
- unsigned long t;
-
- /* Update bitcount */
-
- t = ctx->bits[0];
- if ((ctx->bits[0] = t + ((unsigned long) len << 3)) < t)
- ctx->bits[1]++; /* Carry from low to high */
- ctx->bits[1] += len >> 29;
-
- t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */
-
- /* Handle any leading odd-sized chunks */
-
- if (t)
- {
- unsigned char *p = (unsigned char *) ctx->in + t;
-
- t = 64 - t;
- if (len < t)
- {
- memcpy (p, buf, len);
- return;
- }
- memcpy (p, buf, t);
- littleEndian (ctx->in, 16);
- MD5Transform (ctx->buf, (unsigned long *) ctx->in);
- buf += t;
- len -= t;
- }
- /* Process data in 64-byte chunks */
-
- while (len >= 64)
- {
- memcpy (ctx->in, buf, 64);
- littleEndian (ctx->in, 16);
- MD5Transform (ctx->buf, (unsigned long *) ctx->in);
- buf += 64;
- len -= 64;
- }
-
- /* Handle any remaining bytes of data. */
-
- memcpy (ctx->in, buf, len);
-}
-
-/*
- * Final wrapup - pad to 64-byte boundary with the bit pattern
- * 1 0* (64-bit count of bits processed, MSB-first)
- */
-static void MD5Final (unsigned char digest[16], struct MD5Context *ctx)
-{
- unsigned count;
- unsigned char *p;
-
- /* Compute number of bytes mod 64 */
- count = (ctx->bits[0] >> 3) & 0x3F;
-
- /* Set the first char of padding to 0x80. This is safe since there is
- always at least one byte free */
- p = ctx->in + count;
- *p++ = 0x80;
-
- /* Bytes of padding needed to make 64 bytes */
- count = 64 - 1 - count;
-
- /* Pad out to 56 mod 64 */
- if (count < 8)
- {
- /* Two lots of padding: Pad the first block to 64 bytes */
- memset (p, 0, count);
- littleEndian (ctx->in, 16);
- MD5Transform (ctx->buf, (unsigned long *) ctx->in);
-
- /* Now fill the next block with 56 bytes */
- memset (ctx->in, 0, 56);
- }
- else
- {
- /* Pad block to 56 bytes */
- memset (p, 0, count - 8);
- }
- littleEndian (ctx->in, 14);
-
- /* Append length in bits and transform */
- ((unsigned long *) ctx->in)[14] = ctx->bits[0];
- ((unsigned long *) ctx->in)[15] = ctx->bits[1];
-
- MD5Transform (ctx->buf, (unsigned long *) ctx->in);
- littleEndian ((unsigned char *) ctx->buf, 4);
- memcpy (digest, ctx->buf, 16);
- memset (ctx, 0, sizeof (ctx)); /* In case it's sensitive */
-}
-
-/* The four core functions - F1 is optimized somewhat */
-
-/* #define F1(x, y, z) (x & y | ~x & z) */
-#define F1(x, y, z) (z ^ (x & (y ^ z)))
-#define F2(x, y, z) F1(z, x, y)
-#define F3(x, y, z) (x ^ y ^ z)
-#define F4(x, y, z) (y ^ (x | ~z))
-
-/* This is the central step in the MD5 algorithm. */
-#define MD5STEP(f, w, x, y, z, data, s) \
- ( w += f(x, y, z) + data, w = w<>(32-s), w += x )
-
-/*
- * The core of the MD5 algorithm, this alters an existing MD5 hash to
- * reflect the addition of 16 longwords of new data. MD5Update blocks
- * the data and converts bytes into longwords for this routine.
- */
-static void MD5Transform (unsigned long buf[4], unsigned long const in[16])
-{
- register unsigned long a, b, c, d;
-
- a = buf[0];
- b = buf[1];
- c = buf[2];
- d = buf[3];
-
- MD5STEP (F1, a, b, c, d, in[0] + 0xd76aa478, 7);
- MD5STEP (F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
- MD5STEP (F1, c, d, a, b, in[2] + 0x242070db, 17);
- MD5STEP (F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
- MD5STEP (F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
- MD5STEP (F1, d, a, b, c, in[5] + 0x4787c62a, 12);
- MD5STEP (F1, c, d, a, b, in[6] + 0xa8304613, 17);
- MD5STEP (F1, b, c, d, a, in[7] + 0xfd469501, 22);
- MD5STEP (F1, a, b, c, d, in[8] + 0x698098d8, 7);
- MD5STEP (F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
- MD5STEP (F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
- MD5STEP (F1, b, c, d, a, in[11] + 0x895cd7be, 22);
- MD5STEP (F1, a, b, c, d, in[12] + 0x6b901122, 7);
- MD5STEP (F1, d, a, b, c, in[13] + 0xfd987193, 12);
- MD5STEP (F1, c, d, a, b, in[14] + 0xa679438e, 17);
- MD5STEP (F1, b, c, d, a, in[15] + 0x49b40821, 22);
-
- MD5STEP (F2, a, b, c, d, in[1] + 0xf61e2562, 5);
- MD5STEP (F2, d, a, b, c, in[6] + 0xc040b340, 9);
- MD5STEP (F2, c, d, a, b, in[11] + 0x265e5a51, 14);
- MD5STEP (F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
- MD5STEP (F2, a, b, c, d, in[5] + 0xd62f105d, 5);
- MD5STEP (F2, d, a, b, c, in[10] + 0x02441453, 9);
- MD5STEP (F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
- MD5STEP (F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
- MD5STEP (F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
- MD5STEP (F2, d, a, b, c, in[14] + 0xc33707d6, 9);
- MD5STEP (F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
- MD5STEP (F2, b, c, d, a, in[8] + 0x455a14ed, 20);
- MD5STEP (F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
- MD5STEP (F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
- MD5STEP (F2, c, d, a, b, in[7] + 0x676f02d9, 14);
- MD5STEP (F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
-
- MD5STEP (F3, a, b, c, d, in[5] + 0xfffa3942, 4);
- MD5STEP (F3, d, a, b, c, in[8] + 0x8771f681, 11);
- MD5STEP (F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
- MD5STEP (F3, b, c, d, a, in[14] + 0xfde5380c, 23);
- MD5STEP (F3, a, b, c, d, in[1] + 0xa4beea44, 4);
- MD5STEP (F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
- MD5STEP (F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
- MD5STEP (F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
- MD5STEP (F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
- MD5STEP (F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
- MD5STEP (F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
- MD5STEP (F3, b, c, d, a, in[6] + 0x04881d05, 23);
- MD5STEP (F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
- MD5STEP (F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
- MD5STEP (F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
- MD5STEP (F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
-
- MD5STEP (F4, a, b, c, d, in[0] + 0xf4292244, 6);
- MD5STEP (F4, d, a, b, c, in[7] + 0x432aff97, 10);
- MD5STEP (F4, c, d, a, b, in[14] + 0xab9423a7, 15);
- MD5STEP (F4, b, c, d, a, in[5] + 0xfc93a039, 21);
- MD5STEP (F4, a, b, c, d, in[12] + 0x655b59c3, 6);
- MD5STEP (F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
- MD5STEP (F4, c, d, a, b, in[10] + 0xffeff47d, 15);
- MD5STEP (F4, b, c, d, a, in[1] + 0x85845dd1, 21);
- MD5STEP (F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
- MD5STEP (F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
- MD5STEP (F4, c, d, a, b, in[6] + 0xa3014314, 15);
- MD5STEP (F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
- MD5STEP (F4, a, b, c, d, in[4] + 0xf7537e82, 6);
- MD5STEP (F4, d, a, b, c, in[11] + 0xbd3af235, 10);
- MD5STEP (F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
- MD5STEP (F4, b, c, d, a, in[9] + 0xeb86d391, 21);
-
- buf[0] += a;
- buf[1] += b;
- buf[2] += c;
- buf[3] += d;
-}
-
diff --git a/Source/DocMakefile b/Source/DocMakefile
index d507067c1..45d9ee534 100644
--- a/Source/DocMakefile
+++ b/Source/DocMakefile
@@ -28,22 +28,13 @@ GNUSTEP_MAKEFILES = $(GNUSTEP_SYSTEM_ROOT)/Makefiles
include $(GNUSTEP_MAKEFILES)/common.make
-DOCUMENT_NAME = Base
+DOCUMENT_NAME = Base BaseAdditions
Base_DOC_INSTALL_DIR = Developer
+BaseAdditions_DOC_INSTALL_DIR = Developer
Base_AGSDOC_FILES = \
../Documentation/Base.gsdoc \
-GSCategories.h \
-GSIArray.h \
-GSIMap.h \
-GSMime.h \
-GSObjCRuntime.h \
-GSUnion.h \
-GSXML.h \
-behavior.h \
-Unicode.h \
-GCObject.h \
NSArchiver.h \
NSArray.h \
NSAttributedString.h \
@@ -108,6 +99,20 @@ NSUserDefaults.h \
NSValue.h \
NSZone.h
+BaseAdditions_AGSDOC_FILES = \
+../Documentation/BaseAdditions.gsdoc \
+GSCategories.h \
+GSIArray.h \
+GSIMap.h \
+GSMime.h \
+GSObjCRuntime.h \
+GSUnion.h \
+GSXML.h \
+behavior.h \
+Unicode.h \
+GCObject.h \
+
+
#
# Hack ... using the -DocumentationDirectory flag overrides the value
# used by the make package, and puts our output in the documentation
@@ -132,6 +137,25 @@ Base_AGSDOC_FLAGS = \
INLINE=inline;\
}' -Up Base
+BaseAdditions_AGSDOC_FLAGS = \
+ -DocumentationDirectory ../Documentation/BaseAdditions \
+ -HeaderDirectory ../Headers/gnustep/base \
+ -Declared gnustep/base \
+ -Standards YES \
+ -ConstantsTemplate TypesAndConstants \
+ -FunctionsTemplate Functions \
+ -MacrosTemplate Functions \
+ -TypedefsTemplate TypesAndConstants \
+ -VariablesTemplate TypesAndConstants \
+ -WordMap '{\
+ FOUNDATION_EXPORT=extern;FOUNDATION_STATIC_INLINE="";\
+ GS_GEOM_SCOPE=extern;GS_GEOM_ATTR="";\
+ GS_EXPORT=extern;GS_DECLARE="";\
+ GS_RANGE_SCOPE=extern;GS_RANGE_ATTR="";\
+ GS_ZONE_SCOPE=extern;GS_ZONE_ATTR="";\
+ INLINE=inline;\
+ }' -Up BaseAdditions
+
# Use local version of autogsdoc in case it is not installed
AUTOGSDOC=../Tools/obj/autogsdoc
@@ -144,8 +168,12 @@ include $(GNUSTEP_MAKEFILES)/documentation.make
#
before-all:: ../Documentation/Base \
../Documentation/Base/Functions.gsdoc \
- ../Documentation/Base/TypesAndConstants.gsdoc
+ ../Documentation/Base/TypesAndConstants.gsdoc \
+ ../Documentation/BaseAdditions \
+ ../Documentation/BaseAdditions/Functions.gsdoc \
+ ../Documentation/BaseAdditions/TypesAndConstants.gsdoc
cp ../Documentation/Base.gsdoc .
+ cp ../Documentation/BaseAdditions.gsdoc .
../Documentation/Base:
$(MKDIRS) ../Documentation/Base
@@ -153,13 +181,28 @@ before-all:: ../Documentation/Base \
../Documentation/Base/Functions.gsdoc: ../Documentation/Functions.gsdoc
cp ../Documentation/Functions.gsdoc ../Documentation/Base
-../Documentation/Base/TypesAndConstants.gsdoc: ../Documentation/TypesAndConstants.gsdoc
+../Documentation/Base/TypesAndConstants.gsdoc: \
+ ../Documentation/TypesAndConstants.gsdoc
cp ../Documentation/TypesAndConstants.gsdoc ../Documentation/Base
+../Documentation/BaseAdditions:
+ $(MKDIRS) ../Documentation/BaseAdditions
+
+../Documentation/BaseAdditions/Functions.gsdoc: \
+ ../Documentation/Functions.gsdoc
+ cp ../Documentation/Functions.gsdoc ../Documentation/BaseAdditions
+
+../Documentation/BaseAdditions/TypesAndConstants.gsdoc: \
+ ../Documentation/TypesAndConstants.gsdoc
+ cp ../Documentation/TypesAndConstants.gsdoc \
+ ../Documentation/BaseAdditions
+
#
# Clean up temporary files used while generating documentation.
#
after-all::
$(RM) Base.gsdoc
+ $(RM) BaseAdditions.gsdoc
rmdir Base
+ rmdir BaseAdditions