#ifndef H_ED_BLK_20041027093951
#define H_ED_BLK_20041027093951

#ifdef __cplusplus
extern "C"
{
#endif

/* ---------------------------------------------------------------------
   (c) ED 2004
   Project      : CLIB
   Function     : data block management.
   Module       : BLK
   File         : blk.h
   Created      : 27-10-2004
   Modified     : 27-10-2004
   --------------------------------------------------------------------- */

/* ---------------------------------------------------------------------
   Log

   0.0 27-10-2004 Created

   --------------------------------------------------------------------- */
#include <stddef.h>
#include "ed/inc/types.h"

/* macros ============================================================== */
#define BLK_ASIZE(sz) (sz + BLK_SZ_SENTINEL)

/* constants =========================================================== */

#define BLK_OUT 0               /* 0 | 1 */

#if 0
#define BLK_ADT 1               /* 0 | 1 */
#else
/* defined externally */
#endif

#ifndef BLK_ADT
#error BLK_ADT must be defined
#endif

   typedef enum
   {
      BLK_OK,

#define ITEM(n_, s_)\
   BLK_ERR_##n_,

#include "ed/inc/blk_err.itm"

#undef ITEM

      BLK_ERR_NB
   }
   blk_err_e;

   enum
   {
      BLK_SZ_SENTINEL = 4,

      BLK_dummy
   };

/* types =============================================================== */

#if BLK_OUT
   typedef int blk_out_f (void *p_usr, int data);
#endif

/* structures ========================================================== */

#if BLK_ADT
   typedef struct blk blk_s;
#else
   typedef struct
   {

#if BLK_OUT
      blk_out_f *pf;
      void *p_usr;
#endif

      size_t size;
      ulong sentinel;
      uchar *buf;
   }
   blk_s;
#endif                          /* ADT */

/* functions =========================================================== */

/* Identification and error string */
   char const *blk_sid (void);
   char const *blk_sver (void);
   char const *blk_serr (blk_err_e err);

#if BLK_ADT
/* Dynamic constructor / destructor */
   blk_s *blk_create (size_t size);
   void blk_delete (blk_s * this);
#else
/* Initialisation */
   blk_err_e blk_init (blk_s * const this, uchar * const buf, const size_t size);
#endif


#if BLK_OUT
   blk_err_e blk_install_out (blk_s * const this, blk_out_f * const pf, void *const p_data);
#endif

/* Input functions */
   uchar const *blk_buf (blk_s * const this);
   size_t blk_size (blk_s * const this);

   blk_err_e blk_write (blk_s * const this
                        ,void const *const p_data
                        ,size_t const offset
                        ,size_t const len);

   blk_err_e blk_read (blk_s * const this
                       ,void *const p_data
                       ,size_t const size_data
                       ,size_t const offset
                       ,size_t const len);

#ifdef __cplusplus
}
#endif

/* ---------------------------------------------------------------------
   Generated by NEW (c) ED 2.4
   Powered by C-code generator (c) ED 2003 1.0
   --------------------------------------------------------------------- */

#endif                          /* guard */
