#include <stdlib.h>
#include <stdio.h>

#define NO_LIBCODE
#include "xpkFEAL.c"

ULARGE atoULARGE(STRPTR s)
{
  ULARGE x;

  x.lft = x.rgt = 0;

  while ((s) && (*s))
  {
    x.lft = (x.lft<<4) | (x.rgt>>28);
    x.rgt = (x.rgt<<4);
    if ((s[0]>='0') && (s[0]<='9'))
      x.rgt |= s[0]-'0';
    else if ((s[0]>='A') && (s[0]<='F'))
      x.rgt |= s[0]-'A'+10;
    else if ((s[0]>='a') && (s[0]<='f'))
      x.rgt |= s[0]-'a'+10;
    else
    {
      fprintf(stderr, "Grumbel >%c< !\n",*s);
      exit(5);
    }
    s++;
  }
  return x;
}

void main(int argc, char* argv[])
{
  ULARGE T, K, C;
  ULONG a;
  UWORD b;
  tPartKeys PK;
  LONG n=16;

  if ((argc<3)||(argc>4))
  {
    fprintf (stderr, "usage: %s <Text> <Key> [<n>]\n", argv[0]);
    exit(5);
  }

  T = atoULARGE(argv[1]);
  K = atoULARGE(argv[2]);
/*  K = password(argv[2]); */

  if (argc==4)
    n = atoi(argv[3]);

  printf("Text: %08lx%08lx\t", T.lft, T.rgt);
  printf("Key : %08lx%08lx\n", K.lft, K.rgt);

  MakePartKeys(PK, K, n);
  FEAL_asm(&T, &C, PK, n);
  printf("Code: %08lx%08lx\n", C.lft, C.rgt);
  PermPartKeys(PK, n);
  FEAL_asm(&C, &T, PK, n);
  printf("Text: %08lx%08lx\n", T.lft, T.rgt);
  a = T.rgt; b = T.lft;

  printf("f_asm(%08x,%04x) == %08x\n",a,b,f_asm(a,b));
}
