{"id":480,"date":"2015-03-10T18:14:48","date_gmt":"2015-03-11T01:14:48","guid":{"rendered":"http:\/\/www.isam.ca\/?p=480"},"modified":"2015-03-21T17:05:00","modified_gmt":"2015-03-22T00:05:00","slug":"update-for-constant-chars","status":"publish","type":"post","link":"https:\/\/www.isam.ca\/?p=480","title":{"rendered":"Update for Constant Chars"},"content":{"rendered":"<p>This replaces D-ISAM <code>head\/isbase.h<\/code> and includes an option to declare <code>char *<\/code> arguments as <code>const<\/code>, where this is appropriate.<\/p>\n<p>In Xcode Swift this allows <code>String<\/code> types to be passed directly to D-ISAM, as a pointer to an immutable character array.<\/p>\n<p>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.<\/p>\n<p>To activate this option you must define ISCONSTCHAR when including this file, for example:<\/p>\n<pre>#define ISCONSTCHAR 1\r\n#include \"isbase.h\"\r\n#undef ISCONSTCHAR<\/pre>\n<p>Download the update <a title=\"Update for Constant Chars\" href=\"http:\/\/www.isam.ca\/?download=597\">here<\/a>.<\/p>\n<pre>\/*\r\n-----------------------------------------------------------------------------\r\nisam base library header file\r\n-----------------------------------------------------------------------------\r\n*\/\r\n\r\n\/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n * *\r\n * Worldwide Copyright (c) Byte Designs Ltd (2015) *\r\n * Version 7.2 (build 2015\/03\/10) (xcode) *\r\n * *\r\n * Byte Designs Ltd. *\r\n * 20568 - 32 Avenue *\r\n * LANGLEY, BC *\r\n * V2Z 2C8 CANADA *\r\n * *\r\n * Sales: sales@bytedesigns.com *\r\n * Support: support@bytedesigns.com *\r\n * Phone: (604) 534 0722 Fax: (604) 534 2601 *\r\n * *\r\n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\/\r\n\r\n\r\n#include \"isconfig.h\" \/* library configuration *\/\r\n#include \"isintstd.h\" \/* see read\/stdint.ref *\/\r\n\r\n#include &lt;setjmp.h&gt; \/* error handling *\/\r\n#include &lt;stdarg.h&gt; \/* standard arguments *\/\r\n\r\n\/* note ----------------------------------------------------------- *\r\n the following is pulled from a common source in the disam master,\r\n and is *identical* from here through #endif ISAUTOLOCK below, in\r\n both isbase.h and iswrap.h\r\n ---------------------------------------------------------------- *\/\r\n\r\n#ifndef ISAUTOLOCK \/* avoid multiple inclusions *\/\r\n\r\n\/* structures ----------------------------------------------------- *\/\r\n\r\nstruct keypart \/* key component description *\/\r\n {\r\n short kp_start; \/* offset within data record *\/\r\n short kp_leng; \/* physical length *\/\r\n short kp_type; \/* isam key type *\/\r\n };\r\n\r\nstruct keydesc \/* full key description *\/\r\n {\r\n short k_flags; \/* key characteristics *\/\r\n short k_nparts; \/* number of parts in key *\/\r\n struct keypart k_part[ISMAXPARTS]; \/* description of each part *\/\r\n#if( defined ISINTERNAL || ISDANGEROUS )\r\n short k_len; \/* complete key length *\/\r\n uint32_t k_rootnode; \/* root node record number *\/\r\n#endif\r\n };\r\n \r\nstruct dictinfo \/* information about file *\/\r\n {\r\n short di_nkeys; \/* number of indexes *\/\r\n short di_curidx; \/* current index number *\/\r\n short di_recsize; \/* data record (max) length *\/\r\n short di_idxsize; \/* index record block size *\/\r\n uint32_t di_nrecords; \/* current record count *\/\r\n };\r\n\r\nstruct audhead \/* audit record header format *\/\r\n {\r\n char au_type[2]; \/* record type (aa\/dd\/rr\/ww) *\/\r\n char au_time[4]; \/* date and time *\/\r\n#if( ISLONGID == 1 )\r\n char au_procid[4]; \/* process id *\/\r\n char au_userid[4]; \/* user id *\/\r\n#else\r\n char au_procid[2]; \/* process id *\/\r\n char au_userid[2]; \/* user id *\/\r\n#endif\r\n char au_recnum[4]; \/* record number *\/\r\n char au_reclen[2]; \/* record length if variable *\/\r\n };\r\n\r\n#define AUDHEADSIZE 14\r\n#define VAUDHEADSIZE 16\r\n\r\n\/* defines ------------------------------------------------------- *\/\r\n\r\n\/* file handling modes *\/\r\n\r\n#define ISINPUT 0x00 \/* input only *\/\r\n#define ISOUTPUT 0x01 \/* output only *\/\r\n#define ISINOUT 0x02 \/* input and output *\/\r\n#define ISTRANS 0x04 \/* transaction processing *\/\r\n#define ISNOLOG 0x08 \/* turn off logging *\/\r\n#define ISFIXLEN 0x00 \/* dummy *\/\r\n#define ISVARLEN 0x10 \/* variable length data *\/\r\n#define ISVARCMP 0x30 \/* compressed varlen *\/\r\n#define ISSYNCWR 0x40 \/* synchronous writes *\/\r\n#define ISMASKED 0x80 \/* masking active *\/\r\n#define ISNOCARE 0x8000 \/* set mode to match file *\/\r\n\r\n\/* locking methods *\/\r\n\r\n#define ISRDONLY 0x100 \/* read only - no locking *\/\r\n#define ISAUTOLOCK 0x200 \/* automatic lock on read *\/\r\n#define ISMANULOCK 0x400 \/* manual locking *\/\r\n#define ISEXCLLOCK 0x800 \/* exclusive access to file *\/\r\n#if( SEMILOCK == 1 )\r\n#define ISSEMILOCK 0x1000 \/* C-ISAM compatible semi-lock *\/\r\n#endif\r\n\r\n\/* key types *\/\r\n \r\n#define CHARTYPE 0 \/* array of bytes\/characters *\/\r\n#define DECIMALTYPE 0 \/* handled as per char type *\/\r\n#define INTTYPE 1 \/* two byte (short) integer *\/\r\n#define LONGTYPE 2 \/* four byte (long) integer *\/\r\n#define DOUBLETYPE 3 \/* ieee double floating point *\/\r\n#define FLOATTYPE 4 \/* ieee single floating point *\/\r\n#define MINTTYPE 5 \/* machine (native) short *\/\r\n#define MLONGTYPE 6 \/* machine (native) long *\/\r\n#define STRINGTYPE 7 \/* null terminated byte string *\/\r\n\r\n#define ISDESC 0x80 \/* add for descending order *\/\r\n\r\n\/* key atomic sizes *\/\r\n\r\n#define CHARSIZE 1\r\n#define INTSIZE 2\r\n#define LONGSIZE 4\r\n#define DOUBLESIZE 8\r\n#define FLOATSIZE 4\r\n#define MINTSIZE 2\r\n#define MLONGSIZE 4\r\n#define STRINGSIZE 1\r\n\r\n\/* shortcuts for single part keys *\/\r\n\r\n#define k_start k_part[0].kp_start\r\n#define k_leng k_part[0].kp_leng\r\n#define k_type k_part[0].kp_type\r\n\r\n#define NPARTS ISMAXPARTS\r\n\r\n\/* index management flags *\/\r\n\r\n#define ISNODUPS 0x00 \/* no duplicates permitted *\/\r\n#define ISDUPS 0x01 \/* duplicates permitted *\/\r\n#define DCOMPRESS 0x02 \/* compress duplicates *\/\r\n#define LCOMPRESS 0x04 \/* leading compression *\/\r\n#define TCOMPRESS 0x08 \/* trailing compression *\/\r\n#define COMPRESS 0x0E \/* full compression *\/\r\n#define TNULL 0x10 \/* compress trailing nulls *\/\r\n#define NULLKEY 0x20 \/* null key masking *\/\r\n\r\n#define ISMASK(I) ( 1L &lt;&lt; ((I)-1) ) \/* index masking bit flags *\/\r\n\r\n\/* access control *\/\r\n\r\n#define ISFIRST 0 \/* first record *\/\r\n#define ISLAST 1 \/* last record *\/\r\n#define ISNEXT 2 \/* next record *\/\r\n#define ISPREV 3 \/* previous record *\/\r\n#define ISCURR 4 \/* current record *\/\r\n#define ISEQUAL 5 \/* find match *\/\r\n#define ISGREAT 6 \/* greater than current *\/\r\n#define ISGTEQ 7 \/* greater than or equal *\/\r\n\r\n\/* record locking *\/\r\n\r\n#define ISLOCK 0x100 \/* lock record or fail *\/\r\n#if( ISCISAM != 0 )\r\n# define ISSKIPLOCK 0x200 \/* skip record if locked *\/\r\n#endif\r\n#define ISWAIT 0x400 \/* wait until free *\/\r\n#define ISLCKW 0x500 \/* wait and lock *\/\r\n#define ISKEEPLOCK 0x800 \/* isstart keep lock *\/\r\n\r\n\/* audit trace control *\/\r\n\r\n#define AUDSETNAME 0 \/* set audit file name *\/\r\n#define AUDGETNAME 1 \/* get audit file name *\/\r\n#define AUDSTART 2 \/* begin audit logging *\/\r\n#define AUDSTOP 3 \/* stop audit logging *\/\r\n#define AUDINFO 4 \/* logging status *\/\r\n\r\n#define USERINFOSIZE 10 \/* userinfo pad size *\/\r\n\r\n\/* isam specific error codes (iserrno) *\/\r\n\r\n#define EDUPL ( ISERRBASE + 0 ) \/* illegal duplicate *\/\r\n#define ENOTOPEN ( ISERRBASE + 1 ) \/* file not open *\/\r\n#define EBADARG ( ISERRBASE + 2 ) \/* illegal argument *\/\r\n#define EBADKEY ( ISERRBASE + 3 ) \/* illegal key description *\/\r\n#define ETOOMANY ( ISERRBASE + 4 ) \/* out of isam file handles *\/\r\n#define EBADFILE ( ISERRBASE + 5 ) \/* isam file is corrupt *\/\r\n#define ENOTEXCL ( ISERRBASE + 6 ) \/* can't get exclusive access *\/\r\n#define ELOCKED ( ISERRBASE + 7 ) \/* record is locked *\/\r\n#define EKEXISTS ( ISERRBASE + 8 ) \/* index already defined *\/\r\n#define EPRIMKEY ( ISERRBASE + 9 ) \/* illegal primary key operation *\/\r\n#define EENDFILE ( ISERRBASE + 10 ) \/* start or end file reached *\/\r\n#define ENOREC ( ISERRBASE + 11 ) \/* record not found *\/\r\n#define ENOCURR ( ISERRBASE + 12 ) \/* no current record *\/\r\n#define EFLOCKED ( ISERRBASE + 13 ) \/* file is locked *\/\r\n#define EFNAME ( ISERRBASE + 14 ) \/* file name is too long *\/\r\n#define ENOLOK ( ISERRBASE + 15 ) \/* not used *\/\r\n#define EBADMEM ( ISERRBASE + 16 ) \/* can't allocate memory *\/\r\n#define EBADCOLL ( ISERRBASE + 17 ) \/* not used, see next *\/\r\n#define EBADIO ( ISERRBASE + 17 ) \/* trouble in IO *\/\r\n#define ELOGREAD ( ISERRBASE + 18 ) \/* error reading log file *\/\r\n#define EBADLOG ( ISERRBASE + 19 ) \/* log file is corrupt *\/\r\n#define ELOGOPEN ( ISERRBASE + 20 ) \/* unable to open log *\/\r\n#define ELOGWRIT ( ISERRBASE + 21 ) \/* unable to write log *\/\r\n#define ENOTRANS ( ISERRBASE + 22 ) \/* transaction not found *\/\r\n#define ENOSHMEM ( ISERRBASE + 23 ) \/* out of shared memory *\/\r\n#define ENOBEGIN ( ISERRBASE + 24 ) \/* no current transaction *\/\r\n#define ENONFS ( ISERRBASE + 25 ) \/* not used *\/\r\n#define EBADROWID ( ISERRBASE + 26 ) \/* not used *\/\r\n#define ENOPRIM ( ISERRBASE + 27 ) \/* no primary key *\/\r\n#define ENOLOG ( ISERRBASE + 28 ) \/* logging not allowed *\/\r\n#define EUSER ( ISERRBASE + 29 ) \/* too many users *\/\r\n#define ENODBS ( ISERRBASE + 30 ) \/* not used *\/\r\n#define ENOFREE ( ISERRBASE + 31 ) \/* not used *\/\r\n#define EROWSIZE ( ISERRBASE + 32 ) \/* varlen record too big *\/\r\n#define EAUDIT ( ISERRBASE + 33 ) \/* existing audit trail *\/\r\n#define ENOLOCKS ( ISERRBASE + 34 ) \/* out of room in lock table *\/\r\n#define EEXPIRED ( ISERRBASE + 35 ) \/* evaluation library has expired *\/\r\n#define ENOCONNECT ( ISERRBASE + 36 ) \/* no connect with remote server *\/\r\n#define ENETORDER ( ISERRBASE + 37 ) \/* server has wrong endian order *\/\r\n#define EREPAIR ( ISERRBASE + 38 ) \/* auto repair in progress *\/\r\n#define EBADADDR ( ISERRBASE + 39 ) \/* bad network address *\/\r\n#define ENOSCHEMA ( ISERRBASE + 40 ) \/* no schema defined *\/\r\n#define EEXSCHEMA ( ISERRBASE + 41 ) \/* schema already defined *\/\r\n#define ENOTAVAIL ( ISERRBASE + 42 ) \/* remote function not available *\/\r\n\r\n\/* on system error - iserrio = IO_call + IO_file *\/\r\n\r\n#define IO_OPEN 0x10 \/* open *\/\r\n#define IO_CREA 0x20 \/* create *\/\r\n#define IO_SEEK 0x30 \/* seek *\/\r\n#define IO_READ 0x40 \/* read *\/\r\n#define IO_WRIT 0x50 \/* write *\/\r\n#define IO_LOCK 0x60 \/* lock *\/\r\n#define IO_OTHER 0x70 \/* other *\/\r\n\r\n#define IO_IDX 0x01 \/* index file *\/\r\n#define IO_DAT 0x02 \/* data file *\/\r\n#define IO_AUD 0x03 \/* audit trace *\/\r\n#define IO_RAW 0x04 \/* any other file *\/\r\n#define IO_REP 0x05 \/* auto repair file *\/\r\n#define IO_LOG 0x06 \/* transaction log *\/\r\n#define IO_LCK 0x07 \/* offline lock file *\/\r\n\r\n#define IO_LOK 0x04 \/* cisam, not used *\/\r\n#define IO_SEM 0x05 \/* cisam, not used *\/\r\n\r\n\/* cobol isstat4 values --------------------------------------------*\/\r\n\r\n#define STATNULL ' ' \/* empty isstat4 value *\/\r\n#define STAT1 '1'\r\n#define STAT2 '2'\r\n#define STAT3 '3'\r\n#define STAT4 '4'\r\n#define STAT5 '5'\r\n#define STAT6 '6'\r\n#define STAT7 '7'\r\n#define STAT8 '8'\r\n#define STAT9 '9'\r\n#define STAT0 '0'\r\n\r\n\/* self check facility ------------------------------------------- *\/\r\n\r\n#define IC_DATREAD 0 \/* data file read error *\/\r\n#define IC_BADDATA 1 \/* data record corrupt *\/\r\n#define IC_DATFREE 2 \/* data free list is corrupt *\/\r\n\r\n#define IC_IDXREAD 3 \/* index file read error *\/\r\n#define IC_ORDER 4 \/* key out of order *\/\r\n#define IC_COUNT 5 \/* index count mismatch *\/\r\n#define IC_BADMAGIC 6 \/* bad index node magic number *\/\r\n#define IC_MATCH 7 \/* index\/data mismatch *\/\r\n#define IC_SANITY 8 \/* compiler sanity check *\/\r\n#define IC_DUPSEQ 9 \/* bad duplicate sequence *\/\r\n\r\n#if( ISVARIABLE )\r\n\r\n#define IC_VLHASHZERO 11 \/* hash table zero loaded *\/\r\n#define IC_VLMISFILE 12 \/* node misfiled in hash table *\/\r\n#define IC_VLHASHLINK 13 \/* mangled link in hash list *\/\r\n#define IC_VLMISSING 14 \/* nodes missing or unaccounted *\/\r\n#define IC_VLBADDATA 15 \/* data length mismatch *\/\r\n \r\nstruct IsVarStat \/* variable length statistics *\/\r\n {\r\n uint32_t hashcount;\r\n uint32_t hashspace;\r\n uint32_t fullcount;\r\n uint32_t fullspace;\r\n uint32_t filecount;\r\n uint32_t filespace;\r\n };\r\n \r\n#endif \r\n\r\n#endif \/*ISAUTOLOCK*\/\r\n\r\n\/* ---------------------------------------------------------------- *\r\n above is pulled from common source, see #ifdef ISAUTOLOCK above.\r\n ---------------------------------------------------------------- *\/\r\n\r\n\/* useful defines ----------------------------------------------- *\/\r\n\r\n#define ISTRUE 1\r\n#define ISFALSE 0\r\n\r\n\/* convenient shortcuts ----------------------------------------- *\/\r\n\r\ntypedef struct IsamFile IsFile;\r\ntypedef struct keydesc IsKdsc;\r\ntypedef struct keypart IsKprt;\r\n\r\n#if( defined ISINTERNAL || defined ISDANGEROUS )\r\n\r\n\/* base library internal definitions ----------------------------- *\/\r\n\r\n#define TRUE 1\r\n#define FALSE 0\r\n\r\n#define SETBIT( F, O ) ( F | ( 1 &lt;&lt; ( O ) ) )\r\n#define UNSBIT( F, O ) ( F &amp; ~( 1 &lt;&lt; ( O ) ) )\r\n#define BITSET( F, O ) ( F &amp; ( 1 &lt;&lt; ( O ) ) )\r\n\r\n#define ISREALLOC(S,P,O,N) ( struct S * )is_realloc( ( char * )P, O, N )\r\n#define ISALLOC(S) ( struct S * )is_malloc( sizeof( struct S ) )\r\n#define ISFREE(S,P) ( struct S * )is_free( ( char * )P )\r\n\r\n#define ISNODEMAX ( isam-&gt;idxlen - 4 )\r\n\r\n#define ISFAIL(I,M) ( ! isEntry( I, M ) || setjmp( I-&gt;trap ) )\r\n \r\n#define ISFATAL is_fatal( \"fatal isam error %s(%d)\", __FILE__, __LINE__ )\r\n\r\n\/* path handling ------------------------------------------------- *\/\r\n\r\n#define ISAMPRIME(I) ( (I)-&gt;maxidx ? (I)-&gt;path[0]-&gt;kdsc : NULL )\r\n#define ISAMINDEX(I) ( ( (I)-&gt;curidx &lt; (I)-&gt;maxidx ) ? (I)-&gt;path[(I)-&gt;curidx]-&gt;kdsc : NULL )\r\n\r\n\/* to be deprecated *\/\r\n#define ISPATH ( isam-&gt;path[isam-&gt;curidx] )\r\n#define ISKDSC ( isam-&gt;path[isam-&gt;curidx]-&gt;kdsc )\r\n\r\n#define ISTAIL ( ISPATH-&gt;tail )\r\n#define TAIL path-&gt;tail\r\n\r\n#define ISEMPTY(P) ( P-&gt;tail-&gt;used == 2 )\r\n \r\n\r\n\/* specialised machine independant integers ---------------------- *\/\r\n\r\n#define LDRECD(P) ( ldMint( P, 4 ) &amp; 0x7FFFFFFFL )\r\n#define LDDUP(P,L) ( ldMint( P, L ) )\r\n#define STDUP(P,L,D) ( stMint( P, L, D ) )\r\n\r\n\r\n\/* structure specific flags and state values --------------------- *\/\r\n\r\n#define ISREALFILE 0 \/* stored on file system *\/\r\n#define ISIPSOCKET 1 \/* mounted on network socket *\/\r\n#define ISNAMEPIPE 2 \/* mounted on named pipe *\/\r\n#define ISEXECPIPE 3 \/* mounted on process pipe *\/\r\n\r\n\/* IsamFile - bit flags *\/\r\n#define ISNOPRIM 0 \/* primary is natural order *\/\r\n#define ISNOTNEXT 1 \/* read\/start next dislocate *\/\r\n#define ISNOTPREV 2 \/* read\/start prev dislocate *\/\r\n#define ISWRLOCK 3 \/* lock records on write *\/\r\n#define ISPRECIOUS 4 \/* do not reuse data slots *\/\r\n#define ISLOCKCHECK 5 \/* check locked on update\/delete *\/\r\n#define ISNOCURRENT 6 \/* current is not viable *\/\r\n#define ISLOGDEFER 7 \/* open\/close deferred logging *\/\r\n\r\n\/* IsamNode - state values *\/\r\n#define ISNDREF 0 \/* image must be refreshed *\/\r\n#define ISNDOK 1 \/* image is current *\/\r\n#define ISNDUPD 2 \/* image has been updated *\/\r\n\r\n\/* index file records -------------------------------------------- *\/\r\n\r\nstruct IsamNode \/* index file record *\/\r\n {\r\n struct IsamNode *prev; \/* parent node *\/\r\n struct IsamNode *split; \/* sibling *\/\r\n\r\n uint32_t idxrec; \/* idx file record number *\/\r\n char *image; \/* disk image *\/\r\n char state; \/* current status *\/\r\n int used; \/* number of bytes used *\/\r\n int level; \/* zero is leaf node *\/\r\n \r\n int keyoff; \/* current key offset *\/\r\n int keyend; \/* end of compressed key *\/\r\n uint32_t recnum; \/* current record number *\/\r\n uint32_t dupnum; \/* current duplicate number *\/\r\n char *keyval; \/* key contents *\/\r\n };\r\n\r\n\r\n\/* schema\/record layout ------------------------------------------ *\/\r\n\r\nstruct IsamRec\r\n {\r\n char *image; \/* current node image *\/\r\n uint32_t root; \/* root recnum *\/\r\n uint32_t last; \/* last recnum *\/\r\n };\r\n\r\n\r\n\/* index handling ------------------------------------------------ *\/\r\n\r\nstruct IsamPath \/* index details *\/\r\n {\r\n struct keydesc *kdsc; \/* key description *\/\r\n struct IsamNode *tail; \/* current path tail *\/\r\n struct IsamNode *buf[ISMAXBUF]; \/* buffering system *\/\r\n \r\n int slotlen; \/* key slot length *\/\r\n int duplen; \/* valid if dups *\/\r\n int partial; \/* active partial length *\/\r\n char current[ISMAXKEY]; \/* current key value *\/\r\n uint32_t recnum; \/* current record number *\/\r\n uint32_t dupnum; \/* current dupnum i\/a *\/\r\n int cmplen; \/* current compare *\/\r\n char flags; \/* bit flags *\/\r\n };\r\n\r\n\r\n\/* free list control structure ----------------------------------- *\/\r\n\r\nstruct IsamFree\r\n {\r\n char *image; \/* index node image *\/\r\n char *split; \/* hold for update *\/\r\n char state; \/* update status *\/\r\n uint32_t root; \/* list root record *\/\r\n uint32_t last; \/* last used recnum *\/\r\n int used; \/* bytes used in node *\/\r\n };\r\n\r\n \r\n\/* typedefs *\/\r\n\r\ntypedef struct IsamPath IsPath;\r\ntypedef struct IsamNode IsNode;\r\ntypedef struct IsamFree IsFree;\r\n\r\n\r\n#endif \/* ISINTERNAL || ISDANGEROUS *\/\r\n\r\n\/* isam file descriptor ------------------------------------------ *\/\r\n\r\nstruct IsamFile \/* isam file description *\/\r\n {\r\n \/* IO block HEAD - this structure matches on all sources *\/\r\n\r\n char *name; \/* isam path and name *\/\r\n char where; \/* source switch case *\/\r\n\r\n#if( ISADMIN )\r\n int admid; \/* admin table offset *\/\r\n#endif\r\n\r\n \/* IO block DATA - openmode through maxlen, should not change *\/\r\n\r\n int openmode; \/* open mode bit flags *\/\r\n\r\n int idxlen; \/* index node size *\/\r\n int duplen; \/* duplicate sequence width *\/\r\n int maxidx; \/* number of indexes *\/\r\n int curidx; \/* current index number *\/\r\n uint32_t mask; \/* index masking bit array *\/\r\n\r\n uint32_t isrecnum; \/* current record number *\/\r\n int isreclen; \/* current record length *\/\r\n int iserrno; \/* failure code *\/\r\n int iserrio; \/* what and where *\/\r\n\r\n int datlen; \/* data record length *\/\r\n int datblk; \/* data file record block *\/\r\n int maxlen; \/* variable length max *\/\r\n\r\n#if( ISMFCOBOL &gt; 0 )\r\n char isstat1; \/* cobol status variables *\/\r\n char isstat2;\r\n char isstat3;\r\n char isstat4;\r\n#endif\r\n\r\n#if( ISEXTENDED )\r\n int32_t ispid; \/* pid of blocking lock *\/\r\n#endif\r\n \r\n \/* IO block END, remainder is local and specific to source *\/\r\n\r\n#if( defined ISINTERNAL || defined ISDANGEROUS )\r\n\r\n int flags; \/* all internal bit flags *\/\r\n\r\n int datfd; \/* data file handle *\/\r\n int idxfd; \/* index file handle *\/\r\n\r\n int ( *rdfilter )( int, char *, int );\/* read filtering callback *\/\r\n\r\n uint32_t natcurr; \/* natural order current *\/\r\n\r\n uint32_t kdsc; \/* key desc list root node *\/\r\n uint32_t delta; \/* concurrency control *\/\r\n uint32_t unique; \/* unique id value *\/\r\n\r\n struct IsamPath *path[ISMAXIDX]; \/* active path array *\/\r\n\r\n struct IsamFree idxfree; \/* index free list *\/\r\n struct IsamFree datfree; \/* data free list *\/\r\n \r\n struct IsamRec schema; \/* schema pointers *\/\r\n\r\n uint32_t *lklist; \/* list of record locks *\/\r\n uint32_t lkllen; \/* current list length *\/\r\n char lkstate; \/* locking state flags *\/\r\n \r\n char *image; \/* header record image *\/\r\n char *data; \/* current data image *\/\r\n \r\n int workmode; \/* reading or writing *\/\r\n jmp_buf trap; \/* longjump trap point *\/\r\n\r\n#if( ISAUDIT )\r\n uint32_t audit; \/* audit control node *\/\r\n char audinfo[69]; \/* allocated info block *\/\r\n int audfd; \/* trace file handle *\/\r\n#endif\r\n \r\n#if( ISLOGGING )\r\n int txnpid; \/* transaction process id *\/\r\n int txnfile; \/* transaction file id *\/\r\n#endif \r\n \r\n#if( ISVARIABLE ) \r\n uint32_t *hashtab; \/* hash table array *\/\r\n char *varnode; \/* varlen node image *\/\r\n char hashload; \/* refresh flag *\/\r\n char *vcbuf; \/* vl compression temp buffer *\/\r\n int vclen; \/* vl compression temp length *\/\r\n#endif \r\n\r\n#if( ISVARIABLE &gt; 1 ) \r\n uint32_t hashrecd; \/* hash table record *\/\r\n char *hashnode; \/* hash table image *\/\r\n#endif \r\n\r\n#if( ISLOCKING == 3 )\r\n int lokfd; \/* lock file handle *\/\r\n int32_t lokid; \/* unique locking id *\/\r\n#endif\r\n \r\n#if( ISLKINFO == 1 )\r\n char *lockinfo; \/* lock information block *\/\r\n#endif\r\n \r\n#if( ISTHREADED )\r\n int gotmtseek;\r\n int gotmtread;\r\n int gotmtlock;\r\n int gotmtwrite;\r\n int gotmtmast;\r\n#endif\r\n\r\n#endif \/* ISINTERNAL || ISDANGEROUS *\/\r\n };\r\n\r\n\r\n\/* custom details ------------------------------------------------ *\/\r\n\r\n#if( ISCUSTOM == 1 )\r\n# include &lt;iscustom.h&gt;\r\n#endif\r\n\r\n\/* entry function prototypes ------------------------------------- *\/\r\n\r\n#if( ISDECLARE )\r\n# define ISD3(s) s\r\n#else\r\n# define ISD3(s) ()\r\n#endif\r\n\r\n#if( ISDATAVOID )\r\n# define ISDD void\r\n#else\r\n# define ISDD char\r\n#endif\r\n\r\n#if( ISCONSTCHAR )\r\n# define ISCC const char\r\n#else\r\n# define ISCC char\r\n#endif\r\n\r\n#if( ISDYNAMIC == 0 || ISDYNAMIC == 3 || ISDYNAMIC == 4 )\r\n# if( defined ISINTERNAL )\r\n# define ISD1 \r\n# else\r\n# define ISD1 extern\r\n# endif\r\n# define ISD2\r\n#endif\r\n\r\n#if( ISDYNAMIC == 1 )\r\n# if( defined ISINTERNAL )\r\n# define ISD1\r\n# define ISD2 __far __pascal __export\r\n# else\r\n# define ISD1 extern\r\n# define ISD2 __far __pascal\r\n# endif\r\n#endif\r\n\r\n#if( ISDYNAMIC == 2 )\r\n# if( defined ISINTERNAL )\r\n# define ISD1 __declspec( dllexport )\r\n# else\r\n# define ISD1 __declspec( dllimport )\r\n# endif\r\n# define ISD2\r\n#endif\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n#if( ! defined ISINTERNAL )\r\n# if( ISDYNAMIC &lt; 3 )\r\n# ifdef ISEXPIRE\r\nISD1 ISCC * ISD2 isevaluation;\r\n# endif\r\nISD1 ISCC * ISD2 isversnumber;\r\nISD1 ISCC * ISD2 isverstring;\r\nISD1 ISCC * ISD2 iscopyright;\r\nISD1 int ISD2 is_nerr;\r\nISD1 ISCC * ISD2 is_errlist[43];\r\nISD1 ISCC * ISD2 isCheckMsg[16];\r\n# endif\r\n#endif\r\n\r\nISD1 int ISD2 isLock ISD3((IsFile *isam));\r\nISD1 int ISD2 isUnLock ISD3((IsFile *isam));\r\nISD1 int ISD2 isRelease ISD3((IsFile *isam));\r\nISD1 int ISD2 isRelRec ISD3((IsFile *isam, uint32_t recnum));\r\nISD1 int ISD2 isRelCurr ISD3((IsFile *isam));\r\n\r\nISD1 int ISD2 isThreaded ISD3((void));\r\nISD1 int ISD2 isThreadedDone ISD3((void));\r\nISD1 int ISD2 isAdmDtoI ISD3((IsFile *isam));\r\nISD1 IsFile * ISD2 isAdmItoD ISD3((int id));\r\nISD1 int ISD2 isCleanUp ISD3((void));\r\nISD1 int ISD2 isRemoteFree ISD3((void));\r\nISD1 IsFile * ISD2 isAdmTxnLast ISD3((void));\r\n\r\nISD1 IsFile * ISD2 isBuild ISD3((ISCC *name, int dlen, int mlen, IsKdsc *kdsc, int mode));\r\nISD1 int ISD2 isPrecious ISD3((IsFile *isam, int flag));\r\nISD1 int ISD2 isAddIndex ISD3((IsFile *isam, IsKdsc *kdsc));\r\nISD1 int ISD2 isUserInfo ISD3((IsFile *isam, int mode, char *pad));\r\n\r\nISD1 int ISD2 isDelete ISD3((IsFile *isam, ISDD *pad));\r\nISD1 int ISD2 isDelCurr ISD3((IsFile *isam));\r\nISD1 int ISD2 isDelRec ISD3((IsFile *isam, uint32_t recnum));\r\n\r\nISD1 int ISD2 isErase ISD3((ISCC *name));\r\nISD1 int ISD2 isRename ISD3((ISCC *oname, ISCC *nname));\r\n\r\nISD1 int ISD2 isDelIndex ISD3((IsFile *isam, IsKdsc *kdsc));\r\n\r\nISD1 int ISD2 isIndexInfo ISD3((IsFile *isam, IsKdsc *kdsc, int idx));\r\nISD1 int ISD2 isIsamInfo ISD3((IsFile *isam, struct dictinfo *dict));\r\n\r\nISD1 int ISD2 isErrno ISD3((IsFile *isam));\r\nISD1 int ISD2 isErrio ISD3((IsFile *isam));\r\nISD1 int ISD2 isCount ISD3((IsFile *isam));\r\nISD1 int ISD2 isRecnum ISD3((IsFile *isam));\r\nISD1 int ISD2 isReclen ISD3((IsFile *isam));\r\nISD1 int ISD2 isSetrec ISD3((IsFile *isam, uint32_t recnum));\r\nISD1 int ISD2 isSetlen ISD3((IsFile *isam, short reclen));\r\n\r\nISD1 IsFile * ISD2 isOpen ISD3((ISCC *name, int mode));\r\nISD1 int ISD2 isClose ISD3((IsFile *isam));\r\nISD1 int ISD2 isLockCheck ISD3((IsFile *isam, int flag));\r\nISD1 int ISD2 isSetMode ISD3((IsFile *isam, int mode));\r\n\r\nISD1 IsFile * ISD2 isCluster ISD3((IsFile *isam, IsKdsc *kdsc));\r\nISD1 IsFile * ISD2 isClone ISD3((IsFile *isam, ISCC *name ));\r\nISD1 int ISD2 isCopy ISD3((IsFile *dest, IsFile *source, IsKdsc *kdsc));\r\n\r\nISD1 int ISD2 isRead ISD3((IsFile *isam, ISDD *pad, int mode));\r\nISD1 int ISD2 isStart ISD3((IsFile *isam, IsKdsc *key, int len, ISDD *pad, int mode));\r\nISD1 int ISD2 isIndex ISD3((IsFile *isam, int idx));\r\nISD1 int ISD2 isGoto ISD3((IsFile *isam, uint32_t recnum));\r\nISD1 int ISD2 isPush ISD3((IsFile *isam, int *idx, uint32_t *rec));\r\nISD1 int ISD2 isPop ISD3((IsFile *isam, int idx, uint32_t rec));\r\nISD1 int ISD2 isData ISD3((IsFile *isam, ISDD *pad, uint32_t recnum));\r\n\r\nISD1 int ISD2 isLdSchema ISD3((IsFile *isam, ISCC *path));\r\nISD1 int ISD2 isDpSchema ISD3((IsFile *isam));\r\nISD1 int ISD2 isStSchema ISD3((IsFile *isam, ISCC *loadfile));\r\nISD1 int ISD2 isRmSchema ISD3((IsFile *isam));\r\n\r\nISD1 int ISD2 isSetUnique ISD3((IsFile *isam, uint32_t value));\r\nISD1 int ISD2 isUniqueId ISD3((IsFile *isam, uint32_t *dest));\r\n\r\nISD1 int ISD2 isGetLastRec ISD3((IsFile *isam, uint32_t *last));\r\nISD1 int ISD2 isSetLastRec ISD3((IsFile *isam, uint32_t last));\r\nISD1 int ISD2 isLastRec ISD3((IsFile *isam, uint32_t *last));\r\n\r\nISD1 int ISD2 isRewrite ISD3((IsFile *isam, ISDD *newpad));\r\nISD1 int ISD2 isRewCurr ISD3((IsFile *isam, ISDD *newpad));\r\nISD1 int ISD2 isRewRec ISD3((IsFile *isam, uint32_t recnum, ISDD *newpad));\r\nISD1 int ISD2 isRewNxt ISD3((IsFile *isam, ISDD *newpad));\r\n\r\nISD1 int ISD2 isWrite ISD3((IsFile *isam, ISDD *pad));\r\nISD1 int ISD2 isWrLock ISD3((IsFile *isam, ISDD *pad));\r\nISD1 int ISD2 isWrCurr ISD3((IsFile *isam, ISDD *pad));\r\n\r\nISD1 int ISD2 isAudit ISD3((IsFile *isam, char *pad, int mode));\r\n\r\nISD1 int ISD2 isTxnInit ISD3((short ( *call )(void) ));\r\nISD1 int ISD2 isLogOpen ISD3((ISCC *name));\r\nISD1 int ISD2 isLogClose ISD3((void));\r\nISD1 int ISD2 isBegin ISD3((void));\r\nISD1 int ISD2 isCommit ISD3((void));\r\nISD1 int ISD2 isRollBack ISD3((void));\r\nISD1 int ISD2 isRecover ISD3((void));\r\nISD1 int ISD2 isSuspLog ISD3((void));\r\nISD1 int ISD2 isResumLog ISD3((void));\r\nISD1 int ISD2 isTxnId ISD3((int value));\r\n\r\nISD1 uint32_t ISD2 isFreeCount ISD3((IsFile *isam, int which, int (*call )(char *node )));\r\n\r\nISD1 int ISD2 isAmSane ISD3((void));\r\nISD1 int ISD2 isCheckData ISD3((IsFile *isam));\r\nISD1 int ISD2 isCheckIndex ISD3((IsFile *isam, int idx));\r\nISD1 int ISD2 isRebuildFree ISD3((IsFile *isam, int which));\r\nISD1 int ISD2 isRebuildIdx ISD3((IsFile *isam, int idx));\r\n#if( ISVARIABLE )\r\nISD1 int ISD2 isCheckVarlen ISD3((IsFile *isam, struct IsVarStat *stats));\r\n#endif\r\n\r\nISD1 void ISD2 isFatal ISD3((void(*call)(char *)));\r\n\r\nISD1 int ISD2 isStartUp ISD3((void));\r\n\r\nISD1 ISCC * ISD2 isSeeKey ISD3((int isfd));\r\n\r\nISD1 int64_t ISD2 ldHint ISD3((char *pad, int len));\r\nISD1 int ISD2 stHint ISD3((char *pad, int len, int64_t val));\r\nISD1 int32_t ISD2 ldMint ISD3((char *pad, int len));\r\nISD1 int ISD2 stMint ISD3((char *pad, int len, int32_t val));\r\n\r\nISD1 int ISD2 ldInt ISD3((char *pad));\r\nISD1 int ISD2 stInt ISD3((int value, char *pad));\r\nISD1 int32_t ISD2 ldLong ISD3((char *pad));\r\nISD1 int ISD2 stLong ISD3((int32_t value, char *pad));\r\nISD1 int ISD2 stChar ISD3((char *str, char *pad, int len));\r\nISD1 int ISD2 ldChar ISD3((char *pad, int len, char *str));\r\nISD1 float ISD2 ldFloat ISD3((char *pad)); \r\nISD1 int ISD2 stFloat ISD3((float value, char *pad));\r\nISD1 double ISD2 ldDbl ISD3((char *pad)); \r\nISD1 int ISD2 stDbl ISD3((double value, char *pad));\r\nISD1 int ISD2 stFltNull ISD3((float value, char *pad, short null));\r\nISD1 float ISD2 ldFltNull ISD3((char *pad, short *null));\r\nISD1 int ISD2 stDblNull ISD3((double value, char *pad, short null));\r\nISD1 double ISD2 ldDblNull ISD3((char *pad, short *null));\r\n\r\n#if 0 \/* deprecated, please contact Byte Designs if needed *\/\r\nISD1 int ISD2 stDate ISD3((Date *dest, char *src));\r\nISD1 char * ISD2 ldDate ISD3((char *dest, Date *src));\r\nISD1 int ISD2 stTime ISD3((Time *dest, char *src));\r\nISD1 char * ISD2 ldTime ISD3((char *dest, Time *src));\r\n#endif\r\n\r\n\/* base\/isdebug.c *\/\r\nISD1 const char * ISD2 isWhere ISD3(( int work ));\r\nISD1 const char * ISD2 isWhat ISD3(( int which ));\r\nISD1 void ISD2 isDebug ISD3(( IsFile *isam, int level, ISCC *fmt, ... ));\r\nISD1 void ISD2 isvDebug ISD3(( IsFile *isam, int level, ISCC *fmt, va_list ap ));\r\nISD1 void ISD2 isDebugAsc ISD3(( IsFile *isam, int level, ISCC *tag, ISCC *dat, int len ));\r\nISD1 void ISD2 isDebugHex ISD3(( IsFile *isam, int level, ISCC *tag, ISCC *dat, int len ));\r\n\r\n#ifdef __cplusplus\r\n};\r\n#endif\r\n\r\n#if( defined ISINTERNAL )\r\n#else\r\n# undef ISD1\r\n# undef ISD2\r\n# undef ISD3\r\n# undef ISDD\r\n#endif\r\n\r\n\/* end header ---------------------------------------------------- *\/<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>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 [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[3],"tags":[6,5],"_links":{"self":[{"href":"https:\/\/www.isam.ca\/index.php?rest_route=\/wp\/v2\/posts\/480"}],"collection":[{"href":"https:\/\/www.isam.ca\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.isam.ca\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.isam.ca\/index.php?rest_route=\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.isam.ca\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=480"}],"version-history":[{"count":6,"href":"https:\/\/www.isam.ca\/index.php?rest_route=\/wp\/v2\/posts\/480\/revisions"}],"predecessor-version":[{"id":600,"href":"https:\/\/www.isam.ca\/index.php?rest_route=\/wp\/v2\/posts\/480\/revisions\/600"}],"wp:attachment":[{"href":"https:\/\/www.isam.ca\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=480"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.isam.ca\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=480"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.isam.ca\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=480"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}