The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

/* 
   CTREE includes
*/

#include "ctstdr.h"
#include "ctoptn.h"
#include "ctaerr.h"
#include "ctdecl.h"
#include "cterrc.h"

typedef COUNT CtreeINIT;

MODULE = Db::Ctree		PACKAGE = Db::Ctree		

 #
 # NOTE: OUTPUT specifiers are not giving for VOID * types because
 #       their values can contain nulls and this will screw up length
 #       calculations.  The CTREE practice of ensuring proper buffer space
 #       holds true!!
 #

 #
 # Functions for CTREE global variables
 #

COUNT
isam_err()
     CODE:
         RETVAL = isam_err;
     OUTPUT:
         RETVAL

COUNT
isam_fil()
     CODE:
         RETVAL = isam_fil;
     OUTPUT:
         RETVAL

COUNT
sysiocod()
     CODE:
         RETVAL = sysiocod;
     OUTPUT:
         RETVAL

COUNT
uerr_cod()
     CODE:
         RETVAL = uerr_cod;
     OUTPUT:
         RETVAL

 #
 # custom GetDODA returns values as list type
 #
void
MyGetDODA(datano)
       COUNT datano
       PPCODE:
           DATOBJ doda[100];
           int    i=0;
           i=GetDODA(datano,sizeof(DATOBJ)*100,doda,SCHEMA_DODA);
           if (i)
             for(i=0; i<100 ; i++)
             {
                if (doda[i].fwhat == -1 ) break;
                EXTEND(sp, 4);
                if (doda[i].fsymb == 0 )
                   PUSHs(sv_2mortal(newSViv(i)));/*deal with null field name*/
                else
                   PUSHs(sv_2mortal(newSVpv(doda[i].fsymb,0)));
                   PUSHs(sv_2mortal(newSViv((IV)doda[i].fadr)));
                   PUSHs(sv_2mortal(newSViv(doda[i].ftype)));
                   PUSHs(sv_2mortal(newSViv(doda[i].flen )));
             } 
           else
               XSRETURN_EMPTY;
                
 #
 # custom InitISAM returns a ptr of special type to detect when the program exits.   
 # On DESTROY of the return value StopUser() is executed to ensure
 #  shared memory is cleaned up!

CtreeINIT *
MyInitISAM(bufs,fils,sect)
     COUNT  bufs
     COUNT  fils
     COUNT  sect
     CODE:
        RETVAL = malloc(sizeof(CtreeINIT));
        *RETVAL = InitISAM(bufs,fils,sect);
     OUTPUT:
        RETVAL


 # This code is executed automatically upon exit to clean up
 # shared memory.
MODULE = Db::Ctree		PACKAGE = CtreeINITPtr
void
DESTROY(init)
      CtreeINIT *init
      CODE:
           StopUser();
           free(init); 	

 #
 # Most Ctree functions converted automatically
 #
MODULE = Db::Ctree		PACKAGE = Db::Ctree		

COUNT
Abort()

COUNT
AbortXtd(lokmod)
    COUNT lokmod

COUNT
AddCtResource(datno,resptr,varlen)
    COUNT datno
    VOID * resptr
    UCOUNT varlen

COUNT
AddKey(keyno,target,recbyt,typadd)
    COUNT keyno
    VOID * target
    LONG recbyt
    COUNT typadd

COUNT
AddRecord(datno,recptr)
    COUNT datno
    VOID * recptr

COUNT
AddVRecord(datno,recptr,varlen)
    COUNT datno
    VOID * recptr
    UCOUNT varlen

COUNT
AllocateBatch(numbat)
    COUNT numbat

COUNT
AllocateSet(numset)
    COUNT numset

COUNT
AvailableFileNbr(numfils)
    COUNT numfils

LONG
Begin(mode)
    COUNT mode

COUNT
BuildKey(keyno,recptr,txt,pntr,datlen)
    COUNT keyno
    VOID * recptr
    TEXT * txt
    LONG pntr
    UCOUNT datlen

COUNT
ChangeBatch(batnum)
    COUNT batnum

COUNT
ChangeISAMContext(contextid)
    COUNT contextid

COUNT
ChangeSet(setnum)
    COUNT setnum

COUNT
ClearTranError()

COUNT
CloseCtFile(filno,filmod)
    COUNT filno
    COUNT filmod

COUNT
CloseIFile(ifilptr)
    IFIL * ifilptr

COUNT
CloseISAM()

COUNT
CloseISAMContext(contextid)
    COUNT contextid

COUNT
CloseRFile(datno)
    COUNT datno

COUNT
Commit(mode)
    COUNT mode

COUNT
CompactIFile(ifilptr)
    IFIL * ifilptr

COUNT
CompactIFileXtd(ifilptr,dataextn,indxextn,permmask,groupid,fileword)
    IFIL * ifilptr
    TEXT * dataextn
    VOID * indxextn
    LONG permmask
    TEXT * groupid
    TEXT * fileword

COUNT
CreateDataFile(datno,filnam,datlen,xtdsiz,filmod)
    COUNT datno
    TEXT * filnam
    UCOUNT datlen
    UCOUNT xtdsiz
    COUNT filmod

COUNT
CreateDataFileXtd(datno,filnam,datlen,xtdsiz,filmod,permmask,groupid,fileword)
    COUNT datno
    TEXT * filnam
    UCOUNT datlen
    UCOUNT xtdsiz
    COUNT filmod
    LONG permmask
    TEXT * groupid
    TEXT * fileword

COUNT
CreateIFile(ifilptr)
    IFIL * ifilptr

COUNT
CreateIFileXtd(ifilptr,dataextn,indxextn,permmask,groupid,fileword)
    IFIL * ifilptr
    TEXT * dataextn
    VOID * indxextn
    LONG permmask
    TEXT * groupid
    TEXT * fileword

COUNT
CreateIndexFile(keyno,filnam,keylen,keytyp,keydup,nomemb,xtdsiz,filmod)
    COUNT keyno
    TEXT * filnam
    COUNT keylen
    COUNT keytyp
    COUNT keydup
    COUNT nomemb
    UCOUNT xtdsiz
    COUNT filmod

COUNT
CreateIndexFileXtd(keyno,filnam,keylen,keytyp,keydup,nomemb,xtdsiz,filmod,permmask,groupid,fileword)
    COUNT keyno
    TEXT * filnam
    COUNT keylen
    COUNT keytyp
    COUNT keydup
    COUNT nomemb
    UCOUNT xtdsiz
    COUNT filmod
    LONG permmask
    TEXT * groupid
    TEXT * fileword

COUNT
CreateIndexMember(keyno,keylen,keytyp,keydup,membno)
    COUNT keyno
    COUNT keylen
    COUNT keytyp
    COUNT keydup
    COUNT membno

COUNT
CreateISAM(filnam)
    TEXT * filnam

COUNT
CreateISAMXtd(filnam,userprof,userid,userword,servname,permmask,groupid,fileword)
    TEXT * filnam
    COUNT userprof
    TEXT * userid
    TEXT * userword
    TEXT * servname
    LONG permmask
    TEXT * groupid
    TEXT * fileword

COUNT
CtreeFlushFile(filno)
    COUNT filno

LONG
CurrentFileOffset(datno)
    COUNT datno

TEXT *
CurrentISAMKey(keyno,idxval,plen)
    COUNT keyno
    VOID * idxval
    VRLEN * plen

TEXT *
CurrentLowLevelKey(keyno,idxval)
    COUNT keyno
    VOID * idxval

COUNT
DeleteCtFile(filno)
    COUNT filno

COUNT
DeleteCtResource(datno,resptr)
    COUNT datno
    VOID * resptr

COUNT
DeleteIFile(ifilptr)
    IFIL * ifilptr

COUNT
DeleteKey(keyno,target,recbyt)
    COUNT keyno
    VOID * target
    LONG recbyt

LONG
DeleteKeyBlind(keyno,target)
    COUNT keyno
    VOID * target

COUNT
DeleteRecord(datno)
    COUNT datno

COUNT
DeleteRFile(datno)
    COUNT datno

COUNT
DeleteVRecord(datno)
    COUNT datno

COUNT
DoBatch(filno,request,bufptr,bufsiz,mode)
    COUNT filno
    VOID * request
    VOID * bufptr
    VRLEN bufsiz
    COUNT mode

COUNT
EnableCtResource(datno)
    COUNT datno

LONG
EstimateKeySpan(keyno,keyval1,keyval2)
    COUNT keyno
    VOID * keyval1
    VOID * keyval2

COUNT
FirstInSet(keyno,target,recptr,siglen)
    COUNT keyno
    VOID * target
    VOID * recptr
    COUNT siglen

LONG
FirstKey(keyno,idxval)
    COUNT keyno
    VOID * idxval

COUNT
FirstRecord(filno,recptr)
    COUNT filno
    VOID * recptr

COUNT
FreeBatch()

COUNT
FreeSet()

COUNT
GetAltSequence(keyno,altseq)
    COUNT keyno
    COUNT * altseq

LONG
GetCtFileInfo(filno,mode)
    COUNT filno
    COUNT mode

LONG
GetCtResource(datno,resptr,bufptr,bufsiz,resmode)
    COUNT datno
    VOID * resptr
    VOID * bufptr
    VRLEN bufsiz
    COUNT resmode

VOID *
GetCtreePointer(regid)
    TEXT * regid

COUNT
GetCtTempFileName(bufptr,bufsiz)
    VOID * bufptr
    VRLEN bufsiz

LONG
GetGTEKey(keyno,target,idxval)
    COUNT keyno
    VOID * target
    VOID * idxval

COUNT
GetGTERecord(keyno,target,recptr)
    COUNT keyno
    VOID * target
    VOID * recptr

LONG
GetGTKey(keyno,target,idxval)
    COUNT keyno
    VOID * target
    VOID * idxval

COUNT
GetGTRecord(keyno,target,recptr)
    COUNT keyno
    VOID * target
    VOID * recptr

  # COUNT
  # GetGTVRecord(keyno,target,recptr,plen)
      # COUNT keyno
      # VOID * target
      # VOID * recptr
      # VRLEN * plen

VRLEN
GetIFile(datno,buflen,bufptr)
    COUNT datno
    LONG buflen
    VOID * bufptr

LONG
GetKey(keyno,target)
    COUNT keyno
    VOID * target

LONG
GetLTEKey(keyno,target,idxval)
    COUNT keyno
    VOID * target
    VOID * idxval

COUNT
GetLTERecord(keyno,target,recptr)
    COUNT keyno
    VOID * target
    VOID * recptr

 # COUNT
 # GetLTEVRecord(keyno,target,recptr,plen)
     # COUNT keyno
     # VOID * target
     # VOID * recptr
     # VRLEN * plen

LONG
GetLTKey(keyno,target,idxval)
    COUNT keyno
    VOID * target
    VOID * idxval

COUNT
GetLTRecord(keyno,target,recptr)
    COUNT keyno
    VOID * target
    VOID * recptr

 # COUNT
 # GetLTVRecord(keyno,target,recptr,plen)
     # COUNT keyno
     # VOID * target
     # VOID * recptr
     # VRLEN * plen

LONG
GetORDKey(keyno,target,offset,idxval)
    COUNT keyno
    VOID * target
    VRLEN offset
    VOID * idxval

COUNT
GetRecord(keyno,target,recptr)
    COUNT keyno
    VOID * target
    VOID * recptr

LONG
GetSerialNbr(datno)
    COUNT datno

COUNT
GetSuperFileNames(superFileNo,nambuf,buflen,memberFileNo)
    COUNT superFileNo
    TEXT * nambuf
    LONG buflen
    COUNT memberFileNo

COUNT
GetSymbolicNames(filno,nambuf,buflen,mode)
    COUNT filno
    TEXT * nambuf
    LONG buflen
    COUNT mode

COUNT
InitCTree(bufs,fils,sect)
    COUNT bufs
    COUNT fils
    COUNT sect

COUNT
InitCTreeXtd(bufs,fils,sect,dbufs,userprof,userid,userword,servname)
    COUNT bufs
    COUNT fils
    COUNT sect
    COUNT dbufs
    COUNT userprof
    TEXT * userid
    TEXT * userword
    TEXT * servname


COUNT
InitISAMXtd(bufs,fils,sect,dbufs,userprof,userid,userword,servname)
    COUNT bufs
    COUNT fils
    COUNT sect
    COUNT dbufs
    COUNT userprof
    TEXT * userid
    TEXT * userword
    TEXT * servname

COUNT
IOPERFORMANCE(bufptr)
    VOID * bufptr

LONG
KeyAtPercentile(keyno,idxval,percent)
    COUNT keyno
    VOID * idxval
    VRLEN percent

COUNT
LastInSet(keyno,target,recptr,siglen)
    COUNT keyno
    VOID * target
    VOID * recptr
    COUNT siglen

LONG
LastKey(keyno,idxval)
    COUNT keyno
    VOID * idxval

COUNT
LastRecord(filno,recptr)
    COUNT filno
    VOID * recptr

COUNT
LoadKey(keyno,target,recbyt,typadd)
    COUNT keyno
    VOID * target
    LONG recbyt
    COUNT typadd

COUNT
LockCtData(datno,lokmod,recbyt)
    COUNT datno
    COUNT lokmod
    LONG recbyt

COUNT
LockISAM(lokmod)
    COUNT lokmod

LONG
NbrOfKeyEntries(keyno)
    COUNT keyno

LONG
NbrOfKeysInRange(keyno,keyval1,keyval2)
    COUNT keyno
    VOID * keyval1
    VOID * keyval2

LONG
NbrOfRecords(datno)
    COUNT datno

LONG
NewData(datno)
    COUNT datno

LONG
NewVData(datno,varlen)
    COUNT datno
    UCOUNT varlen

COUNT
NextInSet(keyno,recptr)
    COUNT keyno
    VOID * recptr

LONG
NextKey(keyno,idxval)
    COUNT keyno
    VOID * idxval

COUNT
NextRecord(filno,recptr)
    COUNT filno
    VOID * recptr

COUNT
OpenCtFile(filno,filnam,filmod)
    COUNT filno
    TEXT * filnam
    COUNT filmod

COUNT
OpenCtFileXtd(filno,filnam,filmod,fileword)
    COUNT filno
    TEXT * filnam
    COUNT filmod
    TEXT * fileword

COUNT
OpenFileWithResource(filno,filnam,filmod)
    COUNT filno
    TEXT * filnam
    COUNT filmod

 # COUNT
 # OpenFileWithResourceXTD(filno,filnam,filmod,fileword)
     # COUNT filno
     # TEXT * filnam
     # COUNT filmod
     # TEXT * fileword

COUNT
OpenIFile(ifilptr)
    IFIL * ifilptr

COUNT
OpenIFileXtd(ifilptr,dataextn,indxextn,fileword)
    IFIL * ifilptr
    TEXT * dataextn
    VOID * indxextn
    TEXT * fileword

COUNT
OpenISAM(filnam)
    TEXT * filnam

COUNT
OpenISAMContext(datno,keyno,contextid)
    COUNT datno
    COUNT keyno
    COUNT contextid

COUNT
OpenISAMXtd(filnam,userprof,userid,userword,servname,fileword)
    TEXT * filnam
    COUNT userprof
    TEXT * userid
    TEXT * userword
    TEXT * servname
    TEXT * fileword

 # COUNT
 # Perform(status_word)
     # LONG status_word

COUNT
PermIIndex(ifilptr)
    IFIL * ifilptr

COUNT
PositionSet(keyno,recptr,siglen)
    COUNT keyno
    VOID * recptr
    COUNT siglen

COUNT
PreviousInSet(keyno,recptr)
    COUNT keyno
    VOID * recptr

LONG
PreviousKey(keyno,idxval)
    COUNT keyno
    VOID * idxval

COUNT
PreviousRecord(filno,recptr)
    COUNT filno
    VOID * recptr

COUNT
PutDODA(datno,doda,numfld)
    COUNT datno
    DATOBJ * doda
    UCOUNT numfld

COUNT
PutIFile(ifilptr)
    IFIL * ifilptr

COUNT
PutIFileXtd(ifilptr,dataextn,indxextn,fileword)
    IFIL * ifilptr
    TEXT * dataextn
    VOID * indxextn
    TEXT * fileword

COUNT
ReadData(datno,recbyt,recptr)
    COUNT datno
    LONG recbyt
    VOID * recptr

COUNT
ReadIsamData(datno,recbyt,recptr)
    COUNT datno
    LONG recbyt
    VOID * recptr

COUNT
ReadVData(datno,recbyt,recptr,bufsiz)
    COUNT datno
    LONG recbyt
    VOID * recptr
    VRLEN bufsiz

COUNT
RebuildIFile(ifilptr)
    IFIL * ifilptr

COUNT
RebuildIFileXtd(ifilptr,dataextn,indxextn,permmask,groupid,fileword)
    IFIL * ifilptr
    TEXT * dataextn
    VOID * indxextn
    LONG permmask
    TEXT * groupid
    TEXT * fileword

COUNT
RegisterCtree(regid)
    TEXT * regid

COUNT
ReleaseData(datno,recbyt)
    COUNT datno
    LONG recbyt

COUNT
ReleaseVData(datno,recbyt)
    COUNT datno
    LONG recbyt

COUNT
ReReadRecord(datno,recptr)
    COUNT datno
    VOID * recptr

COUNT
ReReadVRecord(datno,recptr,bufsiz)
    COUNT datno
    VOID * recptr
    VRLEN bufsiz

COUNT
ResetRecord(datno,mode)
    COUNT datno
    COUNT mode

COUNT
RestoreSavePoint(savpnt)
    COUNT savpnt

COUNT
ReWriteRecord(datno,recptr)
    COUNT datno
    VOID * recptr

COUNT
ReWriteVRecord(datno,recptr,varlen)
    COUNT datno
    VOID * recptr
    UCOUNT varlen

COUNT
Security(filno,bufptr,bufsiz,mode)
    COUNT filno
    VOID * bufptr
    VRLEN bufsiz
    COUNT mode

COUNT
SetAlternateSequence(keyno,altseq)
    COUNT keyno
    COUNT * altseq

COUNT
SetNodeName(nodename)
    TEXT * nodename

LONG
SetOperationState(status_word,operation_code)
    LONG status_word
    VRLEN operation_code

COUNT
SetRecord(datno,recbyt,recptr,datlen)
    COUNT datno
    LONG recbyt
    VOID * recptr
    UCOUNT datlen

COUNT
SetSavePoint()

COUNT
SetVariableBytes(filno,pvbyte)
    COUNT filno
    UTEXT * pvbyte

COUNT
StopServer(userword,servname,delay)
    TEXT * userword
    TEXT * servname
    COUNT delay

COUNT
StopUser()

COUNT
SuperfilePrepassXtd(filnam,fileword)
    TEXT * filnam
    TEXT * fileword

COUNT
SwitchCtree(regid)
    TEXT * regid

COUNT
SystemConfiguration(bufptr)
    VOID * bufptr

COUNT
SystemMonitor(mode,timeout,buffer,buflen)
    COUNT mode
    LONG timeout
    TEXT * buffer
    LONG buflen

COUNT
TempIIndexXtd(ifilptr,permmask,groupid,fileword)
    IFIL * ifilptr
    LONG permmask
    TEXT * groupid
    TEXT * fileword

TEXT *
TransformKey(keyno,target)
    COUNT keyno
    VOID * target

COUNT
UnRegisterCtree(regid)
    TEXT * regid

COUNT
UpdateCtResource(datno,resptr,varlen)
    COUNT datno
    VOID * resptr
    UCOUNT varlen

COUNT
UpdateFileMode(filno,filmod)
    COUNT filno
    COUNT filmod

COUNT
UpdateHeader(filno,hdrval,mode)
    COUNT filno
    LONG hdrval
    COUNT mode

VRLEN
VDataLength(datno,recbyt)
    COUNT datno
    LONG recbyt

VRLEN
VRecordLength(datno)
    COUNT datno

TEXT *
WhichCtree()

COUNT
vtclose()

COUNT
WriteData(datno,recbyt,recptr)
    COUNT datno
    LONG recbyt
    VOID * recptr

COUNT
WriteVData(datno,recbyt,recptr,varlen)
    COUNT datno
    LONG recbyt
    VOID * recptr
    UCOUNT varlen