LibSAP est une librarie de manipulation des archives SAP écrite en ANSI C.
Elle fournit à la fois des routines de manipulation bas-niveau des archives
SAP considérées comme format physique (images de disquettes) et des routines
de manipulation haut-niveau des archives SAP considérées comme format
logique (compatible avec le DOS BASIC Thomson).



1. Routines de manipulation du format physique:

sapID sap_OpenArchive(const char filename[], int *format);
   Cette routine ouvre l'archive SAP dont le nom est spécifié par 'filename' et
  retourne le numéro d'identification (sapID) attaché à cette archive à partir
  de cet instant. Ce numéro d'identification sera passé aux autres routines de
  la librairie pour désigner l'archive SAP sur laquelle elle devront agir.
   Le paramètre 'format' retourne le format de l'archive SAP, qui peut-être
  SAP_FORMAT1 ou SAP_FORMAT2.
   Si une erreur survient, la routine retourne SAP_ERROR et stocke le numéro
  d'erreur dans la variable sap_errno:
  SAP_ETOOMANY: trop d'archives SAP sont ouvertes simultanément.
  SAP_ENOENT: l'archive SAP spécifiée n'existe pas.
  SAP_EBADF: le fichier spécifié n'est pas une archive SAP.


sapID sap_CreateArchive(const char filename[], int format);
   Cette routine crée une archive SAP dont le nom est spécifié par 'filename'
  et retourne le numéro d'identification (sapID) attaché à cette archive à
  partir de cet instant. Ce numéro d'identification sera passé aux autres
  routines de la librairie pour désigner l'archive SAP sur laquelle elle
  devront agir.
   Le paramètre 'format' spécifie le format de l'archive SAP, qui peut-être
  SAP_FORMAT1 ou SAP_FORMAT2.
   Si une erreur survient, la routine retourne SAP_ERROR et stocke le numéro
  d'erreur dans la variable sap_errno:
  SAP_ETOOMANY: trop d'archives SAP sont ouvertes simultanément.
  SAP_EPERM: impossible de créer le fichier sur le support d'enregistrement.


int sap_CloseArchive(sapID id);
   Cette routine ferme une archive SAP ouverte par sap_OpenArchive() ou créée
  par sap_CreateArchive() et retourne SAP_OK.
   Si une erreur survient, la routine retourne SAP_ERROR et stocke le numéro
  d'erreur dans la variable sap_errno:
  SAP_EINVAL: le numéro d'identification (sapID) est invalide.


int sap_FillArchive(sapID id, sapsector_t *sapsector);
   Cette routine remplie une archive créée par sap_CreateArchive() secteur
  par secteur, en commençant par le secteur 1 de la piste 0. A chaque appel
  le numéro de secteur est incrémenté de 1 et, si la piste courante devient
  pleine, la piste suivante est sélectionnée. Retourne SAP_OK.
   Si une erreur survient, la routine retourne SAP_ERROR et stocke le numéro
  d'erreur dans la variable sap_errno:
  SAP_EINVAL: le numéro d'identification (sapID) est invalide.
  SAP_ENOSPC: l'archive SAP est pleine.


int sap_ReadSector(sapID id, int track, int sect, sapsector_t *sapsector);
   Cette routine lit le secteur numéro 'sect' de la piste numéro 'track' et
  place le résultat dans la structure désignée par 'sapsector', retournant
  SAP_OK ou une combinaison des flags suivants:
  SAP_NO_STD_FMT: le format du secteur est non standard.
  SAP_PROTECTED : le secteur est protégé en écriture.
  SAP_BAD_SECTOR: le secteur a de mauvais identificateurs (piste, secteur)
  SAP_CRC_ERROR : erreur de CRC sur les données du secteur.
   Si une erreur survient, la routine retourne SAP_ERROR et stocke le numéro
  d'erreur dans la variable sap_errno:
  SAP_EINVAL: le numéro d'identification (sapID) est invalide.
  SAP_EEMPTY: l'archive SAP est vide.
  SAP_EBUSY: l'archive SAP est en train d'être remplie par sap_FillArchive()


int sap_ReadSectorEx(sapID id, int track, int sect, int nsects, unsigned char data[]);
   Cette routine lit 'nsects' secteurs de la piste 'track' à partir du
  secteur 'sect' et place le résultat dans le tableau 'data'. Retourne
  SAP_OK.
   Si une erreur survient, la routine retourne SAP_ERROR et stocke le numéro
  d'erreur dans la variable sap_errno:
  SAP_EINVAL: le numéro d'identification (sapID) est invalide.
  SAP_EEMPTY: l'archive SAP est vide.
  SAP_EBUSY: l'archive SAP est en train d'être remplie par sap_FillArchive()


int sap_WriteSector(sapID id, int track, int sect, sapsector_t *sapsector);
   Cette routine écrit le secteur désigné par 'sapsector' au secteur numéro
  'sect' de la piste numéro 'track'. Tous les champs du secteur doivent être
  spécifiés, exceptés les deux champs relatifs au CRC qui seront calculés
  par la routine elle-même. Retourne SAP_OK.
   Si une erreur survient, la routine retourne SAP_ERROR et stocke le numéro
  d'erreur dans la variable sap_errno:
  SAP_EINVAL: le numéro d'identification (sapID) est invalide.
  SAP_EEMPTY: l'archive SAP est vide.
  SAP_EBUSY: l'archive SAP est en train d'être remplie par sap_FillArchive()


int sap_WriteSectorEx(sapID id, int track, int sect, int nsects, const unsigned char data[])
   Cette routine écrit 'nsects' secteurs dans la piste 'track' à partir du
  secteur 'sect' en utilisant les données du tableau 'data'. Retourne
  SAP_OK.
   Si une erreur survient, la routine retourne SAP_ERROR et stocke le numéro
  d'erreur dans la variable sap_errno:
  SAP_EINVAL: le numéro d'identification (sapID) est invalide.
  SAP_EEMPTY: l'archive SAP est vide.
  SAP_EBUSY: l'archive SAP est en train d'être remplie par sap_FillArchive()



2. Routines de manipulation du format logique:

int sap_FormatArchive(sapID id, int capacity);
   Cette routine formate une archive SAP au format DOS BASIC Thomson et
  retourne SAP_OK. Elle supporte les capacités SAP_TRK80 (80 pistes) et
  SAP_TRK40 (40 pistes). Elle peut être utilisée à la fois sur une archive
  créée par sap_CreateArchive() ou ouverte par sap_OpenArchive().
   Si une erreur survient, la routine retourne SAP_ERROR et stocke le numéro
  d'erreur dans la variable sap_errno:
  SAP_EINVAL: le numéro d'identification (sapID) ou le format est invalide.
  SAP_EBUSY: l'archive SAP est en train d'être remplie par sap_FillArchive()


int sap_ListArchive(sapID id, char buffer[], int buffer_size);
   Cette routine copie la liste des fichiers (au sens du DOS BASIC Thomson)
  présents dans l'archive SAP dans le tampon 'buffer' dont la taille est en
  octets est spécifiée par 'buffer_size' et retourne le nombre de ligne de
  cette liste.
   Si une erreur survient, la routine retourne 0 et stocke le numéro
  d'erreur dans la variable sap_errno:
  SAP_EINVAL: le numéro d'identification (sapID) est invalide.
  SAP_EEMPTY: l'archive SAP est vide.
  SAP_EBUSY: l'archive SAP est en train d'être remplie par sap_FillArchive()


int sap_AddFile(sapID id, const char filename[]);
   Cette routine ajoute le fichier spécifié par 'filename' à l'archive SAP
  (en tant que fichier au sens du DOS BASIC Thomson) et retourne la taille
  du fichier en octets.
   Si une erreur survient, la routine retourne 0 et stocke le numéro
  d'erreur dans la variable sap_errno:
  SAP_EINVAL: le numéro d'identification (sapID) est invalide.
  SAP_EEMPTY: l'archive SAP est vide.
  SAP_EBUSY: l'archive SAP est en train d'être remplie par sap_FillArchive()
  SAP_ENOENT: le fichier n'existe pas.
  SAP_ENFILE: le fichier est vide.
  SAP_ENOSPC: le répertoire de l'archive SAP est plein.
  SAP_EFBIG: le fichier est trop gros pour l'espace libre de l'archive SAP.


int sap_DeleteFile(sapID id, const char pattern[]);
   Cette routine efface le fichier spécifié par 'pattern' de l'archive SAP
  et retourne la taille du fichier en octets. Elle traite la présence des
  wildcards '*' et '?' dans la chaîne 'pattern' et retourne dans ce cas la
  taille totale de tous les fichiers effacés (éventuellement nulle).
   Si une erreur survient, la routine retourne 0 et stocke le numéro
  d'erreur dans la variable sap_errno:
  SAP_EINVAL: le numéro d'identification (sapID) est invalide.
  SAP_EEMPTY: l'archive SAP est vide.
  SAP_EBUSY: l'archive SAP est en train d'être remplie par sap_FillArchive()
  SAP_ENOENT: le fichier n'existe pas dans l'archive SAP (erreur non valide
              lorsque 'pattern' contient au moins une wilcard).


int sap_ExtractFile(sapID id, const char pattern[]);
   Cette routine extrait le fichier spécifié par 'pattern' de l'archive SAP
  et retourne la taille du fichier en octets. Elle traite la présence des
  wildcards '*' et '?' dans la chaîne 'pattern' et retourne dans ce cas la
  taille totale de tous les fichiers extraits (éventuellement nulle).
   Si une erreur survient, la routine retourne 0 et stocke le numéro
  d'erreur dans la variable sap_errno:
  SAP_EINVAL: le numéro d'identification (sapID) est invalide.
  SAP_EEMPTY: l'archive SAP est vide.
  SAP_EBUSY: l'archive SAP est en train d'être remplie par sap_FillArchive()
  SAP_ENOENT: le fichier n'existe pas dans l'archive SAP (erreur non valide
              lorsque 'pattern' contient au moins une wilcard).
  SAP_EPERM: impossible d'écrire le ou les fichiers sur le support.



int sap_GetFileInfo(sapID id, const char filename[], sapfileinfo_t *info);
   Cette routine remplit les champs de la structure 'info' avec les
  informations relatives au fichier 'filename' spécifié. Retourne SAP_OK.
   Si une erreur survient, la routine retourne SAP_ERROR et stocke le numéro
  d'erreur dans la variable sap_errno:
  SAP_EINVAL: le numéro d'identification (sapID) est invalide.
  SAP_EEMPTY: l'archive SAP est vide.
  SAP_EBUSY: l'archive SAP est en train d'être remplie par sap_FillArchive()
  SAP_ENOENT: le fichier n'existe pas dans l'archive SAP.



Eric Botcazou
e-mail: <ebotcazou@libertysurf.fr>
