#ifndef __CFILES_H
#define __CFILES_H

#ifndef __CCUSTIO_H
#include "ccustio.h"
#endif

#ifdef __GNUC__
#define __PACKED__ __attribute__ ((packed))
#define __ALIGNED__ __attribute__ ((aligned(2))) 
#define __PACK_1__
#else
#define __PACKED__
#define __ALIGNED__
#pragma pack(2)
#endif

#define MaxFilesDir             70
#define MKFields                        10
#define MaxFields                       100
#define MaxKeys                         8
#define glockname                       "xx"
#define INVFLD                          255
/* @(!) 2.3.01.144 */
#define NORDIR                          0
#define COMDIR                          1
/* @(:) 2.3.01.144 */

typedef char FieldName[12] ;

typedef struct
{
  char      SysName[42]  __PACKED__ ;
  RecNoType EOD  __PACKED__ ;
  RecNoType EOX  __PACKED__ ;
  unsigned short  LenR  __PACKED__ ;
  RecNoType Flags  __PACKED__ ;
  char      Des[42]  __PACKED__ ;
  char      FCalc[32]  __PACKED__ ;
  char      GenPrompt[32]  __PACKED__ ;
} FileDes;

typedef struct
{
  FieldName Name  __PACKED__ ;
  byte      TypeF  __PACKED__ ;
  byte      Len  __PACKED__ ;
  byte      Dec __PACKED__ ;
#ifdef __PACK_1__
  byte      junk __PACKED__ ;
#endif
  unsigned short RecOff  __PACKED__ ;
} RecFieldDes ;

typedef struct
{
  short   DupKeys __ALIGNED__ ;   // Was BOOLEAN and dangerous
  byte    NkFields __ALIGNED__ ;
  byte    FieldSeq[MKFields]  __PACKED__ ;
  byte    FromCh[MKFields]  __PACKED__ ;
  byte    ToCh[MKFields]  __PACKED__ ;
} KeyDes ;

typedef struct
{
  short        NFields  __PACKED__ ;
  RecFieldDes  Fd[MaxFields]  __PACKED__ ;
  byte         SortFd[MaxFields]  __PACKED__ ;
  short        NKeys  __PACKED__ ;
  KeyDes       Ky[MaxKeys]  __PACKED__ ;
}       RecDes;

#ifdef __CFILES_C
SecDef rdir[2], fdir[2];
#else
extern SecDef rdir[2], fdir[2];
#endif

#ifdef WIN32
#pragma pack()
#endif

#ifdef __cplusplus
extern "C" {
#endif
  /* @(!) 2.3.01.144 */
  void  COpenDir(int, int);
  void  CCloseDir(int);
  void  COpenFile(int, FileDes *, int, int);
  void  CCloseFile(int, const FileDes *, int);
  void  CGetFile(int,  FileDes *, int, int);
  void  CPutFile(int,  FileDes *, int);
  /* @(:) 2.3.01.144 */
  void    zerofdes(FileDes *);
  /* @(!) 2.3.01.144 */
  void  COpenRecDir(int, int);
  void  CCloseRecDir(int);
  void  CGetRec(int, RecDes *, int);
  void  CPutRec(int, RecDes *, int);
  /* @(:) 2.3.01.144 */
  void    zerordes(RecDes *);
//  word    setrdes(RecDes *);
  const char* CGetPref(void);
  void  CPutPref(const char *);
  char* CAddPref(const char *);
  /* @(!) 2.3.01.144 */
  char* CInsPref(const char *, int);

  int CGetCampoStpValue(const char* name, char* value, int valsize);
  const char* CGetCampoIni(void);

#ifdef __cplusplus
};
#endif

#endif /* __CFILES_H */