Assuming, for example, that funtools is installed in /soft/saord and that gcc is the compiler being used:
gcc -g -I/soft/saord/include -c -o foo.o foo.c
gcc -g foo.o -o foo -L/soft/saord/lib -lfuntools -ldl -lm
gcc -g -no-cpp-precomp -fno-common -I/soft/saord/include -c -o foo.o foo.c
gcc -g foo.o -o foo -L/soft/saord/lib -lfuntools -lm
gcc -g -no-cpp-precomp -fno-common -I/soft/saord/include -c -o foo.o foo.c
gcc -g foo.o -o foo -L/soft/saord/lib -lfuntools -lsocket -lnsl -ldl -lm
#include <stdlib.h>
#include <funtools.h>
int main(int argc, char **argv)
{
  Fun fun;
  /* sanity check */
  if( argc < 2 ) return 1;
  /* open file for reading */
  if( !(fun=FunOpen(argv[1], "r", NULL)) ){
    fprintf(stderr, "ERROR: can't open funtools file: %s\n", argv[1]);
    return 1;
  }
  /* close file */
  FunClose(fun);
  return 0;
}
#
#include <stdlib.h>
#include <funtools.h>
typedef struct evstruct{
  double x, y;
  int pi, pha;
} *Ev, EvRec;
int main(int argc, char **argv)
{
  int i, got;
  int maxrow=1024;
  Ev ev, ebuf=NULL;
  Fun fun;
  /* sanity check */
  if( argc < 2 ) return 1;
  /* open file for reading */
  if( !(fun=FunOpen(argv[1], "r", NULL)) ){
    fprintf(stderr, "ERROR: can't open funtools file: %s\n", argv[1]);
    return 1;
  }
  /* select columns to read (and data types to convert to) */
  got = FunColumnSelect(fun, sizeof(EvRec), NULL,
			"x",       "D", "r", FUN_OFFSET(Ev, x),
			"y",       "D", "r", FUN_OFFSET(Ev, y),
			"pha",     "J", "r", FUN_OFFSET(Ev, pha),
			"pi",      "J", "r", FUN_OFFSET(Ev, pi),
			NULL);
  /* read and process events */
  while( (ebuf=(void *)FunTableRowGet(fun, NULL, maxrow, NULL, &got)) && got ){
    for(i=0; i<got; i++){
      ev = (Ev)ebuf+i;
      fprintf(stdout, "%.1f %.1f %d %d\n", ev->x, ev->y, ev->pha, ev->pi);
    }
    if( ebuf) free(ebuf);
  }
  /* close file */
  FunClose(fun);
  return 0;
}
#include <stdlib.h>
#include <funtools.h>
typedef struct evstruct{
  int pi;
} *Ev, EvRec;
int main(int argc, char **argv)
{
  int i, got;
  int maxrow=1024;
  Ev ev, ebuf=NULL;
  Fun fun, ofun;
  /* sanity check */
  if( argc < 3 ) return 1;
  /* open file for reading */
  if( !(fun=FunOpen(argv[1], "r", NULL)) ){
    fprintf(stderr, "ERROR: can't open input funtools file: %s\n", argv[1]);
    return 1;
  }
  /* open output file and inherit header params, columns, etc. from input */
  if( !(ofun=FunOpen(argv[2], "w", fun)) ){
    fprintf(stderr, "ERROR: can't open output funtools file: %s\n", argv[2]);
    return 1;
  }
  /* select columns to read (and data types to convert to) */
  /* use "merge=update" to change value while keeping original data type */
  /* use "merge=replace" to change boh the value and data type */
  got = FunColumnSelect(fun, sizeof(EvRec), "merge=update",
			"pi",     "J", "rw", FUN_OFFSET(Ev, pi),
			NULL);
  /* read and process events */
  while( (ebuf=(void *)FunTableRowGet(fun, NULL, maxrow, NULL, &got)) && got ){
    for(i=0; i<got; i++){
      ev = (Ev)ebuf+i;
      ev->pi = ev->pi + 1;
    }
    /* write rows to output file */
    if( FunTableRowPut(ofun, ebuf, got, 0, NULL) != got ){
      fprintf(stderr, "ERROR: writing to funtools file: %s\n", argv[2]);
      return 1;
    }
    if( ebuf) free(ebuf);
  }
  /* close files */
  FunClose(ofun);
  FunClose(fun);
  return 0;
}
#include <stdlib.h>
#include <funtools.h>
typedef struct evstruct{
  int x, y;
  int pi, pha;
  int region;
} *Ev, EvRec;
int main(int argc, char **argv)
{
  int i, got;
  int maxrow=1024;
  Ev ev, ebuf=NULL;
  Fun fun;
  /* sanity check */
  if( argc < 2 ) return 1;
  /* open file for reading */
  if( !(fun=FunOpen(argv[1], "r", NULL)) ){
    fprintf(stderr, "ERROR: can't open funtools file: %s\n", argv[1]);
    return 1;
  }
  /* select columns to read (and data types to convert to) */
  /* specifying $REGION will retrieve the one-indexed region number */
  /* events passing the filter but not in a region will have value -1 */
  got = FunColumnSelect(fun, sizeof(EvRec), NULL,
			"x",       "J", "r", FUN_OFFSET(Ev, x),
			"y",       "J", "r", FUN_OFFSET(Ev, y),
			"pha",     "J", "r", FUN_OFFSET(Ev, pha),
			"pi",      "J", "r", FUN_OFFSET(Ev, pi),
			"$REGION", "J", "r", FUN_OFFSET(Ev, region),
			NULL);
  /* read and process events */
  while( (ebuf=(void *)FunTableRowGet(fun, NULL, maxrow, NULL, &got)) && got ){
    for(i=0; i<got; i++){
      ev = (Ev)ebuf+i;
      fprintf(stdout, "%4d %4d %3d %3d %4d\n", 
	      ev->x, ev->y, ev->pha, ev->pi, ev->region);
    }
    if( ebuf) free(ebuf);
  }
  /* close file */
  FunClose(fun);
  return 0;
}
#include <stdlib.h>
#include <funtools.h>
typedef struct evstruct{
  int x, y;
  int pha;
  float pi;
} *Ev, EvRec;
int main(int argc, char **argv)
{
  int i, nev;
  int pmod=16, put=1;
  double pinc=0.1234;
  char xbuf[32], ybuf[32];
  Ev ev;
  Fun ofun;
  /* sanity check */
  if( argc < 3 ) return 1;
  /* open new file for writing */
  if( !(ofun=FunOpen(argv[1], "w", NULL)) ){
    fprintf(stderr, "ERROR: can't open funtools file: %s\n", argv[1]);
    return 1;
  }
  if( (nev = atoi(argv[2])) <=0 ) return 1;
  ev = (Ev)calloc(1, sizeof(EvRec));
  /* The pair of numeric values specify the data value range, used to bin
     x, y into an image. They are permitted but not needed for pi and pha */
  sprintf(xbuf, "J:1:%d", nev);
  sprintf(ybuf, "J:1:%d", nev);
  /* select columns to write */
  FunColumnSelect(ofun, sizeof(EvRec), NULL,
		  "x",   xbuf,      "w", FUN_OFFSET(Ev, x),
		  "y",   ybuf,      "w", FUN_OFFSET(Ev, y),
		  "pha", "J:1:16",  "w", FUN_OFFSET(Ev, pha),
		  "pi",  "E",       "w", FUN_OFFSET(Ev, pi),
		  NULL);
  /* write params to header; generally added before first event is written */
  FunParamPuti(ofun, "PMOD",  0, pmod,  "modulus for pha generation", 1);
  FunParamPutd(ofun, "PINC",  0, pinc,  7, "increment for pi generation", 1);
  /* make up events */
  for(i=1; i<=nev; i++){
    ev->x = i; ev->y = nev-i+1; ev->pha = i % pmod; ev->pi = ev->pha + pinc;
    /* write rows to output file -- this can be done in batches, of course */
    if( FunTableRowPut(ofun, ev, put, 0, NULL) != put ){
      fprintf(stderr, "ERROR: writing to funtools file: %s\n", argv[1]);
      return 1;
    }
  }
  if( ev) free(ev);
  /* close file */
  FunClose(ofun);
  return 0;
}
#include <stdlib.h>
#include <funtools.h>
int main(int argc, char **argv)
{
  int i, j, dim1, dim2;
  double *buf;
  Fun fun;
  /* sanity check */
  if( argc < 2 ) return 1;
  /* open file for reading */
  if( !(fun=FunOpen(argv[1], "r", NULL)) ){
    fprintf(stderr, "ERROR: can't open funtools file: %s\n", argv[1]);
    return 1;
  }
  /* extract (and bin, if necessary) data into a double prec. image buffer */
  if( !(buf = FunImageGet(fun, NULL, "bitpix=-64")) ){
    fprintf(stderr, "ERROR: can't get image: %s\n", argv[1]);
    return 1;
  }
  /* get image dimensions after FunImageGet, in case an image section
     was specified on the command line, which changes image dimensions */
  FunInfoGet(fun, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, 0);
  /* loop through image */
  for(i=0; i<dim2; i++){
    for(j=0; j<dim1; j++){
      fprintf(stdout, "%.1f ", buf[i*dim1+j]);
    }
    fprintf(stdout, "\n");
  }
  /* close file */
  FunClose(fun);
  return 0;
}
#include <funtools.h>
int main(int argc, char **argv)
{
  int i, j, bitpix, dim1, dim2;
  double *buf;
  unsigned char *cbuf;
  short *sbuf;
  int *ibuf;
  float *fbuf;
  double *dbuf;
  Fun fun;
  /* sanity check */
  if( argc < 2 ) return 1;
  /* open file for reading */
  if( !(fun=FunOpen(argv[1], "r", NULL)) ){
    fprintf(stderr, "ERROR: can't open funtools file: %s\n", argv[1]);
    return 1;
  }
  /* extract (and bin, if necessary) data into a buffer whose
     data type is not specified and therefore is that of the file */
  if( !(buf = FunImageGet(fun, NULL, NULL)) ){
    fprintf(stderr, "ERROR: can't get image: %s\n", argv[1]);
    return 1;
  }
  /* get image dimensions after FunImageGet, in case an image section
     was specified on the command line, which changes image dimensions */
  FunInfoGet(fun, FUN_SECT_BITPIX, &bitpix, 
	     FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, 0);
  /* set appropriate data type buffer to point to image buffer */
  switch(bitpix){
    case 8:   cbuf = (unsigned char *)buf; break;
    case 16:  sbuf = (short *)buf;         break;
    case 32:  ibuf = (int *)buf;           break;
    case -32: fbuf = (float *)buf;         break;
    case -64: dbuf = (double *)buf;        break;
  }
  /* loop through image */
  for(i=0; i<dim2; i++){
    for(j=0; j<dim1; j++){
      switch(bitpix){
        case 8:   fprintf(stdout, "%4d ",  cbuf[i*dim1+j]);  break;
        case 16:  fprintf(stdout, "%6d ",  sbuf[i*dim1+j]);  break;
        case 32:  fprintf(stdout, "%9d ",  ibuf[i*dim1+j]);  break;
        case -32: fprintf(stdout, "%.2f ", fbuf[i*dim1+j]);  break;
        case -64: fprintf(stdout, "%.6f ", dbuf[i*dim1+j]);  break;
      }
    }
    fprintf(stdout, "\n");
  }
  /* close file */
  FunClose(fun);
  return 0;
}