/*-------------------------------------------------------------------
 * Interface.c    Alair Pereira do Lago 17/09/96
 *-------------------------------------------------------------------
 */     

#include <stdio.h>
#include <math.h>
#include "Interface.h"

YYSTYPE InterfaceZero = Zero;
YYSTYPE InterfaceOne = One;
YYSTYPE InterfaceNextNil = Nil;

YYSTYPE InterfaceMultiply(YYSTYPE x,YYSTYPE y)
{
  return Multiply(x,y);
}

YYSTYPE InterfacePower(YYSTYPE x, int n)
{
  YYSTYPE power;
  switch (n)
  {
    case 0:
      return One;
    case 1:
      return x;
    case 2:
      return Multiply(x, x);
    case 3:
      return Multiply(Multiply(x, x), x);
    case 4:
      power = Multiply(x, x);
      return Multiply(power, power);
    default:
      power = x;
      while (--n)
      {
        while (n % 2 == 0)
        {
          x = Multiply(x, x);
          n = n/2;
        }
        power = Multiply(x, power);
      }
      return power;
  }
}
  
YYSTYPE InterfaceIdempotent(YYSTYPE x)
{
  YYSTYPE power = x;
  
  while ((Multiply(power, power)) != power)
    power = Multiply(power, x);
  return power;
}

YYSTYPE InterfaceElement(char *word)
{
  return InterfaceNextNil;
}

void InterfacePrintElement(YYSTYPE x)
{
  printf("%d", x);
}

YYSTYPE InterfaceFirstElement = 0;

YYSTYPE InterfaceNextElement(YYSTYPE x)
{
  return ++x < N ? x : Nil;
}

YYSTYPE InterfaceFirstIdempotent = 0;

YYSTYPE InterfaceNextIdempotent(YYSTYPE x)
{
  do
  {
    x++;
  }
  while (x < N && (Multiply(x, x) != x) );
  return x < N ? x : Nil;
}