Bill Allombert on Sun, 14 Feb 2010 18:11:00 +0100


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

mini gp example


Dear PARI developers,

I have added a file examples/minigp.c to the PARI distribution.
This is a minimal implementation of GP which shows how it can
be done, in particular how to implement error handling.

minigp use readline and implement the gp history mechanism (i.e %1,%2 etc.).

Cheers,
Bill.

#include <stdio.h>
#include <pari/pari.h>
#include <readline/readline.h>
#include <setjmp.h>

jmp_buf env;
void gp_err_recover(long numerr) { longjmp(env, numerr); }

/* History handling (%1, %2, etc.)*/
pari_stack s_history;
GEN *history;
GEN parihist(long p) 
{
  if (p > 0 && p<=s_history.n)
    return history[p-1];
  else if (p<=0 && s_history.n+p-1>=0)
    return history[s_history.n+p-1];
  pari_err(talker,"History result %ld not available [%%1-%%%ld]",p,s_history.n);
  return NULL; /* not reached */
}

int main(int argc, char **argv)
{
  char *in, *out;
  GEN z;
  entree hist={"%",0,(void*)parihist,13,"D0,L,","last history item."};
  printf("Welcome to minigp!\n");
  pari_init(8000000,500000);
  cb_pari_err_recover = gp_err_recover;
  pari_add_function(&hist);
  stack_init(&s_history,sizeof(*history),(void**)&history);
  (void)setjmp(env);
  while(1)
  {
    in = readline("? ");
    if (!in) break;
    if (!*in) continue;
    z = gp_read_str(in);
    stack_pushp(&s_history,(void*)gclone(z)); /*Add to history */
    out = GENtostr(z);
    printf("%%%ld = %s\n",s_history.n,out);
    free(in); free(out); avma=top;
  }
  return 0;
}