/* $Id$ */

#include <unistd.h>
#include <math.h>

#ifdef __APPLE__
#include <crt_externs.h>
  #ifndef environ
    #define environ  (*_NSGetEnviron())
  #endif
#endif

#include "common.h"
#include "linefile.h"
#include "hash.h"
#include "options.h"
#include "sqlNum.h"
#include "udc.h"
#include "localmem.h"
#include "bigWig.h"
#include "bigBed.h"
#include "udc.h"
#include "asParse.h"

/* Let Perl redefine these */
#undef TRUE
#undef FALSE
#undef warn

#ifdef PERL_CAPI
#define WIN32IO_IS_STDIO
#endif
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#ifdef FCGI
 #include <fcgi_stdio.h>
#else
 #ifdef USE_SFIO
  #include <config.h>
 #else
  #include <stdio.h>
 #endif
 #include <perlio.h>
#endif

typedef struct bbiFile     *Bio__DB__bbiFile;

typedef struct bbiInterval *Bio__DB__bbiInterval;

typedef struct bbiIntervalList {
    struct lm          *lm;
    struct bbiInterval *head;
  } *Bio__DB__bbiIntervalList;

typedef struct bbiSummaryList {
  int                      size;
  struct bbiSummaryElement *summary;
} *Bio__DB__bbiExtendedSummary;

typedef struct bbiSummaryElement *Bio__DB__bbiExtendedSummaryEl;

typedef struct bbiChromInfoHead  {
  struct bbiChromInfo  *head;
} *Bio__DB__bbiChromInfoHead;

typedef struct bbiChromInfo *Bio__DB__bbiChromInfo;

typedef struct bigBedIntervalList {
  struct lm               *lm;
  struct bigBedInterval   *head;
} *Bio__DB__BigBedIntervalList;

typedef struct bigBedInterval *Bio__DB__BigBedInterval;

typedef struct asObject   *Bio__DB__asObject;
typedef struct asColumn   *Bio__DB__asColumn;
typedef struct asTypeInfo *Bio__DB__asTypeInfo;

MODULE = Bio::DB::BigFile PACKAGE = Bio::DB::BigFile PREFIX=bf_

void
bf_bigWigFileCreate(package="Bio::DB::BigFile",inName,chromSizes,blockSize=1024,itemsPerSlot=512,clipDontDie=TRUE,compress=TRUE,outName)
  char             *package
  char             *inName
  char             *chromSizes
  int               blockSize
  int               itemsPerSlot
  int               clipDontDie
  int               compress
  char             *outName
  CODE:
  bigWigFileCreate(inName,chromSizes,blockSize,itemsPerSlot,clipDontDie,compress,outName);

void
bf_udcSetDefaultDir(packname="Bio::DB::BigFile",path)
  char       *packname
  char       *path
  PREINIT:
  static char udcDir[4096];
  CODE:
  strncpy(udcDir,path,sizeof(udcDir)-1);
  udcSetDefaultDir(udcDir);

char*
bf_udcGetDefaultDir(packname="Bio::DB::BigFile")
  char       *packname
  CODE:
  RETVAL = udcDefaultDir();
  OUTPUT:
  RETVAL

Bio::DB::bbiFile
bf_bigWigFileOpen(packname="Bio::DB::BigFile",filename)
   char* packname
   char* filename
  PROTOTYPE: $$
  CODE:
  RETVAL = bigWigFileOpen(filename);
  OUTPUT:
  RETVAL

Bio::DB::bbiFile
bf_bigBedFileOpen(packname="Bio::DB::BigFile",filename)
   char* packname
   char* filename
  PROTOTYPE: $$
  CODE:
  RETVAL = bigBedFileOpen(filename);
  OUTPUT:
  RETVAL

MODULE = Bio::DB::BigFile PACKAGE = Bio::DB::bbiFile PREFIX=bbi_

int
bbi_bigWigIntervalDump(bwf,chrom,start,end,maxCount=0,out=stdout)
    Bio::DB::bbiFile bwf
    char            *chrom
    unsigned int     start
    unsigned int     end
    int              maxCount
    FILE            *out
    CODE:
      RETVAL = bigWigIntervalDump(bwf,chrom,start,end,maxCount,out);
    OUTPUT:
      RETVAL

void
bbi_close(bbi)
    Bio::DB::bbiFile bbi
    CODE:
      bigWigFileClose(&bbi);

void
bbi_DESTROY(bbi)
    Bio::DB::bbiFile bbi
    CODE:
      bigWigFileClose(&bbi);

# max is here just to normalize call signature with bigBedIntervalQuery
Bio::DB::bbiIntervalList
bbi_bigWigIntervalQuery(bwf,chrom,start,end,max=0)
    Bio::DB::bbiFile bwf
    char            *chrom
    unsigned int     start
    unsigned int     end
    unsigned int     max
    PREINIT:
    struct bbiIntervalList *list;
    CODE:
    list = Newxz(list,1,struct bbiIntervalList);
    list->lm = lmInit(0);
    list->head = bigWigIntervalQuery(bwf,chrom,start,end,list->lm);
    RETVAL = list;
    OUTPUT:
      RETVAL

SV*
bbi_bigWigSummaryArray(bwf,chrom,start,end,summaryType=0,size)
   Bio::DB::bbiFile bwf
   char            *chrom
   unsigned int     start
   unsigned int     end
   unsigned int     summaryType
   unsigned int     size
  PREINIT:
    int     i;
    boolean result;
    double  *values;
    AV      *avref;
  CODE:
    values = Newx(values,size,double);
    for (i=0;i<size;i++) values[i] = NAN;

    result = bigWigSummaryArray(bwf,chrom,start,end,summaryType,size,values);
    if (result != TRUE) {
      Safefree(values);
      XSRETURN_EMPTY;
    } else {
      avref = (AV*) sv_2mortal((SV*)newAV());
      for (i=0;i<size;i++)
	av_push(avref, isnan(values[i]) ? &PL_sv_undef : newSVnv(values[i]));
      Safefree(values);
      RETVAL = (SV*) newRV((SV*)avref);
    }
  OUTPUT:
     RETVAL

unsigned int
bbi_bigBedItemCount(bbf)
   Bio::DB::bbiFile bbf
   CODE:
   RETVAL=bigBedItemCount(bbf);
   OUTPUT:
   RETVAL

SV*
bbi_bigBedAutoSqlText(bbf)
   Bio::DB::bbiFile bbf
   PREINIT:
   char* as;
   CODE:
   as = bigBedAutoSqlText(bbf);
   RETVAL=newSVpv(as,0);
   freeMem(as);
   OUTPUT:
   RETVAL

Bio::DB::asObject
bbi_bigBedAs(bbf)
   Bio::DB::bbiFile bbf
   CODE:
   RETVAL = bigBedAs(bbf);
   OUTPUT:
   RETVAL

SV*
bbi_bigBedSummaryArray(bbf,chrom,start,end,summaryType=0,size)
   Bio::DB::bbiFile bbf
   char            *chrom
   unsigned int     start
   unsigned int     end
   unsigned int     summaryType
   unsigned int     size
  PREINIT:
    int     i;
    boolean result;
    double  *values;
    AV      *avref;
  CODE:
    values = Newx(values,size,double);
    for (i=0;i<size;i++) values[i] = NAN;

    result = bigBedSummaryArray(bbf,chrom,start,end,summaryType,size,values);
    if (result != TRUE) {
      Safefree(values);
      XSRETURN_EMPTY;
    } else {
      avref = (AV*) sv_2mortal((SV*)newAV());
      for (i=0;i<size;i++)
	av_push(avref, isnan(values[i]) ? &PL_sv_undef : newSVnv(values[i]));
      Safefree(values);
      RETVAL = (SV*) newRV((SV*)avref);
    }
  OUTPUT:
     RETVAL

double
bbi_bigWigSingleSummary(bwf,chrom,start,end,summaryType=0,defaultVal)
   Bio::DB::bbiFile bwf
   char            *chrom
   unsigned int     start
   unsigned int     end
   unsigned int     summaryType
   double           defaultVal
  CODE:
    RETVAL = bigWigSingleSummary(bwf,chrom,start,end,summaryType,defaultVal);
  OUTPUT:
     RETVAL

Bio::DB::bbiExtendedSummary
bbi_bigWigSummary(bwf,chrom,start,end,size)
   Bio::DB::bbiFile bwf
   char            *chrom
   unsigned int     start
   unsigned int     end
   unsigned int     size
  PREINIT:
    int     i;
    boolean result;
    struct bbiSummaryElement          *summary;
    Bio__DB__bbiExtendedSummary     summaryList;
    SV     *p;
  CODE:
   summary = Newxz(summary,size,struct bbiSummaryElement);
   result  = bigWigSummaryArrayExtended(bwf,chrom,start,end,size,summary);
   if (result != TRUE) {
     Safefree(summary);
     XSRETURN_EMPTY;
   } else {
      summaryList = Newxz(summaryList,1,struct bbiSummaryList);
      summaryList->size = size;
      summaryList->summary = summary;
      p = newSV(sizeof(summaryList));
      sv_setref_pv(p,"Bio::DB::bbiExtendedSummary",(void*) summaryList);
      RETVAL = summaryList;
   }
  OUTPUT:  
    RETVAL

Bio::DB::bbiExtendedSummary
bbi_bigBedSummary(bbf,chrom,start,end,size)
   Bio::DB::bbiFile bbf
   char            *chrom
   unsigned int     start
   unsigned int     end
   unsigned int     size
  PREINIT:
    int     i;
    boolean result;
    struct bbiSummaryElement          *summary;
    Bio__DB__bbiExtendedSummary        summaryList;
    SV     *p;
  CODE:
   summary = Newxz(summary,size,struct bbiSummaryElement);
   result  = bigBedSummaryArrayExtended(bbf,chrom,start,end,size,summary);
   if (result != TRUE) {
     Safefree(summary);
     XSRETURN_EMPTY;
   } else {
      summaryList = Newxz(summaryList,1,struct bbiSummaryList);
      summaryList->size = size;
      summaryList->summary = summary;
      p = newSV(sizeof(summaryList));
      sv_setref_pv(p,"Bio::DB::bbiExtendedSummary",(void*) summaryList);
      RETVAL = summaryList;
   }
  OUTPUT:  
    RETVAL


SV*
bbi_bigWigSummaryArrayExtended(bwf,chrom,start,end,size)
   Bio::DB::bbiFile bwf
   char            *chrom
   unsigned int     start
   unsigned int     end
   unsigned int     size
  PREINIT:
    int     i;
    boolean result;
    struct bbiSummaryElement          *summary;
    Bio__DB__bbiExtendedSummary        summaryList;
    HV     *h;
    AV     *av;
  CODE:
   summary = Newxz(summary,size,struct bbiSummaryElement);
   result  = bigWigSummaryArrayExtended(bwf,chrom,start,end,size,summary);
   if (result != TRUE) {
     Safefree(summary);
     XSRETURN_EMPTY;
   } else {
     av = newAV();
     for (i=0;i<size;i++) {
       h = newHV();
       hv_store(h,"validCount",10,newSVuv(summary[i].validCount),0);
       hv_store(h,"minVal",     6,newSVnv(summary[i].minVal),0);
       hv_store(h,"maxVal",     6,newSVnv(summary[i].maxVal),0);
       hv_store(h,"sumData",    7,newSVnv(summary[i].sumData),0);
       hv_store(h,"sumSquares",10,newSVnv(summary[i].sumSquares),0);
       av_push(av,newRV_noinc((SV*)h));
     }
     Safefree(summary);
     RETVAL = (SV*) newRV_noinc((SV*)av);
   }
  OUTPUT:  
    RETVAL

SV*
bbi_bigBedSummaryArrayExtended(bbf,chrom,start,end,size)
   Bio::DB::bbiFile bbf
   char            *chrom
   unsigned int     start
   unsigned int     end
   unsigned int     size
  PREINIT:
    int     i;
    boolean result;
    struct bbiSummaryElement          *summary;
    Bio__DB__bbiExtendedSummary        summaryList;
    HV     *h;
    AV     *av;
  CODE:
   summary = Newxz(summary,size,struct bbiSummaryElement);
   result  = bigBedSummaryArrayExtended(bbf,chrom,start,end,size,summary);
   if (result != TRUE) {
     Safefree(summary);
     XSRETURN_EMPTY;
   } else {
     av = newAV();
     for (i=0;i<size;i++) {
       h = newHV();
       hv_store(h,"validCount",10,newSVuv(summary[i].validCount),0);
       hv_store(h,"minVal",     6,newSVnv(summary[i].minVal),0);
       hv_store(h,"maxVal",     6,newSVnv(summary[i].maxVal),0);
       hv_store(h,"sumData",    7,newSVnv(summary[i].sumData),0);
       hv_store(h,"sumSquares",10,newSVnv(summary[i].sumSquares),0);
       av_push(av,newRV_noinc((SV*)h));
     }
     Safefree(summary);
     RETVAL = (SV*) newRV_noinc((SV*)av);
   }
  OUTPUT:  
    RETVAL

Bio::DB::bbiChromInfoHead
bbi_chromList(bbi)
    Bio::DB::bbiFile bbi
    PREINIT:
    struct bbiChromInfo *list;
    CODE:
    list = bbiChromList(bbi);
    RETVAL = Newxz(RETVAL,1,struct bbiChromInfoHead);
    RETVAL->head = list;
    OUTPUT:
      RETVAL

unsigned int
bbi_chromSize(bbi,name)
    Bio::DB::bbiFile bbi
    char            *name
    CODE:
    RETVAL = bbiChromSize(bbi,name);
    OUTPUT:
    RETVAL

MODULE = Bio::DB::BigFile PACKAGE = Bio::DB::bbiFile PREFIX=bb_

Bio::DB::BigBedIntervalList
bb_bigBedIntervalQuery(bbf,chrom,start,end,maxItems=0)
    Bio::DB::bbiFile bbf
    char            *chrom
    unsigned int     start
    unsigned int     end
    int              maxItems
    PREINIT:
    struct bigBedIntervalList *list;
    CODE:
    list = Newxz(list,1,struct bigBedIntervalList);
    list->lm   = lmInit(0);
    list->head = bigBedIntervalQuery(bbf,chrom,start,end,maxItems,list->lm);
    RETVAL = list;
    OUTPUT:
      RETVAL

MODULE = Bio::DB::BigFile PACKAGE = Bio::DB::BigBedIntervalList PREFIX=bbedil_

Bio::DB::BigBedInterval
bbedil_head(bbil)
  Bio::DB::BigBedIntervalList bbil
  CODE:
    RETVAL = bbil->head;
  OUTPUT:
    RETVAL

void
bbedil_DESTROY(bbil)
	Bio::DB::BigBedIntervalList bbil
	CODE:
	if (bbil->lm != NULL) lmCleanup(&bbil->lm);
	bbil->lm = NULL;

MODULE = Bio::DB::BigFile PACKAGE = Bio::DB::BigBedInterval PREFIX=bbedi_

Bio::DB::BigBedInterval
bbedi_next(bbi)
    Bio::DB::BigBedInterval bbi
  CODE:
  RETVAL = bbi->next;
  OUTPUT:
  RETVAL

unsigned int
bbedi_start(bbi)
    Bio::DB::BigBedInterval bbi
  CODE:
    RETVAL = bbi->start;
  OUTPUT:
    RETVAL

unsigned int
bbedi_end(bbi)
    Bio::DB::BigBedInterval bbi
  CODE:
    RETVAL = bbi->end;
  OUTPUT:
    RETVAL

char*
bbedi_rest(bbi)
    Bio::DB::BigBedInterval bbi
  CODE:
    RETVAL = bbi->rest;
  OUTPUT:
    RETVAL

MODULE = Bio::DB::BigFile PACKAGE = Bio::DB::bbiChromInfoHead PREFIX=bbici_

Bio::DB::bbiChromInfo
bbici_head(cih)
	Bio::DB::bbiChromInfoHead cih
	CODE:
	RETVAL = cih->head;
        OUTPUT:
	RETVAL

void
bbici_DESTROY(cih)
	Bio::DB::bbiChromInfoHead cih
	CODE:
	bbiChromInfoFreeList(&cih->head);

MODULE = Bio::DB::BigFile PACKAGE = Bio::DB::bbiChromInfo PREFIX=bbici_

Bio::DB::bbiChromInfo
bbici_next(ci)
	Bio::DB::bbiChromInfo ci
	CODE:
	  RETVAL = ci->next;
        OUTPUT:
	  RETVAL

char*
bbici_name(ci)
	Bio::DB::bbiChromInfo ci
	CODE:
	RETVAL = ci->name;
        OUTPUT:
	  RETVAL

unsigned int
bbici_id(ci)
	Bio::DB::bbiChromInfo ci
	CODE:
	RETVAL = ci->id;
        OUTPUT:
	  RETVAL

unsigned int
bbici_size(ci)
	Bio::DB::bbiChromInfo ci
	CODE:
	RETVAL = ci->size;
        OUTPUT:
	  RETVAL

MODULE = Bio::DB::BigFile PACKAGE = Bio::DB::bbiExtendedSummaryEl PREFIX=bwel_

unsigned long
bwel_validCount(el)
      Bio::DB::bbiExtendedSummaryEl el
      CODE:
        RETVAL = el->validCount;
      OUTPUT:
        RETVAL
    
double
bwel_minVal(el)
      Bio::DB::bbiExtendedSummaryEl el
      CODE:
        RETVAL = el->minVal;
      OUTPUT:
        RETVAL
    
double
bwel_maxVal(el)
      Bio::DB::bbiExtendedSummaryEl el
      CODE:
        RETVAL = el->maxVal;
      OUTPUT:
        RETVAL

double
bwel_sumData(el)
      Bio::DB::bbiExtendedSummaryEl el
      CODE:
        RETVAL = el->sumData;
      OUTPUT:
        RETVAL
    
double
bwel_sumSquares(el)
      Bio::DB::bbiExtendedSummaryEl el
      CODE:
        RETVAL = el->sumSquares;
      OUTPUT:
        RETVAL


MODULE = Bio::DB::BigFile PACKAGE = Bio::DB::bbiExtendedSummary PREFIX=bwes_

int
bwes_size(el);
      Bio::DB::bbiExtendedSummary el
      CODE:
        RETVAL = el->size;
      OUTPUT:
        RETVAL

unsigned long
bwes_validCount(el,i)
      Bio::DB::bbiExtendedSummary el
      int i
      CODE:
        if (i>el->size-1)
	  croak("Attempt to read past end of ExtendedSummary results %d > %d",i,el->size-1);
        RETVAL = el->summary[i].validCount;
      OUTPUT:
        RETVAL
    
double
bwes_minVal(el,i)
      Bio::DB::bbiExtendedSummary el
      int i
      CODE:
        if (i>el->size-1)
	  croak("Attempt to read past end of ExtendedSummary results %d > %d",i,el->size-1);
        RETVAL = el->summary[i].minVal;
      OUTPUT:
        RETVAL
    
double
bwes_maxVal(el,i)
      Bio::DB::bbiExtendedSummary el
      int i
      CODE:
        if (i>el->size-1)
	  croak("Attempt to read past end of ExtendedSummary results %d > %d",i,el->size-1);
        RETVAL = el->summary[i].maxVal;
      OUTPUT:
        RETVAL

double
bwes_sumData(el,i)
      Bio::DB::bbiExtendedSummary el
      int i
      CODE:
        if (i>el->size-1)
	  croak("Attempt to read past end of ExtendedSummary results %d > %d",i,el->size-1);
        RETVAL = el->summary[i].sumData;
      OUTPUT:
        RETVAL
    
double
bwes_sumSquares(el,i)
      Bio::DB::bbiExtendedSummary el
      int i
      CODE:
        if (i>el->size-1)
	  croak("Attempt to read past end of ExtendedSummary results %d > %d",i,el->size-1);
        RETVAL = el->summary[i].sumSquares;
      OUTPUT:
        RETVAL

void
bwes_DESTROY(el)
      Bio::DB::bbiExtendedSummary el
      CODE:
      if (el->summary != NULL) {
	Safefree(el->summary);
      }
      el->summary = NULL;

MODULE = Bio::DB::BigFile PACKAGE = Bio::DB::bbiIntervalList PREFIX=bbil_

Bio::DB::bbiInterval
bbil_head(list)
  Bio::DB::bbiIntervalList list
  CODE:
     RETVAL = list->head;
  OUTPUT:
     RETVAL

void
bbil_DESTROY(list)
  Bio::DB::bbiIntervalList list
  CODE:
  if (list->lm != NULL) lmCleanup(&list->lm);
  list->lm = NULL;

MODULE = Bio::DB::BigFile PACKAGE = Bio::DB::bbiInterval PREFIX=bbii_

Bio::DB::bbiInterval
bbii_next(interval)
      Bio::DB::bbiInterval interval
  CODE:
     RETVAL = interval->next;
  OUTPUT:
     RETVAL

unsigned int
bbii_start(interval)
      Bio::DB::bbiInterval interval
  CODE:
     RETVAL = interval->start;
  OUTPUT:
     RETVAL

unsigned int
bbii_end(interval)
      Bio::DB::bbiInterval interval
  CODE:
     RETVAL = interval->end;
  OUTPUT:
     RETVAL

double
bbii_value(interval)
      Bio::DB::bbiInterval interval
  CODE:
     RETVAL = interval->val;
  OUTPUT:
     RETVAL

MODULE = Bio::DB::BigFile PACKAGE = Bio::DB::asObject PREFIX=as_

Bio::DB::asObject
as_next(as)
   Bio::DB::asObject as
   CODE:
       RETVAL = as->next;
   OUTPUT:
       RETVAL


char*
as_name(as)
   Bio::DB::asObject as
   CODE:
       RETVAL = as->name;
   OUTPUT:
       RETVAL

char*
as_comment(as)
   Bio::DB::asObject as
   CODE:
     RETVAL = as->comment;
   OUTPUT:
     RETVAL

int
as_isTable(as)
   Bio::DB::asObject as
   CODE:
     RETVAL = as->isTable;
   OUTPUT:
     RETVAL

int
as_isSimple(as)
   Bio::DB::asObject as
   CODE:
   RETVAL = as->isSimple;
   OUTPUT:
     RETVAL

Bio::DB::asColumn
as_columnList(as)
   Bio::DB::asObject as
   CODE:
   RETVAL = as->columnList;
   OUTPUT:
   RETVAL

MODULE = Bio::DB::BigFile PACKAGE = Bio::DB::asColumn PREFIX=asc_

Bio::DB::asColumn
asc_next(ac)
  Bio::DB::asColumn ac
  CODE:
  RETVAL = ac->next;
  OUTPUT:
  RETVAL

char*
asc_name(ac)
  Bio::DB::asColumn ac
  CODE:
  RETVAL = ac->name;
  OUTPUT:
  RETVAL

char*
asc_comment(ac)
  Bio::DB::asColumn ac
  CODE:
  RETVAL = ac->comment;
  OUTPUT:
  RETVAL

Bio::DB::asTypeInfo
asc_lowType(ac)
  Bio::DB::asColumn ac
  CODE:
  RETVAL = ac->lowType;
  OUTPUT:
  RETVAL


char*
asc_obName(ac)
  Bio::DB::asColumn ac
  CODE:
  RETVAL = ac->obName;
  OUTPUT:
  RETVAL

char*
asc_linkedSizeName(ac)
  Bio::DB::asColumn ac
  CODE:
  RETVAL = ac->linkedSizeName;
  OUTPUT:
  RETVAL

Bio::DB::asObject
asc_obType(ac)
  Bio::DB::asColumn ac
  CODE:
  RETVAL = ac->obType;
  OUTPUT:
  RETVAL

Bio::DB::asColumn
asc_linkedSize(ac)
  Bio::DB::asColumn ac
  CODE:
  RETVAL = ac->linkedSize;
  OUTPUT:
  RETVAL

int
asc_fixedSize(ac)
  Bio::DB::asColumn ac
  CODE:
    RETVAL = ac->fixedSize;
  OUTPUT:
  RETVAL

int
asc_isSizeLink(ac)
  Bio::DB::asColumn ac
  CODE:
    RETVAL = ac->isSizeLink;
  OUTPUT:
  RETVAL

int
asc_isList(ac)
  Bio::DB::asColumn ac
  CODE:
    RETVAL = ac->isList;
  OUTPUT:
  RETVAL

int
asc_isArray(ac)
  Bio::DB::asColumn ac
  CODE:
    RETVAL = ac->isArray;
  OUTPUT:
  RETVAL

MODULE = Bio::DB::BigFile PACKAGE = Bio::DB::asTypeInfo PREFIX=ast_

int
ast_type(ati)
    Bio::DB::asTypeInfo ati
    CODE:
    RETVAL = ati->type;
    OUTPUT:
    RETVAL

char*
ast_name(ati)
    Bio::DB::asTypeInfo ati
    CODE:
    RETVAL = ati->name;
    OUTPUT:
    RETVAL

int
ast_isUnsigned(ati)
    Bio::DB::asTypeInfo ati
    CODE:
    RETVAL = ati->isUnsigned;
    OUTPUT:
    RETVAL

int
ast_stringy(ati)
    Bio::DB::asTypeInfo ati
    CODE:
    RETVAL = ati->stringy;
    OUTPUT:
    RETVAL

char*
ast_sqlName(ati)
    Bio::DB::asTypeInfo ati
    CODE:
    RETVAL = ati->sqlName;
    OUTPUT:
    RETVAL

char*
ast_cName(ati)
    Bio::DB::asTypeInfo ati
    CODE:
    RETVAL = ati->cName;
    OUTPUT:
    RETVAL

char*
ast_listyName(ati)
    Bio::DB::asTypeInfo ati
    CODE:
    RETVAL = ati->listyName;
    OUTPUT:
    RETVAL

char*
ast_nummyName(ati)
    Bio::DB::asTypeInfo ati
    CODE:
    RETVAL = ati->nummyName;
    OUTPUT:
    RETVAL

char*
ast_outFormat(ati)
    Bio::DB::asTypeInfo ati
    CODE:
    RETVAL = ati->outFormat;
    OUTPUT:
    RETVAL