#ifndef H_ED_S_20051110170112
#define H_ED_S_20051110170112

#ifdef __cplusplus
extern "C"
{
#endif

/* ---------------------------------------------------------------------
   (c) ED 1998-2002
   Projet       : CLIB
   Fonction     : Gestion des trames S
   Module       : S
   Fichier      : S.H
   Creation     : 28-12-1998
   Modification : 13-07-2002
   --------------------------------------------------------------------- */

/* ---------------------------------------------------------------------
   Journal

   0.0 du 28-12-1998 Creation
   1.0 du 28-12-1998 Version operationelle
   .                 S1 (code 16 bits)
   .                 S3 (code 32 bits)
   1.1 du 18-04-2000 Ajoute encodeur 24-32 bits
   1.2 du 12-01-2001 Ajout de S_getadr24() et S_decodeS2
   1.3 du 29-02-2002 Mise au point longueur
   1.4 du 13-07-2002 LCLint
   .                 Ajout de S_line_size()
   1.5 du 18-07-2002 Suppression de S_line_size()

   --------------------------------------------------------------------- */
#include "ed/inc/sys.h"
#include "ed/inc/buf.h"

/* ---------------------------------------------------------------------
   Constantes
   --------------------------------------------------------------------- */
/* Taille d'une ligne */
#define S_LINE_SIZE 80

/*

   "S" <type> <count> <address> <data> <cs>

   <type> ::= "0"|"2"|"3"|"5"|"8"
   "0" = HEADER
   "1" = DATA record for 16-bit address
   "2" = DATA record for 24-bit address
   "3" = DATA record for 32-bit address
   "8" = END record


 */

   /* constantes de formatage */
   enum
   {
      S1_CS_LEN = 1,
      S1_ADR_LEN = 2,
      S2_ADR_LEN = 3,
      S3_ADR_LEN = 4,
      S_dummy
   };

   typedef enum
   {
#define ITEM(a,b) a,
#include "ed/inc/srecord.itm"
#undef ITEM
      S_NB
   }
   eS_TYP;

/* ---------------------------------------------------------------------
   Structures
   --------------------------------------------------------------------- */
   typedef struct
   {
      eS_TYP typ;
      ulong adr;
      sBUF buf;
      int cr;
   }
   s_t;



/* ---------------------------------------------------------------------
   Donnees
   --------------------------------------------------------------------- */

/* =====================================================================
   Fonctions
   ===================================================================== */

/* ---------------------------------------------------------------------
   S_sver()
   ---------------------------------------------------------------------
   Role : Retourne une chaine "Version"
   ---------------------------------------------------------------------
   E :
   S : Pointeur de chaine ASCIIZ
   --------------------------------------------------------------------- */
   const char *S_sver (void);

/* ---------------------------------------------------------------------
   S_sid()
   ---------------------------------------------------------------------
   Role : Retourne une chaine "Identification"
   ---------------------------------------------------------------------
   E :
   S : Pointeur de chaine ASCIIZ
   --------------------------------------------------------------------- */
   const char *S_sid (void);

/* -----------------------------------------------------------------------
   S_getlen()
   -----------------------------------------------------------------------
   retourne la longueur de la trame
   -----------------------------------------------------------------------
   E : pointeur sur la chaine contenant la trame
   S : longueur de la trame (en octets)
   ----------------------------------------------------------------------- */
   uchar S_getlen (char const *const sline);

/* -----------------------------------------------------------------------
   Procedure S_getadr16
   -----------------------------------------------------------------------
   retourne sline'adresse de la trame
   -----------------------------------------------------------------------
   E : pointeur sur la chaine contenant la trame
   S : adresse de la trame (16 bits)
   ----------------------------------------------------------------------- */
   ushort S_getadr16 (char const *const sline);

/* -----------------------------------------------------------------------
   Procedure S_getadr24
   -----------------------------------------------------------------------
   retourne sline'adresse de la trame
   -----------------------------------------------------------------------
   E : pointeur sur la chaine contenant la trame
   S : adresse de la trame (24 bits)
   ----------------------------------------------------------------------- */
   ulong S_getadr24 (char const *const sline);

/* -----------------------------------------------------------------------
   Procedure S_getadr32
   -----------------------------------------------------------------------
   retourne sline'adresse de la trame
   -----------------------------------------------------------------------
   E : pointeur sur la chaine contenant la trame
   S : adresse de la trame (32 bits)
   ----------------------------------------------------------------------- */
   ulong S_getadr32 (char const *const sline);

/* -----------------------------------------------------------------------
   S_getdatS1()
   -----------------------------------------------------------------------
   Lire un octet dans une trame S1 a un index donnee
   -----------------------------------------------------------------------
   E : pointeur sur la chaine contenant la trame
   E : index de lecture
   S : donnee (8 bits)
   ----------------------------------------------------------------------- */
   int S_getdatS1 (char const *const sline, size_t const i);

/* -----------------------------------------------------------------------
   S_getdatS2()
   -----------------------------------------------------------------------
   Lire un octet dans une trame S2 a un index donnee
   -----------------------------------------------------------------------
   E : pointeur sur la chaine contenant la trame
   E : index de lecture
   S : donnee (8 bits)
   ----------------------------------------------------------------------- */
   int S_getdatS2 (char const *const sline, size_t const i);

/* -----------------------------------------------------------------------
   S_getdatS3()
   -----------------------------------------------------------------------
   Lire un octet dans une trame S3 a un index donnee
   -----------------------------------------------------------------------
   E : pointeur sur la chaine contenant la trame
   E : index de lecture
   S : donnee (8 bits)
   ----------------------------------------------------------------------- */
   int S_getdatS3 (char const *const sline, size_t const i);

/* -----------------------------------------------------------------------
   S_loaddatS1()
   -----------------------------------------------------------------------
   Lire une trame de donnees S1
   -----------------------------------------------------------------------
   E : pointeur sur la chaine contenant la trame
   E : tableau d'octets
   E : nombre d'octets
   S : 0
   ----------------------------------------------------------------------- */
   int S_loaddatS1 (char const *const sline, uchar * const abuf, size_t const len);

/* -----------------------------------------------------------------------
   S_loaddatS2()
   -----------------------------------------------------------------------
   Lire une trame de donnees S2
   -----------------------------------------------------------------------
   E : pointeur sur la chaine contenant la trame
   E : tableau d'octets
   E : nombre d'octets
   S : 0
   ----------------------------------------------------------------------- */
   int S_loaddatS2 (char const *const sline, uchar * const abuf, size_t const len);

/* -----------------------------------------------------------------------
   S_loaddatS3()
   -----------------------------------------------------------------------
   Lire une trame de donnees S3
   -----------------------------------------------------------------------
   E : pointeur sur la chaine contenant la trame
   E : tableau d'octets
   E : nombre d'octets
   S : 0
   ----------------------------------------------------------------------- */
   int S_loaddatS3 (char const *const sline, uchar * const abuf, size_t const len);

/* -----------------------------------------------------------------------
   S_decodeS1()
   -----------------------------------------------------------------------
   Decodage d'une trame S1 (adresse 16 bits)
   Liberer le bloc apres usage avec S_free()
   -----------------------------------------------------------------------
   E : pointeur sur la chaine contenant la trame
   S : bloc
   ----------------------------------------------------------------------- */
   s_t *S_decodeS1 (const char *const sline);

/* -----------------------------------------------------------------------
   S_decodeS2()
   -----------------------------------------------------------------------
   Decodage d'une trame S2 (adresse 24 bits)
   Liberer le bloc apres usage avec S_free()
   -----------------------------------------------------------------------
   E : pointeur sur la chaine contenant la trame
   S : bloc
   ----------------------------------------------------------------------- */
   s_t *S_decodeS2 (const char *const sline);

/* -----------------------------------------------------------------------
   S_decodeS3()
   -----------------------------------------------------------------------
   Decodage d'une trame S3 (adresse 32 bits)
   Liberer le bloc apres usage avec S_free()
   -----------------------------------------------------------------------
   E : pointeur sur la chaine contenant la trame
   S : bloc
   ----------------------------------------------------------------------- */
   s_t *S_decodeS3 (const char *const sline);

/* -----------------------------------------------------------------------
   S_free()
   -----------------------------------------------------------------------
   Liberer le bloc
   -----------------------------------------------------------------------
   E : bloc
   ----------------------------------------------------------------------- */
   void S_free (s_t * const ps);

/* ---------------------------------------------------------------------
   S_decode()
   ---------------------------------------------------------------------
   Role : Decoder une ligne S
   ---------------------------------------------------------------------
   E : ligne ascii
   S : ligne sous forme binaire.
   --------------------------------------------------------------------- */
   s_t *S_decode (const char *const sline);


/* ---------------------------------------------------------------------
   S_rec()
   ---------------------------------------------------------------------
   Role : Creer un S-record()
   ---------------------------------------------------------------------
   E : Flux sortant
   E : type
   E : adresse
   E : debut des donnees (tableau d'octets)
   E : longueur des donnees (en octet)
   S :
   --------------------------------------------------------------------- */
   void S_rec (FILE * const fp
               ,eS_TYP const type
               ,ulong const adr
               ,uchar * const a
               ,size_t const len
   );

/* File generated by 'NEW.EXE' Ver 1.13 (c) ED 1998 */

#ifdef __cplusplus
}
#endif

#endif                          /* guard */

/* Guards added by GUARD (c) ED 2000-2005 Jan 17 2005 Ver. 1.7 */
