###LibSAP

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

* <a href="./#open_archive">Ouverture d'une archive SAP</a>
* <a href="./#create_archive">Cr&eacute;ation d'une archive SAP</a>
* <a href="./#close_archive">Fermeture d'une archive SAP</a>
* <a href="./#fill_archive">Remplissage une archive SAP</a>
* <a href="./#read_sector">Lecture d'un secteur SAP</a>
* <a href="./#read_sectors">Lecture d'une s&eacute;rie de secteurs SAP</a>
* <a href="./#write_sector">Ecriture d'un secteur SAP</a>
* <a href="./#write_sectors">Ecriture d'une s&eacute;rie de secteurs SAP</a>
* <a href="./#format_archive">Formatage d'une archive SAP</a>
* <a href="./#list_archive">Rcup&eacute;ration d'un rpertoire SAP</a>
* <a href="./#add_file">Ajout d'un fichier &agrave; l'archive SAP</a>
* <a href="./#delete_file">Effacement de fichier(s) de l'archive SAP</a>
* <a href="./#extract_file">Extraction de fichier(s) de l'archive SAP</a>
* <a href="./#read_informations">Lecture des informations de fichier</a>

#####Ouverture d'une archive SAP<a name="open_archive"></a>

<b><i>sapID sap\_OpenArchive(const char filename\[\], int \*format);</i></b><br>
<span style="padding-left:30px">*filename : nom de l'archive SAP*</span><br>
<span style="padding-left:30px">*format : retour du format de l'archive SAP (sap\_FORMAT1 ou sap\_FORMAT2)*</span>

Retourne l'identificateur de l'archive SAP. En cas d'erreur, sap\_ERROR est retourn&eacute; et sap\_errno contient l'un des codes d'erreur suivants:<br>
SAP\_ETOOMANY : trop d'archives SAP sont ouvertes simultan&eacute;ment.<br>
SAP\_ENOENT : l'archive SAP sp&eacute;cifi&eacute;e n'existe pas.<br>
SAP\_EBADF : le fichier sp&eacute;cifi&eacute; n'est pas une archive SAP.

#####Cr&eacute;ation d'une archive SAP<a name="create_archive"></a>

<b><i>sapID sap\_CreateArchive(const char filename\[\], int format);</i></b><br>
<span style="padding-left:30px">*filename : nom de l'archive SAP*</span><br>
<span style="padding-left:30px">*format : format de l'archive SAP (sap\_FORMAT1 ou sap\_FORMAT2)*</span>

Retourne l'identificateur de l'archive SAP. En cas d'erreur, SAP\_ERROR est retourn&eacute; et 'sap\_errno' contient l'un des codes d'erreur suivants:<br>
SAP\_ETOOMANY : trop d'archives SAP sont ouvertes simultan&eacute;ment.<br>
SAP\_EPERM : impossible de cr&eacute;er le fichier sur le support d'enregistrement.

#####Fermeture d'une archive SAP<a name="close_archive"></a>

<b><i>int sap\_CloseArchive(sapID id);</i></b><br>
<span style="padding-left:30px">*id : identificateur de l'archive SAP*</span>

Retourne SAP\_OK. En cas d'erreur, SAP\_ERROR est retourn&eacute; et 'sap\_errno' contient l'un des codes d'erreur suivants:<br>
SAP\_EINVAL : le num&eacute;ro d'identification (sapID) est invalide.

#####Remplissage une archive SAP<a name="fill_archive"></a>

<b><i>int sap\_FillArchive(sapID id, sapsector\_t \*sapsector);</i></b><br>
<span style="padding-left:30px">*id : identificateur de l'archive SAP*</span><br>
<span style="padding-left:30px">*sapsector : pointeur sur la structure de secteur*</span>

Cette routine remplie une archive cr&eacute;&eacute;e par sap\_CreateArchive() secteur par secteur, en commen&ccedil;ant par le secteur 1 de la piste 0. A chaque appel le num&eacute;ro de secteur est incr&eacute;ment&eacute; de 1 et, si la piste courante devient pleine, la piste suivante est s&eacute;lectionn&eacute;e.<br>
Retourne SAP\_OK. En cas d'erreur, SAP\_ERROR est retourn&eacute; et 'sap\_errno' contient l'un des codes d'erreur suivants:<br>
SAP\_EINVAL : le num&eacute;ro d'identification (sapID) est invalide.<br>
SAP\_ENOSPC : l'archive SAP est pleine.

#####Lecture d'un secteur SAP<a name="read_sector"></a>

<b><i>int sap\_ReadSector(sapID id, int track, int sect, sapsector\_t \*sapsector);</i></b><br>
<span style="padding-left:30px">*id : identificateur de l'archive SAP*</span><br>
<span style="padding-left:30px">*track : num&eacute;ro de piste*</span><br>
<span style="padding-left:30px">*sect : num&eacute;ro de secteur*</span><br>
<span style="padding-left:30px">*sapsector : pointeur sur la structure de secteur*</span>

Le r&eacute;sultat de la lecture est dans la structure d&eacute;sign&eacute;e par *'sapsector'*.<br>
Retourne SAP\_OK ou une combinaison des flags suivants:<br>
SAP\_NO\_STD\_FMT : le format du secteur est non standard.<br>
SAP\_PROTECTED : le secteur est prot&eacute;g&eacute; en &eacute;criture.<br>
SAP\_BAD\_SECTOR : le secteur a de mauvais identificateurs (piste, secteur)<br>
SAP\_CRC\_ERROR : erreur de CRC sur les donn&eacute;es du secteur.

En cas d'erreur, SAP\_ERROR est retourn&eacute; et 'sap\_errno' contient l'un des codes d'erreur suivants:<br>
SAP\_EINVAL : le num&eacute;ro d'identification (sapID) est invalide.<br>
SAP\_EEMPTY : l'archive SAP est vide.
SAP\_EBUSY : l'archive SAP est en train d'&ecirc;tre remplie par sap\_FillArchive()

#####Lecture d'une s&eacute;rie de secteurs SAP<a name="read_sectors"></a>

<b><i>int sap\_ReadSectorEx(sapID id, int track, int sect, int nsects, unsigned char data\[\]);</i></b><br>
<span style="padding-left:30px">*id : identificateur de l'archive SAP*</span><br>
<span style="padding-left:30px">*track : num&eacute;ro de piste de d&eacute;part*</span><br>
<span style="padding-left:30px">*sect : num&eacute;ro de secteur de d&eacute;part*</span><br>
<span style="padding-left:30px">*nsect : nombre de secteurs &agrave; lire*</span><br>
<span style="padding-left:30px">*data : pointeur sur le buffer de secteurs*</span>

Retourne SAP\_OK. En cas d'erreur, SAP\_ERROR est retourn&eacute; et 'sap\_errno' contient l'un des codes d'erreur suivants:<br>
SAP\_EINVAL : le num&eacute;ro d'identification (sapID) est invalide.<br>
SAP\_EEMPTY : l'archive SAP est vide.
SAP\_EBUSY : l'archive SAP est en train d'&ecirc;tre remplie par sap\_FillArchive()

#####&Eacute;criture d'un secteur SAP<a name="write_sector"></a>

<b><i>int sap\_WriteSector(sapID id, int track, int sect, sapsector\_t \*sapsector);</i></b><br>
<span style="padding-left:30px">*id : identificateur de l'archive SAP*</span><br>
<span style="padding-left:30px">*track : num&eacute;ro de piste*</span><br>
<span style="padding-left:30px">*sect : num&eacute;ro de secteur*</span><br>
<span style="padding-left:30px">*sapsector : pointeur sur la structure de secteur*</span>

Tous les champs du secteur doivent &ecirc;tre sp&eacute;cifi&eacute;s, except&eacute;s les deux champs relatifs au CRC qui seront calcul&eacute;s par la routine elle-m&ecirc;me.<br>
Retourne SAP\_OK. En cas d'erreur, SAP\_ERROR est retourn&eacute; et 'sap\_errno' contient l'un des codes d'erreur suivants:<br>
SAP\_EINVAL : le num&eacute;ro d'identification (sapID) est invalide.<br>
SAP\_EEMPTY : l'archive SAP est vide.
SAP\_EBUSY : l'archive SAP est en train d'&ecirc;tre remplie par sap\_FillArchive()

#####&Eacute;criture d'une s&eacute;rie de secteurs SAP<a name="write_sectors"></a>

<b><i>int sap\_WriteSectorEx(sapID id, int track, int sect, int nsects, const unsigned char data\[\]);</i></b><br>
<span style="padding-left:30px">*id : identificateur de l'archive SAP*</span><br>
<span style="padding-left:30px">*track : num&eacute;ro de piste de d&eacute;part*</span><br>
<span style="padding-left:30px">*sect : num&eacute;ro de secteur de d&eacute;part*</span><br>
<span style="padding-left:30px">*nsect : nombre de secteurs &agrave; &eacute;crire*</span><br>
<span style="padding-left:30px">*data : pointeur sur le buffer de secteurs*</span>

Retourne SAP\_OK. En cas d'erreur, SAP\_ERROR est retourn&eacute; et 'sap\_errno' contient l'un des codes d'erreur suivants:<br>
SAP\_EINVAL : le num&eacute;ro d'identification (sapID) est invalide.<br>
SAP\_EEMPTY : l'archive SAP est vide.
SAP\_EBUSY : l'archive SAP est en train d'&ecirc;tre remplie par sap\_FillArchive()

#####Formatage d'une archive SAP<a name="format_archive"></a>

<b><i>int sap\_FormatArchive(sapID id, int capacity);</i></b><br>
<span style="padding-left:30px">*id : identificateur de l'archive SAP*</span><br>
<span style="padding-left:30px">*capacity : sap\_TRK80 (80 pistes) ou sap\_TRK40 (40 pistes)*</span><br>

Retourne SAP\_OK. En cas d'erreur, SAP\_ERROR est retourn&eacute; et 'sap\_errno' contient l'un des codes d'erreur suivants:<br>
SAP\_EINVAL : le num&eacute;ro d'identification (sapID) ou le format est invalide.<br>
SAP\_EBUSY : l'archive SAP est en train d'&ecirc;tre remplie par sap\_FillArchive()

#####R&eacute;cup&eacute;ration d'un r&eacute;pertoire SAP<a name="list_archive"></a>

<b><i>int sap\_ListArchive(sapID id, char buffer\[\], int buffer\_size);</i></b><br>
<span style="padding-left:30px">*id : identificateur de l'archive SAP*</span><br>
<span style="padding-left:30px">*buffer : buffer de r&eacute;pertoire*</span><br>
<span style="padding-left:30px">*buffer\_size : taille du buffer de r&eacute;pertoire*</span>

Retourne le nombre de lignes de la liste. En cas d'erreur, 0 est retourn&eacute; et 'sap\_errno' contient l'un des codes d'erreur suivants:<br>
SAP\_EINVAL : le num&eacute;ro d'identification (sapID) est invalide.<br>
SAP\_EEMPTY : l'archive SAP est vide.
SAP\_EBUSY : l'archive SAP est en train d'&ecirc;tre remplie par sap\_FillArchive()

#####Ajout d'un fichier &agrave; l'archive SAP<a name="add_file"></a>

<b><i>int sap\_AddFile(sapID id, const char filename\[\]);</i></b><br>
<span style="padding-left:30px">*id : identificateur de l'archive SAP*</span><br>
<span style="padding-left:30px">*filename : nom du fichier &agrave; ajouter*</span>

Retourne la taille du fichier en octets. En cas d'erreur, 0 est retourn&eacute; et 'sap\_errno' contient l'un des codes d'erreur suivants:<br>
SAP\_EINVAL : le num&eacute;ro d'identification (sapID) est invalide.<br>
SAP\_EEMPTY : l'archive SAP est vide.
SAP\_EBUSY : l'archive SAP est en train d'&ecirc;tre remplie par sap\_FillArchive()<br>
SAP\_ENOENT : le fichier n'existe pas.
SAP\_ENFILE : le fichier est vide.
SAP\_ENOSPC : le r&eacute;pertoire de l'archive SAP est plein.<br>
SAP\_EFBIG : le fichier est trop gros pour l'espace libre de l'archive SAP.

#####Effacement de fichier(s) de l'archive SAP<a name="delete_file"></a>

<b><i>int sap\_DeleteFile(sapID id, const char pattern\[\]);</i></b><br>
<span style="padding-left:30px">*id : identificateur de l'archive SAP*</span><br>
<span style="padding-left:30px">*pattern : pattern des fichiers &agrave; effacer ('\*' et '?' sont support&eacute;s)*</span><br>

Retourne la taille du (des) fichier(s) en octets. En cas d'erreur, 0 est retourn&eacute; et 'sap\_errno' contient l'un des codes d'erreur suivants:<br>
SAP\_EINVAL : le num&eacute;ro d'identification (sapID) est invalide.<br>
SAP\_EEMPTY : l'archive SAP est vide.
SAP\_EBUSY : l'archive SAP est en train d'&ecirc;tre remplie par sap\_FillArchive()<br>
SAP\_ENOENT : le fichier n'existe pas dans l'archive SAP (erreur non valide lorsque pattern contient au moins une wilcard).

#####Extraction de fichier(s) de l'archive SAP<a name="extract_file"></a>

<b><i>int sap\_ExtractFile(sapID id, const char pattern\[\]);</i></b><br>
<span style="padding-left:30px">*id : identificateur de l'archive SAP*</span><br>
<span style="padding-left:30px">*pattern : pattern des fichiers &agrave; extraire ('\*' et '?' sont support&eacute;s)*</span>

Retourne la taille du (des) fichier(s) en octets. En cas d'erreur, 0 est retourn&eacute; et 'sap\_errno' contient l'un des codes d'erreur suivants:<br>
SAP\_EINVAL : le num&eacute;ro d'identification (sapID) est invalide.<br>
SAP\_EEMPTY : l'archive SAP est vide.
SAP\_EBUSY : l'archive SAP est en train d'&ecirc;tre remplie par sap\_FillArchive()<br>
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'&eacute;crire le ou les fichiers sur le support.

#####Lecture des informations de fichier<a name="read_informations"></a>

<b><i>int sap\_GetFileInfo(sapID id, const char filename\[\], sapfileinfo\_t \*info);</i></b><br>
<span style="padding-left:30px">*id : identificateur de l'archive SAP*</span><br>
<span style="padding-left:30px">*filename : nom du fichier &agrave; examiner*</span><br>
<span style="padding-left:30px">*info : pointeur sur la structure d'information*</span>

Retourne SAP\_OK. En cas d'erreur, SAP\_ERROR est retourn&eacute; et 'sap\_errno' contient l'un des codes d'erreur suivants:<br>
SAP\_EINVAL : le num&eacute;ro d'identification (sapID) est invalide.<br>
SAP\_EEMPTY : l'archive SAP est vide.
SAP\_EBUSY : l'archive SAP est en train d'&ecirc;tre remplie par sap\_FillArchive()<br>
SAP\_ENOENT : le fichier n'existe pas dans l'archive SAP.

