/*
 * Copyright (c) 1993-2004 by Wayne C. Gramlich.
 * All rights reserved.
 */

/*
 * This file implements the unsigned base type operations in ANSI-C.
 */

#ifndef ERROR_EXPORTS_H
#include "error_exports.h"
#endif

#ifndef STHEADERS_H
#include "stheaders.h"
#endif

#ifndef UNIX_ASSERT_H
#include "unix_assert.h"
#endif

#ifndef UNIX_STDLIB_H
#include "unix_stdlib.h"
#endif

typedef int Float;

unsigned unsigned__one = 1;

unsigned unsigned__zero = 0;

unsigned unsigned___initial = 0;

extern module___object unsigned__module__object;
extern type___reference unsigned_type_ref;

static object___object unsigned_initial_object = {
	"",				/* Package name */
	"unsigned",			/* Type name */
	"??",				/* Object name */
	(type___reference *)0,		/*XXX: Fix me */
	(int *)0,			/* Size of unsigned object */
	0,				/* Static needs count */
	(need___entry *)0,		/*XXX: Fix me Static needs */
	0,				/* Parameter needs count */
	(need___entry *)0,		/* Parameter needs */
	(void **)&unsigned___initial,	/* Object pointer */
	(instantiation___object *)0	/* Instantiation list */
};
static object___object *object_list[1] = {
	&unsigned_initial_object,
};

void
unsigned__external__initialize(void)
{
	unsigned__module__object.object_count = 1;
	unsigned__module__object.objects = object_list;
}

unsigned
unsigned__add(
	unsigned	left,
	unsigned	right)
{
	return left + right;
}

unsigned
unsigned__address_convert(
	unsigned	arg)
{
	return arg;
}

unsigned
unsigned__and(
	unsigned	left,
	unsigned	right)
{
	return left & right;
}

unsigned
unsigned__character_convert(
	unsigned	arg)
{
	return arg;
}

int
unsigned__compare(
	unsigned	unsigned1,
	unsigned	unsigned2)
{
	return (unsigned1 < unsigned2) ? -1 :
	  ((unsigned1 == unsigned2) ? 0 : 1);
}

unsigned
unsigned__compliment(
	unsigned	arg)
{
	return ~arg;
}

unsigned
unsigned__copy(
	unsigned	arg)
{
	return arg;
}

unsigned
unsigned__divide(
	unsigned	left,
	unsigned	right)
{
	return left / right;
}

unsigned
unsigned__equal(
	unsigned	left,
	unsigned	right)
{
	return left == right;
}

unsigned
unsigned__greater_than(
	unsigned	left,
	unsigned	right)
{
	return left > right;
}

Float
unsigned__float_convert(
	unsigned	arg)
{
	float		result;
	double		d;
	Float		res;

	d = (double)arg;
	result = (float)d;
	res = *((Float *)&result);
	/* (void)printf("0x%x=>%f:(=0x%x) ", arg, d, res); */
	/* (void)fflush(stdout); */
	return res;
}

unsigned
unsigned__hash(
	unsigned	arg)
{
	return arg;
}

int
unsigned__integer_convert(
	unsigned	arg)
{
	return (int)arg;
}

unsigned
unsigned__left_shift(
	unsigned	left,
	unsigned	right)
{
	return left << right;
}

unsigned
unsigned__less_than(
	unsigned	left,
	unsigned	right)
{
	return left < right;
}

unsigned
unsigned__minus(
	unsigned	arg)
{
	return -arg;
}

unsigned
unsigned__multiply(
	unsigned	left,
	unsigned	right)
{
	return left * right;
}

unsigned
unsigned__not(
	unsigned	arg)
{
	return ~arg;
}

unsigned
unsigned__or(
	unsigned	left,
	unsigned	right)
{
	return left | right;
}

unsigned
unsigned__power(
	unsigned	left,
	unsigned	right)
{
	error_fatal("unsigned__power not implemented yet");
	return 0;
}

unsigned
unsigned__random_compute(void)
{
#ifdef LINUX
	return random();
#endif /* LINUX */
#ifdef WINDOWS
	assert(0);
	return 0;
#endif /* WINDOWS */
}

void
unsigned__random_initialize(
	unsigned	seed)
{
#ifdef LINUX
	srandom(seed);
#endif /* LINUX */
#ifdef WINDOWS
	assert(0);
#endif /* WINDOWS */
}

unsigned
unsigned__remainder(
	unsigned	left,
	unsigned	right)
{
	return left % right;
}

unsigned
unsigned__right_shift(
	unsigned	left,
	unsigned	right)
{
	return left >> right;
}

unsigned
unsigned__subtract(
	unsigned	left,
	unsigned	right)
{
	return left - right;
}

unsigned
unsigned__xor(
	unsigned	left,
	unsigned	right)
{
	return left ^ right;
}

