Separate out additions documentation.

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@15683 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Richard Frith-Macdonald 2003-01-23 10:51:51 +00:00
parent 4a5a72c65c
commit b2dcc87767
7 changed files with 410 additions and 298 deletions

View file

@ -1,3 +1,12 @@
2003-01-23 Richard Frith-Macdonald <rfm@gnu.org>
* 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 <rfm@gnu.org>
* Source/Additions/GSMime.m: ifdefed out my last change ...not sure

View file

@ -16,7 +16,9 @@
<p>
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.
</p>
<index scope="project" type="title" />
<section>

View file

@ -0,0 +1,31 @@
<?xml version="1.0"?>
<!DOCTYPE gsdoc PUBLIC "-//GNUstep//DTD gsdoc 1.0.0//EN" "http://www.gnustep.org/gsdoc-1_0_0.xml">
<gsdoc base="BaseAdditions">
<head>
<title>GNUstep Base Additions</title>
<author name="Richard Frith-Macdonald">
<email address="rfm@gnu.org"/>
<url url="http://www.gnustep.org/developers/whoiswho.html"/>
</author>
<version>$Revision$</version>
<date>$Date$</date>
</head>
<body>
<chapter>
<heading>Base Additions</heading>
<p>
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.
</p>
<index scope="project" type="title" />
</chapter>
<back>
<index scope="project" type="class" />
<index scope="project" type="protocol" />
</back>
</body>
</gsdoc>

View file

@ -34,5 +34,13 @@
@end
@interface NSData (GSCategories)
- (NSData*) MD5Digest;
@end
#endif /* NO_GNUSTEP */
#endif /* INCLUDED_GS_CATEGORIES_H */

View file

@ -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<<s | 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

View file

@ -53,6 +53,7 @@
#include <config.h>
#include <Foundation/Foundation.h>
#include <gnustep/base/GSMime.h>
#include <gnustep/base/GSCategories.h>
#include <string.h>
#include <ctype.h>
#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;
* </p>
* <p>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.
* </p>
*/
- (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 <Foundation/NSByteOrder.h>
/*
* 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 <string.h> /* 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<<s | 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;
}

View file

@ -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