//
// StandardEngine
//
// Copyright (C) 1992 Contemporary Design Studios. All rights reserved.
//


#import "StandardEngine.h"
#import <sys/time.h>
#import <stdlib.h>


@implementation StandardEngine


//
// unit
//
// The standard random call returns 31 pseudo-random bits in a 32-bit signed long.
// We want every byte in our buffer to have 8 pseudo-random bits. So, we generate
// one word of 31 random bits, and then generate 31 more words (each with 31
// pseudo-random bits), and to each we add a bit from the first to bring the total
// in each word to 32. This means we must create a total of 31 words for each call
// to makeRandom, so our unit size is 31 * 4, or 124.
//

+ (int)unit
{
    return 124;
}


//
// init
//

- init
{
    struct timeval theTime;
    gettimeofday(&theTime, 0);
    last = theTime.tv_usec;
    srand(last);
    
    return self;
}


//
// makeRandom:
//

- makeRandom:(uchar *)storage;
{
    ulong		temp;
    int			i;
    ulong		*out = (ulong *)storage;
    
    temp = rand();
    
    for(i = 0; i < 31; i++) {
        out[i] = rand() + ((temp & 0x00000001) ? 0x80000000 : 0x00000000);
	temp = temp >> 1;
    }
    
    last = out[30];
    
    
    ((uchar *)storage)[ 0] = (last & 0x000000ff);
    ((uchar *)storage)[ 1] = (last & 0x0000ff00) >> 8;
    ((uchar *)storage)[ 2] = (last & 0x00ff0000) >> 16;

    last = rand();
    
    ((uchar *)storage)[ 3] = (last & 0x000000ff);
    ((uchar *)storage)[ 4] = (last & 0x0000ff00) >> 8;
    ((uchar *)storage)[ 5] = (last & 0x00ff0000) >> 16;

    last = rand();
    
    ((uchar *)storage)[ 6] = (last & 0x000000ff);
    ((uchar *)storage)[ 7] = (last & 0x0000ff00) >> 8;
    ((uchar *)storage)[ 8] = (last & 0x00ff0000) >> 16;

    last = rand();
    
    ((uchar *)storage)[ 9] = (last & 0x000000ff);
    ((uchar *)storage)[10] = (last & 0x0000ff00) >> 8;
    ((uchar *)storage)[11] = (last & 0x00ff0000) >> 16;
    
    return self;
}


//
// read:
//

- read:(NXTypedStream *)stream
{
    [super write:stream];
    
    NXReadTypes(stream, "i", &last);
    srand(last);
    
    return self;
}


//
// write:
//

- write:(NXTypedStream *)stream
{
    [super write:stream];
    
    NXWriteTypes(stream, "i", &last);
    
    return self;
}


@end


//
// End of file.
//