/****************************************************************/
/*                                                              */
/*                            fcb.h                             */
/*                                                              */
/*    FAT FCB and extended FCB data structures & declarations   */
/*                                                              */
/*                      November 23, 1991                       */
/*                                                              */
/*                      Copyright (c) 1995                      */
/*                      Pasquale J. Villani                     */
/*                      All Rights Reserved                     */
/*                                                              */
/* This file is part of DOS-C.                                  */
/*                                                              */
/* DOS-C is free software; you can redistribute it and/or       */
/* modify it under the terms of the GNU General Public License  */
/* as published by the Free Software Foundation; either version */
/* 2, or (at your option) any later version.                    */
/*                                                              */
/* DOS-C is distributed in the hope that it will be useful, but */
/* WITHOUT ANY WARRANTY; without even the implied warranty of   */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See    */
/* the GNU General Public License for more details.             */
/*                                                              */
/* You should have received a copy of the GNU General Public    */
/* License along with DOS-C; see the file COPYING.  If not,     */
/* write to the Free Software Foundation, 675 Mass Ave,         */
/* Cambridge, MA 02139, USA.                                    */
/****************************************************************/

#ifdef MAIN
#ifdef VERSION_STRINGS
static BYTE *fcb_hRcsId =
    "$Id: fcb.h 485 2002-12-09 00:17:15Z bartoldeman $";
#endif
#endif

/* fcb convience defines                                                */
/* block device info                                                    */
#define FID_CHARDEV     0x80    /* 1 defines character device   */
                                        /* 0 defines block file         */
#define FID_NOWRITE     0x40    /* 0 file dirty (write occured) */
                                        /* 1 file has no changes        */
#define FID_MASK        0x3f    /* file #                       */
/* char device info                                                     */
#define FID_EOF         0x40    /* 1 = no eof detected          */
                                        /* 0 = end of file on input     */
#define FID_BINARY      0x20    /* 1 = binary (raw) mode device */
                                        /* 0 = ascii (cooked) mode device */
#define FID_CLOCK       0x08    /* Clock device                 */
#define FID_NULL        0x04    /* Null device                  */
#define FID_CONOUT      0x02    /* Console output device        */
#define FID_CONIN       0x01    /* Console input device         */

#ifndef FNAME_SIZE
#define FNAME_SIZE      8       /* limit on file name           */
#endif

#ifndef FEXT_SIZE
#define FEXT_SIZE       3       /* limit on extension           */
#endif

#ifndef FDFLT_DRIVE
#define FDFLT_DRIVE     0       /* default drive                */
#endif

#define PARSE_SEP_STOP          0x01
#define PARSE_DFLT_DRIVE        0x02
#define PARSE_BLNK_FNAME        0x04
#define PARSE_BLNK_FEXT         0x08

#define PARSE_RET_NOWILD        0
#define PARSE_RET_WILD          1
#define PARSE_RET_BADDRIVE      0xff

#define FCB_READ  0
#define FCB_WRITE 1

/* File Control Block (FCB)                                             */
typedef struct {
  UBYTE fcb_drive;              /* Drive number 0=default, 1=A, etc     */
  BYTE fcb_fname[FNAME_SIZE];   /* File name                    */
  BYTE fcb_fext[FEXT_SIZE];     /* File name Extension          */
  UWORD fcb_cublock;            /* Current block number of              */
  /* 128 records/block, for seq. r/w      */
  UWORD fcb_recsiz;             /* Logical record size in bytes,        */
  /* default = 128                        */
  ULONG fcb_fsize;              /* File size in bytes                   */
  date fcb_date;                /* Date file created                    */
  time fcb_time;                /* Time of last write                   */
  /* the following are reserved by system                         */
  BYTE fcb_sftno;               /* Device ID                            */
  BYTE fcb_attrib_hi;           /* share info, dev attrib word hi       */
  BYTE fcb_attrib_lo;           /* dev attrib word lo, open mode        */
  UWORD fcb_strtclst;           /* file starting cluster                */
  UWORD fcb_dirclst;            /* cluster of the dir entry             */
  UBYTE fcb_diroff_unused;      /* offset of the dir entry              */
  /* end reserved                                                 */
  UBYTE fcb_curec;              /* Current block number of              */
  ULONG fcb_rndm;               /* Current relative record number       */
} fcb;

/* FAT extended fcb                                                     */
typedef struct {
  UBYTE xfcb_flag;              /* 0xff indicates Extended FCB  */
  BYTE xfcb_resvrd[5];          /* Reserved                     */
  UBYTE xfcb_attrib;            /* Attribute                    */
  fcb xfcb_fcb;
} xfcb;

typedef struct {
  UBYTE renDriveID;             /* drive no.                    */
  BYTE renOldName[8];           /* Old Filename                 */
  BYTE renOldExtent[3];         /* Old File Extension           */
  BYTE renReserved1[5];
  BYTE renNewName[8];           /* New Filename                 */
  BYTE renNewExtent[3];         /* New FileExtension            */
  BYTE renReserved2[9];
} rfcb;