#include "oop.h"

Character::Character(int value)
{
  mValue= value;
}

oop Character::makeTable(void)
{
  oop table= new Array(256);
  for (int i= 0;  i < 256;  ++i)
    table->atPut(i, new Character(i));
  Tab=   table->at('\t');
  NL=    table->at('\n');
  CR=    table->at('\r');
  Space= table->at(' ');
  return table;
}

oop Character::Tab	= 0;
oop Character::NL	= 0;
oop Character::CR	= 0;
oop Character::Space	= 0;

oop Character::Table= Character::makeTable();

oop Character::value(int value)
{
  return Table->at(value);
}

oop Character::asciiValue(int value)
{
  return Character::value(value);
}

oop Character::digitValue(int value)
{
  // Answer the Character whose digit value is x.  For example, answer
  // $9 for x=9, $0 for x=0, $a for x=10, $z for x=35.
  return Table->at(((value < 10) ? '0' : 'a') + value);
}

int Character::asciiValue(void)
{
  return mValue;
}

int Character::digitValue(void)
{
  // Answer 0-9 if the receiver is $0-$9, 10-35 if it is $A-$Z, and <
  // 0 otherwise.  This is used to parse literal numbers of radix
  // 2-36.
  if (mValue >= '0' && mValue <= '9') return mValue - '0';
  if (mValue >= 'A' && mValue <= 'Z') return mValue - 'A' + 10;
  if (mValue >= 'a' && mValue <= 'z') return mValue - 'a' + 10;
  return -1;
}

unsigned Character::hash(void)
{
  return mValue;
}

int Character::operator <(oop anObject)
{
  return mValue < anObject->asciiValue();
}

int Character::operator ==(oop anObject)
{
  return this == anObject;
}

int Character::operator >(oop anObject)
{
  return mValue > anObject->asciiValue();
}

int Character::asInteger(void)
{
  return mValue;
}

