#include "pari.h"
#include "anal.h"

GEN   gen_0, gen_1, gen_m1, gen_2;
pari_sp top, bot, avma;
size_t memused = 0;
ulong  DEBUGLEVEL,DEBUGMEM = 0;

void specinit()
{
  long size = 100000L;
  bot = (pari_sp)malloc(size);
  top = avma = bot + size;
  gen_0 = (GEN)malloc(2);
  gen_0[0] = evaltyp(t_INT)|evallg(2);
  gen_0[1] = evallgefint(2);
  gen_1 = utoipos(1);
  gen_m1= utoineg(1);
  gen_2 = utoipos(2);
}

void gerepileall(pari_sp av, int n, ...){}
void pari_err(long x, ...) { exit (0); }
void pari_warn(long x, ...) { exit (0); }
char*gprealloc(void *pointer, size_t size) { return (char*)realloc(pointer,size); }
char*gpmalloc(size_t size) { return (char*)malloc(size); }
GEN gerepileuptoint(pari_sp av, GEN q){ return q; }
void gerepilemanysp(pari_sp av, pari_sp tetpil, GEN* gptr[], int n){}
void gerepilemany(pari_sp av, GEN* gptr[], int n){}
void fprintferr(const char *x, ...){}
GEN gcopy(GEN x){return x;}
GEN gtofp(GEN x, long prec){return x;}
void gaffect(GEN x, GEN y){}
GEN ceilr(GEN x){return x;}
GEN roundr(GEN x){return x;}
const long lontyp[] = {0};

void sorstring(ulong x)
{
#ifdef LONG_IS_64BIT
  printf("%016lx  ", x);
#else
  printf("%08lx  ", x);
#endif
}

void _voiri(GEN x)
{
  long i, lx = lgefint(x);
  GEN y = int_MSW(x);
  /* sorstring(x[0]); depends on the kernel and contains no useful info */
  sorstring(x[1]);
  for (i=2; i < lx; i++, y = int_precW(y)) sorstring(*y);
  printf("\n");
}
void _voirr(GEN x)
{
  long i, lx = lg(x);
  for (i=1; i < lx; i++) sorstring(x[i]);
  printf("\n");
}

int main()
{
  GEN x,y,r,z, xr,yr;
  specinit();
  x = utoipos(187654321UL);
  y = utoineg(12345678UL);
  printf("INT: %ld\n", itos(x));
  printf("conv:"); _voiri(x);
  printf("+:"); _voiri(addii(x,y));
  printf("-:"); _voiri(subii(x,y));
  printf("*:"); _voiri(mulii(x,y));
  printf("/:"); _voiri(dvmdii(x,y, &z));
  printf("rem:"); _voiri(z);
  printf("pow:\n");
  z = mulii(x,x); _voiri(z);
  z = mulii(z,z); _voiri(z);
  z = mulii(z,z); _voiri(z);
  z = mulii(z,z); _voiri(z);
  z = mulii(z,z); _voiri(z);
  printf("invmod:"); invmod(y,z,&r); _voiri(r);
  xr = itor(x, DEFAULTPREC);
  yr = itor(y, DEFAULTPREC);
  printf("\nREAL: %f\n", rtodbl(xr));
  printf("conv1:"); _voirr(xr);
  printf("conv2:"); _voirr(dbltor(rtodbl(xr)));
  printf("+:"); _voirr(addrr(xr,yr));
  printf("-:"); _voirr(subrr(xr,yr));
  printf("*:"); _voirr(mulrr(xr,yr));
  printf("/:"); _voirr(divrr(xr,yr));
  printf("gcc bug?:"); _voirr(divrs(dbltor(3.),2));
  return 0;
}


syntax highlighted by Code2HTML, v. 0.9.1