Update for Constant Chars

This replaces D-ISAM head/isbase.h and includes an option to declare char * arguments as const, where this is appropriate.

In Xcode Swift this allows String types to be passed directly to D-ISAM, as a pointer to an immutable character array.

Without this change Swift will require that all C strings are copied to a writeable first, which is wasteful in cases like file pathnames and such, where D-ISAM only needs to read the string in.

To activate this option you must define ISCONSTCHAR when including this file, for example:

#define ISCONSTCHAR 1
#include "isbase.h"
#undef ISCONSTCHAR

Download the update here.

/*
-----------------------------------------------------------------------------
isam base library header file
-----------------------------------------------------------------------------
*/

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * *
 * Worldwide Copyright (c) Byte Designs Ltd (2015) *
 * Version 7.2 (build 2015/03/10) (xcode) *
 * *
 * Byte Designs Ltd. *
 * 20568 - 32 Avenue *
 * LANGLEY, BC *
 * V2Z 2C8 CANADA *
 * *
 * Sales: sales@bytedesigns.com *
 * Support: support@bytedesigns.com *
 * Phone: (604) 534 0722 Fax: (604) 534 2601 *
 * *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */


#include "isconfig.h" /* library configuration */
#include "isintstd.h" /* see read/stdint.ref */

#include <setjmp.h> /* error handling */
#include <stdarg.h> /* standard arguments */

/* note ----------------------------------------------------------- *
 the following is pulled from a common source in the disam master,
 and is *identical* from here through #endif ISAUTOLOCK below, in
 both isbase.h and iswrap.h
 ---------------------------------------------------------------- */

#ifndef ISAUTOLOCK /* avoid multiple inclusions */

/* structures ----------------------------------------------------- */

struct keypart /* key component description */
 {
 short kp_start; /* offset within data record */
 short kp_leng; /* physical length */
 short kp_type; /* isam key type */
 };

struct keydesc /* full key description */
 {
 short k_flags; /* key characteristics */
 short k_nparts; /* number of parts in key */
 struct keypart k_part[ISMAXPARTS]; /* description of each part */
#if( defined ISINTERNAL || ISDANGEROUS )
 short k_len; /* complete key length */
 uint32_t k_rootnode; /* root node record number */
#endif
 };
 
struct dictinfo /* information about file */
 {
 short di_nkeys; /* number of indexes */
 short di_curidx; /* current index number */
 short di_recsize; /* data record (max) length */
 short di_idxsize; /* index record block size */
 uint32_t di_nrecords; /* current record count */
 };

struct audhead /* audit record header format */
 {
 char au_type[2]; /* record type (aa/dd/rr/ww) */
 char au_time[4]; /* date and time */
#if( ISLONGID == 1 )
 char au_procid[4]; /* process id */
 char au_userid[4]; /* user id */
#else
 char au_procid[2]; /* process id */
 char au_userid[2]; /* user id */
#endif
 char au_recnum[4]; /* record number */
 char au_reclen[2]; /* record length if variable */
 };

#define AUDHEADSIZE 14
#define VAUDHEADSIZE 16

/* defines ------------------------------------------------------- */

/* file handling modes */

#define ISINPUT 0x00 /* input only */
#define ISOUTPUT 0x01 /* output only */
#define ISINOUT 0x02 /* input and output */
#define ISTRANS 0x04 /* transaction processing */
#define ISNOLOG 0x08 /* turn off logging */
#define ISFIXLEN 0x00 /* dummy */
#define ISVARLEN 0x10 /* variable length data */
#define ISVARCMP 0x30 /* compressed varlen */
#define ISSYNCWR 0x40 /* synchronous writes */
#define ISMASKED 0x80 /* masking active */
#define ISNOCARE 0x8000 /* set mode to match file */

/* locking methods */

#define ISRDONLY 0x100 /* read only - no locking */
#define ISAUTOLOCK 0x200 /* automatic lock on read */
#define ISMANULOCK 0x400 /* manual locking */
#define ISEXCLLOCK 0x800 /* exclusive access to file */
#if( SEMILOCK == 1 )
#define ISSEMILOCK 0x1000 /* C-ISAM compatible semi-lock */
#endif

/* key types */
 
#define CHARTYPE 0 /* array of bytes/characters */
#define DECIMALTYPE 0 /* handled as per char type */
#define INTTYPE 1 /* two byte (short) integer */
#define LONGTYPE 2 /* four byte (long) integer */
#define DOUBLETYPE 3 /* ieee double floating point */
#define FLOATTYPE 4 /* ieee single floating point */
#define MINTTYPE 5 /* machine (native) short */
#define MLONGTYPE 6 /* machine (native) long */
#define STRINGTYPE 7 /* null terminated byte string */

#define ISDESC 0x80 /* add for descending order */

/* key atomic sizes */

#define CHARSIZE 1
#define INTSIZE 2
#define LONGSIZE 4
#define DOUBLESIZE 8
#define FLOATSIZE 4
#define MINTSIZE 2
#define MLONGSIZE 4
#define STRINGSIZE 1

/* shortcuts for single part keys */

#define k_start k_part[0].kp_start
#define k_leng k_part[0].kp_leng
#define k_type k_part[0].kp_type

#define NPARTS ISMAXPARTS

/* index management flags */

#define ISNODUPS 0x00 /* no duplicates permitted */
#define ISDUPS 0x01 /* duplicates permitted */
#define DCOMPRESS 0x02 /* compress duplicates */
#define LCOMPRESS 0x04 /* leading compression */
#define TCOMPRESS 0x08 /* trailing compression */
#define COMPRESS 0x0E /* full compression */
#define TNULL 0x10 /* compress trailing nulls */
#define NULLKEY 0x20 /* null key masking */

#define ISMASK(I) ( 1L << ((I)-1) ) /* index masking bit flags */

/* access control */

#define ISFIRST 0 /* first record */
#define ISLAST 1 /* last record */
#define ISNEXT 2 /* next record */
#define ISPREV 3 /* previous record */
#define ISCURR 4 /* current record */
#define ISEQUAL 5 /* find match */
#define ISGREAT 6 /* greater than current */
#define ISGTEQ 7 /* greater than or equal */

/* record locking */

#define ISLOCK 0x100 /* lock record or fail */
#if( ISCISAM != 0 )
# define ISSKIPLOCK 0x200 /* skip record if locked */
#endif
#define ISWAIT 0x400 /* wait until free */
#define ISLCKW 0x500 /* wait and lock */
#define ISKEEPLOCK 0x800 /* isstart keep lock */

/* audit trace control */

#define AUDSETNAME 0 /* set audit file name */
#define AUDGETNAME 1 /* get audit file name */
#define AUDSTART 2 /* begin audit logging */
#define AUDSTOP 3 /* stop audit logging */
#define AUDINFO 4 /* logging status */

#define USERINFOSIZE 10 /* userinfo pad size */

/* isam specific error codes (iserrno) */

#define EDUPL ( ISERRBASE + 0 ) /* illegal duplicate */
#define ENOTOPEN ( ISERRBASE + 1 ) /* file not open */
#define EBADARG ( ISERRBASE + 2 ) /* illegal argument */
#define EBADKEY ( ISERRBASE + 3 ) /* illegal key description */
#define ETOOMANY ( ISERRBASE + 4 ) /* out of isam file handles */
#define EBADFILE ( ISERRBASE + 5 ) /* isam file is corrupt */
#define ENOTEXCL ( ISERRBASE + 6 ) /* can't get exclusive access */
#define ELOCKED ( ISERRBASE + 7 ) /* record is locked */
#define EKEXISTS ( ISERRBASE + 8 ) /* index already defined */
#define EPRIMKEY ( ISERRBASE + 9 ) /* illegal primary key operation */
#define EENDFILE ( ISERRBASE + 10 ) /* start or end file reached */
#define ENOREC ( ISERRBASE + 11 ) /* record not found */
#define ENOCURR ( ISERRBASE + 12 ) /* no current record */
#define EFLOCKED ( ISERRBASE + 13 ) /* file is locked */
#define EFNAME ( ISERRBASE + 14 ) /* file name is too long */
#define ENOLOK ( ISERRBASE + 15 ) /* not used */
#define EBADMEM ( ISERRBASE + 16 ) /* can't allocate memory */
#define EBADCOLL ( ISERRBASE + 17 ) /* not used, see next */
#define EBADIO ( ISERRBASE + 17 ) /* trouble in IO */
#define ELOGREAD ( ISERRBASE + 18 ) /* error reading log file */
#define EBADLOG ( ISERRBASE + 19 ) /* log file is corrupt */
#define ELOGOPEN ( ISERRBASE + 20 ) /* unable to open log */
#define ELOGWRIT ( ISERRBASE + 21 ) /* unable to write log */
#define ENOTRANS ( ISERRBASE + 22 ) /* transaction not found */
#define ENOSHMEM ( ISERRBASE + 23 ) /* out of shared memory */
#define ENOBEGIN ( ISERRBASE + 24 ) /* no current transaction */
#define ENONFS ( ISERRBASE + 25 ) /* not used */
#define EBADROWID ( ISERRBASE + 26 ) /* not used */
#define ENOPRIM ( ISERRBASE + 27 ) /* no primary key */
#define ENOLOG ( ISERRBASE + 28 ) /* logging not allowed */
#define EUSER ( ISERRBASE + 29 ) /* too many users */
#define ENODBS ( ISERRBASE + 30 ) /* not used */
#define ENOFREE ( ISERRBASE + 31 ) /* not used */
#define EROWSIZE ( ISERRBASE + 32 ) /* varlen record too big */
#define EAUDIT ( ISERRBASE + 33 ) /* existing audit trail */
#define ENOLOCKS ( ISERRBASE + 34 ) /* out of room in lock table */
#define EEXPIRED ( ISERRBASE + 35 ) /* evaluation library has expired */
#define ENOCONNECT ( ISERRBASE + 36 ) /* no connect with remote server */
#define ENETORDER ( ISERRBASE + 37 ) /* server has wrong endian order */
#define EREPAIR ( ISERRBASE + 38 ) /* auto repair in progress */
#define EBADADDR ( ISERRBASE + 39 ) /* bad network address */
#define ENOSCHEMA ( ISERRBASE + 40 ) /* no schema defined */
#define EEXSCHEMA ( ISERRBASE + 41 ) /* schema already defined */
#define ENOTAVAIL ( ISERRBASE + 42 ) /* remote function not available */

/* on system error - iserrio = IO_call + IO_file */

#define IO_OPEN 0x10 /* open */
#define IO_CREA 0x20 /* create */
#define IO_SEEK 0x30 /* seek */
#define IO_READ 0x40 /* read */
#define IO_WRIT 0x50 /* write */
#define IO_LOCK 0x60 /* lock */
#define IO_OTHER 0x70 /* other */

#define IO_IDX 0x01 /* index file */
#define IO_DAT 0x02 /* data file */
#define IO_AUD 0x03 /* audit trace */
#define IO_RAW 0x04 /* any other file */
#define IO_REP 0x05 /* auto repair file */
#define IO_LOG 0x06 /* transaction log */
#define IO_LCK 0x07 /* offline lock file */

#define IO_LOK 0x04 /* cisam, not used */
#define IO_SEM 0x05 /* cisam, not used */

/* cobol isstat4 values --------------------------------------------*/

#define STATNULL ' ' /* empty isstat4 value */
#define STAT1 '1'
#define STAT2 '2'
#define STAT3 '3'
#define STAT4 '4'
#define STAT5 '5'
#define STAT6 '6'
#define STAT7 '7'
#define STAT8 '8'
#define STAT9 '9'
#define STAT0 '0'

/* self check facility ------------------------------------------- */

#define IC_DATREAD 0 /* data file read error */
#define IC_BADDATA 1 /* data record corrupt */
#define IC_DATFREE 2 /* data free list is corrupt */

#define IC_IDXREAD 3 /* index file read error */
#define IC_ORDER 4 /* key out of order */
#define IC_COUNT 5 /* index count mismatch */
#define IC_BADMAGIC 6 /* bad index node magic number */
#define IC_MATCH 7 /* index/data mismatch */
#define IC_SANITY 8 /* compiler sanity check */
#define IC_DUPSEQ 9 /* bad duplicate sequence */

#if( ISVARIABLE )

#define IC_VLHASHZERO 11 /* hash table zero loaded */
#define IC_VLMISFILE 12 /* node misfiled in hash table */
#define IC_VLHASHLINK 13 /* mangled link in hash list */
#define IC_VLMISSING 14 /* nodes missing or unaccounted */
#define IC_VLBADDATA 15 /* data length mismatch */
 
struct IsVarStat /* variable length statistics */
 {
 uint32_t hashcount;
 uint32_t hashspace;
 uint32_t fullcount;
 uint32_t fullspace;
 uint32_t filecount;
 uint32_t filespace;
 };
 
#endif 

#endif /*ISAUTOLOCK*/

/* ---------------------------------------------------------------- *
 above is pulled from common source, see #ifdef ISAUTOLOCK above.
 ---------------------------------------------------------------- */

/* useful defines ----------------------------------------------- */

#define ISTRUE 1
#define ISFALSE 0

/* convenient shortcuts ----------------------------------------- */

typedef struct IsamFile IsFile;
typedef struct keydesc IsKdsc;
typedef struct keypart IsKprt;

#if( defined ISINTERNAL || defined ISDANGEROUS )

/* base library internal definitions ----------------------------- */

#define TRUE 1
#define FALSE 0

#define SETBIT( F, O ) ( F | ( 1 << ( O ) ) )
#define UNSBIT( F, O ) ( F & ~( 1 << ( O ) ) )
#define BITSET( F, O ) ( F & ( 1 << ( O ) ) )

#define ISREALLOC(S,P,O,N) ( struct S * )is_realloc( ( char * )P, O, N )
#define ISALLOC(S) ( struct S * )is_malloc( sizeof( struct S ) )
#define ISFREE(S,P) ( struct S * )is_free( ( char * )P )

#define ISNODEMAX ( isam->idxlen - 4 )

#define ISFAIL(I,M) ( ! isEntry( I, M ) || setjmp( I->trap ) )
 
#define ISFATAL is_fatal( "fatal isam error %s(%d)", __FILE__, __LINE__ )

/* path handling ------------------------------------------------- */

#define ISAMPRIME(I) ( (I)->maxidx ? (I)->path[0]->kdsc : NULL )
#define ISAMINDEX(I) ( ( (I)->curidx < (I)->maxidx ) ? (I)->path[(I)->curidx]->kdsc : NULL )

/* to be deprecated */
#define ISPATH ( isam->path[isam->curidx] )
#define ISKDSC ( isam->path[isam->curidx]->kdsc )

#define ISTAIL ( ISPATH->tail )
#define TAIL path->tail

#define ISEMPTY(P) ( P->tail->used == 2 )
 

/* specialised machine independant integers ---------------------- */

#define LDRECD(P) ( ldMint( P, 4 ) & 0x7FFFFFFFL )
#define LDDUP(P,L) ( ldMint( P, L ) )
#define STDUP(P,L,D) ( stMint( P, L, D ) )


/* structure specific flags and state values --------------------- */

#define ISREALFILE 0 /* stored on file system */
#define ISIPSOCKET 1 /* mounted on network socket */
#define ISNAMEPIPE 2 /* mounted on named pipe */
#define ISEXECPIPE 3 /* mounted on process pipe */

/* IsamFile - bit flags */
#define ISNOPRIM 0 /* primary is natural order */
#define ISNOTNEXT 1 /* read/start next dislocate */
#define ISNOTPREV 2 /* read/start prev dislocate */
#define ISWRLOCK 3 /* lock records on write */
#define ISPRECIOUS 4 /* do not reuse data slots */
#define ISLOCKCHECK 5 /* check locked on update/delete */
#define ISNOCURRENT 6 /* current is not viable */
#define ISLOGDEFER 7 /* open/close deferred logging */

/* IsamNode - state values */
#define ISNDREF 0 /* image must be refreshed */
#define ISNDOK 1 /* image is current */
#define ISNDUPD 2 /* image has been updated */

/* index file records -------------------------------------------- */

struct IsamNode /* index file record */
 {
 struct IsamNode *prev; /* parent node */
 struct IsamNode *split; /* sibling */

 uint32_t idxrec; /* idx file record number */
 char *image; /* disk image */
 char state; /* current status */
 int used; /* number of bytes used */
 int level; /* zero is leaf node */
 
 int keyoff; /* current key offset */
 int keyend; /* end of compressed key */
 uint32_t recnum; /* current record number */
 uint32_t dupnum; /* current duplicate number */
 char *keyval; /* key contents */
 };


/* schema/record layout ------------------------------------------ */

struct IsamRec
 {
 char *image; /* current node image */
 uint32_t root; /* root recnum */
 uint32_t last; /* last recnum */
 };


/* index handling ------------------------------------------------ */

struct IsamPath /* index details */
 {
 struct keydesc *kdsc; /* key description */
 struct IsamNode *tail; /* current path tail */
 struct IsamNode *buf[ISMAXBUF]; /* buffering system */
 
 int slotlen; /* key slot length */
 int duplen; /* valid if dups */
 int partial; /* active partial length */
 char current[ISMAXKEY]; /* current key value */
 uint32_t recnum; /* current record number */
 uint32_t dupnum; /* current dupnum i/a */
 int cmplen; /* current compare */
 char flags; /* bit flags */
 };


/* free list control structure ----------------------------------- */

struct IsamFree
 {
 char *image; /* index node image */
 char *split; /* hold for update */
 char state; /* update status */
 uint32_t root; /* list root record */
 uint32_t last; /* last used recnum */
 int used; /* bytes used in node */
 };

 
/* typedefs */

typedef struct IsamPath IsPath;
typedef struct IsamNode IsNode;
typedef struct IsamFree IsFree;


#endif /* ISINTERNAL || ISDANGEROUS */

/* isam file descriptor ------------------------------------------ */

struct IsamFile /* isam file description */
 {
 /* IO block HEAD - this structure matches on all sources */

 char *name; /* isam path and name */
 char where; /* source switch case */

#if( ISADMIN )
 int admid; /* admin table offset */
#endif

 /* IO block DATA - openmode through maxlen, should not change */

 int openmode; /* open mode bit flags */

 int idxlen; /* index node size */
 int duplen; /* duplicate sequence width */
 int maxidx; /* number of indexes */
 int curidx; /* current index number */
 uint32_t mask; /* index masking bit array */

 uint32_t isrecnum; /* current record number */
 int isreclen; /* current record length */
 int iserrno; /* failure code */
 int iserrio; /* what and where */

 int datlen; /* data record length */
 int datblk; /* data file record block */
 int maxlen; /* variable length max */

#if( ISMFCOBOL > 0 )
 char isstat1; /* cobol status variables */
 char isstat2;
 char isstat3;
 char isstat4;
#endif

#if( ISEXTENDED )
 int32_t ispid; /* pid of blocking lock */
#endif
 
 /* IO block END, remainder is local and specific to source */

#if( defined ISINTERNAL || defined ISDANGEROUS )

 int flags; /* all internal bit flags */

 int datfd; /* data file handle */
 int idxfd; /* index file handle */

 int ( *rdfilter )( int, char *, int );/* read filtering callback */

 uint32_t natcurr; /* natural order current */

 uint32_t kdsc; /* key desc list root node */
 uint32_t delta; /* concurrency control */
 uint32_t unique; /* unique id value */

 struct IsamPath *path[ISMAXIDX]; /* active path array */

 struct IsamFree idxfree; /* index free list */
 struct IsamFree datfree; /* data free list */
 
 struct IsamRec schema; /* schema pointers */

 uint32_t *lklist; /* list of record locks */
 uint32_t lkllen; /* current list length */
 char lkstate; /* locking state flags */
 
 char *image; /* header record image */
 char *data; /* current data image */
 
 int workmode; /* reading or writing */
 jmp_buf trap; /* longjump trap point */

#if( ISAUDIT )
 uint32_t audit; /* audit control node */
 char audinfo[69]; /* allocated info block */
 int audfd; /* trace file handle */
#endif
 
#if( ISLOGGING )
 int txnpid; /* transaction process id */
 int txnfile; /* transaction file id */
#endif 
 
#if( ISVARIABLE ) 
 uint32_t *hashtab; /* hash table array */
 char *varnode; /* varlen node image */
 char hashload; /* refresh flag */
 char *vcbuf; /* vl compression temp buffer */
 int vclen; /* vl compression temp length */
#endif 

#if( ISVARIABLE > 1 ) 
 uint32_t hashrecd; /* hash table record */
 char *hashnode; /* hash table image */
#endif 

#if( ISLOCKING == 3 )
 int lokfd; /* lock file handle */
 int32_t lokid; /* unique locking id */
#endif
 
#if( ISLKINFO == 1 )
 char *lockinfo; /* lock information block */
#endif
 
#if( ISTHREADED )
 int gotmtseek;
 int gotmtread;
 int gotmtlock;
 int gotmtwrite;
 int gotmtmast;
#endif

#endif /* ISINTERNAL || ISDANGEROUS */
 };


/* custom details ------------------------------------------------ */

#if( ISCUSTOM == 1 )
# include <iscustom.h>
#endif

/* entry function prototypes ------------------------------------- */

#if( ISDECLARE )
# define ISD3(s) s
#else
# define ISD3(s) ()
#endif

#if( ISDATAVOID )
# define ISDD void
#else
# define ISDD char
#endif

#if( ISCONSTCHAR )
# define ISCC const char
#else
# define ISCC char
#endif

#if( ISDYNAMIC == 0 || ISDYNAMIC == 3 || ISDYNAMIC == 4 )
# if( defined ISINTERNAL )
# define ISD1 
# else
# define ISD1 extern
# endif
# define ISD2
#endif

#if( ISDYNAMIC == 1 )
# if( defined ISINTERNAL )
# define ISD1
# define ISD2 __far __pascal __export
# else
# define ISD1 extern
# define ISD2 __far __pascal
# endif
#endif

#if( ISDYNAMIC == 2 )
# if( defined ISINTERNAL )
# define ISD1 __declspec( dllexport )
# else
# define ISD1 __declspec( dllimport )
# endif
# define ISD2
#endif

#ifdef __cplusplus
extern "C" {
#endif

#if( ! defined ISINTERNAL )
# if( ISDYNAMIC < 3 )
# ifdef ISEXPIRE
ISD1 ISCC * ISD2 isevaluation;
# endif
ISD1 ISCC * ISD2 isversnumber;
ISD1 ISCC * ISD2 isverstring;
ISD1 ISCC * ISD2 iscopyright;
ISD1 int ISD2 is_nerr;
ISD1 ISCC * ISD2 is_errlist[43];
ISD1 ISCC * ISD2 isCheckMsg[16];
# endif
#endif

ISD1 int ISD2 isLock ISD3((IsFile *isam));
ISD1 int ISD2 isUnLock ISD3((IsFile *isam));
ISD1 int ISD2 isRelease ISD3((IsFile *isam));
ISD1 int ISD2 isRelRec ISD3((IsFile *isam, uint32_t recnum));
ISD1 int ISD2 isRelCurr ISD3((IsFile *isam));

ISD1 int ISD2 isThreaded ISD3((void));
ISD1 int ISD2 isThreadedDone ISD3((void));
ISD1 int ISD2 isAdmDtoI ISD3((IsFile *isam));
ISD1 IsFile * ISD2 isAdmItoD ISD3((int id));
ISD1 int ISD2 isCleanUp ISD3((void));
ISD1 int ISD2 isRemoteFree ISD3((void));
ISD1 IsFile * ISD2 isAdmTxnLast ISD3((void));

ISD1 IsFile * ISD2 isBuild ISD3((ISCC *name, int dlen, int mlen, IsKdsc *kdsc, int mode));
ISD1 int ISD2 isPrecious ISD3((IsFile *isam, int flag));
ISD1 int ISD2 isAddIndex ISD3((IsFile *isam, IsKdsc *kdsc));
ISD1 int ISD2 isUserInfo ISD3((IsFile *isam, int mode, char *pad));

ISD1 int ISD2 isDelete ISD3((IsFile *isam, ISDD *pad));
ISD1 int ISD2 isDelCurr ISD3((IsFile *isam));
ISD1 int ISD2 isDelRec ISD3((IsFile *isam, uint32_t recnum));

ISD1 int ISD2 isErase ISD3((ISCC *name));
ISD1 int ISD2 isRename ISD3((ISCC *oname, ISCC *nname));

ISD1 int ISD2 isDelIndex ISD3((IsFile *isam, IsKdsc *kdsc));

ISD1 int ISD2 isIndexInfo ISD3((IsFile *isam, IsKdsc *kdsc, int idx));
ISD1 int ISD2 isIsamInfo ISD3((IsFile *isam, struct dictinfo *dict));

ISD1 int ISD2 isErrno ISD3((IsFile *isam));
ISD1 int ISD2 isErrio ISD3((IsFile *isam));
ISD1 int ISD2 isCount ISD3((IsFile *isam));
ISD1 int ISD2 isRecnum ISD3((IsFile *isam));
ISD1 int ISD2 isReclen ISD3((IsFile *isam));
ISD1 int ISD2 isSetrec ISD3((IsFile *isam, uint32_t recnum));
ISD1 int ISD2 isSetlen ISD3((IsFile *isam, short reclen));

ISD1 IsFile * ISD2 isOpen ISD3((ISCC *name, int mode));
ISD1 int ISD2 isClose ISD3((IsFile *isam));
ISD1 int ISD2 isLockCheck ISD3((IsFile *isam, int flag));
ISD1 int ISD2 isSetMode ISD3((IsFile *isam, int mode));

ISD1 IsFile * ISD2 isCluster ISD3((IsFile *isam, IsKdsc *kdsc));
ISD1 IsFile * ISD2 isClone ISD3((IsFile *isam, ISCC *name ));
ISD1 int ISD2 isCopy ISD3((IsFile *dest, IsFile *source, IsKdsc *kdsc));

ISD1 int ISD2 isRead ISD3((IsFile *isam, ISDD *pad, int mode));
ISD1 int ISD2 isStart ISD3((IsFile *isam, IsKdsc *key, int len, ISDD *pad, int mode));
ISD1 int ISD2 isIndex ISD3((IsFile *isam, int idx));
ISD1 int ISD2 isGoto ISD3((IsFile *isam, uint32_t recnum));
ISD1 int ISD2 isPush ISD3((IsFile *isam, int *idx, uint32_t *rec));
ISD1 int ISD2 isPop ISD3((IsFile *isam, int idx, uint32_t rec));
ISD1 int ISD2 isData ISD3((IsFile *isam, ISDD *pad, uint32_t recnum));

ISD1 int ISD2 isLdSchema ISD3((IsFile *isam, ISCC *path));
ISD1 int ISD2 isDpSchema ISD3((IsFile *isam));
ISD1 int ISD2 isStSchema ISD3((IsFile *isam, ISCC *loadfile));
ISD1 int ISD2 isRmSchema ISD3((IsFile *isam));

ISD1 int ISD2 isSetUnique ISD3((IsFile *isam, uint32_t value));
ISD1 int ISD2 isUniqueId ISD3((IsFile *isam, uint32_t *dest));

ISD1 int ISD2 isGetLastRec ISD3((IsFile *isam, uint32_t *last));
ISD1 int ISD2 isSetLastRec ISD3((IsFile *isam, uint32_t last));
ISD1 int ISD2 isLastRec ISD3((IsFile *isam, uint32_t *last));

ISD1 int ISD2 isRewrite ISD3((IsFile *isam, ISDD *newpad));
ISD1 int ISD2 isRewCurr ISD3((IsFile *isam, ISDD *newpad));
ISD1 int ISD2 isRewRec ISD3((IsFile *isam, uint32_t recnum, ISDD *newpad));
ISD1 int ISD2 isRewNxt ISD3((IsFile *isam, ISDD *newpad));

ISD1 int ISD2 isWrite ISD3((IsFile *isam, ISDD *pad));
ISD1 int ISD2 isWrLock ISD3((IsFile *isam, ISDD *pad));
ISD1 int ISD2 isWrCurr ISD3((IsFile *isam, ISDD *pad));

ISD1 int ISD2 isAudit ISD3((IsFile *isam, char *pad, int mode));

ISD1 int ISD2 isTxnInit ISD3((short ( *call )(void) ));
ISD1 int ISD2 isLogOpen ISD3((ISCC *name));
ISD1 int ISD2 isLogClose ISD3((void));
ISD1 int ISD2 isBegin ISD3((void));
ISD1 int ISD2 isCommit ISD3((void));
ISD1 int ISD2 isRollBack ISD3((void));
ISD1 int ISD2 isRecover ISD3((void));
ISD1 int ISD2 isSuspLog ISD3((void));
ISD1 int ISD2 isResumLog ISD3((void));
ISD1 int ISD2 isTxnId ISD3((int value));

ISD1 uint32_t ISD2 isFreeCount ISD3((IsFile *isam, int which, int (*call )(char *node )));

ISD1 int ISD2 isAmSane ISD3((void));
ISD1 int ISD2 isCheckData ISD3((IsFile *isam));
ISD1 int ISD2 isCheckIndex ISD3((IsFile *isam, int idx));
ISD1 int ISD2 isRebuildFree ISD3((IsFile *isam, int which));
ISD1 int ISD2 isRebuildIdx ISD3((IsFile *isam, int idx));
#if( ISVARIABLE )
ISD1 int ISD2 isCheckVarlen ISD3((IsFile *isam, struct IsVarStat *stats));
#endif

ISD1 void ISD2 isFatal ISD3((void(*call)(char *)));

ISD1 int ISD2 isStartUp ISD3((void));

ISD1 ISCC * ISD2 isSeeKey ISD3((int isfd));

ISD1 int64_t ISD2 ldHint ISD3((char *pad, int len));
ISD1 int ISD2 stHint ISD3((char *pad, int len, int64_t val));
ISD1 int32_t ISD2 ldMint ISD3((char *pad, int len));
ISD1 int ISD2 stMint ISD3((char *pad, int len, int32_t val));

ISD1 int ISD2 ldInt ISD3((char *pad));
ISD1 int ISD2 stInt ISD3((int value, char *pad));
ISD1 int32_t ISD2 ldLong ISD3((char *pad));
ISD1 int ISD2 stLong ISD3((int32_t value, char *pad));
ISD1 int ISD2 stChar ISD3((char *str, char *pad, int len));
ISD1 int ISD2 ldChar ISD3((char *pad, int len, char *str));
ISD1 float ISD2 ldFloat ISD3((char *pad)); 
ISD1 int ISD2 stFloat ISD3((float value, char *pad));
ISD1 double ISD2 ldDbl ISD3((char *pad)); 
ISD1 int ISD2 stDbl ISD3((double value, char *pad));
ISD1 int ISD2 stFltNull ISD3((float value, char *pad, short null));
ISD1 float ISD2 ldFltNull ISD3((char *pad, short *null));
ISD1 int ISD2 stDblNull ISD3((double value, char *pad, short null));
ISD1 double ISD2 ldDblNull ISD3((char *pad, short *null));

#if 0 /* deprecated, please contact Byte Designs if needed */
ISD1 int ISD2 stDate ISD3((Date *dest, char *src));
ISD1 char * ISD2 ldDate ISD3((char *dest, Date *src));
ISD1 int ISD2 stTime ISD3((Time *dest, char *src));
ISD1 char * ISD2 ldTime ISD3((char *dest, Time *src));
#endif

/* base/isdebug.c */
ISD1 const char * ISD2 isWhere ISD3(( int work ));
ISD1 const char * ISD2 isWhat ISD3(( int which ));
ISD1 void ISD2 isDebug ISD3(( IsFile *isam, int level, ISCC *fmt, ... ));
ISD1 void ISD2 isvDebug ISD3(( IsFile *isam, int level, ISCC *fmt, va_list ap ));
ISD1 void ISD2 isDebugAsc ISD3(( IsFile *isam, int level, ISCC *tag, ISCC *dat, int len ));
ISD1 void ISD2 isDebugHex ISD3(( IsFile *isam, int level, ISCC *tag, ISCC *dat, int len ));

#ifdef __cplusplus
};
#endif

#if( defined ISINTERNAL )
#else
# undef ISD1
# undef ISD2
# undef ISD3
# undef ISDD
#endif

/* end header ---------------------------------------------------- */

Leave a Reply