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 considres comme format physique (images de disquettes) et des routines
de manipulation haut-niveau des archives SAP considres 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 spcifi par 'filename' et
  retourne le numro d'identification (sapID) attach  cette archive  partir
  de cet instant. Ce numro d'identification sera pass aux autres routines de
  la librairie pour dsigner l'archive SAP sur laquelle elle devront agir.
   Le paramtre '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 numro
  d'erreur dans la variable sap_errno:
  SAP_ETOOMANY: trop d'archives SAP sont ouvertes simultanment.
  SAP_ENOENT: l'archive SAP spcifie n'existe pas.
  SAP_EBADF: le fichier spcifi n'est pas une archive SAP.


sapID sap_CreateArchive(const char filename[], int format);
   Cette routine cre une archive SAP dont le nom est spcifi par 'filename'
  et retourne le numro d'identification (sapID) attach  cette archive 
  partir de cet instant. Ce numro d'identification sera pass aux autres
  routines de la librairie pour dsigner l'archive SAP sur laquelle elle
  devront agir.
   Le paramtre 'format' spcifie 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 numro
  d'erreur dans la variable sap_errno:
  SAP_ETOOMANY: trop d'archives SAP sont ouvertes simultanment.
  SAP_EPERM: impossible de crer le fichier sur le support d'enregistrement.


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


int sap_FillArchive(sapID id, sapsector_t *sapsector);
   Cette routine remplie une archive cre par sap_CreateArchive() secteur
  par secteur, en commenant par le secteur 1 de la piste 0. A chaque appel
  le numro de secteur est incrment de 1 et, si la piste courante devient
  pleine, la piste suivante est slectionne. Retourne SAP_OK.
   Si une erreur survient, la routine retourne SAP_ERROR et stocke le numro
  d'erreur dans la variable sap_errno:
  SAP_EINVAL: le numro 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 numro 'sect' de la piste numro 'track' et
  place le rsultat dans la structure dsigne 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 protg en criture.
  SAP_BAD_SECTOR: le secteur a de mauvais identificateurs (piste, secteur)
  SAP_CRC_ERROR : erreur de CRC sur les donnes du secteur.
   Si une erreur survient, la routine retourne SAP_ERROR et stocke le numro
  d'erreur dans la variable sap_errno:
  SAP_EINVAL: le numro 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 rsultat dans le tableau 'data'. Retourne
  SAP_OK.
   Si une erreur survient, la routine retourne SAP_ERROR et stocke le numro
  d'erreur dans la variable sap_errno:
  SAP_EINVAL: le numro 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 dsign par 'sapsector' au secteur numro
  'sect' de la piste numro 'track'. Tous les champs du secteur doivent tre
  spcifis, excepts les deux champs relatifs au CRC qui seront calculs
  par la routine elle-mme. Retourne SAP_OK.
   Si une erreur survient, la routine retourne SAP_ERROR et stocke le numro
  d'erreur dans la variable sap_errno:
  SAP_EINVAL: le numro 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 donnes du tableau 'data'. Retourne
  SAP_OK.
   Si une erreur survient, la routine retourne SAP_ERROR et stocke le numro
  d'erreur dans la variable sap_errno:
  SAP_EINVAL: le numro 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 capacits SAP_TRK80 (80 pistes) et
  SAP_TRK40 (40 pistes). Elle peut tre utilise  la fois sur une archive
  cre par sap_CreateArchive() ou ouverte par sap_OpenArchive().
   Si une erreur survient, la routine retourne SAP_ERROR et stocke le numro
  d'erreur dans la variable sap_errno:
  SAP_EINVAL: le numro 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)
  prsents dans l'archive SAP dans le tampon 'buffer' dont la taille est en
  octets est spcifie par 'buffer_size' et retourne le nombre de ligne de
  cette liste.
   Si une erreur survient, la routine retourne 0 et stocke le numro
  d'erreur dans la variable sap_errno:
  SAP_EINVAL: le numro 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 spcifi 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 numro
  d'erreur dans la variable sap_errno:
  SAP_EINVAL: le numro 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 rpertoire 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 spcifi par 'pattern' de l'archive SAP
  et retourne la taille du fichier en octets. Elle traite la prsence des
  wildcards '*' et '?' dans la chane 'pattern' et retourne dans ce cas la
  taille totale de tous les fichiers effacs (ventuellement nulle).
   Si une erreur survient, la routine retourne 0 et stocke le numro
  d'erreur dans la variable sap_errno:
  SAP_EINVAL: le numro 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 spcifi par 'pattern' de l'archive SAP
  et retourne la taille du fichier en octets. Elle traite la prsence des
  wildcards '*' et '?' dans la chane '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 numro
  d'erreur dans la variable sap_errno:
  SAP_EINVAL: le numro 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' spcifi. Retourne SAP_OK.
   Si une erreur survient, la routine retourne SAP_ERROR et stocke le numro
  d'erreur dans la variable sap_errno:
  SAP_EINVAL: le numro 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>
